home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / pdksh-4.9-src.tgz / tar.out / contrib / pdksh / sh / mail.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  4KB  |  207 lines

  1. /*
  2.  * Mailbox checking code by Robert J. Gibson, adapted for PD ksh by
  3.  * John R. MacMillan
  4.  */
  5. #ifndef lint
  6. static char *RCSid = "$Id: mail.c,v 1.4 93/05/22 22:47:17 sjg Exp $";
  7. #endif
  8.  
  9. #include "stdh.h"
  10. #include <signal.h>
  11. #include <errno.h>
  12. #include <setjmp.h>
  13. #include <sys/stat.h>
  14. #include "sh.h"
  15.  
  16. #define MBMESSAGE    "you have mail in $_"
  17.  
  18. typedef struct mbox {
  19.     struct mbox    *mb_next;    /* next mbox in list */
  20.     char           *mb_path;    /* path to mail file */
  21.     char           *mb_msg;        /* to announce arrival of new mail */
  22.     unsigned int    mb_size;    /* size of mail file (bytes) */
  23. } mbox_t;
  24.  
  25. struct mailmsg {
  26.     char        *msg;        /* Text of message */
  27.     struct mailmsg    *next;        /* Next message */
  28. };
  29.  
  30. /*
  31.  * $MAILPATH is a linked list of mboxes.  $MAIL is a treated as a
  32.  * special case of $MAILPATH, where the list has only one node.  The
  33.  * same list is used for both since they are exclusive.
  34.  */
  35.  
  36. static mbox_t  *mplist = NULL;
  37. static mbox_t  mbox = { NULL, NULL, NULL, 0 };
  38. static long    mlastchkd = 0;    /* when mail was last checked */
  39. static struct mailmsg *mmsgs = NULL;    /* Messages to be printed */
  40. #if 0
  41. static void    munset();        /* free mlist and mval */
  42. static mbox_t  *mballoc();        /* allocate a new mbox */
  43. static void    maddmsg();
  44. #endif
  45. static void     munset      ARGS((mbox_t *mlist));
  46. static mbox_t * mballoc     ARGS((char *p, char *m));
  47. static void     maddmsg     ARGS((mbox_t *mbp));
  48.  
  49. void
  50. mcheck()
  51. {
  52.     register mbox_t    *mbp;
  53.     long         now;
  54.     struct tbl    *vp, mailcheck;
  55.     struct stat     stbuf;
  56.  
  57.     vp = global("MAILCHECK");
  58.  
  59.     mailcheck.type = 0;
  60.  
  61.     if (!(vp->flag & ISSET) || strint(&mailcheck, vp) == NULL)
  62.         return;
  63.  
  64.     if (mlastchkd == 0)
  65.         mlastchkd = time((long *)0);
  66.  
  67.     if ((now=time((long *)0)) - mlastchkd >= mailcheck.val.i) {
  68.         mlastchkd = now;
  69.         
  70.         vp = global("MAILPATH");
  71.         if (vp && (vp->flag & ISSET))
  72.             mbp = mplist;
  73.         else if ((vp = global("MAIL")) && (vp->flag & ISSET))
  74.             mbp = &mbox;
  75.         else
  76.             mbp = NULL;
  77.  
  78.         while (mbp) {
  79.             if (stat(mbp->mb_path, &stbuf) == 0 &&
  80.                 (stbuf.st_mode & S_IFMT) == S_IFREG) {
  81.                 if (mbp->mb_size < stbuf.st_size)
  82.                     maddmsg( mbp );
  83.                 mbp->mb_size = stbuf.st_size;
  84.             } else {
  85.                 /*
  86.                  * Some mail readers remove the mail
  87.                  * file if all mail is read.  If file
  88.                  * does not exist, assume this is the
  89.                  * case and set size to zero.
  90.                  */
  91.                 mbp->mb_size = 0;
  92.             }
  93.             mbp = mbp->mb_next;
  94.         }
  95.     }
  96. }
  97.  
  98. void
  99. mbset(p)
  100.     register char    *p;
  101. {
  102.     struct stat    stbuf;
  103.  
  104.     if (mbox.mb_msg)
  105.         afree((void *)mbox.mb_msg, APERM);
  106.     mbox.mb_path = p;
  107.     mbox.mb_msg = NULL;
  108.     if (stat(p,&stbuf) == 0 && (stbuf.st_mode & S_IFMT) == S_IFREG)
  109.         mbox.mb_size = stbuf.st_size;
  110.     else
  111.         mbox.mb_size = 0;
  112. }
  113.  
  114. void
  115. mpset(mptoparse)
  116.     register char    *mptoparse;
  117. {
  118.     register mbox_t    *mbp;
  119.     register char    *mpath, *mmsg, *mval;
  120.  
  121.     munset( mplist );
  122.     mplist = NULL;
  123.     mval = strsave(mptoparse, APERM);
  124.     while (mval) {
  125.         mpath = mval;
  126.         if ((mval = strchr(mval, ':')) != NULL) {
  127.             *mval ='\0', mval++;
  128.         }
  129.         if ((mmsg = strchr(mpath, '?')) != NULL) {
  130.             *mmsg = '\0', mmsg++;
  131.         }
  132.         mbp = mballoc(mpath, mmsg);
  133.         mbp->mb_next = mplist;
  134.         mplist = mbp;
  135.     }
  136. }
  137.  
  138. static void
  139. munset(mlist)
  140. register mbox_t    *mlist;
  141. {
  142.     register mbox_t    *mbp;
  143.  
  144.     while (mlist != NULL) {
  145.         mbp = mlist;
  146.         mlist = mbp->mb_next;
  147.         if (!mlist)
  148.             afree((void *)mbp->mb_path, APERM);
  149.         afree((void *)mbp, APERM);
  150.     }
  151. }
  152.  
  153. static mbox_t *
  154. mballoc(p, m)
  155.     char    *p;
  156.     char    *m;
  157. {
  158.     struct stat    stbuf;
  159.     register mbox_t    *mbp;
  160.  
  161.     mbp = (mbox_t *)alloc(sizeof(mbox_t), APERM);
  162.     mbp->mb_next = NULL;
  163.     mbp->mb_path = p;
  164.     mbp->mb_msg = m;
  165.     if (stat(mbp->mb_path, &stbuf) == 0 &&
  166.        (stbuf.st_mode & S_IFMT) == S_IFREG) {
  167.         mbp->mb_size = stbuf.st_size;
  168.     } else {
  169.         mbp->mb_size = 0;
  170.     }
  171.     return(mbp);
  172. }
  173.  
  174. void
  175. mprint()
  176. {
  177.     struct mailmsg *mm;
  178.  
  179.     while ((mm = mmsgs) != NULL) {
  180.         shellf( "%s\n", mm->msg );
  181.         fflush(shlout);
  182.         afree((void *)mm->msg, APERM);
  183.         mmsgs = mm->next;
  184.         afree((void *)mm, APERM);
  185.     }
  186. }
  187.  
  188. static void
  189. maddmsg( mbp )
  190. mbox_t    *mbp;
  191. {
  192.     struct mailmsg    *message;
  193.     struct tbl    *vp;
  194.  
  195.     message = (struct mailmsg *)alloc(sizeof(struct mailmsg), APERM);
  196.     setstr((vp = typeset("_", LOCAL, 0)), mbp->mb_path);
  197.  
  198.     if (mbp->mb_msg)
  199.         message->msg = strsave(substitute(mbp->mb_msg,0),APERM);
  200.     else
  201.         message->msg = strsave(substitute(MBMESSAGE,0),APERM);
  202.  
  203.     unset(vp);
  204.     message->next = mmsgs;
  205.     mmsgs = message;
  206. }
  207.