Implement getprivimplinfo
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Tue, 9 Sep 2008 02:22:40 +0000 (02:22 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Tue, 9 Sep 2008 02:22:40 +0000 (02:22 +0000)
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Versions
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/priv.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/priv.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/privP.c [deleted file]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ucred.c

index c1f23ad..0b86a49 100644 (file)
@@ -13,7 +13,7 @@ endif
 ifeq ($(subdir),misc)
 sysdep_routines +=  gethrtime mount umount umount2 systeminfo resolvepath \
     getpagesizes memcntl meminfo uadmin getpflags setpflags issetugid ucred \
-    privP processor_bind processor_info p_online pset_create pset_destroy \
+    priv processor_bind processor_info p_online pset_create pset_destroy \
     pset_assign pset_info pset_bind pset_getloadavg pset_list pset_setattr \
     pset_getattr swapctl getustack setustack gethrvtime uucopy uucopystr \
     zone_add_datalink zone_boot zone_check_datalink zone_destroy zone_enter \
index 6ce9634..0cfd55a 100644 (file)
@@ -21,8 +21,9 @@ libc {
 
     # g
     getacct; getcpuid; gethrtime; gethrvtime; getpagesizes; getpagesizes2;
-    getpeerucred; getpflags; getppriv; getprojid; getrctl; gettaskid;
-    getustack; getvmusage; getzoneid; getzoneidbyname; getzonenamebyid;
+    getpeerucred; getpflags; getppriv; getprivimplinfo; getprojid; getrctl;
+    gettaskid; getustack; getvmusage; getzoneid; getzoneidbyname;
+    getzonenamebyid;
 
     # i
     idmap_reg; idmap_unreg; issetugid;
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/priv.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/priv.c
new file mode 100644 (file)
index 0000000..2155191
--- /dev/null
@@ -0,0 +1,64 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <inline-syscall.h>
+#include <priv.h>
+#include <privP.h>
+#include <sys/priocntl.h>
+#include <alloca.h>
+#include <bits/libc-lock.h>
+
+DECLARE_INLINE_SYSCALL (int, privsys, int code, priv_op_t op,
+    priv_ptype_t type, void *buf, size_t bufsize, int itype);
+
+/* Docs: http://docs.sun.com/app/docs/doc/816-5168/6mbb3hrjc?a=view
+         http://docs.sun.com/app/docs/doc/816-5167/setppriv-2?a=view */
+
+__libc_lock_define (static, privimplinfo_lock);
+
+libc_freeres_ptr (static priv_impl_info_t *__info);
+
+const priv_impl_info_t * getprivimplinfo (void)
+{
+  if (__info)
+    return __info;
+
+  __libc_lock_lock (privimplinfo_lock);
+
+  /* First call: get header.  */
+  priv_impl_info_t _info;
+  int result = INLINE_SYSCALL (privsys, 6, PRIVSYS_GETIMPLINFO, 0, 0, &_info,
+      sizeof(_info), 0);
+  if (result == 0)
+    {
+      /* Second call: alloc and get full priv_impl_info_t.  */
+      size_t info_size = PRIV_IMPL_INFO_SIZE (&_info);
+      __info = malloc (info_size);
+      result = INLINE_SYSCALL (privsys, 6, PRIVSYS_GETIMPLINFO, 0, 0, __info,
+          info_size, 0);
+      if (result != 0)
+        {
+          free (__info);
+          __info = NULL;
+        }
+    }
+
+  __libc_lock_unlock (privimplinfo_lock);
+  return __info;
+}
index 1a98daa..6ae9e3d 100644 (file)
@@ -48,6 +48,8 @@ extern const char *priv_getsetbynum (int privname);
 
 extern char *priv_gettext (const char *privname);
 
+extern const priv_impl_info_t * getprivimplinfo (void);
+
 __END_DECLS
 
 #endif /* _PRIV_H */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/privP.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/privP.c
deleted file mode 100644 (file)
index 053098a..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Copyright (C) 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <privP.h>
-#include <inline-syscall.h>
-#include <priv.h>
-#include <sys/priocntl.h>
-#include <alloca.h>
-#include <bits/libc-lock.h>
-
-DECLARE_INLINE_SYSCALL (int, privsys, int code, priv_op_t op,
-    priv_ptype_t type, void *buf, size_t bufsize, int itype);
-
-/* Docs: http://docs.sun.com/app/docs/doc/816-5168/6mbb3hrjc?a=view
-         http://docs.sun.com/app/docs/doc/816-5167/setppriv-2?a=view */
-
-__libc_lock_define (static, privimplinfo_lock);
-
-libc_freeres_ptr (static priv_impl_info_t *__info);
-
-int __getprivimplinfo_cached (priv_impl_info_t **info)
-{
-  if (__info)
-    {
-      *info = __info;
-      return 0;
-    }
-
-  __libc_lock_lock (privimplinfo_lock);
-
-  /* First call: get header.  */
-  priv_impl_info_t _info;
-  int result = INLINE_SYSCALL (privsys, 6, PRIVSYS_GETIMPLINFO, 0, 0, &_info,
-      sizeof(_info), 0);
-  if (result != 0)
-    {
-      __libc_lock_unlock (privimplinfo_lock);
-      return -1;
-    }
-
-  /* Second call: alloc and get full priv_impl_info_t.  */
-  size_t info_size = PRIV_IMPL_INFO_SIZE (&_info);
-  __info = malloc (info_size);
-  result = INLINE_SYSCALL (privsys, 6, PRIVSYS_GETIMPLINFO, 0, 0, __info,
-      info_size, 0);
-  if (result != 0)
-    {
-      __libc_lock_unlock (privimplinfo_lock);
-      return -1;
-    }
-
-  __libc_lock_unlock (privimplinfo_lock);
-
-  *info = __info;
-  return 0;
-}
index 277ab69..0764f03 100644 (file)
@@ -22,6 +22,7 @@
 #include <ucred.h>
 #include <errno.h>
 #include <ucredP.h>
+#include <priv.h>
 #include <assert.h>
 
 DECLARE_INLINE_SYSCALL (int, getpeerucred, int fd, ucred_t *ucred);
@@ -148,11 +149,9 @@ m_label_t *ucred_getlabel (const ucred_t *uc)
 
 size_t ucred_size (void)
 {
-    extern int __getprivimplinfo_cached (priv_impl_info_t **info);
-
     /* the docs don't say what to do in case of error */
-    priv_impl_info_t *info;
-    assert (__getprivimplinfo_cached (&info) == 0);
+    const priv_impl_info_t *info = getprivimplinfo ();
+    assert (info);
 
     /* XXX: We shouldn't use AUDITINFO64_ADDR_T_SIZE and BSLABEL_T_SIZE.  */
     return sizeof(ucred_t) + sizeof(prcred_t) + sizeof(prpriv_t) +