'\" t .TH "SD_BUS_CALL_METHOD" "3" "" "systemd 255" "sd_bus_call_method" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" sd_bus_call_method, sd_bus_call_methodv, sd_bus_call_method_async, sd_bus_call_method_asyncv \- Initialize a bus message object and invoke the corresponding D\-Bus method call .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'typedef\ int\ (*sd_bus_message_handler_t)('u .BI "typedef int (*sd_bus_message_handler_t)(sd_bus_message\ *" "m" ", void\ *" "userdata" ", sd_bus_error\ *" "ret_error" ");" .HP \w'int\ sd_bus_call_method('u .BI "int sd_bus_call_method(sd_bus\ *" "bus" ", const\ char\ *" "destination" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "member" ", sd_bus_error\ *" "ret_error" ", sd_bus_message\ **" "reply" ", const\ char\ *" "types" ", \&.\&.\&.);" .HP \w'int\ sd_bus_call_methodv('u .BI "int sd_bus_call_methodv(sd_bus\ *" "bus" ", const\ char\ *" "destination" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "member" ", sd_bus_error\ *" "ret_error" ", sd_bus_message\ **" "reply" ", const\ char\ *" "types" ", va_list\ " "ap" ");" .HP \w'int\ sd_bus_call_method_async('u .BI "int sd_bus_call_method_async(sd_bus\ *" "bus" ", sd_bus_slot\ **" "slot" ", const\ char\ *" "destination" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "member" ", sd_bus_message_handler_t\ " "callback" ", void\ *" "userdata" ", const\ char\ *" "types" ", \&.\&.\&.);" .HP \w'int\ sd_bus_call_method_asyncv('u .BI "int sd_bus_call_method_asyncv(sd_bus\ *" "bus" ", sd_bus_slot\ **" "slot" ", const\ char\ *" "destination" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "member" ", sd_bus_message_handler_t\ " "callback" ", void\ *" "userdata" ", const\ char\ *" "types" ", va_list\ " "ap" ");" .SH "DESCRIPTION" .PP \fBsd_bus_call_method()\fR is a convenience function for initializing a bus message object and calling the corresponding D\-Bus method\&. It combines the \fBsd_bus_message_new_method_call\fR(3), \fBsd_bus_message_append\fR(3) and \fBsd_bus_call\fR(3) functions into a single function call\&. .PP \fBsd_bus_call_method_async()\fR is a convenience function for initializing a bus message object and calling the corresponding D\-Bus method asynchronously\&. It combines the \fBsd_bus_message_new_method_call\fR(3), \fBsd_bus_message_append\fR(3) and \fBsd_bus_call_async\fR(3) functions into a single function call\&. .SH "RETURN VALUE" .PP On success, these functions return a non\-negative integer\&. On failure, they return a negative errno\-style error code\&. .SS "Errors" .PP See the man pages of \fBsd_bus_message_new_method_call\fR(3), \fBsd_bus_message_append\fR(3), \fBsd_bus_call\fR(3) and \fBsd_bus_call_async\fR(3) for a list of possible errors\&. .SH "NOTES" .PP Functions described here are available as a shared library, which can be compiled against and linked to with the \fBlibsystemd\fR\ \&\fBpkg-config\fR(1) file\&. .PP The code described here uses \fBgetenv\fR(3), which is declared to be not multi\-thread\-safe\&. This means that the code calling the functions described here must not call \fBsetenv\fR(3) from a parallel thread\&. It is recommended to only do calls to \fBsetenv()\fR from an early phase of the program when no other threads have been started\&. .SH "EXAMPLES" .PP \fBExample\ \&1.\ \&Make a call to a D\-Bus method that takes a single parameter\fR .sp .if n \{\ .RS 4 .\} .nf /* SPDX\-License\-Identifier: MIT\-0 */ /* This is equivalent to: * busctl call org\&.freedesktop\&.systemd1 /org/freedesktop/systemd1 \e * org\&.freedesktop\&.systemd1\&.Manager GetUnitByPID $$ * * Compile with \*(Aqcc print\-unit\-path\-call\-method\&.c \-lsystemd\*(Aq */ #include #include #include #include #include #define _cleanup_(f) __attribute__((cleanup(f))) #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) { errno = \-error; fprintf(stderr, "%s: %m\en", message); return error; } int main(int argc, char **argv) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = 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_open_system(&bus); if (r < 0) return log_error(r, "Failed to acquire bus"); r = sd_bus_call_method(bus, DESTINATION, PATH, INTERFACE, MEMBER, &error, &reply, "u", (unsigned) getpid()); if (r < 0) return log_error(r, MEMBER " 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 \e"%s\e"\&.\en", ans); return 0; } .fi .if n \{\ .RE .\} .PP This defines a minimally useful program that will open a connection to the bus, call a method, wait for the reply, and finally extract and print the answer\&. It does error handling and proper memory management\&. .SH "HISTORY" .PP \fBsd_bus_call_method()\fR, \fBsd_bus_call_methodv()\fR, \fBsd_bus_call_method_async()\fR, and \fBsd_bus_call_method_asyncv()\fR were added in version 246\&. .SH "SEE ALSO" .PP \fBsystemd\fR(1), \fBsd-bus\fR(3), \fBsd_bus_message_new_method_call\fR(3), \fBsd_bus_message_append\fR(3), \fBsd_bus_call\fR(3), \fBsd_bus_set_property\fR(3), \fBsd_bus_emit_signal\fR(3)