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 <lenn...@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 <lenn...@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 <lenn...@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 <lenn...@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 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel