From 7a01268aebada78b505f9ac4736cb23fa8bf260d Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 12 Feb 2009 12:43:04 +0000 Subject: * ext/socket/basicsocket.c (bsock_getpeereid): implemented for Solaris using getpeerucred. * ext/socket/extconf.rb: check ucred.h and getpeerucred. * ext/socket/rubysocket.h: include ucred.h if available. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22256 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/socket/basicsocket.c | 10 ++++++++++ ext/socket/extconf.rb | 3 +++ ext/socket/rubysocket.h | 3 +++ 3 files changed, 16 insertions(+) (limited to 'ext/socket') diff --git a/ext/socket/basicsocket.c b/ext/socket/basicsocket.c index b818ffa82f..fd7493095d 100644 --- a/ext/socket/basicsocket.c +++ b/ext/socket/basicsocket.c @@ -392,6 +392,16 @@ bsock_getpeereid(VALUE self) if (getsockopt(fptr->fd, SOL_SOCKET, SO_PEERCRED, &cred, &len) == -1) rb_sys_fail("getsockopt(SO_PEERCRED)"); return rb_assoc_new(UIDT2NUM(cred.uid), GIDT2NUM(cred.gid)); +#elif defined(HAVE_GETPEERUCRED) /* Solaris */ + rb_io_t *fptr; + ucred_t *uc = NULL; + VALUE ret; + GetOpenFile(self, fptr); + if (getpeerucred(fptr->fd, &uc) == -1) + rb_sys_fail("getpeerucred"); + ret = rb_assoc_new(UIDT2NUM(ucred_geteuid(uc)), GIDT2NUM(ucred_getegid(uc))); + ucred_free(uc); + return ret; #else rb_notimplement(); #endif diff --git a/ext/socket/extconf.rb b/ext/socket/extconf.rb index 921a0eeeee..ae2338d18b 100644 --- a/ext/socket/extconf.rb +++ b/ext/socket/extconf.rb @@ -316,6 +316,9 @@ have_type("struct cmsgcred", headers) have_func("getpeereid") +have_header("ucred.h", headers) +have_func("getpeerucred") + $distcleanfiles << "constants.h" << "constdefs.*" if have_func(test_func) diff --git a/ext/socket/rubysocket.h b/ext/socket/rubysocket.h index ae21f2608c..d6f09fe1e2 100644 --- a/ext/socket/rubysocket.h +++ b/ext/socket/rubysocket.h @@ -79,6 +79,9 @@ #ifdef HAVE_SYS_UCRED_H #include #endif +#ifdef HAVE_UCRED_H +#include +#endif #ifndef EWOULDBLOCK #define EWOULDBLOCK EAGAIN -- cgit v1.2.3