Lots of magic
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Mon, 22 Sep 2008 10:39:59 +0000 (06:39 -0400)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Mon, 22 Sep 2008 10:39:59 +0000 (06:39 -0400)
43 files changed:
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mutex_reltimedlock.c [new file with mode: 0644]
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mutex_timedlock.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_mutex_reltimedlock_np.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Versions
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_fgetuserattr.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_getauthattr.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_getauthnam.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_getexecattr.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_getexecprof.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_nss_XbyY_fgets.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_sbrk_grow_aligned.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/atomic.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/bits/stat.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/deflt.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/door.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/doorP.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/exec_attrP.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fattach.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fdetach.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mountP.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/nss_common.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/nss_delete.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/nss_endent.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/nss_getent.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/nss_search.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/nss_setent.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/nss_sunP.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/privP.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/privP.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/priv_str.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ptsname.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sun_compat.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mount.h [deleted file]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/sysmacros.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ucredP.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/umount.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/vfsent.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/vfsentP.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/x86/bits/sigcontext.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/zone.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/zone.h [deleted file]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/zoneP.h

diff --git a/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mutex_reltimedlock.c b/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mutex_reltimedlock.c
new file mode 100644 (file)
index 0000000..95b9005
--- /dev/null
@@ -0,0 +1,109 @@
+/* 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 <pthreadP.h>
+#include <synch.h>
+#include <errno.h>
+#include <time.h>
+#include <synchP.h>
+#include <abstime-to-reltime.h>
+
+DECLARE_INLINE_SYSCALL (int, lwp_mutex_timedlock, mutex_t *lp,
+    struct timespec *tsp);
+
+extern int __mutex_lock_fast (mutex_t *mutex, bool try);
+
+
+int __mutex_timedlock (mutex, abstime)
+      mutex_t *mutex;
+      const struct timespec *abstime;
+{
+  /* Handle inconsistent robust mutexes.  */
+  if ((mutex->mutex_type & LOCK_ROBUST) &&
+      (mutex->mutex_flag & LOCK_NOTRECOVERABLE))
+    return ENOTRECOVERABLE;
+
+  /* Always hit the kernel for priority inherit locks.  */
+  if ((mutex->mutex_type & LOCK_PRIO_INHERIT) == 0)
+    {
+      int res = __mutex_lock_fast (mutex, false);
+      if(res >= 0)
+        return res;
+    }
+  else
+    {
+      /* Except when we already hold a recursive lock.  */
+      if ((mutex->mutex_type & LOCK_RECURSIVE) && MUTEX_IS_OWNER (mutex))
+        {
+          /* XXX: Solaris mutexes have no overflow check and don't know about
+             EAGAIN; in practice overflow will not occur so we don't care.  */
+          if (mutex->mutex_rcount == RECURSION_MAX)
+            return EAGAIN;
+          ++mutex->mutex_rcount;
+          return 0;
+        }
+    }
+
+  /* Reject invalid timeouts.  */
+  if (INVALID_TIMESPEC (abstime))
+    return EINVAL;
+
+  struct timespec _reltime;
+  struct timespec *reltime = abstime_to_reltime (abstime, &_reltime);
+  if (reltime && reltime->tv_sec < 0)
+    return ETIME;
+
+  int errval;
+  do
+    errval = INLINE_SYSCALL (lwp_mutex_timedlock, 2, mutex, reltime);
+  while (errval == EINTR);
+
+  /* The kernel sets EDEADLK for priority inherit mutexes.  */
+  if (errval == EDEADLK && (mutex->mutex_type & LOCK_PRIO_INHERIT) &&
+        (mutex->mutex_type & LOCK_ERRORCHECK) == 0)
+    {
+      /* We aren't an error checking mutex so we need to block.  */
+      INTERNAL_SYSCALL_DECL (err);
+      if (abstime)
+        {
+          int result = INTERNAL_SYSCALL (nanosleep, err, 2, reltime, reltime);
+          do
+            errval = INTERNAL_SYSCALL_ERRNO (result, err) ? EINTR : ETIMEDOUT;
+          while (errval == EINTR);
+        }
+      else
+        {
+          do
+            INTERNAL_SYSCALL (pause, err, 1, 0);
+          while (1);
+        }
+    }
+  if (errval != 0 && errval != EOWNERDEAD)
+    return errval;
+
+  /* The kernel does not set mutex_owner so we set it here.  */
+  mutex->mutex_owner = THREAD_GETMEM (THREAD_SELF, tid);
+
+  /* The kernel does not set the lockbyte for priority inherit mutexes.  */
+  if (mutex->mutex_type & LOCK_PRIO_INHERIT)
+    mutex->mutex_lockbyte = 1;
+
+  return errval;
+}
index 95b9005..ba6a0be 100644 (file)
 #include <inline-syscall.h>
 #include <pthreadP.h>
 #include <synch.h>
-#include <errno.h>
-#include <time.h>
-#include <synchP.h>
 #include <abstime-to-reltime.h>
 
-DECLARE_INLINE_SYSCALL (int, lwp_mutex_timedlock, mutex_t *lp,
-    struct timespec *tsp);
-
-extern int __mutex_lock_fast (mutex_t *mutex, bool try);
-
 
 int __mutex_timedlock (mutex, abstime)
       mutex_t *mutex;
       const struct timespec *abstime;
 {
-  /* Handle inconsistent robust mutexes.  */
-  if ((mutex->mutex_type & LOCK_ROBUST) &&
-      (mutex->mutex_flag & LOCK_NOTRECOVERABLE))
-    return ENOTRECOVERABLE;
-
-  /* Always hit the kernel for priority inherit locks.  */
-  if ((mutex->mutex_type & LOCK_PRIO_INHERIT) == 0)
-    {
-      int res = __mutex_lock_fast (mutex, false);
-      if(res >= 0)
-        return res;
-    }
-  else
-    {
-      /* Except when we already hold a recursive lock.  */
-      if ((mutex->mutex_type & LOCK_RECURSIVE) && MUTEX_IS_OWNER (mutex))
-        {
-          /* XXX: Solaris mutexes have no overflow check and don't know about
-             EAGAIN; in practice overflow will not occur so we don't care.  */
-          if (mutex->mutex_rcount == RECURSION_MAX)
-            return EAGAIN;
-          ++mutex->mutex_rcount;
-          return 0;
-        }
-    }
-
   /* Reject invalid timeouts.  */
   if (INVALID_TIMESPEC (abstime))
     return EINVAL;
 
   struct timespec _reltime;
   struct timespec *reltime = abstime_to_reltime (abstime, &_reltime);
-  if (reltime && reltime->tv_sec < 0)
-    return ETIME;
-
-  int errval;
-  do
-    errval = INLINE_SYSCALL (lwp_mutex_timedlock, 2, mutex, reltime);
-  while (errval == EINTR);
-
-  /* The kernel sets EDEADLK for priority inherit mutexes.  */
-  if (errval == EDEADLK && (mutex->mutex_type & LOCK_PRIO_INHERIT) &&
-        (mutex->mutex_type & LOCK_ERRORCHECK) == 0)
-    {
-      /* We aren't an error checking mutex so we need to block.  */
-      INTERNAL_SYSCALL_DECL (err);
-      if (abstime)
-        {
-          int result = INTERNAL_SYSCALL (nanosleep, err, 2, reltime, reltime);
-          do
-            errval = INTERNAL_SYSCALL_ERRNO (result, err) ? EINTR : ETIMEDOUT;
-          while (errval == EINTR);
-        }
-      else
-        {
-          do
-            INTERNAL_SYSCALL (pause, err, 1, 0);
-          while (1);
-        }
-    }
-  if (errval != 0 && errval != EOWNERDEAD)
-    return errval;
-
-  /* The kernel does not set mutex_owner so we set it here.  */
-  mutex->mutex_owner = THREAD_GETMEM (THREAD_SELF, tid);
-
-  /* The kernel does not set the lockbyte for priority inherit mutexes.  */
-  if (mutex->mutex_type & LOCK_PRIO_INHERIT)
-    mutex->mutex_lockbyte = 1;
-
-  return errval;
+  return __mutex_reltimedlock (mutex, reltime);
 }
