On Sat, May 15, 2010 at 16:02:29 +0200, Cyril Brulebois wrote: > your package no longer builds on kfreebsd-*: > | libtool: compile: gcc -DHAVE_CONFIG_H -I. > -I/build/buildd-glib2.0_2.25.5-1-kfreebsd-i386-eQ8MPT/glib2.0-2.25.5/gio -I.. > -DG_LOG_DOMAIN=\"GLib-GIO\" -I.. > -I/build/buildd-glib2.0_2.25.5-1-kfreebsd-i386-eQ8MPT/glib2.0-2.25.5 > -I/build/buildd-glib2.0_2.25.5-1-kfreebsd-i386-eQ8MPT/glib2.0-2.25.5/glib > -I/build/buildd-glib2.0_2.25.5-1-kfreebsd-i386-eQ8MPT/glib2.0-2.25.5/gmodule > -DG_ENABLE_DEBUG -DG_THREADS_MANDATORY -DG_DISABLE_DEPRECATED > -DGIO_COMPILATION -DGIO_MODULE_DIR=\"/usr/lib/gio/modules\" > -DG_DISABLE_SINGLE_INCLUDES -pthread -g -O2 -Wall -g -O2 -MT > gunixcredentialsmessage.lo -MD -MP -MF .deps/gunixcredentialsmessage.Tpo -c > /build/buildd-glib2.0_2.25.5-1-kfreebsd-i386-eQ8MPT/glib2.0-2.25.5/gio/gunixcredentialsmessage.c > -fPIC -DPIC -o .libs/gunixcredentialsmessage.o > | > /build/buildd-glib2.0_2.25.5-1-kfreebsd-i386-eQ8MPT/glib2.0-2.25.5/gio/gunixcredentialsmessage.c: > In function 'g_unix_credentials_message_get_level': > | > /build/buildd-glib2.0_2.25.5-1-kfreebsd-i386-eQ8MPT/glib2.0-2.25.5/gio/gunixcredentialsmessage.c:89: > error: 'SOL_SOCKET' undeclared (first use in this function)
So fixing the ftbfs is easy (either put the SOL_SOCKET thing in a linux ifdef, or include <sys/socket.h> unconditionally). Making this stuff actually work on freebsd I'm not sure. The following should basically work. Note that afaict the freebsd interface doesn't allow faking ids, even for root, unlike linux. struct cmsgcred has a field for uid and for euid, I'm not sure which is more appropriate. This is the first time I'm looking at this interface, and I'm not familiar with freebsd, so somebody should double-check. Cheers, Julien diff --git a/configure.in b/configure.in index 38288c3..e14d523 100644 --- a/configure.in +++ b/configure.in @@ -1009,6 +1009,8 @@ fi AC_CHECK_FUNCS(getprotobyname_r endservent) AC_CHECK_HEADERS([netdb.h wspiapi.h]) +AC_CHECK_MEMBERS([struct cmsgcred.cmcred_pid], [], [], $glib_inet_includes) + # For gio/libasyncns if test $glib_native_win32 = no; then AC_CHECK_FUNCS(strndup setresuid setreuid) diff --git a/gio/gcredentials.c b/gio/gcredentials.c index bcea1a4..644046a 100644 --- a/gio/gcredentials.c +++ b/gio/gcredentials.c @@ -22,15 +22,16 @@ #include "config.h" +#ifdef __linux__ +#define _GNU_SOURCE +#endif + #include <stdlib.h> -#ifdef __linux__ -#define __USE_GNU #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <string.h> -#endif #include <gobject/gvaluecollector.h> @@ -66,6 +67,8 @@ struct _GCredentialsPrivate { #ifdef __linux__ struct ucred native; +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + struct cmsgcred native; #else #warning Please add GCredentials support for your OS guint foo; @@ -103,6 +106,10 @@ g_credentials_init (GCredentials *credentials) credentials->priv->native.pid = getpid (); credentials->priv->native.uid = getuid (); credentials->priv->native.gid = getgid (); +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + credentials->priv->native.cmcred_pid = getpid(); + credentials->priv->native.cmcred_uid = getuid(); + credentials->priv->native.cmcred_gid = getgid(); #endif } @@ -156,6 +163,16 @@ g_credentials_to_string (GCredentials *credentials) g_string_append_printf (ret, "gid=%" G_GINT64_FORMAT ",", (gint64) credentials->priv->native.gid); if (ret->str[ret->len - 1] == ',') ret->str[ret->len - 1] = '\0'; +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + g_string_append (ret, "bsd:"); + if (credentials->priv->native.cmcred_pid != -1) + g_string_append_printf(ret, "pid=%" G_GINT64_FORMAT ",", (gint64) credentials->priv->native.cmcred_pid); + if (credentials->priv->native.cmcred_uid != -1) + g_string_append_printf(ret, "uid=%" G_GINT64_FORMAT ",", (gint64) credentials->priv->native.cmcred_uid); + if (credentials->priv->native.cmcred_gid != -1) + g_string_append_printf(ret, "gid=%" G_GINT64_FORMAT ",", (gint64) credentials->priv->native.cmcred_gid); + if (ret->str[ret->len - 1] == ',') + ret->str[ret->len - 1] = '\0'; #else g_string_append (ret, "unknown"); #endif @@ -196,6 +213,9 @@ g_credentials_is_same_user (GCredentials *credentials, #ifdef __linux__ if (credentials->priv->native.uid == other_credentials->priv->native.uid) ret = TRUE; +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + if (credentials->priv->native.cmcred_uid == other_credentials->priv->native.cmcred_uid) + ret = TRUE; #else g_set_error_literal (error, G_IO_ERROR, @@ -224,7 +244,7 @@ g_credentials_get_native (GCredentials *credentials) gpointer ret; g_return_val_if_fail (G_IS_CREDENTIALS (credentials), NULL); -#ifdef __linux__ +#if defined(__linux__) || defined(HAVE_STRUCT_CMSGCRED_CMCRED_PID) ret = &credentials->priv->native; #else ret = NULL; @@ -250,8 +270,8 @@ void g_credentials_set_native (GCredentials *credentials, gpointer native) { -#ifdef __linux__ - memcpy (&credentials->priv->native, native, sizeof (struct ucred)); +#if defined(__linux__) || defined(HAVE_STRUCT_CMSGCRED_CMCRED_PID) + memcpy (&credentials->priv->native, native, sizeof (credentials->priv->native)); #else g_warning ("g_credentials_set_native: Trying to set credentials but GLib has no support " "for the native credentials type. Please add support."); @@ -288,6 +308,8 @@ g_credentials_get_unix_user (GCredentials *credentials, #ifdef __linux__ ret = credentials->priv->native.uid; +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + ret = credentials->priv->native.cmcred_uid; #else ret = -1; g_set_error_literal (error, @@ -331,6 +353,9 @@ g_credentials_set_unix_user (GCredentials *credentials, #ifdef __linux__ credentials->priv->native.uid = uid; ret = TRUE; +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + credentials->priv->native.cmcred_uid = uid; + ret = TRUE; #else g_set_error_literal (error, G_IO_ERROR, diff --git a/gio/gunixcredentialsmessage.c b/gio/gunixcredentialsmessage.c index 15c4c96..41370f6 100644 --- a/gio/gunixcredentialsmessage.c +++ b/gio/gunixcredentialsmessage.c @@ -36,19 +36,23 @@ #ifdef __linux__ #define _GNU_SOURCE -#define __USE_GNU -#include <sys/types.h> -#include <sys/socket.h> #include <sys/un.h> #include <unistd.h> #include <fcntl.h> #define G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 1 +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + +#include <unistd.h> +#define G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 1 + #else /* TODO: please add support for your UNIX flavor */ #define G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 0 #endif +#include <sys/types.h> +#include <sys/socket.h> /* ---------------------------------------------------------------------------------------------------- */ #include <string.h> @@ -78,6 +82,8 @@ g_unix_credentials_message_get_size (GSocketControlMessage *message) { #ifdef __linux__ return sizeof (struct ucred); +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + return sizeof (struct cmsgcred); #else return 0; #endif @@ -94,6 +100,8 @@ g_unix_credentials_message_get_msg_type (GSocketControlMessage *message) { #ifdef __linux__ return SCM_CREDENTIALS; +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + return SCM_CREDS; #else return 0; #endif @@ -135,6 +143,32 @@ g_unix_credentials_message_deserialize (gint level, out: ; } +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + { + GCredentials *credentials; + struct cmsgcred *cmsgcred; + + if (level != SOL_SOCKET || type != SCM_CREDS) + goto out; + + if (size != sizeof (struct cmsgcred)) + { + g_warning ("Expected a struct cmsgcred (%" G_GSIZE_FORMAT " bytes) but " + "got %" G_GSIZE_FORMAT " bytes of data", + sizeof (struct cmsgcred), + size); + goto out; + } + + cmsgcred = data; + + credentials = g_credentials_new (); + g_credentials_set_native (credentials, cmsgcred); + message = g_unix_credentials_message_new_with_credentials (credentials); + g_object_unref (credentials); + out: + ; + } #endif return message; @@ -147,6 +181,8 @@ g_unix_credentials_message_serialize (GSocketControlMessage *_message, GUnixCredentialsMessage *message = G_UNIX_CREDENTIALS_MESSAGE (_message); #ifdef __linux__ memcpy (data, g_credentials_get_native (message->priv->credentials), sizeof (struct ucred)); +#elif HAVE_STRUCT_CMSGCRED_CMCRED_PID + memcpy(data, g_credentials_get_native(message->priv->credentials), sizeof (struct cmsgcred)); #endif }
signature.asc
Description: Digital signature