Commit f6a67597 authored by Ralf Habacker's avatar Ralf Habacker
Browse files

Extended autolaunch protocol with scope attribute.

parent 63d3e3d9
......@@ -503,12 +503,6 @@ main (int argc, char **argv)
exit (1);
}
is_session_bus = bus_context_get_type(context) != NULL
&& strcmp(bus_context_get_type(context),"session") == 0;
if (is_session_bus)
_dbus_daemon_publish_session_bus_address (bus_context_get_address (context));
/* bus_context_new() closes the print_addr_pipe and
* print_pid_pipe
*/
......@@ -529,8 +523,5 @@ main (int argc, char **argv)
bus_context_unref (context);
bus_selinux_shutdown ();
if (is_session_bus)
_dbus_daemon_unpublish_session_bus_address ();
return 0;
}
......@@ -16,7 +16,7 @@
#cmakedefine DBUS_DAEMON_NAME "@DBUS_DAEMON_NAME@"
#cmakedefine DBUS_SYSTEM_BUS_DEFAULT_ADDRESS "@DBUS_SYSTEM_BUS_DEFAULT_ADDRESS@"
#cmakedefine DBUS_MACHINE_UUID_FILE "@DBUS_MACHINE_UUID_FILE@"
//#cmakedefine DBUS_SESSION_BUS_DEFAULT_ADDRESS "@DBUS_SESSION_BUS_DEFAULT_ADDRESS@"
#cmakedefine DBUS_SESSION_BUS_DEFAULT_ADDRESS "@DBUS_SESSION_BUS_DEFAULT_ADDRESS@"
#cmakedefine DBUS_DAEMONDIR "@DBUS_DAEMONDIR@"
#cmakedefine PACKAGE "@PACKAGE@"
/* Version number of package */
......
......@@ -50,6 +50,7 @@ struct DBusServerVTable
};
/**
* @ingroup DBusServerInternals
* Internals of DBusServer object
*/
struct DBusServer
......@@ -66,7 +67,8 @@ struct DBusServer
DBusTimeoutList *timeouts; /**< Our timeouts */
char *address; /**< Address this server is listening on. */
dbus_bool_t published_address; /**< flag which indicates that server has published its bus address. */
int max_connections; /**< Max number of connections allowed at once. */
DBusDataSlotList slot_list; /**< Data stored by allocated integer ID */
......
......@@ -251,6 +251,9 @@ socket_disconnect (DBusServer *server)
_dbus_delete_file (&tmp, NULL);
}
if (server->published_address)
_dbus_daemon_unpublish_session_bus_address();
HAVE_LOCK_CHECK (server);
}
......
......@@ -33,6 +33,8 @@ DBusServer* _dbus_server_new_for_socket (int *fds,
int n_fds,
const DBusString *address,
DBusNonceFile *noncefile);
DBusServer* _dbus_server_new_for_autolaunch (const DBusString *address,
DBusError *error);
DBusServer* _dbus_server_new_for_tcp_socket (const char *host,
const char *bind,
const char *port,
......
......@@ -83,11 +83,35 @@ _dbus_server_listen_platform_specific (DBusAddressEntry *entry,
return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
}
}
else if (strcmp (method, "autolaunch") == 0)
{
const char *host = "localhost";
const char *bind = "localhost";
const char *port = "0";
const char *family = "ipv4";
const char *scope = dbus_address_entry_get_value (entry, "scope");
*server_p = _dbus_server_new_for_tcp_socket (host, bind, port,
family, error, FALSE);
if (*server_p)
{
_DBUS_ASSERT_ERROR_IS_CLEAR(error);
/// @todo should we return an error when address could not be published ?
(*server_p)->published_address =
_dbus_daemon_publish_session_bus_address ((*server_p)->address, scope);
return DBUS_SERVER_LISTEN_OK;
}
else
{
_DBUS_ASSERT_ERROR_IS_SET(error);
return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
}
}
else
{
_DBUS_ASSERT_ERROR_IS_CLEAR(error);
return DBUS_SERVER_LISTEN_NOT_HANDLED;
}
_DBUS_ASSERT_ERROR_IS_CLEAR(error);
return DBUS_SERVER_LISTEN_NOT_HANDLED;
}
}
/** @} */
......
......@@ -104,6 +104,7 @@ _dbus_server_init_base (DBusServer *server,
server->address = NULL;
server->watches = NULL;
server->timeouts = NULL;
server->published_address = FALSE;
if (!_dbus_string_init (&server->guid_hex))
return FALSE;
......
......@@ -37,6 +37,7 @@
#endif
#include "dbus-internals.h"
#include "dbus-sha.h"
#include "dbus-sysdeps.h"
#include "dbus-threads.h"
#include "dbus-protocol.h"
......@@ -2536,35 +2537,139 @@ static const char *cDBusAutolaunchMutex = "DBusAutolaunchMutex";
// mutex to determine if dbus-daemon is already started (per user)
static const char *cDBusDaemonMutex = "DBusDaemonMutex";
// named shm for dbus adress info (per user)
#ifdef _DEBUG
static const char *cDBusDaemonAddressInfo = "DBusDaemonAddressInfoDebug";
#else
static const char *cDBusDaemonAddressInfo = "DBusDaemonAddressInfo";
#endif
dbus_bool_t
_dbus_get_install_root(char *prefix, int len);
void
_dbus_daemon_publish_session_bus_address (const char* address)
static dbus_bool_t
_dbus_get_install_root_as_hash(DBusString *out)
{
DBusString install_path;
char path[MAX_PATH*2];
int path_size = sizeof(path);
if (!_dbus_get_install_root(path,path_size))
return FALSE;
_dbus_string_init(&install_path);
_dbus_string_append(&install_path,path);
_dbus_string_init(out);
_dbus_string_tolower_ascii(&install_path,0,_dbus_string_get_length(&install_path));
if (!_dbus_sha_compute (&install_path, out))
return FALSE;
return TRUE;
}
static dbus_bool_t
_dbus_get_shm_address(DBusString *out,const char *scope)
{
_dbus_string_init(out);
_dbus_string_append(out,cDBusDaemonAddressInfo);
if (strcmp(scope,"install-path") == 0)
{
DBusString temp;
if (!_dbus_get_install_root_as_hash(&temp))
{
_dbus_string_free(out);
return FALSE;
}
_dbus_string_append(out,"-");
_dbus_string_append(out,_dbus_string_get_const_data(&temp));
_dbus_string_free(&temp);
return TRUE;
}
else if (strlen(scope) > 0)
{
_dbus_string_append(out,"-");
_dbus_string_append(out,scope);
return TRUE;
}
else
{
return TRUE;
}
}
static dbus_bool_t
_dbus_get_mutex_name(DBusString *out,const char *scope)
{
_dbus_string_init(out);
_dbus_string_append(out,cDBusDaemonMutex);
if (strcmp(scope,"install-path") == 0)
{
DBusString temp;
if (!_dbus_get_install_root_as_hash(&temp))
{
_dbus_string_free(out);
return FALSE;
}
_dbus_string_append(out,"-");
_dbus_string_append(out,_dbus_string_get_const_data(&temp));
_dbus_string_free(&temp);
return TRUE;
}
else if (strlen(scope) > 0)
{
_dbus_string_append(out,"-");
_dbus_string_append(out,scope);
return TRUE;
}
else
{
return TRUE;
}
}
dbus_bool_t
_dbus_daemon_publish_session_bus_address (const char* address, const char *scope)
{
HANDLE lock;
char *shared_addr = NULL;
DWORD ret;
char addressInfo[1024];
DBusString shm_address;
DBusString mutex_address;
_dbus_assert (address);
if (!_dbus_get_mutex_name(&mutex_address,scope))
{
_dbus_string_free( &mutex_address );
return FALSE;
}
// before _dbus_global_lock to keep correct lock/release order
hDBusDaemonMutex = CreateMutexA( NULL, FALSE, cDBusDaemonMutex );
hDBusDaemonMutex = CreateMutexA( NULL, FALSE, _dbus_string_get_const_data(&mutex_address) );
ret = WaitForSingleObject( hDBusDaemonMutex, 1000 );
if ( ret != WAIT_OBJECT_0 ) {
_dbus_warn("Could not lock mutex %s (return code %ld). daemon already running? Bus address not published.\n", cDBusDaemonMutex, ret );
return;
_dbus_warn("Could not lock mutex %s (return code %d). daemon already running? Bus address not published.\n", _dbus_string_get_const_data(&mutex_address), ret );
return FALSE;
}
if (!_dbus_get_shm_address(&shm_address,scope))
{
_dbus_string_free( &mutex_address );
_dbus_string_free( &shm_address );
return FALSE;
}
// sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address and _dbus_daemon_already_runs
lock = _dbus_global_lock( cUniqueDBusInitMutex );
// create shm
hDBusSharedMem = CreateFileMappingA( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
0, strlen( address ) + 1, cDBusDaemonAddressInfo );
0, strlen( address ) + 1, _dbus_string_get_const_data(&shm_address) );
_dbus_assert( hDBusSharedMem );
shared_addr = MapViewOfFile( hDBusSharedMem, FILE_MAP_WRITE, 0, 0, 0 );
......@@ -2577,6 +2682,9 @@ _dbus_daemon_publish_session_bus_address (const char* address)
UnmapViewOfFile( shared_addr );
_dbus_global_unlock( lock );
_dbus_string_free( &shm_address );
_dbus_string_free( &mutex_address );
return TRUE;
}
void
......@@ -2601,7 +2709,7 @@ _dbus_daemon_unpublish_session_bus_address (void)
}
static dbus_bool_t
_dbus_get_autolaunch_shm (DBusString *address)
_dbus_get_autolaunch_shm (DBusString *address, DBusString *shm_address)
{
HANDLE sharedMem;
char *shared_addr;
......@@ -2610,7 +2718,7 @@ _dbus_get_autolaunch_shm (DBusString *address)
// read shm
for(i=0;i<20;++i) {
// we know that dbus-daemon is available, so we wait until shm is available
sharedMem = OpenFileMappingA( FILE_MAP_READ, FALSE, cDBusDaemonAddressInfo );
sharedMem = OpenFileMappingA( FILE_MAP_READ, FALSE, _dbus_string_get_const_data(shm_address));
if( sharedMem == 0 )
Sleep( 100 );
if ( sharedMem != 0)
......@@ -2638,39 +2746,48 @@ _dbus_get_autolaunch_shm (DBusString *address)
}
static dbus_bool_t
_dbus_daemon_already_runs (DBusString *address)
_dbus_daemon_already_runs (DBusString *address, DBusString *shm_address, const char *scope)
{
HANDLE lock;
HANDLE daemon;
DBusString mutex_address;
dbus_bool_t bRet = TRUE;
// sync _dbus_daemon_publish_session_bus_address, _dbus_daemon_unpublish_session_bus_address and _dbus_daemon_already_runs
lock = _dbus_global_lock( cUniqueDBusInitMutex );
if (!_dbus_get_mutex_name(&mutex_address,scope))
{
_dbus_string_free( &mutex_address );
return FALSE;
}
// do checks
daemon = CreateMutexA( NULL, FALSE, cDBusDaemonMutex );
daemon = CreateMutexA( NULL, FALSE, _dbus_string_get_const_data(&mutex_address) );
if(WaitForSingleObject( daemon, 10 ) != WAIT_TIMEOUT)
{
ReleaseMutex (daemon);
CloseHandle (daemon);
_dbus_global_unlock( lock );
_dbus_string_free( &mutex_address );
return FALSE;
}
// read shm
bRet = _dbus_get_autolaunch_shm( address );
bRet = _dbus_get_autolaunch_shm( address, shm_address );
// cleanup
CloseHandle ( daemon );
_dbus_global_unlock( lock );
_dbus_string_free( &mutex_address );
return bRet;
}
dbus_bool_t
_dbus_get_autolaunch_address (DBusString *address,
_dbus_get_autolaunch_address (const char *scope, DBusString *address,
DBusError *error)
{
HANDLE mutex;
......@@ -2681,12 +2798,19 @@ _dbus_get_autolaunch_address (DBusString *address,
char dbus_exe_path[MAX_PATH];
char dbus_args[MAX_PATH * 2];
const char * daemon_name = DBUS_DAEMON_NAME ".exe";
DBusString shm_address;
mutex = _dbus_global_lock ( cDBusAutolaunchMutex );
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
if (_dbus_daemon_already_runs(address))
if (!_dbus_get_shm_address(&shm_address,scope))
{
dbus_set_error_const (error, DBUS_ERROR_FAILED, "could not determine shm address");
return FALSE;
}
if (_dbus_daemon_already_runs(address,&shm_address,scope))
{
_dbus_verbose("found already running dbus daemon\n");
retval = TRUE;
......@@ -2713,7 +2837,7 @@ _dbus_get_autolaunch_address (DBusString *address,
{
CloseHandle (pi.hThread);
CloseHandle (pi.hProcess);
retval = _dbus_get_autolaunch_shm( address );
retval = _dbus_get_autolaunch_shm( address, &shm_address );
}
if (retval == FALSE)
......
......@@ -207,7 +207,7 @@ dbus_bool_t _dbus_windows_user_is_process_owner (const char *windows_sid)
dbus_bool_t _dbus_append_keyring_directory_for_credentials (DBusString *directory,
DBusCredentials *credentials);
void _dbus_daemon_publish_session_bus_address (const char* address);
dbus_bool_t _dbus_daemon_publish_session_bus_address (const char* address, const char* shm_address);
void _dbus_daemon_unpublish_session_bus_address (void);
......@@ -474,8 +474,9 @@ void _dbus_system_logv (DBusSystemLogSeverity severity, const char *msg, va_list
_DBUS_BYTE_OF_PRIMITIVE (a, 6) == _DBUS_BYTE_OF_PRIMITIVE (b, 6) && \
_DBUS_BYTE_OF_PRIMITIVE (a, 7) == _DBUS_BYTE_OF_PRIMITIVE (b, 7))
dbus_bool_t _dbus_get_autolaunch_address (DBusString *address,
DBusError *error);
dbus_bool_t _dbus_get_autolaunch_address (const char *scope,
DBusString *address,
DBusError *error);
dbus_bool_t _dbus_lookup_session_address (dbus_bool_t *supported,
DBusString *address,
......
......@@ -273,7 +273,7 @@ check_address (const char *address, DBusError *error)
* @returns a new transport, or #NULL on failure.
*/
static DBusTransport*
_dbus_transport_new_for_autolaunch (DBusError *error)
_dbus_transport_new_for_autolaunch (const char *scope, DBusError *error)
{
DBusString address;
DBusTransport *result = NULL;
......@@ -286,7 +286,7 @@ _dbus_transport_new_for_autolaunch (DBusError *error)
return NULL;
}
if (!_dbus_get_autolaunch_address (&address, error))
if (!_dbus_get_autolaunch_address (scope, &address, error))
{
_DBUS_ASSERT_ERROR_IS_SET (error);
goto out;
......@@ -315,7 +315,9 @@ _dbus_transport_open_autolaunch (DBusAddressEntry *entry,
if (strcmp (method, "autolaunch") == 0)
{
*transport_p = _dbus_transport_new_for_autolaunch (error);
const char *scope = dbus_address_entry_get_value (entry, "scope");
*transport_p = _dbus_transport_new_for_autolaunch (scope, error);
if (*transport_p == NULL)
{
......
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