Blame


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