time.c (1584B)
1 #include <u.h> 2 #include <libc.h> 3 4 char output[4096]; 5 void add(char*, ...); 6 void error(char*); 7 void notifyf(void*, char*); 8 9 void 10 main(int argc, char *argv[]) 11 { 12 int i; 13 Waitmsg *w; 14 vlong t0, t1; 15 long l; 16 char *p; 17 char err[ERRMAX]; 18 19 if(argc <= 1){ 20 fprint(2, "usage: time command\n"); 21 exits("usage"); 22 } 23 24 t0 = nsec(); 25 switch(fork()){ 26 case -1: 27 error("fork"); 28 case 0: 29 exec(argv[1], &argv[1]); 30 if(argv[1][0] != '/' && strncmp(argv[1], "./", 2) && 31 strncmp(argv[1], "../", 3)){ 32 sprint(output, "/bin/%s", argv[1]); 33 exec(output, &argv[1]); 34 } 35 error(argv[1]); 36 } 37 38 notify(notifyf); 39 40 loop: 41 w = wait(); 42 t1 = nsec(); 43 if(w == nil){ 44 rerrstr(err, sizeof err); 45 if(strcmp(err, "interrupted") == 0) 46 goto loop; 47 error("wait"); 48 } 49 l = w->time[0]; 50 add("%ld.%.3ldu", l/1000, l%1000); 51 l = w->time[1]; 52 add("%ld.%.3lds", l/1000, l%1000); 53 l = (t1-t0)/1000000; 54 add("%ld.%.3ldr", l/1000, l%1000); 55 add("\t"); 56 for(i=1; i<argc; i++){ 57 add("%s", argv[i], 0); 58 if(i>4){ 59 add("..."); 60 break; 61 } 62 } 63 if(w->msg[0]){ 64 p = utfrune(w->msg, ':'); 65 if(p && p[1]) 66 p++; 67 else 68 p = w->msg; 69 add(" # status=%s", p); 70 } 71 fprint(2, "%s\n", output); 72 exits(w->msg); 73 } 74 75 void 76 add(char *a, ...) 77 { 78 static int beenhere=0; 79 va_list arg; 80 81 if(beenhere) 82 strcat(output, " "); 83 va_start(arg, a); 84 vseprint(output+strlen(output), output+sizeof(output), a, arg); 85 va_end(arg); 86 beenhere++; 87 } 88 89 void 90 error(char *s) 91 { 92 93 fprint(2, "time: %s: %r\n", s); 94 exits(s); 95 } 96 97 void 98 notifyf(void *a, char *s) 99 { 100 USED(a); 101 if(strcmp(s, "interrupt") == 0) 102 noted(NCONT); 103 noted(NDFLT); 104 }