diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/dbus-automount.c | 27 | ||||
-rw-r--r-- | src/dbus-automount.h | 2 | ||||
-rw-r--r-- | src/dbus-device.c | 27 | ||||
-rw-r--r-- | src/dbus-device.h | 2 | ||||
-rw-r--r-- | src/dbus-execute.h | 34 | ||||
-rw-r--r-- | src/dbus-job.c | 35 | ||||
-rw-r--r-- | src/dbus-job.h | 2 | ||||
-rw-r--r-- | src/dbus-manager.c | 135 | ||||
-rw-r--r-- | src/dbus-manager.h | 2 | ||||
-rw-r--r-- | src/dbus-mount.c | 41 | ||||
-rw-r--r-- | src/dbus-mount.h | 2 | ||||
-rw-r--r-- | src/dbus-service.c | 53 | ||||
-rw-r--r-- | src/dbus-service.h | 2 | ||||
-rw-r--r-- | src/dbus-snapshot.c | 29 | ||||
-rw-r--r-- | src/dbus-snapshot.h | 2 | ||||
-rw-r--r-- | src/dbus-socket.c | 45 | ||||
-rw-r--r-- | src/dbus-socket.h | 2 | ||||
-rw-r--r-- | src/dbus-swap.c | 29 | ||||
-rw-r--r-- | src/dbus-swap.h | 2 | ||||
-rw-r--r-- | src/dbus-target.c | 25 | ||||
-rw-r--r-- | src/dbus-target.h | 2 | ||||
-rw-r--r-- | src/dbus-unit.c | 2 | ||||
-rw-r--r-- | src/dbus-unit.h | 98 | ||||
-rw-r--r-- | src/dbus.c | 28 | ||||
-rw-r--r-- | src/dbus.h | 34 | ||||
-rw-r--r-- | src/main.c | 34 |
26 files changed, 414 insertions, 282 deletions
diff --git a/src/dbus-automount.c b/src/dbus-automount.c index 9003b74b8a..285f666da9 100644 --- a/src/dbus-automount.c +++ b/src/dbus-automount.c @@ -22,16 +22,21 @@ #include "dbus-unit.h" #include "dbus-automount.h" -static const char introspection[] = - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE - "<node>" - BUS_UNIT_INTERFACE - BUS_PROPERTIES_INTERFACE - " <interface name=\"org.freedesktop.systemd1.Automount\">" - " <property name=\"Where\" type=\"s\" access=\"read\"/>" - " </interface>" - BUS_INTROSPECTABLE_INTERFACE - "</node>"; +#define BUS_AUTOMOUNT_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Automount\">\n" \ + " <property name=\"Where\" type=\"s\" access=\"read\"/>\n" \ + " </interface>\n" + +#define INTROSPECTION \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "<node>\n" \ + BUS_UNIT_INTERFACE \ + BUS_AUTOMOUNT_INTERFACE \ + BUS_PROPERTIES_INTERFACE \ + BUS_INTROSPECTABLE_INTERFACE \ + "</node>\n" + +const char bus_automount_interface[] = BUS_AUTOMOUNT_INTERFACE; DBusHandlerResult bus_automount_message_handler(Unit *u, DBusMessage *message) { const BusProperty properties[] = { @@ -40,5 +45,5 @@ DBusHandlerResult bus_automount_message_handler(Unit *u, DBusMessage *message) { { NULL, NULL, NULL, NULL, NULL } }; - return bus_default_message_handler(u->meta.manager, message, introspection, properties); + return bus_default_message_handler(u->meta.manager, message, INTROSPECTION, properties); } diff --git a/src/dbus-automount.h b/src/dbus-automount.h index 947bf0f59f..5e0ee5107b 100644 --- a/src/dbus-automount.h +++ b/src/dbus-automount.h @@ -28,4 +28,6 @@ DBusHandlerResult bus_automount_message_handler(Unit *u, DBusMessage *message); +extern const char bus_automount_interface[]; + #endif diff --git a/src/dbus-device.c b/src/dbus-device.c index 83764783ad..0610ab873f 100644 --- a/src/dbus-device.c +++ b/src/dbus-device.c @@ -22,16 +22,21 @@ #include "dbus-unit.h" #include "dbus-device.h" -static const char introspection[] = - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE - "<node>" - BUS_UNIT_INTERFACE - BUS_PROPERTIES_INTERFACE - " <interface name=\"org.freedesktop.systemd1.Device\">" - " <property name=\"SysFSPath\" type=\"s\" access=\"read\"/>" - " </interface>" - BUS_INTROSPECTABLE_INTERFACE - "</node>"; +#define BUS_DEVICE_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Device\">\n" \ + " <property name=\"SysFSPath\" type=\"s\" access=\"read\"/>\n" \ + " </interface>\n" + +#define INTROSPECTION \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "<node>\n" \ + BUS_UNIT_INTERFACE \ + BUS_DEVICE_INTERFACE \ + BUS_PROPERTIES_INTERFACE \ + BUS_INTROSPECTABLE_INTERFACE \ + "</node>\n" + +const char bus_device_interface[] = BUS_DEVICE_INTERFACE; DBusHandlerResult bus_device_message_handler(Unit *u, DBusMessage *message) { const BusProperty properties[] = { @@ -40,5 +45,5 @@ DBusHandlerResult bus_device_message_handler(Unit *u, DBusMessage *message) { { NULL, NULL, NULL, NULL, NULL } }; - return bus_default_message_handler(u->meta.manager, message, introspection, properties); + return bus_default_message_handler(u->meta.manager, message, INTROSPECTION, properties); } diff --git a/src/dbus-device.h b/src/dbus-device.h index f2850a63f8..55bb8f55f3 100644 --- a/src/dbus-device.h +++ b/src/dbus-device.h @@ -28,4 +28,6 @@ DBusHandlerResult bus_device_message_handler(Unit *u, DBusMessage *message); +extern const char bus_device_interface[]; + #endif diff --git a/src/dbus-execute.h b/src/dbus-execute.h index 25ecd982a4..6abae1657c 100644 --- a/src/dbus-execute.h +++ b/src/dbus-execute.h @@ -27,23 +27,23 @@ #include "manager.h" #define BUS_EXEC_CONTEXT_INTERFACE \ - " <property name=\"Environment\" type=\"as\" access=\"read\"/>" \ - " <property name=\"UMask\" type=\"u\" access=\"read\"/>" \ - " <property name=\"WorkingDirectory\" type=\"s\" access=\"read\"/>" \ - " <property name=\"RootDirectory\" type=\"s\" access=\"read\"/>" \ - " <property name=\"CPUSchedulingResetOnFork\" type=\"b\" access=\"read\"/>" \ - " <property name=\"NonBlocking\" type=\"b\" access=\"read\"/>" \ - " <property name=\"StandardInput\" type=\"s\" access=\"read\"/>" \ - " <property name=\"StandardOutput\" type=\"s\" access=\"read\"/>" \ - " <property name=\"StandardError\" type=\"s\" access=\"read\"/>" \ - " <property name=\"TTYPath\" type=\"s\" access=\"read\"/>" \ - " <property name=\"SyslogPriority\" type=\"i\" access=\"read\"/>" \ - " <property name=\"SyslogIdentifier\" type=\"s\" access=\"read\"/>" \ - " <property name=\"SecureBits\" type=\"i\" access=\"read\"/>" \ - " <property name=\"CapabilityBoundingSetDrop\" type=\"t\" access=\"read\"/>" \ - " <property name=\"User\" type=\"s\" access=\"read\"/>" \ - " <property name=\"Group\" type=\"s\" access=\"read\"/>" \ - " <property name=\"SupplementaryGroups\" type=\"as\" access=\"read\"/>" + " <property name=\"Environment\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"UMask\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"WorkingDirectory\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"RootDirectory\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"CPUSchedulingResetOnFork\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"NonBlocking\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"StandardInput\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"StandardOutput\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"StandardError\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"TTYPath\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"SyslogPriority\" type=\"i\" access=\"read\"/>\n" \ + " <property name=\"SyslogIdentifier\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"SecureBits\" type=\"i\" access=\"read\"/>\n" \ + " <property name=\"CapabilityBoundingSetDrop\" type=\"t\" access=\"read\"/>\n" \ + " <property name=\"User\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"Group\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"SupplementaryGroups\" type=\"as\" access=\"read\"/>\n" #define BUS_EXEC_CONTEXT_PROPERTIES(interface, context) \ { interface, "Environment", bus_property_append_strv, "as", (context).environment }, \ diff --git a/src/dbus-job.c b/src/dbus-job.c index 34e64fc681..7346252a18 100644 --- a/src/dbus-job.c +++ b/src/dbus-job.c @@ -25,20 +25,25 @@ #include "log.h" #include "dbus-job.h" -static const char introspection[] = - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE - "<node>" - " <interface name=\"org.freedesktop.systemd1.Job\">" - " <method name=\"Cancel\"/>" - " <signal name=\"Changed\"/>" - " <property name=\"Id\" type=\"u\" access=\"read\"/>" - " <property name=\"Unit\" type=\"(so)\" access=\"read\"/>" - " <property name=\"JobType\" type=\"s\" access=\"read\"/>" - " <property name=\"State\" type=\"s\" access=\"read\"/>" - " </interface>" - BUS_PROPERTIES_INTERFACE - BUS_INTROSPECTABLE_INTERFACE - "</node>"; +#define BUS_JOB_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Job\">\n" \ + " <method name=\"Cancel\"/>\n" \ + " <signal name=\"Changed\"/>\n" \ + " <property name=\"Id\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"Unit\" type=\"(so)\" access=\"read\"/>\n" \ + " <property name=\"JobType\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"State\" type=\"s\" access=\"read\"/>\n" \ + " </interface>\n" + +#define INTROSPECTION \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "<node>\n" \ + BUS_JOB_INTERFACE \ + BUS_PROPERTIES_INTERFACE \ + BUS_INTROSPECTABLE_INTERFACE \ + "</node>\n" + +const char bus_job_interface[] = BUS_JOB_INTERFACE; static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_job_append_state, job_state, JobState); static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_job_append_type, job_type, JobType); @@ -92,7 +97,7 @@ static DBusHandlerResult bus_job_message_dispatch(Job *j, DBusMessage *message) job_free(j); } else - return bus_default_message_handler(j->manager, message, introspection, properties); + return bus_default_message_handler(j->manager, message, INTROSPECTION, properties); if (reply) { if (!dbus_connection_send(m->api_bus, reply, NULL)) diff --git a/src/dbus-job.h b/src/dbus-job.h index 4602358856..2b79423f01 100644 --- a/src/dbus-job.h +++ b/src/dbus-job.h @@ -29,4 +29,6 @@ void bus_job_send_removed_signal(Job *j, bool success); extern const DBusObjectPathVTable bus_job_vtable; +extern const char bus_job_interface[]; + #endif diff --git a/src/dbus-manager.c b/src/dbus-manager.c index 9833b6c85f..6b658d1931 100644 --- a/src/dbus-manager.c +++ b/src/dbus-manager.c @@ -26,77 +26,82 @@ #include "dbus-manager.h" #include "strv.h" +#define BUS_MANAGER_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Manager\">\n" \ + " <method name=\"GetUnit\">\n" \ + " <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \ + " <arg name=\"unit\" type=\"o\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <method name=\"LoadUnit\">\n" \ + " <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \ + " <arg name=\"unit\" type=\"o\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <method name=\"GetJob\">\n" \ + " <arg name=\"id\" type=\"u\" direction=\"in\"/>\n" \ + " <arg name=\"job\" type=\"o\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <method name=\"ClearJobs\"/>\n" \ + " <method name=\"ListUnits\">\n" \ + " <arg name=\"units\" type=\"a(sssssouso)\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <method name=\"ListJobs\">\n" \ + " <arg name=\"jobs\" type=\"a(usssoo)\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <method name=\"Subscribe\"/>\n" \ + " <method name=\"Unsubscribe\"/>\n" \ + " <method name=\"Dump\"/>\n" \ + " <method name=\"CreateSnapshot\">\n" \ + " <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \ + " <arg nane=\"cleanup\" type=\"b\" direction=\"in\"/>\n" \ + " <arg name=\"unit\" type=\"o\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <method name=\"Reload\"/>\n" \ + " <method name=\"Reexecute\"/>\n" \ + " <method name=\"Exit\"/>\n" \ + " <method name=\"SetEnvironment\">\n" \ + " <arg name=\"names\" type=\"as\" direction=\"in\"/>\n" \ + " </method>\n" \ + " <method name=\"UnsetEnvironment\">\n" \ + " <arg name=\"names\" type=\"as\" direction=\"in\"/>\n" \ + " </method>\n" \ + " <signal name=\"UnitNew\">\n" \ + " <arg name=\"id\" type=\"s\"/>\n" \ + " <arg name=\"unit\" type=\"o\"/>\n" \ + " </signal>\n" \ + " <signal name=\"UnitRemoved\">\n" \ + " <arg name=\"id\" type=\"s\"/>\n" \ + " <arg name=\"unit\" type=\"o\"/>\n" \ + " </signal>\n" \ + " <signal name=\"JobNew\">\n" \ + " <arg name=\"id\" type=\"u\"/>\n" \ + " <arg name=\"job\" type=\"o\"/>\n" \ + " </signal>\n" \ + " <signal name=\"JobRemoved\">\n" \ + " <arg name=\"id\" type=\"u\"/>\n" \ + " <arg name=\"job\" type=\"o\"/>\n" \ + " <arg name=\"success\" type=\"b\"/>\n" \ + " </signal>" \ + " <property name=\"Version\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"RunningAs\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"BootTimestamp\" type=\"t\" access=\"read\"/>\n" \ + " <property name=\"LogLevel\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"LogTarget\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"NNames\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"NJobs\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"Environment\" type=\"as\" access=\"read\"/>\n" \ + " </interface>\n" + #define INTROSPECTION_BEGIN \ DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ - "<node>" \ - " <interface name=\"org.freedesktop.systemd1.Manager\">" \ - " <method name=\"GetUnit\">" \ - " <arg name=\"name\" type=\"s\" direction=\"in\"/>" \ - " <arg name=\"unit\" type=\"o\" direction=\"out\"/>" \ - " </method>" \ - " <method name=\"LoadUnit\">" \ - " <arg name=\"name\" type=\"s\" direction=\"in\"/>" \ - " <arg name=\"unit\" type=\"o\" direction=\"out\"/>" \ - " </method>" \ - " <method name=\"GetJob\">" \ - " <arg name=\"id\" type=\"u\" direction=\"in\"/>" \ - " <arg name=\"job\" type=\"o\" direction=\"out\"/>" \ - " </method>" \ - " <method name=\"ClearJobs\"/>" \ - " <method name=\"ListUnits\">" \ - " <arg name=\"units\" type=\"a(sssssouso)\" direction=\"out\"/>" \ - " </method>" \ - " <method name=\"ListJobs\">" \ - " <arg name=\"jobs\" type=\"a(usssoo)\" direction=\"out\"/>" \ - " </method>" \ - " <method name=\"Subscribe\"/>" \ - " <method name=\"Unsubscribe\"/>" \ - " <method name=\"Dump\"/>" \ - " <method name=\"CreateSnapshot\">" \ - " <arg name=\"name\" type=\"s\" direction=\"in\"/>" \ - " <arg nane=\"cleanup\" type=\"b\" direction=\"in\"/>" \ - " <arg name=\"unit\" type=\"o\" direction=\"out\"/>" \ - " </method>" \ - " <method name=\"Reload\"/>" \ - " <method name=\"Reexecute\"/>" \ - " <method name=\"Exit\"/>" \ - " <method name=\"SetEnvironment\">" \ - " <arg name=\"names\" type=\"as\" direction=\"in\"/>" \ - " </method>" \ - " <method name=\"UnsetEnvironment\">" \ - " <arg name=\"names\" type=\"as\" direction=\"in\"/>" \ - " </method>" \ - " <signal name=\"UnitNew\">" \ - " <arg name=\"id\" type=\"s\"/>" \ - " <arg name=\"unit\" type=\"o\"/>" \ - " </signal>" \ - " <signal name=\"UnitRemoved\">" \ - " <arg name=\"id\" type=\"s\"/>" \ - " <arg name=\"unit\" type=\"o\"/>" \ - " </signal>" \ - " <signal name=\"JobNew\">" \ - " <arg name=\"id\" type=\"u\"/>" \ - " <arg name=\"job\" type=\"o\"/>" \ - " </signal>" \ - " <signal name=\"JobRemoved\">" \ - " <arg name=\"id\" type=\"u\"/>" \ - " <arg name=\"job\" type=\"o\"/>" \ - " <arg name=\"success\" type=\"b\"/>" \ - " </signal>" \ - " <property name=\"Version\" type=\"s\" access=\"read\"/>" \ - " <property name=\"RunningAs\" type=\"s\" access=\"read\"/>" \ - " <property name=\"BootTimestamp\" type=\"t\" access=\"read\"/>" \ - " <property name=\"LogLevel\" type=\"s\" access=\"read\"/>" \ - " <property name=\"LogTarget\" type=\"s\" access=\"read\"/>" \ - " <property name=\"NNames\" type=\"u\" access=\"read\"/>" \ - " <property name=\"NJobs\" type=\"u\" access=\"read\"/>" \ - " <property name=\"Environment\" type=\"as\" access=\"read\"/>" \ - " </interface>" \ + "<node>\n" \ + BUS_MANAGER_INTERFACE \ BUS_PROPERTIES_INTERFACE \ BUS_INTROSPECTABLE_INTERFACE #define INTROSPECTION_END \ - "</node>" + "</node>\n" + +const char bus_manager_interface[] = BUS_MANAGER_INTERFACE; static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_manager_append_running_as, manager_running_as, ManagerRunningAs); diff --git a/src/dbus-manager.h b/src/dbus-manager.h index 0acd2d086d..996b680e3c 100644 --- a/src/dbus-manager.h +++ b/src/dbus-manager.h @@ -26,4 +26,6 @@ extern const DBusObjectPathVTable bus_manager_vtable; +extern const char bus_manager_interface[]; + #endif diff --git a/src/dbus-mount.c b/src/dbus-mount.c index 500b773bf6..cccfa60e10 100644 --- a/src/dbus-mount.c +++ b/src/dbus-mount.c @@ -25,23 +25,28 @@ #include "dbus-mount.h" #include "dbus-execute.h" -static const char introspection[] = - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE - "<node>" - BUS_UNIT_INTERFACE - BUS_PROPERTIES_INTERFACE - " <interface name=\"org.freedesktop.systemd1.Mount\">" - " <property name=\"Where\" type=\"s\" access=\"read\"/>" - " <property name=\"What\" type=\"s\" access=\"read\"/>" - " <property name=\"Options\" type=\"s\" access=\"read\"/>" - " <property name=\"Type\" type=\"s\" access=\"read\"/>" - " <property name=\"TimeoutUSec\" type=\"t\" access=\"read\"/>" - BUS_EXEC_CONTEXT_INTERFACE - " <property name=\"KillMode\" type=\"s\" access=\"read\"/>" - " <property name=\"ControlPID\" type=\"u\" access=\"read\"/>" - " </interface>" - BUS_INTROSPECTABLE_INTERFACE - "</node>"; +#define BUS_MOUNT_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Mount\">\n" \ + " <property name=\"Where\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"What\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"Options\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"Type\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"TimeoutUSec\" type=\"t\" access=\"read\"/>\n" \ + BUS_EXEC_CONTEXT_INTERFACE \ + " <property name=\"KillMode\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \ + " </interface>\n" + +#define INTROSPECTION \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "<node>\n" \ + BUS_UNIT_INTERFACE \ + BUS_MOUNT_INTERFACE \ + BUS_PROPERTIES_INTERFACE \ + BUS_INTROSPECTABLE_INTERFACE \ + "</node>\n" + +const char bus_mount_interface[] = BUS_MOUNT_INTERFACE; static int bus_mount_append_what(Manager *n, DBusMessageIter *i, const char *property, void *data) { Mount *m = data; @@ -130,5 +135,5 @@ DBusHandlerResult bus_mount_message_handler(Unit *u, DBusMessage *message) { { NULL, NULL, NULL, NULL, NULL } }; - return bus_default_message_handler(u->meta.manager, message, introspection, properties); + return bus_default_message_handler(u->meta.manager, message, INTROSPECTION, properties); } diff --git a/src/dbus-mount.h b/src/dbus-mount.h index b92867df28..6d8d1a9685 100644 --- a/src/dbus-mount.h +++ b/src/dbus-mount.h @@ -28,4 +28,6 @@ DBusHandlerResult bus_mount_message_handler(Unit *u, DBusMessage *message); +extern const char bus_mount_interface[]; + #endif diff --git a/src/dbus-service.c b/src/dbus-service.c index 24dd6c14f6..6286172a1b 100644 --- a/src/dbus-service.c +++ b/src/dbus-service.c @@ -25,29 +25,34 @@ #include "dbus-execute.h" #include "dbus-service.h" -static const char introspection[] = - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE - "<node>" - BUS_UNIT_INTERFACE - BUS_PROPERTIES_INTERFACE - " <interface name=\"org.freedesktop.systemd1.Service\">" - " <property name=\"Type\" type=\"s\" access=\"read\"/>" - " <property name=\"Restart\" type=\"s\" access=\"read\"/>" - " <property name=\"PIDFile\" type=\"s\" access=\"read\"/>" - " <property name=\"RestartUSec\" type=\"t\" access=\"read\"/>" - " <property name=\"TimeoutUSec\" type=\"t\" access=\"read\"/>" - BUS_EXEC_CONTEXT_INTERFACE - " <property name=\"PermissionsStartOnly\" type=\"b\" access=\"read\"/>" - " <property name=\"RootDirectoryStartOnly\" type=\"b\" access=\"read\"/>" - " <property name=\"ValidNoProcess\" type=\"b\" access=\"read\"/>" - " <property name=\"KillMode\" type=\"s\" access=\"read\"/>" - " <property name=\"MainPID\" type=\"u\" access=\"read\"/>" - " <property name=\"ControlPID\" type=\"u\" access=\"read\"/>" - " <property name=\"SysVPath\" type=\"s\" access=\"read\"/>" - " <property name=\"BusName\" type=\"s\" access=\"read\"/>" - " </interface>" - BUS_INTROSPECTABLE_INTERFACE - "</node>"; +#define BUS_SERVICE_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Service\">\n" \ + " <property name=\"Type\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"Restart\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"PIDFile\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"RestartUSec\" type=\"t\" access=\"read\"/>\n" \ + " <property name=\"TimeoutUSec\" type=\"t\" access=\"read\"/>\n" \ + BUS_EXEC_CONTEXT_INTERFACE \ + " <property name=\"PermissionsStartOnly\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"RootDirectoryStartOnly\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"ValidNoProcess\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"KillMode\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"MainPID\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"SysVPath\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"BusName\" type=\"s\" access=\"read\"/>\n" \ + " </interface>\n" + +#define INTROSPECTION \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "<node>\n" \ + BUS_UNIT_INTERFACE \ + BUS_SERVICE_INTERFACE \ + BUS_PROPERTIES_INTERFACE \ + BUS_INTROSPECTABLE_INTERFACE \ + "</node>\n" + +const char bus_service_interface[] = BUS_SERVICE_INTERFACE; static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_service_append_type, service_type, ServiceType); static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_service_append_restart, service_restart, ServiceRestart); @@ -74,5 +79,5 @@ DBusHandlerResult bus_service_message_handler(Unit *u, DBusMessage *message) { { NULL, NULL, NULL, NULL, NULL } }; - return bus_default_message_handler(u->meta.manager, message, introspection, properties); + return bus_default_message_handler(u->meta.manager, message, INTROSPECTION, properties); } diff --git a/src/dbus-service.h b/src/dbus-service.h index f0a468e90d..ab1e02f352 100644 --- a/src/dbus-service.h +++ b/src/dbus-service.h @@ -28,4 +28,6 @@ DBusHandlerResult bus_service_message_handler(Unit *u, DBusMessage *message); +extern const char bus_service_interface[]; + #endif diff --git a/src/dbus-snapshot.c b/src/dbus-snapshot.c index 8aeca15254..15e51f032e 100644 --- a/src/dbus-snapshot.c +++ b/src/dbus-snapshot.c @@ -22,17 +22,22 @@ #include "dbus-unit.h" #include "dbus-snapshot.h" -static const char introspection[] = - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE - "<node>" - BUS_UNIT_INTERFACE - BUS_PROPERTIES_INTERFACE - " <interface name=\"org.freedesktop.systemd1.Snapshot\">" - " <method name=\"Remove\"/>" - " <property name=\"Cleanup\" type=\"b\" access=\"read\"/>" - " </interface>" - BUS_INTROSPECTABLE_INTERFACE - "</node>"; +#define BUS_SNAPSHOT_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Snapshot\">\n" \ + " <method name=\"Remove\"/>\n" \ + " <property name=\"Cleanup\" type=\"b\" access=\"read\"/>\n" \ + " </interface>\n" + +#define INTROSPECTION \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "<node>\n" \ + BUS_UNIT_INTERFACE \ + BUS_SNAPSHOT_INTERFACE \ + BUS_PROPERTIES_INTERFACE \ + BUS_INTROSPECTABLE_INTERFACE \ + "</node>\n" + +const char bus_snapshot_interface[] = BUS_SNAPSHOT_INTERFACE; DBusHandlerResult bus_snapshot_message_handler(Unit *u, DBusMessage *message) { const BusProperty properties[] = { @@ -54,7 +59,7 @@ DBusHandlerResult bus_snapshot_message_handler(Unit *u, DBusMessage *message) { goto oom; } else - return bus_default_message_handler(u->meta.manager, message, introspection, properties); + return bus_default_message_handler(u->meta.manager, message, INTROSPECTION, properties); if (reply) { if (!dbus_connection_send(u->meta.manager->api_bus, reply, NULL)) diff --git a/src/dbus-snapshot.h b/src/dbus-snapshot.h index 5f28550c95..bf5a4d4bc5 100644 --- a/src/dbus-snapshot.h +++ b/src/dbus-snapshot.h @@ -28,4 +28,6 @@ DBusHandlerResult bus_snapshot_message_handler(Unit *u, DBusMessage *message); +extern const char bus_snapshot_interface[]; + #endif diff --git a/src/dbus-socket.c b/src/dbus-socket.c index cb244a9003..426af2b4cf 100644 --- a/src/dbus-socket.c +++ b/src/dbus-socket.c @@ -25,25 +25,30 @@ #include "dbus-socket.h" #include "dbus-execute.h" -static const char introspection[] = - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE - "<node>" - BUS_UNIT_INTERFACE - BUS_PROPERTIES_INTERFACE - " <interface name=\"org.freedesktop.systemd1.Socket\">" - " <property name=\"BindIPv6Only\" type=\"b\" access=\"read\"/>" - " <property name=\"Backlog\" type=\"u\" access=\"read\"/>" - " <property name=\"TimeoutUSec\" type=\"t\" access=\"read\"/>" - BUS_EXEC_CONTEXT_INTERFACE - " <property name=\"KillMode\" type=\"s\" access=\"read\"/>" - " <property name=\"ControlPID\" type=\"u\" access=\"read\"/>" - " <property name=\"BindToDevice\" type=\"s\" access=\"read\"/>" - " <property name=\"DirectoryMode\" type=\"u\" access=\"read\"/>" - " <property name=\"SocketMode\" type=\"u\" access=\"read\"/>" - " <property name=\"Accept\" type=\"b\" access=\"read\"/>" - " </interface>" - BUS_INTROSPECTABLE_INTERFACE - "</node>"; +#define BUS_SOCKET_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Socket\">\n" \ + " <property name=\"BindIPv6Only\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"Backlog\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"TimeoutUSec\" type=\"t\" access=\"read\"/>\n" \ + BUS_EXEC_CONTEXT_INTERFACE \ + " <property name=\"KillMode\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"BindToDevice\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"DirectoryMode\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"SocketMode\" type=\"u\" access=\"read\"/>\n" \ + " <property name=\"Accept\" type=\"b\" access=\"read\"/>\n" \ + " </interface>\n" \ + +#define INTROSPECTION \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "<node>\n" \ + BUS_UNIT_INTERFACE \ + BUS_SOCKET_INTERFACE \ + BUS_PROPERTIES_INTERFACE \ + BUS_INTROSPECTABLE_INTERFACE \ + "</node>\n" + +const char bus_socket_interface[] = BUS_SOCKET_INTERFACE; static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_socket_append_bind_ipv6_only, socket_address_bind_ipv6_only, SocketAddressBindIPv6Only); @@ -64,5 +69,5 @@ DBusHandlerResult bus_socket_message_handler(Unit *u, DBusMessage *message) { { NULL, NULL, NULL, NULL, NULL } }; - return bus_default_message_handler(u->meta.manager, message, introspection, properties); + return bus_default_message_handler(u->meta.manager, message, INTROSPECTION, properties); } diff --git a/src/dbus-socket.h b/src/dbus-socket.h index 6a8f534bf5..ab06322042 100644 --- a/src/dbus-socket.h +++ b/src/dbus-socket.h @@ -28,4 +28,6 @@ DBusHandlerResult bus_socket_message_handler(Unit *u, DBusMessage *message); +extern const char bus_socket_interface[]; + #endif diff --git a/src/dbus-swap.c b/src/dbus-swap.c index e935e09bf2..f6f8685daf 100644 --- a/src/dbus-swap.c +++ b/src/dbus-swap.c @@ -25,17 +25,22 @@ #include "dbus-unit.h" #include "dbus-swap.h" -static const char introspection[] = - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE - "<node>" - BUS_UNIT_INTERFACE - BUS_PROPERTIES_INTERFACE - " <interface name=\"org.freedesktop.systemd1.Swap\">" - " <property name=\"What\" type=\"s\" access=\"read\"/>" - " <property name=\"Priority\" type=\"i\" access=\"read\"/>" - " </interface>" - BUS_INTROSPECTABLE_INTERFACE - "</node>"; +#define BUS_SWAP_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Swap\">\n" \ + " <property name=\"What\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"Priority\" type=\"i\" access=\"read\"/>\n" \ + " </interface>\n" + +#define INTROSPECTION \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "<node>\n" \ + BUS_UNIT_INTERFACE \ + BUS_SWAP_INTERFACE \ + BUS_PROPERTIES_INTERFACE \ + BUS_INTROSPECTABLE_INTERFACE \ + "</node>\n" + +const char bus_swap_interface[] = BUS_SWAP_INTERFACE; static int bus_swap_append_priority(Manager *m, DBusMessageIter *i, const char *property, void *data) { Swap *s = data; @@ -69,5 +74,5 @@ DBusHandlerResult bus_swap_message_handler(Unit *u, DBusMessage *message) { { NULL, NULL, NULL, NULL, NULL } }; - return bus_default_message_handler(u->meta.manager, message, introspection, properties); + return bus_default_message_handler(u->meta.manager, message, INTROSPECTION, properties); } diff --git a/src/dbus-swap.h b/src/dbus-swap.h index 3bef6ad621..cbd15919db 100644 --- a/src/dbus-swap.h +++ b/src/dbus-swap.h @@ -29,4 +29,6 @@ DBusHandlerResult bus_swap_message_handler(Unit *u, DBusMessage *message); +extern const char bus_swap_interface[]; + #endif diff --git a/src/dbus-target.c b/src/dbus-target.c index be984b9bb4..45f0d31f05 100644 --- a/src/dbus-target.c +++ b/src/dbus-target.c @@ -22,15 +22,20 @@ #include "dbus-unit.h" #include "dbus-target.h" -static const char introspection[] = - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE - "<node>" - BUS_UNIT_INTERFACE - BUS_PROPERTIES_INTERFACE - " <interface name=\"org.freedesktop.systemd1.Target\">" - " </interface>" - BUS_INTROSPECTABLE_INTERFACE - "</node>"; +#define BUS_TARGET_INTERFACE \ + " <interface name=\"org.freedesktop.systemd1.Target\">\n" \ + " </interface>\n" + +#define INTROSPECTION \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "<node>\n" \ + BUS_UNIT_INTERFACE \ + BUS_TARGET_INTERFACE \ + BUS_PROPERTIES_INTERFACE \ + BUS_INTROSPECTABLE_INTERFACE \ + "</node>\n" + +const char bus_target_interface[] = BUS_TARGET_INTERFACE; DBusHandlerResult bus_target_message_handler(Unit *u, DBusMessage *message) { const BusProperty properties[] = { @@ -38,5 +43,5 @@ DBusHandlerResult bus_target_message_handler(Unit *u, DBusMessage *message) { { NULL, NULL, NULL, NULL, NULL } }; - return bus_default_message_handler(u->meta.manager, message, introspection, properties); + return bus_default_message_handler(u->meta.manager, message, INTROSPECTION, properties); } diff --git a/src/dbus-target.h b/src/dbus-target.h index f6a1ac5e65..d118441a67 100644 --- a/src/dbus-target.h +++ b/src/dbus-target.h @@ -28,4 +28,6 @@ DBusHandlerResult bus_target_message_handler(Unit *u, DBusMessage *message); +extern const char bus_target_interface[]; + #endif diff --git a/src/dbus-unit.c b/src/dbus-unit.c index ba428a8d5c..87218cd2ee 100644 --- a/src/dbus-unit.c +++ b/src/dbus-unit.c @@ -25,6 +25,8 @@ #include "log.h" #include "dbus-unit.h" +const char bus_unit_interface[] = BUS_UNIT_INTERFACE; + int bus_unit_append_names(Manager *m, DBusMessageIter *i, const char *property, void *data) { char *t; Iterator j; diff --git a/src/dbus-unit.h b/src/dbus-unit.h index c5840d5632..07641ee951 100644 --- a/src/dbus-unit.h +++ b/src/dbus-unit.h @@ -27,54 +27,54 @@ #include "manager.h" #define BUS_UNIT_INTERFACE \ - " <interface name=\"org.freedesktop.systemd1.Unit\">" \ - " <method name=\"Start\">" \ - " <arg name=\"mode\" type=\"s\" direction=\"in\"/>" \ - " <arg name=\"job\" type=\"o\" direction=\"out\"/>" \ - " </method>" \ - " <method name=\"Stop\">" \ - " <arg name=\"mode\" type=\"s\" direction=\"in\"/>" \ - " <arg name=\"job\" type=\"o\" direction=\"out\"/>" \ - " </method>" \ - " <method name=\"Restart\">" \ - " <arg name=\"mode\" type=\"s\" direction=\"in\"/>" \ - " <arg name=\"job\" type=\"o\" direction=\"out\"/>" \ - " </method>" \ - " <method name=\"Reload\">" \ - " <arg name=\"mode\" type=\"s\" direction=\"in\"/>" \ - " <arg name=\"job\" type=\"o\" direction=\"out\"/>" \ - " </method>" \ - " <signal name=\"Changed\"/>" \ - " <property name=\"Id\" type=\"s\" access=\"read\"/>" \ - " <property name=\"Names\" type=\"as\" access=\"read\"/>" \ - " <property name=\"Requires\" type=\"as\" access=\"read\"/>" \ - " <property name=\"RequiresOverridable\" type=\"as\" access=\"read\"/>" \ - " <property name=\"Requisite\" type=\"as\" access=\"read\"/>" \ - " <property name=\"RequisiteOverridable\" type=\"as\" access=\"read\"/>" \ - " <property name=\"Wants\" type=\"as\" access=\"read\"/>" \ - " <property name=\"RequiredBy\" type=\"as\" access=\"read\"/>" \ - " <property name=\"RequiredByOverridable\" type=\"as\" access=\"read\"/>" \ - " <property name=\"WantedBy\" type=\"as\" access=\"read\"/>" \ - " <property name=\"Conflicts\" type=\"as\" access=\"read\"/>" \ - " <property name=\"Before\" type=\"as\" access=\"read\"/>" \ - " <property name=\"After\" type=\"as\" access=\"read\"/>" \ - " <property name=\"Description\" type=\"s\" access=\"read\"/>" \ - " <property name=\"LoadState\" type=\"s\" access=\"read\"/>" \ - " <property name=\"ActiveState\" type=\"s\" access=\"read\"/>" \ - " <property name=\"SubState\" type=\"s\" access=\"read\"/>" \ - " <property name=\"FragmentPath\" type=\"s\" access=\"read\"/>" \ - " <property name=\"InactiveExitTimestamp\" type=\"t\" access=\"read\"/>" \ - " <property name=\"ActiveEnterTimestamp\" type=\"t\" access=\"read\"/>" \ - " <property name=\"ActiveExitTimestamp\" type=\"t\" access=\"read\"/>" \ - " <property name=\"InactiveEnterTimestamp\" type=\"t\" access=\"read\"/>" \ - " <property name=\"CanReload\" type=\"b\" access=\"read\"/>" \ - " <property name=\"CanStart\" type=\"b\" access=\"read\"/>" \ - " <property name=\"Job\" type=\"(uo)\" access=\"read\"/>" \ - " <property name=\"RecursiveStop\" type=\"b\" access=\"read\"/>" \ - " <property name=\"StopWhenUneeded\" type=\"b\" access=\"read\"/>" \ - " <property name=\"DefaultControlGroup\" type=\"s\" access=\"read\"/>" \ - " <property name=\"ControlGroups\" type=\"as\" access=\"read\"/>" \ - " </interface>" + " <interface name=\"org.freedesktop.systemd1.Unit\">\n" \ + " <method name=\"Start\">\n" \ + " <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n" \ + " <arg name=\"job\" type=\"o\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <method name=\"Stop\">\n" \ + " <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n" \ + " <arg name=\"job\" type=\"o\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <method name=\"Restart\">\n" \ + " <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n" \ + " <arg name=\"job\" type=\"o\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <method name=\"Reload\">\n" \ + " <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n" \ + " <arg name=\"job\" type=\"o\" direction=\"out\"/>\n" \ + " </method>\n" \ + " <signal name=\"Changed\"/>\n" \ + " <property name=\"Id\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"Names\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"Requires\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"RequiresOverridable\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"Requisite\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"RequisiteOverridable\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"Wants\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"RequiredBy\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"RequiredByOverridable\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"WantedBy\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"Conflicts\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"Before\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"After\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"Description\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"LoadState\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"ActiveState\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"SubState\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"FragmentPath\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"InactiveExitTimestamp\" type=\"t\" access=\"read\"/>\n" \ + " <property name=\"ActiveEnterTimestamp\" type=\"t\" access=\"read\"/>\n" \ + " <property name=\"ActiveExitTimestamp\" type=\"t\" access=\"read\"/>\n" \ + " <property name=\"InactiveEnterTimestamp\" type=\"t\" access=\"read\"/>\n" \ + " <property name=\"CanReload\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"CanStart\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"Job\" type=\"(uo)\" access=\"read\"/>\n" \ + " <property name=\"RecursiveStop\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"StopWhenUneeded\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"DefaultControlGroup\" type=\"s\" access=\"read\"/>\n" \ + " <property name=\"ControlGroups\" type=\"as\" access=\"read\"/>\n" \ + " </interface>\n" #define BUS_UNIT_PROPERTIES \ { "org.freedesktop.systemd1.Unit", "Id", bus_property_append_string, "s", u->meta.id }, \ @@ -125,4 +125,6 @@ void bus_unit_send_removed_signal(Unit *u); extern const DBusObjectPathVTable bus_unit_vtable; +extern const char bus_unit_interface[]; + #endif diff --git a/src/dbus.c b/src/dbus.c index 6ed659a239..5caf1eb191 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -32,6 +32,34 @@ #include "dbus-unit.h" #include "dbus-job.h" #include "dbus-manager.h" +#include "dbus-service.h" +#include "dbus-socket.h" +#include "dbus-target.h" +#include "dbus-device.h" +#include "dbus-mount.h" +#include "dbus-automount.h" +#include "dbus-snapshot.h" +#include "dbus-swap.h" + +static const char bus_properties_interface[] = BUS_PROPERTIES_INTERFACE; +static const char bus_introspectable_interface[] = BUS_INTROSPECTABLE_INTERFACE; + +const char *const bus_interface_table[] = { + "org.freedesktop.DBus.Properties", bus_properties_interface, + "org.freedesktop.DBus.Introspectable", bus_introspectable_interface, + "org.freedesktop.systemd1.Manager", bus_manager_interface, + "org.freedesktop.systemd1.Job", bus_job_interface, + "org.freedesktop.systemd1.Unit", bus_unit_interface, + "org.freedesktop.systemd1.Service", bus_service_interface, + "org.freedesktop.systemd1.Socket", bus_socket_interface, + "org.freedesktop.systemd1.Target", bus_target_interface, + "org.freedesktop.systemd1.Device", bus_device_interface, + "org.freedesktop.systemd1.Mount", bus_mount_interface, + "org.freedesktop.systemd1.Automount", bus_automount_interface, + "org.freedesktop.systemd1.Snapshot", bus_snapshot_interface, + "org.freedesktop.systemd1.Swap", bus_swap_interface, + NULL +}; static void api_bus_dispatch_status(DBusConnection *bus, DBusDispatchStatus status, void *data) { Manager *m = data; diff --git a/src/dbus.h b/src/dbus.h index 51b71eac61..3ad299ed38 100644 --- a/src/dbus.h +++ b/src/dbus.h @@ -37,24 +37,24 @@ typedef struct BusProperty { } BusProperty; #define BUS_PROPERTIES_INTERFACE \ - " <interface name=\"org.freedesktop.DBus.Properties\">" \ - " <method name=\"Get\">" \ - " <arg name=\"interface\" direction=\"in\" type=\"s\"/>" \ - " <arg name=\"property\" direction=\"in\" type=\"s\"/>" \ - " <arg name=\"value\" direction=\"out\" type=\"v\"/>" \ - " </method>" \ - " <method name=\"GetAll\">" \ - " <arg name=\"interface\" direction=\"in\" type=\"s\"/>" \ - " <arg name=\"properties\" direction=\"out\" type=\"a{sv}\"/>" \ - " </method>" \ - " </interface>" + " <interface name=\"org.freedesktop.DBus.Properties\">\n" \ + " <method name=\"Get\">\n" \ + " <arg name=\"interface\" direction=\"in\" type=\"s\"/>\n" \ + " <arg name=\"property\" direction=\"in\" type=\"s\"/>\n" \ + " <arg name=\"value\" direction=\"out\" type=\"v\"/>\n" \ + " </method>\n" \ + " <method name=\"GetAll\">\n" \ + " <arg name=\"interface\" direction=\"in\" type=\"s\"/>\n" \ + " <arg name=\"properties\" direction=\"out\" type=\"a{sv}\"/>\n" \ + " </method>\n" \ + " </interface>\n" #define BUS_INTROSPECTABLE_INTERFACE \ - " <interface name=\"org.freedesktop.DBus.Introspectable\">" \ - " <method name=\"Introspect\">" \ - " <arg name=\"data\" type=\"s\" direction=\"out\"/>" \ - " </method>" \ - " </interface>" + " <interface name=\"org.freedesktop.DBus.Introspectable\">\n" \ + " <method name=\"Introspect\">\n" \ + " <arg name=\"data\" type=\"s\" direction=\"out\"/>\n" \ + " </method>\n" \ + " </interface>\n" int bus_init_system(Manager *m); int bus_init_api(Manager *m); @@ -104,4 +104,6 @@ int bus_property_append_uint64(Manager *m, DBusMessageIter *i, const char *prope int bus_parse_strv(DBusMessage *m, char ***_l); +extern const char * const bus_interface_table[]; + #endif diff --git a/src/main.c b/src/main.c index 3b9719fb56..d7d3995e1b 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,8 @@ static enum { ACTION_RUN, ACTION_HELP, ACTION_TEST, - ACTION_DUMP_CONFIGURATION_ITEMS + ACTION_DUMP_CONFIGURATION_ITEMS, + ACTION_DONE } action = ACTION_RUN; static char *default_unit = NULL; @@ -347,7 +348,8 @@ static int parse_argv(int argc, char *argv[]) { ARG_TEST, ARG_DUMP_CONFIGURATION_ITEMS, ARG_CONFIRM_SPAWN, - ARG_DESERIALIZE + ARG_DESERIALIZE, + ARG_INTROSPECT }; static const struct option options[] = { @@ -360,6 +362,7 @@ static int parse_argv(int argc, char *argv[]) { { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS }, { "confirm-spawn", no_argument, NULL, ARG_CONFIRM_SPAWN }, { "deserialize", required_argument, NULL, ARG_DESERIALIZE }, + { "introspect", optional_argument, NULL, ARG_INTROSPECT }, { NULL, 0, NULL, 0 } }; @@ -444,6 +447,27 @@ static int parse_argv(int argc, char *argv[]) { break; } + case ARG_INTROSPECT: { + const char * const * i = NULL; + + for (i = bus_interface_table; *i; i += 2) + if (!optarg || streq(i[0], optarg)) { + fputs(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE + "<node>\n", stdout); + fputs(i[1], stdout); + fputs("</node>\n", stdout); + + if (optarg) + break; + } + + if (!i[0] && optarg) + log_error("Unknown interface %s.", optarg); + + action = ACTION_DONE; + break; + } + case 'h': action = ACTION_HELP; break; @@ -478,7 +502,8 @@ static int help(void) { " --running-as=AS Set running as (init, system, session)\n" " --test Determine startup sequence, dump it and exit\n" " --dump-configuration-items Dump understood unit configuration items\n" - " --confirm-spawn Ask for confirmation when spawning processes\n", + " --confirm-spawn Ask for confirmation when spawning processes\n" + " --introspect[=INTERFACE] Extract D-Bus interface data\n", __progname); return 0; @@ -582,6 +607,9 @@ int main(int argc, char *argv[]) { unit_dump_config_items(stdout); retval = 0; goto finish; + } else if (action == ACTION_DONE) { + retval = 0; + goto finish; } assert_se(action == ACTION_RUN || action == ACTION_TEST); |