Implement more stuff
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Fri, 12 Sep 2008 15:05:37 +0000 (15:05 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Fri, 12 Sep 2008 15:05:37 +0000 (15:05 +0000)
23 files changed:
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthreadP.h
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_kill.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthreaddef.h
nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/proc_service.h
nptl_db/td_ta_map_lwp2thr.c
nptl_db/td_thr_get_info.c
nptl_db/td_thr_getfpregs.c
nptl_db/td_thr_getgregs.c
nptl_db/td_thr_setfpregs.c
nptl_db/td_thr_setgregs.c
nptl_db/td_thr_tlsbase.c
rtld_db/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Versions
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/priv.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/priv.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/privP.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/privP.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/door.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/priv.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/syscallP.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/syscalls.list
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ucred.c

index 24da9b3..b4082e1 100644 (file)
@@ -20,9 +20,6 @@
 #ifndef _OPENSOLARIS_PTHREADP_H
 #define _OPENSOLARIS_PTHREADP_H
 
-/* It is known that the first lwpid is 1.  */
-#define FIRST_THREAD_TID       1
-
 /* rwlock macros.  */
 #define _RWLOCK_WR_LOCK                0x80000000
 #define _RWLOCK_RD_MASK                0x7FFFFFFF
index 5908821..05dfa6d 100644 (file)
@@ -55,3 +55,4 @@ __pthread_kill (threadid, signo)
 }
 strong_alias (__pthread_kill, pthread_kill)
 weak_alias (__pthread_kill, _lwp_kill)
+weak_alias (__pthread_kill, thr_kill)
index 2f7f2f9..c6cdef5 100644 (file)
@@ -66,6 +66,9 @@ extern size_t main_stacksize;
 /* The first thread has a large (10M) stack so use the arch defaults.  */
 #define PTHREAD_USE_ARCH_STACK_DEFAULT_SIZE
 
+/* It is known that the first lwpid is 1.  */
+#define FIRST_THREAD_TID       1
+
 /* __exit_thread_inline is the same for all architectures.  */
 #include <inline-syscall.h>
 
