From a8d7ae61e7b832d354731b1d024e4ff1ed22fca0 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 29 May 2002 15:04:29 +0000 Subject: 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. --- winsup/cygwin/ChangeLog | 21 +++++++++++++ winsup/cygwin/child_info.h | 2 +- winsup/cygwin/cygheap.h | 4 +-- winsup/cygwin/cygwin.din | 6 ++++ winsup/cygwin/external.cc | 3 ++ winsup/cygwin/fhandler_disk_file.cc | 4 +-- winsup/cygwin/include/sys/cygwin.h | 5 ++++ winsup/cygwin/passwd.cc | 20 ++++++++++--- winsup/cygwin/sec_acl.cc | 6 ++-- winsup/cygwin/sec_helper.cc | 4 +-- winsup/cygwin/security.cc | 18 +++++------ winsup/cygwin/security.h | 6 ++-- winsup/cygwin/shm.cc | 6 ++-- winsup/cygwin/spawn.cc | 2 +- winsup/cygwin/syscalls.cc | 60 ++++++++++++++++++++++--------------- winsup/cygwin/uinfo.cc | 12 ++++++++ winsup/cygwin/winsup.h | 11 ++++++- 17 files changed, 135 insertions(+), 55 deletions(-) (limited to 'winsup') diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 6edb59107..e2e1ee4b6 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,24 @@ +2002-05-29 Corinna Vinschen + + 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 * include/cygwin/socket.h: Protect some symbols against multiple diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h index e79ca3947..fdfaa28ca 100644 --- a/winsup/cygwin/child_info.h +++ b/winsup/cygwin/child_info.h @@ -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; diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h index aa4e525ab..f4ef14459 100644 --- a/winsup/cygwin/cygheap.h +++ b/winsup/cygwin/cygheap.h @@ -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 diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 1d8ae0b81..ccea8797c 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -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 diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc index 3cbf9c0b2..8a06f0261 100644 --- a/winsup/cygwin/external.cc +++ b/winsup/cygwin/external.cc @@ -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; } } diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index de8476445..c4474f184 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -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) diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h index 38e3cb316..90cd07514 100644 --- a/winsup/cygwin/include/sys/cygwin.h +++ b/winsup/cygwin/include/sys/cygwin.h @@ -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, ...); diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc index 744fcd652..c526dd293 100644 --- a/winsup/cygwin/passwd.cc +++ b/winsup/cygwin/passwd.cc @@ -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) { diff --git a/winsup/cygwin/sec_acl.cc b/winsup/cygwin/sec_acl.cc index 47f1cb426..71a0147e8 100644 --- a/winsup/cygwin/sec_acl.cc +++ b/winsup/cygwin/sec_acl.cc @@ -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) diff --git a/winsup/cygwin/sec_helper.cc b/winsup/cygwin/sec_helper.cc index c5341128f..603796a9f 100644 --- a/winsup/cygwin/sec_helper.cc +++ b/winsup/cygwin/sec_helper.cc @@ -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, diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc index 58b10c844..819a33bc1 100644 --- a/winsup/cygwin/security.cc +++ b/winsup/cygwin/security.cc @@ -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; diff --git a/winsup/cygwin/security.h b/winsup/cygwin/security.h index db3df2901..183b84394 100644 --- a/winsup/cygwin/security.h +++ b/winsup/cygwin/security.h @@ -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 * diff --git a/winsup/cygwin/shm.cc b/winsup/cygwin/shm.cc index 8a32efb66..647c55dfe 100644 --- a/winsup/cygwin/shm.cc +++ b/winsup/cygwin/shm.cc @@ -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; diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index b18d7b47d..5b110548b 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -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; diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index afdc457e9..969389f31 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -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; diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc index b851b384d..5f6a5d25d 100644 --- a/winsup/cygwin/uinfo.cc +++ b/winsup/cygwin/uinfo.cc @@ -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) { diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index 69d5938ae..c153e91b6 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -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); -- cgit v1.2.3