summaryrefslogtreecommitdiffstats
path: root/ext
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-12 12:43:04 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-12 12:43:04 +0000
commitec02897c9a9f42b35e164577a9766f55d764823d (patch)
treeacfd54621f334218918c7c496eeb4230ad0e404c /ext
parent6cca5fc7ea3421b3601598c10e50ab0f2706baa4 (diff)
downloadruby-ec02897c9a9f42b35e164577a9766f55d764823d.tar.gz
ruby-ec02897c9a9f42b35e164577a9766f55d764823d.tar.xz
ruby-ec02897c9a9f42b35e164577a9766f55d764823d.zip
* 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: http://svn.ruby-lang.org/repos/ruby/trunk@22256 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/socket/basicsocket.c10
-rw-r--r--ext/socket/extconf.rb3
-rw-r--r--ext/socket/rubysocket.h3
3 files changed, 16 insertions, 0 deletions
diff --git a/ext/socket/basicsocket.c b/ext/socket/basicsocket.c
index b818ffa82..fd7493095 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 921a0eeee..ae2338d18 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 ae21f2608..d6f09fe1e 100644
--- a/ext/socket/rubysocket.h
+++ b/ext/socket/rubysocket.h
@@ -79,6 +79,9 @@
#ifdef HAVE_SYS_UCRED_H
#include <sys/ucred.h>
#endif
+#ifdef HAVE_UCRED_H
+#include <ucred.h>
+#endif
#ifndef EWOULDBLOCK
#define EWOULDBLOCK EAGAIN