Win32 port
Peter Kümmel
syntheticpp at gmx.net
Thu Jun 29 09:06:42 PDT 2006
Peter Kümmel wrote:
> Havoc Pennington wrote:
>> You could also just go with the "keep the uid as integer on all
>> platforms" approach which is probably fine.
>>
>
> Attached a proposal for such a solution. It uses the 'quark'
> functions from windows and the strings are freed when the
> hash table is deleted.
>
>>From the outer you only see the two sid<->uid_t mapping functions.
>
>
> Peter
>
This patch is now obsolete:
>
> ------------------------------------------------------------------------
>
> Index: dbus-sysdeps.h
> ===================================================================
> RCS file: /cvs/dbus/dbus/dbus/dbus-sysdeps.h,v
> retrieving revision 1.49
> diff -u -b -B -r1.49 dbus-sysdeps.h
> --- dbus-sysdeps.h 8 Jul 2005 14:36:22 -0000 1.49
> +++ dbus-sysdeps.h 28 Jun 2006 13:46:59 -0000
> @@ -27,7 +27,14 @@
>
> #include <config.h>
>
> +#if defined(_WIN32) || defined(_WIN64)
> +#define DBUS_WIN
> +#else
> +#define DBUS_UNIX
> +#endif
> +
> #include <dbus/dbus-errors.h>
>
>
> /* this is perhaps bogus, but strcmp() etc. are faster if we use the
> * stuff straight out of string.h, so have this here for now.
>
> @@ -99,6 +107,50 @@
> #define DBUS_UID_FORMAT "%lu"
> #define DBUS_GID_FORMAT "%lu"
>
> +#ifdef DBUS_UNIX
> +
> +#else
> +
> +dbus_uid_t _dbus_win_sid_to_uid_t (void *psid);
> +
> +void _dbus_win_uid_t_to_sid (dbus_uid_t uid,
> + void **ppsid);
> +
> +#endif //DBUS_UNIX
>
> /**
> * Struct representing socket credentials
> */
> @@ -179,9 +231,14 @@
>
>
> unsigned long _dbus_getpid (void);
> dbus_uid_t _dbus_getuid (void);
> +dbus_uid_t _dbus_getuid_unix (void);
> +dbus_uid_t _dbus_getuid_win (void);
> dbus_gid_t _dbus_getgid (void);
>
> typedef struct DBusAtomic DBusAtomic;
>
> /**
>
> else
>
>
> Index: dbus-internals.h
> ===================================================================
> RCS file: /cvs/dbus/dbus/dbus/dbus-internals.h,v
> retrieving revision 1.55
> diff -u -b -B -r1.55 dbus-internals.h
> --- dbus-internals.h 26 Feb 2005 06:37:46 -0000 1.55
> +++ dbus-internals.h 28 Jun 2006 13:46:55 -0000
> @@ -270,6 +273,10 @@
> #define _DBUS_LOCK(name) _dbus_mutex_lock (_dbus_lock_##name)
> #define _DBUS_UNLOCK(name) _dbus_mutex_unlock (_dbus_lock_##name)
>
> +#ifdef _WIN32
> +_DBUS_DECLARE_GLOBAL_LOCK (win32_fds);
> +_DBUS_DECLARE_GLOBAL_LOCK (sid_atom_cache);
> +#endif
> _DBUS_DECLARE_GLOBAL_LOCK (list);
> _DBUS_DECLARE_GLOBAL_LOCK (connection_slots);
> _DBUS_DECLARE_GLOBAL_LOCK (pending_call_slots);
> @@ -281,7 +288,11 @@
> _DBUS_DECLARE_GLOBAL_LOCK (system_users);
> _DBUS_DECLARE_GLOBAL_LOCK (message_cache);
> _DBUS_DECLARE_GLOBAL_LOCK (shared_connections);
> +#ifdef _WIN32
> +#define _DBUS_N_GLOBAL_LOCKS (13)
> +#else
> #define _DBUS_N_GLOBAL_LOCKS (11)
> +#endif
>
> dbus_bool_t _dbus_threads_init_debug (void);
>
>
> Index: dbus-sysdeps.c
> ===================================================================
> RCS file: /cvs/dbus/dbus/dbus/dbus-sysdeps.c,v
> retrieving revision 1.102
> diff -u -b -B -r1.102 dbus-sysdeps.c
> --- dbus-sysdeps.c 30 May 2006 15:34:10 -0000 1.102
> +++ dbus-sysdeps.c 28 Jun 2006 13:46:59 -0000
> @@ -3,6 +3,7 @@
> *
> * Copyright (C) 2002, 2003 Red Hat, Inc.
> * Copyright (C) 2003 CodeFactory AB
> + * Copyright (C) 2005 Novell, Inc.
> *
> * Licensed under the Academic Free License version 2.1
> *
> @@ -26,28 +27,37 @@
> #include "dbus-sysdeps.h"
> #include "dbus-threads.h"
> #include "dbus-protocol.h"
> +#include "dbus-hash.h"
> +#include "dbus-sockets.h"
> #include "dbus-string.h"
> #include <sys/types.h>
> #include <stdlib.h>
> #include <string.h>
> #include <signal.h>
> -#include <unistd.h>
> #include <stdio.h>
> #include <errno.h>
> #include <fcntl.h>
> -#include <sys/socket.h>
> #include <dirent.h>
> -#include <sys/un.h>
> +#include <locale.h>
> +#include <sys/stat.h>
> +#ifdef HAVE_UNISTD_H
> +#include <unistd.h>
> +#endif
> +#ifdef HAVE_GRP_H
> +#include <grp.h>
> +#endif
> +#ifdef HAVE_PWD_H
> #include <pwd.h>
> +#endif
> +#ifdef HAVE_TIME_H
> #include <time.h>
> -#include <locale.h>
> +#endif
> +#ifdef HAVE_SYS_TIME_H
> #include <sys/time.h>
> -#include <sys/stat.h>
> +#endif
> +#ifdef HAVE_SYS_WAIT_H
> #include <sys/wait.h>
> -#include <netinet/in.h>
> -#include <netdb.h>
> -#include <grp.h>
> +#endif
> +
> #ifdef HAVE_WRITEV
> #include <sys/uio.h>
> #endif
> @@ -60,7 +70,28 @@
> #ifdef HAVE_GETPEERUCRED
> #include <ucred.h>
> #endif
> +#ifdef DBUS_WIN
> +#include <ctype.h>
> +#include <malloc.h>
> +#include <windows.h>
> +#include <aclapi.h>
> +#include <lm.h>
> +
> +/* Declarations missing in mingw's headers */
> +extern BOOL WINAPI ConvertStringSidToSidA (LPCSTR StringSid,
> + PSID *Sid);
> +extern BOOL WINAPI ConvertSidToStringSidA (PSID Sid,
> + LPSTR *StringSid);
> +#include <io.h>
> +#include <share.h>
> +
> +#endif
>
> +#endif
> #ifndef O_BINARY
> #define O_BINARY 0
> #endif
> @@ -69,6 +100,67 @@
> #define socklen_t int
> #endif
>
> +#ifdef DBUS_WIN
> +
> +
> +static DBusHashTable *sid_atom_cache = NULL;
> +
> +_DBUS_DEFINE_GLOBAL_LOCK (sid_atom_cache);
> +
> +#endif
>
> /**
> * @addtogroup DBusInternalsUtils
> * @{
>
>
> /**
> @@ -1830,26 +2751,91 @@
> unsigned long
> _dbus_getpid (void)
> {
> +#ifdef DBUS_UNIX
> return getpid ();
> +#else
> + return GetCurrentProcessId ();
> +#endif
> }
>
> /** Gets our UID
> - * @returns process UID
> + * @returns process user identifier
> */
> dbus_uid_t
> _dbus_getuid (void)
> {
> - return getuid ();
> +#ifdef DBUS_UNIX
> + return _dbus_getuid_unix ();
> +#else
> + return _dbus_getuid_win ();
> +#endif
> +}
> +
> +#ifdef DBUS_UNIX
> +dbus_uid_t
> +_dbus_getuid_unix (void)
> +{
> + return getuid();
> +}
> +#else
> +
> +dbus_uid_t
> +_dbus_getuid_win (void)
> +{
> + dbus_uid_t retval = DBUS_UID_UNSET;
> + HANDLE process_token = NULL;
> + TOKEN_USER *token_user = NULL;
> + DWORD n;
> +
> + if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &process_token))
> + _dbus_win_warn_win_error ("OpenProcessToken failed", GetLastError ());
> + else if ((!GetTokenInformation (process_token, TokenUser, NULL, 0, &n)
> + && GetLastError () != ERROR_INSUFFICIENT_BUFFER)
> + || (token_user = alloca (n)) == NULL
> + || !GetTokenInformation (process_token, TokenUser, token_user, n, &n))
> + _dbus_win_warn_win_error ("GetTokenInformation failed", GetLastError ());
> + else
> + retval = _dbus_win_sid_to_uid_t (token_user->User.Sid);
> +
> + if (process_token != NULL)
> + CloseHandle (process_token);
> +
> + _dbus_verbose("_dbus_getuid()=%d\n",retval);
> + return retval;
> }
> +#endif
> +
> +static void
> +_sid_atom_cache_shutdown_win (void *unused)
> +{
> + DBusHashIter iter;
> + _DBUS_LOCK (sid_atom_cache);
> + _dbus_hash_iter_init (sid_atom_cache, &iter);
> + while (_dbus_hash_iter_next (&iter))
> + {
> + ATOM atom;
> + atom = (ATOM) _dbus_hash_iter_get_value (&iter);
> + GlobalDeleteAtom(atom);
> + _dbus_hash_iter_remove_entry(&iter);
> + }
> + _DBUS_UNLOCK (sid_atom_cache);
> + _dbus_hash_table_unref (sid_atom_cache);
> + sid_atom_cache = NULL;
> +}
> +
> +/**
> + * Returns the 2-way associated dbus_uid_t form a SID.
> + *
> + * @param psid pointer to the SID
> + */
> +dbus_uid_t
> +_dbus_win_sid_to_uid_t (PSID psid)
> +{
> + dbus_uid_t uid;
> + dbus_uid_t olduid;
> + char *string;
> + ATOM atom;
> +
> + if (!IsValidSid (psid))
> + {
> + _dbus_verbose("%s invalid sid\n",__FUNCTION__);
> + return DBUS_UID_UNSET;
> + }
> + if (!ConvertSidToStringSidA (psid, &string))
> + {
> + _dbus_verbose("%s invalid sid\n",__FUNCTION__);
> + return DBUS_UID_UNSET;
> + }
> +
> + atom = GlobalAddAtom(string);
> +
> + if (atom == 0)
> + {
> + _dbus_verbose("%s GlobalAddAtom failed\n",__FUNCTION__);
> + LocalFree (string);
> + return DBUS_UID_UNSET;
> + }
> +
> + _DBUS_LOCK (sid_atom_cache);
> +
> + if (sid_atom_cache == NULL)
> + {
> + sid_atom_cache = _dbus_hash_table_new (DBUS_HASH_ULONG, NULL, NULL);
> + _dbus_register_shutdown_func (_sid_atom_cache_shutdown_win, NULL);
> + }
> +
> + uid = atom;
> + olduid = (dbus_uid_t) _dbus_hash_table_lookup_ulong (sid_atom_cache, uid);
> +
> + if (olduid)
> + {
> + _dbus_verbose("%s sid %s found in cache\n",__FUNCTION__, olduid);
> + uid = olduid;
> + }
> + else
> + {
> + _dbus_hash_table_insert_ulong (sid_atom_cache, olduid, (void*) olduid);
> + _dbus_verbose("%s sid %s added with uid %i to cache\n",__FUNCTION__, string, olduid);
> + }
> +
> + _DBUS_UNLOCK (sid_atom_cache);
> +
> + return olduid;
> +}
> +
> +void _dbus_win_uid_t_to_sid (dbus_uid_t uid, PSID *ppsid)
> +{
> + void* atom;
> + char string[255];
> +
> + atom = _dbus_hash_table_lookup_ulong (sid_atom_cache, uid);
> + if (atom == NULL)
> + {
> + _dbus_verbose("%s uid %i not found in cache\n",__FUNCTION__,uid);
> + return;
> + }
> + memset( string, '.', sizeof(string) );
> + if (!GlobalGetAtomNameA( (ATOM) atom, string, 255 ))
> + {
> + _dbus_verbose("%s uid %i not found in cache\n",__FUNCTION__, uid);
> + return;
> + }
> + if (!ConvertStringSidToSidA(string, ppsid))
> + {
> + _dbus_verbose("%s could not convert %s into sid \n",__FUNCTION__, string);
> + return;
> + }
> + _dbus_verbose("%s converted %s into sid \n",__FUNCTION__, string);
> +}
> +
> +#endif
> +
> /** @} end of sysdeps */
>
> /* tests in dbus-sysdeps-util.c */
> Index: dbus-threads.c
> ===================================================================
> RCS file: /cvs/dbus/dbus/dbus/dbus-threads.c,v
> retrieving revision 1.23
> diff -u -b -B -r1.23 dbus-threads.c
> --- dbus-threads.c 26 Feb 2005 06:37:46 -0000 1.23
> +++ dbus-threads.c 28 Jun 2006 13:46:59 -0000
> @@ -222,6 +222,10 @@
>
> DBusMutex **global_locks[] = {
> #define LOCK_ADDR(name) (& _dbus_lock_##name)
> +#ifdef DBUS_WIN
> + LOCK_ADDR (win32_fds),
> + LOCK_ADDR (sid_atom_cache),
> +#endif
> LOCK_ADDR (list),
> LOCK_ADDR (connection_slots),
> LOCK_ADDR (pending_call_slots),
>
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> dbus mailing list
> dbus at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dbus
More information about the dbus
mailing list