summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris+github@qwirx.com>2008-10-11 21:01:38 +0000
committerChris Wilson <chris+github@qwirx.com>2008-10-11 21:01:38 +0000
commitec5d4ab2b2cf334240673ca918ed1240a6dfb4b8 (patch)
treebfb4d5297246408480d7d6f7ebb062a8237eed5d
parent23221c54b485a4b7625d43987ba44cf2278a4f12 (diff)
Use getpeerucred() to identify connecting socket clients on Solaris,
and silence warnings that the peer cannot be identified on this platform. Remove another use of uname -o which doesn't work on Solaris.
-rw-r--r--configure.ac9
-rw-r--r--lib/common/BoxPlatform.h12
-rw-r--r--lib/server/SocketStream.cpp28
3 files changed, 38 insertions, 11 deletions
diff --git a/configure.ac b/configure.ac
index d83c601c..e7f2f8fa 100644
--- a/configure.ac
+++ b/configure.ac
@@ -182,6 +182,10 @@ AC_CHECK_DECLS([INFTIM],,, [[#include <poll.h>]])
AC_CHECK_DECLS([SO_PEERCRED],,, [[#include <sys/socket.h>]])
AC_CHECK_DECLS([O_BINARY],,,)
+# Solaris provides getpeerucred() instead of getpeereid() or SO_PEERCRED
+AC_CHECK_HEADERS([ucred.h])
+AC_CHECK_FUNCS([getpeerucred])
+
AC_CHECK_DECLS([optreset],,, [[#include <getopt.h>]])
AC_CHECK_DECLS([dirfd],,,
[[
@@ -311,10 +315,9 @@ build_dir=`dirname $0`
build_dir=`cd $build_dir && pwd`
client_parcel_dir=`perl infrastructure/parcelpath.pl backup-client $target_os`
-os_name=`uname -o`
-if test "$os_name" = "Cygwin"; then
+if test "$build_os" = "cygwin"; then
client_parcel_dir=`cygpath -wa $client_parcel_dir | sed -e 's|\\\|/|g'`
- build_dir=`cygpath -wa $build_dir | sed -e 's|\\\|/|g'`
+ build_dir=` cygpath -wa $build_dir | sed -e 's|\\\|/|g'`
fi
AC_SUBST([client_parcel_dir])
diff --git a/lib/common/BoxPlatform.h b/lib/common/BoxPlatform.h
index 3af893b7..4f7a587c 100644
--- a/lib/common/BoxPlatform.h
+++ b/lib/common/BoxPlatform.h
@@ -72,10 +72,14 @@
#endif
// Find out if credentials on UNIX sockets can be obtained
-#ifndef HAVE_GETPEEREID
- #if !HAVE_DECL_SO_PEERCRED
- #define PLATFORM_CANNOT_FIND_PEER_UID_OF_UNIX_SOCKET
- #endif
+#ifdef HAVE_GETPEEREID
+ //
+#elif HAVE_DECL_SO_PEERCRED
+ //
+#elif HAVE_UCRED_H && HAVE_GETPEERUCRED
+ //
+#else
+ #define PLATFORM_CANNOT_FIND_PEER_UID_OF_UNIX_SOCKET
#endif
#ifdef HAVE_DEFINE_PRAGMA
diff --git a/lib/server/SocketStream.cpp b/lib/server/SocketStream.cpp
index a6f99dad..d6565984 100644
--- a/lib/server/SocketStream.cpp
+++ b/lib/server/SocketStream.cpp
@@ -18,7 +18,11 @@
#include <string.h>
#ifndef WIN32
-#include <poll.h>
+ #include <poll.h>
+#endif
+
+#ifdef HAVE_UCRED_H
+ #include <ucred.h>
#endif
#include "SocketStream.h"
@@ -478,10 +482,26 @@ bool SocketStream::GetPeerCredentials(uid_t &rUidOut, gid_t &rGidOut)
BOX_LOG_SYS_ERROR("Failed to get peer credentials on socket");
#endif
+#if HAVE_UCRED_H && HAVE_GETPEERUCRED
+ ucred_t *pucred = NULL;
+ if(::getpeerucred(mSocketHandle, &pucred) == 0)
+ {
+ rUidOut = ucred_geteuid(pucred);
+ rGidOut = ucred_getegid(pucred);
+ ucred_free(pucred);
+ if (rUidOut == -1 || rGidOut == -1)
+ {
+ BOX_ERROR("Failed to get peer credentials on "
+ "socket: insufficient information");
+ return false;
+ }
+ return true;
+ }
+
+ BOX_LOG_SYS_ERROR("Failed to get peer credentials on socket");
+#endif
+
// Not available
return false;
}
-
-
-