view toys/pending/watch.c @ 1278:324306321d82 draft

Initial cleanup of last: mostly whitespace, move no record test to start of loop, don't bother to stat an empty file to report when an empty log was created (just report current time).
author Rob Landley <rob@landley.net>
date Sat, 10 May 2014 13:20:03 -0500
parents 0ecfaa7022e8
children
line wrap: on
line source

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