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],