diff --git a/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_mutex_reltimedlock_np.c b/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_mutex_reltimedlock_np.c
new file mode 100644 (file)
index 0000000..7d94d21
--- /dev/null
@@ -0,0 +1,36 @@
+/* Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
+   OpenSolaris bits 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 <pthreadP.h>
+#include <synch.h>
+
+int
+pthread_mutex_reltimedlock_np (mutex, reltime)
+     pthread_mutex_t *mutex;
+     const struct timespec *reltime;
+{
+  int errval = __mutex_reltimedlock ((mutex_t *)mutex, reltime);
+  if (errval == ETIME)
+    return ETIMEDOUT;
+  else if (errval == EINTR)
+    return 0;
+  return errval;
+}
index b327ca8..9061972 100644 (file)
@@ -34,15 +34,16 @@ sysdep_routines +=  gethrtime mount umount umount2 systeminfo resolvepath \
     _so_socketpair _sysconfig rctl atomic door getexecname is_system_labeled \
     privP modctl acl facl lltostr ulltostr deflt _getauthnam _getauthattr \
     _getprofnam _getprofattr _getusernam _getuserattr _getauuserent \
-    _getauusernam vfsent fdwalk closefrom ipsecalg gethostent sigsendset \
-    sigsend stack_getbounds thr_sighndlrinfo sun_compat mkdev nss_getent \
-    nss_setent nss_endent nss_search nss_misc
+    _getauusernam _getexecattr vfsent fdwalk closefrom ipsecalg gethostent \
+    sigsendset sigsend stack_getbounds thr_sighndlrinfo sun_compat mkdev \
+    nss_getent nss_setent nss_endent nss_search nss_delete nss_misc \
+    _nss_XbyY_fgets _getexecprof _fgetuserattr priv_str _sbrk_grow_aligned
 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_putmsg sys_putpmsg sys_meminfo sys_pset_getloadavg \
     sys_zone_create sys_allocids sys_settaskid sys_zone_lookup sys_port \
     sys_door
-sysdep_headers += sys/feature_tests.h sys/mount.h sys/dirent.h sys/utime.h \
+sysdep_headers += sys/feature_tests.h sys/dirent.h sys/utime.h \
     sys/systeminfo.h sys/link.h sys/procfs_isa.h sys/ttold.h \
     sys/priocntl.h sys/procset.h sys/ptyvar.h sys/synch.h sys/fork.h \
     sys/sockio.h sys/ioccom.h sys/tty.h sys/trap.h sys/sysconfig.h \
@@ -51,8 +52,7 @@ sysdep_headers += sys/feature_tests.h sys/mount.h sys/dirent.h sys/utime.h \
     sys/int_types.h sys/machelf.h sys/inttypes.h sys/atomic.h sys/machtypes.h
 sysdep_headers += procfs.h nss_common.h \
     rtld_db.h pcsample.h atomic.h bits/machtypes.h
-headers := $(filter-out sys/sysinfo.h,$(headers))
-headers := $(filter-out sys/sysmacros.h,$(headers))
+headers := $(filter-out sys/sysinfo.h, $(headers))
 endif
 
 ifeq ($(subdir),dirent)
@@ -65,6 +65,7 @@ endif
 
 ifeq ($(subdir),posix)
 sysdep_routines += exit-thread schedP
+headers := $(filter-out sys/sysmacros.h, $(headers))
 endif
 
 ifeq ($(subdir),resource)
index 9b5b838..13aebbb 100644 (file)
@@ -34,22 +34,23 @@ libc {
     door_server_create; door_setparam; door_ucred; door_unbind;
 
     # e
-    _endauuser; _endauthattr; _endprofattr; _enduserattr;
+    _endauuser; _endauthattr; _endexecattr; _endprofattr; _enduserattr;
 
     # f
-    facl; fdwalk; __fgetgrent_r_sun; __fgetpwent_r_sun; __fini_daemon_priv;
-    fork1; freehostent; freeipsecalgent;
+    facl; fdwalk; __fgetgrent_r_sun; __fgetpwent_r_sun; _fgetuserattr;
+    __fini_daemon_priv; fork1; freehostent; freeipsecalgent;
 
     # g
     getacct; _getauuserent; _getauusernam; _getauthattr; _getauthnam; getcpuid;
-    getexecname; gethrtime; gethrvtime; getextmntent; __getgrent_r_sun;
-    __getgrgid_r_sun; __getgrnam_r_sun; getipnodebyaddr; getipnodebyname;
-    getipsecalgbyname; getipsecalgbynum; getmntany; getmntent; __getopt_sun;
-    getpagesizes; getpagesizes2; getpeerucred; getpflags; getppriv;
-    getprivimplinfo; _getprofattr; _getprofnam; getprojid; __getpwent_r_sun;
-    __getpwnam_r_sun; __getpwuid_r_sun; getrctl; gettaskid; _getuserattr;
-    _getusernam; getustack; getvfsany; getvfsent; getvfsfile; getvfsspec;
-    getvmusage; getzoneid; getzoneidbyname; getzonenamebyid;
+    _getexecattr; getexecname; _getexecprof; getextmntent; gethrtime;
+    gethrvtime; __getgrent_r_sun; __getgrgid_r_sun; __getgrnam_r_sun;
+    getipnodebyaddr; getipnodebyname; getipsecalgbyname; getipsecalgbynum;
+    getmntany; getmntent; __getopt_sun; getpagesizes; getpagesizes2;
+    getpeerucred; getpflags; getppriv; getprivimplinfo; _getprofattr;
+    _getprofnam; getprojid; __getpwent_r_sun; __getpwnam_r_sun;
+    __getpwuid_r_sun; getrctl; gettaskid; _getuserattr; _getusernam; getustack;
+    getvfsany; getvfsent; getvfsfile; getvfsspec; getvmusage; getzoneid;
+    getzoneidbyname; getzonenamebyid;
 
     # h
     hasmntopt;
@@ -92,13 +93,14 @@ libc {
     res_nclose; resolvepath;
 
     # s
-    sendfilev; sendfilev64; _setauuser; _setauthattr; setpflags; setppriv;
-    _setprofattr; setprojrctl; setrctl; settaskid; _setuserattr; setustack;
-    sig2str; sigsend; sigsendset;_so_accept; _so_bind; _so_connect; _so_getpeername;
+    _sbrk_grow_aligned; sendfilev; sendfilev64; _setauuser; _setauthattr;
+    _setexecattr; setpflags; setppriv; _setprofattr; setprojrctl; setrctl;
+    settaskid; _setuserattr; setustack; sig2str; sigsend; sigsendset;
+    __sigwait_sun; _so_accept; _so_bind; _so_connect; _so_getpeername;
     _so_getsockname; _so_getsockopt; _so_listen; _so_recv; _so_recvfrom;
     _so_recvmsg; _so_send; _so_sendmsg; _so_sendto; _so_setsockopt;
-    _so_shutdown; _so_socket; _so_socketpair; stack_getbounds; str2sig;
-    strlcat; strlcpy; swapctl; _sysconf; __systemcall; sysfs; systeminfo;
+    _so_shutdown; _so_socket; _so_socketpair; stack_getbounds; str2sig; strlcat;
+    strlcpy; swapctl; _sysconf; __systemcall; sysfs; systeminfo;
 
     # t
     thr_sighndlrinfo; _ttyname_dev;
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_fgetuserattr.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_fgetuserattr.c
new file mode 100644 (file)
index 0000000..0391463
--- /dev/null
@@ -0,0 +1,30 @@
+/* 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 <user_attrP.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stddef.h>
+
+userstr_t * _fgetuserattr (FILE *f, userstr_t *result, char *buffer,
+      int buflen)
+{
+  assert (!"_fgetuserattr not implemented");
+  return NULL;
+}
index cac57e4..c3c14bf 100644 (file)
@@ -24,7 +24,7 @@
 #define        GETFUNC_NAME    _getauthattr
 #define        ENDFUNC_NAME    _endauthattr
 #define DATABASE_NAME  passwd
-#define BUFLEN         NSS_BUFLEN_PROFATTR
+#define BUFLEN         NSS_BUFLEN_AUTHATTR
 
 #include "../nss/getXXent_r.c"
 
index 008a53f..8872cb0 100644 (file)
@@ -24,7 +24,7 @@
 #define DATABASE_NAME  passwd
 #define ADD_PARAMS     const char *name
 #define ADD_VARIABLES  name
-#define BUFLEN         NSS_BUFLEN_PROFATTR
+#define BUFLEN         NSS_BUFLEN_AUTHATTR
 
 #include <nss/getXXbyYY_r.c>
 
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_getexecattr.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_getexecattr.c
new file mode 100644 (file)
index 0000000..7134679
--- /dev/null
@@ -0,0 +1,39 @@
+/* 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 <exec_attrP.h>
+
+#define LOOKUP_TYPE    execstr_t
+#define SETFUNC_NAME   _setexecattr
+#define        GETFUNC_NAME    _getexecattr
+#define        ENDFUNC_NAME    _endexecattr
+#define DATABASE_NAME  prof_attr
+#define BUFLEN         NSS_BUFLEN_EXECATTR
+
+#include "../nss/getXXent_r.c"
+
+execstr_t * _getexecattr (execstr_t *esbuf, char *buf, int buflen, int *errnop)
+{
+  execstr_t *esbufp;
+  int errval = _getexecattr_r (esbuf, buf, buflen, &esbufp);
+  if (errval && errnop)
+    *errnop = errval;
+
+  return errval ? NULL : esbuf;
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_getexecprof.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_getexecprof.c
new file mode 100644 (file)
index 0000000..bb0af89
--- /dev/null
@@ -0,0 +1,29 @@
+/* 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 <exec_attrP.h>
+#include <assert.h>
+#include <stddef.h>
+
+execstr_t * _getexecprof(char *name, char *type, int search_flag,
+      execstr_t *result, char *buffer, int buflen, int *errnop)
+{
+  assert (!"_getexecprof not implmemented");
+  return NULL;
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_nss_XbyY_fgets.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_nss_XbyY_fgets.c
new file mode 100644 (file)
index 0000000..64204b3
--- /dev/null
@@ -0,0 +1,51 @@
+/* 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 <nss_sunP.h>
+#include <string.h>
+
+void _nss_XbyY_fgets (FILE *fp, nss_XbyY_args_t *args)
+{
+  args->returnval = 0;
+  args->erange = 0;
+
+  /* Read a line, ignoring lines that are too long.  */
+  char buf[LINE_MAX + 2];
+  if (!fgets (buf, sizeof (buf), fp))
+    return;
+  size_t len = strlen (buf);
+  if (len > LINE_MAX)
+    {
+      /* Read rest of line.  */
+      while (buf[len - 1] != '\n' && fgets (buf, sizeof (buf), fp))
+        len = strlen (buf);
+      args->erange = 1;
+      return;
+    }
+  if (buf[len - 1] == '\n')
+    buf[len - 1] = '\0';
+
+  /* Parse the line.  */
+  int res = (*args->str2ent) (buf, strlen (buf), args->buf.result,
+      args->buf.buffer, args->buf.buflen);
+  if (res == NSS_STR_PARSE_SUCCESS)
+    args->returnval = args->buf.result;
+  else if (res == NSS_STR_PARSE_ERANGE)
+    args->erange = 1;
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_sbrk_grow_aligned.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/_sbrk_grow_aligned.c
new file mode 100644 (file)
index 0000000..49350ec
--- /dev/null
@@ -0,0 +1,60 @@
+/* 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.  */
+
+/* Grow the break. First align the current break to low_align, then
+   add min_size and finally align on high_align. Return the low-aligned
+   break value and set actual_size to the difference of the resulting break
+   value and the low-aligned break value.  */
+
+#include <errno.h>
+
+extern void *__curbrk;
+
+void *_sbrk_grow_aligned (size_t min_size, size_t low_align, size_t high_align,
+      size_t *actual_size)
+{
+  if (!__curbrk)
+    {
+      /* Try to initialize the break.  */
+      if (sbrk (0) == (void *)-1)
+        {
+          __set_errno (ENOTSUP);
+          return (void *)-1;
+        }
+    }
+
+  /* low_align and high_align must be powers of 2.  */
+  if ((low_align & (low_align - 1)) != 0 ||
+        (high_align & (high_align - 1)) != 0)
+    {
+      __set_errno (EINVAL);
+      return (void *)-1;
+    }
+
+  uintptr_t lowbrk = ((uintptr_t)__curbrk + (low_align - 1)) & ~(low_align - 1);
+  uintptr_t highbrk = (lowbrk + min_size + (high_align - 1)) & ~(high_align - 1);
+
+  if (brk ((void *)highbrk) != 0)
+    return (void *)-1;
+
+  if (actual_size)
+    *actual_size = (size_t)(highbrk - lowbrk);
+
+  return (void *)lowbrk;
+}
index 030d49a..675a6d6 100644 (file)
@@ -94,47 +94,47 @@ void atomic_add_ptr (volatile void *target, ssize_t delta)
 
 uint8_t atomic_add_8_nv (volatile uint8_t *target, int8_t delta)
 {
-  return atomic_exchange_and_add (target, delta);
+  return atomic_exchange_and_add (target, delta) + 1;
 }
 
 unsigned char atomic_add_char_nv (volatile unsigned char *target, signed char delta)
 {
-  return atomic_exchange_and_add (target, delta);
+  return atomic_exchange_and_add (target, delta) + 1;
 }
 
 uint16_t atomic_add_16_nv (volatile uint16_t *target, int16_t delta)
 {
-  return atomic_exchange_and_add (target, delta);
+  return atomic_exchange_and_add (target, delta) + 1;
 }
 
 unsigned short atomic_add_short_nv (volatile unsigned short *target, short delta)
 {
-  return atomic_exchange_and_add (target, delta);
+  return atomic_exchange_and_add (target, delta) + 1;
 }
 
 uint32_t atomic_add_32_nv (volatile uint32_t *target, int32_t delta)
 {
-  return atomic_exchange_and_add (target, delta);
+  return atomic_exchange_and_add (target, delta) + 1;
 }
 
 unsigned int atomic_add_int_nv (volatile unsigned int *target, int delta)
 {
-  return atomic_exchange_and_add (target, delta);
+  return atomic_exchange_and_add (target, delta) + 1;
 }
 
 unsigned long atomic_add_long_nv (volatile unsigned long *target, long delta)
 {
-  return atomic_exchange_and_add (target, delta);
+  return atomic_exchange_and_add (target, delta) + 1;
 }
 
 uint64_t atomic_add_64_nv (volatile uint64_t *target, int64_t delta)
 {
-  return atomic_exchange_and_add (target, delta);
+  return atomic_exchange_and_add (target, delta) + 1;
 }
 
 void *atomic_add_ptr_nv (volatile void *target, ssize_t delta)
 {
-  return atomic_exchange_and_add ((char **)target, delta);
+  return atomic_exchange_and_add ((char **)target, delta) + 1;
 }
 
 /* atomic_dec_* */
