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