|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T n
Length: 7604 (0x1db4) Types: TextFile Names: »newmail.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦e7f64e0c0⟧ »EurOpenD3/mail/vmh.tar.Z« └─⟦dcb95597f⟧ └─⟦this⟧ »newmail.c«
#ifndef lint static char rcsid[] = "$Header: newmail.c,v 2.9 88/01/13 19:13:05 deboor Exp $"; static char notice[] = "This program is in the public domain and is available for unlimited \ distribution as long as this notice is enclosed."; #endif /* * routines for observing and handling new mail. * * $Source: /c/support/deboor/usr/src/old/vmh/RCS/newmail.c,v $ * $Revision: 2.9 $ * $Author: deboor $ * * FUNCTIONS: * DoNewMailMsg print *** New Mail *** if new mail * checkmail returns 1 if there is new mail * cmdInc incorporate new mail * endwatch shut off mail watcher * mailwatch mail watcher. also runs clock * startwatch initialize and start mail watcher going. */ #include "vmh.h" #include <pwd.h> #include <sys/file.h> #include <sys/resource.h> int newmailflag, idleflag; /* * Mail-Watch and inc commands * */ int mailwatch(); /* What is this? A one pass compiler? */ int _putchar(); /* Supplied by curses */ struct sigvec daemonvec = { mailwatch, 0, 0 }; struct timeval mailinterval = { 0, 0 }; /* set by initprofile but initialize u_secs to 0 */ struct itimerval maildaemon = { {WATCHINTERVAL, 0}, /* the reload value is the same */ {WATCHINTERVAL, 0} /* as the start-off value */ }; int time_clicks; /* the number of mail checks for each clock update */ int cur_clicks; /* the number we've done so far */ char mailbox[PATHLENGTH] = ""; /* * Checkmail * Returns 1 if user has new mail * Returns 0 if mailbox is empty (or can't stat file) * */ checkmail() { struct stat stbuf; if ((stat(mailbox, &stbuf) == 0) /* If stat worked */ && (stbuf.st_size > 0) /* and file non-empty */ ) return (1); /* then user has new mail */ return(0); } /* * Init the daemon to check for new mail * * Some uglies involved with new mail coming while out to lunch * doing an exec. Oh well, such is hacking. */ startwatch() /*** always run daemon so time updates ... ***/ { char *cp; struct passwd *pw; if ( ! *mailbox) { if ((pw = getpwuid (getuid())) == NULL) { punt ("And who do you think YOU are?\n"); } if (cp = getenv ("MAILDROP")) (void) strcpy (mailbox, cp); else (void) sprintf(mailbox, "%s/%s", MAILSPOOL,pw->pw_name); time_clicks = 60 / mailinterval.tv_sec - 1; /* update clock every 60 seconds or so */ cur_clicks = 0; /* -1 above because we start at 0 */ } if (mailWin->_y[0][0] != '-') dotitle (mailWin, ""); /* put dashes up so it don' look so weird */ newmailflag = checkmail(); /* Init new mail flag */ if (newmailflag) /* If already new mail */ { DoNewMailMsg(); /* Put up the msg pls */ } (void) sigvec (SIGALRM, &daemonvec, (struct sigvec *) 0); /* Otherwise start up the daemon */ maildaemon.it_value = maildaemon.it_interval = mailinterval; (void) Setitimer (ITIMER_REAL, &maildaemon, 0); (void) sigsetmask (sigblock(0) & ~sigmask(SIGALRM)); } endwatch() { (void) sigsetmask (sigblock(0) | sigmask (SIGALRM)); } /* * Deamon to wake up every now and then and check my mail! * Must be started by startwatch() */ mailwatch() { int oldx, oldy; /* Terminal's cursor location on entry */ getyx (curscr, oldy, oldx); /* Remember where to put cursor back */ if (cur_clicks++ == time_clicks) { DoTimeMsg(); cur_clicks = 0; } if (idleflag && !no_tty) /* Go back to sleep if no control */ { if (!newmailflag) /* if wasn't any new mail before */ { newmailflag = checkmail(); /* Check again */ if (newmailflag) { /* If is now ... */ (void) putchar('\007'); DoNewMailMsg(); } else if (mailWin->_y[0][0] != '-') { /* * dash it all if none there */ dotitle (mailWin, ""); } else { return; } /* * restore old cursor position! * This is done only if we actually produced * something in the window. */ tputs( tgoto(CM, oldx, oldy), 1, _putchar); curscr->_curx = oldx; curscr->_cury = oldy; (void) fflush(stdout); } } return; } /* Inc */ # include <sys/wait.h> char *pushArgv[2]; /*ARGSUSED*/ cmdInc(count, undo, argc, argv) int count, undo, argc; char **argv; { FLDR *f; /* F ptr for inbox folder */ int pid; /* Process id of kid */ char folder[PATHLENGTH]; /* full folder name */ char tmpstr[PATHLENGTH]; /* could use same string buf */ int oldnext; /* next msg num before the inc cmd */ FILE *msgfd; /* File ptr for each msg during (re)info */ int i; char *msg; endwatch(); /* Stop the watcher daemon */ /* Avoid inc's if no new mail yet . . . */ if (!newmailflag) /* If I haven't seen any new mail then . . .*/ { newmailflag = checkmail(); /* Check it again */ if (!newmailflag) /* If still no mail */ { startwatch(); /* Restart the daemon */ infomsg("No new mail.", 1); return; } } if (getpath("inbox", folder, sizeof(folder)) != 0) { errormsg("Can't get to inbox?", 1); startwatch(); return; } f = getF(folder); /* Get structure for inbox */ oldnext = nextmsgno(&f->f_msgs); if (oldnext == -1) { errormsg("Inbox full!", 1); return; } cmdBottom(f); /* Do "esc >" on inbox display */ if (f != F) { pushArgv[0] = defalt; /* Go to inbox if not already there */ pushArgv[1] = (char *) 0; cmdPush (1, FALSE, 1, pushArgv); } prt_action (" Incorporating new mail "); infomsg ("Wait ... \n", 1); dump_sequences (f); /* for getting of new 'unseen' sequence */ f->f_lock = 1; /* lock it now, just in case */ if ((pid=vfork()) == 0) /* If the kid */ { (void) freopen("/dev/null", "r+", stdin); (void) dup2 (0, 1); (void) dup2 (1, 2); /* * search path for inc program. dangerous beast? * naaaaahhh. */ execlp ("inc", "inc", "-silent", 0); errormsg("Can't execute inc!!",1); _exit(1); /*NOTREACHED*/ } else { /* Parent */ int cpid; union wait CStat; do { /* * wait for child, being sure to continue it if it * decides to not restart after a ^Z */ while ((cpid = wait3 (&CStat, WUNTRACED, (struct rusage *)0)) == 0) ; if ((cpid == pid) && WIFSTOPPED (CStat)) { (void) kill (pid, SIGCONT); cpid = 0; } } while (cpid != -1 && cpid != pid); if (CStat.w_retcode) { infomsg ("problems in inc!", 1); f->f_lock = 0; /* unlock for further use */ return; } } add_new_msgs(f); /* add new lines to end */ init_sequences(f); /* get new 'unseen' messages */ (void) sprintf (tmpstr, "%s/", f->f_name); msg = &tmpstr[strlen(tmpstr)]; for (i = oldnext ; i <= (f->f_msgs.m_hghmsg) ; i++) { (void) sprintf(msg, "%d", i); msgfd = fopen(tmpstr, "r"); if (msgfd == NULL) punt("Problems in inc!"); linkinfo (infosub(msgfd, i), f); (void) fclose(msgfd); } f->f_lock = 0; /* done messing -- unlock */ wclear(cmdWin); wrefresh(cmdWin); startwatch(); /* Fire up mail watch daemon again */ /* * Special case for empty to non-empty transition: * Move to top! */ if( (! f->f_top) && (f->f_tail) ) f->f_top = f->f_cur = f->f_head; else scroll_to (oldnext); /*mv_cursor( f, oldlast, oldtop, oldbot ); */ bvShowScan = 1; /* Update the new screen */ } /* ** DoNewMailMsg() ** print "*** New Mail ***" in the mail window. */ DoNewMailMsg() { wmove(mailWin, 0, 0); wstandout(mailWin); wprintw(mailWin, "*** New Mail ***"); wstandend(mailWin); wrefresh(mailWin); }