@@ -181,40 +181,40 @@ void atomic_dec_64 (volatile uint64_t *target)
 
 uint8_t atomic_dec_8_nv (volatile uint8_t *target)
 {
-  return atomic_decrement_val (target);
+  return atomic_decrement_val (target) - 1;
 }
 
 unsigned char atomic_dec_uchar_nv (volatile unsigned char *target)
 {
-  return atomic_decrement_val (target);
+  return atomic_decrement_val (target) - 1;
 }
 
 uint16_t atomic_dec_16_nv (volatile uint16_t *target)
 {
-  return atomic_decrement_val (target);
+  return atomic_decrement_val (target) - 1;
 }
 
 unsigned short atomic_dec_ushort_nv (volatile unsigned short *target)
 {
-  return atomic_decrement_val (target);
+  return atomic_decrement_val (target) - 1;
 }
 
 uint32_t atomic_dec_32_nv (volatile uint32_t *target)
 {
-  return atomic_decrement_val (target);
+  return atomic_decrement_val (target) - 1;
 }
 
 unsigned int atomic_dec_uint_nv (volatile unsigned int *target)
 {
-  return atomic_decrement_val (target);
+  return atomic_decrement_val (target) - 1;
 }
 
 unsigned long atomic_dec_ulong_nv (volatile unsigned long *target)
 {
-  return atomic_decrement_val (target);
+  return atomic_decrement_val (target) - 1;
 }
 
 uint64_t atomic_dec_64_nv (volatile uint64_t *target)
 {
-  return atomic_decrement_val (target);
+  return atomic_decrement_val (target) - 1;
 }
