The Unix Heritage Society mailing list
 help / color / mirror / Atom feed
* [TUHS] Unix v7 ps command question
@ 2023-03-04 19:49 KenUnix
  0 siblings, 0 replies; only message in thread
From: KenUnix @ 2023-03-04 19:49 UTC (permalink / raw)
  To: UNIX TUHS Group


[-- Attachment #1.1: Type: text/plain, Size: 963 bytes --]

Hi,

When executing ps alx on the interdata sim I get good output:

# ps alx
 F S UID   PID  PPID CPU PRI NICE  ADDR  SZ  WCHAN TTY TIME CMD
 3 S   0     0     0 255   0   20  2235   2   4262 ?  36:48 swapper
 1 S   0     1     0   0  30   20  2255   8  46060 ?   0:00 /etc/init
 1 S   0    19     1   0  30   20  2745  11  46114 co  0:00 -sh
 1 R   0   301    19   4  50   20  4056  20        co  0:00 ps alx
 1 S   0    12     1   0  40   20  2545   5 140000 ?   0:00 /etc/update
 1 S   1    18     1   0  40   20  2625  10 140000 ?   0:00 /etc/cron
#

When executing ps alx on the pdp11 sim I get bad output:

# ps alx
 F S UID   PID  PPID CPU PRI NICE  ADDR  SZ  WCHAN TTY TIME CMD
115
5120     0     0   1  26    1    55   1   3003 ?  120150:37 swapper
#

I tried copying the source from one machine to the other. No luck, same
issue.

I have attached the source from both machines.

Any help appreciated.

Ken

-- 
WWL 📚

[-- Attachment #1.2: Type: text/html, Size: 1499 bytes --]

[-- Attachment #2: ps1.c --]
[-- Type: text/x-csrc, Size: 11080 bytes --]

/*
 *      ps - process status
 *      examine and print certain things about processes
 */

#include <stdio.h>
#include <a.out.h>
#include <core.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/tty.h>
#include <sys/dir.h>
#include <sys/user.h>

struct nlist nl[] = {
        { "_proc" },
        { "_swapdev" },
        { "_swplo" },
        { "" },
};

struct  proc mproc;

struct  user u;
int     chkpid;
int     retcode=1;
int     lflg;
int     vflg;
int     kflg;
int     xflg;
char    *tptr;
long    lseek();
char    *gettty();
char    *getptr();
char    *strncmp();
int     aflg;
int     mem;
int     swmem;
int     swap;
daddr_t swplo;

int     ndev;
struct devl {
        char    dname[DIRSIZ];
        dev_t   dev;
} devl[256];

char    *coref;

main(argc, argv)
char **argv;
{
        int i;
        char *ap;
        int uid, puid;

        if (argc>1) {
                ap = argv[1];
                while (*ap) switch (*ap++) {

                case 'v':
                        vflg++;
                        break;

                case 'a':
                        aflg++;
                        break;

                case 't':
                        if(*ap)
                                tptr = ap;
                        aflg++;
                        if (*tptr == '?')
                                xflg++;
                        goto bbreak;

                case 'x':
                        xflg++;
                        break;

                case '-':
                        break;

                case 'l':
                        lflg++;
                        break;

                case 'k':
                        kflg++;
                        break;

                default:
                        chkpid = atoi(ap-1);
                        goto bbreak;
                        break;
                }
        }

bbreak:
        if(chdir("/dev") < 0) {
                fprintf(stderr, "Can't change to /dev\n");
                exit(1);
        }
        nlist(argc>2? argv[2]:"/unix", nl);
        if (nl[0].n_type==0) {
                fprintf(stderr, "No namelist\n");
                exit(1);
        }
        coref = "/dev/mem";
        if(kflg)
                coref = "/usr/sys/core";
        if ((mem = open(coref, 0)) < 0) {
                fprintf(stderr, "No mem\n");
                exit(1);
        }
        swmem = open(coref, 0);
        /*
         * read mem to find swap dev.
         */
        lseek(mem, (long)nl[1].n_value, 0);
        read(mem, (char *)&nl[1].n_value, sizeof(nl[1].n_value));
        /*
         * Find base of swap
         */
        lseek(mem, (long)nl[2].n_value, 0);
        read(mem, (char *)&swplo, sizeof(swplo));
        /*
         * Locate proc table
         */
        lseek(mem, (long)nl[0].n_value, 0);
        getdev();
        uid = getuid();
        if (lflg)
        printf(" F S UID   PID  PPID CPU PRI NICE  ADDR  SZ  WCHAN TTY TIME CMD\n"); else
                if (chkpid==0) printf("   PID TTY TIME CMD\n");
        for (i=0; i<NPROC; i++) {
                read(mem, (char *)&mproc, sizeof mproc);
                if (mproc.p_stat==0)
                        continue;
                if (mproc.p_pgrp==0 && xflg==0 && mproc.p_uid==0)
                        continue;
                puid = mproc.p_uid;
                if ((uid != puid && aflg==0) ||
                    (chkpid!=0 && chkpid!=mproc.p_pid))
                        continue;
                if(prcom(puid)) {
                        printf("\n");
                        retcode=0;
                }
        }
        exit(retcode);
}

getdev()
{
#include <sys/stat.h>
        register FILE *df;
        struct stat sbuf;
        struct direct dbuf;

        if ((df = fopen("/dev", "r")) == NULL) {
                fprintf(stderr, "Can't open /dev\n");
                exit(1);
        }
        ndev = 0;
        while (fread((char *)&dbuf, sizeof(dbuf), 1, df) == 1) {
                if(dbuf.d_ino == 0)
                        continue;
                if(stat(dbuf.d_name, &sbuf) < 0)
                        continue;
                if ((sbuf.st_mode&S_IFMT) != S_IFCHR)
                        continue;
                strcpy(devl[ndev].dname, dbuf.d_name);
                devl[ndev].dev = sbuf.st_rdev;
                ndev++;
        }
        fclose(df);
        if ((swap = open("/dev/swap", 0)) < 0) {
                fprintf(stderr, "Can't open /dev/swap\n");
                exit(1);
        }
}

long
round(a, b)
        long            a, b;
{
        long            w = ((a+b-1)/b)*b;

        return(w);
}

struct map {
        long    b1, e1; long f1;
        long    b2, e2; long f2;
};
struct map datmap;
int     file;
prcom(puid)
{
        char abuf[512];
        long addr;
        register int *ip;
        register char *cp, *cp1;
        long tm;
        int c, nbad;
        register char *tp;
        long txtsiz, datsiz, stksiz;
        int septxt;
        int lw=(lflg?35:80);
        char **ap;

        if (mproc.p_flag&SLOAD) {
                addr = ctob((long)mproc.p_addr);
                file = swmem;
        } else {
                addr = (mproc.p_addr+swplo)<<9;
                file = swap;
        }
        lseek(file, addr, 0);
        if (read(file, (char *)&u, sizeof(u)) != sizeof(u))
                return(0);

        /* set up address maps for user pcs */
        txtsiz = ctob(u.u_tsize);
        datsiz = ctob(u.u_dsize);
        stksiz = ctob(u.u_ssize);
        septxt = u.u_sep;
        datmap.b1 = (septxt ? 0 : round(txtsiz,TXTRNDSIZ));
        datmap.e1 = datmap.b1+datsiz;
        datmap.f1 = ctob(USIZE)+addr;
        datmap.b2 = stackbas(stksiz);
        datmap.e2 = stacktop(stksiz);
        datmap.f2 = ctob(USIZE)+(datmap.e1-datmap.b1)+addr;

        tp = gettty();
        if (tptr && strncmp(tptr, tp, 2))
                return(0);
        if (lflg) {
                printf("%2o %c%4d", mproc.p_flag,
                        "0SWRIZT"[mproc.p_stat], puid);
        }
        printf("%6u", mproc.p_pid);
        if (lflg) {
                printf("%6u%4d%4d%5d%6o%4d", mproc.p_ppid, mproc.p_cpu&0377,
                        mproc.p_pri,
                        mproc.p_nice,
                        mproc.p_addr, (mproc.p_size+7)>>3);
                if (mproc.p_wchan)
                        printf("%7o", mproc.p_wchan);
                else
                        printf("       ");
        }
        printf(" %-2.2s", tp);
        if (mproc.p_stat==SZOMB) {
                printf("  <defunct>");
                return(1);
        }
        tm = (u.u_utime + u.u_stime + 30)/60;
        printf(" %2ld:", tm/60);
        tm %= 60;
        printf(tm<10?"0%ld":"%ld", tm);
        if (vflg && lflg==0) {  /* 0 == old tflg (print long times) */
                tm = (u.u_cstime + 30)/60;
                printf(" %2ld:", tm/60);
                tm %= 60;
                printf(tm<10?"0%ld":"%ld", tm);
                tm = (u.u_cutime + 30)/60;
                printf(" %2ld:", tm/60);
                tm %= 60;
                printf(tm<10?"0%ld":"%ld", tm);
        }
        if (mproc.p_pid == 0) {
                printf(" swapper");
                return(1);
        }
        addr += ctob((long)mproc.p_size) - 512;

        /* look for sh special */
        lseek(file, addr+512-sizeof(char **), 0);
        if (read(file, (char *)&ap, sizeof(char *)) != sizeof(char *))
                return(1);
        if (ap) {
                char b[82];
                char *bp = b;
                while((cp=getptr(ap++)) && cp && (bp<b+lw) ) {
                        nbad = 0;
                        while((c=getbyte(cp++)) && (bp<b+lw)) {
                                if (c<' ' || c>'~') {
                                        if (nbad++>3)
                                                break;
                                        continue;
                                }
                                *bp++ = c;
                        }
                        *bp++ = ' ';
                }
                *bp++ = 0;
                printf(lflg?" %.30s":" %.60s", b);
                return(1);
        }

        lseek(file, addr, 0);
        if (read(file, abuf, sizeof(abuf)) != sizeof(abuf))
                return(1);
        for (ip = (int *)&abuf[512]-2; ip > (int *)abuf; ) {
                if (*--ip == -1 || *ip==0) {
                        cp = (char *)(ip+1);
                        if (*cp==0)
                                cp++;
                        nbad = 0;
                        for (cp1 = cp; cp1 < &abuf[512]; cp1++) {
                                c = *cp1&0177;
                                if (c==0)
                                        *cp1 = ' ';
                                else if (c < ' ' || c > 0176) {
                                        if (++nbad >= 5) {
                                                *cp1++ = ' ';
                                                break;
                                        }
                                        *cp1 = '?';
                                } else if (c=='=') {
                                        *cp1 = 0;
                                        while (cp1>cp && *--cp1!=' ')
                                                *cp1 = 0;
                                        break;
                                }
                        }
                        while (*--cp1==' ')
                                *cp1 = 0;
                        printf(lflg?" %.30s":" %.60s", cp);
                        return(1);
                }
        }
        return(1);
}

char *
gettty()
{
        register i;
        register char *p;

        if (u.u_ttyp==0)
                return("?");
        for (i=0; i<ndev; i++) {
                if (devl[i].dev == u.u_ttyd) {
                        p = devl[i].dname;
                        if (p[0]=='t' && p[1]=='t' && p[2]=='y')
                                p += 3;
                        return(p);
                }
        }
        return("?");
}

char *
getptr(adr)
char **adr;
{
        char *ptr;
        register char *p, *pa;
        register i;

        ptr = 0;
        pa = (char *)adr;
        p = (char *)&ptr;
        for (i=0; i<sizeof(ptr); i++)
                *p++ = getbyte(pa++);
        return(ptr);
}

getbyte(adr)
char *adr;
{
        register struct map *amap = &datmap;
        char b;
        long saddr;

        if(!within(adr, amap->b1, amap->e1)) {
                if(within(adr, amap->b2, amap->e2)) {
                        saddr = (unsigned)adr + amap->f2 - amap->b2;
                } else
                        return(0);
        } else
                saddr = (unsigned)adr + amap->f1 - amap->b1;
        if(lseek(file, saddr, 0)==-1
                   || read(file, &b, 1)<1) {
                return(0);
        }
        return((unsigned)b);
}


within(adr,lbd,ubd)
char *adr;
long lbd, ubd;
{
        return((unsigned)adr>=lbd && (unsigned)adr<ubd);
}

[-- Attachment #3: ps2.c --]
[-- Type: text/x-csrc, Size: 7029 bytes --]

/*
 *	ps - process status
 *	examine and print certain things about processes
 */

#include <stdio.h>
#include <a.out.h>
#include <core.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/tty.h>
#include <sys/dir.h>
#include <sys/user.h>

struct nlist nl[] = {
	{ "_proc" },
	{ "_swapdev" },
	{ "_swplo" },
	{ "" },
};

struct	proc mproc;

struct	user u;
int	chkpid;
int	retcode=1;
int	lflg;
int	vflg;
int	kflg;
int	xflg;
char	*tptr;
long	lseek();
char	*gettty();
char	*getptr();
char	*strncmp();
int	aflg;
int	mem;
int	swmem;
int	swap;
daddr_t	swplo;

int	ndev;
struct devl {
	char	dname[DIRSIZ];
	dev_t	dev;
} devl[256];

char	*coref;

main(argc, argv)
char **argv;
{
	int i;
	char *ap;
	int uid, puid;

	if (argc>1) {
		ap = argv[1];
		while (*ap) switch (*ap++) {

		case 'v':
			vflg++;
			break;

		case 'a':
			aflg++;
			break;

		case 't':
			if(*ap)
				tptr = ap;
			aflg++;
			if (*tptr == '?')
				xflg++;
			goto bbreak;

		case 'x':
			xflg++;
			break;

		case '-':
			break;

		case 'l':
			lflg++;
			break;

		case 'k':
			kflg++;
			break;

		default:
			chkpid = atoi(ap-1);
			goto bbreak;
			break;
		}
	}

bbreak:
	if(chdir("/dev") < 0) {
		fprintf(stderr, "Can't change to /dev\n");
		exit(1);
	}
	nlist(argc>2? argv[2]:"/unix", nl);
	if (nl[0].n_type==0) {
		fprintf(stderr, "No namelist\n");
		exit(1);
	}
	coref = "/dev/mem";
	if(kflg)
		coref = "/usr/sys/core";
	if ((mem = open(coref, 0)) < 0) {
		fprintf(stderr, "No mem\n");
		exit(1);
	}
	swmem = open(coref, 0);
	/*
	 * read mem to find swap dev.
	 */
	lseek(mem, (long)nl[1].n_value, 0);
	read(mem, (char *)&nl[1].n_value, sizeof(nl[1].n_value));
	/*
	 * Find base of swap
	 */
	lseek(mem, (long)nl[2].n_value, 0);
	read(mem, (char *)&swplo, sizeof(swplo));
	/*
	 * Locate proc table
	 */
	lseek(mem, (long)nl[0].n_value, 0);
	getdev();
	uid = getuid();
	if (lflg)
	printf(" F S UID   PID  PPID CPU PRI NICE  ADDR  SZ  WCHAN TTY TIME CMD\n"); else
		if (chkpid==0) printf("   PID TTY TIME CMD\n");
	for (i=0; i<NPROC; i++) {
		read(mem, (char *)&mproc, sizeof mproc);
		if (mproc.p_stat==0)
			continue;
		if (mproc.p_pgrp==0 && xflg==0 && mproc.p_uid==0)
			continue;
		puid = mproc.p_uid;
		if ((uid != puid && aflg==0) ||
		    (chkpid!=0 && chkpid!=mproc.p_pid))
			continue;
		if(prcom(puid)) {
			printf("\n");
			retcode=0;
		}
	}
	exit(retcode);
}

getdev()
{
#include <sys/stat.h>
	register FILE *df;
	struct stat sbuf;
	struct direct dbuf;

	if ((df = fopen("/dev", "r")) == NULL) {
		fprintf(stderr, "Can't open /dev\n");
		exit(1);
	}
	ndev = 0;
	while (fread((char *)&dbuf, sizeof(dbuf), 1, df) == 1) {
		if(dbuf.d_ino == 0)
			continue;
		if(stat(dbuf.d_name, &sbuf) < 0)
			continue;
		if ((sbuf.st_mode&S_IFMT) != S_IFCHR)
			continue;
		strcpy(devl[ndev].dname, dbuf.d_name);
		devl[ndev].dev = sbuf.st_rdev;
		ndev++;
	}
	fclose(df);
	if ((swap = open("/dev/swap", 0)) < 0) {
		fprintf(stderr, "Can't open /dev/swap\n");
		exit(1);
	}
}

long
round(a, b)
	long		a, b;
{
	long		w = ((a+b-1)/b)*b;

	return(w);
}

struct map {
	long	b1, e1; long f1;
	long	b2, e2; long f2;
};
struct map datmap;
int	file;
prcom(puid)
{
	char abuf[512];
	long addr;
	register int *ip;
	register char *cp, *cp1;
	long tm;
	int c, nbad;
	register char *tp;
	long txtsiz, datsiz, stksiz;
	int septxt;
	int lw=(lflg?35:80);
	char **ap;

	if (mproc.p_flag&SLOAD) {
		addr = ctob((long)mproc.p_addr);
		file = swmem;
	} else {
		addr = (mproc.p_addr+swplo)<<9;
		file = swap;
	}
	lseek(file, addr, 0);
	if (read(file, (char *)&u, sizeof(u)) != sizeof(u))
		return(0);

	/* set up address maps for user pcs */
	txtsiz = ctob(u.u_tsize);
	datsiz = ctob(u.u_dsize);
	stksiz = ctob(u.u_ssize);
	septxt = u.u_sep;
	datmap.b1 = (septxt ? 0 : round(txtsiz,TXTRNDSIZ));
	datmap.e1 = datmap.b1+datsiz;
	datmap.f1 = ctob(USIZE)+addr;
	datmap.b2 = stackbas(stksiz);
	datmap.e2 = stacktop(stksiz);
	datmap.f2 = ctob(USIZE)+(datmap.e1-datmap.b1)+addr;

	tp = gettty();
	if (tptr && strncmp(tptr, tp, 2))
		return(0);
	if (lflg) {
		printf("%2o %c%4d", mproc.p_flag,
			"0SWRIZT"[mproc.p_stat], puid);
	}
	printf("%6u", mproc.p_pid);
	if (lflg) {
		printf("%6u%4d%4d%5d%6o%4d", mproc.p_ppid, mproc.p_cpu&0377,
			mproc.p_pri,
			mproc.p_nice,
			mproc.p_addr, (mproc.p_size+7)>>3);
		if (mproc.p_wchan)
			printf("%7o", mproc.p_wchan);
		else
			printf("       ");
	}
	printf(" %-2.2s", tp);
	if (mproc.p_stat==SZOMB) {
		printf("  <defunct>");
		return(1);
	}
	tm = (u.u_utime + u.u_stime + 30)/60;
	printf(" %2ld:", tm/60);
	tm %= 60;
	printf(tm<10?"0%ld":"%ld", tm);
	if (vflg && lflg==0) {	/* 0 == old tflg (print long times) */
		tm = (u.u_cstime + 30)/60;
		printf(" %2ld:", tm/60);
		tm %= 60;
		printf(tm<10?"0%ld":"%ld", tm);
		tm = (u.u_cutime + 30)/60;
		printf(" %2ld:", tm/60);
		tm %= 60;
		printf(tm<10?"0%ld":"%ld", tm);
	}
	if (mproc.p_pid == 0) {
		printf(" swapper");
		return(1);
	}
	addr += ctob((long)mproc.p_size) - 512;

	/* look for sh special */
	lseek(file, addr+512-sizeof(char **), 0);
	if (read(file, (char *)&ap, sizeof(char *)) != sizeof(char *))
		return(1);
	if (ap) {
		char b[82];
		char *bp = b;
		while((cp=getptr(ap++)) && cp && (bp<b+lw) ) {
			nbad = 0;
			while((c=getbyte(cp++)) && (bp<b+lw)) {
				if (c<' ' || c>'~') {
					if (nbad++>3)
						break;
					continue;
				}
				*bp++ = c;
			}
			*bp++ = ' ';
		}
		*bp++ = 0;
		printf(lflg?" %.30s":" %.60s", b);
		return(1);
	}

	lseek(file, addr, 0);
	if (read(file, abuf, sizeof(abuf)) != sizeof(abuf))
		return(1);
	for (ip = (int *)&abuf[512]-2; ip > (int *)abuf; ) {
		if (*--ip == -1 || *ip==0) {
			cp = (char *)(ip+1);
			if (*cp==0)
				cp++;
			nbad = 0;
			for (cp1 = cp; cp1 < &abuf[512]; cp1++) {
				c = *cp1&0177;
				if (c==0)
					*cp1 = ' ';
				else if (c < ' ' || c > 0176) {
					if (++nbad >= 5) {
						*cp1++ = ' ';
						break;
					}
					*cp1 = '?';
				} else if (c=='=') {
					*cp1 = 0;
					while (cp1>cp && *--cp1!=' ')
						*cp1 = 0;
					break;
				}
			}
			while (*--cp1==' ')
				*cp1 = 0;
			printf(lflg?" %.30s":" %.60s", cp);
			return(1);
		}
	}
	return(1);
}

char *
gettty()
{
	register i;
	register char *p;

	if (u.u_ttyp==0)
		return("?");
	for (i=0; i<ndev; i++) {
		if (devl[i].dev == u.u_ttyd) {
			p = devl[i].dname;
			if (p[0]=='t' && p[1]=='t' && p[2]=='y')
				p += 3;
			return(p);
		}
	}
	return("?");
}

char *
getptr(adr)
char **adr;
{
	char *ptr;
	register char *p, *pa;
	register i;

	ptr = 0;
	pa = (char *)adr;
	p = (char *)&ptr;
	for (i=0; i<sizeof(ptr); i++)
		*p++ = getbyte(pa++);
	return(ptr);
}

getbyte(adr)
char *adr;
{
	register struct map *amap = &datmap;
	char b;
	long saddr;

	if(!within(adr, amap->b1, amap->e1)) {
		if(within(adr, amap->b2, amap->e2)) {
			saddr = (unsigned)adr + amap->f2 - amap->b2;
		} else
			return(0);
	} else
		saddr = (unsigned)adr + amap->f1 - amap->b1;
	if(lseek(file, saddr, 0)==-1
		   || read(file, &b, 1)<1) {
		return(0);
	}
	return((unsigned)b);
}


within(adr,lbd,ubd)
char *adr;
long lbd, ubd;
{
	return((unsigned)adr>=lbd && (unsigned)adr<ubd);
}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-04 19:50 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-04 19:49 [TUHS] Unix v7 ps command question KenUnix

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).