home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
unix
/
volume8
/
display
< prev
next >
Wrap
Text File
|
1987-03-01
|
6KB
|
269 lines
Subject: v08i092: Execute command repeatedly, display output
Newsgroups: mod.sources
Approved: mirror!rs
Submitted by: amdahl!vixie!paul (Paul Vixie Esq)
Mod.sources: Volume 8, Issue 92
Archive-name: display
[ As the man says, this is a dinky program and many people have
written them. Nice to have one for the archives, tho. --r$ ]
-----CUT-----HERE-----
# This is a shell archive. Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
# Contents: README display.man Makefile display.c
echo x - README
sed 's/^@//' > "README" <<'@//E*O*F README//'
Display 1.0
15-December-1986
This is another C implementation of the 'display' command, written because
(a) is was easy, (b) I didn't know how to find the original, and (c) I have
an disease whose only means to remission is writing flinky programs like
this one.
Display runs a specified command over and over, printing the output through
curses(3X). The command can be compound ('date;uusnap' is a personal
favorite), and the delay between executions is settable on the command line.
The output from the command had better fit on a single screen, of course.
To install, unshar into an empty directory, edit the Makefile to change the
DESTDIR (probably to /usr/local, /usr/local/bin or /usr/ucb), then su and
type 'make install'.
Questions, problems, flames, to:
Paul Vixie
paul@vixie.UUCP
ptsfa!vixie!paul
@//E*O*F README//
chmod u=rw,g=rw,o=r README
echo x - display.man
sed 's/^@//' > "display.man" <<'@//E*O*F display.man//'
@.TH AT 1 "December 15, 1986"
@.UC 4
@.SH NAME
display \- repeat a command through curses for minimal update
@.SH SYNOPSIS
display [-<delay>] <command>
@.SH DESCRIPTION
@.I Display
repeatedly executes a shell command, sending the output through
@.IR curses (3X)
to cause only the portions of the output which have changed from
one execution to the next to be redrawn.
@.I command
must be quoted if it contains blanks or other special characters.
@.I delay
is the number of seconds to suspend between updates; the default is 5.
@.SH EXAMPLES
@.sp 1
display -10 "date; echo ' '; uusnap; echo ' '; mailq"
@.PP
This provides a dynamic 'UUCP status watch' for BSD systems. If anyone
figures out a non-nightmarish csh alias for something with both kinds of
quotes in it, please send mail.
@.fi
@.SH "SEE ALSO"
popen(3),
curses(3X),
sh(1)
@.SH DIAGNOSTICS
Fairly informative usage message if you run it with a bad command line.
@.SH BUGS
@.IR Popen (3)
always executes the command through
@.IR sh (1)
@.SH AUTHOR
@.nf
Paul Vixie
{ptsfa,qantel,crash,winfree}!vixie!paul
@//E*O*F display.man//
chmod u=rw,g=rw,o=r display.man
echo x - Makefile
sed 's/^@//' > "Makefile" <<'@//E*O*F Makefile//'
# makefile for 'display'
# vix 15dec86 [stolen from 'which']
# start changing
CFLAGS = -O
DEST_DIR = /usr/local/bin
CURSES_LIBS = -lcurses -ltermcap
MAN_DIR = /usr/man/manl
MAN_SUFFIX = l
SHAR_ARGS = -b -c -v
# stop changing
SHAR_SOURCES = README display.man Makefile display.c
SHELL = /bin/sh
all : display
display : display.c
cc $(CFLAGS) -o $@ display.c $(CURSES_LIBS)
strip display
install : all
mv display $(DEST_DIR)
chmod 775 $(DEST_DIR)/display
cp display.man $(MAN_DIR)/display.$(MAN_SUFFIX)
display.shar : $(SHAR_SOURCES)
shar $(SHAR_ARGS) $(SHAR_SOURCES) > $@
@//E*O*F Makefile//
chmod u=rw,g=rw,o= Makefile
echo x - display.c
sed 's/^@//' > "display.c" <<'@//E*O*F display.c//'
/* display.c - repeatedly display command through curses
* vix 18apr86 [written]
* vix 15dec86 [major overhaul]
*/
#include <curses.h>
#include <signal.h>
#include <ctype.h>
#define DEFAULT_DELAY 5
static char *Command;
static int Delay;
main(argc, argv)
int argc;
char *argv[];
{
extern void parse_args(),
die(),
display();
parse_args(argc, argv);
signal(SIGHUP, die);
signal(SIGINT, die);
signal(SIGQUIT, die);
signal(SIGTERM, die);
initscr();
clear();
while (TRUE) {
display();
sleep(Delay);
}
}
static void die()
{
move(LINES-1, 0);
clrtoeol();
refresh();
endwin();
exit(0);
}
static void display()
{
auto FILE *fp, *popen();
auto char ch;
if (!(fp = popen(Command, "r"))) {
perror("popen");
exit(1);
}
move(0, 0);
while (EOF != (ch = fgetc(fp)))
{
if (ch == '\n')
clrtoeol();
addch(ch);
}
clrtoeol();
refresh();
pclose(fp);
}
static void parse_args(argc, argv)
int argc;
char *argv[];
{
extern void usage();
auto int argn,
delay_found;
Command = NULL;
Delay = DEFAULT_DELAY;
delay_found = FALSE;
for (argn = 1; argn < argc; argn++)
{
if (argv[argn][0] == '-')
if (delay_found)
usage(); /* already got this once */
else if (!isdigit(argv[argn][1]))
usage(); /* not a numeric */
else
{
Delay = atoi(&argv[argn][1]);
delay_found = TRUE;
}
else
if (Command != NULL)
usage(); /* already got this once */
else
Command = argv[1];
}
if (Command == NULL)
usage(); /* no Command on line */
}
static void usage()
{
extern char *getenv();
auto char *shell = getenv("SHELL");
fprintf(stderr, "\
usage: display [-<delay>] <command>\n\
<delay> = # of seconds between displays, default=%d\n\
<command> = command to display, quoted if it contains blanks\n",
DEFAULT_DELAY);
if (strcmp(shell, "/bin/sh"))
fprintf(stderr, "\
NOTE: /bin/sh will be used to process the command, not SHELL (%s)\n",
shell);
exit(1);
}
@//E*O*F display.c//
chmod u=rw,g=rw,o=r display.c
echo Inspecting for damage in transit...
temp=/tmp/shar$$; dtemp=/tmp/.shar$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
22 127 816 README
38 176 1043 display.man
28 80 601 Makefile
127 266 1977 display.c
215 649 4437 total
!!!
wc README display.man Makefile display.c | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if [ -s $dtemp ]
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0