27 #include "dbus-protocol.h"
28 #include "dbus-internals.h"
29 #include "dbus-message.h"
30 #include "dbus-marshal-validate.h"
31 #include "dbus-misc.h"
32 #include "dbus-threads-internal.h"
33 #include "dbus-connection-internal.h"
34 #include "dbus-string.h"
82 unsigned int is_well_known : 1;
100 addresses_shutdown_func (
void *data)
107 if (bus_connections[i] !=
NULL)
108 _dbus_warn_check_failed (
"dbus_shutdown() called but connections were still live. This probably means the application did not drop all its references to bus connections.\n");
111 bus_connection_addresses[i] =
NULL;
121 get_from_env (
char **connection_p,
129 if (s ==
NULL || *s ==
'\0')
134 return *connection_p !=
NULL;
139 init_session_address (
void)
148 "DBUS_SESSION_BUS_ADDRESS");
164 if (supported && retval)
168 else if (supported && !retval)
173 _dbus_warn (
"Dynamic session lookup supported but failed silently\n");
196 init_connections_unlocked (
void)
206 bus_connections[i] =
NULL;
219 _dbus_verbose (
"Filling in system bus address...\n");
222 "DBUS_SYSTEM_BUS_ADDRESS"))
236 _dbus_verbose (
" used default system bus \"%s\"\n",
240 _dbus_verbose (
" used env var system bus \"%s\"\n",
245 _dbus_verbose (
"Filling in session bus address...\n");
247 if (!init_session_address ())
256 _dbus_verbose (
"Filling in activation bus address...\n");
259 "DBUS_STARTER_ADDRESS"))
262 _dbus_verbose (
" \"%s\"\n", bus_connection_addresses[DBUS_BUS_STARTER] ?
263 bus_connection_addresses[DBUS_BUS_STARTER] :
"none set");
273 _dbus_verbose (
"Bus activation type was set to \"%s\"\n", s);
275 if (strcmp (s,
"system") == 0)
277 else if (strcmp (s,
"session") == 0)
308 bus_data_free (
void *data)
318 "when we attached bus data");
329 bus_connections[i] =
NULL;
406 if (bus_connections[i] == connection)
408 bus_connections[i] =
NULL;
417 int timeout_milliseconds,
425 _dbus_return_val_if_fail (connection !=
NULL,
FALSE);
426 _dbus_return_val_if_error_is_set (error,
FALSE);
434 bd = ensure_bus_data (connection);
437 _DBUS_SET_OOM (error);
443 _dbus_verbose (
"Ignoring attempt to register the same DBusConnection %s with the message bus a second time.\n",
457 _DBUS_SET_OOM (error);
475 _DBUS_SET_OOM (error);
494 internal_open_and_register (
const char *address,
dbus_bool_t private,
int timeout_milliseconds,
DBusError *error)
508 if (!internal_register (connection, timeout_milliseconds, error))
531 #define OLD_SYSTEM_BUS_DEFAULT_ADDRESS "unix:path=/var/run/dbus/system_bus_socket"
532 #define INITIAL_TIMEOUT_MILLISECONDS 250
533 #define INCREMENT_TIMEOUT_MILLISECONDS 250
534 #define MAX_TIMEOUT_MILLISECONDS 10000
537 internal_open_and_register_with_fallback (
const char *address,
dbus_bool_t private,
DBusError *error)
540 int timeout_milliseconds;
542 for (timeout_milliseconds = INITIAL_TIMEOUT_MILLISECONDS;
543 connection ==
NULL && timeout_milliseconds < MAX_TIMEOUT_MILLISECONDS;
544 timeout_milliseconds += INCREMENT_TIMEOUT_MILLISECONDS)
546 connection = internal_open_and_register (address,
private, timeout_milliseconds,
NULL);
548 if (!connection && !strcmp (address, DBUS_SYSTEM_BUS_DEFAULT_ADDRESS))
549 connection = internal_open_and_register (OLD_SYSTEM_BUS_DEFAULT_ADDRESS,
private, timeout_milliseconds,
NULL);
556 connection = internal_open_and_register (address,
private, -1, error);
573 _dbus_return_val_if_error_is_set (error,
NULL);
579 _DBUS_SET_OOM (error);
584 if (!init_connections_unlocked ())
586 _DBUS_SET_OOM (error);
602 bus_connection_addresses[activation_bus_type] !=
NULL)
603 type = activation_bus_type;
605 if (!
private && bus_connections[type] !=
NULL)
607 connection = bus_connections[type];
612 address = bus_connection_addresses[address_type];
616 "Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)");
620 connection = internal_open_and_register_with_fallback (address,
private, error);
633 bus_connections[type] = connection;
645 bd = ensure_bus_data (connection);
653 if (connection ==
NULL)
654 _DBUS_ASSERT_ERROR_IS_SET (error);
697 return internal_bus_get (type,
FALSE, error);
729 return internal_bus_get (type,
TRUE, error);
790 _dbus_return_val_if_fail (connection !=
NULL,
FALSE);
791 _dbus_return_val_if_error_is_set (error,
FALSE);
799 _DBUS_SET_OOM (error);
804 bd = ensure_bus_data (connection);
807 _DBUS_SET_OOM (error);
813 _dbus_verbose (
"Ignoring attempt to register the same DBusConnection %s with the message bus a second time.\n",
827 _DBUS_SET_OOM (error);
845 _DBUS_SET_OOM (error);
861 _DBUS_ASSERT_ERROR_IS_SET (error);
903 const char *unique_name)
908 _dbus_return_val_if_fail (connection !=
NULL,
FALSE);
909 _dbus_return_val_if_fail (unique_name !=
NULL,
FALSE);
917 bd = ensure_bus_data (connection);
954 const char *unique_name =
NULL;
956 _dbus_return_val_if_fail (connection !=
NULL,
NULL);
965 bd = ensure_bus_data (connection);
1010 _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name),
DBUS_UID_UNSET);
1016 "GetConnectionUnixUser");
1018 if (message ==
NULL)
1020 _DBUS_SET_OOM (error);
1029 _DBUS_SET_OOM (error);
1040 _DBUS_ASSERT_ERROR_IS_SET (error);
1046 _DBUS_ASSERT_ERROR_IS_SET (error);
1055 _DBUS_ASSERT_ERROR_IS_SET (error);
1062 return (
unsigned long) uid;
1089 const char *v_STRING;
1091 _dbus_return_val_if_fail (connection !=
NULL,
NULL);
1092 _dbus_return_val_if_error_is_set (error,
NULL);
1099 if (message ==
NULL)
1101 _DBUS_SET_OOM (error);
1112 _DBUS_ASSERT_ERROR_IS_SET (error);
1118 _DBUS_ASSERT_ERROR_IS_SET (error);
1128 _DBUS_ASSERT_ERROR_IS_SET (error);
1138 _DBUS_SET_OOM (error);
1256 _dbus_return_val_if_fail (connection !=
NULL, 0);
1257 _dbus_return_val_if_fail (name !=
NULL, 0);
1258 _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name), 0);
1259 _dbus_return_val_if_error_is_set (error, 0);
1266 if (message ==
NULL)
1268 _DBUS_SET_OOM (error);
1278 _DBUS_SET_OOM (error);
1289 _DBUS_ASSERT_ERROR_IS_SET (error);
1295 _DBUS_ASSERT_ERROR_IS_SET (error);
1304 _DBUS_ASSERT_ERROR_IS_SET (error);
1341 _dbus_return_val_if_fail (connection !=
NULL, 0);
1342 _dbus_return_val_if_fail (name !=
NULL, 0);
1343 _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name), 0);
1344 _dbus_return_val_if_error_is_set (error, 0);
1351 if (message ==
NULL)
1353 _DBUS_SET_OOM (error);
1362 _DBUS_SET_OOM (error);
1373 _DBUS_ASSERT_ERROR_IS_SET (error);
1379 _DBUS_ASSERT_ERROR_IS_SET (error);
1388 _DBUS_ASSERT_ERROR_IS_SET (error);
1423 _dbus_return_val_if_fail (connection !=
NULL,
FALSE);
1424 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
1425 _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name),
FALSE);
1426 _dbus_return_val_if_error_is_set (error,
FALSE);
1432 if (message ==
NULL)
1434 _DBUS_SET_OOM (error);
1443 _DBUS_SET_OOM (error);
1452 _DBUS_ASSERT_ERROR_IS_SET (error);
1460 _DBUS_ASSERT_ERROR_IS_SET (error);
1501 _dbus_return_val_if_fail (connection !=
NULL,
FALSE);
1502 _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name),
FALSE);
1507 "StartServiceByName");
1513 _DBUS_SET_OOM (error);
1523 _DBUS_ASSERT_ERROR_IS_SET (error);
1529 _DBUS_ASSERT_ERROR_IS_SET (error);
1534 if (result !=
NULL &&
1538 _DBUS_ASSERT_ERROR_IS_SET (error);
1561 _DBUS_ASSERT_ERROR_IS_SET (error);
1668 _dbus_return_if_fail (rule !=
NULL);
1677 _DBUS_SET_OOM (error);
1685 _DBUS_SET_OOM (error);
1689 send_no_return_values (connection, msg, error);
1718 _dbus_return_if_fail (rule !=
NULL);
1729 _DBUS_SET_OOM (error);
1733 send_no_return_values (connection, msg, error);
unsigned int dbus_uint32_t
A 32-bit unsigned integer on all platforms.
const char * message
public error message field
#define NULL
A null pointer, defined appropriately for C or C++.
void dbus_message_set_no_reply(DBusMessage *message, dbus_bool_t no_reply)
Sets a flag indicating that the message does not want a reply; if this flag is set, the other end of the connection may (but is not required to) optimize by not sending method return or error replies.
void dbus_free(void *memory)
Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().
int dbus_bus_release_name(DBusConnection *connection, const char *name, DBusError *error)
Asks the bus to unassign the given name from this connection by invoking the ReleaseName method on th...
DBusConnection * dbus_connection_ref(DBusConnection *connection)
Increments the reference count of a DBusConnection.
#define DBUS_TYPE_STRING
Type code marking a UTF-8 encoded, nul-terminated Unicode string.
#define _dbus_assert(condition)
Aborts with an error message if the condition is false.
#define DBUS_INTERFACE_DBUS
The interface exported by the object with DBUS_SERVICE_DBUS and DBUS_PATH_DBUS.
#define DBUS_ERROR_INIT
Expands to a suitable initializer for a DBusError on the stack.
void _dbus_warn_check_failed(const char *format,...)
Prints a "critical" warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...
dbus_bool_t dbus_connection_set_data(DBusConnection *connection, dbus_int32_t slot, void *data, DBusFreeFunction free_data_func)
Stores a pointer on a DBusConnection, along with an optional function to be used for freeing the data...
#define N_BUS_TYPES
Number of bus types.
Implementation details of DBusConnection.
dbus_bool_t _dbus_string_init(DBusString *str)
Initializes a string.
Block of message-bus-related data we attach to each DBusConnection used with these convenience functi...
#define DBUS_UID_UNSET
an invalid UID used to represent an uninitialized dbus_uid_t field
void dbus_connection_free_data_slot(dbus_int32_t *slot_p)
Deallocates a global ID for connection data slots.
const char * _dbus_getenv(const char *varname)
Wrapper for getenv().
DBusMessage * dbus_connection_send_with_reply_and_block(DBusConnection *connection, DBusMessage *message, int timeout_milliseconds, DBusError *error)
Sends a message and blocks a certain time period while waiting for a reply.
DBusConnection * dbus_connection_open_private(const char *address, DBusError *error)
Opens a new, dedicated connection to a remote address.
Internals of DBusMessage.
int dbus_bus_request_name(DBusConnection *connection, const char *name, unsigned int flags, DBusError *error)
Asks the bus to assign the given name to this connection by invoking the RequestName method on the bu...
#define dbus_new0(type, count)
Safe macro for using dbus_malloc0().
DBusConnection * connection
Connection we're associated with.
dbus_uint32_t dbus_bool_t
A boolean, valid values are TRUE and FALSE.
void dbus_connection_set_exit_on_disconnect(DBusConnection *connection, dbus_bool_t exit_on_disconnect)
Set whether _exit() should be called when the connection receives a disconnect signal.
#define DBUS_PATH_DBUS
The object path used to talk to the bus itself.
dbus_bool_t dbus_connection_send(DBusConnection *connection, DBusMessage *message, dbus_uint32_t *serial)
Adds a message to the outgoing message queue.
DBusConnection * dbus_bus_get(DBusBusType type, DBusError *error)
Connects to a bus daemon and registers the client with it.
void * dbus_connection_get_data(DBusConnection *connection, dbus_int32_t slot)
Retrieves data previously set with dbus_connection_set_data().
dbus_bool_t dbus_bus_set_unique_name(DBusConnection *connection, const char *unique_name)
Sets the unique name of the connection, as assigned by the message bus.
void _dbus_warn(const char *format,...)
Prints a warning message to stderr.
char * unique_name
Unique name of this connection.
dbus_bool_t dbus_connection_allocate_data_slot(dbus_int32_t *slot_p)
Allocates an integer ID to be used for storing application-specific data on any DBusConnection.
void dbus_bus_remove_match(DBusConnection *connection, const char *rule, DBusError *error)
Removes a previously-added match rule "by value" (the most recently-added identical rule gets removed...
DBusConnection * dbus_connection_open(const char *address, DBusError *error)
Gets a connection to a remote address.
dbus_bool_t dbus_message_get_args(DBusMessage *message, DBusError *error, int first_arg_type,...)
Gets arguments from a message given a variable argument list.
Object representing an exception.
void _dbus_bus_notify_shared_connection_disconnected_unlocked(DBusConnection *connection)
Internal function that checks to see if this is a shared connection owned by the bus and if it is unr...
dbus_bool_t dbus_message_append_args(DBusMessage *message, int first_arg_type,...)
Appends fields to a message given a variable argument list.
void dbus_set_error(DBusError *error, const char *name, const char *format,...)
Assigns an error name and message to a DBusError.
#define DBUS_TYPE_UINT32
Type code marking a 32-bit unsigned integer.
DBusMessage * dbus_message_new_method_call(const char *destination, const char *path, const char *iface, const char *method)
Constructs a new message to invoke a method on a remote object.
#define _DBUS_UNLOCK(name)
Unlocks a global lock.
void _dbus_string_free(DBusString *str)
Frees a string created by _dbus_string_init().
#define TRUE
Expands to "1".
#define _dbus_assert_not_reached(explanation)
Aborts with an error message if called.
dbus_bool_t dbus_bus_register(DBusConnection *connection, DBusError *error)
Registers a connection with the bus.
#define DBUS_ERROR_FAILED
A generic error; "something went wrong" - see the error message for more.
dbus_bool_t dbus_set_error_from_message(DBusError *error, DBusMessage *message)
Sets a DBusError based on the contents of the given message.
dbus_bool_t dbus_bus_start_service_by_name(DBusConnection *connection, const char *name, dbus_uint32_t flags, dbus_uint32_t *result, DBusError *error)
Starts a service that will request ownership of the given name.
#define DBUS_TYPE_INVALID
Type code that is never equal to a legitimate type code.
unsigned long dbus_bus_get_unix_user(DBusConnection *connection, const char *name, DBusError *error)
Asks the bus to return the UID the named connection authenticated as, if any.
#define DBUS_TYPE_BOOLEAN
Type code marking a boolean.
unsigned int is_well_known
Is one of the well-known connections in our global array.
void _dbus_connection_close_possibly_shared(DBusConnection *connection)
Closes a shared OR private connection, while dbus_connection_close() can only be used on private conn...
The bus that started us, if any.
dbus_bool_t _dbus_lookup_session_address(dbus_bool_t *supported, DBusString *address, DBusError *error)
Determines the address of the session bus by querying a platform-specific method. ...
void dbus_bus_add_match(DBusConnection *connection, const char *rule, DBusError *error)
Adds a match rule to match messages going through the message bus.
#define FALSE
Expands to "0".
const char * dbus_bus_get_unique_name(DBusConnection *connection)
Gets the unique name of the connection as assigned by the message bus.
dbus_bool_t _dbus_register_shutdown_func(DBusShutdownFunction function, void *data)
Register a cleanup function to be called exactly once the next time dbus_shutdown() is called...
#define _DBUS_LOCK(name)
Locks a global lock, initializing it first if necessary.
char * dbus_bus_get_id(DBusConnection *connection, DBusError *error)
Asks the bus to return its globally unique ID, as described in the D-Bus specification.
dbus_bool_t _dbus_string_steal_data(DBusString *str, char **data_return)
Like _dbus_string_get_data(), but removes the gotten data from the original string.
void dbus_connection_unref(DBusConnection *connection)
Decrements the reference count of a DBusConnection, and finalizes it if the count reaches zero...
#define DBUS_SERVICE_DBUS
The bus name used to talk to the bus itself.
int dbus_int32_t
A 32-bit signed integer on all platforms.
char * _dbus_strdup(const char *str)
Duplicates a string.
DBusBusType
Well-known bus types.
DBusConnection * dbus_bus_get_private(DBusBusType type, DBusError *error)
Connects to a bus daemon and registers the client with it as with dbus_bus_register().
void dbus_message_unref(DBusMessage *message)
Decrements the reference count of a DBusMessage, freeing the message if the count reaches 0...
dbus_bool_t dbus_bus_name_has_owner(DBusConnection *connection, const char *name, DBusError *error)
Asks the bus whether a certain name has an owner.
dbus_bool_t dbus_error_is_set(const DBusError *error)
Checks whether an error occurred (the error is set).