From 7ce7502e1ae23766ba40105327de787c2d1cef9d Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Fri, 25 Feb 2005 22:03:30 +0000 Subject: 2005-02-25 Havoc Pennington * doc/dbus-specification.xml: document the GUID thing * dbus/dbus-server.c (_dbus_server_init_base): initialize a globally unique ID for the server, and put a "guid=hexencoded" field in the address * dbus/dbus-bus.c: fix missing #include of dbus-threads-internal.h * dbus/dbus-message.c: ditto * dbus/dbus-dataslot.c: ditto * dbus/dbus-list.c: ditto * dbus/dbus-internals.h: wait, just include dbus-threads-internal.h here * dbus/dbus-string.c (_dbus_string_copy_to_buffer): move back for use in main library * dbus/dbus-sysdeps.c (_dbus_generate_random_bytes_buffer): new function --- dbus/dbus-server.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 5 deletions(-) (limited to 'dbus/dbus-server.c') diff --git a/dbus/dbus-server.c b/dbus/dbus-server.c index 156d5ccd..20fb5f3c 100644 --- a/dbus/dbus-server.c +++ b/dbus/dbus-server.c @@ -52,6 +52,58 @@ * @{ */ +static void +init_guid (DBusGUID *guid) +{ + long now; + char *p; + int ts_size; + + _dbus_get_current_time (&now, NULL); + + guid->as_uint32s[0] = now; + + ts_size = sizeof (guid->as_uint32s[0]); + p = ((char*)guid->as_bytes) + ts_size; + + _dbus_generate_random_bytes_buffer (p, + sizeof (guid->as_bytes) - ts_size); +} + +/* this is a little fragile since it assumes the address doesn't + * already have a guid, but it shouldn't + */ +static char* +copy_address_with_guid_appended (const DBusString *address, + const DBusGUID *guid) +{ + DBusString with_guid; + DBusString guid_str; + char *retval; + + if (!_dbus_string_init (&with_guid)) + return NULL; + + _dbus_string_init_const_len (&guid_str, guid->as_bytes, + sizeof (guid->as_bytes)); + + if (!_dbus_string_copy (address, 0, &with_guid, 0) || + !_dbus_string_append (&with_guid, ",guid=") || + !_dbus_string_hex_encode (&guid_str, 0, + &with_guid, _dbus_string_get_length (&with_guid))) + { + _dbus_string_free (&with_guid); + return NULL; + } + + retval = NULL; + _dbus_string_copy_data (&with_guid, &retval); + + _dbus_string_free (&with_guid); + + return retval; /* may be NULL if copy failed */ +} + /** * Initializes the members of the DBusServer base class. * Chained up to by subclass constructors. @@ -65,17 +117,21 @@ dbus_bool_t _dbus_server_init_base (DBusServer *server, const DBusServerVTable *vtable, const DBusString *address) -{ +{ server->vtable = vtable; server->refcount.value = 1; server->address = NULL; server->watches = NULL; server->timeouts = NULL; - - if (!_dbus_string_copy_data (address, &server->address)) - goto failed; + init_guid (&server->guid); + + server->address = copy_address_with_guid_appended (address, + &server->guid); + if (server->address == NULL) + goto failed; + server->mutex = _dbus_mutex_new (); if (server->mutex == NULL) goto failed; @@ -438,7 +494,9 @@ dbus_server_listen (const char *address, for (i = 0; i < len; i++) { - const char *method = dbus_address_entry_get_method (entries[i]); + const char *method; + + method = dbus_address_entry_get_method (entries[i]); if (strcmp (method, "unix") == 0) { -- cgit