From proett@floater.nas.nasa.gov  Tue Dec  9 16:25:49 1997
Received: from floater.nas.nasa.gov (floater.nas.nasa.gov [129.99.32.24])
          by hub.freebsd.org (8.8.7/8.8.7) with ESMTP id QAA22230
          for <FreeBSD-gnats-submit@freebsd.org>; Tue, 9 Dec 1997 16:25:47 -0800 (PST)
          (envelope-from proett@floater.nas.nasa.gov)
Received: (from proett@localhost)
	by floater.nas.nasa.gov (8.8.7/8.8.7) id OAA15678;
	Tue, 9 Dec 1997 14:00:44 -0800 (PST)
	(envelope-from proett)
Message-Id: <199712092200.OAA15678@floater.nas.nasa.gov>
Date: Tue, 9 Dec 1997 14:00:44 -0800 (PST)
From: Tom Proett <proett@floater.nas.nasa.gov>
Reply-To: proett@nas.nasa.gov
To: FreeBSD-gnats-submit@freebsd.org
Subject: change to ps
X-Send-Pr-Version: 3.2

>Number:         5262
>Category:       bin
>Synopsis:       display sid in ps
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Dec  9 16:30:01 PST 1997
>Closed-Date:    Tue Feb 10 22:41:03 PST 1998
>Last-Modified:  Tue Feb 10 22:42:47 PST 1998
>Originator:     Tom Proett
>Release:        FreeBSD 2.2.5-STABLE i386
>Organization:
NASA Ames Research Center
>Environment:

	

>Description:
The program ps with the option -j prints the session address under
the heading "SESS" for each process.  Most other systems print the
pid of the session leader.

	

>How-To-Repeat:

	

>Fix:
Here is a set of diff's for a new version of ps.  I tried applying them
with patch and it should work.
	

*** /usr/src/bin/ps/keyword.c	Wed Jul 31 02:27:23 1996
--- keyword.c	Tue Dec  9 12:26:02 1997
***************
*** 143,149 ****
  	{"ruid", "RUID", NULL, 0, evar, UIDLEN, EOFF(e_pcred.p_ruid),
  		ULONG, UIDFMT},
  	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
