mcgrew@dartagnan.rutgers.edu (Charles Mcgrew) (06/22/89)
Submitted-by: chuck@melmac.harris-atd.com Posting-number: Volume 1, Issue 34 Archive-name: contool2.1 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: Makefile README contool.c contool.man misc.c sample.filter # icons icons/console1.icon icons/console1_bad.icon # icons/console1_flash.icon icons/contool.icon # icons/contool_bad.icon icons/stopsign.icon icons/stopsign_inv.icon # Wrapped by chuck@melmac on Fri Feb 10 11:25:37 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(702 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' XBIN = /usr/local/bin X XMAN = /usr/man/manl XMANEXT = l X X# directory where icons can be found, must end with '/'! XICON_DIR = ./icons/ X XOFILES = contool.o misc.o X X.c.o: X cc -O -c -DICON_DIRECTORY=\"$(ICON_DIR)\" $< X Xcontool: $(OFILES) X cc -o contool $(OFILES) -lsuntool -lsunwindow -lpixrect X Xinstall: contool $(MAN)/contool.$(MANEXT) X cp contool $(BIN) X chmod 755 $(BIN)/contool X X$(MAN)/contool.$(MANEXT): contool.man X cp -p contool.man $(MAN)/contool.$(MANEXT) X Xinstall-icons: X for i in icons/*.icon; do \ X cp $$i $(ICON_DIR); \ X done; X Xclean: X rm -f *~ $(OFILES) contool core X Xshar: X rm -f contool.shar X shar -o contool.shar Makefile README contool.c contool.man misc.c sample.filter icons icons/* END_OF_FILE if test 702 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(3733 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' X Contool Version 2.1 X X Change history: X 1.0 20 Jun 88 Original release X 1.1 30 Jun 88 Added -p option to pop open when messages X arrive. Suggested by Doug Lind X (lind@perron.ms.washington.edu). X Added alternate icon sets for more attractive X appearance when messages arrive. Alternate X set two is from David Eckelcamp X (eckelcamp@mcc.com). X Cleaned up Makefile. Again, courtesy of X David Eckelcamp. X 2.0 23 Aug 88 Added automatic reload of filters when X filter file is modified. Suggested by X Craig Musicant (cmusican@stanford.prime.com). X Filter strings are now regular expressions. X Provided by jqj@hogg.cc.uoregon.edu. X Reworked frame menu, based upon diffs posted X to sun-source@titan.rice.edu. X Added protection from overflowing the text edit X window when too many messages arrive. X Filters can now be read from any file, not X just ~/.contool. X 2.1 10 Feb 89 Added logging capability, courtesy of X Gregory Bond (gnb@melba.bby.oz.au). X X Contool will capture and display system console messages with timestamps. XIt is a replacement for the standard Sun console, which is created with X"cmdtool -C". Contool will flash its icon and beep when messages are written Xto the icon, so you can keep it closed on your desktop until a message arrives. XYou can modify this beeping and flashing behavior; see the man page for more Xdetails. X X Contool comes with several icons which you can use for different flash Xstyles. The default is a flashing stop sign; some of us prefer a little Xmonitor whose screen flashes. To achieve this behavior, you can invoke X X contool -g contool.icon -b contool.icon -f contool_bad.icon X Xto set the good, bad, and flash icons. X X You can instruct contool to filter and ignore certain common console Xmessages. The man file explains how to create a file of filters in X~/.contool; the included sample.filter is how my filters are set up. You Xcan modify this to suit yourself, and copy it to ~/.contool. X X Before building contool, you need to check several site dependencies Xin the Makefile and contool.c. These paths are: X X In Makefile: X BIN Where the executable will go, normally X /usr/local/bin X MANDIR Where the man page will go, normally X /usr/man/manl X MANEXT The man page extension, usually 'l', X for local man pages. You may want to X make MANDIR /usr/man/man1, in which case X MANEXT should be '1'. X X ICON_DIRECTORY Where you will keep the contool icons. X On our system, this is /usr/local/images. X Contool is shipped with this set to "./icons/", X so that it will compile in the directory X in which you unshar'ed it. Move the icons X to your local icon repository, and change X this path accordingly. MAKE SURE IT ENDS X IN A '/'! X X In contool.c: X You may wish to use an alternate icon set for contool. Simply X uncomment the set you want to use as noted in contool.c. X XOnce you have adjusted these values, just type "make contool" or "make Xinstall". X X Contool honors window command line options, described in suntools(1), Xso you can change the default window size, icon position, etc. We like Xto bring contool up closed, using "-Wi". X X Comments, bugs, to me, please. I would be very interested in your Ximpressions of contool and any suggestions you might have to make it better. XBy the way, there are a few convenient untility routines in misc.c you might Xfind useful in other programs you are writing. X XChuck Musciano XAdvanced Technology Department XHarris Corporation XPO Box 37, MS 3A/1912 XMelbourne, FL 32902 X(407) 727-6131 XARPA: chuck@trantor.harris-atd.com END_OF_FILE if test 3733 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'contool.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'contool.c'\" else echo shar: Extracting \"'contool.c'\" \(21726 characters\) sed "s/^X//" >'contool.c' <<'END_OF_FILE' X/************************************************************************/ X/* Copyright 1988 by Chuck Musciano and Harris Corporation */ X/* */ X/* Permission to use, copy, modify, and distribute this software */ X/* and its documentation for any purpose and without fee is */ X/* hereby granted, provided that the above copyright notice */ X/* appear in all copies and that both that copyright notice and */ X/* this permission notice appear in supporting documentation, and */ X/* that the name of Chuck Musciano and Harris Corporation not be */ X/* used in advertising or publicity pertaining to distribution */ X/* of the software without specific, written prior permission. */ X/* Chuck Musciano and Harris Corporation make no representations */ X/* about the suitability of this software for any purpose. It is */ X/* provided "as is" without express or implied warranty. */ X/************************************************************************/ X X X/************************************************************************/ X/* */ X/* contool: capture and display timestamped console i/o */ X/* */ X/************************************************************************/ X X#include <stdio.h> X#include <fcntl.h> X#include <sys/ioctl.h> X#include <sys/types.h> X#include <sys/stat.h> X X#include <suntool/sunview.h> X#include <suntool/textsw.h> X#include <suntool/icon_load.h> X X/**************** Site dependent parameters ****************************/ X X/* Where the default contool icons are kept. !Must end in '/'! */ X X#if !defined(ICON_DIRECTORY) X#define ICON_DIRECTORY "./icons/" X#endif X X/* The default icon names. Alternate sets are shown, and you might want X to try these instead of the default set by uncommenting the desired set. */ X X/* This set gives a blinking stop sign when messages arrive. */ X#define GOOD_ICON "contool.icon" X#define BAD_ICON "stopsign.icon" X#define INVERSE_ICON "stopsign_inv.icon" X X/* This set gives a terminal, labelled "Console", in a box. The screen X flashes when messages arrive. */ X/* #define GOOD_ICON "contool.icon" */ X/* #define BAD_ICON "contool.icon" */ X/* #define INVERSE_ICON "contool_bad.icon" */ X X/* This set gives a terminal, without a box. Again, the screen flashes X when messages arrive. */ X/* #define GOOD_ICON "console1.icon" */ X/* #define BAD_ICON "console1_bad.icon" */ X/* #define INVERSE_ICON "console1_flash.icon" */ X X/*************** End of site dependencies ******************************/ X X#define TOOL_LABEL "<< Console Tool 2.1 >>" X X#define MAX_FILTERS 64 X X#define strsave(s) ((char *) strcpy(malloc(strlen(s) + 1), s)) X X#define BEEP_COUNT 3 X#define TS_INTERVAL 60 X X#define NORMAL_MODE 1 X#define QUIET_MODE 2 X#define IGNORE_MODE 3 X X#define TEXT_SIZE_LIMIT 32768 X#define TEXT_SIZE_FUZZ 1024 X#define TEXT_DELETE_SIZE 1024 X X#define INPUT_BUFFER_SIZE 4096 X X/*************** Stuff that regexp(3) needs ****************************/ X Xstatic regexp_error(); X X#define INIT register char *expbuf = ep, *sp = instring; X#define GETC() (*sp++) X#define PEEKC() (*sp) X#define UNGETC(c) (--sp) X#define RETURN(p) {bcopy(expbuf, sp = (char *) malloc(p - expbuf), p - expbuf); return(sp);} X#define ERROR(val) {regexp_error(val, instring); return(NULL);} X X#include <regexp.h> X X/*************** Things that contool uses ******************************/ X Xstruct f_rec {char *start; X char *end; X int scircf; X int ecircf; X int mode; X }; X Xchar *ct_usage = "usage: contool [-b <file>] [-c <file>] [-d <size>] [-f <file>] [-g <file>] [-l <size>] [-o <logfile>] [-p] [-r <amt>] [-s <amt>]\n"; X Xstatic Frame bf; Xstatic Textsw text; Xstatic Icon good, bad, inverse; Xstatic struct pixrect *good_pr, *bad_pr, *inv_pr; Xstatic Menu_item stop_blink; Xstatic Rect open_rect; X Xstatic char bad_icon[256]; /* -b */ Xstatic char filter_path[256]; /* -c */ Xstatic int delete_amt = TEXT_DELETE_SIZE; /* -d */ Xstatic char inv_icon[256]; /* -f */ Xstatic char good_icon[256]; /* -g */ Xstatic int size_limit = TEXT_SIZE_LIMIT; /* -l */ Xstatic int pop_open = FALSE; /* -p */ Xstatic int resolution = TS_INTERVAL; /* -r */ Xstatic int beep_amount = BEEP_COUNT; /* -s */ X Xstatic int bad_is_up; Xstatic int beep_count; Xstatic int blinking = FALSE; Xstatic int event_in_progress = FALSE; Xstatic int explicit_filters = FALSE; Xstatic struct f_rec filter[MAX_FILTERS]; Xstatic int filters = 0; Xstatic int icon_height; Xstatic int icon_width; Xstatic FILE *master = NULL; Xstatic int old_time = 0; Xstatic char *program; Xstatic FILE *slave = NULL; Xstatic FILE *logfile = NULL; X Xstatic struct itimerval timer = {{0, 500000}, {0, 500000}}; X X/************************************************************************/ X/* First, some basic console utility routines */ X/************************************************************************/ X X/************************************************************************/ Xstatic acquire_console(path) X Xchar *path; X X{ X if (ioctl(fileno(slave), TIOCCONS, NULL) == -1) { X fprintf(stderr, "%s: could not attach %s to /dev/console\n", program, path); X exit(1); X } X} X X/************************************************************************/ Xstatic clear_messages() X X{ X textsw_reset(text, 0, 0); X old_time = 0; X} X X/************************************************************************/ Xstatic stop_blinking() X X{ X notify_set_itimer_func(bf, NULL, ITIMER_REAL, NULL, NULL); X window_set(bf, FRAME_ICON, good, 0); X blinking = FALSE; X menu_set(stop_blink, MENU_INACTIVE, TRUE, 0); X} X X/************************************************************************/ X/* Now, filter and regular expression handlers */ X/************************************************************************/ X X/************************************************************************/ Xstatic internal_message(a, b, c, d, e, f) X Xint a, b, c, d, e, f; X X{ char buf[512]; X X sprintf(buf, a, b, c, d, e, f); X time_stamp(); X write_log(buf); X do_insertion(buf, strlen(buf)); X} X X/************************************************************************/ Xstatic internal_error(a, b, c, d, e, f) X Xint a, b, c, d, e, f; X X{ char buf[512]; X X sprintf(buf, a, b, c, d, e, f); X time_stamp(); X fprintf(stderr, buf); X} X X/************************************************************************/ Xstatic int match_exp(exp, circ, str) X Xchar *exp; Xint circ; Xchar *str; X X{ X circf = circ; X return(step(str, exp)); X} X X/************************************************************************/ Xstatic regexp_error(val, string) X Xint val; Xchar *string; X X{ char *msg; X X switch (val) { X case 11 : msg = "range endpoint too large"; X case 16 : msg = "bad number"; X case 25 : msg = "\"\\digit\" out of range"; X case 36 : msg = "illegal or missing delimiter"; X case 41 : msg = "no remembered search string"; X case 42 : msg = "\\(\\) imbalance"; X case 43 : msg = "too many \\("; X case 44 : msg = "more than 2 numbers given in \\{\\}"; X case 45 : msg = "} expected after \\"; X case 46 : msg = "first number exceeds second in \\{\\}"; X case 49 : msg = "[] imbalance"; X case 50 : msg = "regular expression overflow"; X default : msg = "regular expression compilation error"; X } X internal_error("*** %s: %s in '%s'\n", program, msg, string); X} X X/************************************************************************/ Xstatic load_filters() X X{ FILE *f; X char buf[256], rbuf[1024], *token[6], *p, *index(); X int count; X struct stat sb; X static int load_time = 0; X X if (stat(filter_path, &sb) == -1) { X if (explicit_filters && load_time == 0) { X internal_error("*** %s: filter file %s cannot be accessed\n", program, filter_path); X load_time = 1; X } X return; X } X if (sb.st_mtime > load_time) { X for (count = 0; count < filters; count++) { X free(filter[count].start); X if (filter[count].end) X free(filter[count].end); X } X filters = 0; X } X else X return; X X if ((f = fopen(filter_path, "r")) != NULL) { X while (getline(f, buf, 256) != EOF) { X if ((p = index(buf, '#')) != NULL) X *p = '\0'; X if (strlen(buf) == 0 || verify(buf, " ")) X continue; X tokenize(buf, &count, token, 6); X if (count == 2 || count == 4) { X if (strcmp(lower(token[0]), "ignore") == 0) X filter[filters].mode = IGNORE_MODE; X else if (strcmp(token[0], "quiet") == 0) X filter[filters].mode = QUIET_MODE; X else { X internal_error("*** %s: invalid contool filter:\n***\t%s\n", program, buf); X continue; X } X if ((filter[filters].start = compile(token[1], rbuf, rbuf+1024, '\0')) == NULL) X continue; X filter[filters].scircf = circf; X if (count == 4) X if (strcmp(lower(token[2]), "to") == 0) { X filter[filters].end = compile(token[3], rbuf, rbuf+1024, '\0'); X filter[filters].ecircf = circf; X } X else { X internal_error("*** %s: invalid contool filter:\n***\t%s\n", program, buf); X continue; X } X else X filter[filters].end = NULL; X filters++; X } X else X internal_error("*** %s: invalid contool filter:\n\t%s\n", program, buf); X } X fclose(f); X internal_message("*** filters loaded from %s\n", filter_path); X load_time = sb.st_mtime; X } X else X internal_error("*** %s: could not read filter file %s\n", program, filter_path); X} X X/************************************************************************/ X/* Various event handlers for the console frame */ X/************************************************************************/ X X/************************************************************************/ Xstatic Notify_value blink_proc(me, which) X Xint *me; Xint which; X X{ X if (event_in_progress) X return(NOTIFY_DONE); X if (beep_count > 0) { X window_bell(bf); X beep_count--; X } X else if (blinking) { X if (bad_is_up) X window_set(bf, FRAME_ICON, inverse, 0); X else X window_set(bf, FRAME_ICON, bad, 0); X bad_is_up = !bad_is_up; X } X if (beep_count == 0 && !blinking) X notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, NULL, NULL); X return(NOTIFY_DONE); X} X X/************************************************************************/ Xstatic Notify_value close_proc(frame, event, arg, type) X XFrame frame; XEvent *event; XNotify_arg arg; XNotify_event_type type; X X{ int init_closed, curr_closed, is_resize; X Notify_value value; X Rect *temp; X X event_in_progress = TRUE; X init_closed = (int) window_get(frame, FRAME_CLOSED); X is_resize = (event_id(event) == WIN_RESIZE); X value = notify_next_event_func(frame, event, arg, type); X curr_closed = (int) window_get(frame, FRAME_CLOSED); X if (init_closed != curr_closed) X if (!curr_closed && blinking) { X notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, NULL, NULL); X window_set(bf, FRAME_ICON, good, 0); X blinking = FALSE; X menu_set(stop_blink, MENU_INACTIVE, TRUE, 0); X } X event_in_progress = FALSE; X if (is_resize) { X temp = (Rect *) window_get(frame, FRAME_OPEN_RECT); X if (temp->r_width <= icon_width && temp->r_height <= icon_height) { /* override spurious resize request */ X window_set(frame, FRAME_OPEN_RECT, &open_rect, FRAME_CLOSED, FALSE, 0); X notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, NULL, NULL); X window_set(bf, FRAME_ICON, good, 0); X blinking = FALSE; X menu_set(stop_blink, MENU_INACTIVE, TRUE, 0); X } X else /* save away new open rect */ X open_rect = *temp; X } X return(value); X} X X/************************************************************************/ Xstatic Notify_value destroy_proc(frame, status) X XFrame frame; XDestroy_status status; X X{ X if (status == DESTROY_CHECKING) { X textsw_reset(text, 0, 0); X return(NOTIFY_DONE); X } X else X return(notify_next_destroy_func(frame, status)); X} X X/************************************************************************/ X/* Routines which handle capturing and displaying messages */ X/************************************************************************/ X X/************************************************************************/ Xstatic write_log(s) X Xchar *s; X X{ int t; X static char hostname[100] = ""; X X if (logfile) { X if (*hostname == NULL) X if (gethostname(hostname, 99) != 0) X strcpy(hostname, "(unknown)"); X t = time(0); X fseek(logfile, 0L, 2); X fprintf(logfile, "%s\t%.16s\t%s", hostname, ctime(&t) + 4, s); X fflush(logfile); X } X} X X/************************************************************************/ Xstatic do_insertion(buf, len) X Xchar *buf; Xint len; X X{ int first, last; X X while (len > size_limit - ((int) window_get(text, TEXTSW_LENGTH) - TEXT_SIZE_FUZZ)) { /* make some room */ X first = 1; X last = TEXTSW_INFINITY; X if (textsw_find_bytes(text, &first, &last, "\n<<<", 4, 0) == -1) X if (textsw_find_bytes(text, &first, &last, "\n", 1, 0) == -1) X first = delete_amt; X textsw_delete(text, 0, first + 1); X } X window_set(text, TEXTSW_INSERTION_POINT, TEXTSW_INFINITY, 0); X textsw_insert(text, buf, len); X} X X/************************************************************************/ Xstatic time_stamp() X X{ int t, pos; X char buf[5]; X X t = time(0); X if (t - old_time >= resolution) { X window_set(text, TEXTSW_INSERTION_POINT, TEXTSW_INFINITY, 0); X pos = (int) window_get(text, TEXTSW_LENGTH); X if (pos != 0) { X window_get(text, TEXTSW_CONTENTS, pos - 1, buf, 1); X if (buf[0] != '\n') X do_insertion("\n", 1); X } X do_insertion("\n<<< ", 5); X do_insertion(ctime(&t), 24); X do_insertion(" >>>\n", 5); X old_time = t; X } X} X X/************************************************************************/ Xstatic Notify_value input_func(me, fd) X Xint *me; Xint fd; X X{ char old_c, *s, *t, *index(); X int i, count, do_blink = FALSE; X static int curr_filter = -1, curr_mode = NORMAL_MODE; X static char in_buf[INPUT_BUFFER_SIZE + 2]; X X while ((count = read(fileno(master), in_buf, INPUT_BUFFER_SIZE)) >= 0) { X in_buf[count] = '\0'; X while (s = index(in_buf, '\015')) { X strcpy(s, s + 1); X count--; X } X for (t = in_buf; *t; *s = old_c, t = s) { X if (s = index(t, '\n')) { X old_c = *++s; X *s = '\0'; X } X else { X s = t + strlen(t); X old_c = '\0'; X } X if (curr_mode == NORMAL_MODE) { X load_filters(); X for (i = 0; i < filters; i++) X if (match_exp(filter[i].start, filter[i].scircf, t)) { X if (filter[i].mode == QUIET_MODE) { X time_stamp(); X write_log(t); X do_insertion(t, strlen(t)); X } X if (filter[i].end) { X curr_mode = filter[i].mode; X curr_filter = i; X } X break; X } X if (i == filters) { X time_stamp(); X write_log(t); X do_insertion(t, strlen(t)); X do_blink = TRUE; X } X } X else { X if (curr_mode == QUIET_MODE) { X time_stamp(); X write_log(t); X do_insertion(t, strlen(t)); X } X if (match_exp(filter[curr_filter].end, filter[curr_filter].ecircf, t)) { X curr_mode = NORMAL_MODE; X curr_filter = -1; X } X } X } X } X window_set(text, TEXTSW_UPDATE_SCROLLBAR, 0); X if (do_blink) { X if (pop_open) X window_set(bf, FRAME_CLOSED, FALSE, 0); X if (window_get(bf, FRAME_CLOSED) && !blinking) { X window_set(bf, FRAME_ICON, bad, 0); X blinking = TRUE; X bad_is_up = TRUE; X menu_set(stop_blink, MENU_INACTIVE, FALSE, 0); X } X beep_count = beep_amount; X notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, &timer, NULL); X } X return(NOTIFY_DONE); X} X X/************************************************************************/ X/* Routines which parse options, create windows, and main() */ X/************************************************************************/ X X/************************************************************************/ Xstatic parse_options(argc, argv) X Xint *argc; Xchar **argv; X X{ char *s, c; X X strcpy(good_icon, ICON_DIRECTORY); X strcat(good_icon, GOOD_ICON); X strcpy(bad_icon, ICON_DIRECTORY); X strcat(bad_icon, BAD_ICON); X strcpy(inv_icon, ICON_DIRECTORY); X strcat(inv_icon, INVERSE_ICON); X X strcpy(filter_path, getenv("HOME")); X strcat(filter_path, "/.contool"); X X while ((c = getopt(argc, argv, "b:c:d:f:g:l:o:pr:s:?", &s)) != EOF) X switch (c) { X case 'b' : strcpy(bad_icon, s); X break; X case 'c' : strcpy(filter_path, s); X explicit_filters = TRUE; X break; X case 'd' : if (verify(s, "0123456789")) X delete_amt = atoi(s); X else { X fprintf(stderr, "%s: invalid delete amount: %s\n", program, s); X exit(1); X } X break; X case 'f' : strcpy(inv_icon, s); X break; X case 'g' : strcpy(good_icon, s); X break; X case 'l' : if (verify(s, "0123456789")) X window_set(text, TEXTSW_MEMORY_MAXIMUM, (size_limit = atoi(s)) + TEXT_SIZE_FUZZ, 0); X else { X fprintf(stderr, "%s: invalid message limit: %s\n", program, s); X exit(1); X } X break; X case 'o': if ((logfile = fopen(s, "a")) == NULL) { X fprintf(stderr, "%s : can't open logfile: %s\n", program, s); X exit(1); X } X break; X case 'p' : pop_open = TRUE; X break; X case 'r' : if (verify(s, "0123456789")) X resolution = atoi(s); X else { X fprintf(stderr, "%s: invalid timestamp resolution: %s\n", program, s); X exit(1); X } X break; X case 's' : if (verify(s, "0123456789")) X beep_amount = atoi(s); X else { X fprintf(stderr, "%s: invalid beep count: %s\n", program, s); X exit(1); X } X break; X case '?' : fprintf(stderr, ct_usage); X exit(0); X break; X default : fprintf(stderr, ct_usage); X exit(1); X } X} X X/************************************************************************/ Xstatic load_icons() X X{ char msg[IL_ERRORMSG_SIZE]; X X if ((good_pr = icon_load_mpr(good_icon, msg)) == NULL) { X fprintf(stderr, "%s: %s\n", program, msg); X exit(1); X } X good = icon_create(ICON_IMAGE, good_pr, X ICON_LABEL, "", X ICON_WIDTH, good_pr->pr_size.x, X ICON_HEIGHT, good_pr->pr_size.y, X 0); X icon_width = good_pr->pr_size.x; X icon_height = good_pr->pr_size.y; X if ((bad_pr = icon_load_mpr(bad_icon, msg)) == NULL) { X fprintf(stderr, "%s: %s\n", program, msg); X exit(1); X } X bad = icon_create(ICON_IMAGE, bad_pr, X ICON_LABEL, "", X ICON_WIDTH, bad_pr->pr_size.x, X ICON_HEIGHT, bad_pr->pr_size.y, X 0); X if (bad_pr->pr_size.x > icon_width) X icon_width = bad_pr->pr_size.x; X if (bad_pr->pr_size.y > icon_height) X icon_height = bad_pr->pr_size.y; X if (*inv_icon == '\0') X strcpy(inv_icon, bad_icon); X if ((inv_pr = icon_load_mpr(inv_icon, msg)) == NULL) { X fprintf(stderr, "%s: %s\n", program, msg); X exit(1); X } X inverse = icon_create(ICON_IMAGE, inv_pr, X ICON_LABEL, "", X ICON_WIDTH, inv_pr->pr_size.x, X ICON_HEIGHT, inv_pr->pr_size.y, X 0); X if (inv_pr->pr_size.x > icon_width) X icon_width = inv_pr->pr_size.x; X if (inv_pr->pr_size.y > icon_height) X icon_height = inv_pr->pr_size.y; X window_set(bf, FRAME_ICON, good, 0); X} X X/************************************************************************/ Xmain(argc, argv) X Xint argc; Xchar **argv; X X{ char *path, *open_psuedo_tty(), **saveargs(); X int i; X Menu menu; X X program = strsave(argv[0]); X X bf = window_create(NULL, FRAME, X FRAME_ARGC_PTR_ARGV, &argc, argv, X FRAME_LABEL, TOOL_LABEL, X 0); X text = window_create(bf, TEXTSW, X TEXTSW_DISABLE_CD, TRUE, X TEXTSW_DISABLE_LOAD, TRUE, X TEXTSW_AGAIN_RECORDING, FALSE, X TEXTSW_IGNORE_LIMIT, TEXTSW_INFINITY, X TEXTSW_MEMORY_MAXIMUM, size_limit + TEXT_SIZE_FUZZ, X 0); X open_rect = *((Rect *) window_get(bf, FRAME_OPEN_RECT)); X X argv = saveargs(argc, argv); X parse_options(&argc, argv); X if (argc != 1) { X fprintf(stderr, ct_usage); X exit(1); X } X X load_icons(); X X path = open_psuedo_tty(&master, "r", &slave, "w"); X if (master == NULL) { X fprintf(stderr, "%s: couldn't open any psuedo-tty\n"); X exit(1); X } X if (slave == NULL) { X fprintf(stderr, "%s: couldn't open slave side of %s\n", program, path); X exit(1); X } X X i = fcntl(fileno(master), F_GETFL, 0); X i |= FNDELAY; X if (fcntl(fileno(master), F_SETFL, i) == -1) { X fprintf(stderr, "%s: could not force %s to non-blocking i/o\n", program, path); X exit(1); X } X X acquire_console(path); X X stop_blink = menu_create_item(MENU_STRING, "Stop Blinking", X MENU_INACTIVE, TRUE, X MENU_ACTION_PROC, stop_blinking, X 0); X menu = menu_create(MENU_APPEND_ITEM, stop_blink, X MENU_ACTION_ITEM, "Become Console", acquire_console, X MENU_ACTION_ITEM, "Clear Messages", clear_messages, X MENU_PULLRIGHT_ITEM, "Frame", window_get(bf, WIN_MENU), X 0); X window_set(bf, WIN_MENU, menu, 0); X X notify_set_input_func(bf, input_func, fileno(master)); X notify_interpose_destroy_func(bf, destroy_proc); X notify_interpose_event_func(bf, close_proc, NOTIFY_SAFE); X X load_filters(); X X window_main_loop(bf); X} END_OF_FILE if test 21726 -ne `wc -c <'contool.c'`; then echo shar: \"'contool.c'\" unpacked with wrong size! fi # end of 'contool.c' fi if test -f 'contool.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'contool.man'\" else echo shar: Extracting \"'contool.man'\" \(4928 characters\) sed "s/^X//" >'contool.man' <<'END_OF_FILE' X.TH CONTOOL 1 "10 December 1986" X.SH NAME Xcontool \- capture and display console output X.SH SYNOPSIS X.IP "\fBcontool\fP" X[\fB\(hyb\fP \fIfile\fP] [\fB\(hyc\fP \fIfile\fP] [\fB\(hyd\fP \fIsize\fP] [\fB\(hyf\fP \fIfile\fP] [\fB\(hyg\fP \fIfile\fP] [\fB\(hyl\fP \fIsize\fP] [\f3\(hyo\fP \f2logfile\fP] [\f3\(hyp\fP] [\f3\(hyr\fP \f2amount\fP] [\f3\(hys\fP \f2count\fP] X.SH DESCRIPTION X.LP X\f2Contool\fP captures and displays any messages sent to the system console. XEach message is timestamped as it arrives. The messages are displayed in a Xscrolling text window, so the user can scroll through old messages. X.LP XWhen a message arrives, \f3contool\fP will beep and, if closed, begin Xblinking its icon until the user opens the tool. This behavior can be changed Xwith the various options, described below. X.LP X\f2Contool\fP must be run under \f2suntools\fP(1), and accepts the Xstandard window command line options. X.LP X\f2Contool\fP can be configured to ignore certain console messages using Xentries in the file ~/.contool. Each line in the file has the format X\*(lq\f2action start\fP [ \f3to\fP \f2stop\fP ]\*(rq. The \fIstart\fP and X\fIstop\fP strings are regular expressions, as described in \fIed\fP(1). XEach line of text written Xto the console is compared against the list of \f2start\fP strings. A match Xcauses the \f2action\fP to take place. If the \f2action\fP is \f3quiet\fP, the Xmessage is written to the console, but no beeping or blinking occurs. If it Xis \f3ignore\fP, the message is thrown away. If the optional \f3to\fP clause is Xincluded, the desired \f2action\fP remains in effect until a line matching the \f2stop\fP Xstring is encountered. Comments can be introduced into the file using the '#' Xcharacter. X.SH OPTIONS X.IP "\fB\\(hyb\fP \fIfile\fP" Xspecifies the \*(lqbad\*(rq icon to be displayed when a message Xhas arrived on the console. The \f2file\fP must be in the format used by X\f2iconedit\fP(1). X.IP "\fB\\(hyc\fP \fIfile\fP" Xspecifies a different filter file. If \fB\(hyc\fP is not used, \fIcontool\fP Xwill read filters from ~/.contool, if it exists. X.IP "\fB\\(hyd\fP \fIsize\fP" Xsets the amount of text that will be removed from the front of the message Xlog when the message size limit (see \fB\(hyl\fP, below) is exceeded. At Xleast \fIsize\fP bytes will be removed, along with any text up to the start Xof the next message. The default value is 1024 bytes. X.IP "\fB\\(hyf\fP \fIfile\fP" Xspecifies the \*(lqflash\*(rq icon which is alternated with the Xbad icon (see \f3\(hyb\fP, above) when a message has arrived on the console. XLike \f3\(hyb\fP, the file must be in the format used by \f2iconedit\fP(1). XTo disable the flashing feature, specify \*(lq\*(rq as the \f2file\fP. X.IP "\fB\\(hyg\fP \fIfile\fP" Xspecifies the \*(lqgood\*(rq icon which is displayed when Xno unviewed messages are present on the console. This icon is displayed Xwhen the user closes \f2contool\fP, and remains displayed until a new message Xarrives. Like \f3\(hyb\fP and \f3\(hyf\fP, the \f2file\fP must be in the Xformat used by \f2iconedit\fP(1). X.IP "\fB\\(hyl\fP \fIsize\fP" Xsets the limit, in bytes, on the number of messages that will be saved. XWhen a message would exceed this limit, some number of bytes of text (see X\fB\(hyd\fP, above) will be deleted from the start of the message log. The Xdefault value is 32768 bytes. X.IP "\fB\\(hyo\fP \fIfile\fP" Xinstructs contool to keep a log of all messages (that are accepted by Xthe filters) into the named \fIfile\fP. This is useful for logging the Xconsole messages from a network of workstations into files on a Xserver, making administration of such a network much simpler. Care Xshould be exercised in logging multiple machines to the one file; NFS Xsometimes doesn't append if concurrent updates are done. This may be Xan NFS bug. X.IP "\f3\(hyp\fP" Xcauses contool to pop open when a message arrives. By default, Xcontool stays closed and blinks when messages arrive. X.IP "\f3\(hyr\fP \f2amount\fP" Xcontrols the resolution of the timestamps placed in the Xmessage display. Normally, a message is not timestamped if it has arrived Xwithin sixty seconds of the last timestamp. This prevents a cascade Xof messages from receiving several, identical timestamps. If this option Xis specified, the \f2amount\fP indicates the time, in seconds, to allow Xbetween timestamps. X.IP "\f3\(hys\fP \f2count\fP" Xchanges the number of times \f2contool\fP will sound the bell Xwhen a message arrives. To disable the bell, set the \f2count\fP to zero. X.SH FILES X.ta 2i Xcontool.icon default \f3\(hyg\fP icon X.br Xstopsign.icon default \f3\(hyb\fP icon X.br Xstopsign_inv.icon default \f3\(hyf\fP icon X.br X~/.contool filter pattern file X.SH AUTHOR X.LP XChuck Musciano X.br XAdvanced Technology Department X.br XHarris Corporation X.br X(407) 727-6131 X.br XARPA: chuck@trantor.harris-atd.com X.SH BUGS X.LP X\f2Contool\fP is a view-only tool, and there is no way to type commands Xon the console. END_OF_FILE if test 4928 -ne `wc -c <'contool.man'`; then echo shar: \"'contool.man'\" unpacked with wrong size! fi # end of 'contool.man' fi if test -f 'misc.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'misc.c'\" else echo shar: Extracting \"'misc.c'\" \(6517 characters\) sed "s/^X//" >'misc.c' <<'END_OF_FILE' X/************************************************************************/ X/* Copyright 1988 by Chuck Musciano and Harris Corporation */ X/* */ X/* Permission to use, copy, modify, and distribute this software */ X/* and its documentation for any purpose and without fee is */ X/* hereby granted, provided that the above copyright notice */ X/* appear in all copies and that both that copyright notice and */ X/* this permission notice appear in supporting documentation, and */ X/* that the name of Chuck Musciano and Harris Corporation not be */ X/* used in advertising or publicity pertaining to distribution */ X/* of the software without specific, written prior permission. */ X/* Chuck Musciano and Harris Corporation make no representations */ X/* about the suitability of this software for any purpose. It is */ X/* provided "as is" without express or implied warranty. */ X/************************************************************************/ X X X/************************************************************************/ X/* */ X/* misc: miscellaneous support routines for contool */ X/* */ X/************************************************************************/ X X#include <stdio.h> X#include <ctype.h> X X/************************************************************************/ X/* */ X/* getline read a line from a stream, removing the newline */ X/* and returning the length of the line. */ X/* */ X/************************************************************************/ X Xint getline(stream, string, max) X XFILE *stream; Xchar *string; Xint max; X X{ register int i, j; X X i = (int) fgets(string, max, stream); X if (i == NULL) X return(EOF); X j = strlen(string); X if (j > 0 && string[j - 1] == '\n') X string[--j] = '\0'; X return(j); X} X X/************************************************************************/ X/* */ X/* getopt extract options and their parameters from a */ X/* list of strings (most likely the command line */ X/* arguments. */ X/* */ X/* The 'opts' descriptor is a string of letters, */ X/* indicating which options are valid. If a */ X/* letter is followed by a ':', that option is */ X/* assumed to have a parameter following it. */ X/* Getopt returns the discovered option, NULL when */ X/* an illegal option is found, and EOF when no */ X/* more options are found. Options and their */ X/* parameters are removed from the string list. */ X/* */ X/************************************************************************/ X Xstatic delarg(argc, argv) X Xint *argc; Xchar **argv; X X{ char *p; X X while (*argv = *(argv+1)) X argv++; X (*argc)--; X} X Xchar getopt(argc, argv, opts, parm) X Xint *argc; Xchar **argv; Xchar *opts; Xchar **parm; X X{ char c, *p, *strcpy(), *index(); X int killed; X X *parm = NULL; X while (*argv && ((**argv != '-') || (*(*argv+1) == '\0'))) X argv++; X if (*argv == NULL) X return(EOF); X c = *(*argv+1); X *++(*argv) = '-'; X if (killed = (*(*argv+1) == '\0')) X delarg(argc, argv); X if ((p = index(opts, c)) == NULL) X c = '\0'; X else if (*(p+1) == ':') { X *parm = killed ? *argv : *argv+1; X delarg(argc, argv); X } X return(c); X} X X/************************************************************************/ X/* */ X/* lower convert a string to lower case */ X/* */ X/************************************************************************/ X Xchar *lower(s) X Xchar *s; X X{ char *p; X X p = s; X while (*s) { X if (isupper(*s)) X *s = tolower(*s); X s++; X } X return(p); X} X X/************************************************************************/ X/* */ X/* verify(source, valid) */ X/* */ X/* char *source; */ X/* char *valid; */ X/* */ X/* This routine verifies that every character in source is also in */ X/* valid. */ X/* */ X/************************************************************************/ X Xverify(source, valid) X Xchar *source; Xchar *valid; X X{ register char *s; X X for ( ; *source; source++) { X for (s = valid; *s && *s != *source; s++) X ; X if (*s == '\0') X return(0); X } X return(1); X} X X/************************************************************************/ X/* */ X/* saveargs Replicate and return a pointer to the argument */ X/* list passed in. */ X/* */ X/************************************************************************/ X Xchar **saveargs(argc, argv) X Xint argc; Xchar **argv; X X{ int i; X char **copy; X X copy = (char **) malloc((argc + 1) * sizeof(char *)); X for (i = 0; i < argc; i++) X strcpy(copy[i] = (char *) malloc(strlen(argv[i]) + 1), argv[i]); X copy[i] = (char *) 0; X return(copy); X} X X/************************************************************************/ X/* */ X/* tokenize break a line into tokens */ X/* */ X/************************************************************************/ X Xtokenize(line, argc, argv, max) X Xchar *line; Xint *argc; Xchar *argv[]; Xint max; X X{ char *buf, match; X X *argc = 0; X buf = (char *) malloc(strlen(line) * 2 + 1); X while (*line && (*argc < (max-1))) { X while (isspace(*line)) X line++; X argv[(*argc)++] = buf; X switch (*line) { X case '"' : X case '\'' : match = *line++; /* remove the quote mark */ X while (*line && (*line != match)) X *buf++ = *line++; X if (*line) X line++; /* wipe out quote mark */ X break; X default : while (*line && !isspace(*line) && (*line != '"') && (*line != '\'')) X *buf++ = *line++; X break; X } X *buf++ = '\0'; X } X *buf = '\0'; X argv[*argc] = (char *) 0; X} X X/************************************************************************/ X/* */ X/* open_psuedo_tty opens the first available psuedo terminal */ X/* */ X/************************************************************************/ X X#define P_POS 5 X#define L_POS 8 X#define D_POS 9 X X#define PATH "/dev/ptyp0" X#define LETTERS "pqr" X#define DIGITS "0123456789abcdef" X Xstatic char path[12]; X Xchar *open_psuedo_tty(master, m_mode, slave, s_mode) X XFILE **master; Xchar *m_mode; XFILE **slave; Xchar *s_mode; X X{ char *s, *t; X X strcpy(path, PATH); X for (s = LETTERS; *s && *master == NULL; s++) { X path[L_POS] = *s; X for (t = DIGITS; *t && *master == NULL; t++) { X path[D_POS] = *t; X *master = fopen(path, m_mode); X } X } X if (*master != NULL) { X path[P_POS] = 't'; X *slave = fopen(path, s_mode); X path[P_POS] = 'p'; X } X return(path); X} END_OF_FILE if test 6517 -ne `wc -c <'misc.c'`; then echo shar: \"'misc.c'\" unpacked with wrong size! fi # end of 'misc.c' fi if test -f 'sample.filter' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sample.filter'\" else echo shar: Extracting \"'sample.filter'\" \(480 characters\) sed "s/^X//" >'sample.filter' <<'END_OF_FILE' X# quietly retain chuck going su: XQUIET 'SU: chuck' X X# ignore Frame Maker coming up: XIGNORE 'maker: Starting Frame Maker' TO 'maker: finished loading' X X# ignore Frame Writer coming up: XIGNORE 'writer: Starting Frame Writer' TO 'writer: finished loading' X X# ignore window data lock messages XIGNORE 'Window data lock' TO 'The offending process' X X# retain some window messages XQUIET 'WIN ioctl number' X X# retain another crazy window system message XQUIET 'A tty window' TO 'Its child' END_OF_FILE if test 480 -ne `wc -c <'sample.filter'`; then echo shar: \"'sample.filter'\" unpacked with wrong size! fi # end of 'sample.filter' fi if test ! -d 'icons' ; then echo shar: Creating directory \"'icons'\" mkdir 'icons' fi if test -f 'icons/console1.icon' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'icons/console1.icon'\" else echo shar: Extracting \"'icons/console1.icon'\" \(1933 characters\) sed "s/^X//" >'icons/console1.icon' <<'END_OF_FILE' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0003,0xFFFF,0xFFFF,0xF800,0x0004,0x0000,0x0000,0x0600, X 0x0004,0x7FFF,0xFFFF,0xC500,0x0004,0x8000,0x0000,0x2480, X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440, X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0718,0xA000,0x1440, X 0x0005,0x0824,0xD000,0x1440,0x0005,0x0824,0x93C0,0x1440, X 0x0005,0x0824,0x9000,0x1440,0x0005,0x0718,0x9000,0x1440, X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440, X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440, X 0x0005,0x0000,0x0180,0x1440,0x0005,0x001C,0x6086,0x1440, X 0x0005,0x0020,0x9089,0x1440,0x0005,0x0018,0x908E,0x1440, X 0x0005,0x0004,0x9088,0x1440,0x0005,0x0038,0x6087,0x1440, X 0x0005,0x0000,0x0000,0x1480,0x0005,0x0000,0x0000,0x1480, X 0x0005,0x0000,0x0000,0x1500,0x0005,0x0000,0x0000,0x1500, X 0x001C,0x8000,0x0000,0x2600,0x0064,0x7FFF,0xFFFF,0xC600, X 0x0084,0x0000,0x0000,0x0400,0x0103,0xFFFF,0xFFFF,0xF800, X 0x0200,0x0004,0x0100,0x0000,0x0400,0x0004,0x0100,0x0000, X 0x080F,0xFFF8,0x00FF,0xFFE0,0x081F,0xFFF8,0x00FF,0xFFD0, X 0x081F,0xFFFC,0x01FF,0xFFD0,0x083F,0xFFFF,0xFFFF,0xFFA0, X 0x083F,0xFFFF,0xFFFF,0xFFA0,0x0820,0x0000,0x0000,0x0040, X 0x0820,0x0000,0x0000,0x0040,0x083F,0xFFFF,0xFFFF,0xFF80, X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000, X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000, X 0x0800,0x0000,0x0000,0x0000,0x047F,0xFFFF,0xFFFF,0xFF00, X 0x0380,0x0000,0x0000,0x0200,0x008A,0xAAAA,0xAAAA,0x8200, X 0x0100,0x0000,0x0000,0x0400,0x0115,0x5555,0x5554,0x8400, X 0x0200,0x0000,0x0001,0x0800,0x020D,0xFFFF,0xFFDB,0x0800, X 0x0400,0x0000,0x0000,0x1000,0x07FF,0xFFFF,0xFFFF,0xF000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 END_OF_FILE if test 1933 -ne `wc -c <'icons/console1.icon'`; then echo shar: \"'icons/console1.icon'\" unpacked with wrong size! fi # end of 'icons/console1.icon' fi if test -f 'icons/console1_bad.icon' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'icons/console1_bad.icon'\" else echo shar: Extracting \"'icons/console1_bad.icon'\" \(1933 characters\) sed "s/^X//" >'icons/console1_bad.icon' <<'END_OF_FILE' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0003,0xFFFF,0xFFFF,0xF800,0x0004,0x0000,0x0000,0x0600, X 0x0004,0x7FFF,0xFFFF,0xC500,0x0004,0x8000,0x0000,0x2480, X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440, X 0x0005,0x0000,0x0000,0x1440,0x0005,0x00A1,0x8880,0x1440, X 0x0005,0x00D2,0x4880,0x1440,0x0005,0x0093,0x8A80,0x1440, X 0x0005,0x0092,0x0A80,0x1440,0x0005,0x0091,0xC500,0x1440, X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440, X 0x0005,0x0000,0x0000,0x1440,0x0005,0x0347,0x1C70,0x1440, X 0x0005,0x02A8,0x2480,0x1440,0x0005,0x02A6,0x2460,0x1440, X 0x0005,0x02A1,0x1C10,0x1440,0x0005,0x02AE,0x04E0,0x1440, X 0x0005,0x0000,0x3800,0x1440,0x0005,0x0000,0x0000,0x1440, X 0x0005,0x0000,0x0000,0x1480,0x0005,0x0000,0x0000,0x1480, X 0x0005,0x0000,0x0000,0x1500,0x0005,0x0000,0x0000,0x1500, X 0x001C,0x8000,0x0000,0x2600,0x0064,0x7FFF,0xFFFF,0xC600, X 0x0084,0x0000,0x0000,0x0400,0x0103,0xFFFF,0xFFFF,0xF800, X 0x0200,0x0004,0x0100,0x0000,0x0400,0x0004,0x0100,0x0000, X 0x080F,0xFFF8,0x00FF,0xFFE0,0x081F,0xFFF8,0x00FF,0xFFD0, X 0x081F,0xFFFC,0x01FF,0xFFD0,0x083F,0xFFFF,0xFFFF,0xFFA0, X 0x083F,0xFFFF,0xFFFF,0xFFA0,0x0820,0x0000,0x0000,0x0040, X 0x0820,0x0000,0x0000,0x0040,0x083F,0xFFFF,0xFFFF,0xFF80, X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000, X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000, X 0x0800,0x0000,0x0000,0x0000,0x047F,0xFFFF,0xFFFF,0xFF00, X 0x0380,0x0000,0x0000,0x0200,0x008A,0xAAAA,0xAAAA,0x8200, X 0x0100,0x0000,0x0000,0x0400,0x0115,0x5555,0x5554,0x8400, X 0x0200,0x0000,0x0001,0x0800,0x020D,0xFFFF,0xFFDB,0x0800, X 0x0400,0x0000,0x0000,0x1000,0x07FF,0xFFFF,0xFFFF,0xF000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 END_OF_FILE if test 1933 -ne `wc -c <'icons/console1_bad.icon'`; then echo shar: \"'icons/console1_bad.icon'\" unpacked with wrong size! fi # end of 'icons/console1_bad.icon' fi if test -f 'icons/console1_flash.icon' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'icons/console1_flash.icon'\" else echo shar: Extracting \"'icons/console1_flash.icon'\" \(1933 characters\) sed "s/^X//" >'icons/console1_flash.icon' <<'END_OF_FILE' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0003,0xFFFF,0xFFFF,0xF800,0x0004,0x0000,0x0000,0x0600, X 0x0004,0x7FFF,0xFFFF,0xC500,0x0004,0xFFFF,0xFFFF,0xE480, X 0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFFFF,0xFFFF,0xF440, X 0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFF5E,0x777F,0xF440, X 0x0005,0xFF2D,0xB77F,0xF440,0x0005,0xFF6C,0x757F,0xF440, X 0x0005,0xFF6D,0xF57F,0xF440,0x0005,0xFF6E,0x3AFF,0xF440, X 0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFFFF,0xFFFF,0xF440, X 0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFCB8,0xE38F,0xF440, X 0x0005,0xFD57,0xDB7F,0xF440,0x0005,0xFD59,0xDB9F,0xF440, X 0x0005,0xFD5E,0xE3EF,0xF440,0x0005,0xFD51,0xFB1F,0xF440, X 0x0005,0xFFFF,0xC7FF,0xF440,0x0005,0xFFFF,0xFFFF,0xF440, X 0x0005,0xFFFF,0xFFFF,0xF480,0x0005,0xFFFF,0xFFFF,0xF480, X 0x0005,0xFFFF,0xFFFF,0xF500,0x0005,0xFFFF,0xFFFF,0xF500, X 0x001C,0xFFFF,0xFFFF,0xE600,0x0064,0x7FFF,0xFFFF,0xC600, X 0x0084,0x0000,0x0000,0x0400,0x0103,0xFFFF,0xFFFF,0xF800, X 0x0200,0x0004,0x0100,0x0000,0x0400,0x0004,0x0100,0x0000, X 0x080F,0xFFF8,0x00FF,0xFFE0,0x081F,0xFFF8,0x00FF,0xFFD0, X 0x081F,0xFFFC,0x01FF,0xFFD0,0x083F,0xFFFF,0xFFFF,0xFFA0, X 0x083F,0xFFFF,0xFFFF,0xFFA0,0x0820,0x0000,0x0000,0x0040, X 0x0820,0x0000,0x0000,0x0040,0x083F,0xFFFF,0xFFFF,0xFF80, X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000, X 0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000, X 0x0800,0x0000,0x0000,0x0000,0x047F,0xFFFF,0xFFFF,0xFF00, X 0x0380,0x0000,0x0000,0x0200,0x008A,0xAAAA,0xAAAA,0x8200, X 0x0100,0x0000,0x0000,0x0400,0x0115,0x5555,0x5554,0x8400, X 0x0200,0x0000,0x0001,0x0800,0x020D,0xFFFF,0xFFDB,0x0800, X 0x0400,0x0000,0x0000,0x1000,0x07FF,0xFFFF,0xFFFF,0xF000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 END_OF_FILE if test 1933 -ne `wc -c <'icons/console1_flash.icon'`; then echo shar: \"'icons/console1_flash.icon'\" unpacked with wrong size! fi # end of 'icons/console1_flash.icon' fi if test -f 'icons/contool.icon' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'icons/contool.icon'\" else echo shar: Extracting \"'icons/contool.icon'\" \(1933 characters\) sed "s/^X//" >'icons/contool.icon' <<'END_OF_FILE' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8000,0x0000,0x0000,0x0001, X 0x8003,0xFFFF,0xFFFF,0xF801,0x8004,0x0000,0x0000,0x0601, X 0x8004,0x7FFF,0xFFFF,0xC501,0x8004,0x8000,0x0000,0x2481, X 0x8005,0x0000,0x0000,0x1441,0x8005,0x3E80,0x0000,0x1441, X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441, X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441, X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441, X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441, X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441, X 0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441, X 0x8005,0x0000,0x0000,0x1481,0x8005,0x0000,0x0000,0x1481, X 0x8005,0x0000,0x0000,0x1501,0x8005,0x0000,0x0000,0x1501, X 0x801C,0x8000,0x0000,0x2601,0x8064,0x7FFF,0xFFFF,0xC601, X 0x8084,0x0000,0x0000,0x0401,0x8103,0xFFFF,0xFFFF,0xF801, X 0x8200,0x0004,0x0100,0x0001,0x8400,0x0004,0x0100,0x0001, X 0x880F,0xFFF8,0x00FF,0xFFE1,0x881F,0xFFF8,0x00FF,0xFFE1, X 0x881F,0xFFFC,0x01FF,0xFFE1,0x883F,0xFFFF,0xFFFF,0xFFE1, X 0x883F,0xFFFF,0xFFFF,0xFFE1,0x8820,0x0000,0x0000,0x00E1, X 0x8820,0x0000,0x0000,0x00C1,0x847F,0xFFFF,0xFFFF,0xFFC1, X 0x8380,0x0000,0x0000,0x0381,0x808A,0xAAAA,0xAAAA,0x8301, X 0x8100,0x0000,0x0000,0x0501,0x8115,0x5555,0x5554,0x8501, X 0x8200,0x0000,0x0001,0x0A01,0x820D,0xFFFF,0xFFDB,0x0A01, X 0x8400,0x0000,0x0000,0x1401,0x87FF,0xFFFF,0xFFFF,0xF401, X 0x8400,0x0000,0x0000,0x0801,0x87FF,0xFFFF,0xFFFF,0xF801, X 0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001, X 0x8F80,0x0000,0x0001,0xE001,0x98C0,0x0000,0x0000,0x6001, X 0x98C0,0x0000,0x0000,0x6001,0x9807,0xC5E1,0xF0F8,0x61F1, X 0x980C,0x6733,0x198C,0x6319,0x980C,0x6633,0x018C,0x6319, X 0x980C,0x6631,0xF18C,0x63F9,0x98CC,0x6630,0x198C,0x6301, X 0x98CC,0x6633,0x198C,0x6319,0x8F87,0xC631,0xF0F8,0x61F1, X 0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001, X 0x8000,0x0000,0x0000,0x0001,0xFFFF,0xFFFF,0xFFFF,0xFFFF END_OF_FILE if test 1933 -ne `wc -c <'icons/contool.icon'`; then echo shar: \"'icons/contool.icon'\" unpacked with wrong size! fi # end of 'icons/contool.icon' fi if test -f 'icons/contool_bad.icon' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'icons/contool_bad.icon'\" else echo shar: Extracting \"'icons/contool_bad.icon'\" \(1933 characters\) sed "s/^X//" >'icons/contool_bad.icon' <<'END_OF_FILE' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8000,0x0000,0x0000,0x0001, X 0x8003,0xFFFF,0xFFFF,0xF801,0x8004,0x0000,0x0000,0x0601, X 0x8004,0x7FFF,0xFFFF,0xC501,0x8004,0x8000,0x0000,0x2481, X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x417F,0xFFFF,0xD441, X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441, X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441, X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441, X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441, X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441, X 0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441, X 0x8005,0x7FFF,0xFFFF,0xD481,0x8005,0x7FFF,0xFFFF,0xD481, X 0x8005,0x7FFF,0xFFFF,0xD501,0x8005,0x7FFF,0xFFFF,0xD501, X 0x801C,0x8000,0x0000,0x2601,0x8064,0x7FFF,0xFFFF,0xC601, X 0x8084,0x0000,0x0000,0x0401,0x8103,0xFFFF,0xFFFF,0xF801, X 0x8200,0x0004,0x0100,0x0001,0x8400,0x0004,0x0100,0x0001, X 0x880F,0xFFF8,0x00FF,0xFFE1,0x881F,0xFFF8,0x00FF,0xFFE1, X 0x881F,0xFFFC,0x01FF,0xFFE1,0x883F,0xFFFF,0xFFFF,0xFFE1, X 0x883F,0xFFFF,0xFFFF,0xFFE1,0x8820,0x0000,0x0000,0x00E1, X 0x8820,0x0000,0x0000,0x00C1,0x847F,0xFFFF,0xFFFF,0xFFC1, X 0x8380,0x0000,0x0000,0x0381,0x808A,0xAAAA,0xAAAA,0x8301, X 0x8100,0x0000,0x0000,0x0501,0x8115,0x5555,0x5554,0x8501, X 0x8200,0x0000,0x0001,0x0A01,0x820D,0xFFFF,0xFFDB,0x0A01, X 0x8400,0x0000,0x0000,0x1401,0x87FF,0xFFFF,0xFFFF,0xF401, X 0x8400,0x0000,0x0000,0x0801,0x87FF,0xFFFF,0xFFFF,0xF801, X 0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001, X 0x8F80,0x0000,0x0001,0xE001,0x98C0,0x0000,0x0000,0x6001, X 0x98C0,0x0000,0x0000,0x6001,0x9807,0xC5E1,0xF0F8,0x61F1, X 0x980C,0x6733,0x198C,0x6319,0x980C,0x6633,0x018C,0x6319, X 0x980C,0x6631,0xF18C,0x63F9,0x98CC,0x6630,0x198C,0x6301, X 0x98CC,0x6633,0x198C,0x6319,0x8F87,0xC631,0xF0F8,0x61F1, X 0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001, X 0x8000,0x0000,0x0000,0x0001,0xFFFF,0xFFFF,0xFFFF,0xFFFF END_OF_FILE if test 1933 -ne `wc -c <'icons/contool_bad.icon'`; then echo shar: \"'icons/contool_bad.icon'\" unpacked with wrong size! fi # end of 'icons/contool_bad.icon' fi if test -f 'icons/stopsign.icon' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'icons/stopsign.icon'\" else echo shar: Extracting \"'icons/stopsign.icon'\" \(1933 characters\) sed "s/^X//" >'icons/stopsign.icon' <<'END_OF_FILE' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0x8888,0xBFFF,0xFFFC,0x8888,0x8888,0xC000,0x0002,0x8888, X 0x2222,0x8000,0x0001,0x2222,0x2223,0x0FFF,0xFFF0,0xA222, X 0x888A,0x1FFF,0xFFF8,0x4888,0x888C,0x3FFF,0xFFFC,0x2888, X 0x2228,0x7FFF,0xFFFE,0x1222,0x2230,0xFFFF,0xFFFF,0x0A22, X 0x88A1,0xFFFF,0xFFFF,0x8488,0x8843,0xFFFF,0xFFFF,0xC288, X 0x2287,0xFFFF,0xFFFF,0xE122,0x230F,0xFFFF,0xFFFF,0xF0A2, X 0x8A1F,0xFFFF,0xFFFF,0xF848,0x8C3F,0xFFFF,0xFFFF,0xFC28, X 0x287F,0xFFFF,0xFFFF,0xFE12,0x30FF,0xFFFF,0xFFFF,0xFF0A, X 0xA1FF,0xFFFF,0xFFFF,0xFF84,0xC3FF,0xFFFF,0xFFFF,0xFFC2, X 0x87FF,0xFFFF,0xFFFF,0xFFE1,0x8FFF,0xFFFF,0xFFFF,0xFFF1, X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1, X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1, X 0x8FF0,0x0C00,0xF87C,0x03F1,0x8FE7,0xCDCE,0xF73E,0x79F1, X 0x8FCF,0xEFCF,0xEF9E,0x7CF1,0x8FCF,0xEFCF,0xEFCE,0x7CF1, X 0x8FC7,0xFFCF,0xCFCE,0x7CF1,0x8FE1,0xFFCF,0xCFCE,0x79F1, X 0x8FF0,0xFFCF,0xCFCE,0x03F1,0x8FFC,0x3FCF,0xCFCE,0x7FF1, X 0x8FFF,0x1FCF,0xCFCE,0x7FF1,0x8FFF,0x8FCF,0xCFCE,0x7FF1, X 0x8FDF,0xCFCF,0xEFCE,0x7FF1,0x8FDF,0xCFCF,0xE7DE,0x7FF1, X 0x8FCF,0x9FCF,0xF3BE,0x7FF1,0x8FC0,0x3F03,0xF87C,0x3FF1, X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1, X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1, X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1, X 0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x87FF,0xFFFF,0xFFFF,0xFFE1, X 0x43FF,0xFFFF,0xFFFF,0xFFC2,0x21FF,0xFFFF,0xFFFF,0xFF86, X 0x90FF,0xFFFF,0xFFFF,0xFF08,0x887F,0xFFFF,0xFFFF,0xFE18, X 0x243F,0xFFFF,0xFFFF,0xFC22,0x221F,0xFFFF,0xFFFF,0xF862, X 0x890F,0xFFFF,0xFFFF,0xF088,0x8887,0xFFFF,0xFFFF,0xE188, X 0x2243,0xFFFF,0xFFFF,0xC222,0x2221,0xFFFF,0xFFFF,0x8622, X 0x8890,0xFFFF,0xFFFF,0x0888,0x8888,0x7FFF,0xFFFE,0x1888, X 0x2224,0x3FFF,0xFFFC,0x2222,0x2222,0x1FFF,0xFFF8,0x6222, X 0x8889,0x0FFF,0xFFF0,0x8888,0x8888,0x8000,0x0001,0x8888, X 0x2222,0x4000,0x0002,0x2222,0x2222,0x3FFF,0xFFFE,0x2222 END_OF_FILE if test 1933 -ne `wc -c <'icons/stopsign.icon'`; then echo shar: \"'icons/stopsign.icon'\" unpacked with wrong size! fi # end of 'icons/stopsign.icon' fi if test -f 'icons/stopsign_inv.icon' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'icons/stopsign_inv.icon'\" else echo shar: Extracting \"'icons/stopsign_inv.icon'\" \(1933 characters\) sed "s/^X//" >'icons/stopsign_inv.icon' <<'END_OF_FILE' X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 X */ X 0x8888,0x8888,0x8888,0x8888,0x8888,0xBFFF,0xFFFC,0x8888, X 0x2222,0x7FFF,0xFFFE,0x2222,0x2222,0xFFFF,0xFFFF,0x2222, X 0x8889,0xE000,0x0007,0x8888,0x888B,0xC000,0x0003,0xC888, X 0x2227,0x8000,0x0001,0xE222,0x222F,0x0000,0x0000,0xF222, X 0x889E,0x0000,0x0000,0x7888,0x88BC,0x0000,0x0000,0x3C88, X 0x2278,0x0000,0x0000,0x1E22,0x22F0,0x0000,0x0000,0x0F22, X 0x89E0,0x0000,0x0000,0x0788,0x8BC0,0x0000,0x0000,0x03C8, X 0x2780,0x0000,0x0000,0x01E2,0x2F00,0x0000,0x0000,0x00F2, X 0x9E00,0x0000,0x0000,0x0078,0xBC00,0x0000,0x0000,0x003C, X 0x7800,0x0000,0x0000,0x001E,0x7000,0x0000,0x0000,0x000E, X 0xF000,0x0000,0x0000,0x000E,0xF000,0x0000,0x0000,0x000E, X 0x7000,0x0000,0x0000,0x000E,0x7000,0x0000,0x0000,0x000E, X 0xF00F,0xF3FF,0x0783,0xFC0E,0xF018,0x3231,0x08C1,0x860E, X 0x7030,0x1030,0x1061,0x830E,0x7030,0x1030,0x1031,0x830E, X 0xF038,0x0030,0x3031,0x830E,0xF01E,0x0030,0x3031,0x860E, X 0x700F,0x0030,0x3031,0xFC0E,0x7003,0xC030,0x3031,0x800E, X 0xF000,0xE030,0x3031,0x800E,0xF000,0x7030,0x3031,0x800E, X 0x7020,0x3030,0x1031,0x800E,0x7020,0x3030,0x1821,0x800E, X 0xF030,0x6030,0x0C41,0x800E,0xF03F,0xC0FC,0x0783,0xC00E, X 0x7000,0x0000,0x0000,0x000E,0x7000,0x0000,0x0000,0x000E, X 0xF000,0x0000,0x0000,0x000E,0xF000,0x0000,0x0000,0x000E, X 0x7000,0x0000,0x0000,0x000E,0x7000,0x0000,0x0000,0x000E, X 0xF000,0x0000,0x0000,0x000E,0xF800,0x0000,0x0000,0x001E, X 0x3C00,0x0000,0x0000,0x003E,0x3E00,0x0000,0x0000,0x007A, X 0x8F00,0x0000,0x0000,0x00F8,0x8F80,0x0000,0x0000,0x01E8, X 0x23C0,0x0000,0x0000,0x03E2,0x23E0,0x0000,0x0000,0x07A2, X 0x88F0,0x0000,0x0000,0x0F88,0x88F8,0x0000,0x0000,0x1E88, X 0x223C,0x0000,0x0000,0x3C22,0x223E,0x0000,0x0000,0x7822, X 0x888F,0x0000,0x0000,0xF888,0x888F,0x8000,0x0001,0xE888, X 0x2223,0xC000,0x0003,0xE222,0x2223,0xE000,0x0007,0xA222, X 0x8888,0xFFFF,0xFFFF,0x8888,0x8888,0xFFFF,0xFFFE,0x8888, X 0x2222,0x3FFF,0xFFFE,0x2222,0x2222,0x2222,0x2222,0x2222 END_OF_FILE if test 1933 -ne `wc -c <'icons/stopsign_inv.icon'`; then echo shar: \"'icons/stopsign_inv.icon'\" unpacked with wrong size! fi # end of 'icons/stopsign_inv.icon' fi echo shar: End of shell archive. exit 0