aboutsummaryrefslogtreecommitdiffstats
path: root/src/dbusbind.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbusbind.c')
-rw-r--r--src/dbusbind.c249
1 files changed, 211 insertions, 38 deletions
diff --git a/src/dbusbind.c b/src/dbusbind.c
index 683b7cb583b..7e5104026cd 100644
--- a/src/dbusbind.c
+++ b/src/dbusbind.c
@@ -1,5 +1,5 @@
1/* Elisp bindings for D-Bus. 1/* Elisp bindings for D-Bus.
2 Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc. 2 Copyright (C) 2007-2011 Free Software Foundation, Inc.
3 3
4This file is part of GNU Emacs. 4This file is part of GNU Emacs.
5 5
@@ -38,6 +38,7 @@ Lisp_Object Qdbus_call_method_asynchronously;
38Lisp_Object Qdbus_method_return_internal; 38Lisp_Object Qdbus_method_return_internal;
39Lisp_Object Qdbus_method_error_internal; 39Lisp_Object Qdbus_method_error_internal;
40Lisp_Object Qdbus_send_signal; 40Lisp_Object Qdbus_send_signal;
41Lisp_Object Qdbus_register_service;
41Lisp_Object Qdbus_register_signal; 42Lisp_Object Qdbus_register_signal;
42Lisp_Object Qdbus_register_method; 43Lisp_Object Qdbus_register_method;
43 44
@@ -50,6 +51,17 @@ Lisp_Object QCdbus_system_bus, QCdbus_session_bus;
50/* Lisp symbol for method call timeout. */ 51/* Lisp symbol for method call timeout. */
51Lisp_Object QCdbus_timeout; 52Lisp_Object QCdbus_timeout;
52 53
54/* Lisp symbols for name request flags. */
55Lisp_Object QCdbus_request_name_allow_replacement;
56Lisp_Object QCdbus_request_name_replace_existing;
57Lisp_Object QCdbus_request_name_do_not_queue;
58
59/* Lisp symbols for name request replies. */
60Lisp_Object QCdbus_request_name_reply_primary_owner;
61Lisp_Object QCdbus_request_name_reply_in_queue;
62Lisp_Object QCdbus_request_name_reply_exists;
63Lisp_Object QCdbus_request_name_reply_already_owner;
64
53/* Lisp symbols of D-Bus types. */ 65/* Lisp symbols of D-Bus types. */
54Lisp_Object QCdbus_type_byte, QCdbus_type_boolean; 66Lisp_Object QCdbus_type_byte, QCdbus_type_boolean;
55Lisp_Object QCdbus_type_int16, QCdbus_type_uint16; 67Lisp_Object QCdbus_type_int16, QCdbus_type_uint16;
@@ -57,18 +69,12 @@ Lisp_Object QCdbus_type_int32, QCdbus_type_uint32;
57Lisp_Object QCdbus_type_int64, QCdbus_type_uint64; 69Lisp_Object QCdbus_type_int64, QCdbus_type_uint64;
58Lisp_Object QCdbus_type_double, QCdbus_type_string; 70Lisp_Object QCdbus_type_double, QCdbus_type_string;
59Lisp_Object QCdbus_type_object_path, QCdbus_type_signature; 71Lisp_Object QCdbus_type_object_path, QCdbus_type_signature;
72#ifdef DBUS_TYPE_UNIX_FD
73Lisp_Object QCdbus_type_unix_fd;
74#endif
60Lisp_Object QCdbus_type_array, QCdbus_type_variant; 75Lisp_Object QCdbus_type_array, QCdbus_type_variant;
61Lisp_Object QCdbus_type_struct, QCdbus_type_dict_entry; 76Lisp_Object QCdbus_type_struct, QCdbus_type_dict_entry;
62 77
63/* Registered buses. */
64Lisp_Object Vdbus_registered_buses;
65
66/* Hash table which keeps function definitions. */
67Lisp_Object Vdbus_registered_objects_table;
68
69/* Whether to debug D-Bus. */
70Lisp_Object Vdbus_debug;
71
72/* Whether we are reading a D-Bus event. */ 78/* Whether we are reading a D-Bus event. */
73int xd_in_read_queued_messages = 0; 79int xd_in_read_queued_messages = 0;
74 80
@@ -147,6 +153,22 @@ int xd_in_read_queued_messages = 0;
147#endif 153#endif
148 154
149/* Check whether TYPE is a basic DBusType. */ 155/* Check whether TYPE is a basic DBusType. */
156#ifdef DBUS_TYPE_UNIX_FD
157#define XD_BASIC_DBUS_TYPE(type) \
158 ((type == DBUS_TYPE_BYTE) \
159 || (type == DBUS_TYPE_BOOLEAN) \
160 || (type == DBUS_TYPE_INT16) \
161 || (type == DBUS_TYPE_UINT16) \
162 || (type == DBUS_TYPE_INT32) \
163 || (type == DBUS_TYPE_UINT32) \
164 || (type == DBUS_TYPE_INT64) \
165 || (type == DBUS_TYPE_UINT64) \
166 || (type == DBUS_TYPE_DOUBLE) \
167 || (type == DBUS_TYPE_STRING) \
168 || (type == DBUS_TYPE_OBJECT_PATH) \
169 || (type == DBUS_TYPE_SIGNATURE) \
170 || (type == DBUS_TYPE_UNIX_FD))
171#else
150#define XD_BASIC_DBUS_TYPE(type) \ 172#define XD_BASIC_DBUS_TYPE(type) \
151 ((type == DBUS_TYPE_BYTE) \ 173 ((type == DBUS_TYPE_BYTE) \
152 || (type == DBUS_TYPE_BOOLEAN) \ 174 || (type == DBUS_TYPE_BOOLEAN) \
@@ -160,6 +182,7 @@ int xd_in_read_queued_messages = 0;
160 || (type == DBUS_TYPE_STRING) \ 182 || (type == DBUS_TYPE_STRING) \
161 || (type == DBUS_TYPE_OBJECT_PATH) \ 183 || (type == DBUS_TYPE_OBJECT_PATH) \
162 || (type == DBUS_TYPE_SIGNATURE)) 184 || (type == DBUS_TYPE_SIGNATURE))
185#endif
163 186
164/* This was a macro. On Solaris 2.11 it was said to compile for 187/* This was a macro. On Solaris 2.11 it was said to compile for
165 hours, when optimzation is enabled. So we have transferred it into 188 hours, when optimzation is enabled. So we have transferred it into
@@ -182,6 +205,9 @@ xd_symbol_to_dbus_type (Lisp_Object object)
182 : (EQ (object, QCdbus_type_string)) ? DBUS_TYPE_STRING 205 : (EQ (object, QCdbus_type_string)) ? DBUS_TYPE_STRING
183 : (EQ (object, QCdbus_type_object_path)) ? DBUS_TYPE_OBJECT_PATH 206 : (EQ (object, QCdbus_type_object_path)) ? DBUS_TYPE_OBJECT_PATH
184 : (EQ (object, QCdbus_type_signature)) ? DBUS_TYPE_SIGNATURE 207 : (EQ (object, QCdbus_type_signature)) ? DBUS_TYPE_SIGNATURE
208#ifdef DBUS_TYPE_UNIX_FD
209 : (EQ (object, QCdbus_type_unix_fd)) ? DBUS_TYPE_UNIX_FD
210#endif
185 : (EQ (object, QCdbus_type_array)) ? DBUS_TYPE_ARRAY 211 : (EQ (object, QCdbus_type_array)) ? DBUS_TYPE_ARRAY
186 : (EQ (object, QCdbus_type_variant)) ? DBUS_TYPE_VARIANT 212 : (EQ (object, QCdbus_type_variant)) ? DBUS_TYPE_VARIANT
187 : (EQ (object, QCdbus_type_struct)) ? DBUS_TYPE_STRUCT 213 : (EQ (object, QCdbus_type_struct)) ? DBUS_TYPE_STRUCT
@@ -238,6 +264,9 @@ xd_signature (char *signature, unsigned int dtype, unsigned int parent_type, Lis
238 case DBUS_TYPE_UINT16: 264 case DBUS_TYPE_UINT16:
239 case DBUS_TYPE_UINT32: 265 case DBUS_TYPE_UINT32:
240 case DBUS_TYPE_UINT64: 266 case DBUS_TYPE_UINT64:
267#ifdef DBUS_TYPE_UNIX_FD
268 case DBUS_TYPE_UNIX_FD:
269#endif
241 CHECK_NATNUM (object); 270 CHECK_NATNUM (object);
242 sprintf (signature, "%c", dtype); 271 sprintf (signature, "%c", dtype);
243 break; 272 break;
@@ -451,6 +480,9 @@ xd_append_arg (unsigned int dtype, Lisp_Object object, DBusMessageIter *iter)
451 } 480 }
452 481
453 case DBUS_TYPE_UINT32: 482 case DBUS_TYPE_UINT32:
483#ifdef DBUS_TYPE_UNIX_FD
484 case DBUS_TYPE_UNIX_FD:
485#endif
454 CHECK_NUMBER (object); 486 CHECK_NUMBER (object);
455 { 487 {
456 dbus_uint32_t val = XUINT (object); 488 dbus_uint32_t val = XUINT (object);
@@ -648,6 +680,9 @@ xd_retrieve_arg (unsigned int dtype, DBusMessageIter *iter)
648 } 680 }
649 681
650 case DBUS_TYPE_UINT32: 682 case DBUS_TYPE_UINT32:
683#ifdef DBUS_TYPE_UNIX_FD
684 case DBUS_TYPE_UNIX_FD:
685#endif
651 { 686 {
652 dbus_uint32_t val; 687 dbus_uint32_t val;
653 dbus_message_iter_get_basic (iter, &val); 688 dbus_message_iter_get_basic (iter, &val);
@@ -983,6 +1018,7 @@ input arguments. It follows the mapping rules:
983 DBUS_TYPE_UINT16 => number 1018 DBUS_TYPE_UINT16 => number
984 DBUS_TYPE_INT16 => integer 1019 DBUS_TYPE_INT16 => integer
985 DBUS_TYPE_UINT32 => number or float 1020 DBUS_TYPE_UINT32 => number or float
1021 DBUS_TYPE_UNIX_FD => number or float
986 DBUS_TYPE_INT32 => integer or float 1022 DBUS_TYPE_INT32 => integer or float
987 DBUS_TYPE_UINT64 => number or float 1023 DBUS_TYPE_UINT64 => number or float
988 DBUS_TYPE_INT64 => integer or float 1024 DBUS_TYPE_INT64 => integer or float
@@ -1802,6 +1838,114 @@ xd_read_queued_messages (int fd, void *data, int for_read)
1802 xd_in_read_queued_messages = 0; 1838 xd_in_read_queued_messages = 0;
1803} 1839}
1804 1840
1841DEFUN ("dbus-register-service", Fdbus_register_service, Sdbus_register_service,
1842 2, MANY, 0,
1843 doc: /* Register known name SERVICE on the D-Bus BUS.
1844
1845BUS is either a Lisp symbol, `:system' or `:session', or a string
1846denoting the bus address.
1847
1848SERVICE is the D-Bus service name that should be registered. It must
1849be a known name.
1850
1851FLAGS are keywords, which control how the service name is registered.
1852The following keywords are recognized:
1853
1854`:allow-replacement': Allow another service to become the primary
1855owner if requested.
1856
1857`:replace-existing': Request to replace the current primary owner.
1858
1859`:do-not-queue': If we can not become the primary owner do not place
1860us in the queue.
1861
1862The function returns a keyword, indicating the result of the
1863operation. One of the following keywords is returned:
1864
1865`:primary-owner': Service has become the primary owner of the
1866requested name.
1867
1868`:in-queue': Service could not become the primary owner and has been
1869placed in the queue.
1870
1871`:exists': Service is already in the queue.
1872
1873`:already-owner': Service is already the primary owner.
1874
1875Example:
1876
1877\(dbus-register-service :session dbus-service-emacs)
1878
1879 => :primary-owner.
1880
1881\(dbus-register-service
1882 :session "org.freedesktop.TextEditor"
1883 dbus-service-allow-replacement dbus-service-replace-existing)
1884
1885 => :already-owner.
1886
1887usage: (dbus-register-service BUS SERVICE &rest FLAGS) */)
1888 (int nargs, register Lisp_Object *args)
1889{
1890 Lisp_Object bus, service;
1891 struct gcpro gcpro1, gcpro2;
1892 DBusConnection *connection;
1893 unsigned int i;
1894 unsigned int value;
1895 unsigned int flags = 0;
1896 int result;
1897 DBusError derror;
1898
1899 bus = args[0];
1900 service = args[1];
1901
1902 /* Check parameters. */
1903 CHECK_STRING (service);
1904
1905 /* Process flags. */
1906 for (i = 2; i < nargs; ++i) {
1907 value = ((EQ (args[i], QCdbus_request_name_replace_existing))
1908 ? DBUS_NAME_FLAG_REPLACE_EXISTING
1909 : (EQ (args[i], QCdbus_request_name_allow_replacement))
1910 ? DBUS_NAME_FLAG_ALLOW_REPLACEMENT
1911 : (EQ (args[i], QCdbus_request_name_do_not_queue))
1912 ? DBUS_NAME_FLAG_DO_NOT_QUEUE
1913 : -1);
1914 if (value == -1)
1915 XD_SIGNAL2 (build_string ("Unrecognized name request flag"), args[i]);
1916 flags |= value;
1917 }
1918
1919 /* Open a connection to the bus. */
1920 connection = xd_initialize (bus, TRUE);
1921
1922 /* Request the known name from the bus. */
1923 dbus_error_init (&derror);
1924 result = dbus_bus_request_name (connection, SDATA (service), flags,
1925 &derror);
1926 if (dbus_error_is_set (&derror))
1927 XD_ERROR (derror);
1928
1929 /* Cleanup. */
1930 dbus_error_free (&derror);
1931
1932 /* Return object. */
1933 switch (result)
1934 {
1935 case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
1936 return QCdbus_request_name_reply_primary_owner;
1937 case DBUS_REQUEST_NAME_REPLY_IN_QUEUE:
1938 return QCdbus_request_name_reply_in_queue;
1939 case DBUS_REQUEST_NAME_REPLY_EXISTS:
1940 return QCdbus_request_name_reply_exists;
1941 case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
1942 return QCdbus_request_name_reply_already_owner;
1943 default:
1944 /* This should not happen. */
1945 XD_SIGNAL2 (build_string ("Could not register service"), service);
1946 }
1947}
1948
1805DEFUN ("dbus-register-signal", Fdbus_register_signal, Sdbus_register_signal, 1949DEFUN ("dbus-register-signal", Fdbus_register_signal, Sdbus_register_signal,
1806 6, MANY, 0, 1950 6, MANY, 0,
1807 doc: /* Register for signal SIGNAL on the D-Bus BUS. 1951 doc: /* Register for signal SIGNAL on the D-Bus BUS.
@@ -1950,26 +2094,36 @@ usage: (dbus-register-signal BUS SERVICE PATH INTERFACE SIGNAL HANDLER &rest ARG
1950} 2094}
1951 2095
1952DEFUN ("dbus-register-method", Fdbus_register_method, Sdbus_register_method, 2096DEFUN ("dbus-register-method", Fdbus_register_method, Sdbus_register_method,
1953 6, 6, 0, 2097 6, 7, 0,
1954 doc: /* Register for method METHOD on the D-Bus BUS. 2098 doc: /* Register for method METHOD on the D-Bus BUS.
1955 2099
1956BUS is either a Lisp symbol, `:system' or `:session', or a string 2100BUS is either a Lisp symbol, `:system' or `:session', or a string
1957denoting the bus address. 2101denoting the bus address.
1958 2102
1959SERVICE is the D-Bus service name of the D-Bus object METHOD is 2103SERVICE is the D-Bus service name of the D-Bus object METHOD is
1960registered for. It must be a known name. 2104registered for. It must be a known name (See discussion of
1961 2105DONT-REGISTER-SERVICE below).
1962PATH is the D-Bus object path SERVICE is registered. INTERFACE is the 2106
1963interface offered by SERVICE. It must provide METHOD. HANDLER is a 2107PATH is the D-Bus object path SERVICE is registered (See discussion of
1964Lisp function to be called when a method call is received. It must 2108DONT-REGISTER-SERVICE below). INTERFACE is the interface offered by
1965accept the input arguments of METHOD. The return value of HANDLER is 2109SERVICE. It must provide METHOD. HANDLER is a Lisp function to be
1966used for composing the returning D-Bus message. */) 2110called when a method call is received. It must accept the input
1967 (Lisp_Object bus, Lisp_Object service, Lisp_Object path, Lisp_Object interface, Lisp_Object method, Lisp_Object handler) 2111arguments of METHOD. The return value of HANDLER is used for
2112composing the returning D-Bus message.
2113
2114When DONT-REGISTER-SERVICE is non-nil, the known name SERVICE is not
2115registered. This means that other D-Bus clients have no way of
2116noticing the newly registered method. When interfaces are constructed
2117incrementally by adding single methods or properties at a time,
2118DONT-REGISTER-SERVICE can be use to prevent other clients from
2119discovering the still incomplete interface.*/)
2120 (Lisp_Object bus, Lisp_Object service, Lisp_Object path,
2121 Lisp_Object interface, Lisp_Object method, Lisp_Object handler,
2122 Lisp_Object dont_register_service)
1968{ 2123{
1969 Lisp_Object key, key1, value; 2124 Lisp_Object key, key1, value;
1970 DBusConnection *connection;
1971 int result;
1972 DBusError derror; 2125 DBusError derror;
2126 Lisp_Object args[2] = { bus, service };
1973 2127
1974 /* Check parameters. */ 2128 /* Check parameters. */
1975 CHECK_STRING (service); 2129 CHECK_STRING (service);
@@ -1981,15 +2135,9 @@ used for composing the returning D-Bus message. */)
1981 /* TODO: We must check for a valid service name, otherwise there is 2135 /* TODO: We must check for a valid service name, otherwise there is
1982 a segmentation fault. */ 2136 a segmentation fault. */
1983 2137
1984 /* Open a connection to the bus. */ 2138 /* Request the name. */
1985 connection = xd_initialize (bus, TRUE); 2139 if (NILP (dont_register_service))
1986 2140 Fdbus_register_service (2, args);
1987 /* Request the known name from the bus. We can ignore the result,
1988 it is set to -1 if there is an error - kind of redundancy. */
1989 dbus_error_init (&derror);
1990 result = dbus_bus_request_name (connection, SDATA (service), 0, &derror);
1991 if (dbus_error_is_set (&derror))
1992 XD_ERROR (derror);
1993 2141
1994 /* Create a hash table entry. We use nil for the unique name, 2142 /* Create a hash table entry. We use nil for the unique name,
1995 because the method might be called from anybody. */ 2143 because the method might be called from anybody. */
@@ -2000,9 +2148,6 @@ used for composing the returning D-Bus message. */)
2000 if (NILP (Fmember (key1, value))) 2148 if (NILP (Fmember (key1, value)))
2001 Fputhash (key, Fcons (key1, value), Vdbus_registered_objects_table); 2149 Fputhash (key, Fcons (key1, value), Vdbus_registered_objects_table);
2002 2150
2003 /* Cleanup. */
2004 dbus_error_free (&derror);
2005
2006 /* Return object. */ 2151 /* Return object. */
2007 return list2 (key, list3 (service, path, handler)); 2152 return list2 (key, list3 (service, path, handler));
2008} 2153}
@@ -2044,6 +2189,10 @@ syms_of_dbusbind (void)
2044 staticpro (&Qdbus_send_signal); 2189 staticpro (&Qdbus_send_signal);
2045 defsubr (&Sdbus_send_signal); 2190 defsubr (&Sdbus_send_signal);
2046 2191
2192 Qdbus_register_service = intern_c_string ("dbus-register-service");
2193 staticpro (&Qdbus_register_service);
2194 defsubr (&Sdbus_register_service);
2195
2047 Qdbus_register_signal = intern_c_string ("dbus-register-signal"); 2196 Qdbus_register_signal = intern_c_string ("dbus-register-signal");
2048 staticpro (&Qdbus_register_signal); 2197 staticpro (&Qdbus_register_signal);
2049 defsubr (&Sdbus_register_signal); 2198 defsubr (&Sdbus_register_signal);
@@ -2065,6 +2214,27 @@ syms_of_dbusbind (void)
2065 QCdbus_session_bus = intern_c_string (":session"); 2214 QCdbus_session_bus = intern_c_string (":session");
2066 staticpro (&QCdbus_session_bus); 2215 staticpro (&QCdbus_session_bus);
2067 2216
2217 QCdbus_request_name_allow_replacement = intern_c_string (":allow-replacement");
2218 staticpro (&QCdbus_request_name_allow_replacement);
2219
2220 QCdbus_request_name_replace_existing = intern_c_string (":replace-existing");
2221 staticpro (&QCdbus_request_name_replace_existing);
2222
2223 QCdbus_request_name_do_not_queue = intern_c_string (":do-not-queue");
2224 staticpro (&QCdbus_request_name_do_not_queue);
2225
2226 QCdbus_request_name_reply_primary_owner = intern_c_string (":primary-owner");
2227 staticpro (&QCdbus_request_name_reply_primary_owner);
2228
2229 QCdbus_request_name_reply_exists = intern_c_string (":exists");
2230 staticpro (&QCdbus_request_name_reply_exists);
2231
2232 QCdbus_request_name_reply_in_queue = intern_c_string (":in-queue");
2233 staticpro (&QCdbus_request_name_reply_in_queue);
2234
2235 QCdbus_request_name_reply_already_owner = intern_c_string (":already-owner");
2236 staticpro (&QCdbus_request_name_reply_already_owner);
2237
2068 QCdbus_timeout = intern_c_string (":timeout"); 2238 QCdbus_timeout = intern_c_string (":timeout");
2069 staticpro (&QCdbus_timeout); 2239 staticpro (&QCdbus_timeout);
2070 2240
@@ -2104,6 +2274,11 @@ syms_of_dbusbind (void)
2104 QCdbus_type_signature = intern_c_string (":signature"); 2274 QCdbus_type_signature = intern_c_string (":signature");
2105 staticpro (&QCdbus_type_signature); 2275 staticpro (&QCdbus_type_signature);
2106 2276
2277#ifdef DBUS_TYPE_UNIX_FD
2278 QCdbus_type_unix_fd = intern_c_string (":unix-fd");
2279 staticpro (&QCdbus_type_unix_fd);
2280#endif
2281
2107 QCdbus_type_array = intern_c_string (":array"); 2282 QCdbus_type_array = intern_c_string (":array");
2108 staticpro (&QCdbus_type_array); 2283 staticpro (&QCdbus_type_array);
2109 2284
@@ -2117,12 +2292,12 @@ syms_of_dbusbind (void)
2117 staticpro (&QCdbus_type_dict_entry); 2292 staticpro (&QCdbus_type_dict_entry);
2118 2293
2119 DEFVAR_LISP ("dbus-registered-buses", 2294 DEFVAR_LISP ("dbus-registered-buses",
2120 &Vdbus_registered_buses, 2295 Vdbus_registered_buses,
2121 doc: /* List of D-Bus buses we are polling for messages. */); 2296 doc: /* List of D-Bus buses we are polling for messages. */);
2122 Vdbus_registered_buses = Qnil; 2297 Vdbus_registered_buses = Qnil;
2123 2298
2124 DEFVAR_LISP ("dbus-registered-objects-table", 2299 DEFVAR_LISP ("dbus-registered-objects-table",
2125 &Vdbus_registered_objects_table, 2300 Vdbus_registered_objects_table,
2126 doc: /* Hash table of registered functions for D-Bus. 2301 doc: /* Hash table of registered functions for D-Bus.
2127 2302
2128There are two different uses of the hash table: for accessing 2303There are two different uses of the hash table: for accessing
@@ -2159,7 +2334,7 @@ be called when the D-Bus reply message arrives. */);
2159 Vdbus_registered_objects_table = Fmake_hash_table (2, args); 2334 Vdbus_registered_objects_table = Fmake_hash_table (2, args);
2160 } 2335 }
2161 2336
2162 DEFVAR_LISP ("dbus-debug", &Vdbus_debug, 2337 DEFVAR_LISP ("dbus-debug", Vdbus_debug,
2163 doc: /* If non-nil, debug messages of D-Bus bindings are raised. */); 2338 doc: /* If non-nil, debug messages of D-Bus bindings are raised. */);
2164#ifdef DBUS_DEBUG 2339#ifdef DBUS_DEBUG
2165 Vdbus_debug = Qt; 2340 Vdbus_debug = Qt;
@@ -2176,5 +2351,3 @@ be called when the D-Bus reply message arrives. */);
2176 2351
2177#endif /* HAVE_DBUS */ 2352#endif /* HAVE_DBUS */
2178 2353
2179/* arch-tag: 0e828477-b571-4fe4-b559-5c9211bc14b8
2180 (do not change this comment) */