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