Date: Sat, 8 Jul 1995 00:42:04 +0300 (EET DST) From: Jukka Ukkonen <jau@jau.csc.fi> To: hackers@freebsd.org Subject: new getsid(2) system call for freebsd... Message-ID: <199507072142.AAA00799@jau.csc.fi>
next in thread | raw e-mail | index | archive | help
Hi all! A couple of days ago I had a sudden moment of inspiration and I added an initial version of a new SVR4 style system call getsid(2) to FreeBSD. In fact the same piece of code should be just about all right also for other variants of BSD based systems, if anyone cares to import it to any of them. The rationale for such a new system call is first and foremost completeness and symmetry. The second reason is the fact that X/Open might begin requiring such a service in their XPG, which might become a portability issue one day. The third point is that now and then there are things that would be somewhat easier to do, if such an interface were available, and moreover it is practically impossible to do exactly the same thing in a user mode subroutine. My version is based on my interpretation of what has been said about getsid(2) in SGI Irix-6.0 manual pages. The idea is that the caller can ask the session id (actually the PID of the session leader) of any process in the system, if the caller runs with the EUID of root. Any process can also query the SID of any other process having the same EUID as the caller or that of any of it's own descendants. Naturally a process can also query it's own SID by specifying it's own PID or 0 as the parameter. The external prototype of the system call is extern pid_t getsid (pid_t target_process_id); In the current implementation I just grabbed syscall number 205 for this purpose, because it was the first one which I noticed not to be previously allocated for any other purpose. Some of you may certainly argue that some other code should be used instead, and some of you will supposedly even argue against having such a system call at all. Anyway you have now seen my reasoning for including getsid(2) in the system distribution, and the game is yours. You are free to change the syscall number and other details or even drop my patch, if you like. I could imagine at least one potential enhancement right now. The SID could maybe be stored in the session structure itself, so that getsid(2) would not depend on the original session leader or it's zombie being present in the system just in case a child process had survived after the termination of the original session leader. In my own system I will maintain my idea of which processes are allowed to use getsid(2) to query SIDs of other processes, which is as close to SVR4 (and supposedly also X/Open) definition I could get based on the documentation I had, unless or until someone is able to present a reasonably good basis for different access rules. The patch (diff -c) to all the minor but necessary changes is attached at the end of this message. (Oh yes, don't even ask. It should be obvious. I did not run makesyscalls.sh but made the changes to the .h files manually, though I also modified the syscalls.master file appropriately.) Cheers, // jau ------ / Jukka A. Ukkonen, FUNET / Centre for Scientific Computing /__ M.Sc. (sw-eng & cs) Tel: (Home) +358-0-578628 / Internet: ukkonen@csc.fi (Work) +358-0-4573208 / Internet: jau@funet.fi (Mobile) +358-400-606671 v X.400: c=fi, admd=fumail, no prmd, org=csc, pn=jukka.ukkonen ------------------------------ clip clip ------------------------------ *** /usr/src/lib/libc/sys/Makefile.inc.orig Sat May 27 07:17:04 1995 --- /usr/src/lib/libc/sys/Makefile.inc Fri Jul 7 01:46:41 1995 *************** *** 17,23 **** fchflags.o fchmod.o fchown.o fcntl.o flock.o fpathconf.o fstat.o \ fstatfs.o fsync.o getdirentries.o getdtablesize.o getegid.o \ geteuid.o getfh.o getfsstat.o getgid.o getgroups.o getitimer.o \ ! getpeername.o getpgrp.o getpid.o getppid.o getpriority.o \ getrlimit.o getrusage.o getsockname.o getsockopt.o gettimeofday.o \ getuid.o ioctl.o kill.o ktrace.o lfs_bmapv.o lfs_markv.o \ lfs_segclean.o lfs_segwait.o link.o listen.o lstat.o \ --- 17,23 ---- fchflags.o fchmod.o fchown.o fcntl.o flock.o fpathconf.o fstat.o \ fstatfs.o fsync.o getdirentries.o getdtablesize.o getegid.o \ geteuid.o getfh.o getfsstat.o getgid.o getgroups.o getitimer.o \ ! getpeername.o getpgrp.o getpid.o getppid.o getsid.o getpriority.o \ getrlimit.o getrusage.o getsockname.o getsockopt.o gettimeofday.o \ getuid.o ioctl.o kill.o ktrace.o lfs_bmapv.o lfs_markv.o \ lfs_segclean.o lfs_segwait.o link.o listen.o lstat.o \ *** /usr/include/sys/syscall.h.orig Sun Apr 23 15:22:06 1995 --- /usr/include/sys/syscall.h Fri Jul 7 01:12:45 1995 *************** *** 191,193 **** --- 191,194 ---- #define SYS___sysctl 202 #define SYS_mlock 203 #define SYS_munlock 204 + #define SYS_getsid 205 *** /usr/include/sys/syscall-hide.h.orig Fri Jul 7 01:14:16 1995 --- /usr/include/sys/syscall-hide.h Fri Jul 7 01:13:22 1995 *************** *** 214,216 **** --- 214,217 ---- HIDE_BSD(__sysctl) HIDE_BSD(mlock) HIDE_BSD(munlock) + HIDE_BSD(getsid) *** /sys/kern/init_sysent.c.orig Fri Jul 7 09:27:51 1995 --- /sys/kern/init_sysent.c Fri Jul 7 09:28:25 1995 *************** *** 177,182 **** --- 177,183 ---- int __sysctl(); int mlock(); int munlock(); + int getsid(); int lkmnosys(); #ifdef COMPAT_43 *************** *** 484,490 **** { 6, __sysctl }, /* 202 = __sysctl */ { 2, mlock }, /* 203 = mlock */ { 2, munlock }, /* 204 = munlock */ ! { 0, nosys }, /* 205 = nosys */ { 0, nosys }, /* 206 = nosys */ { 0, nosys }, /* 207 = nosys */ { 0, nosys }, /* 208 = nosys */ --- 485,492 ---- { 6, __sysctl }, /* 202 = __sysctl */ { 2, mlock }, /* 203 = mlock */ { 2, munlock }, /* 204 = munlock */ ! /* { 0, nosys }, 205 = nosys */ ! { 1, getsid }, /* 205 = getsid */ { 0, nosys }, /* 206 = nosys */ { 0, nosys }, /* 207 = nosys */ { 0, nosys }, /* 208 = nosys */ *** /sys/kern/kern_prot.c.orig Fri Jul 7 09:27:51 1995 --- /sys/kern/kern_prot.c Fri Jul 7 19:13:47 1995 *************** *** 95,100 **** --- 95,157 ---- return (0); } + /* + * External signature: pid_t getsid (pid_t); + * + * SVR4 style system call getsid() + * exists only because this is a trick which is practically + * impossible to do from within a user space subroutine. + * Often this kind of information is useful to have though, + * and probably X/Open will require this anyway. + */ + + struct getsid_args { + pid_t pid; + }; + + /* ARGSUSED */ + int + getsid (p, uap, retval) + struct proc *p; + struct getsid_args *uap; + int *retval; + { + /* + * Currently the expression + * + * *retval = p->p_session->s_leader->p_pid; + * + * is an easier to read form of... + * + * *retval = p->p_pgrp->pg_session->s_leader->p_pid; + */ + + register struct proc *targp; /* taget process */ + + if (! uap->pid || (uap->pid == p->p_pid)) + targp = p; + else { + if (! (targp = pfind(uap->pid))) + return (ESRCH); + + /* + * For true pedantics only... + * 1. Either current proc must be owned by root, + * 2. or by the same effective uid as the target, + * 3. or the target must be a descendant of the caller. + */ + if (p->p_cred->pc_ucred->cr_uid + && (targp->p_cred->pc_ucred->cr_uid + != p->p_cred->pc_ucred->cr_uid) + && ! inferior(targp)) + return (EPERM); + } + + *retval = targp->p_session->s_leader->p_pid; + + return (0); + } + /* ARGSUSED */ int getuid(p, uap, retval) *** /sys/kern/syscalls.c.orig Fri Jul 7 09:27:51 1995 --- /sys/kern/syscalls.c Fri Jul 7 09:28:25 1995 *************** *** 246,252 **** "__sysctl", /* 202 = __sysctl */ "mlock", /* 203 = mlock */ "munlock", /* 204 = munlock */ ! "#205", /* 205 = nosys */ "#206", /* 206 = nosys */ "#207", /* 207 = nosys */ "#208", /* 208 = nosys */ --- 246,253 ---- "__sysctl", /* 202 = __sysctl */ "mlock", /* 203 = mlock */ "munlock", /* 204 = munlock */ ! /* "#205", 205 = nosys */ ! "getsid", /* 205 = getsid */ "#206", /* 206 = nosys */ "#207", /* 207 = nosys */ "#208", /* 208 = nosys */ *** /sys/kern/syscalls.master.orig Fri Jul 7 09:27:51 1995 --- /sys/kern/syscalls.master Fri Jul 7 09:28:25 1995 *************** *** 277,283 **** ; here allows to avoid one in libc/sys/Makefile.inc. 203 STD 2 BSD mlock 204 STD 2 BSD munlock ! 205 UNIMPL 0 NOHIDE nosys 206 UNIMPL 0 NOHIDE nosys 207 UNIMPL 0 NOHIDE nosys 208 UNIMPL 0 NOHIDE nosys --- 277,284 ---- ; here allows to avoid one in libc/sys/Makefile.inc. 203 STD 2 BSD mlock 204 STD 2 BSD munlock ! ; 205 UNIMPL 0 NOHIDE nosys ! 205 STD 1 BSD getsid 206 UNIMPL 0 NOHIDE nosys 207 UNIMPL 0 NOHIDE nosys 208 UNIMPL 0 NOHIDE nosys *** /usr/include/unistd.h.orig Sun Jun 4 16:45:57 1995 --- /usr/include/unistd.h Fri Jul 7 08:25:45 1995 *************** *** 76,81 **** --- 76,82 ---- pid_t getpgrp __P((void)); pid_t getpid __P((void)); pid_t getppid __P((void)); + pid_t getsid __P((pid_t)); uid_t getuid __P((void)); int isatty __P((int)); int link __P((const char *, const char *));
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199507072142.AAA00799>