1 /* watch.c - Execute a program periodically
2  *
3  * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com>
4  * Copyright 2013 Kyungwan Han <asura321@gmail.com>
5  *
6 USE_WATCH(NEWTOY(watch, "^<1n#<0=2te", TOYFLAG_USR|TOYFLAG_BIN))
7 
8 config WATCH
9   bool "watch"
10   default n
11   help
12     usage: watch [-n SEC] [-t] PROG ARGS
13 
14     Run PROG periodically
15 
16     -n  Loop period in seconds (default 2)
17     -t  Don't print header
18     -e  Freeze updates on command error, and exit after enter.
19 */
20 #define FOR_watch
21 #include "toys.h"
22 
GLOBALS(int interval;)23 GLOBALS(
24   int interval;
25 )
26 
27 void watch_main(void)
28 {
29   int i = 0, hlen;
30   time_t t;
31   unsigned width = 80, len = sizeof("Www Mmm dd hh:mm:ss yyyy") - 1 ;
32   char *header, *cmd = *toys.optargs;
33   int retval;
34 
35   while(toys.optargs[++i])
36   {
37     char * oldcmd = cmd;
38     cmd = xmprintf("%s %s", oldcmd, toys.optargs[i]);
39     if (CFG_TOYBOX_FREE) free(oldcmd);
40   }
41   header = xmprintf("Every %us: %s", TT.interval, cmd);
42   hlen = strlen(header);
43 
44   while(1) {
45     xprintf("\033[H\033[J");
46     if(!(toys.optflags & FLAG_t)) {
47       terminal_size(&width, NULL);
48       if (!width) width = 80; //on serial it may return 0.
49       time(&t);
50       if (width > (hlen + len)) xprintf("%s", header);
51       if(width >= len)
52         xprintf("%*s\n",width + ((width > (hlen + len))?-hlen:0) + 1, ctime(&t));
53       else
54         xprintf("\n\n");
55     }
56     fflush(NULL); //making sure the screen is clear
57     retval = system(cmd);
58     if ((toys.optflags & FLAG_e) && retval){
59       xprintf("command exit with non-zero status, press enter to exit\n");
60       getchar();
61       break;
62     }
63     sleep(TT.interval);
64   }
65 
66   if (CFG_TOYBOX_FREE){
67     free(header);
68     if (cmd != *toys.optargs) free(cmd);
69   }
70 }
71