time.c 1.5 KB

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