index 9919d16..b572984 100644 (file)
@@ -224,5 +224,7 @@ struct stat64_32
 #define _R3_STAT_VER   1       /* SVR3.0 stat */
 #define _STAT_VER              2       /* current version of stat */
 
+#define S_IAMB 0x01FF
+
 #define S_ISDOOR(mode)  (((mode) & 0xF000) == S_IFDOOR)
 #define S_ISPORT(mode)  (((mode) & 0xF000) == S_IFPORT)
index 197d0ea..4688e94 100644 (file)
@@ -41,7 +41,7 @@ int defopen (char *fn)
   /* Allocate line buffer.  */
   if (_DEFLT (buf) == NULL)
     {
-      _DEFLT (buf) = malloc (_DEFLT_BUFSIZE);
+      _DEFLT (buf) = malloc (_DEFLT_BUFSIZE + 2);
       if (!_DEFLT (buf))
         return -1;
     }
@@ -65,8 +65,11 @@ char * defread (char *cp)
   size_t cplen = strlen (cp);
   int (*strcmpfunc)(const char *, const char *, size_t) =
       (_DEFLT (flags) & DC_CASE) ? strncmp : strncasecmp;
-  while (fgets (_DEFLT (buf), _DEFLT_BUFSIZE, _DEFLT (fp)))
+  while (fgets (_DEFLT (buf), _DEFLT_BUFSIZE + 2, _DEFLT (fp)))
     {
+      if (strlen (_DEFLT (buf)) > _DEFLT_BUFSIZE)
+        break;
+
       /* Trim trailing newline.  */
       size_t len = strlen (_DEFLT (buf));
       if (len && _DEFLT (buf)[len - 1] == '\n')
index df254ca..5efc586 100644 (file)
 #include <sysdep-cancel.h>
 #include <inline-syscall.h>
 #include <doorP.h>
+#include <ucredP.h>
 #include <libio/libioP.h>
 #include <atomic.h>
 #include <thread.h>
 #include <dlfcn.h>
+#include <alloca.h>
 
 static pid_t __door_private_pid, __door_unref_pid;
 static void * door_server_create_default (door_info_t *);
@@ -148,12 +150,23 @@ static void * door_server_create_default (door_info_t *info)
 }
 
 