! 	{"sess", "SESS", NULL, 0, evar, 6, EOFF(e_sess), KPTR, "x"},
  	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_siglist), LONG, "x"},
  	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
  	{"sigignore", "IGNORED",
--- 143,149 ----
  	{"ruid", "RUID", NULL, 0, evar, UIDLEN, EOFF(e_pcred.p_ruid),
  		ULONG, UIDFMT},
  	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
! 	{"sess", "SID", NULL, 0, uvar, PIDLEN, UOFF(u_sid), ULONG, PIDFMT},
  	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_siglist), LONG, "x"},
  	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
  	{"sigignore", "IGNORED",
***************
*** 229,235 ****
  	{"ruid", "RUID", NULL, 0, pvar, UIDLEN, POFF(p_ruid), USHORT, UIDFMT},
  	{"rtprio", "RTPRIO", NULL, 0, pvar, 7, POFF(p_rtprio), LONG, "d"},
  	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
! 	{"sess", "SESS", NULL, 0, evar, 6, EOFF(e_sess), KPTR, "x"},
  	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_sig), LONG, "x"},
  	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
  	{"sigignore", "IGNORED",
--- 229,235 ----
  	{"ruid", "RUID", NULL, 0, pvar, UIDLEN, POFF(p_ruid), USHORT, UIDFMT},
  	{"rtprio", "RTPRIO", NULL, 0, pvar, 7, POFF(p_rtprio), LONG, "d"},
  	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
! 	{"sess", "SID", NULL, 0, uvar, PIDLEN, UOFF(u_sid), ULONG, PIDFMT},
  	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_sig), LONG, "x"},
  	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
  	{"sigignore", "IGNORED",
*** /usr/src/bin/ps/ps.c	Fri Jun  6 09:09:12 1997
--- ps.c	Tue Dec  9 12:26:01 1997
***************
*** 105,115 ****
  kvm_t *kd;
  
  int
  main(argc, argv)
  	int argc;
  	char *argv[];
  {
! 	struct kinfo_proc *kp;
  	struct varent *vent;
  	struct winsize ws;
  	struct passwd *pwd;
--- 105,133 ----
  kvm_t *kd;
  
  int
+ qs_cmp(a, b)
+     KINFO	*a;
+     KINFO	*b;
+ {
+ 	return((int)a->ki_p->kp_eproc.e_paddr - (int)b->ki_p->kp_eproc.e_paddr);
+ }
+ 
+ int
+ bs_cmp(key, member)
+     struct	session		*key;
+     KINFO			*member;
+ {
+ 	return((int)key->s_leader - (int)member->ki_p->kp_eproc.e_paddr);
+ }
+ 
+ int
  main(argc, argv)
  	int argc;
  	char *argv[];
  {
! 	struct kinfo_proc *kproc, *kp;
! 	KINFO *ki, *leader;
! 	struct session ss;
  	struct varent *vent;
  	struct winsize ws;
  	struct passwd *pwd;
***************
*** 316,326 ****
  	/*
  	 * select procs
  	 */
! 	if ((kp = kvm_getprocs(kd, what, flag, &nentries)) == 0)
  		errx(1, "%s", kvm_geterr(kd));
  	if ((kinfo = malloc(nentries * sizeof(*kinfo))) == NULL)
  		err(1, NULL);
! 	for (i = nentries; --i >= 0; ++kp) {
  		kinfo[i].ki_p = kp;
  		if (needuser)
  			saveuser(&kinfo[i]);
--- 334,344 ----
  	/*
  	 * select procs
  	 */
! 	if ((kproc = kvm_getprocs(kd, what, flag, &nentries)) == 0)
  		errx(1, "%s", kvm_geterr(kd));
  	if ((kinfo = malloc(nentries * sizeof(*kinfo))) == NULL)
  		err(1, NULL);
! 	for (i=0, kp=kproc; i<nentries; i++, kp++) {
  		kinfo[i].ki_p = kp;
  		if (needuser)
  			saveuser(&kinfo[i]);
***************
*** 331,336 ****
--- 349,384 ----
  	printheader();
  	if (nentries == 0)
  		exit(0);
+ 	/*
+ 	** get session leaders
+ 	*/
+ 	qsort(kinfo, nentries, sizeof(KINFO), qs_cmp);
+ 	for (i=0, ki=kinfo; i<nentries; i++, ki++) {
+ 		if (kvm_read(kd, (u_long)ki->ki_p->kp_eproc.e_sess,
+ 				&ss, sizeof(ss)) != sizeof(ss))
+ 			errx(1, "%s", kvm_geterr(kd));
+ /*
+ 		printf("0x%x pid %d sess 0x%x leader 0x%x\n",
+ 			ki->ki_p->kp_eproc.e_paddr,
+ 			ki->ki_p->kp_proc.p_pid,
+ 			(u_long)ki->ki_p->kp_eproc.e_sess, 
+ 			(u_long)ss.s_leader);
+ */
+ 		if (ss.s_leader == ki->ki_p->kp_eproc.e_paddr ||
+ 				ss.s_leader == NULL)
+ 			ki->ki_u.u_sid = ki->ki_p->kp_proc.p_pid;
+ 		else {
+ 			leader = (KINFO *)bsearch(&ss, kinfo, nentries,
+ 				sizeof(KINFO), bs_cmp);
+ 			ki->ki_u.u_sid = leader ?
+ 				leader->ki_p->kp_proc.p_pid : 0;
+ /*
+ 			printf("\tleader 0x%x sid %d\n", (u_long)leader,
+ 				ki->ki_u.u_sid);
+ */
+ 		}
+ 	}
+ 
  	/*
  	 * sort proc list
  	 */
*** /usr/src/bin/ps/ps.h	Fri Sep 23 19:56:48 1994
--- ps.h	Tue Dec  9 12:26:02 1997
***************
*** 43,48 ****
--- 43,49 ----
  	struct	rusage u_cru;
  	char	u_acflag;
  	char	u_valid;
+ 	pid_t	u_sid;			/* session leader */
  };
  
  #define KI_PROC(ki) (&(ki)->ki_p->kp_proc)
***************
*** 50,58 ****
  
  typedef struct kinfo {
  	struct kinfo_proc *ki_p;	/* proc structure */
! 	struct usave ki_u;	/* interesting parts of user */
! 	char *ki_args;		/* exec args */
! 	char *ki_env;		/* environment */
  } KINFO;
  
  /* Variables. */
--- 51,59 ----
  
  typedef struct kinfo {
  	struct kinfo_proc *ki_p;	/* proc structure */
! 	struct usave ki_u;		/* interesting parts of user */
! 	char	*ki_args;		/* exec args */
! 	char	*ki_env;		/* environment */
  } KINFO;
  
  /* Variables. */
>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: gnats-admin->freebsd-bugs 
Responsible-Changed-By: steve 
Responsible-Changed-When: Sun Dec 14 10:44:26 PST 1997 
Responsible-Changed-Why:  
Misfiled PR. 

From: Tom Proett <proett@nas.nasa.gov>
To: freebsd-gnats-submit@freebsd.org
Cc:  Subject: Re: bin/5262: display sid in ps
Date: Tue, 27 Jan 1998 15:52:34 -0800

 This bug is obsolete.  A better solution is given with PR
 kern/5587
 -- 
 proett@nas.nasa.gov
 NASA Ames Research Center
State-Changed-From-To: open->closed 
State-Changed-By: hoek 
State-Changed-When: Tue Feb 10 22:41:03 PST 1998 
State-Changed-Why:  
Submitter refers us to kern/5587 in which he submits his preferred 
fix.  5587 includes patch and brief followup. 
>Unformatted:
