Aucbcory.422 net.sources utzoo!decvax!ucbvax!ARPAVAX:CAD:ESVAX:Cory:erik Thu Apr 29 03:21:47 1982 New Version of upd.c /****************************************************************************** * upd.c - popen a process and use its output to update the screen * * argv[1] is popen'ed so quote your command if it's more than one arg. * argv[2] is number of seconds to sleep between cycles. * * During its sojourn in Berkeley, a number a features were added: * * Commands: type characters during program execution and things * are now likely to happen! * * Char Action * ---- ------ * ^L clear/refresh * c clear/refresh * r clear/refresh * e exit Note: a signal (INT, QUIT, TERM) will also * q exit stop the program, and quicker too! * * Windows: Those commands include windows. Type a number between 0 and 9 * and if there's program output in that window, you will see it. * * To Compile: * cc upd.c -lcurses -ltermlib -n -O -o upd * * Author(s) * Andy Tannenbaum * WECo/BTL Whippany, NJ * (UUCP: mhtsa!harpo!floyd!trb) * Erik Fair * UCB/CS Berkeley, CA * (UUCP: ucbvax!ucbcory!erik) * (ARPA: Cory.erik@Berkeley) *****************************************************************************/ #include #include #include /* If your system does NOT have the ioctl FIONREAD, then #define * KLUDGE, so that the command input code will compile correctly * {I use alarm(2) instead}. This means that vanilla v7 systems, * and other systems w/o the new tty driver (as it appears in * VMUNIX) will have to use KLUDGE. */ #define WINDOWS 10 /* Number of windows of output */ #define BUFSIZE WINDOWS*(24*80) /* Windows of 24*80 (Assuming 24 Lines) */ #define USAGE "usage: upd 'command_string' [delay_time]\n" char buf[BUFSIZE]; /* Massive output buffer */ char *screen[WINDOWS]; /* Screen pointers into output buffer */ int scrn; /* Screen Number (index to `screen') */ int timeout; /* For input kludge */ /****************************************************************************** * Begin MainLine */ main(argc,argv) int argc; char **argv; { register int i; register int bufcnt; register int lncnt; extern int LINES; /* Curses looks this up in termcap */ unsigned sleeptime; FILE *pp; int wincnt,poof(); /* Must have at least two arguements and not more than three */ if ((argc 3)) { fprintf(stderr,USAGE); exit(1); } /* sleep for sleeptime seconds between cycles */ sleeptime=((argc > 2) ? atoi(argv[2]) : 0); fprintf(stderr,"Delay is %u seconds between updates\n",sleeptime); signal(SIGINT,poof); /* Set up signals so that when one comes, we */ signal(SIGTERM,poof); /* exit gracefully from the program */ signal(SIGQUIT,poof); scrn=0; /* Start with screen Number Zero */ screen[0]=(&buf[0]); /* Always */ initscr(); /* Curses screen initialization */ savetty(); /* Save current tty state */ noecho(); /* Set no echoing */ crmode(); /* set cbreak mode */ /****************************************************************************** * Begin Main Loop */ for(;;) { /* if popen fails, we're hurting, so break */ if((pp=popen(argv[1],"r")) == NULL) { fprintf(stderr,"upd: popen failed.\n"); poof(); } bufcnt=fread(buf,1,BUFSIZE,pp); /* Grab the output */ pclose(pp); /* Close the channel */ buf[bufcnt]=0; /* Zero that last char */ wincnt = lncnt = 1; /* Initialize some stuff */ for( i=0 ; i 0)) scrn--; /* If window is empty, then backup */ mvaddstr(0,0,screen[scrn]); clrtobot(); refresh(); docomd(); /* Do any commands that were input */ sleep(sleeptime); /* Sleep awhile */ } } /********************************************************************** * Exit from the program gracefully */ poof() { clear(); /* Clear the screen */ refresh(); resetty(); /* Put tty back the way we found it */ exit(); /* Go home */ } /********************************************************************** * Do commands input from the keyboard */ docomd() { char comnd; long count; int numb; int wakeup(); #ifdef KLUDGE timeout=FALSE; signal(SIGALRM,wakeup); alarm(3); /* Three seconds for input */ #else ioctl(0,FIONREAD,&count); /* check standard input for chars */ if (count == 0L) return; #endif comnd=toascii(getch()); /* Wait here for alarm or input */ #ifdef KLUDGE if (timeout == TRUE) return; /* No input, go back to whatever */ else { timeout=FALSE; /* No timeout */ alarm(0); /* Shut off alarm clock */ } #endif /* Convert input to lower case, if upper case */ comnd=((isupper(comnd)) ? tolower(comnd) : comnd); /* Selecting new window? */ if(isdigit(comnd)) { numb=(comnd-'0'); if ((numb <= POOF(); QUIT NUMBER NEW && FPRINTF(STDERR,"\07"); REFRESH (SCREEN[NUMB] CLEAR(); PROGRAM DEFAULT: !="NULL))" *
This Usenet Oldnews Archive article may be copied and distributed freely, provided:

1. There is no money collected for the text(s) of the articles.
2. The following notice remains appended to each copy:

The Usenet Oldnews Archive: Compilation Copyright© 1981, 1996
Bruce Jones, Henry Spencer, David Wiseman.



Return to NET.sources index
Return to the Usenet Oldnews Archive index ----------------------------------------------------------------- gopher://quux.org/ conversion by John Goerzen of http://communication.ucsd.edu/A-News/ This Usenet Oldnews Archive article may be copied and distributed freely, provided: 1. There is no money collected for the text(s) of the articles. 2. The following notice remains appended to each copy: The Usenet Oldnews Archive: Compilation Copyright (C) 1981, 1996 Bruce Jones, Henry Spencer, David Wiseman.