shawn@mit-eddie.UUCP (Shawn McKay) (06/23/85)
Ever wish the mailer would tell you when you get mail? Well, here is a
Q&D hack to give you just that wish. Enjoy!
----------- Cut here and the tty might be hurt -------------
/*
* Notify user of new mail;
*
* CopyRight (c) 1985 Shawn F. Mckay, All Rights Reserved.
*
* Permission is granted for NON-PROFIT use of any kind.
*
* Date: 15-May-1985
* Author: Shawn F. Mckay (mit-eddie!shawn)
*/
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#define BELL (037 & 'G')
int quit ();
long touched();
char *getlogin();
char uname[80];
/*
* Format:
*
* % mailer [sleep-time-in-seconds]
*/
main (argc, argv)
int argc;
char **argv;
{
int fh = 0;
int Sleep_t = 45;
long when = 0;
long now = 0;
char *temp = NULL;
char fname[80];
register int i = 0;
if (argc > 1)
Sleep_t = atoi (argv[1]);
fh = fork();
if (fh) exit (-1);
if ((temp = getlogin()) == NULL) {
printf ("%s: Unable to find your username, aborting.\n",
argv[0]);
exit (-1);
} else
strcpy (uname, temp);
sprintf (fname, "/usr/spool/mail/%s", uname);
signal (SIGHUP, quit);
for (i=SIGINT;i < SIGPROF+1;++i)
signal (i, SIG_IGN);
when = touched (fname);
for (;;) {
sleep (Sleep_t);
if (strcmp (uname, getlogin()))
exit (-1);
if ((now = touched (fname)) == 0)
continue;
if (now != when) {
when = now;
msg ();
}
}
}
/*
* Touched: Return last access time
*/
long touched (fname)
char *fname;
{
struct stat st;
if (stat (fname, &st) == -1) {
printf ("The file \"%s\" was not found.\n", fname);
printf ("Mail watch is now terminated.\n");
exit (-1);
}
if (st.st_size < 1)
return (0);
return (st.st_mtime);
}
msg ()
{
printf ("\n%c[New mail has arrived for %s]\n",
BELL, getlogin());
return (1);
}
quit ()
{
exit (0);
}jordan@ucbvax.ARPA (Jordan Hayes) (06/25/85)
Why is it that all of this stuff (don't get me wrong, I grab a lot of it and use some of it too!) ASSUMES that we all want the BELL char to be a ^G ?? You know there *are* some of us out here that use a visual bell and reflect this in our termcaps... What's the big deal about checking for the bell character in a term entry from my environment ?? I'm only looking for a little consideration... No, I'm not angry (at least not enough to stop subscribing to net.sources), but maybe y'all should think about the minorities every once in a while... /jordan ------- ARPA: jordan@ucb-vax.BERKELEY.EDU UUCP: jordan@ucbvax.UUCP WARHEADS: 37' 52.29" N 122' 15.41" W
wombat@ccvaxa.UUCP (06/29/85)
Alternatively, on Berkeley systems, you can use biff(1) or set the csh(1) $mail variable. (Yes, biff insists on beeping and won't flash your screen.) For csh, put a line like set mail=(10 /usr/spool/mail/$user) in your .cshrc to have csh check your mailbox every 10 minutes or at your next prompt, whichever is later. If there's new mail, you get a little 'You have new mail.' message. "When you are about to die, a wombat is better than no company at all." Roger Zelazny, *Doorways in the Sand* Wombat ihnp4!uiucdcs!ccvaxa!wombat
gm@trsvax (07/02/85)
> For csh, put a line like set mail=(10 /usr/spool/mail/$user) in your .cshrc > to have csh check your mailbox every 10 minutes or at your next prompt, > whichever is later... Uh, that first value is in seconds, not minutes. 10 minutes is the default. ------------------ "I love the smell of Napalm in the mornings..." George Moore (gm@trsvax)
shawn@mit-eddie.UUCP (Shawn McKay) (07/06/85)
<* I didn't want this line anyway! *> *Please*, enough! I have received 25+ messages telling me about biff(1), csh(1), and sysline(1), all of which I don't like, nor do I wish to use. biff(1): Does a chmod on my tty so comsat can kill my whole screen and bother me to no end. I didn't want that. csh(1): Notifies me only on command, hence, if I relax and watch TV, I only wish to glance at my terminal to see if I have any mail, after all, my system stands single user most of the time. (not mit-eddie, futura). sysline(1): Does not work on any terminals I have access too. As I have seen, it's a nice program, too bad it's got such limited terminal support. *Please* I posted that source as a service to users who might wan't something less then comsat, but more then the C shell. I do not wish to hear about my options, though the thought is appreciated. Thank you for your time. -- Shawn F. Mckay Uucp: mit-eddie!shawn Arpa: Shawn at Mit-Mc
broome@ucbvax.ARPA (Jonathan C. Broome) (07/07/85)
[ burp ]
Here is a simple routine you can use wherever you want to beep the terminal
without annoying people like Jordan (who has a terminal that chokes on ^G!)
It checks for a visual bell capability in $TERMCAP and uses visual bells
instead of control G if the terminal is capable, without dragging in the
whole term{cap,lib} library. Note that is doesn't use stdio, you may want
to change this for your particular application.
===========================================================
Jonathan C. Broome University of California, Berkeley
UUCP ...!ucbvax!broome
ARPA broome@ucbvax.ARPA
===========================================================
==============================================================================
/*
* beep.c --- demo program for the `beep()' routine.
*
* Written by Jonathan C. Broome (broome@ucbvax.Berkeley) to
* keep Jordan Hayes (jordan@ucbvax.Berkeley) happy - his dumb
* terminal chokes on ^G !!!
*
* Checks for visual bell (vb) string in termcap and uses it if
* found, else uses the normal ^G (\007).
*
* Feel free to use this code wherever, it is in the public domain.
*/
#define isdigit(c) ('0' <= c && c <= '9')
#define NULL 0
main ()
{
beep ();
exit (0);
}
beep ()
{
char *getenv();
char *termcap;
char *vb;
char vbuf[256];
if ((termcap = getenv ("TERMCAP")) == NULL) {
write (1, "\007", 1);
return;
}
vb = vbuf;
while (*termcap != NULL) { /* find the vb string */
if (strncmp(termcap, "vb=", 3) == 0) {
termcap += 3;
while (*termcap && *termcap != ':')
*vb++ = *termcap++;
break;
}
*termcap++;
}
*vb = '\0';
if (!*vbuf) /* didn't find a vb string */
write (1, "\007", 1);
else
translate (vbuf);
}
/*
* A nice hokey routine to handle printing a (simple) termcap vb string.
* Note that it doesn't understand any of the `%' conversions, but what
* terminals have parameters in the vb string anyway???
*/
translate (buf)
char *buf;
{
register char *i;
int val = 0;
i = buf;
while (*i) {
if (*i == '^') { /* turn ^X to the real thing */
val = *++i - '@';
write (1, &val, 1);
i++;
val = 0;
} else if (*i == '\\') {
switch (*++i) { /* all the meta-escapes */
case 'E': write (1, "\033", 1); i++; break;
case 'r': write (1, "\r", 1); i++; break;
case 'n': write (1, "\n", 1); i++; break;
case 'b': write (1, "\b", 1); i++; break;
case 'f': write (1, "\f", 1); i++; break;
case 't': write (1, "\t", 1); i++; break;
case '\\':write (1, "\\", 1); i++; break;
default: /* or octal form */
while (*i && isdigit (*i))
val = val * 8 + ((*i++) - '0');
val &= 0177; /* strip the high bit */
write (1, &val, 1);
val = 0;
break;
}
} else /* normal character */
write (1, i++, 1);
}
}