OSDN Git Service

Change internal uid datatype from __uid16_t to __uid32_t
authorcorinna <corinna>
Wed, 29 May 2002 15:04:26 +0000 (15:04 +0000)
committercorinna <corinna>
Wed, 29 May 2002 15:04:26 +0000 (15:04 +0000)
throughout.
* cygwin.din: Export new symbols getpwuid32, getpwuid_r32, getuid32,
geteuid32, setuid32, seteuid32.
* passwd.cc (getpwuid32): New function.
(getpwuid_r32): Ditto.
* syscalls.cc (seteuid32): Ditto.
(setuid32): Ditto.
* uinfo.cc (getuid32): Ditto.
(geteuid32): Ditto.
* winsup.h (uid16touid32): New macro, correclt casting from __uid16_t
to __uid32_t.
(gid16togid32): Ditto fir gids.
(getuid32): Declare.
(geteuid32): Ditto.
(getpwuid32): Ditto.
* include/sys/cygwin.h (struct external_pinfo): Add members uid32 and
gid32.

17 files changed:
winsup/cygwin/ChangeLog
winsup/cygwin/child_info.h
winsup/cygwin/cygheap.h
winsup/cygwin/cygwin.din
winsup/cygwin/external.cc
winsup/cygwin/fhandler_disk_file.cc
winsup/cygwin/include/sys/cygwin.h
winsup/cygwin/passwd.cc
winsup/cygwin/sec_acl.cc
winsup/cygwin/sec_helper.cc
winsup/cygwin/security.cc
winsup/cygwin/security.h
winsup/cygwin/shm.cc
winsup/cygwin/spawn.cc
winsup/cygwin/syscalls.cc
winsup/cygwin/uinfo.cc
winsup/cygwin/winsup.h

index 6edb591..e2e1ee4 100644 (file)
@@ -1,5 +1,26 @@
 2002-05-29  Corinna Vinschen  <corinna@vinschen.de>
 
+       Change internal uid datatype from __uid16_t to __uid32_t
+       throughout.
+       * cygwin.din: Export new symbols getpwuid32, getpwuid_r32, getuid32,
+       geteuid32, setuid32, seteuid32.
+       * passwd.cc (getpwuid32): New function.
+       (getpwuid_r32): Ditto.
+       * syscalls.cc (seteuid32): Ditto.
+       (setuid32): Ditto.
+       * uinfo.cc (getuid32): Ditto.
+       (geteuid32): Ditto.
+       * winsup.h (uid16touid32): New macro, correclt casting from __uid16_t
+       to __uid32_t.
+       (gid16togid32): Ditto fir gids.
+       (getuid32): Declare.
+       (geteuid32): Ditto.
+       (getpwuid32): Ditto.
+       * include/sys/cygwin.h (struct external_pinfo): Add members uid32 and
+       gid32.
+
+2002-05-29  Corinna Vinschen  <corinna@vinschen.de>
+
        * include/cygwin/socket.h: Protect some symbols against multiple
        definition.
        * include/netinet/ip.h: Ditto.
