diff --git a/man/print-unit-path.c b/man/print-unit-path.c new file mode 100644 index 0000000000..23b58a26e2 --- /dev/null +++ b/man/print-unit-path.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include + +#include +#define _cleanup_(f) __attribute__((cleanup(f))) + +/* This is equivalent to: + * busctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 \ + * org.freedesktop.systemd1.Manager GetUnitByPID $$ + * + * Compile with 'cc -lsystemd print-unit-path.c' + */ + +#define DESTINATION "org.freedesktop.systemd1" +#define PATH "/org/freedesktop/systemd1" +#define INTERFACE "org.freedesktop.systemd1.Manager" +#define MEMBER "GetUnitByPID" + +static int log_error(int error, const char *message) { + fprintf(stderr, "%s: %s\n", message, strerror(-error)); + return error; +} + +static int print_unit_path(sd_bus *bus) { + _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; + _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; + _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; + int r; + + r = sd_bus_message_new_method_call(bus, &m, + DESTINATION, PATH, INTERFACE, MEMBER); + if (r < 0) + return log_error(r, "Failed to create bus message"); + + r = sd_bus_message_append(m, "u", (unsigned) getpid()); + if (r < 0) + return log_error(r, "Failed to append to bus message"); + + r = sd_bus_call(bus, m, -1, &error, &reply); + if (r < 0) + return log_error(r, "Call failed"); + + const char *ans; + r = sd_bus_message_read(reply, "o", &ans); + if (r < 0) + return log_error(r, "Failed to read reply"); + + printf("Unit path is \"%s\".\n", ans); + + return 0; +} + +int main(int argc, char **argv) { + _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; + int r; + + r = sd_bus_open_system(&bus); + if (r < 0) + return log_error(r, "Failed to acquire bus"); + + print_unit_path(bus); +} diff --git a/man/rules/meson.build b/man/rules/meson.build index df7ea47470..1c56e75fd4 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -210,6 +210,7 @@ manpages = [ '3', ['sd_bus_message_get_realtime_usec', 'sd_bus_message_get_seqnum'], ''], + ['sd_bus_message_new_method_call', '3', [], ''], ['sd_bus_message_new_method_error', '3', ['sd_bus_message_new_method_errno', diff --git a/man/sd-bus.xml b/man/sd-bus.xml index 6210f40dc2..5a3502601c 100644 --- a/man/sd-bus.xml +++ b/man/sd-bus.xml @@ -60,6 +60,7 @@ sd_bus_message_copy3, sd_bus_message_get_cookie3, sd_bus_message_get_monotonic_usec3, +sd_bus_message_new_method_call3, sd_bus_message_new_method_error3, sd_bus_message_new_signal3, sd_bus_message_read_basic3, diff --git a/man/sd_bus_message_new_method_call.xml b/man/sd_bus_message_new_method_call.xml new file mode 100644 index 0000000000..1226f1050c --- /dev/null +++ b/man/sd_bus_message_new_method_call.xml @@ -0,0 +1,134 @@ + + + + + + + + sd_bus_message_new_method_call + systemd + + + + sd_bus_message_new_method_call + 3 + + + + sd_bus_message_new_method_call + + Create a method call message + + + + + #include <systemd/sd-bus.h> + + + int sd_bus_message_new_method_call + sd_bus *bus + sd_bus_message **m + const char *destination + const char *path + const char *interface + const char *member + + + + + + Description + + The sd_bus_message_new_method_call() function creates a new bus + message object that encapsulates a D-Bus method call, and returns it in the + m output parameter. The call will be made on the destination + destination, path path, on the interface + interface, member member. + + Briefly, the destination is a dot-separated name that identifies a + service connected to the bus. The path is a slash-separated identifier of + an object within the destination that resembles a file system path. The meaning of this path is + defined by the destination. The interface is a dot-separated name that + resembles a Java interface name that identifies a group of methods and signals supported by the + object identified by path. Methods and signals are collectively called + members and are identified by a simple name composed of ASCII letters, + numbers, and underscores. See the D-Bus Tutorial for an + in-depth explanation. + + The destination parameter may be NULL. The + interface parameter may be NULL, if the destination + has only a single member with the given name and there is no ambiguity if the interface name is + omitted. + + + + Return Value + + This function returns 0 if the message object was successfully created, and a negative + errno-style error code otherwise. + + + + Errors + + Returned errors may indicate the following problems: + + + + -EINVAL + + The output parameter m is + NULL. + + The destination parameter is non-null and is not a valid D-Bus + service name (org.somewhere.Something), the path + parameter is not a valid D-Bus path (/an/object/path), the + interface parameter is non-null and is not a valid D-Bus interface + name (an.interface.name), or the member parameter + is not a valid D-Bus member (Name). + + + + -ENOTCONN + + The bus parameter bus is NULL or + the bus is not connected. + + + + -ENOMEM + + Memory allocation failed. + + + + + + + + Examples + + + Make a call to a D-Bus method that takes a single parameter + + + This defines a minimally useful program that will open a connection to the bus, create a + message object, send it, wait for the reply, and finally extract and print the answer. It does + error handling and proper memory management. + + + + + See Also + + + systemd1, + sd-bus3, + sd_bus_path_encode3 + + + + diff --git a/man/sd_bus_message_new_signal.xml b/man/sd_bus_message_new_signal.xml index 1c7629c149..c9ed0bc4a4 100644 --- a/man/sd_bus_message_new_signal.xml +++ b/man/sd_bus_message_new_signal.xml @@ -44,7 +44,11 @@ object that encapsulates a D-Bus signal, and returns it in the m output parameter. The signal will be sent to path path, on the interface interface, member member. When this message is - sent, no reply is expected. + sent, no reply is expected. See + sd_bus_message_new_call1 + for a short description of the meaning of the path, + interface, and member parameters. + diff --git a/man/sd_bus_path_encode.xml b/man/sd_bus_path_encode.xml index 55c7010e73..4c60a8fa3e 100644 --- a/man/sd_bus_path_encode.xml +++ b/man/sd_bus_path_encode.xml @@ -80,7 +80,7 @@ always be NUL-terminated. The returned string will be the concatenation of the bus path prefix plus an escaped version of the external identifier string. This operation may be - reversed with sd_bus_decode(). It is + reversed with sd_bus_path_decode(). It is recommended to only use external identifiers that generally require little escaping to be turned into valid bus path identifiers (for example, by sticking to a 7-bit ASCII character