Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 16 Sep 1995 18:02:10 +0300 (EET DST)
From:      Jukka Ukkonen <jau@jau.csc.fi>
To:        hackers@freebsd.org, questions@freebsd.org
Subject:   Session ID and ps showing real SID...
Message-ID:  <199509161502.SAA02059@jau.csc.fi>

Next in thread | Raw E-Mail | Index | Archive | Help

	Hi all!

	It has been quite a while since offered I my idea of adding
	a system call named getsid() to FreeBSD. Afterwards I have
	added also a new TIOCGSID ioctl to the system and fixed
	a bit my initial getsid(). I also modified ps to show the SID
	instead of the addresses of the session structures. The old
	"ps -j" is now invoked with "ps -J" in my system. I think my
	current -j option is much more informative than the original
	version. Here is a sample of the output from "ps -jax"

(jau) 17:02 ~# ps -jax
USER       PID  PPID  PGID   SID JOBC STAT TT       TIME COMMAND
root         0     0     0   176    0 DLs  ??    0:00.00  (swapper)
root         1     0     1     1    0 Is   ??    0:00.06 /sbin/init --
root         2     0     0     0    0 DL   ??    0:01.37  (pagedaemon)
root         3     0     0     0    0 DL   ??    0:00.16  (vmdaemon)
root         4     0     0     0    0 DL   ??    0:00.54  (update)
root        56     1    56    56    0 Is   ??    0:00.31 syslogd
root        65     1    65    65    0 S<s  ??    0:00.57 xntpd -f /etc/xntp.dri
daemon      69     1    69    69    0 IWs  ??    0:00.02 /usr/local/sbin/portma
root        78     1    78    78    0 Is   ??    0:00.22 inetd
root        85     1    85    85    0 Ss   ??    0:00.10 cron
root        87     1    87    87    0 IWs  ??    0:00.05 lpd
root        92     1    92    92    0 Is   ??    0:00.05 sendmail: accepting co
uucp       143     1   143   143    0 IWs  ??    0:00.08 /usr/local/sbin/faxq
root       160   159   160   146    1 S    ??    0:19.24 X -auth /home/jau/.Xau
jau        177   172   177   177    0 Is   p0    0:01.99 -csh (tcsh)
jau        176   171   176   176    0 Is   p1    0:01.85 -csh (tcsh)
root       213   176   213   176    1 S    p1    0:01.98 -root (tcsh)
root       266   213   266   176    1 R+   p1    0:00.02 ps -jax
jau        178   170   178   178    0 Is+  p2    0:02.08 -csh (tcsh)
jau        146     1   146   146    0 IWs  v0    0:01.80 -tcsh (tcsh)
jau        152   146   152   146    1 IW+  v0    0:00.09 /bin/sh /usr/X11R6/bin
jau        159   152   152   146    1 I+   v0    0:00.12 xinit /home/jau/.xinit
jau        161   159   161   146    1 S    v0    0:01.64 tvtwm
jau        168   161   161   146    1 S    v0    0:01.40 xclock -update 1 -geom
jau        169   161   161   146    1 S    v0    0:00.41 xbiff -volume 0 -geome
root       170   161   161   146    1 I    v0    0:01.38 xterm -sb -132 -aw -rw
root       171   161   161   146    1 S    v0    0:01.55 xterm -sb -132 -aw -rw
root       172   161   161   146    1 S    v0    0:05.64 xterm -sb -132 -aw -rw
root       147     1   147   147    0 IWs+ v1    0:00.08 /usr/libexec/getty Pc
root       148     1   148   148    0 IWs+ v2    0:00.04 /usr/libexec/getty Pc
root       233     1   233   233    0 Is+  01    0:00.01 slattach -a -s 38400 -

	Well, before anyone gets too upset about my getsid() idea I should
	point out that I am not trying to push it to anyone or anywhere,
	but I have really enjoyed it being there and simply wish to share
	the benefits with others. The chance of having a more informative
	ps command is a nice example of when such a feature becomes handy.
	

	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


# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	getsid.patch
#	ps-sid.patch
#	TIOCGSID.patch
#
echo x - getsid.patch
sed 's/^X//' >getsid.patch << 'END-of-getsid.patch'
X*** /usr/src/lib/libc/sys/Makefile.inc.orig	Sat May 27 07:17:04 1995
X--- /usr/src/lib/libc/sys/Makefile.inc	Fri Jul  7 01:46:41 1995
X***************
X*** 17,23 ****
X  	fchflags.o fchmod.o fchown.o fcntl.o flock.o fpathconf.o fstat.o \
X  	fstatfs.o fsync.o getdirentries.o getdtablesize.o getegid.o \
X  	geteuid.o getfh.o getfsstat.o getgid.o getgroups.o getitimer.o \
X! 	getpeername.o getpgrp.o getpid.o getppid.o getpriority.o \
X  	getrlimit.o getrusage.o getsockname.o getsockopt.o gettimeofday.o \
X  	getuid.o ioctl.o kill.o ktrace.o lfs_bmapv.o lfs_markv.o \
X  	lfs_segclean.o lfs_segwait.o link.o listen.o lstat.o \
X--- 17,23 ----
X  	fchflags.o fchmod.o fchown.o fcntl.o flock.o fpathconf.o fstat.o \
X  	fstatfs.o fsync.o getdirentries.o getdtablesize.o getegid.o \
X  	geteuid.o getfh.o getfsstat.o getgid.o getgroups.o getitimer.o \
X! 	getpeername.o getpgrp.o getpid.o getppid.o getsid.o getpriority.o \
X  	getrlimit.o getrusage.o getsockname.o getsockopt.o gettimeofday.o \
X  	getuid.o ioctl.o kill.o ktrace.o lfs_bmapv.o lfs_markv.o \
X  	lfs_segclean.o lfs_segwait.o link.o listen.o lstat.o \
X*** /usr/include/sys/syscall.h.orig	Sun Apr 23 15:22:06 1995
X--- /usr/include/sys/syscall.h	Sat Jul  8 00:07:56 1995
X***************
X*** 191,193 ****
X--- 191,194 ----
X  #define	SYS___sysctl	202
X  #define	SYS_mlock	203
X  #define	SYS_munlock	204
X+ #define	SYS_getsid	205
X*** /usr/include/sys/syscall-hide.h.orig	Fri Jul  7 01:14:16 1995
X--- /usr/include/sys/syscall-hide.h	Fri Jul  7 01:13:22 1995
X***************
X*** 214,216 ****
X--- 214,217 ----
X  HIDE_BSD(__sysctl)
X  HIDE_BSD(mlock)
X  HIDE_BSD(munlock)
X+ HIDE_BSD(getsid)
X*** /sys/kern/init_sysent.c.orig	Fri Jul  7 09:27:51 1995
X--- /sys/kern/init_sysent.c	Fri Jul  7 09:28:25 1995
X***************
X*** 177,182 ****
X--- 177,183 ----
X  int	__sysctl();
X  int	mlock();
X  int	munlock();
X+ int	getsid();
X  int	lkmnosys();
X  
X  #ifdef COMPAT_43
X***************
X*** 484,490 ****
X  	{ 6, __sysctl },			/* 202 = __sysctl */
X  	{ 2, mlock },			/* 203 = mlock */
X  	{ 2, munlock },			/* 204 = munlock */
X! 	{ 0, nosys },			/* 205 = nosys */
X  	{ 0, nosys },			/* 206 = nosys */
X  	{ 0, nosys },			/* 207 = nosys */
X  	{ 0, nosys },			/* 208 = nosys */
X--- 485,492 ----
X  	{ 6, __sysctl },			/* 202 = __sysctl */
X  	{ 2, mlock },			/* 203 = mlock */
X  	{ 2, munlock },			/* 204 = munlock */
X! 	/* { 0, nosys },		205 = nosys */
X! 	{ 1, getsid },			/* 205 = getsid */
X  	{ 0, nosys },			/* 206 = nosys */
X  	{ 0, nosys },			/* 207 = nosys */
X  	{ 0, nosys },			/* 208 = nosys */
X*** /sys/kern/kern_proc.c.orig	Tue May 30 11:05:37 1995
X--- /sys/kern/kern_proc.c	Sun Jul  9 13:35:29 1995
X***************
X*** 211,216 ****
X--- 211,217 ----
X  			MALLOC(sess, struct session *, sizeof(struct session),
X  				M_SESSION, M_WAITOK);
X  			sess->s_leader = p;
X+ 			sess->s_sid = p->p_pid;
X  			sess->s_count = 1;
X  			sess->s_ttyvp = NULL;
X  			sess->s_ttyp = NULL;
X*** /sys/kern/kern_prot.c.orig	Fri Jul  7 09:27:51 1995
X--- /sys/kern/kern_prot.c	Mon Jul 10 00:00:16 1995
X***************
X*** 95,100 ****
X--- 95,149 ----
X  	return (0);
X  }
X  
X+ /*
X+  *  External signature: pid_t	getsid (pid_t);
X+  *
X+  *  SVR4 style system call getsid() exists only for
X+  *  compatibility because this is a trick which is practically
X+  *  impossible to do from within a user space subroutine.
X+  *  Often this kind of information is useful to have though,
X+  *  and probably X/Open will require this anyway.
X+  */
X+ 
X+ struct getsid_args {
X+     pid_t   pid;
X+ };
X+ 
X+ /* ARGSUSED */
X+ int
X+ getsid (p, uap, retval)
X+     struct proc		*p;
X+     struct getsid_args	*uap;
X+     int			*retval;
X+ {
X+     register struct proc    *targp;		/* taget process */
X+ 
X+     if (! uap->pid || (uap->pid == p->p_pid))
X+ 	targp = p;
X+     else {
X+ 	if (! (targp = pfind(uap->pid)))
X+ 	    return (ESRCH);
X+ 
X+ 	/*
X+ 	 *  For true pedantics only...
X+ 	 *  1.	Either current proc must be owned by root,
X+ 	 *  2.	or be part of the same session as the target,
X+ 	 *  3.	or be owned by the same effective uid as the target,
X+ 	 *  4.  or target must be a descendant of the caller.
X+ 	 */
X+ 	if (p->p_cred->pc_ucred->cr_uid
X+ 	    && (targp->p_session != p->p_session)
X+ 	    && (targp->p_cred->pc_ucred->cr_uid 
X+ 		!= p->p_cred->pc_ucred->cr_uid)
X+ 	    && ! inferior(targp))
X+ 	    return (EPERM);
X+     }
X+ 
X+     *retval = targp->p_session->s_sid;
X+ 
X+     return (0);
X+ }
X+ 
X  /* ARGSUSED */
X  int
X  getuid(p, uap, retval)
X*** /sys/kern/syscalls.c.orig	Fri Jul  7 09:27:51 1995
X--- /sys/kern/syscalls.c	Fri Jul  7 09:28:25 1995
X***************
X*** 246,252 ****
X  	"__sysctl",			/* 202 = __sysctl */
X  	"mlock",			/* 203 = mlock */
X  	"munlock",			/* 204 = munlock */
X! 	"#205",			/* 205 = nosys */
X  	"#206",			/* 206 = nosys */
X  	"#207",			/* 207 = nosys */
X  	"#208",			/* 208 = nosys */
X--- 246,253 ----
X  	"__sysctl",			/* 202 = __sysctl */
X  	"mlock",			/* 203 = mlock */
X  	"munlock",			/* 204 = munlock */
X! 	/* "#205",			205 = nosys */
X! 	"getsid",			/* 205 = getsid */
X  	"#206",			/* 206 = nosys */
X  	"#207",			/* 207 = nosys */
X  	"#208",			/* 208 = nosys */
X*** /sys/kern/syscalls.master.orig	Fri Jul  7 09:27:51 1995
X--- /sys/kern/syscalls.master	Fri Jul  7 09:28:25 1995
X***************
X*** 277,283 ****
X  ; here allows to avoid one in libc/sys/Makefile.inc.
X  203	STD	2 BSD	mlock
X  204	STD	2 BSD	munlock
X! 205	UNIMPL	0 NOHIDE nosys
X  206	UNIMPL	0 NOHIDE nosys
X  207	UNIMPL	0 NOHIDE nosys
X  208	UNIMPL	0 NOHIDE nosys
X--- 277,284 ----
X  ; here allows to avoid one in libc/sys/Makefile.inc.
X  203	STD	2 BSD	mlock
X  204	STD	2 BSD	munlock
X! ; 205	UNIMPL	0 NOHIDE nosys
X! 205	STD	1 BSD	getsid
X  206	UNIMPL	0 NOHIDE nosys
X  207	UNIMPL	0 NOHIDE nosys
X  208	UNIMPL	0 NOHIDE nosys
X*** /usr/include/unistd.h.orig	Sun Jun  4 16:45:57 1995
X--- /usr/include/unistd.h	Fri Jul  7 08:25:45 1995
X***************
X*** 76,81 ****
X--- 76,82 ----
X  pid_t	 getpgrp __P((void));
X  pid_t	 getpid __P((void));
X  pid_t	 getppid __P((void));
X+ pid_t	 getsid __P((pid_t));
X  uid_t	 getuid __P((void));
X  int	 isatty __P((int));
X  int	 link __P((const char *, const char *));
END-of-getsid.patch
echo x - ps-sid.patch
sed 's/^X//' >ps-sid.patch << 'END-of-ps-sid.patch'
X*** extern.h.orig	Sat Sep 24 02:56:42 1994
X--- extern.h	Sun Jul 30 10:32:15 1995
X***************
X*** 50,55 ****
X--- 50,56 ----
X  void	 cputime __P((KINFO *, VARENT *));
X  int	 donlist __P((void));
X  void	 evar __P((KINFO *, VARENT *));
X+ void	 psid __P((KINFO *, VARENT *));
X  char	*fmt_argv __P((char **, char *, int));
X  double	 getpcpu __P((KINFO *));
X  double	 getpmem __P((KINFO *));
X*** keyword.c.orig	Sun Oct  2 08:33:28 1994
X--- keyword.c	Sun Jul 30 10:59:36 1995
X***************
X*** 143,148 ****
X--- 143,149 ----
X  		ULONG, UIDFMT},
X  	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
X  	{"sess", "SESS", NULL, 0, evar, 6, EOFF(e_sess), KPTR, "x"},
X+ 	{"sid", "SID", NULL, 0, psid, PIDLEN, POFF(p_pid), LONG, PIDFMT},
X  	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_siglist), LONG, "x"},
X  	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
X  	{"sigignore", "IGNORED",
X***************
X*** 160,165 ****
X--- 161,167 ----
X  	{"time", "TIME", NULL, USER, cputime, 9},
X  	{"tpgid", "TPGID", NULL, 0, evar, 4, EOFF(e_tpgid), ULONG, PIDFMT},
X  	{"tsess", "TSESS", NULL, 0, evar, 6, EOFF(e_tsess), KPTR, "x"},
X+ /*	{"tsess", "TSESS", NULL, 0, psid, 6, EOFF(e_tsess), LONG, "d"},	*/
X  	{"tsiz", "TSIZ", NULL, 0, tsize, 4},
X  	{"tt", "TT", NULL, LJUST, tname, 3},
X  	{"tty", "TTY", NULL, LJUST, longtname, 8},
X***************
X*** 229,234 ****
X--- 231,237 ----
X  	{"rtprio", "RTPRIO", NULL, 0, pvar, 7, POFF(p_rtprio), LONG, "d"},
X  	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
X  	{"sess", "SESS", NULL, 0, evar, 6, EOFF(e_sess), KPTR, "x"},
X+ 	{"sid", "SID", NULL, 0, psid, PIDLEN, POFF(p_pid), LONG, PIDFMT},
X  	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_sig), LONG, "x"},
X  	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
X  	{"sigignore", "IGNORED",
X***************
X*** 247,252 ****
X--- 250,256 ----
X  	{"tpgid", "TPGID", NULL, 0, evar, 4, EOFF(e_tpgid), ULONG, PIDFMT},
X  	{"trs", "TRS", NULL, 0, trss, 3},
X  	{"tsess", "TSESS", NULL, 0, evar, 6, EOFF(e_tsess), KPTR, "x"},
X+ /*	{"tsess", "TSESS", NULL, 0, psid, 6, EOFF(e_tsess), LONG, "d"},	*/
X  	{"tsiz", "TSIZ", NULL, 0, tsize, 4},
X  	{"tt", "TT", NULL, LJUST, tname, 3},
X  	{"tty", "TTY", NULL, LJUST, longtname, 8},
X*** print.c.orig	Tue May 30 00:07:04 1995
X--- print.c	Sun Jul 30 10:17:58 1995
X***************
X*** 742,744 ****
X--- 742,757 ----
X  	else
X  		(void)printf("%*s", v->width, "-");
X  }
X+ 
X+ void
X+ psid(k, ve)
X+ 	KINFO *k;
X+ 	VARENT *ve;
X+ {
X+ 	VAR	*v;
X+ 	pid_t	sid = getsid (k->ki_p->kp_proc.p_pid);
X+ 
X+ 	v = ve->var;
X+ 	printval((char *) &sid, v);
X+ }
X+ 
X*** ps.c.orig	Tue May 30 03:07:05 1995
X--- ps.c	Tue Aug  1 19:48:42 1995
X***************
X*** 92,98 ****
X  static void	 usage __P((void));
X  
X  char dfmt[] = "pid tt state time command";
X! char jfmt[] = "user pid ppid pgid sess jobc state tt time command";
X  char lfmt[] = "uid pid ppid cpu pri nice vsz rss wchan state tt time command";
X  char   o1[] = "pid";
X  char   o2[] = "tt state time command";
X--- 92,99 ----
X  static void	 usage __P((void));
X  
X  char dfmt[] = "pid tt state time command";
X! char Jfmt[] = "user pid ppid pgid sess jobc state tt time command";
X! char jfmt[] = "user pid ppid pgid sid jobc state tt time command";
X  char lfmt[] = "uid pid ppid cpu pri nice vsz rss wchan state tt time command";
X  char   o1[] = "pid";
X  char   o2[] = "tt state time command";
X***************
X*** 133,139 ****
X  	ttydev = NODEV;
X  	memf = nlistf = swapf = NULL;
X  	while ((ch = getopt(argc, argv,
X! 	    "aCeghjLlM:mN:O:o:p:rSTt:uvW:wx")) != EOF)
X  		switch((char)ch) {
X  		case 'a':
X  			all = 1;
X--- 134,140 ----
X  	ttydev = NODEV;
X  	memf = nlistf = swapf = NULL;
X  	while ((ch = getopt(argc, argv,
X! 	    "aCeghJjLlM:mN:O:o:p:rSTt:uvW:wx")) != EOF)
X  		switch((char)ch) {
X  		case 'a':
X  			all = 1;
X***************
X*** 148,153 ****
X--- 149,159 ----
X  			break;			/* no-op */
X  		case 'h':
X  			prtheader = ws.ws_row > 5 ? ws.ws_row : 22;
X+ 			break;
X+ 		case 'J':
X+ 			parsefmt(Jfmt);
X+ 			fmt = 1;
X+ 			jfmt[0] = '\0';
X  			break;
X  		case 'j':
X  			parsefmt(jfmt);
END-of-ps-sid.patch
echo x - TIOCGSID.patch
sed 's/^X//' >TIOCGSID.patch << 'END-of-TIOCGSID.patch'
X*** /usr/include/sys/ttycom.h.orig	Tue May 30 11:14:42 1995
X--- /usr/include/sys/ttycom.h	Fri Aug 18 19:51:59 1995
X***************
X*** 90,95 ****
X--- 90,96 ----
X  #define	TIOCCBRK	 _IO('t', 122)		/* clear break bit */
X  #define	TIOCSDTR	 _IO('t', 121)		/* set data terminal ready */
X  #define	TIOCCDTR	 _IO('t', 120)		/* clear data terminal ready */
X+ #define	TIOCGSID	_IOR('t', 128, int)	/* get sid of a tty */
X  #define	TIOCGPGRP	_IOR('t', 119, int)	/* get pgrp of tty */
X  #define	TIOCSPGRP	_IOW('t', 118, int)	/* set pgrp of tty */
X  						/* 117-116 compat */
X*** /sys/kern/tty.c.orig	Mon Jun  5 09:11:05 1995
X--- /sys/kern/tty.c	Fri Aug 18 19:57:37 1995
X***************
X*** 771,776 ****
X--- 771,784 ----
X  			return (ENOTTY);
X  		*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
X  		break;
X+ #ifdef	TIOCGSID
X+ 	case TIOCGSID:			/* get sid of a tty */
X+ 		if (!isctty(p, tp))
X+ 			return (ENOTTY);
X+ 		*(int *)data = (tp->t_session
X+ 				? tp->t_t_session->s_sid : NO_PID);
X+ 		break;
X+ #endif
X  #ifdef TIOCHPCL
X  	case TIOCHPCL:			/* hang up on last close */
X  		s = spltty();
END-of-TIOCGSID.patch
exit




Want to link to this message? Use this URL: <http://docs.FreeBSD.org/cgi/mid.cgi?199509161502.SAA02059>