Blob


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