17459c34c83156f37eb31dbba83807d497a64277fRob Landley/* watch.c - Execute a program periodically 27459c34c83156f37eb31dbba83807d497a64277fRob Landley * 37459c34c83156f37eb31dbba83807d497a64277fRob Landley * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com> 47459c34c83156f37eb31dbba83807d497a64277fRob Landley * Copyright 2013 Kyungwan Han <asura321@gmail.com> 57459c34c83156f37eb31dbba83807d497a64277fRob Landley * 685ac09b6fe3e076930463819fec238fc6127c9feElie De BrauwerUSE_WATCH(NEWTOY(watch, "^<1n#<0=2te", TOYFLAG_USR|TOYFLAG_BIN)) 77459c34c83156f37eb31dbba83807d497a64277fRob Landley 87459c34c83156f37eb31dbba83807d497a64277fRob Landleyconfig WATCH 97459c34c83156f37eb31dbba83807d497a64277fRob Landley bool "watch" 107459c34c83156f37eb31dbba83807d497a64277fRob Landley default n 117459c34c83156f37eb31dbba83807d497a64277fRob Landley help 123297e87c2ab798696b0fb3d06904dccea076b77aRob Landley usage: watch [-n SEC] [-t] PROG ARGS 137459c34c83156f37eb31dbba83807d497a64277fRob Landley 147459c34c83156f37eb31dbba83807d497a64277fRob Landley Run PROG periodically 157459c34c83156f37eb31dbba83807d497a64277fRob Landley 167459c34c83156f37eb31dbba83807d497a64277fRob Landley -n Loop period in seconds (default 2) 177459c34c83156f37eb31dbba83807d497a64277fRob Landley -t Don't print header 1885ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer -e Freeze updates on command error, and exit after enter. 197459c34c83156f37eb31dbba83807d497a64277fRob Landley*/ 207459c34c83156f37eb31dbba83807d497a64277fRob Landley#define FOR_watch 217459c34c83156f37eb31dbba83807d497a64277fRob Landley#include "toys.h" 227459c34c83156f37eb31dbba83807d497a64277fRob Landley 237459c34c83156f37eb31dbba83807d497a64277fRob LandleyGLOBALS( 2485ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer int interval; 257459c34c83156f37eb31dbba83807d497a64277fRob Landley) 267459c34c83156f37eb31dbba83807d497a64277fRob Landley 277459c34c83156f37eb31dbba83807d497a64277fRob Landleyvoid watch_main(void) 287459c34c83156f37eb31dbba83807d497a64277fRob Landley{ 297459c34c83156f37eb31dbba83807d497a64277fRob Landley int i = 0, hlen; 307459c34c83156f37eb31dbba83807d497a64277fRob Landley time_t t; 3185ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer unsigned width = 80, len = sizeof("Www Mmm dd hh:mm:ss yyyy") - 1 ; 327459c34c83156f37eb31dbba83807d497a64277fRob Landley char *header, *cmd = *toys.optargs; 3385ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer int retval; 347459c34c83156f37eb31dbba83807d497a64277fRob Landley 3585ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer while(toys.optargs[++i]) 3685ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer { 3785ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer char * oldcmd = cmd; 3859d85e2bb065a3bdc27868acb7a65f89d872c7faRob Landley cmd = xmprintf("%s %s", oldcmd, toys.optargs[i]); 3985ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer if (CFG_TOYBOX_FREE) free(oldcmd); 4085ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer } 4159d85e2bb065a3bdc27868acb7a65f89d872c7faRob Landley header = xmprintf("Every %us: %s", TT.interval, cmd); 4285ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer hlen = strlen(header); 437459c34c83156f37eb31dbba83807d497a64277fRob Landley 447459c34c83156f37eb31dbba83807d497a64277fRob Landley while(1) { 457459c34c83156f37eb31dbba83807d497a64277fRob Landley xprintf("\033[H\033[J"); 467459c34c83156f37eb31dbba83807d497a64277fRob Landley if(!(toys.optflags & FLAG_t)) { 477459c34c83156f37eb31dbba83807d497a64277fRob Landley terminal_size(&width, NULL); 487459c34c83156f37eb31dbba83807d497a64277fRob Landley if (!width) width = 80; //on serial it may return 0. 4985ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer time(&t); 5085ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer if (width > (hlen + len)) xprintf("%s", header); 5185ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer if(width >= len) 5285ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer xprintf("%*s\n",width + ((width > (hlen + len))?-hlen:0) + 1, ctime(&t)); 5385ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer else 5485ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer xprintf("\n\n"); 557459c34c83156f37eb31dbba83807d497a64277fRob Landley } 567459c34c83156f37eb31dbba83807d497a64277fRob Landley fflush(NULL); //making sure the screen is clear 5785ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer retval = system(cmd); 5885ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer if ((toys.optflags & FLAG_e) && retval){ 5985ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer xprintf("command exit with non-zero status, press enter to exit\n"); 6085ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer getchar(); 6185ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer break; 6285ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer } 637459c34c83156f37eb31dbba83807d497a64277fRob Landley sleep(TT.interval); 647459c34c83156f37eb31dbba83807d497a64277fRob Landley } 6585ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer 6685ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer if (CFG_TOYBOX_FREE){ 6785ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer free(header); 6885ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer if (cmd != *toys.optargs) free(cmd); 6985ac09b6fe3e076930463819fec238fc6127c9feElie De Brauwer } 707459c34c83156f37eb31dbba83807d497a64277fRob Landley} 71