index e79ca39..fdfaa28 100644 (file)
@@ -70,7 +70,7 @@ class fhandler_base;
 class cygheap_exec_info
 {
 public:
-  __uid16_t uid;
+  __uid32_t uid;
   char *old_title;
   int argc;
   char **argv;
index aa4e525..f4ef144 100644 (file)
@@ -96,9 +96,9 @@ class cygheap_user
   PSID   psid;          /* buffer for user's SID */
   PSID   orig_psid;     /* Remains intact even after impersonation */
 public:
-  __uid16_t orig_uid;      /* Remains intact even after impersonation */
+  __uid32_t orig_uid;      /* Remains intact even after impersonation */
   __gid32_t orig_gid;      /* Ditto */
-  __uid16_t real_uid;      /* Remains intact on seteuid, replaced by setuid */
+  __uid32_t real_uid;      /* Remains intact on seteuid, replaced by setuid */
   __gid32_t real_gid;      /* Ditto */
 
   /* token is needed if set(e)uid should be called. It can be set by a call
index 1d8ae0b..ccea879 100644 (file)
@@ -349,6 +349,7 @@ _getegid = getegid
 getegid32
 geteuid
 _geteuid = geteuid
+geteuid32
 getgid
 _getgid = getgid
 getgid32
@@ -389,6 +390,7 @@ gettimeofday
 _gettimeofday = gettimeofday
 getuid
 _getuid = getuid
+getuid32
 getutent
 _getutent = getutent
 getutid
@@ -682,11 +684,13 @@ settimeofday
 _settimeofday = settimeofday
 seteuid
 _seteuid = seteuid
+seteuid32
 setegid
 _setegid = setegid
 setegid32
 setuid
 _setuid = setuid
+setuid32
 setutent
 _setutent = setutent
 chroot
@@ -1019,7 +1023,9 @@ _getpwnam = getpwnam
 getpwnam_r
 getpwuid
 _getpwuid = getpwuid
+getpwuid32
 getpwuid_r
+getpwuid_r32
 getpgrp
 _getpgrp = getpgrp
 getgrent
index 3cbf9c0..8a06f02 100644 (file)
@@ -86,6 +86,9 @@ fillout_pinfo (pid_t pid, int winpid)
          ep.strace_file = 0;
 
          ep.process_state = p->process_state;
+
+         ep.uid32 = p->uid;
+         ep.gid32 = p->gid;
          break;
        }
     }
index de84764..c4474f1 100644 (file)
@@ -126,7 +126,7 @@ fhandler_disk_file::fstat (struct __stat64 *buf, path_conv *pc)
 {
   int res = -1;
   int oret;
-  __uid16_t uid;
+  __uid32_t uid;
   __gid32_t gid;
   int open_flags = O_RDONLY | O_BINARY | O_DIROPEN;
   bool query_open_already;
@@ -237,7 +237,7 @@ fhandler_disk_file::fstat_helper (struct __stat64 *buf, path_conv *pc,
   else if (pc->issocket ())
     buf->st_mode = S_IFSOCK;
 
-  __uid16_t uid;
+  __uid32_t uid;
   __gid32_t gid;
   if (get_file_attribute (pc->has_acls (), get_win32_name (), &buf->st_mode,
                          &uid, &gid) == 0)
index 38e3cb3..90cd075 100644 (file)
@@ -211,6 +211,8 @@ extern int cygwin_attach_handle_to_fd (char *, int, HANDLE, mode_t, DWORD);
 #ifndef _SYS_TYPES_H
 typedef unsigned short __uid16_t;
 typedef unsigned short __gid16_t;
+typedef unsigned long __uid32_t;
+typedef unsigned long __gid32_t;
 #endif
 
 struct external_pinfo
@@ -236,6 +238,9 @@ struct external_pinfo
   HANDLE strace_file;
 
   DWORD process_state;
+
+  __uid32_t uid32;
+  __gid32_t gid32;
 };
 
 DWORD cygwin_internal (cygwin_getinfo_types, ...);
index 744fcd6..c526dd2 100644 (file)
@@ -186,7 +186,7 @@ read_etc_passwd ()
 /* Cygwin internal */
 /* If this ever becomes non-reentrant, update all the getpw*_r functions */
 static struct passwd *
-search_for (__uid16_t uid, const char *name)
+search_for (__uid32_t uid, const char *name)
 {
   struct passwd *res = 0;
   struct passwd *default_pw = 0;
@@ -202,7 +202,7 @@ search_for (__uid16_t uid, const char *name)
          if (strcasematch (name, res->pw_name))
            return res;
        }
-      else if (uid == res->pw_uid)
+      else if (uid == (__uid32_t) res->pw_uid)
        return res;
     }
 
@@ -217,7 +217,7 @@ search_for (__uid16_t uid, const char *name)
 }
 
 extern "C" struct passwd *
-getpwuid (__uid16_t uid)
+getpwuid32 (__uid32_t uid)
 {
   if (passwd_state  <= initializing)
     read_etc_passwd ();
@@ -227,8 +227,14 @@ getpwuid (__uid16_t uid)
   return search_for (uid, 0);
 }
 
+extern "C" struct passwd *
+getpwuid (__uid16_t uid)
+{
+  return getpwuid32 (uid16touid32 (uid));
+}
+
 extern "C" int
