xref: /plan9/sys/src/cmd/ps.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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*);
73e12c5d1SDavid du Colombier int	cmp(char*, char*);
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier Biobuf	bin;
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier void
123e12c5d1SDavid du Colombier main(int argc, char *argv[])
133e12c5d1SDavid du Colombier {
143e12c5d1SDavid du Colombier 	int fd, i, n, tot, none = 1;
153e12c5d1SDavid du Colombier 	char dir[500*DIRLEN], *mem;
163e12c5d1SDavid du Colombier 
173e12c5d1SDavid du Colombier 	USED(argc, argv);
183e12c5d1SDavid du Colombier 	Binit(&bin, 1, OWRITE);
193e12c5d1SDavid du Colombier 	if(chdir("/proc")==-1)
203e12c5d1SDavid du Colombier 		error("/proc");
213e12c5d1SDavid du Colombier 	fd=open(".", OREAD);
223e12c5d1SDavid du Colombier 	if(fd<0)
233e12c5d1SDavid du Colombier 		error("/proc");
243e12c5d1SDavid du Colombier 	mem = sbrk(0);
253e12c5d1SDavid du Colombier 	tot = 0;
263e12c5d1SDavid du Colombier 	while((n = read(fd, dir, sizeof dir)) > 0){
273e12c5d1SDavid du Colombier 		if(brk((void*)(mem + tot + n)) == -1)
283e12c5d1SDavid du Colombier 			error("out of memory");
293e12c5d1SDavid du Colombier 		memmove(mem+tot, dir, n);
303e12c5d1SDavid du Colombier 		tot += n;
313e12c5d1SDavid du Colombier 	}
323e12c5d1SDavid du Colombier 	qsort(mem, tot/DIRLEN, DIRLEN, cmp);
333e12c5d1SDavid du Colombier 	for(i=0; i<tot; i+=DIRLEN){
343e12c5d1SDavid du Colombier 		ps(mem+i);
353e12c5d1SDavid du Colombier 		none = 0;
363e12c5d1SDavid du Colombier 	}
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier 	if(none)
393e12c5d1SDavid du Colombier 		error("no processes; bad #p");
403e12c5d1SDavid du Colombier 	exits(0);
413e12c5d1SDavid du Colombier }
423e12c5d1SDavid du Colombier 
433e12c5d1SDavid du Colombier void
443e12c5d1SDavid du Colombier ps(char *s)
453e12c5d1SDavid du Colombier {
463e12c5d1SDavid du Colombier 	int fd;
473e12c5d1SDavid du Colombier 	char buf[64];
483e12c5d1SDavid du Colombier 	long utime, stime, size;
493e12c5d1SDavid du Colombier 	char status[2*NAMELEN+12+7*12];
503e12c5d1SDavid du Colombier 	char *p;
513e12c5d1SDavid du Colombier 
523e12c5d1SDavid du Colombier 	sprint(buf, "%s/status", s);
533e12c5d1SDavid du Colombier 	fd = open(buf, OREAD);
543e12c5d1SDavid du Colombier 	if(fd<0)
553e12c5d1SDavid du Colombier 		return;
563e12c5d1SDavid du Colombier 	memset(status, 0, sizeof status);
573e12c5d1SDavid du Colombier 	if(read(fd, status, sizeof status) > 0){
583e12c5d1SDavid du Colombier 		p = strchr(status, ' ');
593e12c5d1SDavid du Colombier 		if(!p)
603e12c5d1SDavid du Colombier 			goto Return;
613e12c5d1SDavid du Colombier 		*p = 0;
623e12c5d1SDavid du Colombier 		p = strchr(status+NAMELEN, ' ');
633e12c5d1SDavid du Colombier 		if(!p)
643e12c5d1SDavid du Colombier 			goto Return;
653e12c5d1SDavid du Colombier 		*p = 0;
663e12c5d1SDavid du Colombier 		status[2*NAMELEN+12-1] = 0;
673e12c5d1SDavid du Colombier 		utime = atol(status+2*NAMELEN+12)/1000;
683e12c5d1SDavid du Colombier 		stime = atol(status+2*NAMELEN+12+1*12)/1000;
693e12c5d1SDavid du Colombier 		size  = atol(status+2*NAMELEN+12+6*12);
703e12c5d1SDavid du Colombier 		Bprint(&bin, "%-8s %6s %4ld:%.2ld %3ld:%.2ld %5ldK %-.8s %s\n",
713e12c5d1SDavid du Colombier 				status+NAMELEN,
723e12c5d1SDavid du Colombier 				s,
733e12c5d1SDavid du Colombier 				utime/60, utime%60,
743e12c5d1SDavid du Colombier 				stime/60, stime%60,
753e12c5d1SDavid du Colombier 				size,
763e12c5d1SDavid du Colombier 				status+2*NAMELEN,
773e12c5d1SDavid du Colombier 				status);
783e12c5d1SDavid du Colombier 	}
793e12c5d1SDavid du Colombier     Return:
803e12c5d1SDavid du Colombier 	close(fd);
813e12c5d1SDavid du Colombier }
823e12c5d1SDavid du Colombier 
833e12c5d1SDavid du Colombier void
843e12c5d1SDavid du Colombier error(char *s)
853e12c5d1SDavid du Colombier {
863e12c5d1SDavid du Colombier 	fprint(2, "ps: %s: ", s);
873e12c5d1SDavid du Colombier 	perror("error");
883e12c5d1SDavid du Colombier 	exits(s);
893e12c5d1SDavid du Colombier }
90*219b2ee8SDavid du Colombier 
91*219b2ee8SDavid du Colombier int
92*219b2ee8SDavid du Colombier cmp(char *a, char *b)
93*219b2ee8SDavid du Colombier {
94*219b2ee8SDavid du Colombier 	return atoi(a) - atoi(b);
95*219b2ee8SDavid du Colombier }
96