/* 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); } }