maildirwatch.c
changeset 0 068428edee47
equal deleted inserted replaced
-1:000000000000 0:068428edee47
       
     1 #include "getln.h"
       
     2 #include "substdio.h"
       
     3 #include "subfd.h"
       
     4 #include "prioq.h"
       
     5 #include "stralloc.h"
       
     6 #include "str.h"
       
     7 #include "exit.h"
       
     8 #include "hfield.h"
       
     9 #include "readwrite.h"
       
    10 #include "open.h"
       
    11 #include "headerbody.h"
       
    12 #include "maildir.h"
       
    13 
       
    14 #define FATAL "maildirwatch: fatal: "
       
    15 
       
    16 void die_nomem() { strerr_die2x(111,FATAL,"out of memory"); }
       
    17 
       
    18 stralloc recipient = {0};
       
    19 stralloc sender = {0};
       
    20 stralloc fromline = {0};
       
    21 stralloc text = {0};
       
    22 
       
    23 void addtext(s,n) char *s; int n;
       
    24 {
       
    25  if (!stralloc_catb(&text,s,n)) die_nomem();
       
    26  if (text.len > 158) text.len = 158;
       
    27 }
       
    28 void dobody(h) stralloc *h; { addtext(h->s,h->len); }
       
    29 void doheader(h) stralloc *h;
       
    30 {
       
    31  int i;
       
    32  switch(hfield_known(h->s,h->len))
       
    33   {
       
    34    case H_SUBJECT:
       
    35      i = hfield_skipname(h->s,h->len);
       
    36      addtext(h->s + i,h->len - i);
       
    37      break;
       
    38    case H_DELIVEREDTO:
       
    39      i = hfield_skipname(h->s,h->len);
       
    40      if (i < h->len)
       
    41        if (!stralloc_copyb(&recipient,h->s + i,h->len - i - 1)) die_nomem();
       
    42      break;
       
    43    case H_RETURNPATH:
       
    44      i = hfield_skipname(h->s,h->len);
       
    45      if (i < h->len)
       
    46        if (!stralloc_copyb(&sender,h->s + i,h->len - i - 1)) die_nomem();
       
    47      break;
       
    48    case H_FROM:
       
    49      if (!stralloc_copyb(&fromline,h->s,h->len - 1)) die_nomem();
       
    50      break;
       
    51   }
       
    52 }
       
    53 void finishheader() { ; }
       
    54 
       
    55 stralloc filenames = {0};
       
    56 prioq pq = {0};
       
    57 
       
    58 char inbuf[SUBSTDIO_INSIZE];
       
    59 substdio ssin;
       
    60 
       
    61 void main()
       
    62 {
       
    63  struct prioq_elt pe;
       
    64  int fd;
       
    65  int i;
       
    66 
       
    67  if (maildir_chdir() == -1)
       
    68    strerr_die1(111,FATAL,&maildir_chdir_err);
       
    69 
       
    70  for (;;)
       
    71   {
       
    72    maildir_clean(&filenames);
       
    73    if (maildir_scan(&pq,&filenames,1,0) == -1)
       
    74      strerr_die1(111,FATAL,&maildir_scan_err);
       
    75 
       
    76    substdio_putsflush(subfdout,"\033[;H\033[;J");
       
    77 
       
    78    while (prioq_min(&pq,&pe))
       
    79     {
       
    80      prioq_delmin(&pq);
       
    81 
       
    82      fd = open_read(filenames.s + pe.id);
       
    83      if (fd == -1) continue;
       
    84      substdio_fdbuf(&ssin,read,fd,inbuf,sizeof(inbuf));
       
    85 
       
    86      if (!stralloc_copys(&sender,"?")) die_nomem();
       
    87      if (!stralloc_copys(&recipient,"?")) die_nomem();
       
    88      if (!stralloc_copys(&fromline,"")) die_nomem();
       
    89      if (!stralloc_copys(&text,"")) die_nomem();
       
    90      if (headerbody(&ssin,doheader,finishheader,dobody) == -1)
       
    91        strerr_die2x(111,FATAL,"trouble reading new message");
       
    92 
       
    93      for (i = 0;i < fromline.len;++i)
       
    94        if ((fromline.s[i] < 32) || (fromline.s[i] > 126))
       
    95          fromline.s[i] = '/';
       
    96      for (i = 0;i < sender.len;++i)
       
    97        if ((sender.s[i] < 32) || (sender.s[i] > 126))
       
    98          sender.s[i] = '?';
       
    99      for (i = 0;i < recipient.len;++i)
       
   100        if ((recipient.s[i] < 32) || (recipient.s[i] > 126))
       
   101          recipient.s[i] = '?';
       
   102      for (i = 0;i < text.len;++i)
       
   103        if ((text.s[i] < 32) || (text.s[i] > 126))
       
   104          text.s[i] = '/';
       
   105      substdio_puts(subfdout,"FROM ");
       
   106      substdio_put(subfdout,sender.s,sender.len);
       
   107      substdio_puts(subfdout," TO <");
       
   108      substdio_put(subfdout,recipient.s,recipient.len);
       
   109      substdio_puts(subfdout,">\n");
       
   110      if (fromline.len)
       
   111       {
       
   112        substdio_puts(subfdout,"\033[1m");
       
   113        substdio_put(subfdout,fromline.s,fromline.len);
       
   114        substdio_puts(subfdout,"\033[0m\n");
       
   115       }
       
   116      substdio_put(subfdout,text.s,text.len);
       
   117      substdio_puts(subfdout,"\n\n");
       
   118 
       
   119      close(fd);
       
   120     }
       
   121 
       
   122    substdio_flush(subfdout);
       
   123    sleep(30);
       
   124   }
       
   125 }