diff options
| -rw-r--r-- | ChangeLog | 12 | ||||
| -rw-r--r-- | dbus/dbus-sysdeps.c | 52 | ||||
| -rw-r--r-- | python/dbus_bindings.pyx.in | 8 | 
3 files changed, 59 insertions, 13 deletions
| @@ -1,5 +1,17 @@  2005-06-16  Colin Walters  <walters@verbum.org> +	* python/dbus_bindings.pyx.in: Import size_t, +	__int64_t, __uint64_t, and __signed. + +	* dbus/dbus-sysdeps.c <HAVE_CMSGCRED> (write_credentials_byte): +	Define cmsg struct, output it. +	(_dbus_read_credentials_unix_socket): +	Use cmsg struct. +	 +	Patch from Joe Markus Clarke for FreeBSD support. +	 +2005-06-16  Colin Walters  <walters@verbum.org> +  	* tools/dbus-send.c (append_array): Use strtok.  	(append_dict): New function.  	(type_from_name): New function, extracted from main. diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index 917a240c..1d0a64ac 100644 --- a/dbus/dbus-sysdeps.c +++ b/dbus/dbus-sysdeps.c @@ -742,12 +742,40 @@ write_credentials_byte (int             server_fd,  {    int bytes_written;    char buf[1] = { '\0' }; +#if defined(HAVE_CMSGCRED) && !defined(LOCAL_CREDS) +  struct { +	  struct cmsghdr hdr; +	  struct cmsgcred cred; +  } cmsg; +  struct iovec iov; +  struct msghdr msg; +#endif + +#if defined(HAVE_CMSGCRED) && !defined(LOCAL_CREDS) +  iov.iov_base = buf; +  iov.iov_len = 1; + +  memset (&msg, 0, sizeof (msg)); +  msg.msg_iov = &iov; +  msg.msg_iovlen = 1; + +  msg.msg_control = &cmsg; +  msg.msg_controllen = sizeof (cmsg); +  memset (&cmsg, 0, sizeof (cmsg)); +  cmsg.hdr.cmsg_len = sizeof (cmsg); +  cmsg.hdr.cmsg_level = SOL_SOCKET; +  cmsg.hdr.cmsg_type = SCM_CREDS; +#endif    _DBUS_ASSERT_ERROR_IS_CLEAR (error);   again: +#if defined(HAVE_CMSGCRED) && !defined(LOCAL_CREDS) +  bytes_written = sendmsg (server_fd, &msg, 0); +#else    bytes_written = write (server_fd, buf, 1); +#endif    if (bytes_written < 0 && errno == EINTR)      goto again; @@ -801,8 +829,10 @@ _dbus_read_credentials_unix_socket  (int              client_fd,    char buf;  #ifdef HAVE_CMSGCRED  -  char cmsgmem[CMSG_SPACE (sizeof (struct cmsgcred))]; -  struct cmsghdr *cmsg = (struct cmsghdr *) cmsgmem; +  struct { +	  struct cmsghdr hdr; +	  struct cmsgcred cred; +  } cmsg;  #endif    _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -837,9 +867,9 @@ _dbus_read_credentials_unix_socket  (int              client_fd,    msg.msg_iovlen = 1;  #ifdef HAVE_CMSGCRED -  memset (cmsgmem, 0, sizeof (cmsgmem)); -  msg.msg_control = cmsgmem; -  msg.msg_controllen = sizeof (cmsgmem); +  memset (&cmsg, 0, sizeof (cmsg)); +  msg.msg_control = &cmsg; +  msg.msg_controllen = sizeof (cmsg);  #endif   again: @@ -862,7 +892,7 @@ _dbus_read_credentials_unix_socket  (int              client_fd,      }  #ifdef HAVE_CMSGCRED -  if (cmsg->cmsg_len < sizeof (cmsgmem) || cmsg->cmsg_type != SCM_CREDS) +  if (cmsg->hdr.cmsg_len < sizeof (cmsg) || cmsg.hdr.cmsg_type != SCM_CREDS)      {        dbus_set_error (error, DBUS_ERROR_FAILED,                        "Message from recvmsg() was not SCM_CREDS"); @@ -890,13 +920,9 @@ _dbus_read_credentials_unix_socket  (int              client_fd,  		       cr_len, (int) sizeof (cr), _dbus_strerror (errno));        }  #elif defined(HAVE_CMSGCRED) -    struct cmsgcred *cred; - -    cred = (struct cmsgcred *) CMSG_DATA (cmsg); - -    credentials->pid = cred->cmcred_pid; -    credentials->uid = cred->cmcred_euid; -    credentials->gid = cred->cmcred_groups[0]; +    credentials->pid = cmsg.cred.cmcred_pid; +    credentials->uid = cmsg.cred.cmcred_euid; +    credentials->gid = cmsg.cred.cmcred_groups[0];  #else /* !SO_PEERCRED && !HAVE_CMSGCRED */      _dbus_verbose ("Socket credentials not supported on this OS\n");  #endif diff --git a/python/dbus_bindings.pyx.in b/python/dbus_bindings.pyx.in index 8689d8cf..3c819934 100644 --- a/python/dbus_bindings.pyx.in +++ b/python/dbus_bindings.pyx.in @@ -7,6 +7,14 @@  #FIXME: find memory leaks that I am sure exist +cdef extern from "sys/types.h": +    ctypedef size_t +    ctypedef __int64_t +    ctypedef __uint64_t + +cdef extern from "sys/cdefs.h": +    ctypedef __signed +  #include "dbus_h_wrapper.h"  cdef extern from "stdlib.h": | 
