Subject: v07i085: A mail watcher for SUNwindows Newsgroups: mod.sources Approved: mirror!rs Submitted by: seismo!ut-sally!ut-ngp!clyde (Head UNIX Hacquer) Mod.sources: Volume 7, Issue 85 Archive-name: sunmailwatch # This is a little hack that I put together to watch for incoming mail. # I use it instead of biff(1) for this. Originally this was a shell script, # but I got tired of the slowness and other problems (such as signal # handling), so I converted it to C. # # So when new mail arrives at my SUN, an icon on my desktop changes to let # me know. Slightly expensive (requires running a shelltool), but worth # it and simple. # # This is a shell archive. #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # README # Makefile # emptymbox # fullmbox # mailwatch.1 # mailwatch.c cat << \SHAR_EOF > README Mailwatch distribution notes README - this file Makefile - q.e.d emptymbox - 'empty mailbox' icon (place in /usr/include/images) fullmbox - 'full mailbox' icon (place in /usr/include/images) mailwatch.1 - manual page mailwatch.c - C source Bugs to clyde@ngp.utexas.edu, ihnp4!ut-ngp!clyde SHAR_EOF cat << \SHAR_EOF > Makefile mailwatch: mailwatch.c cc -o mailwatch -O mailwatch.c SHAR_EOF cat << \SHAR_EOF > emptymbox /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 */ 0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888, 0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x22FF,0x2222, 0x8888,0x8888,0x8B00,0xC888,0x8888,0x8888,0x9C00,0x2888, 0x2222,0x2222,0x6000,0x1222,0x2222,0x2223,0x8000,0x0A22, 0x8888,0x888C,0x0000,0x0C88,0x8888,0x88F0,0x0000,0x0488, 0x2222,0x2300,0x0000,0x0222,0x2222,0x27F0,0x0000,0x0222, 0x8888,0x980C,0x0000,0x0288,0x8888,0xE003,0x0000,0x0288, 0x2222,0x8000,0x8000,0x0222,0x2223,0x0000,0x4000,0x0222, 0x888A,0x0000,0x2000,0x0288,0x888A,0x0000,0x2000,0x0288, 0x2224,0x0000,0x1000,0x0222,0x2224,0x0000,0x1000,0x0222, 0x8888,0x0000,0x0800,0x0288,0x8888,0x0000,0x0800,0x2288, 0x2228,0x0000,0x0800,0xE222,0x2228,0x0000,0x0801,0xE222, 0x8888,0x0000,0x0803,0xE288,0x8888,0x0000,0x080E,0xE288, 0x2229,0x1013,0x081C,0xE222,0x2229,0xB301,0x0830,0xE222, 0x8889,0x5091,0x0820,0xCC88,0x8889,0x5391,0x0800,0x8888, 0x2229,0x1491,0x0800,0x3222,0x2229,0x1391,0x0800,0x6222, 0x8888,0x0000,0x0800,0x8888,0x8888,0x0000,0x0801,0x8888, 0x2228,0x0000,0x0802,0x2222,0x2228,0x0000,0x0806,0x2222, 0x8888,0x0000,0x0808,0x8888,0x8888,0x0000,0x0818,0x8888, 0x2228,0x0000,0x0822,0x2222,0x2228,0x0000,0x08E2,0x2222, 0x8888,0x0000,0x0988,0x8888,0x8888,0x0000,0x0A88,0x8888, 0x2228,0x0000,0x0E22,0x2222,0x222F,0xFFFF,0xFE22,0x2222, 0x8888,0x8888,0xBE88,0x8888,0x8888,0x8888,0xBE88,0x8888, 0x2222,0x2222,0x3E22,0x2222,0x2222,0x2222,0x3E22,0x2222, 0x8888,0x8888,0xBE88,0x8888,0x8888,0x8888,0xBE88,0x8888, 0x2222,0x2222,0x3E22,0x2222,0x2222,0x2222,0x3E22,0x2222, 0x8888,0x8888,0xBE88,0x8888,0x8888,0x8888,0xBE88,0x8888, 0x2222,0x2222,0x3E22,0x2222,0x2222,0x2222,0x3E22,0x2222, 0x8888,0x8888,0xBE88,0x8888,0x8888,0x8888,0xBE88,0x8888, 0x2222,0x2222,0x3E22,0x2222,0x2222,0x2222,0x3E22,0x2222, 0x8888,0x8888,0xBE88,0x8888,0x8888,0x8888,0xBE88,0x8888, 0x2222,0x2222,0x3E22,0x2222,0x2222,0x2222,0x3E22,0x2222 SHAR_EOF cat << \SHAR_EOF > fullmbox /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16 */ 0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888,0x8888, 0x2222,0x2222,0x2222,0x2222,0x2222,0x2222,0x22FF,0x2222, 0x8888,0x8888,0x8B00,0xC888,0x8888,0x8888,0x9C00,0x2888, 0x2222,0x2222,0x6000,0x1222,0x2222,0x2223,0x8000,0x0A22, 0x8888,0x888C,0x0000,0x0C88,0x8888,0x88F0,0x0000,0x0488, 0x2222,0x2300,0x0001,0x0222,0x2222,0x27F0,0x0007,0x0222, 0x8888,0x9AAC,0x001F,0x0288,0x8888,0xF557,0x003F,0x0288, 0x2222,0xAAAA,0x803F,0x0222,0x2223,0x5555,0x403F,0x0222, 0x888A,0xAAAA,0xA03E,0x0288,0x888B,0x5555,0x6038,0x0288, 0x2226,0xAAAA,0xB030,0x0222,0x2225,0x5555,0x5030,0x0222, 0x888A,0xAAAA,0xA830,0x0288,0x888D,0x5555,0x5830,0x0288, 0x222A,0xAAAA,0xA830,0x0222,0x222D,0x5555,0x5830,0x0222, 0x888A,0xAAAA,0xA830,0x0288,0x888D,0x5555,0x5830,0x0288, 0x222A,0xAAAA,0xA830,0x0222,0x222D,0x5555,0x7830,0x0222, 0x888A,0xAAAA,0xE820,0x0C88,0x888D,0x5555,0xD800,0x0888, 0x222A,0xAAAB,0x0800,0x3222,0x222D,0x5555,0x0800,0x6222, 0x888A,0xAAB9,0x0800,0x8888,0x888D,0x5571,0x0801,0x8888, 0x222A,0xAAE1,0x0802,0x2222,0x222D,0x5543,0x0806,0x2222, 0x888A,0xAE8C,0x0808,0x8888,0x888D,0x5D30,0x1818,0x8888, 0x222A,0xBAC0,0x2822,0x2222,0x222D,0x7700,0x58E2,0x2222, 0x888A,0xAB55,0xA988,0x8888,0x888F,0x5555,0x5A88,0x8888, 0x222E,0xAAAA,0xAE22,0x2222,0x222F,0xFFFF,0xFE22,0x2222, 0x8890,0x0000,0x1E88,0x8888,0x88A0,0x0000,0x3E88,0x8888, 0x2240,0x0000,0x7E22,0x2222,0x2280,0x0000,0xBE22,0x2222, 0x8900,0x0001,0xBE88,0x8888,0x8A00,0x0002,0xBE88,0x8888, 0x2400,0x0006,0x3E22,0x2222,0x2800,0x000A,0x3E22,0x2222, 0x9000,0x0018,0xBE88,0x8888,0xA000,0x0028,0xBE88,0x8888, 0x4000,0x0062,0x3E22,0x2222,0x4000,0x00A2,0x3E22,0x2222, 0xC000,0x0188,0xBE88,0x8888,0xA000,0x0688,0xBE88,0x8888, 0x3000,0x0A22,0x3E22,0x2222,0x2E01,0xF222,0x3E22,0x2222, 0x89FE,0x8888,0xBE88,0x8888,0x8888,0x8888,0xBE88,0x8888, 0x2222,0x2222,0x3E22,0x2222,0x2222,0x2222,0x3E22,0x2222 SHAR_EOF cat << \SHAR_EOF > mailwatch.1 .TH MAILWATCH 1 .SH NAME mailwatch \- watch for mail .SH SYNOPSIS .B mailwatch [ .B \-a ] [ .B \-c ] [ .B \-e ] [ .B \-o ] [ .B \-i .I empty-icon ] [ .B \-I .I full-icon ] [ .B \-l .I empty-label ] [ .B \-L .I full-label ] [ .B \-m .I mail-reader ] [ .B \-t .I check-time ] .SH DESCRIPTION .I Mailwatch monitors the users' mailbox (as given in the .B MAIL environment setting) and alerts the user when there is new mail. .I Mailwatch uses the SUN .IR shelltool (1) terminal emulation capabilities to post the new mail alert. It will not function properly unless running in a SUN tty emulation window. .PP While waiting for mail, the window will be closed and displaying the .I empty-mailbox icon. When new mail arrives, the .I full-mailbox icon is displayed. The .I mailwatch window may optionally pop to the front of the screen, open and start up a mail reader. After the mail reader has exited and the mail disposed of, the window is closed and the .I empty-mailbox icon is displayed. .SH OPTIONS .TP 15 .B \-a Ask before starting up the mail reader program. .TP .B \-c Clear the terminal emulator window before starting up the mail reader program. .TP .B \-e Bring window to front when mail arrives. .TP .B \-o Automatically open window when mail arrives. .TP \fB\-i\fP\fI empty-icon\fP Icon to display when mailbox empty. (Default is \fI/usr/include/images/emptymbox\fP). .TP \fB\-I\fP\fI full-icon\fP Icon to display when mail arrives. (Default is \fI/usr/include/images/fullmbox\fP). .TP \fB\-l \fP\fIempty-label\fP String to use as label for empty mailbox icon. (Default is for no label). .TP \fB\-L \fP\fIfull-label\fP String to use as label for full mailbox icon. (Default is for no label). .TP \fB\-m \fP\fImail-reader\fP Mail reading program to use. (Default is .IR Mail(1)). .TP \fB\-t \fP\fIinterval\fP Check for mail every .I interval seconds. (Default is 60 seconds). .PP .I Mailwatch can also be forced to check the mailbox by sending it an interrupt signal (\fBSIGINT\fP). Sending a quit signal (\fBSIGQUIT\fP) causes .I mailwatch to exit. .PP .I Mailwatch uses the SUN tty emulator window capabilities which are controlled by command strings, so it need not run on the SUN workstation itself. .SH BUGS .PP The window is closed only if the mailbox file is empty. .sp All pending input is flushed when new mail is detected, and this sometimes causes .I mailwatch output to be garbled. .sp This program could well run as an actual tool, sparing the expense of running a shelltool for mail monitoring. .sp SUN UNIX 3.0 has a .I mailtool which performs many of these functions, but we don\'t run 3.0 yet. .SH AUTHOR Clyde Hoover, University of Texas Compuation Center, Austin Texas. .SH FILES The name of the mail file watched is taken from the .B MAIL environment entry. .br .I /usr/include/images/emptymbox and .I /usr/include/images/fullmbox are the default icons displayed. SHAR_EOF cat << \SHAR_EOF > mailwatch.c /* * mailwatch - New mail watcher which manipulates SUN tty windows * Changes icons when new mail arrives and optionally * opens SUN window and starts up mail reading program * * Usage: mailwatch -a (Ask before starting up mail reader) * -c (Clear screen before reading mail) * -e (Bring window to top when mail arrives) * -o (Automatically open window for new mail) * -i (Icon to display when mailbox empty) * -I (Icon to display when mailbox full) * -l (Label for empty mailbox icon) * -L (Label for full mailbox icon) * -m (Mail reading program) * -t (New mail check time) * * Compliation: cc -o mailwatch -O mailwatch.c * Ownership: any/any * Mode: 0755 * Binary: anywhere */ #include #include #include #include #include #include #include int CheckTime = 120; /* Time between mail checks */ char *MailBox; /* Mailbox file */ char *EmptyMboxIcon = "/usr/include/images/emptymbox", /* CONFIG */ /* Icon for empty mailbox */ *FullMboxIcon = "/usr/include/images/fullmbox"; /* CONFIG */ /* Icon for full mailbox */ char *EmptyMboxLabel = "", /* Label for empty mbox icon */ *FullMboxLabel = ""; /* Label for full mbox icon */ char *MailReader = "Mail"; /* Mail reading program */ int AutoOpen = 0, /* Automatically open window for mail */ Clear = 0, /* Clear window before starting MailReader */ Ask = 0, /* Ask before starting MailReader */ Expose = 0; /* Expose sun window for mail */ int OnSun; /* Running under SUN windows */ char *clr_window = "\014", /* Clear SUN window */ *c_window = "\033[2t", /* Close SUN window */ *o_window = "\033[1t", /* Open SUN window */ *e_window = "\033[5t", /* Expose SUN window */ *i_label = "\033]L%s\033\\", /* Set icon label */ *s_label = "\033]l%s\033\\", /* Set top stripe label */ *s_icon = "\033]I%s\033\\"; /* Set icon */ int checked = 0; /* Mail check commanded (via SIGINT) */ jmp_buf here; /* Where to return to for signals */ /* Usage message */ char *Usage = "Usage: mailwatch [-a] [-c] [-e] [-o]\n\ [-i emptymboxicon] [-I fullmboxicon]\n\ [-l emptymboxlabel] [-L fullmboxlabel]\n\ [-m mailreader] [-t check-time]\n"; /* * Simple things */ #define seticon(I) printf(s_icon, I) #define seticonlabel(S) printf(i_label, S) #define setstripe(S) printf(s_label, S) #define putstr(S) fputs(S, stdout) #define CLOSED 0 /* Window is closed */ #define OPEN 1 /* Window is open */ main(argc, argv) int argc; char **argv; { int state = OPEN; /* Current window status */ int catcher(); /* Signal catcher */ setbuf(stdout, (char *)NULL); init(argc, argv); (void) signal(SIGINT, catcher); (void) signal(SIGQUIT, catcher); setjmp(here); for (;;) { if (filesize(MailBox) > 0) { state = OPEN; seticon(FullMboxIcon); seticonlabel(FullMboxLabel); setstripe(" You have mail."); if (Expose) putstr(e_window); if (AutoOpen) putstr(o_window); if (Ask) { char buf[80]; /* Input buffer */ putstr("\nPress RETURN to read mail"); fflush(stdout); tossinput(); (void) fgets(buf, 80, stdin); } if (Clear) putstr(clr_window); (void) system(MailReader); } else { if (state == OPEN) { putstr(c_window); seticon(EmptyMboxIcon); seticonlabel(EmptyMboxLabel); setstripe(" Waiting for mail."); state = CLOSED; } if (checked) { putstr("No mail.\n"); checked = 0; } tsleep(CheckTime); } } } /* * filesize - get size of file * * Returns: size of file or -1 if file not found */ filesize(file) char *file; /* File to size */ { struct stat s; /* File status */ if (stat(file, &s) < 0) return(-1); return(s.st_size); } /* * catcher - signal catcher */ catcher(sig) int sig; /* Signal which got us here */ { if (sig == SIGQUIT) { putstr("\nQuit\n"); exit(1); } checked = 1; /* Set user check flag */ longjmp(here, 1); } /* * tossinput - flush pending terminal input */ tossinput() { tsleep(2); ioctl(0, TIOCFLUSH, 0); } /* * tsleep -- sleep for