Commit e518bc71 authored by Michael Albinus's avatar Michael Albinus

* dbusbind.c (XD_DBUS_VALIDATE_BUS_ADDRESS): Canonicalize session

bus address.
(xd_close_bus, Fdbus_init_bus): Handle reference counter properly.
parent bcfbc9de
2012-07-27 Albinus Michael <michael.albinus@gmx.de>
* dbusbind.c (XD_DBUS_VALIDATE_BUS_ADDRESS): Canonicalize session
bus address.
(xd_close_bus, Fdbus_init_bus): Handle reference counter properly.
2012-07-27 Eli Zaretskii <eliz@gnu.org>
* alloc.c (listn): Fix the order the arguments are consed onto the
......
......@@ -261,6 +261,7 @@ xd_symbol_to_dbus_type (Lisp_Object object)
#define XD_DBUS_VALIDATE_BUS_ADDRESS(bus) \
do { \
char const *session_bus_address = getenv ("DBUS_SESSION_BUS_ADDRESS"); \
if (STRINGP (bus)) \
{ \
DBusAddressEntry **entries; \
......@@ -272,6 +273,10 @@ xd_symbol_to_dbus_type (Lisp_Object object)
/* Cleanup. */ \
dbus_error_free (&derror); \
dbus_address_entries_free (entries); \
/* Canonicalize session bus address. */ \
if (session_bus_address != NULL \
&& Fstring_equal (bus, build_string (session_bus_address))) \
bus = QCdbus_session_bus; \
} \
\
else \
......@@ -280,8 +285,7 @@ xd_symbol_to_dbus_type (Lisp_Object object)
if (!(EQ (bus, QCdbus_system_bus) || EQ (bus, QCdbus_session_bus))) \
XD_SIGNAL2 (build_string ("Wrong bus name"), bus); \
/* We do not want to have an autolaunch for the session bus. */ \
if (EQ (bus, QCdbus_session_bus) \
&& getenv ("DBUS_SESSION_BUS_ADDRESS") == NULL) \
if (EQ (bus, QCdbus_session_bus) && session_bus_address == NULL) \
XD_SIGNAL2 (build_string ("No connection to bus"), bus); \
} \
} while (0)
......@@ -1071,19 +1075,19 @@ xd_close_bus (Lisp_Object bus)
/* Retrieve bus address. */
connection = xd_get_connection_address (bus);
/* Close connection, if there isn't another shared application. */
if (xd_get_connection_references (connection) == 1)
{
/* Close connection, if there isn't another shared application. */
XD_DEBUG_MESSAGE ("Close connection to bus %s",
XD_OBJECT_TO_STRING (bus));
dbus_connection_close (connection);
}
/* Decrement reference count. */
dbus_connection_unref (connection);
xd_registered_buses = Fdelete (val, xd_registered_buses);
}
/* Remove bus from list of registered buses. */
xd_registered_buses = Fdelete (val, xd_registered_buses);
else
/* Decrement reference count. */
dbus_connection_unref (connection);
/* Return. */
return;
......@@ -1124,65 +1128,76 @@ this connection to those buses. */)
/* Close bus if it is already open. */
xd_close_bus (bus);
/* Initialize. */
dbus_error_init (&derror);
/* Open the connection. */
if (STRINGP (bus))
if (NILP (private))
connection = dbus_connection_open (SSDATA (bus), &derror);
else
connection = dbus_connection_open_private (SSDATA (bus), &derror);
/* Check, whether we are still connected. */
val = Fassoc (bus, xd_registered_buses);
if (!NILP (val))
{
connection = xd_get_connection_address (bus);
dbus_connection_ref (connection);
}
else
if (NILP (private))
connection = dbus_bus_get (EQ (bus, QCdbus_system_bus)
? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION,
&derror);
else
connection = dbus_bus_get_private (EQ (bus, QCdbus_system_bus)
? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION,
&derror);
if (dbus_error_is_set (&derror))
XD_ERROR (derror);
if (connection == NULL)
XD_SIGNAL2 (build_string ("No connection to bus"), bus);
{
/* Initialize. */
dbus_error_init (&derror);
/* If it is not the system or session bus, we must register
ourselves. Otherwise, we have called dbus_bus_get, which has
configured us to exit if the connection closes - we undo this
setting. */
if (STRINGP (bus))
dbus_bus_register (connection, &derror);
else
dbus_connection_set_exit_on_disconnect (connection, FALSE);
if (dbus_error_is_set (&derror))
XD_ERROR (derror);
/* Add the watch functions. We pass also the bus as data, in order
to distinguish between the buses in xd_remove_watch. */
if (!dbus_connection_set_watch_functions (connection,
xd_add_watch,
xd_remove_watch,
xd_toggle_watch,
SYMBOLP (bus)
? (void *) XSYMBOL (bus)
: (void *) XSTRING (bus),
NULL))
XD_SIGNAL1 (build_string ("Cannot add watch functions"));
/* Add bus to list of registered buses. */
XSETFASTINT (val, (intptr_t) connection);
xd_registered_buses = Fcons (Fcons (bus, val), xd_registered_buses);
/* We do not want to abort. */
putenv ((char *) "DBUS_FATAL_WARNINGS=0");
/* Open the connection. */
if (STRINGP (bus))
if (NILP (private))
connection = dbus_connection_open (SSDATA (bus), &derror);
else
connection = dbus_connection_open_private (SSDATA (bus), &derror);
/* Cleanup. */
dbus_error_free (&derror);
else
if (NILP (private))
connection = dbus_bus_get (EQ (bus, QCdbus_system_bus)
? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION,
&derror);
else
connection = dbus_bus_get_private (EQ (bus, QCdbus_system_bus)
? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION,
&derror);
if (dbus_error_is_set (&derror))
XD_ERROR (derror);
if (connection == NULL)
XD_SIGNAL2 (build_string ("No connection to bus"), bus);
/* If it is not the system or session bus, we must register
ourselves. Otherwise, we have called dbus_bus_get, which has
configured us to exit if the connection closes - we undo this
setting. */
if (STRINGP (bus))
dbus_bus_register (connection, &derror);
else
dbus_connection_set_exit_on_disconnect (connection, FALSE);
if (dbus_error_is_set (&derror))
XD_ERROR (derror);
/* Add the watch functions. We pass also the bus as data, in
order to distinguish between the buses in xd_remove_watch. */
if (!dbus_connection_set_watch_functions (connection,
xd_add_watch,
xd_remove_watch,
xd_toggle_watch,
SYMBOLP (bus)
? (void *) XSYMBOL (bus)
: (void *) XSTRING (bus),
NULL))
XD_SIGNAL1 (build_string ("Cannot add watch functions"));
/* Add bus to list of registered buses. */
XSETFASTINT (val, (intptr_t) connection);
xd_registered_buses = Fcons (Fcons (bus, val), xd_registered_buses);
/* We do not want to abort. */
putenv ((char *) "DBUS_FATAL_WARNINGS=0");
/* Cleanup. */
dbus_error_free (&derror);
}
/* Return reference counter. */
refcount = xd_get_connection_references (connection);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment