|
|
researchv9-SUN3(old)
#include <stdio.h>
#include "ps.h"
struct proc proc;
union { struct user user; char userchars[UPAGES*NBPG]; } usp;
#define u usp.user
#define upages usp.userchars
static char tmpstr[4096]; static Xflag;
main(argc, argv)
int argc; char **argv;
{
register struct direct *dp;
register Psline *ps; Psline *psbegin, *psend;
register char *cp; register ncp, fd;
progname=argv[0];
if ((devlist = getdir("/dev", devlist)) == 0)
error("can't getdir /dev");
if ((devlist = getdir("/dev/dk", devlist)) == 0)
error("can't getdir /dev/dk");
if ((devlist = getdir("/dev/pt", devlist)) == 0)
error("can't getdir /dev/pt");
if ((drum = open("/dev/drum", 0)) < 0)
error("can't open /dev/drum");
myuid = getuid(); mypid = getpid();
if (argc > 1)
selbeg = selend = Malloc(Select, argc-1);
doarg(*++argv), Xflag = xflag && !tflag;
while (--argc > 1)
doarg(*++argv);
if (hflag) {
if (uflag) printf("User %%cpu ");
if (lflag) printf("size rss ppid wchan ");
printf(" pid tty stat time command\n");
}
if (Nflag && !tflag && !Fflag) {
register Select *sp;
Nflag = tflag = 0;
++aflag; ++xflag;
for (sp=selbeg; sp<selend; sp++) {
if ((fd = doselect(sp->id, &proc, &u)) < 0)
continue;
if (printp(tmpstr, fd, &proc, &u) > tmpstr)
printf("%s", tmpstr);
}
return 0;
}
if ((prlist = getdir("/proc", 0)) == 0)
error("can't getdir /proc");
if ((psbegin = Malloc(Psline, prlist->end - prlist->begin)) == 0)
error("can't malloc ps line table");
for (ps = psbegin, dp = prlist->begin; dp < prlist->end; dp++) {
if (dp->d_ino == 0 || dp->d_name[0] == '.')
continue;
if ((fd = doselect(dp->d_name, &proc, &u)) < 0)
continue;
if ((cp = printp(tmpstr, fd, &proc, &u)) <= tmpstr)
continue;
if (nflag) {
printf("%s", tmpstr);
continue;
}
ncp = cp - tmpstr + 1;
ps->string = memcpy(malloc(ncp), tmpstr, ncp);
ps->weight = proc.p_pid;
if (uflag)
ps->weight += (1001 - (int)(1000.0*proc.p_pctcpu+0.5))<<16;
ps++;
}
if (!nflag) {
ptsort(psbegin, psend = --ps);
for (ps=psbegin; ps<=psend; ps++)
printf("%s", ps->string);
}
exit(0);
}
doarg(cp)
register char *cp;
{
struct stat fds;
register Select *sp;
xflag = 0;
if (cp) do switch (*cp) {
case 0:
cp = 0; break;
case '-':
break;
case 't':
if (*++cp == '.') {
if (fstat(0, &fds) == 0) {
cp = gettty(fds.st_ino);
if (*cp == '?')
cp = 0;
} else {
fprintf(stderr, "0: cannot fstat\n");
cp = 0;
}
}
if (cp) {
++tflag;
sp = selend++;
sp->flag = SELTTY;
if (Xflag || xflag)
sp->flag |= SELXFL;
sp->id = cp;
cp = 0;
}
break;
case 'a':
aflag++; break;
case 'F':
if (stat(++cp, &fds) == 0) {
Fflag++;
sp = selend++;
sp->flag = SELFIL;
sp->id = cp;
sp->dev = fds.st_dev;
sp->ino = fds.st_ino;
if (kernel <= 0)
kernel = open("/dev/kmemr", 0);
} else
fprintf(stderr, "%s: cannot stat\n", cp);
cp = 0;
break;
case 'f':
if (kernel <= 0)
kernel = open("/dev/kmemr", 0);
if (kernel)
fflag++, getfstab();
break;
case 'h':
hflag++; break;
case 'l':
lflag++; break;
case 'n':
nflag++; break;
case 'r':
rflag++; break;
case 'u':
uflag++; getlogins(); break;
case 'x':
xflag++; break;
case 'T':
Tflag++; break;
default:
if (*cp < '0' || *cp > '9')
usage();
++Nflag;
sp = selend++;
sp->flag = SELXFL;
sp->id = cp;
cp = 0;
} while (cp++);
return 0;
}
error(s)
char *s;
{
fprintf(stderr, "%s: %s\n", progname, s);
exit(1);
}
usage()
{
fprintf(stderr, "Usage: %s [afhlnruxFt#] ...\n", progname);
exit(1);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.