[systemd-devel] [systemd-commits] 5 commits - TODO src/core src/libsystemd-bus src/login src/machine src/systemd

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Sat Dec 21 19:10:14 PST 2013


On Sat, Dec 21, 2013 at 06:54:53PM -0800, Lennart Poettering wrote:
>  TODO                                     |   12 +
>  src/core/automount.c                     |    1 
>  src/core/busname.c                       |    1 
>  src/core/dbus-automount.c                |    9 -
>  src/core/dbus-automount.h                |    1 
>  src/core/dbus-busname.c                  |    7 -
>  src/core/dbus-busname.h                  |    1 
>  src/core/dbus-cgroup.c                   |   22 +--
>  src/core/dbus-device.c                   |    5 
>  src/core/dbus-device.h                   |    1 
>  src/core/dbus-execute.c                  |  118 ++++++++---------
>  src/core/dbus-job.c                      |    6 
>  src/core/dbus-kill.c                     |    8 -
>  src/core/dbus-manager.c                  |   46 +++---
>  src/core/dbus-mount.c                    |   21 ---
>  src/core/dbus-mount.h                    |    1 
>  src/core/dbus-path.c                     |   13 -
>  src/core/dbus-path.h                     |    1 
>  src/core/dbus-scope.c                    |    7 -
>  src/core/dbus-scope.h                    |    1 
>  src/core/dbus-service.c                  |   59 +++-----
>  src/core/dbus-service.h                  |    1 
>  src/core/dbus-snapshot.c                 |    2 
>  src/core/dbus-socket.c                   |   76 ++++-------
>  src/core/dbus-socket.h                   |    1 
>  src/core/dbus-swap.c                     |   14 --
>  src/core/dbus-swap.h                     |    1 
>  src/core/dbus-timer.c                    |   15 --
>  src/core/dbus-timer.h                    |    1 
>  src/core/dbus-unit.c                     |  126 ++++++++----------
>  src/core/device.c                        |    1 
>  src/core/mount.c                         |    1 
>  src/core/path.c                          |    3 
>  src/core/scope.c                         |    1 
>  src/core/service.c                       |    1 
>  src/core/socket.c                        |    1 
>  src/core/swap.c                          |    1 
>  src/core/timer.c                         |    1 
>  src/core/unit.h                          |    3 
>  src/libsystemd-bus/bus-introspect.c      |    8 -
>  src/libsystemd-bus/bus-objects.c         |  212 ++++++++++++++++++++-----------
>  src/libsystemd-bus/test-bus-introspect.c |    3 
>  src/libsystemd-bus/test-bus-objects.c    |   27 +++
>  src/login/logind-dbus.c                  |   22 +--
>  src/login/logind-seat-dbus.c             |    6 
>  src/login/logind-session-dbus.c          |   35 ++---
>  src/login/logind-user-dbus.c             |   17 +-
>  src/machine/machine-dbus.c               |   22 +--
>  src/systemd/sd-bus-vtable.h              |   15 +-
>  49 files changed, 481 insertions(+), 477 deletions(-)
> 
> New commits:
> commit bee7e928990fd8a0c5909c2022a2b9eede557c81
> Author: Lennart Poettering <lennart at poettering.net>
> Date:   Sun Dec 22 03:50:30 2013 +0100
> 
>     update TODO
> 
> diff --git a/TODO b/TODO
> index de5738e..3704445 100644
> --- a/TODO
> +++ b/TODO
> @@ -113,14 +113,13 @@ Features:
>  * libsystemd-bus:
>    - when kdbus doesn't take our message without memfds, try again with memfds
>    - implement monitor logic
> -  - when triggering property change events, allow a NULL strv indicate that all properties listed as such are send out as changed
>    - see if we can drop more message validation on the sending side
> -  - support "const" properties as flag
>    - add API to clone sd_bus_message objects
>    - SD_BUS_COMMENT() macro for inclusion in vtables, syntax inspired by gdbus
>    - systemd-bus-proxyd needs to synthesize NameLost/NameAcquired
> +  - systemd-bus-proxyd needs to enforce good old XML policy
> +  - upload minimal kdbus policy into the kernel at boot
>    - kdbus: matches against source or destination pids for an "strace -p"-like feel. Problem: The PID info needs to be available in userspace too...
> -  - kdbus: we need a way to figure out whether there's currently an activator for a name that is already activated
>    - longer term:
>      * priority queues
>      * priority inheritance
> @@ -129,7 +128,7 @@ Features:
>         - kdbus mapping
>         - NameLost/NameAcquired obsolete
>         - GVariant
> -       - "const" properties
> +       - "const" properties (posted)
>  
>  * sd-event
>    - allow multiple signal handlers per signal?
> 
> commit aec8de63b14a93b91b85dc15bf879604352fbbe1
> Author: Lennart Poettering <lennart at poettering.net>
> Date:   Sun Dec 22 03:43:03 2013 +0100
> 
>     core: no need to list properties for PropertiesChanged messages anymore
>     
>     Since the vtable includes this information anyway, let's just use that
> 
> diff --git a/src/core/automount.c b/src/core/automount.c
> index c6e0a74..c44521c 100644
> --- a/src/core/automount.c
> +++ b/src/core/automount.c
> @@ -874,7 +874,6 @@ const UnitVTable automount_vtable = {
>  
>          .bus_interface = "org.freedesktop.systemd1.Automount",
>          .bus_vtable = bus_automount_vtable,
> -        .bus_changing_properties = bus_automount_changing_properties,
>  
>          .shutdown = automount_shutdown,
>  
> diff --git a/src/core/busname.c b/src/core/busname.c
> index 034e5f6..9b6bf07 100644
> --- a/src/core/busname.c
> +++ b/src/core/busname.c
> @@ -584,7 +584,6 @@ const UnitVTable busname_vtable = {
>  
>          .bus_interface = "org.freedesktop.systemd1.BusName",
>          .bus_vtable = bus_busname_vtable,
> -        .bus_changing_properties = bus_busname_changing_properties,
>  
>          .status_message_formats = {
>                  .finished_start_job = {
> diff --git a/src/core/dbus-automount.c b/src/core/dbus-automount.c
> index 8559aed..b2a510a 100644
> --- a/src/core/dbus-automount.c
> +++ b/src/core/dbus-automount.c
> @@ -34,8 +34,3 @@ const sd_bus_vtable bus_automount_vtable[] = {
>          SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Automount, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
>          SD_BUS_VTABLE_END
>  };
> -
> -const char* const bus_automount_changing_properties[] = {
> -        "Result",
> -        NULL
> -};
> diff --git a/src/core/dbus-automount.h b/src/core/dbus-automount.h
> index 0b96183..1bec953 100644
> --- a/src/core/dbus-automount.h
> +++ b/src/core/dbus-automount.h
> @@ -24,4 +24,3 @@
>  #include "sd-bus.h"
>  
>  extern const sd_bus_vtable bus_automount_vtable[];
> -extern const char* const bus_automount_changing_properties[];
> diff --git a/src/core/dbus-busname.c b/src/core/dbus-busname.c
> index 9f94bf1..854491b 100644
> --- a/src/core/dbus-busname.c
> +++ b/src/core/dbus-busname.c
> @@ -33,8 +33,3 @@ const sd_bus_vtable bus_busname_vtable[] = {
>          SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(BusName, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
>          SD_BUS_VTABLE_END
>  };
> -
> -const char* const bus_busname_changing_properties[] = {
> -        "Result",
> -        NULL
> -};
> diff --git a/src/core/dbus-busname.h b/src/core/dbus-busname.h
> index 3a29317..b5eed37 100644
> --- a/src/core/dbus-busname.h
> +++ b/src/core/dbus-busname.h
> @@ -25,4 +25,3 @@
>  #include "unit.h"
>  
>  extern const sd_bus_vtable bus_busname_vtable[];
> -extern const char* const bus_busname_changing_properties[];
> diff --git a/src/core/dbus-device.c b/src/core/dbus-device.c
> index 621bab0..f556536 100644
> --- a/src/core/dbus-device.c
> +++ b/src/core/dbus-device.c
> @@ -29,8 +29,3 @@ const sd_bus_vtable bus_device_vtable[] = {
>          SD_BUS_PROPERTY("SysFSPath", "s", NULL, offsetof(Device, sysfs), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
>          SD_BUS_VTABLE_END
>  };
> -
> -const char* const bus_device_changing_properties[] = {
> -        "SysFSPath",
> -        NULL
> -};
> diff --git a/src/core/dbus-device.h b/src/core/dbus-device.h
> index f248c28..4aff226 100644
> --- a/src/core/dbus-device.h
> +++ b/src/core/dbus-device.h
> @@ -25,4 +25,3 @@
>  #include "unit.h"
>  
>  extern const sd_bus_vtable bus_device_vtable[];
> -extern const char* const bus_device_changing_properties[];
> diff --git a/src/core/dbus-mount.c b/src/core/dbus-mount.c
> index 3b58808..28f0e90 100644
> --- a/src/core/dbus-mount.c
> +++ b/src/core/dbus-mount.c
> @@ -124,15 +124,6 @@ const sd_bus_vtable bus_mount_vtable[] = {
>          SD_BUS_VTABLE_END
>  };
>  
> -const char * const bus_mount_changing_properties[] = {
> -        "What",
> -        "Options",
> -        "Type",
> -        "ControlPID",
> -        "Result",
> -        NULL
> -};
> -
>  int bus_mount_set_property(
>                  Unit *u,
>                  const char *name,
> diff --git a/src/core/dbus-mount.h b/src/core/dbus-mount.h
> index 4bb5d2d..f7004d2 100644
> --- a/src/core/dbus-mount.h
> +++ b/src/core/dbus-mount.h
> @@ -25,7 +25,6 @@
>  #include "unit.h"
>  
>  extern const sd_bus_vtable bus_mount_vtable[];
> -extern const char * const bus_mount_changing_properties[];
>  
>  int bus_mount_set_property(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
>  int bus_mount_commit_properties(Unit *u);
> diff --git a/src/core/dbus-path.c b/src/core/dbus-path.c
> index 36c4e0f..b5e8941 100644
> --- a/src/core/dbus-path.c
> +++ b/src/core/dbus-path.c
> @@ -86,8 +86,3 @@ const sd_bus_vtable bus_path_vtable[] = {
>          SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Path, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
>          SD_BUS_VTABLE_END
>  };
> -
> -const char* const bus_path_changing_properties[] = {
> -        "Result",
> -        NULL
> -};
> diff --git a/src/core/dbus-path.h b/src/core/dbus-path.h
> index e9558f8..667da05 100644
> --- a/src/core/dbus-path.h
> +++ b/src/core/dbus-path.h
> @@ -25,4 +25,3 @@
>  #include "sd-bus.h"
>  
>  extern const sd_bus_vtable bus_path_vtable[];
> -extern const char* const bus_path_changing_properties[];
> diff --git a/src/core/dbus-scope.c b/src/core/dbus-scope.c
> index b20b6e7..bb251ed 100644
> --- a/src/core/dbus-scope.c
> +++ b/src/core/dbus-scope.c
> @@ -36,11 +36,6 @@ const sd_bus_vtable bus_scope_vtable[] = {
>          SD_BUS_VTABLE_END
>  };
>  
> -const char* const bus_scope_changing_properties[] = {
> -        "Result",
> -        NULL
> -};
> -
>  static int bus_scope_set_transient_property(
>                  Scope *s,
>                  const char *name,
> diff --git a/src/core/dbus-scope.h b/src/core/dbus-scope.h
> index 30c5e1e..7e8f005 100644
> --- a/src/core/dbus-scope.h
> +++ b/src/core/dbus-scope.h
> @@ -25,7 +25,6 @@
>  #include "unit.h"
>  
>  extern const sd_bus_vtable bus_scope_vtable[];
> -extern const char* const bus_scope_changing_properties[];
>  
>  int bus_scope_set_property(Unit *u, const char *name, sd_bus_message *i, UnitSetPropertiesMode mode, sd_bus_error *error);
>  int bus_scope_commit_properties(Unit *u);
> diff --git a/src/core/dbus-service.c b/src/core/dbus-service.c
> index 25af7ac..3db9339 100644
> --- a/src/core/dbus-service.c
> +++ b/src/core/dbus-service.c
> @@ -69,21 +69,6 @@ const sd_bus_vtable bus_service_vtable[] = {
>          SD_BUS_VTABLE_END
>  };
>  
> -const char* const bus_service_changing_properties[] = {
> -        "ExecMainStartTimestamp",
> -        "ExecMainStartTimestampMonotonic",
> -        "ExecMainExitTimestamp",
> -        "ExecMainExitTimestampMonotonic",
> -        "ExecMainPID",
> -        "ExecMainCode",
> -        "ExecMainStatus",
> -        "MainPID",
> -        "ControlPID",
> -        "StatusText",
> -        "Result",
> -        NULL
> -};
> -
>  static int bus_service_set_transient_property(
>                  Service *s,
>                  const char *name,
> diff --git a/src/core/dbus-service.h b/src/core/dbus-service.h
> index 5fa9b2f..aab9f7a 100644
> --- a/src/core/dbus-service.h
> +++ b/src/core/dbus-service.h
> @@ -25,7 +25,6 @@
>  #include "unit.h"
>  
>  extern const sd_bus_vtable bus_service_vtable[];
> -extern const char* const bus_service_changing_properties[];
>  
>  int bus_service_set_property(Unit *u, const char *name, sd_bus_message *i, UnitSetPropertiesMode mode, sd_bus_error *error);
>  int bus_service_commit_properties(Unit *u);
> diff --git a/src/core/dbus-socket.c b/src/core/dbus-socket.c
> index c64bf82..bb9d419 100644
> --- a/src/core/dbus-socket.c
> +++ b/src/core/dbus-socket.c
> @@ -90,7 +90,6 @@ const sd_bus_vtable bus_socket_vtable[] = {
>          SD_BUS_PROPERTY("BindIPv6Only", "s", property_get_bind_ipv6_only, offsetof(Socket, bind_ipv6_only), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("Backlog", "u", bus_property_get_unsigned, offsetof(Socket, backlog), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec, offsetof(Socket, timeout_usec), SD_BUS_VTABLE_PROPERTY_CONST),
> -        SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid, offsetof(Socket, control_pid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
>          SD_BUS_PROPERTY("BindToDevice", "s", NULL, offsetof(Socket, bind_to_device), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode, offsetof(Socket, directory_mode), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("SocketMode", "u", bus_property_get_mode, offsetof(Socket, socket_mode), SD_BUS_VTABLE_PROPERTY_CONST),
> @@ -110,15 +109,16 @@ const sd_bus_vtable bus_socket_vtable[] = {
>          SD_BUS_PROPERTY("Listen", "a(ss)", property_get_listen, 0, SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("Mark", "i", bus_property_get_int, offsetof(Socket, mark), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("MaxConnections", "u", bus_property_get_unsigned, offsetof(Socket, max_connections), SD_BUS_VTABLE_PROPERTY_CONST),
> -        SD_BUS_PROPERTY("NConnections", "u", bus_property_get_unsigned, offsetof(Socket, n_connections), 0),
> -        SD_BUS_PROPERTY("NAccepted", "u", bus_property_get_unsigned, offsetof(Socket, n_accepted), 0),
>          SD_BUS_PROPERTY("MessageQueueMaxMessages", "x", bus_property_get_long, offsetof(Socket, mq_maxmsg), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("MessageQueueMessageSize", "x", bus_property_get_long, offsetof(Socket, mq_msgsize), SD_BUS_VTABLE_PROPERTY_CONST),
> -        SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Socket, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
>          SD_BUS_PROPERTY("ReusePort", "b",  bus_property_get_bool, offsetof(Socket, reuse_port), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("SmackLabel", "s", NULL, offsetof(Socket, smack), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("SmackLabelIPIn", "s", NULL, offsetof(Socket, smack_ip_in), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("SmackLabelIPOut", "s", NULL, offsetof(Socket, smack_ip_out), SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid, offsetof(Socket, control_pid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
> +        SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Socket, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
> +        SD_BUS_PROPERTY("NConnections", "u", bus_property_get_unsigned, offsetof(Socket, n_connections), 0),
> +        SD_BUS_PROPERTY("NAccepted", "u", bus_property_get_unsigned, offsetof(Socket, n_accepted), 0),
>          BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket, exec_command[SOCKET_EXEC_START_PRE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
>          BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket, exec_command[SOCKET_EXEC_START_POST]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
>          BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket, exec_command[SOCKET_EXEC_STOP_PRE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
> @@ -126,14 +126,6 @@ const sd_bus_vtable bus_socket_vtable[] = {
>          SD_BUS_VTABLE_END
>  };
>  
> -const char* const bus_socket_changing_properties[] = {
> -        "ControlPID",
> -        "NAccepted",
> -        "NConnections",
> -        "Result",
> -        NULL
> -};
> -
>  int bus_socket_set_property(
>                  Unit *u,
>                  const char *name,
> diff --git a/src/core/dbus-socket.h b/src/core/dbus-socket.h
> index 8808fa2..17164d9 100644
> --- a/src/core/dbus-socket.h
> +++ b/src/core/dbus-socket.h
> @@ -25,7 +25,6 @@
>  #include "unit.h"
>  
>  extern const sd_bus_vtable bus_socket_vtable[];
> -extern const char* const bus_socket_changing_properties[];
>  
>  int bus_socket_set_property(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
>  int bus_socket_commit_properties(Unit *u);
> diff --git a/src/core/dbus-swap.c b/src/core/dbus-swap.c
> index bad53fe..7bd05db 100644
> --- a/src/core/dbus-swap.c
> +++ b/src/core/dbus-swap.c
> @@ -69,14 +69,6 @@ const sd_bus_vtable bus_swap_vtable[] = {
>          SD_BUS_VTABLE_END
>  };
>  
> -const char* const bus_swap_changing_properties[] = {
> -        "What",
> -        "Priority",
> -        "ControlPID",
> -        "Result",
> -        NULL
> -};
> -
>  int bus_swap_set_property(
>                  Unit *u,
>                  const char *name,
> diff --git a/src/core/dbus-swap.h b/src/core/dbus-swap.h
> index 5d35737..9469f68 100644
> --- a/src/core/dbus-swap.h
> +++ b/src/core/dbus-swap.h
> @@ -26,7 +26,6 @@
>  #include "unit.h"
>  
>  extern const sd_bus_vtable bus_swap_vtable[];
> -extern const char* const bus_swap_changing_properties[];
>  
>  int bus_swap_set_property(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
>  int bus_swap_commit_properties(Unit *u);
> diff --git a/src/core/dbus-timer.c b/src/core/dbus-timer.c
> index b37c0d0..277a45c 100644
> --- a/src/core/dbus-timer.c
> +++ b/src/core/dbus-timer.c
> @@ -146,10 +146,3 @@ const sd_bus_vtable bus_timer_vtable[] = {
>          SD_BUS_PROPERTY("AccuracyUSec", "t", bus_property_get_usec, offsetof(Timer, accuracy_usec), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_VTABLE_END
>  };
> -
> -const char* const bus_timer_changing_properties[] = {
> -        "NextElapseUSecRealtime",
> -        "NextElapseUSecMonotonic",
> -        "Result",
> -        NULL
> -};
> diff --git a/src/core/dbus-timer.h b/src/core/dbus-timer.h
> index ddd311c..cfff88e 100644
> --- a/src/core/dbus-timer.h
> +++ b/src/core/dbus-timer.h
> @@ -24,4 +24,3 @@
>  #include "sd-bus.h"
>  
>  extern const sd_bus_vtable bus_timer_vtable[];
> -extern const char* const bus_timer_changing_properties[];
> diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
> index 7a566ff..4d3e3cc 100644
> --- a/src/core/dbus-unit.c
> +++ b/src/core/dbus-unit.c
> @@ -634,29 +634,25 @@ static int send_changed_signal(sd_bus *bus, const char *destination, void *userd
>           * type, then for the generic unit. The clients may rely on
>           * this order to get atomic behavior if needed. */
>  
> -        if (UNIT_VTABLE(u)->bus_changing_properties) {
> -
> -                r = sd_bus_emit_properties_changed_strv(
> -                                bus, p,
> -                                UNIT_VTABLE(u)->bus_interface,
> -                                (char**) UNIT_VTABLE(u)->bus_changing_properties);
> -                if (r < 0)
> -                        return r;
> +        r = sd_bus_emit_properties_changed_strv(
> +                        bus, p,
> +                        UNIT_VTABLE(u)->bus_interface,
> +                        NULL);
> +        if (r < 0) {
> +                log_warning("Failed to send out specific PropertiesChanged signal for %s: %s", u->id, strerror(-r));
> +                return r;
>          }
>  
> -        return sd_bus_emit_properties_changed(
> +        r = sd_bus_emit_properties_changed_strv(
>                          bus, p,
>                          "org.freedesktop.systemd1.Unit",
> -                        "ActiveState",
> -                        "SubState",
> -                        "InactiveExitTimestamp",
> -                        "ActiveEnterTimestamp",
> -                        "ActiveExitTimestamp",
> -                        "InactiveEnterTimestamp",
> -                        "Job",
> -                        "ConditionResult",
> -                        "ConditionTimestamp",
>                          NULL);
> +        if (r < 0) {
> +                log_warning("Failed to send out generic PropertiesChanged signal for %s: %s", u->id, strerror(-r));
> +                return r;
> +        }
> +
> +        return 0;
>  }
>  
>  void bus_unit_send_change_signal(Unit *u) {
> diff --git a/src/core/device.c b/src/core/device.c
> index 72d98ae..2c44dec 100644
> --- a/src/core/device.c
> +++ b/src/core/device.c
> @@ -653,7 +653,6 @@ const UnitVTable device_vtable = {
>          .sub_state_to_string = device_sub_state_to_string,
>  
>          .bus_interface = "org.freedesktop.systemd1.Device",
> -        .bus_changing_properties = bus_device_changing_properties,
>          .bus_vtable = bus_device_vtable,
>  
>          .following = device_following,
> diff --git a/src/core/mount.c b/src/core/mount.c
> index 77493db..2b7934e 100644
> --- a/src/core/mount.c
> +++ b/src/core/mount.c
> @@ -1793,7 +1793,6 @@ const UnitVTable mount_vtable = {
>  
>          .bus_interface = "org.freedesktop.systemd1.Mount",
>          .bus_vtable = bus_mount_vtable,
> -        .bus_changing_properties = bus_mount_changing_properties,
>          .bus_set_property = bus_mount_set_property,
>          .bus_commit_properties = bus_mount_commit_properties,
>  
> diff --git a/src/core/path.c b/src/core/path.c
> index 51e8d1d..fc7069e 100644
> --- a/src/core/path.c
> +++ b/src/core/path.c
> @@ -805,6 +805,5 @@ const UnitVTable path_vtable = {
>          .reset_failed = path_reset_failed,
>  
>          .bus_interface = "org.freedesktop.systemd1.Path",
> -        .bus_vtable = bus_path_vtable,
> -        .bus_changing_properties = bus_path_changing_properties
> +        .bus_vtable = bus_path_vtable
>  };
> diff --git a/src/core/scope.c b/src/core/scope.c
> index a3c9479..56c3746 100644
> --- a/src/core/scope.c
> +++ b/src/core/scope.c
> @@ -492,7 +492,6 @@ const UnitVTable scope_vtable = {
>  
>          .bus_interface = "org.freedesktop.systemd1.Scope",
>          .bus_vtable = bus_scope_vtable,
> -        .bus_changing_properties = bus_scope_changing_properties,
>          .bus_set_property = bus_scope_set_property,
>          .bus_commit_properties = bus_scope_commit_properties,
>  
> diff --git a/src/core/service.c b/src/core/service.c
> index 6c82ced..87eaa29 100644
> --- a/src/core/service.c
> +++ b/src/core/service.c
> @@ -3836,7 +3836,6 @@ const UnitVTable service_vtable = {
>  
>          .bus_interface = "org.freedesktop.systemd1.Service",
>          .bus_vtable = bus_service_vtable,
> -        .bus_changing_properties = bus_service_changing_properties,
>          .bus_set_property = bus_service_set_property,
>          .bus_commit_properties = bus_service_commit_properties,
>  
> diff --git a/src/core/socket.c b/src/core/socket.c
> index d6289a3..2442221 100644
> --- a/src/core/socket.c
> +++ b/src/core/socket.c
> @@ -2424,7 +2424,6 @@ const UnitVTable socket_vtable = {
>  
>          .bus_interface = "org.freedesktop.systemd1.Socket",
>          .bus_vtable = bus_socket_vtable,
> -        .bus_changing_properties = bus_socket_changing_properties,
>          .bus_set_property = bus_socket_set_property,
>          .bus_commit_properties = bus_socket_commit_properties,
>  
> diff --git a/src/core/swap.c b/src/core/swap.c
> index b197eb4..79862e5 100644
> --- a/src/core/swap.c
> +++ b/src/core/swap.c
> @@ -1445,7 +1445,6 @@ const UnitVTable swap_vtable = {
>  
>          .bus_interface = "org.freedesktop.systemd1.Swap",
>          .bus_vtable = bus_swap_vtable,
> -        .bus_changing_properties = bus_swap_changing_properties,
>          .bus_set_property = bus_swap_set_property,
>          .bus_commit_properties = bus_swap_commit_properties,
>  
> diff --git a/src/core/timer.c b/src/core/timer.c
> index f23582c..a4ff662 100644
> --- a/src/core/timer.c
> +++ b/src/core/timer.c
> @@ -646,5 +646,4 @@ const UnitVTable timer_vtable = {
>  
>          .bus_interface = "org.freedesktop.systemd1.Timer",
>          .bus_vtable = bus_timer_vtable,
> -        .bus_changing_properties = bus_timer_changing_properties,
>  };
> diff --git a/src/core/unit.h b/src/core/unit.h
> index 8ceeece..45816ea 100644
> --- a/src/core/unit.h
> +++ b/src/core/unit.h
> @@ -426,9 +426,6 @@ struct UnitVTable {
>          /* The bus vtable */
>          const sd_bus_vtable *bus_vtable;
>  
> -        /* strv list of changing properties */
> -        const char * const * const bus_changing_properties;
> -
>          /* The strings to print in status messages */
>          UnitStatusMessageFormats status_message_formats;
>  
> 
> commit a03e4337fd2ae1cc90989e9b7b5f160b42cdb021
> Author: Lennart Poettering <lennart at poettering.net>
> Date:   Sun Dec 22 03:22:34 2013 +0100
> 
>     bus: allow invocation of sd_bus_emit_properties_changed_strv() with NULL list
>     
>     When NULL is passed this shall indicate that a PropertiesChanged message
>     for all properties marked as EMITS_CHANGE or EMITS_INVALIDATION should
>     be generated.
> 
> diff --git a/src/libsystemd-bus/bus-objects.c b/src/libsystemd-bus/bus-objects.c
> index e468025..68437f1 100644
> --- a/src/libsystemd-bus/bus-objects.c
> +++ b/src/libsystemd-bus/bus-objects.c
> @@ -617,6 +617,52 @@ static int property_get_set_callbacks_run(
>          return 1;
>  }
>  
> +static int vtable_append_one_property(
> +                sd_bus *bus,
> +                sd_bus_message *reply,
> +                const char *path,
> +                struct node_vtable *c,
> +                const sd_bus_vtable *v,
> +                void *userdata,
> +                sd_bus_error *error) {
> +
> +        int r;
> +
> +        assert(bus);
> +        assert(reply);
> +        assert(path);
> +        assert(c);
> +        assert(v);
> +
> +        r = sd_bus_message_open_container(reply, 'e', "sv");
> +        if (r < 0)
> +                return r;
> +
> +        r = sd_bus_message_append(reply, "s", v->x.property.member);
> +        if (r < 0)
> +                return r;
> +
> +        r = sd_bus_message_open_container(reply, 'v', v->x.property.signature);
> +        if (r < 0)
> +                return r;
> +
> +        r = invoke_property_get(bus, v, path, c->interface, v->x.property.member, reply, vtable_property_convert_userdata(v, userdata), error);
> +        if (r < 0)
> +                return r;
> +        if (bus->nodes_modified)
> +                return 0;
> +
> +        r = sd_bus_message_close_container(reply);
> +        if (r < 0)
> +                return r;
> +
> +        r = sd_bus_message_close_container(reply);
> +        if (r < 0)
> +                return r;
> +
> +        return 0;
> +}
> +
>  static int vtable_append_all_properties(
>                  sd_bus *bus,
>                  sd_bus_message *reply,
> @@ -643,31 +689,11 @@ static int vtable_append_all_properties(
>                  if (v->flags & SD_BUS_VTABLE_HIDDEN)
>                          continue;
>  
> -                r = sd_bus_message_open_container(reply, 'e', "sv");
> -                if (r < 0)
> -                        return r;
> -
> -                r = sd_bus_message_append(reply, "s", v->x.property.member);
> -                if (r < 0)
> -                        return r;
> -
> -                r = sd_bus_message_open_container(reply, 'v', v->x.property.signature);
> -                if (r < 0)
> -                        return r;
> -
> -                r = invoke_property_get(bus, v, path, c->interface, v->x.property.member, reply, vtable_property_convert_userdata(v, userdata), error);
> +                r = vtable_append_one_property(bus, reply, path, c, v, userdata, error);
>                  if (r < 0)
>                          return r;
>                  if (bus->nodes_modified)
>                          return 0;
> -
> -                r = sd_bus_message_close_container(reply);
> -                if (r < 0)
> -                        return r;
> -
> -                r = sd_bus_message_close_container(reply);
> -                if (r < 0)
> -                        return r;
>          }
>  
>          return 1;
> @@ -1996,57 +2022,75 @@ static int emit_properties_changed_on_interface(
>                  if (r == 0)
>                          continue;
>  
> -                STRV_FOREACH(property, names) {
> -                        struct vtable_member *v;
> +                if (names) {
> +                        /* If the caller specified a list of
> +                         * properties we include exactly those in the
> +                         * PropertiesChanged message */
>  
> -                        assert_return(member_name_is_valid(*property), -EINVAL);
> +                        STRV_FOREACH(property, names) {
> +                                struct vtable_member *v;
>  
> -                        key.member = *property;
> -                        v = hashmap_get(bus->vtable_properties, &key);
> -                        if (!v)
> -                                return -ENOENT;
> +                                assert_return(member_name_is_valid(*property), -EINVAL);
>  
> -                        /* If there are two vtables for the same
> -                         * interface, let's handle this property when
> -                         * we come to that vtable. */
> -                        if (c != v->parent)
> -                                continue;
> +                                key.member = *property;
> +                                v = hashmap_get(bus->vtable_properties, &key);
> +                                if (!v)
> +                                        return -ENOENT;
> +
> +                                /* If there are two vtables for the same
> +                                 * interface, let's handle this property when
> +                                 * we come to that vtable. */
> +                                if (c != v->parent)
> +                                        continue;
>  
> -                        assert_return(v->vtable->flags & SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ||
> -                                      v->vtable->flags & SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION, -EDOM);
> +                                assert_return(v->vtable->flags & SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ||
> +                                              v->vtable->flags & SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION, -EDOM);
>  
> -                        if (v->vtable->flags & SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION) {
> -                                has_invalidating = true;
> -                                continue;
> +                                assert_return(!(v->vtable->flags & SD_BUS_VTABLE_HIDDEN), -EDOM);
> +
> +                                if (v->vtable->flags & SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION) {
> +                                        has_invalidating = true;
> +                                        continue;
> +                                }
> +
> +                                has_changing = true;
> +
> +                                r = vtable_append_one_property(bus, m, m->path, c, v->vtable, u, &error);
> +                                if (r < 0)
> +                                        return r;
> +                                if (bus->nodes_modified)
> +                                        return 0;
>                          }
> +                } else {
> +                        const sd_bus_vtable *v;
>  
> -                        has_changing = true;
> +                        /* If the caller specified no properties list
> +                         * we include all properties that are marked
> +                         * as changing in the message. */
>  
> -                        r = sd_bus_message_open_container(m, 'e', "sv");
> -                        if (r < 0)
> -                                return r;
> +                        for (v = c->vtable+1; v->type != _SD_BUS_VTABLE_END; v++) {
> +                                if (v->type != _SD_BUS_VTABLE_PROPERTY && v->type != _SD_BUS_VTABLE_WRITABLE_PROPERTY)
> +                                        continue;
>  
> -                        r = sd_bus_message_append(m, "s", *property);
> -                        if (r < 0)
> -                                return r;
> +                                if (v->flags & SD_BUS_VTABLE_HIDDEN)
> +                                        continue;
>  
> -                        r = sd_bus_message_open_container(m, 'v', v->vtable->x.property.signature);
> -                        if (r < 0)
> -                                return r;
> +                                if (v->flags & SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION) {
> +                                        has_invalidating = true;
> +                                        continue;
> +                                }
>  
> -                        r = invoke_property_get(bus, v->vtable, m->path, interface, *property, m, vtable_property_convert_userdata(v->vtable, u), &error);
> -                        if (r < 0)
> -                                return r;
> -                        if (bus->nodes_modified)
> -                                return 0;
> +                                if (!(v->flags & SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE))
> +                                        continue;
>  
> -                        r = sd_bus_message_close_container(m);
> -                        if (r < 0)
> -                                return r;
> +                                has_changing = true;
>  
> -                        r = sd_bus_message_close_container(m);
> -                        if (r < 0)
> -                                return r;
> +                                r = vtable_append_one_property(bus, m, m->path, c, v, u, &error);
> +                                if (r < 0)
> +                                        return r;
> +                                if (bus->nodes_modified)
> +                                        return 0;
> +                        }
>                  }
>          }
>  
> @@ -2077,19 +2121,38 @@ static int emit_properties_changed_on_interface(
>                          if (r == 0)
>                                  continue;
>  
> -                        STRV_FOREACH(property, names) {
> -                                struct vtable_member *v;
> +                        if (names) {
> +                                STRV_FOREACH(property, names) {
> +                                        struct vtable_member *v;
>  
> -                                key.member = *property;
> -                                assert_se(v = hashmap_get(bus->vtable_properties, &key));
> -                                assert(c == v->parent);
> +                                        key.member = *property;
> +                                        assert_se(v = hashmap_get(bus->vtable_properties, &key));
> +                                        assert(c == v->parent);
>  
> -                                if (!(v->vtable->flags & SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION))
> -                                        continue;
> +                                        if (!(v->vtable->flags & SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION))
> +                                                continue;
>  
> -                                r = sd_bus_message_append(m, "s", *property);
> -                                if (r < 0)
> -                                        return r;
> +                                        r = sd_bus_message_append(m, "s", *property);
> +                                        if (r < 0)
> +                                                return r;
> +                                }
> +                        } else {
> +                                const sd_bus_vtable *v;
> +
> +                                for (v = c->vtable+1; v->type != _SD_BUS_VTABLE_END; v++) {
> +                                        if (v->type != _SD_BUS_VTABLE_PROPERTY && v->type != _SD_BUS_VTABLE_WRITABLE_PROPERTY)
> +                                                continue;
> +
> +                                        if (v->flags & SD_BUS_VTABLE_HIDDEN)
> +                                                continue;
> +
> +                                        if (!(v->flags & SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION))
> +                                                continue;
> +
> +                                        r = sd_bus_message_append(m, "s", v->x.property.member);
> +                                        if (r < 0)
> +                                                return r;
> +                                }
>                          }
>                  }
>          }
> @@ -2121,7 +2184,12 @@ _public_ int sd_bus_emit_properties_changed_strv(
>          assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
>          assert_return(!bus_pid_changed(bus), -ECHILD);
>  
> -        if (strv_isempty(names))
> +
> +        /* A non-NULL but empty names list means nothing needs to be
> +           generated. A NULL list OTOH indicates that all properties
> +           that are set to EMITS_CHANGE or EMITS_INVALIDATION shall be
> +           included in the PropertiesChanged message. */
> +        if (names && names[0] == NULL)
>                  return 0;
>  
>          do {
> diff --git a/src/libsystemd-bus/test-bus-objects.c b/src/libsystemd-bus/test-bus-objects.c
> index 0ab7a14..e2423c7 100644
> --- a/src/libsystemd-bus/test-bus-objects.c
> +++ b/src/libsystemd-bus/test-bus-objects.c
> @@ -143,6 +143,17 @@ static int notify_test(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_er
>          return 1;
>  }
>  
> +static int notify_test2(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
> +        int r;
> +
> +        assert_se(sd_bus_emit_properties_changed_strv(bus, m->path, "org.freedesktop.systemd.ValueTest", NULL) >= 0);
> +
> +        r = sd_bus_reply_method_return(m, NULL);
> +        assert_se(r >= 0);
> +
> +        return 1;
> +}
> +
>  static int emit_interfaces_added(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
>          int r;
>  
> @@ -181,7 +192,11 @@ static const sd_bus_vtable vtable[] = {
>  static const sd_bus_vtable vtable2[] = {
>          SD_BUS_VTABLE_START(0),
>          SD_BUS_METHOD("NotifyTest", "", "", notify_test, 0),
> +        SD_BUS_METHOD("NotifyTest2", "", "", notify_test2, 0),
>          SD_BUS_PROPERTY("Value", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
> +        SD_BUS_PROPERTY("Value2", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
> +        SD_BUS_PROPERTY("Value3", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("Value4", "s", value_handler, 10, 0),
>          SD_BUS_VTABLE_END
>  };
>  
> @@ -405,6 +420,18 @@ static int client(struct context *c) {
>          sd_bus_message_unref(reply);
>          reply = NULL;
>  
> +        r = sd_bus_call_method(bus, "org.freedesktop.systemd.test", "/value/a", "org.freedesktop.systemd.ValueTest", "NotifyTest2", &error, NULL, "");
> +        assert_se(r >= 0);
> +
> +        r = sd_bus_process(bus, &reply);
> +        assert_se(r > 0);
> +
> +        assert_se(sd_bus_message_is_signal(reply, "org.freedesktop.DBus.Properties", "PropertiesChanged"));
> +        bus_message_dump(reply, stdout, true);
> +
> +        sd_bus_message_unref(reply);
> +        reply = NULL;
> +
>          r = sd_bus_call_method(bus, "org.freedesktop.systemd.test", "/foo", "org.freedesktop.systemd.test", "EmitInterfacesAdded", &error, NULL, "");
>          assert_se(r >= 0);
>  
> 
> commit 556089dc57b10a12a03edd3d3e90ca17398ad206
> Author: Lennart Poettering <lennart at poettering.net>
> Date:   Sun Dec 22 02:24:05 2013 +0100
> 
>     bus: decorate the various object vtables with SD_BUS_VTABLE_PROPERTY_CONST where appropriate
> 
> diff --git a/src/core/dbus-automount.c b/src/core/dbus-automount.c
> index 420cfaa..8559aed 100644
> --- a/src/core/dbus-automount.c
> +++ b/src/core/dbus-automount.c
> @@ -29,8 +29,8 @@ static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, automount_result, Autom
>  
>  const sd_bus_vtable bus_automount_vtable[] = {
>          SD_BUS_VTABLE_START(0),
> -        SD_BUS_PROPERTY("Where", "s", NULL, offsetof(Automount, where), 0),
> -        SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode, offsetof(Automount, directory_mode), 0),
> +        SD_BUS_PROPERTY("Where", "s", NULL, offsetof(Automount, where), SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode, offsetof(Automount, directory_mode), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Automount, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
>          SD_BUS_VTABLE_END
>  };
> diff --git a/src/core/dbus-busname.c b/src/core/dbus-busname.c
> index f9511a9..9f94bf1 100644
> --- a/src/core/dbus-busname.c
> +++ b/src/core/dbus-busname.c
> @@ -29,7 +29,7 @@ static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, busname_result, BusName
>  
>  const sd_bus_vtable bus_busname_vtable[] = {
>          SD_BUS_VTABLE_START(0),
> -        SD_BUS_PROPERTY("Name", "s", NULL, offsetof(BusName, name), 0),
> +        SD_BUS_PROPERTY("Name", "s", NULL, offsetof(BusName, name), SD_BUS_VTABLE_PROPERTY_CONST),
>          SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(BusName, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
>          SD_BUS_VTABLE_END
>  };
> diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c
> index 39865a9..413ace4 100644
> --- a/src/core/dbus-cgroup.c
> +++ b/src/core/dbus-cgroup.c
> @@ -135,17 +135,17 @@ static int property_get_device_allow(
>  
>  const sd_bus_vtable bus_cgroup_vtable[] = {
> +        SD_BUS_PROPERTY("CPUAccounting", "b", bus_property_get_bool, offsetof(CGroupContext, cpu_accounting), SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("CPUShares", "t", bus_property_get_ulong, offsetof(CGroupContext, cpu_shares), SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("BlockIOAccounting", "b", bus_property_get_bool, offsetof(CGroupContext, blockio_accounting), SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("BlockIOWeight", "t", bus_property_get_ulong, offsetof(CGroupContext, blockio_weight), SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("BlockIODeviceWeight", "a(st)", property_get_blockio_device_weight, 0, SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("BlockIOReadBandwidth", "a(st)", property_get_blockio_device_bandwidths, 0, SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("BlockIOWriteBandwidth", "a(st)", property_get_blockio_device_bandwidths, 0, SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("MemoryAccounting", "b", bus_property_get_bool, offsetof(CGroupContext, memory_accounting), SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("MemoryLimit", "t", NULL, offsetof(CGroupContext, memory_limit), SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("DevicePolicy", "s", property_get_cgroup_device_policy, offsetof(CGroupContext, device_policy), SD_BUS_VTABLE_PROPERTY_CONST),
> +        SD_BUS_PROPERTY("DeviceAllow", "a(ss)", property_get_device_allow, 0, SD_BUS_VTABLE_PROPERTY_CONST),
Aren't properties like "CPUShares", "MemoryAccounting", and others modifiable at runtime?
Or does this _CONST mean something different?

Zbyszek


More information about the systemd-devel mailing list