Alternatively, someone could implement g_credentials_get_unix_pid(), which clearly ought to exist anyway, and would move the problem into GIO. (GNOME #687920.)I did that, and it's available in glib2.0/unstable (2.36).
The patch for using g_credentials_get_unix_pid is attached. Petr
--- daemon/gdm-session.old 2013-10-12 10:43:49.000000000 +0200 +++ daemon/gdm-session.c 2013-10-12 11:02:30.000000000 +0200 @@ -970,28 +970,6 @@ return FALSE; } -static GPid -credentials_get_unix_pid (GCredentials *credentials) -{ - GPid pid = 0; - gpointer native_credentials = NULL; - -#ifdef __linux__ - native_credentials = g_credentials_get_native (credentials, G_CREDENTIALS_TYPE_LINUX_UCRED); - pid = (GPid) ((struct ucred *) native_credentials)->pid; -#elif defined (__FreeBSD__) - native_credentials = g_credentials_get_native (credentials, G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED); - pid = (GPid) ((struct cmsgcred *) native_credentials)->cmcred_pid; -#elif defined (__OpenBSD__) - native_credentials = g_credentials_get_native (credentials, G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED); - pid = (GPid) ((struct sockpeercred *) native_credentials)->pid; -#else -#error "platform not supported, need mechanism to detect pid of connected process" -#endif - - return pid; -} - static gboolean register_worker (GdmDBusWorkerManager *worker_manager_interface, GDBusMethodInvocation *invocation, @@ -1021,7 +999,7 @@ connection_node); credentials = g_dbus_connection_get_peer_credentials (connection); - pid = credentials_get_unix_pid (credentials); + pid = g_credentials_get_unix_pid (credentials, NULL); conversation = find_conversation_by_pid (self, (GPid) pid); @@ -1479,7 +1457,7 @@ connection); credentials = g_dbus_connection_get_peer_credentials (connection); - pid_of_client = credentials_get_unix_pid (credentials); + pid_of_client = g_credentials_get_unix_pid (credentials, NULL); g_signal_emit (G_OBJECT (self), signals [CLIENT_DISCONNECTED], @@ -1531,7 +1509,7 @@ } credentials = g_dbus_connection_get_peer_credentials (connection); - pid_of_client = credentials_get_unix_pid (credentials); + pid_of_client = g_credentials_get_unix_pid (credentials, NULL); g_signal_emit (G_OBJECT (self), signals [CLIENT_CONNECTED],