home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / k / ksh48.zip / sh / mail.c < prev    next >
C/C++ Source or Header  |  1992-09-01  |  4KB  |  204 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.2 1992/04/25 08:33:28 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.     if (!(vp->flag & ISSET) || strint(&mailcheck, vp) == NULL)
  59.         return;
  60.  
  61.     if (mlastchkd == 0)
  62.         mlastchkd = time((long *)0);
  63.  
  64.     if ((now=time((long *)0)) - mlastchkd >= mailcheck.val.i) {
  65.         mlastchkd = now;
  66.  
  67.         vp = global("MAILPATH");
  68.         if (vp && (vp->flag & ISSET))
  69.             mbp = mplist;
  70.         else if ((vp = global("MAIL")) && (vp->flag & ISSET))
  71.             mbp = &mbox;
  72.         else
  73.             mbp = NULL;
  74.  
  75.         while (mbp) {
  76.             if (stat(mbp->mb_path, &stbuf) == 0 &&
  77.                 (stbuf.st_mode & S_IFMT) == S_IFREG) {
  78.                 if (mbp->mb_size < stbuf.st_size)
  79.                     maddmsg( mbp );
  80.                 mbp->mb_size = stbuf.st_size;
  81.             } else {
  82.                 /*
  83.                  * Some mail readers remove the mail
  84.                  * file if all mail is read.  If file
  85.                  * does not exist, assume this is the
  86.                  * case and set size to zero.
  87.                  */
  88.                 mbp->mb_size = 0;
  89.             }
  90.             mbp = mbp->mb_next;
  91.         }
  92.     }
  93. }
  94.  
  95. void
  96. mbset(p)
  97.     register char    *p;
  98. {
  99.     struct stat    stbuf;
  100.  
  101.     if (mbox.mb_msg)
  102.         afree((void *)mbox.mb_msg, APERM);
  103.     mbox.mb_path = p;
  104.     mbox.mb_msg = NULL;
  105.     if (stat(p,&stbuf) == 0 && (stbuf.st_mode & S_IFMT) == S_IFREG)
  106.         mbox.mb_size = stbuf.st_size;
  107.     else
  108.         mbox.mb_size = 0;
  109. }
  110.  
  111. void
  112. mpset(mptoparse)
  113.     register char    *mptoparse;
  114. {
  115.     register mbox_t    *mbp;
  116.     register char    *mpath, *mmsg, *mval;
  117.  
  118.     munset( mplist );
  119.     mplist = NULL;
  120.     mval = strsave(mptoparse, APERM);
  121.     while (mval) {
  122.         mpath = mval;
  123.         if ((mval = strchr(mval, PATHSEP)) != NULL) {
  124.             *mval ='\0', mval++;
  125.         }
  126.         if ((mmsg = strchr(mpath, '?')) != NULL) {
  127.             *mmsg = '\0', mmsg++;
  128.         }
  129.         mbp = mballoc(mpath, mmsg);
  130.         mbp->mb_next = mplist;
  131.         mplist = mbp;
  132.     }
  133. }
  134.  
  135. static void
  136. munset(mlist)
  137. register mbox_t    *mlist;
  138. {
  139.     register mbox_t    *mbp;
  140.  
  141.     while (mlist != NULL) {
  142.         mbp = mlist;
  143.         mlist = mbp->mb_next;
  144.         if (!mlist)
  145.             afree((void *)mbp->mb_path, APERM);
  146.         afree((void *)mbp, APERM);
  147.     }
  148. }
  149.  
  150. static mbox_t *
  151. mballoc(p, m)
  152.     char    *p;
  153.     char    *m;
  154. {
  155.     struct stat    stbuf;
  156.     register mbox_t    *mbp;
  157.  
  158.     mbp = (mbox_t *)alloc(sizeof(mbox_t), APERM);
  159.     mbp->mb_next = NULL;
  160.     mbp->mb_path = p;
  161.     mbp->mb_msg = m;
  162.     if (stat(mbp->mb_path, &stbuf) == 0 &&
  163.        (stbuf.st_mode & S_IFMT) == S_IFREG) {
  164.         mbp->mb_size = stbuf.st_size;
  165.     } else {
  166.         mbp->mb_size = 0;
  167.     }
  168.     return(mbp);
  169. }
  170.  
  171. void
  172. mprint()
  173. {
  174.     struct mailmsg *mm;
  175.  
  176.     while ((mm = mmsgs) != NULL) {
  177.         shellf( "%s\n", mm->msg );
  178.         fflush(shlout);
  179.         afree((void *)mm->msg, APERM);
  180.         mmsgs = mm->next;
  181.         afree((void *)mm, APERM);
  182.     }
  183. }
  184.  
  185. static void
  186. maddmsg( mbp )
  187. mbox_t    *mbp;
  188. {
  189.     struct mailmsg    *message;
  190.     struct tbl    *vp;
  191.  
  192.     message = (struct mailmsg *)alloc(sizeof(struct mailmsg), APERM);
  193.     setstr((vp = typeset("_", LOCAL, 0)), mbp->mb_path);
  194.  
  195.     if (mbp->mb_msg)
  196.         message->msg = strsave(substitute(mbp->mb_msg,0),APERM);
  197.     else
  198.         message->msg = strsave(substitute(MBMESSAGE,0),APERM);
  199.  
  200.     unset(vp);
  201.     message->next = mmsgs;
  202.     mmsgs = message;
  203. }
  204.