xref: /plan9/sys/src/cmd/time.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier char	output[4096];
53e12c5d1SDavid du Colombier void	add(char*, ...);
63e12c5d1SDavid du Colombier void	error(char*);
73e12c5d1SDavid du Colombier void	notifyf(void*, char*);
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier void
main(int argc,char * argv[])103e12c5d1SDavid du Colombier main(int argc, char *argv[])
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier 	int i;
13*9a747e4fSDavid du Colombier 	Waitmsg *w;
143e12c5d1SDavid du Colombier 	long l;
153e12c5d1SDavid du Colombier 	char *p;
16*9a747e4fSDavid du Colombier 	char err[ERRMAX];
173e12c5d1SDavid du Colombier 
183e12c5d1SDavid du Colombier 	if(argc <= 1){
193e12c5d1SDavid du Colombier 		fprint(2, "usage: time command\n");
203e12c5d1SDavid du Colombier 		exits("usage");
213e12c5d1SDavid du Colombier 	}
223e12c5d1SDavid du Colombier 
233e12c5d1SDavid du Colombier 	switch(fork()){
243e12c5d1SDavid du Colombier 	case -1:
253e12c5d1SDavid du Colombier 		error("fork");
263e12c5d1SDavid du Colombier 	case 0:
273e12c5d1SDavid du Colombier 		exec(argv[1], &argv[1]);
283e12c5d1SDavid du Colombier 		if(argv[1][0] != '/' && strncmp(argv[1], "./", 2) &&
293e12c5d1SDavid du Colombier 		   strncmp(argv[1], "../", 3)){
303e12c5d1SDavid du Colombier 			sprint(output, "/bin/%s", argv[1]);
313e12c5d1SDavid du Colombier 			exec(output, &argv[1]);
323e12c5d1SDavid du Colombier 		}
333e12c5d1SDavid du Colombier 		error(argv[1]);
343e12c5d1SDavid du Colombier 	}
353e12c5d1SDavid du Colombier 
363e12c5d1SDavid du Colombier 	notify(notifyf);
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier     loop:
39*9a747e4fSDavid du Colombier 	w = wait();
40*9a747e4fSDavid du Colombier 	if(w == nil){
41*9a747e4fSDavid du Colombier 		errstr(err, sizeof err);
423e12c5d1SDavid du Colombier 		if(strcmp(err, "interrupted") == 0)
433e12c5d1SDavid du Colombier 			goto loop;
443e12c5d1SDavid du Colombier 		error("wait");
453e12c5d1SDavid du Colombier 	}
46*9a747e4fSDavid du Colombier 	l = w->time[0];
473e12c5d1SDavid du Colombier 	add("%ld.%.2ldu", l/1000, (l%1000)/10);
48*9a747e4fSDavid du Colombier 	l = w->time[1];
493e12c5d1SDavid du Colombier 	add("%ld.%.2lds", l/1000, (l%1000)/10);
50*9a747e4fSDavid du Colombier 	l = w->time[2];
513e12c5d1SDavid du Colombier 	add("%ld.%.2ldr", l/1000, (l%1000)/10);
523e12c5d1SDavid du Colombier 	add("\t");
533e12c5d1SDavid du Colombier 	for(i=1; i<argc; i++){
543e12c5d1SDavid du Colombier 		add("%s", argv[i], 0);
553e12c5d1SDavid du Colombier 		if(i>4){
563e12c5d1SDavid du Colombier 			add("...");
573e12c5d1SDavid du Colombier 			break;
583e12c5d1SDavid du Colombier 		}
593e12c5d1SDavid du Colombier 	}
60*9a747e4fSDavid du Colombier 	if(w->msg[0]){
61*9a747e4fSDavid du Colombier 		p = utfrune(w->msg, ':');
623e12c5d1SDavid du Colombier 		if(p && p[1])
633e12c5d1SDavid du Colombier 			p++;
643e12c5d1SDavid du Colombier 		else
65*9a747e4fSDavid du Colombier 			p = w->msg;
663e12c5d1SDavid du Colombier 		add(" # status=%s", p);
673e12c5d1SDavid du Colombier 	}
683e12c5d1SDavid du Colombier 	fprint(2, "%s\n", output);
69*9a747e4fSDavid du Colombier 	exits(w->msg);
703e12c5d1SDavid du Colombier }
713e12c5d1SDavid du Colombier 
723e12c5d1SDavid du Colombier void
add(char * a,...)733e12c5d1SDavid du Colombier add(char *a, ...)
743e12c5d1SDavid du Colombier {
753e12c5d1SDavid du Colombier 	static beenhere=0;
767dd7cddfSDavid du Colombier 	va_list arg;
773e12c5d1SDavid du Colombier 
783e12c5d1SDavid du Colombier 	if(beenhere)
793e12c5d1SDavid du Colombier 		strcat(output, " ");
807dd7cddfSDavid du Colombier 	va_start(arg, a);
81*9a747e4fSDavid du Colombier 	vseprint(output+strlen(output), output+sizeof(output), a, arg);
827dd7cddfSDavid du Colombier 	va_end(arg);
833e12c5d1SDavid du Colombier 	beenhere++;
843e12c5d1SDavid du Colombier }
853e12c5d1SDavid du Colombier 
863e12c5d1SDavid du Colombier void
error(char * s)873e12c5d1SDavid du Colombier error(char *s)
883e12c5d1SDavid du Colombier {
893e12c5d1SDavid du Colombier 
90*9a747e4fSDavid du Colombier 	fprint(2, "time: %s: %r\n", s);
913e12c5d1SDavid du Colombier 	exits(s);
923e12c5d1SDavid du Colombier }
933e12c5d1SDavid du Colombier 
943e12c5d1SDavid du Colombier void
notifyf(void * a,char * s)953e12c5d1SDavid du Colombier notifyf(void *a, char *s)
963e12c5d1SDavid du Colombier {
973e12c5d1SDavid du Colombier 	USED(a);
983e12c5d1SDavid du Colombier 	if(strcmp(s, "interrupt") == 0)
993e12c5d1SDavid du Colombier 		noted(NCONT);
1003e12c5d1SDavid du Colombier 	noted(NDFLT);
1013e12c5d1SDavid du Colombier }
102