ftp.nice.ch/pub/next/tools/system/process_pedigree.NI.bs.tar.gz#/process_pedigree/pedigree.c

This is pedigree.c in view mode; [Download] [Up]

/* pedigree: show process ancestry
 * Eric P. Scott, San Francisco State University, July 1993
 *	added -h switch -- Bruce Gingery bruce@TotSysSoft.com Wed Aug  4 03:17:30 MDT 1993

 *
 * Compile on 2.x:
 *   cc -o pedigree -s -object -O -bsd pedigree.c
 * Compile on 3.0:
 *   cc -o pedigree -s -object -O -bsd -DNX_COMPILER_RELEASE_3_0 pedigree.c
 * Compile on 3.1:
 *   cc -o pedigree -s -object -O2 -bsd -fno-builtin pedigree.c
 */
#include <stdio.h>
#include <sys/errno.h>
#ifdef __STRICT_BSD__
#include <strings.h>
#else
#include <string.h>
#endif
#include <sys/types.h>
#include <sys/dir.h>
#include <sys/stat.h>
#ifndef NX_COMPILER_RELEASE_3_0
#include <sys/table.h>
#else
/*
 * Mach Operating System
 * Copyright (c) 1986 Carnegie-Mellon University
 * All rights reserved.  The CMU software License Agreement specifies
 * the terms and conditions for use and redistribution.
 */
#define	TBL_PROCINFO		10	/* index by proc table slot */
/*
 *	TBL_PROCINFO data layout
 */
#define	PI_COMLEN	19	/* length of command string */
struct tbl_procinfo
{
    int		pi_uid;		/* user ID */
    int		pi_pid;		/* proc ID */
    int		pi_ppid;	/* parent proc ID */
    int		pi_pgrp;	/* proc group ID */
    int		pi_ttyd;	/* controlling terminal number */
    int		pi_status;	/* process status: */
#define	PI_EMPTY	0	    /* no process */
#define	PI_ACTIVE	1	    /* active process */
#define	PI_EXITING	2	    /* exiting */
#define	PI_ZOMBIE	3	    /* zombie */
    int		pi_flag;	/* other random flags */
    char	pi_comm[PI_COMLEN+1];
				/* short command name */
};
#endif

main(argc, argv)
int argc;
char *argv[];
{
    extern int errno;
    int chrdev();
    register struct direct *d, **dp;
    register int i;
    int pid, n;
    struct tbl_procinfo pi;
    struct direct **df;
    dev_t lastd;
    char tty[4];

    if (argc<1||argc>2) {
	    (void)fprintf(stderr, "Usage: %s [pid]\n", *argv);
	    exit(1);
    }
    if (argc==2) {
	 	 if (!strcmp(argv[1],"-h")) {
	    	  (void)fprintf(stderr, "Usage: %s [pid]\n", *argv);
	    	  exit(1);
		 }
	    pid=atoi(argv[1]);
	    if (kill(pid, 0)<0&&errno!=EPERM) {
		    perror(argv[1]);
		    exit(1);
	    }
    }
    else pid=getpid();
    if (chdir("/dev")<0) {
	perror("chdir");
	exit(1);
    }
    if ((n=scandir(".", &df, chrdev, alphasort))<0) {
	(void)fputs("scandir() failed\n", stderr);
	exit(1);
    }
    lastd=(dev_t)-1;
    tty[0]='?', tty[1]='\0'; tty[2]='\0', tty[3]='\0';
    (void)fputs("  UID   PID  PPID  PGRP TT COMMAND\n", stdout);
    for (;;) {
	if (table(TBL_PROCINFO, pid, (char *)&pi, 1,
	    sizeof pi)==1&&pi.pi_status==PI_ACTIVE) {
	    if (pi.pi_ttyd!=lastd) {
		if (pi.pi_ttyd<0) tty[0]='?', tty[1]='\0';
		else {
		    dp=df;
		    i=n; do {
			d= *dp++;
			if (*(dev_t *)&d->d_ino==(dev_t)pi.pi_ttyd) {
			    if (d->d_namlen>3&&!strncmp(d->d_name, "tty", 3))
				(void)strncpy(tty, d->d_name+3, 3); 
			    else {
				tty[0]=d->d_name[0], tty[1]=d->d_name[1];
				tty[2]='\0';
			    }
			    goto x;
			}
		    } while (--i>0);
		    tty[0]='?', tty[1]='?'; tty[2]='\0';
		}
	    x:
		lastd=pi.pi_ttyd;
	    }
	    (void)printf("%5d %5d %5d %5d %-3s%.*s\n", pi.pi_uid,
		pid, pi.pi_ppid, pi.pi_pgrp, tty,
		PI_COMLEN, pi.pi_comm);
	}
	else {
	    (void)fputs("something went wrong\n", stderr);
	    exit(1);
	}
	if (pid<=1) break;
	pid=pi.pi_ppid;
    }
    exit(0);
}

int chrdev(d)
struct direct *d;
{
	struct stat st;

	if (d->d_name[0]=='t'||(d->d_name[0]=='c'&&d->d_name[1]=='o')) {
		d->d_name[d->d_namlen]='\0';
		if (stat(d->d_name, &st)>=0&&(st.st_mode&S_IFMT)==S_IFCHR) {
			*(dev_t *)&d->d_ino=st.st_rdev;
			return(1);
		}
	}
	return(0);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.