70 lines
1.7 KiB
C
70 lines
1.7 KiB
C
/* 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);
|
|
}
|
|
}
|