-getpwuid_r (__uid16_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result)
+getpwuid_r32 (__uid32_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result)
 {
   *result = NULL;
 
@@ -269,6 +275,12 @@ getpwuid_r (__uid16_t uid, struct passwd *pwd, char *buffer, size_t bufsize, str
   return 0;
 }
 
+extern "C" int
+getpwuid_r (__uid16_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result)
+{
+  return getpwuid_r32 (uid16touid32 (uid), pwd, buffer, bufsize, result);
+}
+
 extern "C" struct passwd *
 getpwnam (const char *name)
 {
index 47f1cb4..71a0147 100644 (file)
@@ -158,7 +158,7 @@ setacl (const char *file, int nentries, __aclent16_t *aclbufp)
          break;
        case USER:
        case DEF_USER:
-         if (!(pw = getpwuid (aclbufp[i].a_id))
+         if (!(pw = getpwuid32 (aclbufp[i].a_id))
              || !sid.getfrompw (pw)
              || !add_access_allowed_ace (acl, ace_off++, allow,
                                           sid, acl_len, inheritance))
@@ -255,7 +255,7 @@ getacl (const char *file, DWORD attr, int nentries, __aclent16_t *aclbufp)
   PSID owner_sid;
   PSID group_sid;
   BOOL dummy;
-  __uid16_t uid;
+  __uid32_t uid;
   __gid32_t gid;
 
   if (!GetSecurityDescriptorOwner (psd, &owner_sid, &dummy))
@@ -426,7 +426,7 @@ acl_access (const char *path, int flags)
              struct passwd *pw;
              struct __group32 *gr = NULL;
 
-             if ((pw = getpwuid (acls[i].a_id)) != NULL
+             if ((pw = getpwuid32 (acls[i].a_id)) != NULL
                  && owner.getfrompw (pw))
                {
                  for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx)
index c534112..603796a 100644 (file)
@@ -244,7 +244,7 @@ cygsid::get_id (BOOL search_grp, int *type)
        }
     }
   if (id == -1)
-    id = getuid ();
+    id = getuid32 ();
   return id;
 }
 
@@ -254,7 +254,7 @@ is_grp_member (__uid32_t uid, __gid32_t gid)
   extern int getgroups32 (int, __gid32_t *, __gid32_t, const char *);
   BOOL grp_member = TRUE;
 
-  struct passwd *pw = getpwuid (uid);
+  struct passwd *pw = getpwuid32 (uid);
   __gid32_t grps[NGROUPS_MAX];
   int cnt = getgroups32 (NGROUPS_MAX, grps,
                         pw ? pw->pw_gid : myself->gid,
index 58b10c8..819a33b 100644 (file)
@@ -1130,7 +1130,7 @@ write_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, DWORD sd_size)
 
 static int
 get_nt_attribute (const char *file, int *attribute,
-                 __uid16_t *uidret, __gid32_t *gidret)
+                 __uid32_t *uidret, __gid32_t *gidret)
 {
   if (!wincap.has_security ())
     return 0;
@@ -1168,7 +1168,7 @@ get_nt_attribute (const char *file, int *attribute,
       return -1;
     }
 
-  __uid16_t uid = cygsid(owner_sid).get_uid ();
+  __uid32_t uid = cygsid(owner_sid).get_uid ();
   __gid32_t gid = cygsid(group_sid).get_gid ();
   if (uidret)
     *uidret = uid;
@@ -1279,7 +1279,7 @@ get_nt_attribute (const char *file, int *attribute,
 
 int
 get_file_attribute (int use_ntsec, const char *file,
-                   int *attribute, __uid16_t *uidret, __gid32_t *gidret)
+                   int *attribute, __uid32_t *uidret, __gid32_t *gidret)
 {
   int res;
 
@@ -1292,7 +1292,7 @@ get_file_attribute (int use_ntsec, const char *file,
     }
 
   if (uidret)
-    *uidret = getuid ();
+    *uidret = getuid32 ();
   if (gidret)
     *gidret = getgid32 ();
 
@@ -1350,7 +1350,7 @@ add_access_denied_ace (PACL acl, int offset, DWORD attributes,
 }
 
 PSECURITY_DESCRIPTOR
-alloc_sd (__uid16_t uid, __gid32_t gid, const char *logsrv, int attribute,
+alloc_sd (__uid32_t uid, __gid32_t gid, const char *logsrv, int attribute,
          PSECURITY_DESCRIPTOR sd_ret, DWORD *sd_size_ret)
 {
   BOOL dummy;
@@ -1367,7 +1367,7 @@ alloc_sd (__uid16_t uid, __gid32_t gid, const char *logsrv, int attribute,
   /* Get SID and name of new owner. */
   char owner[UNLEN + 1];
   cygsid owner_sid;
-  struct passwd *pw = getpwuid (uid);
+  struct passwd *pw = getpwuid32 (uid);
   strcpy (owner, pw ? pw->pw_name : getlogin ());
   if ((!pw || !owner_sid.getfrompw (pw))
       && !lookup_name (owner, logsrv, owner_sid))
@@ -1612,14 +1612,14 @@ set_security_attribute (int attribute, PSECURITY_ATTRIBUTES psa,
   psa->lpSecurityDescriptor = sd_buf;
   InitializeSecurityDescriptor ((PSECURITY_DESCRIPTOR)sd_buf,
                                SECURITY_DESCRIPTOR_REVISION);
-  psa->lpSecurityDescriptor = alloc_sd (geteuid (), getegid32 (),
+  psa->lpSecurityDescriptor = alloc_sd (geteuid32 (), getegid32 (),
                                        cygheap->user.logsrv (),
                                        attribute, (PSECURITY_DESCRIPTOR)sd_buf,
                                        &sd_buf_size);
 }
 
 static int
-set_nt_attribute (const char *file, __uid16_t uid, __gid32_t gid,
+set_nt_attribute (const char *file, __uid32_t uid, __gid32_t gid,
                  const char *logsrv, int attribute)
 {
   if (!wincap.has_security ())
@@ -1645,7 +1645,7 @@ set_nt_attribute (const char *file, __uid16_t uid, __gid32_t gid,
 
 int
 set_file_attribute (int use_ntsec, const char *file,
-                   __uid16_t uid, __gid32_t gid,
+                   __uid32_t uid, __gid32_t gid,
                    int attribute, const char *logsrv)
 {
   int ret = 0;
index db3df29..183b843 100644 (file)
@@ -166,9 +166,9 @@ extern struct __group32 *internal_getgrent (int);
 /* File manipulation */
 int __stdcall set_process_privileges ();
 int __stdcall get_file_attribute (int, const char *, int *,
-                                 __uid16_t * = NULL, __gid32_t * = NULL);
+                                 __uid32_t * = NULL, __gid32_t * = NULL);
 int __stdcall set_file_attribute (int, const char *, int);
-int __stdcall set_file_attribute (int, const char *, __uid16_t, __gid32_t, int, const char *);
+int __stdcall set_file_attribute (int, const char *, __uid32_t, __gid32_t, int, const char *);
 LONG __stdcall read_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, LPDWORD sd_size);
 LONG __stdcall write_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, DWORD sd_size);
 BOOL __stdcall add_access_allowed_ace (PACL acl, int offset, DWORD attributes, PSID sid, size_t &len_add, DWORD inherit);
@@ -209,7 +209,7 @@ extern BOOL sec_acl (PACL acl, BOOL admins, PSID sid1 = NO_SID, PSID sid2 = NO_S
 
 int __stdcall NTReadEA (const char *file, const char *attrname, char *buf, int len);
 BOOL __stdcall NTWriteEA (const char *file, const char *attrname, const char *buf, int len);
-PSECURITY_DESCRIPTOR alloc_sd (__uid16_t uid, __gid32_t gid, const char *logsrv, int attribute,
+PSECURITY_DESCRIPTOR alloc_sd (__uid32_t uid, __gid32_t gid, const char *logsrv, int attribute,
           PSECURITY_DESCRIPTOR sd_ret, DWORD *sd_size_ret);
 
 extern inline SECURITY_ATTRIBUTES *
index 8a32efb..647c55d 100644 (file)
@@ -442,7 +442,7 @@ shmctl (int shmid, int cmd, struct shmid_ds *buf)
   return 0;
 }
 
-/* FIXME: evaluate getuid() and getgid32() against the requested mode. Then
+/* FIXME: evaluate getuid32() and getgid32() against the requested mode. Then
  * choose PAGE_READWRITE | PAGE_READONLY and FILE_MAP_WRITE  |  FILE_MAP_READ
  * appropriately
  */
@@ -461,7 +461,7 @@ shmget (key_t key, size_t size, int shmflg)
   /* create a sd for our open requests based on shmflag & 0x01ff */
   InitializeSecurityDescriptor (psd,
                                    SECURITY_DESCRIPTOR_REVISION);
-  psd = alloc_sd (getuid (), getgid32 (), cygheap->user.logsrv (),
+  psd = alloc_sd (getuid32 (), getgid32 (), cygheap->user.logsrv (),
                  shmflg & 0x01ff, psd, &sd_size);
 
   if (key == (key_t) - 1)
@@ -538,7 +538,7 @@ shmget (key_t key, size_t size, int shmflg)
 
 #if 0
   /* fill out the node data */
-  shmtemp->shm_perm.cuid = getuid ();
+  shmtemp->shm_perm.cuid = getuid32 ();
   shmtemp->shm_perm.uid = shmtemp->shm_perm.cuid;
   shmtemp->shm_perm.cgid = getgid32 ();
   shmtemp->shm_perm.gid = shmtemp->shm_perm.cgid;
index b18d7b4..5b11054 100644 (file)
@@ -627,7 +627,7 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
   cygbench ("spawn-guts");
   if (!hToken)
     {
-      ciresrv.moreinfo->uid = getuid ();
+      ciresrv.moreinfo->uid = getuid32 ();
       /* FIXME: This leaks a handle in the CreateProcessAsUser case since the
         child process doesn't know about cygwin_mount_h. */
       ciresrv.mount_h = cygwin_mount_h;
index afdc457..969389f 100644 (file)
@@ -750,10 +750,10 @@ done:
  * systems, it is only a stub that always returns zero.
  */
 static int
-chown_worker (const char *name, unsigned fmode, __uid16_t uid, __gid32_t gid)
+chown_worker (const char *name, unsigned fmode, __uid32_t uid, __gid32_t gid)
 {
   int res;
-  __uid16_t old_uid;
+  __uid32_t old_uid;
   __gid32_t old_gid;
 
   if (check_null_empty_str_errno (name))
@@ -815,7 +815,7 @@ done:
 }
 
 extern "C" int
-chown32 (const char * name, __uid16_t uid, __gid32_t gid)
+chown32 (const char * name, __uid32_t uid, __gid32_t gid)
 {
   sigframe thisframe (mainthread);
   return chown_worker (name, PC_SYM_FOLLOW, uid, gid);
@@ -825,11 +825,11 @@ extern "C" int
 chown (const char * name, __uid16_t uid, __gid16_t gid)
 {
   sigframe thisframe (mainthread);
-  return chown_worker (name, PC_SYM_FOLLOW, uid, (__gid32_t) gid);
+  return chown_worker (name, PC_SYM_FOLLOW, uid, gid16togid32 (gid));
 }
 
 extern "C" int
-lchown32 (const char * name, __uid16_t uid, __gid32_t gid)
+lchown32 (const char * name, __uid32_t uid, __gid32_t gid)
 {
   sigframe thisframe (mainthread);
   return chown_worker (name, PC_SYM_NOFOLLOW, uid, gid);
@@ -839,11 +839,11 @@ extern "C" int
 lchown (const char * name, __uid16_t uid, __gid16_t gid)
 {
   sigframe thisframe (mainthread);
-  return chown_worker (name, PC_SYM_NOFOLLOW, uid, (__gid32_t) gid);
+  return chown_worker (name, PC_SYM_NOFOLLOW, uid, gid16togid32 (gid));
 }
 
 extern "C" int
-fchown32 (int fd, __uid16_t uid, __gid32_t gid)
+fchown32 (int fd, __uid32_t uid, __gid32_t gid)
 {
   sigframe thisframe (mainthread);
   cygheap_fdget cfd (fd);
@@ -870,7 +870,7 @@ fchown32 (int fd, __uid16_t uid, __gid32_t gid)
 extern "C" int
 fchown (int fd, __uid16_t uid, __gid16_t gid)
 {
-  return fchown32 (fd, uid, (__gid32_t) gid);
+  return fchown32 (fd, uid, gid16togid32 (gid));
 }
 
 /* umask: POSIX 5.3.3.1 */
@@ -914,7 +914,7 @@ chmod (const char *path, mode_t mode)
       /* temporary erase read only bit, to be able to set file security */
       SetFileAttributes (win32_path, (DWORD) win32_path & ~FILE_ATTRIBUTE_READONLY);
 
-      __uid16_t uid;
+      __uid32_t uid;
       __gid32_t gid;
 
       if (win32_path.isdir ())
@@ -1932,22 +1932,11 @@ mkfifo (const char *_path, mode_t mode)
   return -1;
 }
 
-/* setuid: POSIX 4.2.2.1 */
-extern "C" int
-setuid (__uid16_t uid)
-{
-  int ret = seteuid (uid);
-  if (!ret)
-    cygheap->user.real_uid = myself->uid;
-  debug_printf ("real: %d, effective: %d", cygheap->user.real_uid, myself->uid);
-  return ret;
-}
-
 extern struct passwd *internal_getlogin (cygheap_user &user);
 
 /* seteuid: standards? */
 extern "C" int
-seteuid (__uid16_t uid)
+seteuid32 (__uid32_t uid)
 {
   if (!wincap.has_security ()) return 0;
 
@@ -1974,7 +1963,7 @@ seteuid (__uid16_t uid)
 
   debug_printf ("uid: %d myself->gid: %d", uid, myself->gid);
 
-  pw_new = getpwuid (uid);
+  pw_new = getpwuid32 (uid);
   if (!usersid.getfrompw (pw_new) ||
       (!pgrpsid.getfromgr (getgrgid32 (myself->gid))))
     {
@@ -2145,6 +2134,29 @@ seteuid (__uid16_t uid)
   return -1;
 }
 
+extern "C" int
+seteuid (__uid16_t uid)
+{
+  return seteuid32 (uid16touid32 (uid));
+}
+
+/* setuid: POSIX 4.2.2.1 */
+extern "C" int
+setuid32 (__uid32_t uid)
+{
+  int ret = seteuid32 (uid);
+  if (!ret)
+    cygheap->user.real_uid = myself->uid;
+  debug_printf ("real: %d, effective: %d", cygheap->user.real_uid, myself->uid);
+  return ret;
+}
+
+extern "C" int
+setuid (__uid16_t uid)
+{
+  return setuid32 (uid16touid32 (uid));
+}
+
 /* setegid: from System V.  */
 extern "C" int
 setegid32 (__gid32_t gid)
@@ -2197,7 +2209,7 @@ setegid32 (__gid32_t gid)
 extern "C" int
 setegid (__gid16_t gid)
 {
-  return setegid32 ((__gid32_t) gid);
+  return setegid32 (gid16togid32 (gid));
 }
 
 /* setgid: POSIX 4.2.2.1 */
@@ -2213,7 +2225,7 @@ setgid32 (__gid32_t gid)
 extern "C" int
 setgid (__gid16_t gid)
 {
-  int ret = setegid32 ((__gid32_t) gid);
+  int ret = setegid32 (gid16togid32 (gid));
   if (!ret)
     cygheap->user.real_gid = myself->gid;
   return ret;
index b851b38..5f6a5d2 100644 (file)
@@ -282,6 +282,12 @@ getlogin (void)
   return strcpy (this_username, cygheap->user.name ());
 }
 
+extern "C" __uid32_t
+getuid32 (void)
+{
+  return cygheap->user.real_uid;
+}
+
 extern "C" __uid16_t
 getuid (void)
 {
@@ -300,6 +306,12 @@ getgid (void)
   return cygheap->user.real_gid;
 }
 
+extern "C" __uid32_t
+geteuid32 (void)
+{
+  return myself->uid;
+}
+
 extern "C" __uid16_t
 geteuid (void)
 {
index 69d5938..c153e91 100644 (file)
@@ -147,10 +147,19 @@ extern "C" void __stdcall do_exit (int) __attribute__ ((noreturn));
 /* UID/GID */
 void uinfo_init (void);
 
-#define ILLEGAL_UID ((__uid16_t)-1)
+#define ILLEGAL_UID16 ((__uid16_t)-1)
+#define ILLEGAL_UID ((__uid32_t)-1)
+#define ILLEGAL_GID16 ((__gid16_t)-1)
 #define ILLEGAL_GID ((__gid32_t)-1)
 #define ILLEGAL_SEEK ((__off64_t)-1)
 
+#define uid16touid32(u16)  ((u16)==ILLEGAL_UID16?ILLEGAL_UID:(__uid32_t)(u16))
+#define gid16togid32(g16)  ((g16)==ILLEGAL_GID16?ILLEGAL_GID:(__gid32_t)(g16))
+
+extern "C" __uid32_t getuid32 (void);
+extern "C" __uid32_t geteuid32 (void);
+extern "C" struct passwd *getpwuid32 (__uid32_t);
+
 /* various events */
 void events_init (void);
 void events_terminate (void);