index 91b2480..f703377 100644 (file)
@@ -57,7 +57,7 @@ __BEGIN_DECLS
 extern ps_err_e ps_pread(struct ps_prochandle *,
                           psaddr_t, void *, size_t);
 extern ps_err_e ps_pwrite(struct ps_prochandle *,
-                          psaddr_t, void *, size_t);
+                          psaddr_t, const void *, size_t);
 extern ps_err_e ps_pdread (struct ps_prochandle *,
                           psaddr_t, void *, size_t);
 extern ps_err_e ps_pdwrite (struct ps_prochandle *,
@@ -78,9 +78,6 @@ extern ps_err_e ps_lgetfpregs (struct ps_prochandle *,
 extern ps_err_e ps_lsetfpregs (struct ps_prochandle *,
                               lwpid_t, const prfpregset_t *);
 
-/* Return the PID of the process.  */
-extern pid_t ps_getpid (struct ps_prochandle *);
-
 /* Fetch the special per-thread address associated with the given LWP.
    This call is only used on a few platforms (most use a normal register).
    The meaning of the `int' parameter is machine-dependent.  */
index 78cfcab..1550eda 100644 (file)
@@ -198,7 +198,11 @@ td_ta_map_lwp2thr (const td_thragent_t *ta_arg,
 
   if (list == 0)
     {
+#ifndef PTHREAD_T_IS_TID
       if (ps_getpid (ta->ph) != lwpid)
+#else
+      if (FIRST_THREAD_TID != lwpid)
+#endif
        return TD_ERR;
       th->th_ta_p = ta;
       th->th_unique = 0;
index 99e5e19..527c82c 100644 (file)
@@ -98,7 +98,11 @@ td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop)
 
   /* Initialization which are the same in both cases.  */
   infop->ti_ta_p = th->th_ta_p;
+#ifndef PTHREAD_T_IS_TID
   infop->ti_lid = tid == 0 ? ps_getpid (th->th_ta_p->ph) : (uintptr_t) tid;
+#else
+  infop->ti_lid = tid == 0 ? FIRST_THREAD_TID : (uintptr_t) tid;
+#endif
   infop->ti_traceme = report_events != 0;
 
   if (copy != NULL)
index f943fd6..01e388a 100644 (file)
@@ -31,8 +31,13 @@ td_thr_getfpregs (const td_thrhandle_t *th, prfpregset_t *regset)
 
   if (th->th_unique == 0)
     /* Special case for the main thread before initialization.  */
+#ifndef PTHREAD_T_IS_TID
     return ps_lgetfpregs (th->th_ta_p->ph, ps_getpid (th->th_ta_p->ph),
                          regset) != PS_OK ? TD_ERR : TD_OK;
+#else
+    return ps_lgetfpregs (th->th_ta_p->ph, FIRST_THREAD_TID,
+                         regset) != PS_OK ? TD_ERR : TD_OK;
+#endif
 
   /* We have to get the state and the PID for this thread.  */
   err = DB_GET_FIELD (cancelhandling, th->th_ta_p, th->th_unique, pthread,
index 8d83a80..5cbf440 100644 (file)
@@ -31,8 +31,13 @@ td_thr_getgregs (const td_thrhandle_t *th, prgregset_t regset)
 
   if (th->th_unique == 0)
     /* Special case for the main thread before initialization.  */
+#ifndef PTHREAD_T_IS_TID
     return ps_lgetregs (th->th_ta_p->ph, ps_getpid (th->th_ta_p->ph),
                        regset) != PS_OK ? TD_ERR : TD_OK;
+#else
+    return ps_lgetregs (th->th_ta_p->ph, FIRST_THREAD_TID,
+                       regset) != PS_OK ? TD_ERR : TD_OK;
+#endif
 
   /* We have to get the state and the PID for this thread.  */
   err = DB_GET_FIELD (cancelhandling, th->th_ta_p, th->th_unique, pthread,
index 1ec4b1f..a0d73b4 100644 (file)
@@ -31,8 +31,13 @@ td_thr_setfpregs (const td_thrhandle_t *th, const prfpregset_t *fpregs)
 
   if (th->th_unique == 0)
     /* Special case for the main thread before initialization.  */
+#ifndef PTHREAD_T_IS_TID
     return ps_lsetfpregs (th->th_ta_p->ph, ps_getpid (th->th_ta_p->ph),
                          fpregs) != PS_OK ? TD_ERR : TD_OK;
+#else
+    return ps_lsetfpregs (th->th_ta_p->ph, FIRST_THREAD_TID,
+                         fpregs) != PS_OK ? TD_ERR : TD_OK;
+#endif
 
   /* We have to get the state and the PID for this thread.  */
   err = DB_GET_FIELD (cancelhandling, th->th_ta_p, th->th_unique, pthread,
index f842f7c..5cd6f98 100644 (file)
@@ -31,8 +31,13 @@ td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs)
 
   if (th->th_unique == 0)
     /* Special case for the main thread before initialization.  */
+#ifndef PTHREAD_T_IS_TID
     return ps_lsetregs (th->th_ta_p->ph, ps_getpid (th->th_ta_p->ph),
                        gregs) != PS_OK ? TD_ERR : TD_OK;
+#else
+    return ps_lsetregs (th->th_ta_p->ph, FIRST_THREAD_TID,
+                       gregs) != PS_OK ? TD_ERR : TD_OK;
+#endif
 
   /* We have to get the state and the PID for this thread.  */
   err = DB_GET_FIELD (cancelhandling, th->th_ta_p, th->th_unique, pthread,
index 85c7f01..38d3c14 100644 (file)
@@ -43,8 +43,13 @@ td_thr_tlsbase (const td_thrhandle_t *th,
         attempted too early.  Tough.  */
 
       td_thrhandle_t main_th;
+#ifndef PTHREAD_T_IS_TID
       err = __td_ta_lookup_th_unique (th->th_ta_p, ps_getpid (th->th_ta_p->ph),
                                      &main_th);
+#else
+      err = __td_ta_lookup_th_unique (th->th_ta_p, FIRST_THREAD_TID,
+                                     &main_th);
+#endif
       if (err == 0)
        pd = main_th.th_unique;
       if (pd == 0)
index bf3e0d0..a0bc693 100644 (file)
@@ -23,9 +23,11 @@ subdir          := rtld_db
 extra-libs = librtld_db
 extra-libs-others := $(extra-libs)
 
-headers         = rtld_db.h
+headers         := rtld_db.h
 
 librtld_db-routines = rd_init rd_new rd_reset rd_delete rd_loadobj_iter \
     rd_log rd_get_dyns
 
+include ../Makeconfig
+
 include ../Rules
index 1205cc4..459ffaf 100644 (file)
@@ -31,7 +31,8 @@ sysdep_routines +=  gethrtime mount umount umount2 systeminfo resolvepath \
     utssys zone port sendfilev sendfilev64 sig2str _so_accept _so_bind \
     _so_connect _so_getpeername _so_getsockname _so_getsockopt _so_listen \
     _so_send _so_sendmsg _so_sendto _so_setsockopt _so_shutdown _so_socket \
-    _so_socketpair _sysconfig rctl atomic door getexecname
+    _so_socketpair _sysconfig rctl atomic door getexecname is_system_labeled \
+    privP
 sysdep_routines += sys_fdsync sys_brk sys_fcntl sys_utssys sys_lwp_private \
     sys_uname sys_getloadavg sys_utimes sys_getpeerucred sys_ucred_get \
     sys_privsys sys_syslabeling sys_putmsg sys_putpmsg sys_meminfo \
index 9e247e6..f040500 100644 (file)
@@ -31,7 +31,7 @@ libc {
     getzoneidbyname; getzonenamebyid;
 
     # i
-    idmap_reg; idmap_unreg; issetugid;
+    idmap_reg; idmap_unreg; issetugid; is_system_labeled;
 
     # l
     llseek;
@@ -45,10 +45,15 @@ libc {
 
     # p
     pc_sample; p_online; priocntl; priocntlset; __priv_free_info;
-    __priv_getbynum; __priv_getdata; __priv_getsetbyname; __priv_getsetbynum;
     __priv_parse_info; processor_bind; processor_info; port_alert;
     port_associate; port_create; port_dissociate; port_get; port_getn;
-    port_send; port_sendn; pset_assign; pset_bind; pset_create; pset_destroy;
+    port_send; port_sendn; priv_allocset; priv_addset; priv_copyset;
+    priv_delset; priv_emptyset; priv_fillset;
+    priv_freeset; priv_getbyname; priv_getbynum; priv_getsetbyname;
+    priv_getsetbynum; priv_gettext; priv_ineffect; priv_intersect;
+    priv_inverse; priv_isemptyset; priv_isequalset; priv_isfullset;
+    priv_ismember; priv_issubset; priv_set; priv_set_to_str; priv_str_to_set;
+    priv_union; pset_assign; pset_bind; pset_create; pset_destroy;
     pset_getattr; pset_getloadavg; pset_info; pset_list; pset_setattr; putacct;
 
     # r
@@ -71,7 +76,7 @@ libc {
     _ttyname_dev;
 
     # u
-    uadmin; ucred_free; ucred_get; ucred_getegid; ucred_geteuid;
+    uadmin; _ucred_alloc; ucred_free; ucred_get; ucred_getegid; ucred_geteuid;
     ucred_getgroups; ucred_getlabel; ucred_getpflags; ucred_getpid;
     ucred_getprivset; ucred_getprojid; ucred_getrgid; ucred_getruid;
     ucred_getsgid; ucred_getsuid; ucred_getzoneid; ucred_size; umount;
index 4cb4cff..a84b5eb 100644 (file)
@@ -21,8 +21,7 @@
 #include <privP.h>
 #include <priv.h>
 #include <sys/priocntl.h>
-#include <alloca.h>
-#include <bits/libc-lock.h>
+#include <string.h>
 
 DECLARE_INLINE_SYSCALL (int, privsys, int code, priv_op_t op,
     priv_ptype_t type, void *buf, size_t bufsize, int itype);
@@ -30,8 +29,7 @@ DECLARE_INLINE_SYSCALL (int, privsys, int code, priv_op_t op,
 /* 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_lock_define_initialized_recursive (, __priv_lock);
 libc_freeres_ptr (static priv_impl_info_t *__info);
 
 const priv_impl_info_t * getprivimplinfo (void)
@@ -39,7 +37,7 @@ const priv_impl_info_t * getprivimplinfo (void)
   if (__info)
     return __info;
 
-  __libc_lock_lock (privimplinfo_lock);
+  __libc_lock_lock_recursive (__priv_lock);
 
   /* First call: get header.  */
   priv_impl_info_t _info;
@@ -59,19 +57,88 @@ const priv_impl_info_t * getprivimplinfo (void)
         }
     }
 
-  __libc_lock_unlock (privimplinfo_lock);
+  __libc_lock_unlock_recursive (__priv_lock);
   return __info;
 }
 
 
-priv_data_t * __priv_parse_info (priv_impl_info_t *ip)
+priv_set_t *priv_allocset (void)
+{
+  const priv_impl_info_t *pii = getprivimplinfo ();
+  if (!pii)
+    return NULL;
+
+  return malloc (pii->priv_setsize * sizeof (priv_chunk_t));
+}
+
+
+void priv_freeset (priv_set_t *sp)
+{
+  free (sp);
+}
+
+
+int priv_getbyname (const char *privname)
+{
+  const priv_data_t *pd = __priv_parse_data_cached ();
+  if (!pd)
+    return -1;
+
+  for (uint32_t i = 0; i < pd->pd_privnames_cnt; i++)
+    {
+      if (strcasecmp (pd->pd_privnames[i], privname) == 0)
+        return i;
+    }
+
+  __set_errno (EINVAL);
+  return -1;
+}
+
+
+const char *priv_getbynum (int privnum)
 {
-  /* TODO */
-  return NULL;
+  const priv_data_t *pd = __priv_parse_data_cached ();
+  if (!pd)
+    return NULL;
+
+  if (privnum < 0 || privnum >= pd->pd_privnames_cnt)
+    {
+      __set_errno (EINVAL);
+      return NULL;
+    }
+
+  return pd->pd_privnames[privnum];
 }
 
 
-void __priv_free_info (priv_data_t *d)
+int priv_getsetbyname (const char *privsetname)
 {
-  /* TODO */
+  const priv_data_t *pd = __priv_parse_data_cached ();
+  if (!pd)
+    return -1;
+
+  for (uint32_t i = 0; i < pd->pd_setnames_cnt; i++)
+    {
+      if (strcasecmp (pd->pd_setnames[i], privsetname) == 0)
+        return i;
+    }
+
+  __set_errno (EINVAL);
+  return -1;
+}
+
+
+const char *priv_getsetbynum (int privsetnum)
+{
+  const priv_data_t *pd = __priv_parse_data_cached ();
+  if (!pd)
+    return NULL;
+
+  if (privsetnum < 0 || privsetnum >= pd->pd_setnames_cnt)
+    {
+      __set_errno (EINVAL);
+      return NULL;
+    }
+
+  return pd->pd_setnames[privsetnum];
 }
index f31dc02..6232991 100644 (file)
 
 __BEGIN_DECLS
 
-extern int getppriv (priv_ptype_t which, priv_set_t *set);
+extern int setppriv (priv_op_t, priv_ptype_t, const priv_set_t *);
+extern int getppriv (priv_ptype_t, priv_set_t *);
+extern int setpflags (unsigned int, unsigned int);
+extern unsigned int getpflags (unsigned int);
+extern const priv_impl_info_t *getprivimplinfo (void);
 
-extern int setppriv (priv_op_t op, priv_ptype_t which, priv_set_t *set);
+extern int priv_set (priv_op_t, priv_ptype_t, ...);
+extern boolean_t priv_ineffect(const char *);
 
-extern unsigned int getpflags (unsigned int flag);
+extern priv_set_t *priv_str_to_set (const char *, const char *, const char **);
+extern char *priv_set_to_str (const priv_set_t *, char, int);
 
-extern int setpflags (unsigned int flag, unsigned int value);
+extern int priv_getbyname (const char *);
+extern const char *priv_getbynum (int);
+extern int priv_getsetbyname (const char *);
+extern const char *priv_getsetbynum (int);
 
-extern priv_set_t *priv_str_to_set (const char *buf, const char *sep,
-     const char **endptr);
+extern char *priv_gettext (const char *);
 
-extern char *priv_set_to_str (const priv_set_t *set, char sep, int flag);
+extern priv_set_t *priv_allocset (void);
+extern void priv_freeset (priv_set_t *);
 
-extern int priv_getbyname (const char *privname);
+extern void priv_emptyset (priv_set_t *);
+extern void priv_fillset (priv_set_t *);
 
-extern const char *priv_getbynum (int privnum);
+extern boolean_t priv_isemptyset (const priv_set_t *);
+extern boolean_t priv_isfullset (const priv_set_t *);
+extern boolean_t priv_isequalset (const priv_set_t *, const priv_set_t *);
+extern boolean_t priv_issubset (const priv_set_t *, const priv_set_t *);
+extern boolean_t priv_ismember (const priv_set_t *, const char *);
 
-extern int priv_getsetbyname (const char *privsetname);
+extern void priv_intersect (const priv_set_t *, priv_set_t *);
+extern void priv_union (const priv_set_t *, priv_set_t *);
+extern void priv_inverse (priv_set_t *);
 
-extern const char *priv_getsetbynum (int privname);
-
-extern char *priv_gettext (const char *privname);
-
-extern const priv_impl_info_t * getprivimplinfo (void);
+extern int priv_addset (priv_set_t *, const char *);
+extern void priv_copyset (const priv_set_t *, priv_set_t *);
+extern int priv_delset (priv_set_t *, const char *);
 
 __END_DECLS
 
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/privP.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/privP.c
new file mode 100644 (file)
index 0000000..876bdd0
--- /dev/null
@@ -0,0 +1,125 @@
+/* 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 <priv.h>
+#include <bits/libc-lock.h>
+
+__libc_lock_define_recursive (extern, __priv_lock);
+libc_freeres_ptr (static priv_data_t *__data);
+
+priv_data_t * __priv_parse_info (priv_impl_info_t *pii)
+{
+  priv_data_t *data = malloc (sizeof (priv_data_t));
+  if (!data)
+    return NULL;
+  memset (data, 0, sizeof (*data));
+  data->pd_setsize = pii->priv_setsize * sizeof (priv_chunk_t);
+
+  /* Iterate over all priv_info_t's. Note that the first priv_info_t follows
+     the header.  */
+  priv_info_t *pi = (priv_info_t *)((char *)pii + pii->priv_headersize);
+  uint32_t left = pii->priv_headersize + pii->priv_globalinfosize;
+  while (left)
+    {
+      switch (pi->priv_info_type)
+        {
+        case PRIV_INFO_SETNAMES:
+        case PRIV_INFO_PRIVNAMES:
+          if ((pi->priv_info_type == PRIV_INFO_SETNAMES &&
+                data->pd_setnames) || (pi->priv_info_type ==
+                PRIV_INFO_PRIVNAMES && data->pd_privnames))
+            break;
+
+          /* XXX: In priv_get*byname we linearlly scan the list of strins;
+             we could speed this up by sorting the strings here.  */
+
+          priv_info_names_t *pi_names = (priv_info_names_t *)pi;
+
+          /* Allocate memory for the index.  */
+          char **name_list = malloc (sizeof (char *) * pi_names->cnt);
+          if (!name_list)
+            goto err;
+          if (pi->priv_info_type == PRIV_INFO_SETNAMES)
+            data->pd_setnames = name_list;
+          else
+            data->pd_privnames = name_list;
+          data->pd_privnames_cnt = pi_names->cnt;
+
+          /* Setup the index.  */
+          char *names_ptr = pi_names->names;
+          char **end_list = name_list + pi_names->cnt;
+          while (name_list < end_list)
+            {
+              *name_list = names_ptr;
+              names_ptr += strlen (names_ptr);
+            }
+
+          break;
+
+        case PRIV_INFO_BASICPRIVS:
+          if (data->pd_basicprivs)
+            break;
+
+          if (pi->priv_info_size != data->pd_setsize)
+            break;
+          data->pd_basicprivs = ((priv_info_set_t *)pi)->set;
+
+          break;
+        }
+
+      left -= pi->priv_info_size;
+      pi = (priv_info_t *)((char *)pi + pi->priv_info_size);
+    }
+
+  return data;
+
+err:
+
+  free (data->pd_setnames);
+  free (data->pd_privnames);
+  free (data);
+
+  return NULL;
+}
+
+
+void __priv_free_info (priv_data_t *data)
+{
+  free (data->pd_setnames);
+  free (data->pd_privnames);
+  free (data);
+}
+
+
+const priv_data_t * __priv_parse_data_cached (void)
+{
+  if (__data)
+    return __data;
+
+  __libc_lock_lock_recursive (__priv_lock);
+
+  const priv_impl_info_t *pii = getprivimplinfo ();
+  if (pii)
+    __data = __priv_parse_info (pii);
+
+  __libc_lock_unlock_recursive (__priv_lock);
+
+  return __data;
+}
index 62b18b2..3ab8158 100644 (file)
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <priv.h>
+#include <sys/priv.h>
 
 typedef struct priv_data
-{
-} priv_data_t;
+  {
+       size_t pd_setsize;
+       uint32_t pd_setnames_cnt;
+       char **pd_setnames;
+       uint32_t pd_privnames_cnt;
+       char **pd_privnames;
+       priv_chunk_t *pd_basicprivs;
+  } priv_data_t;
+
+
+extern const priv_data_t * __priv_parse_data_cached (void);
index 38c5a93..7673293 100644 (file)
@@ -129,7 +129,7 @@ struct door_results
        size_t data_size;
        door_desc_t *desc_ptr;
        size_t desc_num;
-       void (*pc)();
+       void (*pc)(void);
        int nservers;
        door_info_t *door_info;
   };
index eed8caf..e6b0cb9 100644 (file)
@@ -74,6 +74,12 @@ typedef struct priv_info
        uint32_t priv_info_size;
 } priv_info_t;
 
+typedef struct priv_info_uint
+{
+       priv_info_t info;
+       uint_t val;
+} priv_info_uint_t;
+
 typedef struct priv_info_set
 {
        priv_info_t info;
@@ -100,4 +106,11 @@ typedef struct priv_info_names
 #define PRIV_ALLZONE   (-4)
 #define PRIV_GLOBAL    (-5)
 
+#define PRIV_INFO_SETNAMES     1
+#define PRIV_INFO_PRIVNAMES    2
+#define PRIV_INFO_BASICPRIVS   3
+#define PRIV_INFO_FLAGS                4
+
+
+
 #endif /* _SYS_PRIV_H */
index c1aa78f..4abfd6e 100644 (file)
 #define SYS_SUB_zone_check_datalink 12
 #define SYS_SUB_zone_list_datalink  13
 
+/* SYS_labelsys */
+#define SYS_SUB_syslabeling         1
+#define SYS_SUB_tnrh                2
+#define SYS_SUB_tnrhtp              3
+#define SYS_SUB_tnmlp               4
+#define SYS_SUB_getlabel            5
+#define SYS_SUB_pgetlabel           6
+
 #endif /* _SYSCALL_PRIV_H */
index c639d0e..0d55869 100644 (file)
@@ -9,14 +9,10 @@ acctctl             - acctctl               i:ipi       acctctl
 acl                 - acl                   i:siip      acl
 clock_getres        - clock_getres          i:ip        clock_getres
 creat               - creat                 Ci:si       __libc_creat        creat
-faccessat           - fsat:accessat         i:isi       faccessat
 facl                - facl                  i:iiip      facl
-fchownat            - fsat:fchownat         i:isiii     fchownat
 fpathconf           - fpathconf             i:ii        __fpathcon          fpathconf
 fstatvfs            - fstatvfs              i:ip        __fstatvfs          fstatvfs
 fstatvfs64          - fstatvfs64            i:ip        __fstatvfs64        fstatvfs64
-futimesat           - fsat:futimesat        i:isi       futimesat
-getacct             - exacctsys:getacct     i:iipi      getacct
 getcpuid            - getcpuid              i:          getcpuid
 getpflags           - privsys:getpflags     i:i         getpflags
 getmsg              - getmsg                i:ppp       getmsg
@@ -39,30 +35,17 @@ memcntl             - memcntl               i:piiiii    memcntl
 mincore             - mincore               i:anV       mincore
 mmap64              - mmap64                i:piiiii    __mmap64            mmap64
 mount               - mount                 i:ppippipi  __mount             mount
-msgctl              - msgsys:msgctl         i:iip       __msgctl            msgctl
-msgget              - msgsys:msgget         i:ii        __msgget            msgget
-msgrcv              - msgsys:msgrcv         Ci:ipiii    __libc_msgrcv       msgrcv
-msgsnd              - msgsys:msgsnd         Ci:ipii     __msgsnd            msgsnd
 nanosleep           - nanosleep             Ci:pP       __libc_nanosleep    __nanosleep nanosleep
-ntp_adjtime         - ntp_adjtime           i:p         __adjtimex          adjtimex ntp_adjtime __adjtimex_internal
-ntp_gettime         - ntp_gettime           i:p         ntp_gettime
 pathconf            - pathconf              i:pi        __pathconf          pathconf
 pcsample            - pcsample              i:pi        pcsample
-p_online            - p_online              i:ii        p_online
 ppoll               - pollsys               Ci:pipp     ppoll
 pread               - pread                 Ci:iPii     __libc_pread        __pread pread
 pread64             - pread64               Ci:iPii     __libc_pread64      __pread64 pread64
 profil              - profil                :piii       __profil            profil
-putacct             - exacctsys:putacct     i:iipii     putacct
 pwrite              - pwrite                Ci:iPii     __libc_pwrite       __pwrite pwrite
 pwrite64            - pwrite64              Ci:iPii     __libc_pwrite64     __pwrite64 pwrite64
-renameat            - fsat:renameat         i:isis      renameat
 resolvepath         - resolvepath           i:spi       resolvepath
 sched_yield         - yield                 i:          __sched_yield       sched_yield
-semctl              - semsys:semctl         i:iiiv      semctl
-semget              - semsys:semget         i:iii       semget
-semop               - semsys:semop          i:ipi       semop
-semtimedop          - semsys:semtimedop     i:ipip      semtimedop
 setcontext          - context:setcontext    i:p         __setcontext        setcontext
 setpgid             - pgrpsys:setpgid       i:ii        __setpgid           setpgid
 setpgrp             - pgrpsys:setpgrp       i:          __setpgrp           setpgrp
@@ -87,16 +70,42 @@ systeminfo          - systeminfo            i:ipi       sysinfo
 swapctl             - uadmin:swapctl        i:ip        swapctl
 uadmin              - uadmin                i:iii       __uadmin            uadmin
 umount2             - umount2               i:si        umount2
-unlinkat            - fsat:unlinkat         i:isi       unlinkat
 utssys              - utssys                i:piip      utssys
 uucopy              - uucopy                i:ppi       uucopy
 uucopystr           - uucopystr             i:ppi       uucopystr
 vhangup             - vhangup               i:          vhangup
 waitid              - waitid                Ci:iipi     __waitid            waitid
-wracct              - exacctsys             i:iii       wracct
 xmknod              - xmknod                i:isii      __xmknod            _xmknod
 
-# core_*
+# msg
+msgctl              - msgsys:msgctl         i:iip       __msgctl            msgctl
+msgget              - msgsys:msgget         i:ii        __msgget            msgget
+msgrcv              - msgsys:msgrcv         Ci:ipiii    __libc_msgrcv       msgrcv
+msgsnd              - msgsys:msgsnd         Ci:ipii     __msgsnd            msgsnd
+
+# exacctsys
+getacct             - exacctsys:getacct     i:iipi      getacct
+putacct             - exacctsys:putacct     i:iipii     putacct
+wracct              - exacctsys:wracct      i:iii       wracct
+
+# *at
+faccessat           - fsat:accessat         i:isi       faccessat
+fchownat            - fsat:fchownat         i:isiii     fchownat
+futimesat           - fsat:futimesat        i:isi       futimesat
+renameat            - fsat:renameat         i:isis      renameat
+unlinkat            - fsat:unlinkat         i:isi       unlinkat
+
+# ntp
+ntp_adjtime         - ntp_adjtime           i:p         __adjtimex          adjtimex ntp_adjtime __adjtimex_internal
+ntp_gettime         - ntp_gettime           i:p         ntp_gettime
+
+# sem
+semctl              - semsys:semctl         i:iiiv      semctl
+semget              - semsys:semget         i:iii       semget
+semop               - semsys:semop          i:ipi       semop
+semtimedop          - semsys:semtimedop     i:ipip      semtimedop
+
+# corectl
 core_get_default_content    - corectl:core_get_default_content  i:p core_get_default_content
 core_get_default_path   - corectl:core_get_default_path i:pi    core_get_default_path
 core_get_global_content - corectl:core_get_global_content   i:p     core_get_global_content
@@ -112,7 +121,7 @@ core_set_options    - corectl:core_set_options  i:i     core_set_options
 core_set_process_content    - corectl:core_set_process_content  i:pi    core_set_process_content
 core_set_process_path   - corectl:core_set_process_path i:pii   core_set_process_path
 
-# zone_*
+# zones
 zone_add_datalink   - zone:zone_add_datalink i:is       zone_add_datalink
 zone_boot           - zone:zone_boot        i:i         zone_boot
 zone_check_datalink - zone:zone_check_datalink  i:ps    zone_check_datalink
@@ -126,7 +135,8 @@ zone_setattr        - zone:zone_setattr     i:iipi      zone_setattr
 zone_shutdown       - zone:zone_shutdown    i:i         zone_shutdown
 zone_version        - zone:zone_version     i:p         zone_version
 
-# processor_*, pset_*
+# processor
+p_online            - p_online              i:ii        p_online
 processor_bind      - processor_bind        i:iiip      processor_bind
 processor_info      - processor_info        i:ip        processor_info
 pset_create         - pset:pset_create      i:p         pset_create
@@ -139,7 +149,6 @@ pset_setattr        - pset:pset_setattr     i:ii        pset_setattr
 pset_getattr        - pset:pset_getattr     i:ip        pset_getattr
 
 # sockets
-
 _so_accept          - accept                Ci:iBN      _so_accept
 _so_bind            - bind                  i:ipii      _so_bind
 _so_connect         - connect               Ci:ipi      _so_connect
@@ -160,6 +169,7 @@ _so_socketpair      - so_socketpair         i:p         _so_socketpair
 
 # misc
 _sysconfig          - sysconfig             i:i         _sysconfig
+is_system_labeled   - labelsys:syslabeling  i:          is_system_labeled
 
 #
 # implement these in helper files
@@ -181,7 +191,6 @@ sys_getdents        - getdents              i:ipi       __syscall_getdents
 sys_getdents64      - getdents64            i:ipi       __syscall_getdents64
 sys_getloadavg      - getloadavg            i:pi        __syscall_getloadavg
 sys_getpeerucred    - ucredsys:getpeerucred i:ip        __syscall_getpeerucred
-sys_syslabeling     - labelsys              i:          __syscall_syslabeling
 sys_lstat           - lstat                 i:sp        __syscall_lstat
 sys_lstat64         - lstat64               i:sp        __syscall_lstat64
 sys_lwp_private     - lwp_private           i:iii       __syscall_lwp_private
index e4a120c..4e606ab 100644 (file)
 
 DECLARE_INLINE_SYSCALL (int, getpeerucred, int fd, ucred_t *ucred);
 DECLARE_INLINE_SYSCALL (int, ucred_get, pid_t pid, ucred_t *ucred);
-DECLARE_INLINE_SYSCALL (int, syslabeling, void);
 
 /* Docs: http://docs.sun.com/app/docs/doc/816-5168/ucred-get-3c?a=view
          http://docs.sun.com/app/docs/doc/816-5168/getpeerucred-3c?l=ru&a=view */
 
-ucred_t *ucred_get (pid_t pid)
+
+ucred_t *_ucred_alloc (void)
 {
   size_t uc_size = ucred_size ();
   ucred_t *uc = malloc (uc_size);
+  if (uc)
+    uc->uc_size = uc_size;
+  return uc;
+}
+
+
+ucred_t *ucred_get (pid_t pid)
+{
+  ucred_t *uc = _ucred_alloc ();
   if (!uc)
     return NULL;
-  uc->uc_size = uc_size;
 
-  INLINE_SYSCALL (ucred_get, 2, pid, uc);
+  int res = INLINE_SYSCALL (ucred_get, 2, pid, uc);
+  if (res != 0)
+    return NULL;
 
   return uc;
 }
@@ -76,7 +86,7 @@ int ucred_getgroups (const ucred_t *uc, const gid_t **groups)
 {
   if (uc->uc_credoff == 0 || groups == NULL)
     {
-      __set_errno(EINVAL);
+      __set_errno (EINVAL);
       return -1;
     }
 
@@ -92,14 +102,23 @@ int ucred_getgroups (const ucred_t *uc, const gid_t **groups)
 }
 
 
-#if 0
 const priv_set_t *ucred_getprivset (const ucred_t *uc, const char *set)
 {
-  // TODO
-  __set_errno (ENOSYS);
-  return NULL;
+  /* Get prpriv_t.  */
+  if (uc->uc_privoff == 0)
+    {
+      __set_errno (EINVAL);
+      return NULL;
+    }
+  prpriv_t * pr = (prpriv_t *)((char *)uc + uc->uc_privoff);
+
+  /* Get priv set number.  */
+  int setnum = priv_getsetbyname (set);
+  if (setnum == -1)
+    return NULL;
+
+  return (priv_set_t *)&pr->pr_sets[setnum * pr->pr_setsize];
 }
-#endif
 
 
 pid_t ucred_getpid (const ucred_t *uc)
@@ -129,20 +148,40 @@ zoneid_t ucred_getzoneid (const ucred_t *uc)
 }
 
 
-#if 0
 unsigned int ucred_getpflags (const ucred_t *uc, unsigned int flags)
 {
-  // TODO
-  __set_errno (ENOSYS);
-  return -1;
+  /* Get prpriv_t.  */
+  if (uc->uc_privoff == 0)
+    {
+      __set_errno (EINVAL);
+      return (unsigned int)-1;
+    }
+  prpriv_t *pr = (prpriv_t *)((char *)uc + uc->uc_privoff);
+
+  /* Iterate over all priv_info_t's. Note that the first priv_info_t follows
+     the list of priv sets.  */
+  priv_info_t * pi = (priv_info_t *)&pr->pr_sets[pr->pr_nsets * pr->pr_setsize];
+  uint32_t left = pr->pr_infosize;
+  while (left)
+    {
+      if (pi->priv_info_type == PRIV_INFO_FLAGS)
+        return ((priv_info_uint_t *)pi)->val & flags;
+
+      left -= pi->priv_info_size;
+      pi = (priv_info_t *)((char *)pi + pi->priv_info_size);
+    }
+
+  /* We didn't find PRIV_INFO_FLAGS.  */
+  __set_errno (EINVAL);
+  return (unsigned int)-1;
 }
-#endif
 
 
 m_label_t *ucred_getlabel (const ucred_t *uc)
 {
-  int syslabeling = INLINE_SYSCALL (syslabeling, 0);
-  if (!syslabeling || uc->uc_labeloff == 0)
+  extern int is_system_labeled (void);
+
+  if (!is_system_labeled () || uc->uc_labeloff == 0)
     {
       __set_errno (EINVAL);
       return NULL;
@@ -159,7 +198,6 @@ size_t ucred_size (void)
     /* ucred_size cannot fail.  */
     assert (info);
 
-    /* XXX: We shouldn't use AUDITINFO64_ADDR_T_SIZE and BSLABEL_T_SIZE.  */
     return UCRED_SIZE (info);
 }
 
@@ -171,19 +209,17 @@ int getpeerucred (int fd, ucred_t **ucred)
   /* alloc ucred if needed */
   if(*ucred == NULL)
     {
-      size_t uc_size = ucred_size ();
-      ucred_t *uc = malloc (uc_size);
+      ucred_t *uc = _ucred_alloc ();
       if (!uc)
         return -1;
-      uc->uc_size = uc_size;
       *ucred = uc;
     }
 
-  int result = INLINE_SYSCALL (getpeerucred, 2, fd, uc);
-  if (result == -1 && *ucred == NULL)
+  int res = INLINE_SYSCALL (getpeerucred, 2, fd, uc);
+  if (res == -1 && *ucred == NULL)
       free (uc);
-  else if (result == 0 && *ucred == NULL)
+  else if (res == 0 && *ucred == NULL)
       *ucred = uc;
 
-  return result;
+  return res;
 }