]> sourceware.org Git - newlib-cygwin.git/commitdiff
* syscalls.cc (setuid): Allow switching user context after
authorCorinna Vinschen <corinna@vinschen.de>
Wed, 19 Apr 2000 22:33:20 +0000 (22:33 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Wed, 19 Apr 2000 22:33:20 +0000 (22:33 +0000)
successful call to ImpersonateLogedOnUser (NT only).
(setgid): Ditto.
(seteuid): Call setuid.
(setegid): Call setgid.

winsup/cygwin/ChangeLog
winsup/cygwin/syscalls.cc

index 3383b28e97df955cc6e028165948318267e2e815..a9df3b7e357de97e89571bda63770c381c6f83c1 100644 (file)
@@ -1,3 +1,11 @@
+Wed Apr 20  0:19:00 2000  Corinna Vinschen <corinna@vinschen.de>
+
+        * syscalls.cc (setuid): Allow switching user context after
+        successful call to ImpersonateLogedOnUser (NT only).
+        (setgid): Ditto.
+        (seteuid): Call setuid.
+        (setegid): Call setgid.
+
 Wed Apr 19 22:00:00 2000  Corinna Vinschen <corinna@vinschen.de>
 
         * uinfo.cc (internal_getlogin): Use NetGetDCName() instead
index ca9777f794a68ab28c87383653b5e716bff14049..23faca91143c21f8c4ca723dba49623f8cd22cb1 100644 (file)
@@ -1689,41 +1689,79 @@ mknod ()
 }
 
 /* setgid: POSIX 4.2.2.1 */
-/* FIXME: unimplemented! */
 extern "C"
 int
-setgid (gid_t)
+setgid (gid_t gid)
 {
-  set_errno (ENOSYS);
+  if (os_being_run == winNT)
+    {
+      if (gid != (gid_t) -1)
+        {
+          if (!getgrgid (gid))
+            {
+              set_errno (EINVAL);
+              return -1;
+            }
+          myself->gid = gid;
+        }
+    }
+  else
+    set_errno (ENOSYS);
   return 0;
 }
 
+extern char *internal_getlogin (struct pinfo *pi);
+
 /* setuid: POSIX 4.2.2.1 */
-/* FIXME: unimplemented! */
 extern "C"
 int
-setuid (uid_t)
+setuid (uid_t uid)
 {
-  set_errno (ENOSYS);
+  if (os_being_run == winNT)
+    {
+      if (uid != (uid_t) -1)
+        {
+          struct passwd *pw_new = getpwuid (uid);
+          if (!pw_new)
+            {
+              set_errno (EINVAL);
+              return -1;
+            }
+
+          struct pinfo pi;
+          pi.psid = (PSID) pi.sidbuf;
+          struct passwd *pw_cur = getpwnam (internal_getlogin (&pi));
+          if (pw_cur != pw_new)
+            {
+              set_errno (EPERM);
+              return -1;
+            }
+          myself->uid = uid;
+          strcpy (myself->username, pi.username);
+          CopySid (40, myself->psid, pi.psid);
+          strcpy (myself->logsrv, pi.logsrv);
+          strcpy (myself->domain, pi.domain);
+        }
+    }
+  else
+    set_errno (ENOSYS);
   return 0;
 }
 
 /* seteuid: standards? */
 extern "C"
 int
-seteuid (uid_t)
+seteuid (uid_t uid)
 {
-  set_errno (ENOSYS);
-  return 0;
+  return setuid (uid);
 }
 
 /* setegid: from System V.  */
 extern "C"
 int
-setegid (gid_t)
+setegid (gid_t gid)
 {
-  set_errno (ENOSYS);
-  return 0;
+  return setgid (gid);
 }
 
 /* chroot: privileged Unix system call.  */
This page took 0.036818 seconds and 5 git commands to generate.