]> Zhao Yanbai Git Server - minix.git/commitdiff
getpeuid implementation. Get the uid of a process (by endpoint)
authorPhilip Homburg <philip@cs.vu.nl>
Fri, 27 Apr 2007 12:21:06 +0000 (12:21 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Fri, 27 Apr 2007 12:21:06 +0000 (12:21 +0000)
include/minix/callnr.h
include/unistd.h
lib/other/Makefile.in
lib/other/getpeuid.c [new file with mode: 0755]
servers/pm/main.c
servers/pm/misc.c
servers/pm/proto.h

index 20930bc02bef6082938aa73f38443ec283af0141..1a64ae6c80b966a6c484b7bedb995da3e7c3e109 100755 (executable)
@@ -95,6 +95,7 @@
 #if 0
 #define FREEMEM                106     /* to PM, not used, not implemented */
 #endif
+#define GETPUID                107     /* to PM: get the uid of a process (endpoint) */
 
 #define DEVCTL         120     /* to FS, map or unmap a device */
 #define TASK_REPLY     121     /* to FS: reply code from drivers, not 
index c8790f270122906a7f1a75bd24f82a51fb06e47f..3e43c2f1a363f142c2684b0042cda10c23050ef6 100755 (executable)
@@ -198,6 +198,7 @@ _PROTOTYPE( int freemem, (phys_bytes size, phys_bytes base)         );
 #define unmapdriver(device) devctl(DEV_UNMAP, 0, device, 0)
 _PROTOTYPE( int devctl, (int ctl_req, int driver, int device, int style, 
        int force)                                                      );
+_PROTOTYPE( uid_t getpeuid, (endpoint_t ep)                            );
 
 /* For compatibility with other Unix systems */
 _PROTOTYPE( int getpagesize, (void)                                    );
index 56a9b9668f44cd4bff652804b909c7785854adf1..0528a068bbb95b5aec98de68c93d5cf3f1f23521 100644 (file)
@@ -44,6 +44,7 @@ libc_FILES=" \
        getlogin.c \
        getpagesize.c \
        getpass.c \
+       getpeuid.c \
        getpwent.c \
        getttyent.c \
        getw.c \
diff --git a/lib/other/getpeuid.c b/lib/other/getpeuid.c
new file mode 100755 (executable)
index 0000000..4c7e2cd
--- /dev/null
@@ -0,0 +1,12 @@
+#include <lib.h>
+#include <unistd.h>
+
+PUBLIC uid_t getpeuid(ep)
+endpoint_t ep;
+{
+  message m;
+
+  m.m1_i1= ep;
+  if (_syscall(MM, GETPUID, &m) < 0) return ( (uid_t) -1);
+  return( (uid_t) m.m2_i1);
+}
index 0c2df15ab19202c4dea99508d57a8bd19c3c987e..f59af00e70f4d646024bd6d3e1905d8b5a168b6d 100644 (file)
@@ -119,6 +119,9 @@ PUBLIC int main()
        case GETPROCNR:
                result= do_getprocnr();
                break;
+       case GETPUID:
+               result= do_getpuid();
+               break;
        default:
                /* Else, if the system call number is valid, perform the
                 * call.
index 9aa6bdb2e64b0d5ecee2429a1eb5ad2e7f65b86c..70147268d2bbc799bba12302fc2e2b62b443b10f 100644 (file)
@@ -5,6 +5,7 @@
  *   do_procstat: request process status  (Jorrit N. Herder)
  *   do_getsysinfo: request copy of PM data structure  (Jorrit N. Herder)
  *   do_getprocnr: lookup process slot number  (Jorrit N. Herder)
+ *   do_getpuid: get the uid/euid of a process given it's endpoint
  *   do_allocmem: allocate a chunk of memory  (Jorrit N. Herder)
  *   do_freemem: deallocate a chunk of memory  (Jorrit N. Herder)
  *   do_getsetpriority: get/set process priority
@@ -358,6 +359,35 @@ PUBLIC int do_getprocnr()
   return(OK);
 }
 
+/*===========================================================================*
+ *                             do_getpuid                                   *
+ *===========================================================================*/
+PUBLIC int do_getpuid()
+{
+  register struct mproc *rmp;
+  endpoint_t ep;
+
+  /* This call should be moved to DS. */
+  if (mp->mp_effuid != 0)
+  {
+       printf("PM: unauthorized call of do_getpuid by proc %d\n",
+               mp->mp_endpoint);
+       return EPERM;
+  }
+
+  ep= m_in.endpt;
+
+  for (rmp = &mproc[0]; rmp < &mproc[NR_PROCS]; rmp++) {
+       if ((rmp->mp_flags & IN_USE) && (rmp->mp_endpoint == ep)) {
+               mp->mp_reply.reply_res2 = rmp->mp_effuid;
+               return(rmp->mp_realuid);
+       }
+  } 
+
+  /* Process not found */
+  return(ESRCH);                       
+}
+
 /*===========================================================================*
  *                             do_reboot                                    *
  *===========================================================================*/
index 9b9436a911aac00936cf974a1ecf1de558c163c5..1cad787a85d7fed9c44a7949c426c78917d9f470 100644 (file)
@@ -68,6 +68,7 @@ _PROTOTYPE( int do_sysuname, (void)                                   );
 _PROTOTYPE( int do_getsysinfo, (void)                                  );
 _PROTOTYPE( int do_getsysinfo_up, (void)                                       );
 _PROTOTYPE( int do_getprocnr, (void)                                   );
+_PROTOTYPE( int do_getpuid, (void)                                     );
 _PROTOTYPE( int do_svrctl, (void)                                      );
 _PROTOTYPE( int do_allocmem, (void)                                    );
 _PROTOTYPE( int do_freemem, (void)                                     );