xref: /plan9/sys/src/cmd/ps.c (revision 3b56890da2282dbd3cc0fc1501f968e20f5e5f6a)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier void	ps(char*);
63e12c5d1SDavid du Colombier void	error(char*);
77dd7cddfSDavid du Colombier int	cmp(void*, void*);
83e12c5d1SDavid du Colombier 
99a747e4fSDavid du Colombier Biobuf	bout;
107dd7cddfSDavid du Colombier int	pflag;
119a747e4fSDavid du Colombier int	aflag;
12*3b56890dSDavid du Colombier int	rflag;
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier void
main(int argc,char * argv[])153e12c5d1SDavid du Colombier main(int argc, char *argv[])
163e12c5d1SDavid du Colombier {
179a747e4fSDavid du Colombier 	int fd, i, tot, none = 1;
189a747e4fSDavid du Colombier 	Dir *dir, **mem;
193e12c5d1SDavid du Colombier 
207dd7cddfSDavid du Colombier 
217dd7cddfSDavid du Colombier 	ARGBEGIN {
229a747e4fSDavid du Colombier 	case 'a':
239a747e4fSDavid du Colombier 		aflag++;
249a747e4fSDavid du Colombier 		break;
257dd7cddfSDavid du Colombier 	case 'p':
267dd7cddfSDavid du Colombier 		pflag++;
277dd7cddfSDavid du Colombier 		break;
28*3b56890dSDavid du Colombier 	case 'r':
29*3b56890dSDavid du Colombier 		rflag++;
30*3b56890dSDavid du Colombier 		break;
317dd7cddfSDavid du Colombier 	} ARGEND;
329a747e4fSDavid du Colombier 	Binit(&bout, 1, OWRITE);
333e12c5d1SDavid du Colombier 	if(chdir("/proc")==-1)
343e12c5d1SDavid du Colombier 		error("/proc");
353e12c5d1SDavid du Colombier 	fd=open(".", OREAD);
363e12c5d1SDavid du Colombier 	if(fd<0)
373e12c5d1SDavid du Colombier 		error("/proc");
389a747e4fSDavid du Colombier 	tot = dirreadall(fd, &dir);
399a747e4fSDavid du Colombier 	if(tot <= 0){
409a747e4fSDavid du Colombier 		fprint(2, "ps: empty directory /proc\n");
419a747e4fSDavid du Colombier 		exits("empty");
423e12c5d1SDavid du Colombier 	}
439a747e4fSDavid du Colombier 	mem = malloc(tot*sizeof(Dir*));
449a747e4fSDavid du Colombier 	for(i=0; i<tot; i++)
459a747e4fSDavid du Colombier 		mem[i] = dir++;
469a747e4fSDavid du Colombier 
479a747e4fSDavid du Colombier 	qsort(mem, tot, sizeof(Dir*), cmp);
489a747e4fSDavid du Colombier 	for(i=0; i<tot; i++){
499a747e4fSDavid du Colombier 		ps(mem[i]->name);
503e12c5d1SDavid du Colombier 		none = 0;
513e12c5d1SDavid du Colombier 	}
523e12c5d1SDavid du Colombier 
533e12c5d1SDavid du Colombier 	if(none)
543e12c5d1SDavid du Colombier 		error("no processes; bad #p");
553e12c5d1SDavid du Colombier 	exits(0);
563e12c5d1SDavid du Colombier }
573e12c5d1SDavid du Colombier 
583e12c5d1SDavid du Colombier void
ps(char * s)593e12c5d1SDavid du Colombier ps(char *s)
603e12c5d1SDavid du Colombier {
61*3b56890dSDavid du Colombier 	ulong utime, stime, rtime, size;
626c0bae65SDavid du Colombier 	int argc, basepri, fd, i, n, pri;
63*3b56890dSDavid du Colombier 	char args[256], *argv[16], buf[64], pbuf[8], rbuf[20], rbuf1[20], status[4096];
643e12c5d1SDavid du Colombier 
653e12c5d1SDavid du Colombier 	sprint(buf, "%s/status", s);
663e12c5d1SDavid du Colombier 	fd = open(buf, OREAD);
673e12c5d1SDavid du Colombier 	if(fd<0)
683e12c5d1SDavid du Colombier 		return;
699a747e4fSDavid du Colombier 	n = read(fd, status, sizeof status-1);
709a747e4fSDavid du Colombier 	close(fd);
719a747e4fSDavid du Colombier 	if(n <= 0)
729a747e4fSDavid du Colombier 		return;
739a747e4fSDavid du Colombier 	status[n] = '\0';
746c0bae65SDavid du Colombier 
756c0bae65SDavid du Colombier 	if((argc = tokenize(status, argv, nelem(argv)-1)) < 12)
769a747e4fSDavid du Colombier 		return;
776c0bae65SDavid du Colombier 	argv[argc] = 0;
786c0bae65SDavid du Colombier 
796c0bae65SDavid du Colombier 	/*
806c0bae65SDavid du Colombier 	 * 0  text
816c0bae65SDavid du Colombier 	 * 1  user
826c0bae65SDavid du Colombier 	 * 2  state
836c0bae65SDavid du Colombier 	 * 3  cputime[6]
846c0bae65SDavid du Colombier 	 * 9  memory
856c0bae65SDavid du Colombier 	 * 10 basepri
866c0bae65SDavid du Colombier 	 * 11 pri
876c0bae65SDavid du Colombier 	 */
886c0bae65SDavid du Colombier 	utime = strtoul(argv[3], 0, 0)/1000;
896c0bae65SDavid du Colombier 	stime = strtoul(argv[4], 0, 0)/1000;
90*3b56890dSDavid du Colombier 	rtime = strtoul(argv[5], 0, 0)/1000;
916c0bae65SDavid du Colombier 	size  = strtoul(argv[9], 0, 0);
927dd7cddfSDavid du Colombier 	if(pflag){
936c0bae65SDavid du Colombier 		basepri = strtoul(argv[10], 0, 0);
946c0bae65SDavid du Colombier 		pri = strtoul(argv[11], 0, 0);
957dd7cddfSDavid du Colombier 		sprint(pbuf, " %2d %2d", basepri, pri);
967dd7cddfSDavid du Colombier 	} else
977dd7cddfSDavid du Colombier 		pbuf[0] = 0;
98*3b56890dSDavid du Colombier 
99*3b56890dSDavid du Colombier 	if(rflag){
100*3b56890dSDavid du Colombier 		if(rtime >= 86400)
101*3b56890dSDavid du Colombier 			sprint(rbuf, " %lud:%02lud:%02lud:%02lud", rtime/86400, (rtime/3600)%24, (rtime/60)%60, rtime%60);
102*3b56890dSDavid du Colombier 		else if(rtime >= 3600)
103*3b56890dSDavid du Colombier 			sprint(rbuf, " %lud:%02lud:%02lud", rtime/3600, (rtime/60)%60, rtime%60);
104*3b56890dSDavid du Colombier 		else
105*3b56890dSDavid du Colombier 			sprint(rbuf, " %lud:%02lud", rtime/60, rtime%60);
106*3b56890dSDavid du Colombier 		sprint(rbuf1, "%12s", rbuf);
107*3b56890dSDavid du Colombier 	}else
108*3b56890dSDavid du Colombier 		rbuf1[0] = 0;
109*3b56890dSDavid du Colombier 
110*3b56890dSDavid du Colombier 	Bprint(&bout, "%-10s %8s%s %4lud:%.2lud %3lud:%.2lud %s %7ludK %-8.8s ",
1116c0bae65SDavid du Colombier 			argv[1],
1123e12c5d1SDavid du Colombier 			s,
113*3b56890dSDavid du Colombier 			rbuf1,
1143e12c5d1SDavid du Colombier 			utime/60, utime%60,
1153e12c5d1SDavid du Colombier 			stime/60, stime%60,
1167dd7cddfSDavid du Colombier 			pbuf,
1173e12c5d1SDavid du Colombier 			size,
1186c0bae65SDavid du Colombier 			argv[2]);
1199a747e4fSDavid du Colombier 
1209a747e4fSDavid du Colombier 	if(aflag == 0){
1219a747e4fSDavid du Colombier     Noargs:
1226c0bae65SDavid du Colombier 		Bprint(&bout, "%s\n", argv[0]);
1239a747e4fSDavid du Colombier 		return;
1243e12c5d1SDavid du Colombier 	}
1259a747e4fSDavid du Colombier 
1269a747e4fSDavid du Colombier 	sprint(buf, "%s/args", s);
1279a747e4fSDavid du Colombier 	fd = open(buf, OREAD);
1289a747e4fSDavid du Colombier 	if(fd < 0)
1299a747e4fSDavid du Colombier 		goto Badargs;
1309a747e4fSDavid du Colombier 	n = read(fd, args, sizeof args-1);
1313e12c5d1SDavid du Colombier 	close(fd);
1329a747e4fSDavid du Colombier 	if(n < 0)
1339a747e4fSDavid du Colombier 		goto Badargs;
1349a747e4fSDavid du Colombier 	if(n == 0)
1359a747e4fSDavid du Colombier 		goto Noargs;
1369a747e4fSDavid du Colombier 	args[n] = '\0';
1379a747e4fSDavid du Colombier 	for(i=0; i<n; i++)
1389a747e4fSDavid du Colombier 		if(args[i] == '\n')
1399a747e4fSDavid du Colombier 			args[i] = ' ';
1409a747e4fSDavid du Colombier 	Bprint(&bout, "%s\n", args);
1419a747e4fSDavid du Colombier 	return;
1429a747e4fSDavid du Colombier 
1439a747e4fSDavid du Colombier     Badargs:
1446c0bae65SDavid du Colombier 	Bprint(&bout, "%s ?\n", argv[0]);
1453e12c5d1SDavid du Colombier }
1463e12c5d1SDavid du Colombier 
1473e12c5d1SDavid du Colombier void
error(char * s)1483e12c5d1SDavid du Colombier error(char *s)
1493e12c5d1SDavid du Colombier {
1503e12c5d1SDavid du Colombier 	fprint(2, "ps: %s: ", s);
1513e12c5d1SDavid du Colombier 	perror("error");
1523e12c5d1SDavid du Colombier 	exits(s);
1533e12c5d1SDavid du Colombier }
154219b2ee8SDavid du Colombier 
155219b2ee8SDavid du Colombier int
cmp(void * va,void * vb)1567dd7cddfSDavid du Colombier cmp(void *va, void *vb)
157219b2ee8SDavid du Colombier {
1589a747e4fSDavid du Colombier 	Dir **a, **b;
1597dd7cddfSDavid du Colombier 
1607dd7cddfSDavid du Colombier 	a = va;
1617dd7cddfSDavid du Colombier 	b = vb;
1629a747e4fSDavid du Colombier 	return atoi((*a)->name) - atoi((*b)->name);
163219b2ee8SDavid du Colombier }
164