+static void * door_unref_proc (void *arg)
+{
+  /* We may get interrupted so loop.  */
+  while (INLINE_SYSCALL (door, 6, 0, 0, 0, 0, 0, SYS_SUB_door_unrefsys) &&
+      errno == EINTR) ;
+
+  return NULL;
+}
+
+
 int door_create (void (*server_procedure)(void *cookie, char *argp,
       size_t arg_size, door_desc_t *dp, uint_t n_desc), void *cookie,
       unsigned int attributes)
 {
   // TODO: remove
-  if (attributes & ~(DOOR_NO_CANCEL | DOOR_REFUSE_DESC | DOOR_PRIVATE))
+  if (attributes & ~(DOOR_NO_CANCEL | DOOR_REFUSE_DESC | DOOR_PRIVATE | \
+        DOOR_UNREF | DOOR_UNREF_MULTI))
     abort ();
 
   /* We lock the io list lock as fork() locks it before forking. This allows us
@@ -170,8 +183,53 @@ int door_create (void (*server_procedure)(void *cookie, char *argp,
       (*door_server_create_proc) (NULL);
       __door_private_pid = pid;
     }
-
-  // TODO: DOOR_UNREF and DOOR_UNREF_MULTI
+  if (__door_unref_pid != pid && (attributes & (DOOR_UNREF | DOOR_UNREF_MULTI)))
+    {
+      /* We haven't created the unreferenced thread.  */
+      thr_create (NULL, 0, door_unref_proc, NULL, THR_DAEMON, NULL);
+      __door_unref_pid = pid;
+    }
 
   _IO_list_unlock ();
 }
+
+
+int door_ucred (ucred_t **info)
+{
+  ucred_t *uc = *info;
+  if (!uc)
+    {
+      uc = _ucred_alloc ();
+      if (!uc)
+        return -1;
+    }
+
+  int res = INLINE_SYSCALL (door, 6, (long)uc, 0, 0, 0, 0, SYS_SUB_door_ucred);
+  if (res != 0)
+    {
+      if (!*info)
+        free (uc);
+      return -1;
+    }
+
+  *info = uc;
+
+  return 0;
+}
+
+
+int door_cred (door_cred_t *info)
+{
+  ucred_t *uc = alloca (ucred_size ());
+  int res = INLINE_SYSCALL (door, 6, (long)uc, 0, 0, 0, 0, SYS_SUB_door_ucred);
+  if (res != 0)
+    return -1;
+
+  info->dc_euid = ucred_geteuid (uc);
+  info->dc_ruid = ucred_getruid (uc);
+  info->dc_egid = ucred_getegid (uc);
+  info->dc_rgid = ucred_getrgid (uc);
+  info->dc_pid = ucred_getpid (uc);
+
+  return 0;
+}
index cca925a..e2a4441 100644 (file)
@@ -34,6 +34,16 @@ typedef struct door_info door_info_t;
 typedef struct door_arg door_arg_t;
 typedef void door_server_func_t (door_info_t *);
 
