$NetBSD: patch-ae,v 1.5 2008/12/26 20:05:56 hasso Exp $ --- src/ck-sysdeps-unix.c.orig 2008-11-27 05:10:25 +0200 +++ src/ck-sysdeps-unix.c 2008-11-27 05:09:59 +0200 @@ -35,6 +35,11 @@ #include #endif +#ifdef __NetBSD__ +#include +#include +#endif + #ifdef HAVE_SYS_VT_H #include #endif @@ -53,6 +58,25 @@ #define ERROR -1 #endif +#ifdef LOCAL_PEEREID +static gboolean +ck_nb_getpeeruucred(int socket_fd, pid_t *pid, uid_t *uid) +{ + struct unpcbid cred; + socklen_t len = sizeof(cred); + + if (getsockopt(socket_fd, 0, LOCAL_PEEREID, &cred, &len) < 0) + return FALSE; + + if (pid) + *pid = cred.unp_pid; + if (uid) + *uid = cred.unp_euid; + + return TRUE; +} +#endif + /* Adapted from dbus-sysdeps-unix.c:_dbus_read_credentials_socket() */ gboolean ck_get_socket_peer_credentials (int socket_fd, @@ -99,7 +123,16 @@ ck_get_socket_peer_credentials (int if (ucred != NULL) { ucred_free (ucred); } -#else /* !SO_PEERCRED && !HAVE_GETPEERUCRED */ +#elif defined(LOCAL_PEEREID) + pid_t sockpid = -1, sockuid = -1; + if (ck_nb_getpeeruucred(socket_fd, &sockpid, &sockuid) == TRUE) { + pid_read = sockpid; + uid_read = sockuid; + ret = TRUE; + } else { + g_warning ("Failed to ck_nb_getpeeruucred() credentials\n"); + } +#else /* !SO_PEERCRED && !HAVE_GETPEERUCRED && !LOCAL_PEEREID*/ g_warning ("Socket credentials not supported on this OS\n"); #endif @@ -126,17 +159,17 @@ ck_get_socket_peer_credentials (int gboolean ck_fd_is_a_console (int fd) { -#ifdef __linux__ +#if defined(__linux__) || defined(__NetBSD__) struct vt_stat vts; -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__DragonFly__) int vers; #endif int kb_ok; errno = 0; -#ifdef __linux__ +#if defined(__linux__) || defined(__NetBSD__) kb_ok = (ioctl (fd, VT_GETSTATE, &vts) == 0); -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__DragonFly__) kb_ok = (ioctl (fd, CONS_GETVERS, &vers) == 0); #else kb_ok = 1; @@ -172,6 +205,15 @@ ck_get_a_console_fd (void) fd = -1; +#if defined(__FreeBSD__) || defined(__DragonFly__) + /* On FreeBSD, try /dev/consolectl first as this will survive + * /etc/ttys initialization. */ + fd = open_a_console ("/dev/consolectl"); + if (fd >= 0) { + goto done; + } +#endif + #ifdef __sun /* On Solaris, first try Sun VT device. */ fd = open_a_console ("/dev/vt/active"); @@ -184,6 +226,14 @@ ck_get_a_console_fd (void) } #endif +#ifdef __NetBSD__ + /* On NetBSD, first try wsdisplay device. */ + fd = open_a_console ("/dev/ttyE0"); + if (fd >= 0) { + goto done; + } +#endif + #ifdef _PATH_TTY fd = open_a_console (_PATH_TTY); if (fd >= 0) {