'\" t .TH "SD_BUS_MESSAGE_NEW_METHOD_CALL" "3" "" "systemd 256.8" "sd_bus_message_new_method_call" .\" ----------------------------------------------------------------- .\" * 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_message_new_method_call, sd_bus_message_new_method_return \- Create a method call message .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ sd_bus_message_new_method_call('u .BI "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" ");" .HP \w'int\ sd_bus_message_new_method_return('u .BI "int sd_bus_message_new_method_return(sd_bus_message\ *" "call" ", sd_bus_message\ **" "m" ");" .SH "DESCRIPTION" .PP The \fBsd_bus_message_new_method_call()\fR function creates a new bus message object that encapsulates a D\-Bus method call, and returns it in the \fIm\fR output parameter\&. The call will be made on the destination \fIdestination\fR, path \fIpath\fR, on the interface \fIinterface\fR, member \fImember\fR\&. .PP Briefly, the \fIdestination\fR is a dot\-separated name that identifies a service connected to the bus\&. The \fIpath\fR 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 \fIinterface\fR 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 \fImembers\fR and are identified by a simple name composed of ASCII letters, numbers, and underscores\&. See the \m[blue]\fBD\-Bus Tutorial\fR\m[]\&\s-2\u[1]\d\s+2 for an in\-depth explanation\&. .PP The \fIdestination\fR parameter may be \fBNULL\fR\&. The \fIinterface\fR parameter may be \fBNULL\fR, if the destination has only a single member with the given name and there is no ambiguity if the interface name is omitted\&. .PP Note that this is a low level interface\&. See \fBsd_bus_call_method\fR(3) for a more convenient way of calling D\-Bus methods\&. .PP The \fBsd_bus_message_new_method_return()\fR function creates a new bus message object that is a reply to the method call \fIcall\fR and returns it in the \fIm\fR output parameter\&. The \fIcall\fR parameter must be a method call message\&. The sender of \fIcall\fR is used as the destination\&. .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 Returned errors may indicate the following problems: .PP \fB\-EINVAL\fR .RS 4 The output parameter \fIm\fR is \fBNULL\fR\&. .sp The \fIdestination\fR parameter is non\-null and is not a valid D\-Bus service name ("org\&.somewhere\&.Something"), the \fIpath\fR parameter is not a valid D\-Bus path ("/an/object/path"), the \fIinterface\fR parameter is non\-null and is not a valid D\-Bus interface name ("an\&.interface\&.name"), or the \fImember\fR parameter is not a valid D\-Bus member ("Name")\&. .sp The \fIcall\fR parameter is not a method call object\&. .RE .PP \fB\-ENOTCONN\fR .RS 4 The bus parameter \fIbus\fR is \fBNULL\fR or the bus is not connected\&. .RE .PP \fB\-ENOMEM\fR .RS 4 Memory allocation failed\&. .RE .PP \fB\-EPERM\fR .RS 4 The \fIcall\fR parameter is not sealed\&. .RE .PP \fB\-EOPNOTSUPP\fR .RS 4 The \fIcall\fR message does not have a cookie\&. .RE .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\&.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) { fprintf(stderr, "%s: %s\en", message, strerror(\-error)); 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, *m = NULL; int r; r = sd_bus_open_system(&bus); if (r < 0) return log_error(r, "Failed to acquire bus"); 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, 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, 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\&. .SH "HISTORY" .PP \fBsd_bus_message_new_method_call()\fR and \fBsd_bus_message_new_method_return()\fR were added in version 246\&. .SH "SEE ALSO" .PP \fBsystemd\fR(1), \fBsd-bus\fR(3), \fBsd_bus_call\fR(3), \fBsd_bus_call_method\fR(3), \fBsd_bus_path_encode\fR(3) .SH "NOTES" .IP " 1." 4 D-Bus Tutorial .RS 4 \%https://dbus.freedesktop.org/doc/dbus-tutorial.html#concepts .RE