+typedef struct door_cred
+  {
+       uid_t dc_euid;
+       gid_t dc_egid;
+       uid_t dc_ruid;
+       gid_t dc_rgid;
+       pid_t dc_pid;
+       int dc_resv[4];
+  } door_cred_t;
+
 typedef struct door_return_desc
   {
        door_desc_t *desc_ptr;
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/exec_attrP.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/exec_attrP.h
new file mode 100644 (file)
index 0000000..e07b81f
--- /dev/null
@@ -0,0 +1,37 @@
+/* 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.  */
+
+#ifndef _USER_ATTRP_H
+#define _USER_ATTRP_H
+
+#define NSS_BUFLEN_USERATTR    1024
+
+typedef struct execstr_s
+  {
+       char *name;
+       char *policy;
+       char *type;
+       char *res1;
+       char *res2;
+       char *id;
+       char *attr;
+       struct execstr_s *next;
+  } execstr_t;
+
+#endif /* _USER_ATTRP_H */
index c2e77a7..f2cf4f2 100644 (file)
@@ -18,7 +18,7 @@
    02111-1307 USA.  */
 
 #include <streams/stropts.h>
-#include <sys/mount.h>
+#include <mountP.h>
 #include <stddef.h>
 
 int
index 5d15ad8..b159b01 100644 (file)
@@ -18,8 +18,6 @@
    02111-1307 USA.  */
 
 #include <streams/stropts.h>
-#include <stropts.h>
-#include <sys/mount.h>
 
 int
 fdetach (path)
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mountP.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mountP.h
new file mode 100644 (file)
index 0000000..d8f2f13
--- /dev/null
@@ -0,0 +1,26 @@
+/* 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.  */
+
+#ifndef _MOUNTP_H
+#define _MOUNTP_H
+
+#define MS_DATA                0x04
+#define MS_NOMNTTAB    0x80
+
+#endif /* _MOUNTP_H */
index 302ea1b..474b45a 100644 (file)
@@ -22,7 +22,7 @@
 
 #include <sys/types.h>
 #include <stdint.h>
-#include <bits/libc-lock.h>
+#include <pthread.h>
 
 typedef enum
   {
@@ -112,19 +112,19 @@ struct nss_getent_context;
 typedef struct nss_db_root
   {
        struct nss_db_state *s;
-       __libc_lock_define (, lock);
+       pthread_mutex_t lock;
   } nss_db_root_t;
 
-#define NSS_DB_ROOT_INIT               { 0, DEFAULTMUTEX }
+#define NSS_DB_ROOT_INIT               { 0, PTHREAD_MUTEX_INITIALIZER }
 #define DEFINE_NSS_DB_ROOT(name)       nss_db_root_t name = NSS_DB_ROOT_INIT
 
 typedef struct
   {
        struct nss_getent_context *ctx;
-       __libc_lock_define (, lock);
+       pthread_mutex_t lock;
   } nss_getent_t;
 
-#define NSS_GETENT_INIT                        { 0, DEFAULTMUTEX }
+#define NSS_GETENT_INIT                        { 0, PTHREAD_MUTEX_INITIALIZER }
 #define DEFINE_NSS_GETENT(name)                nss_getent_t name = NSS_GETENT_INIT
 
 typedef enum
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/nss_delete.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/nss_delete.c
new file mode 100644 (file)
index 0000000..f7456bc
--- /dev/null
@@ -0,0 +1,35 @@
+/* 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 <nss_sunP.h>
+#include <string.h>
+#include <pthread.h>
+
+void nss_delete (nss_db_root_t *rootp)
+{
+  if (rootp->s == NULL)
+    return;
+
+  pthread_mutex_lock (&rootp->lock);
+
+  free (rootp->s);
+  rootp->s = NULL;
+
+  pthread_mutex_unlock (&rootp->lock);
+}
index f807c1c..ffff113 100644 (file)
@@ -19,7 +19,7 @@
 
 #include <nss_sunP.h>
 #include <string.h>
-#include <bits/libc-lock.h>
+#include <pthread.h>
 
 void nss_endent (nss_db_root_t *rootp, nss_db_initf_t initf,
       nss_getent_t *contextpp)
@@ -27,7 +27,7 @@ void nss_endent (nss_db_root_t *rootp, nss_db_initf_t initf,
   if (contextpp->ctx == NULL)
     return;
 
-  __libc_lock_lock (contextpp->lock);
+  pthread_mutex_lock (&contextpp->lock);
 
   struct nss_getent_context *ctx = contextpp->ctx;
   __nss_endent (ctx->endfuncname, ctx->dblookupfunc, &ctx->nip, &ctx->startp,
@@ -37,11 +37,5 @@ void nss_endent (nss_db_root_t *rootp, nss_db_initf_t initf,
   free (contextpp->ctx);
   contextpp->ctx = NULL;
 
-  __libc_lock_unlock (contextpp->lock);
-}
-
-
-void nss_delete (nss_db_root_t *rootp)
-{
-  /* We do nothing here by design.  */
+  pthread_mutex_unlock (&contextpp->lock);
 }
index 8814a04..1ca5ca6 100644 (file)
@@ -24,7 +24,7 @@
 nss_status_t nss_getent (nss_db_root_t *rootp, nss_db_initf_t initf,
       nss_getent_t *contextpp, void *args)
 {
-  __libc_lock_lock (contextpp->lock);
+  pthread_mutex_lock (&contextpp->lock);
 
   /* The first time we are called the context is NULL.  */
   if (contextpp->ctx == NULL)
@@ -33,7 +33,7 @@ nss_status_t nss_getent (nss_db_root_t *rootp, nss_db_initf_t initf,
       nss_setent (rootp, initf, contextpp);
       if (contextpp->ctx == NULL)
         {
-          __libc_lock_unlock (contextpp->lock);
+          pthread_mutex_unlock (&contextpp->lock);
           return NSS_UNAVAIL;
         }
     }
@@ -48,7 +48,7 @@ nss_status_t nss_getent (nss_db_root_t *rootp, nss_db_initf_t initf,
       &ctx->stayopen_tmp, 0, nssargs->buf.result, nssargs->buf.buffer,
       nssargs->buf.buflen, &nssargs->returnval, &nssargs->h_errno);
 
-  __libc_lock_unlock (contextpp->lock);
+  pthread_mutex_unlock (&contextpp->lock);
 
   if (res != 0)
     __set_errno (res);
index ce93b39..9d3b3c2 100644 (file)
@@ -26,7 +26,7 @@
 nss_status_t nss_search (nss_db_root_t *rootp, nss_db_initf_t initf,
       int search_fnum, void *search_args)
 {
-  __libc_lock_lock (rootp->lock);
+  pthread_mutex_lock (&rootp->lock);
 
   /* If we've never called nss_search then the context is NULL.  */
   if (rootp->s == NULL)
@@ -37,7 +37,7 @@ nss_status_t nss_search (nss_db_root_t *rootp, nss_db_initf_t initf,
       int dbid = __nss_get_dbid (conf.name);
       if (dbid == -1)
         {
-          __libc_lock_unlock (rootp->lock);
+          pthread_mutex_unlock (&rootp->lock);
           return NSS_ERROR;
         }
 
@@ -45,7 +45,7 @@ nss_status_t nss_search (nss_db_root_t *rootp, nss_db_initf_t initf,
       rootp->s = malloc (sizeof (struct nss_db_state));
       if (!rootp->s)
         {
-          __libc_lock_unlock (rootp->lock);
+          pthread_mutex_unlock (&rootp->lock);
           return NSS_ERROR;
         }
       struct nss_db_state *ctx = rootp->s;
@@ -63,7 +63,10 @@ nss_status_t nss_search (nss_db_root_t *rootp, nss_db_initf_t initf,
 
   /* Make sure we know about search_fnum.  */
   if (search_fnum < 0 || search_fnum >= _NSS_DBENTRY_MAX)
-    return NSS_ERROR;
+    {
+      pthread_mutex_unlock (&rootp->lock);
+      return NSS_ERROR;
+    }
   const char *searchfuncname = ctx->dbtable[search_fnum];
 
   nss_XbyY_args_t* nssargs = (nss_XbyY_args_t *)search_args;
@@ -138,5 +141,7 @@ nss_status_t nss_search (nss_db_root_t *rootp, nss_db_initf_t initf,
   if (errno == ERANGE && status != NSS_STATUS_TRYAGAIN)
     __set_errno (EINVAL);
 
+  pthread_mutex_unlock (&rootp->lock);
+
   return res;
 }
index 8b44df9..5c49ed5 100644 (file)
@@ -24,7 +24,7 @@
 void nss_setent (nss_db_root_t *rootp, nss_db_initf_t initf,
       nss_getent_t *contextpp)
 {
-  __libc_lock_lock (contextpp->lock);
+  pthread_mutex_lock (&contextpp->lock);
 
   /* If we've never called nss_setent then the context is NULL.  */
   if (contextpp->ctx == NULL)
@@ -34,13 +34,16 @@ void nss_setent (nss_db_root_t *rootp, nss_db_initf_t initf,
       initf (&conf);
       int dbid = __nss_get_dbid (conf.name);
       if (dbid == -1)
-        return NSS_ERROR;
+        {
+          pthread_mutex_unlock (&contextpp->lock);
+          return;
+        }
 
       /* Allocate context.  */
       contextpp->ctx = malloc (sizeof (struct nss_getent_context));
       if (!contextpp->ctx)
         {
-          __libc_lock_unlock (contextpp->lock);
+          pthread_mutex_unlock (&contextpp->lock);
           return;
         }
       struct nss_getent_context *ctx = contextpp->ctx;
@@ -59,5 +62,5 @@ void nss_setent (nss_db_root_t *rootp, nss_db_initf_t initf,
   __nss_setent (ctx->setfuncname, ctx->dblookupfunc, &ctx->nip, &ctx->startp,
       &ctx->last_nip, ctx->stayopen, &ctx->stayopen_tmp, 0);
 
-  __libc_lock_unlock (contextpp->lock);
+  pthread_mutex_unlock (&contextpp->lock);
 }
index a654e10..4a5bdac 100644 (file)
@@ -106,6 +106,10 @@ struct nss_getent_context
     int stayopen_tmp;
   };
 
+#define NSS_STR_PARSE_SUCCESS  0
+#define NSS_STR_PARSE_PARSE    1
+#define NSS_STR_PARSE_ERANGE   2
+
 typedef enum nss_status (*lookup_function) (void *, char *, size_t, int *);
 
 struct nss_db_state
index e1b5534..015a390 100644 (file)
@@ -86,7 +86,7 @@ priv_data_t * __priv_parse_info (const priv_impl_info_t *pii)
 
           if (pi->priv_info_size != data->pd_setsize)
             break;
-          data->pd_basicprivs = ((priv_info_set_t *)pi)->set;
+          data->pd_basicprivs = (priv_set_t *)((priv_info_set_t *)pi)->set;
 
           break;
         }
@@ -198,7 +198,8 @@ int __init_suid_priv (int flags, ...)
      set of the ones passed in, the inherited ones, and the basic set.  */
   priv_copyset (__suidset, scratch);
   priv_union (inherit, scratch);
-  priv_union (basic, scratch);
+  if (basic)
+    priv_union (basic, scratch);
   priv_intersect (permit, scratch);
   if (setppriv (PRIV_SET, PRIV_PERMITTED, scratch) != 0)
     goto error;
index 223f328..58fc48a 100644 (file)
@@ -86,7 +86,7 @@ typedef struct priv_data
        char **pd_setnames;
        uint32_t pd_privnames_cnt;
        char **pd_privnames;
-       priv_chunk_t *pd_basicprivs;
+       priv_set_t *pd_basicprivs;
   } priv_data_t;
 
 typedef enum priv_op
@@ -123,7 +123,9 @@ extern void priv_union (const priv_set_t *src, priv_set_t *dst);
 extern void priv_intersect (const priv_set_t *src, priv_set_t *dst);
 extern void priv_emptyset (priv_set_t *sp);
 extern int priv_addset (priv_set_t *sp, const char *priv);
+extern int priv_delset (priv_set_t *sp, const char *priv);
 extern void priv_copyset (const priv_set_t *src, priv_set_t *dst);
 extern boolean_t priv_issubset (const priv_set_t *src, const priv_set_t *dst);
+extern int priv_getbyname (const char *privname);
 
 #endif /* _PRIVP_H */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/priv_str.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/priv_str.c
new file mode 100644 (file)
index 0000000..6359155
--- /dev/null
@@ -0,0 +1,96 @@
+/* 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 <zoneP.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+/* Docs: http://docs.sun.com/app/docs/doc/816-5168/priv-str-to-set-3c  */
+
+priv_set_t *priv_str_to_set (const char *buf, const char *sep,
+      const char **endptr)
+{
+  /* Take a copy of the string since strtok_r will modify it.  */
+  char *str = strdup (buf);
+  if (!str)
+    return NULL;
+
+  priv_set_t *set = priv_allocset ();
+  if (!set)
+    {
+      free (str);
+      return NULL;
+    }
+  priv_emptyset (set);
+  const priv_data_t *data = __priv_parse_data_cached ();
+  if (!data)
+    return NULL;
+  priv_set_t *basic = data->pd_basicprivs;
+
+  char *saveptr;
+  char *priv = strtok_r (str, sep, &saveptr);
+  if (!priv)
+    return set;
+  do
+    {
+      if (strcmp (priv, "basic") == 0 && basic)
+          priv_union (basic, set);
+      else if (strcmp (priv, "all") == 0)
+          priv_fillset (set);
+      else if (strcmp (priv, "none") == 0)
+          priv_emptyset (set);
+      else if (strcmp (priv, "zone") == 0)
+        {
+          priv_set_t *zone = priv_allocset ();
+          if (!zone)
+            goto inval;
+          if (zone_getattr (getzoneid (), ZONE_ATTR_PRIVSET,
+                zone, __PRIVSETSIZE) == 0)
+            priv_union (zone, set);
+          priv_freeset (zone);
+        }
+      else
+        {
+          int negate = *str == '-' || *str == '!';
+          if (negate)
+            str++;
+          int privnum = priv_getbyname (str);
+          if (privnum == -1)
+            goto inval;
+
+          if (negate)
+            priv_delset (set, privnum);
+          else
+            priv_addset (set, privnum);
+        }
+    }
+  while ((priv = strtok_r (NULL, sep, &saveptr))) ;
+
+  free (str);
+  return set;
+
+inval:
+
+   priv_freeset (set);
+   free (str);
+   __set_errno (EINVAL);
+  return NULL;
+}
index e127a9e..04569f0 100644 (file)
@@ -27,6 +27,7 @@
 #include <errno.h>
 #include <sys/ptms.h>
 #include <streams/stropts.h>
+#include <mkdevP.h>
 
 /* Directory where we can find the slave pty nodes.  */
 #define _PATH_DEVPTS "/dev/pts/"
@@ -72,7 +73,7 @@ __ptsname_r (int fd, char *buf, size_t buflen)
     struct stat st;
     if (fstat (fd, &st) < 0)
         return -1;
-    int ptyno = minor (st.st_rdev);
+    int ptyno = __minor (NEWDEV, st.st_rdev);
 
     /* Buffer we use to print the number in.  For a maximum size for
        `int' of 8 bytes we never need more than 20 digits.  */
index b7d406b..9cd2da9 100644 (file)
@@ -110,3 +110,9 @@ int __getopt_sun (int argc, char * const argv[], const char *optstring)
 
   return res;
 }
+
+
+int __sigwait_sun (sigset_t * set)
+{
+  return sigtimedwait (set, NULL, NULL);
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mount.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mount.h
deleted file mode 100644 (file)
index b740b5a..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Header file for mounting/unmount OpenSolaris filesystems.
-   Copyright (C) 1996,1997,1998,1999,2000,2004,2008
-    Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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.  */
-
-/* This is taken from /usr/include/linux/fs.h.  */
-
-#ifndef _SYS_MOUNT_H
-#define _SYS_MOUNT_H   1
-
-#include <features.h>
-#include <sys/ioctl.h>
-
-#define BLOCK_SIZE     1024
-#define BLOCK_SIZE_BITS        10
-
-
-/* These are the fs-independent mount-flags: up to 16 flags are
-   supported  */
-enum
-{
-  MS_RDONLY = 1,               /* Mount read-only.  */
-#define MS_RDONLY      MS_RDONLY
-  MS_FSS = 2,          /* Old mount.  */
-#define MS_FSS MS_FSS
-  MS_DATA = 4 ,                /* 6-argument mount.  */
-#define MS_DATA        MS_DATA
-  MS_NOSUID = 16,              /* Ignore suid and sgid bits.  */
-#define MS_NOSUID      MS_NOSUID
-  MS_REMOUNT = 32,             /* Alter flags of a mounted FS.  */
-#define MS_REMOUNT     MS_REMOUNT
-  MS_NOTRUNC = 64,             /* Return ENAMETOOLONG for long filenames.  */
-#define MS_NOTRUNC     MS_NOTRUNC
-  MS_OVERLAY = 128,            /* Allow overlay mounts.  */
-#define MS_OVERLAY     MS_OVERLAY
-  MS_OPTIONSTR = 256,          /* Data is a an in/out option string.  */
-#define MS_OPTIONSTR   MS_OPTIONSTR
-  MS_GLOBAL = 512,             /* Clustering: Mount into global name space.  */
-#define MS_GLOBAL      MS_GLOBAL
-  MS_FORCE = 1024,             /* Forced unmount.  */
-#define MS_FORCE       MS_FORCE
-  MS_NOMNTTAB = 2048           /* Don't show mount in mnttab.  */
-#define MS_NOMNTTAB    MS_NOMNTTAB
-};
-
-
-__BEGIN_DECLS
-
-/* Mount a filesystem.  */
-extern int mount (__const char *__spec, __const char *__dir,
-                 int __mflag_, __const char *__fstype, __const void *__dataptr,
-                 int __datalen, char *__optptr, int __optlen) __THROW;
-
-/* Unmount a filesystem.  */
-extern int umount (__const char *__file) __THROW;
-
-/* Unmount a filesystem.  Force unmounting if FLAG is set to MS_FORCE.  */
-extern int umount2 (__const char *__file, int __flag) __THROW;
-
-__END_DECLS
-
-#endif /* _SYS_MOUNT_H */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/sysmacros.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/sysmacros.h
new file mode 100644 (file)
index 0000000..48605b4
--- /dev/null
@@ -0,0 +1 @@
+/* This file is intentionally blank.  */
index 7d680cb..e2a8569 100644 (file)
@@ -50,6 +50,12 @@ typedef struct ucred_s
 
 #define BSLABEL_T_SIZE         36
 
+extern ucred_t *_ucred_alloc (void);
+extern void ucred_free (ucred_t *);
 extern size_t ucred_size (void);
+extern uid_t ucred_geteuid (const ucred_t *uc);
+extern uid_t ucred_getruid (const ucred_t *uc);
+extern gid_t ucred_getegid (const ucred_t *uc);
+extern gid_t ucred_getrgid (const ucred_t *uc);
 
 #endif /* _UCREDP_H */
index 227a890..52d22ff 100644 (file)
@@ -17,7 +17,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <sys/mount.h>
+extern int umount2 (const char*, int);
 
 int
 __umount (const char *name)
index 7d837b0..390b59e 100644 (file)
@@ -36,11 +36,11 @@ static inline int vfs_strtok_r (char *str, const char *delim,
 
 int getvfsent (FILE *fp, struct vfstab *vp)
 {
-  while (fgets (_VFS_BUF, VFS_LINE_MAX, fp) != NULL)
+  while (fgets (_VFS_BUF, VFS_LINE_MAX + 2, fp) != NULL)
     {
       /* Check for long lines.  */
       size_t len = strlen (_VFS_BUF);
-      if (len > VFS_LINE_MAX && _VFS_BUF[VFS_LINE_MAX] != '\n')
+      if (len > VFS_LINE_MAX)
         return VFS_TOOLONG;
 
       /* Trim leading spaces/tabs.  */
index 0f5d2ca..4585591 100644 (file)
@@ -37,7 +37,7 @@ struct vfstab
 #define VFS_TOOMANY    2
 #define VFS_TOOFEW     3
 
-#define _VFS_INIT      static char buf[VFS_LINE_MAX + 1];
+#define _VFS_INIT      static char buf[VFS_LINE_MAX + 2];
 #define _VFS_BUF       buf
 #define _VFS_DELIM     " \t"
 
index eba6760..78c28cc 100644 (file)
 # error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
 #endif
 
-#include <sys/ucontext.h>
-
-/* This is the same as mcontext_t.  */
-
-struct sigcontext
-  {
-    gregset_t gregs;
-    fpregset_t fpregs;
-  };
+/* 'struct sigcontext' is only ever used by sigreturn, which we don't have.  */
+struct sigcontext;
index 4ccd279..f6adcd4 100644 (file)
 #include <privP.h>
 #include <dlfcn.h>
 
+static int (*_zone_get_id) (const char *, zoneid_t *);
+
 DECLARE_INLINE_SYSCALL (zoneid_t, zone_create, zone_def *def);
 DECLARE_INLINE_SYSCALL (zoneid_t, zone_lookup, const char *name);
 
 
+
 zoneid_t getzoneid (void)
 {
   return INLINE_SYSCALL (zone_lookup, 1, NULL);
@@ -68,8 +71,6 @@ zoneid_t zone_create (const char *name, const char *root,
 }
 
 
-int (*_zone_get_id)(const char *, zoneid_t *);
-
 int zone_get_id (const char *str, zoneid_t *idp)
 {
   /* libzonecfg.so.1 has the real function.  */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/zone.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/zone.h
deleted file mode 100644 (file)
index 164f00f..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Declarations of zone functions and types.
-   Copyright (C) 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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.  */
-
-#ifndef _ZONE_H
-#define _ZONE_H
-
-#include <features.h>
-#include <sys/types.h>
-#include <sys/zone.h>
-
-__BEGIN_DECLS
-
-/* Public interfaces.  */
-extern zoneid_t getzoneid (void);
-extern zoneid_t getzoneidbyname (const char *);
-extern ssize_t getzonenamebyid (zoneid_t, char *, size_t);
-
-/* Private interfaces.  */
-extern int zonept (int, zoneid_t);
-extern int zone_get_id (const char *, zoneid_t *);
-extern zoneid_t zone_create (const char *, const char *,
-    const struct priv_set *, const char *, size_t, const char *, size_t, int *,
-    int, int, const bslabel_t *, int);
-extern int  zone_boot (zoneid_t);
-extern int  zone_destroy (zoneid_t);
-extern ssize_t  zone_getattr (zoneid_t, int, void *, size_t);
-extern int  zone_setattr (zoneid_t, int, void *, size_t);
-extern int  zone_enter (zoneid_t);
-extern int  zone_list (zoneid_t *, uint_t *);
-extern int  zone_shutdown (zoneid_t);
-extern int  zone_version (int *);
-extern int  zone_add_datalink (zoneid_t, char *);
-extern int  zone_remove_datalink (zoneid_t, char *);
-extern int  zone_check_datalink (zoneid_t *, char *);
-extern int  zone_list_datalink (zoneid_t, int *, char *);
-
-__END_DECLS
-
-#endif /* _ZONE_H */
index 23cff0a..2db237e 100644 (file)
@@ -43,6 +43,9 @@ typedef struct
        int flags;
   } zone_def;
 
+extern zoneid_t getzoneid (void);
 extern ssize_t zone_getattr (zoneid_t, int, void *, size_t);
 
+#define ZONE_ATTR_PRIVSET      4
+
 #endif /* _ZONEP_H */