| /* watch.c - Execute a program periodically |
| * |
| * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com> |
| * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
| * |
| USE_WATCH(NEWTOY(watch, "^<1n#<0=2te", TOYFLAG_USR|TOYFLAG_BIN)) |
| |
| config WATCH |
| bool "watch" |
| default n |
| help |
| usage: watch [-n SEC] [-t] PROG ARGS |
| |
| Run PROG periodically |
| |
| -n Loop period in seconds (default 2) |
| -t Don't print header |
| -e Freeze updates on command error, and exit after enter. |
| */ |
| #define FOR_watch |
| #include "toys.h" |
| |
| GLOBALS( |
| int interval; |
| ) |
| |
| void watch_main(void) |
| { |
| int i = 0, hlen; |
| time_t t; |
| unsigned width = 80, len = sizeof("Www Mmm dd hh:mm:ss yyyy") - 1 ; |
| char *header, *cmd = *toys.optargs; |
| int retval; |
| |
| while(toys.optargs[++i]) |
| { |
| char * oldcmd = cmd; |
| cmd = xmprintf("%s %s", oldcmd, toys.optargs[i]); |
| if (CFG_TOYBOX_FREE) free(oldcmd); |
| } |
| header = xmprintf("Every %us: %s", TT.interval, cmd); |
| hlen = strlen(header); |
| |
| while(1) { |
| xprintf("\033[H\033[J"); |
| if(!(toys.optflags & FLAG_t)) { |
| terminal_size(&width, NULL); |
| if (!width) width = 80; //on serial it may return 0. |
| time(&t); |
| if (width > (hlen + len)) xprintf("%s", header); |
| if(width >= len) |
| xprintf("%*s\n",width + ((width > (hlen + len))?-hlen:0) + 1, ctime(&t)); |
| else |
| xprintf("\n\n"); |
| } |
| fflush(NULL); //making sure the screen is clear |
| retval = system(cmd); |
| if ((toys.optflags & FLAG_e) && retval){ |
| xprintf("command exit with non-zero status, press enter to exit\n"); |
| getchar(); |
| break; |
| } |
| sleep(TT.interval); |
| } |
| |
| if (CFG_TOYBOX_FREE){ |
| free(header); |
| if (cmd != *toys.optargs) free(cmd); |
| } |
| } |