[libvirt] [PATCH] Socket identity support for FreeBSD.
Daniel P. Berrange
berrange at redhat.com
Mon Dec 17 11:34:34 UTC 2012
On Fri, Dec 14, 2012 at 10:06:33PM +0400, Roman Bogorodskiy wrote:
> This adds an implementation of virNetSocketGetUNIXIdentity()
> using LOCAL_PEERCRED socket option and xucred struct, defined
> in <sys/ucred.h> on systems that have it.
> ---
> configure.ac | 3 ++-
> src/rpc/virnetsocket.c | 30 +++++++++++++++++++++++++++++-
> 2 files changed, 31 insertions(+), 2 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index bf32f95..1cb9e91 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -187,7 +187,8 @@ LIBS=$old_libs
> dnl Availability of various common headers (non-fatal if missing).
> AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/un.h \
> sys/poll.h syslog.h mntent.h net/ethernet.h linux/magic.h \
> - sys/un.h sys/syscall.h netinet/tcp.h ifaddrs.h libtasn1.h])
> + sys/un.h sys/syscall.h netinet/tcp.h ifaddrs.h libtasn1.h \
> + sys/ucred.h])
> dnl Check whether endian provides handy macros.
> AC_CHECK_DECLS([htole64], [], [], [[#include <endian.h>]])
>
> diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
> index a1b64d7..70c621f 100644
> --- a/src/rpc/virnetsocket.c
> +++ b/src/rpc/virnetsocket.c
> @@ -35,6 +35,10 @@
> # include <netinet/tcp.h>
> #endif
>
> +#ifdef HAVE_SYS_UCRED_H
> +# include <sys/ucred.h>
> +#endif
> +
> #include "c-ctype.h"
> #include "virnetsocket.h"
> #include "util.h"
> @@ -1091,7 +1095,7 @@ int virNetSocketGetPort(virNetSocketPtr sock)
> }
>
>
> -#ifdef SO_PEERCRED
> +#if defined(SO_PEERCRED)
> int virNetSocketGetUNIXIdentity(virNetSocketPtr sock,
> uid_t *uid,
> gid_t *gid,
> @@ -1115,6 +1119,30 @@ int virNetSocketGetUNIXIdentity(virNetSocketPtr sock,
> virMutexUnlock(&sock->lock);
> return 0;
> }
> +#elif defined(LOCAL_PEERCRED)
> +int virNetSocketGetUNIXIdentity(virNetSocketPtr sock,
> + uid_t *uid,
> + gid_t *gid,
> + pid_t *pid)
> +{
> + struct xucred cr;
> + socklen_t cr_len = sizeof(cr);
> + virMutexLock(&sock->lock);
> +
> + if (getsockopt(sock->fd, SOL_SOCKET, LOCAL_PEERCRED, &cr, &cr_len) < 0) {
> + virReportSystemError(errno, "%s",
> + _("Failed to get client socket identity"));
> + virMutexUnlock(&sock->lock);
> + return -1;
> + }
> +
> + *pid = -1;
> + *uid = cr.cr_uid;
> + *gid = cr.cr_gid;
> +
> + virMutexUnlock(&sock->lock);
> + return 0;
> +}
> #else
> int virNetSocketGetUNIXIdentity(virNetSocketPtr sock ATTRIBUTE_UNUSED,
> uid_t *uid ATTRIBUTE_UNUSED,
ACK, this fixed my previous complaint about setting pid default value
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list