Annotation of 43BSD/contrib/mh/uip/rcvstore.c, revision 1.1.1.1

1.1       root        1: /* rcvstore.c - incorporate new mail asynchronously
                      2:                originally from Julian Onions */
                      3: 
                      4: #include "../h/mh.h"
                      5: #include <errno.h>
                      6: #include <signal.h>
                      7: #include <stdio.h>
                      8: #include <sys/types.h>
                      9: #include <sys/stat.h>
                     10: 
                     11: /*  */
                     12: 
                     13: static struct swit switches[] = {
                     14: #define CRETSW 0
                     15:     "create",  0,
                     16: #define NCRETSW        1
                     17:     "nocreate", 0,
                     18: 
                     19: #define PUBSW  2
                     20:     "public",  0,
                     21: #define NPUBSW 3
                     22:     "nopublic",  0,
                     23: 
                     24: #define SEQSW  4
                     25:     "sequence name", 0,
                     26: 
                     27: #define ZEROSW  5
                     28:     "zero",    0,
                     29: #define NZEROSW 6
                     30:     "nozero",  0,
                     31: 
                     32: #define HELPSW  7
                     33:     "help", 4,
                     34: 
                     35:     NULL, NULL
                     36: };
                     37: 
                     38: /*  */
                     39: 
                     40: extern int  errno;
                     41: 
                     42: /*  */
                     43: 
                     44: /* ARGSUSED */
                     45: 
                     46: main (argc, argv)
                     47: int    argc;
                     48: char   *argv[];
                     49: {
                     50:     int     publicsw = -1,
                     51:             zerosw = 0,
                     52:             msgnum,
                     53:             create = 1,
                     54:             fd,
                     55:             seqp = 0;
                     56:     char   *cp,
                     57:            *maildir,
                     58:            *folder = NULL,
                     59:             buf[100],
                     60:           **ap,
                     61:           **argp,
                     62:            *arguments[MAXARGS],
                     63:            *seqs[NATTRS];
                     64:     struct msgs *mp;
                     65:     struct stat st;
                     66: 
                     67:     invo_name = r1bindex (argv[0], '/');
                     68:     mts_init (invo_name);
                     69:     if ((cp = m_find (invo_name)) != NULL) {
                     70:        ap = brkstring (cp = getcpy (cp), " ", "\n");
                     71:        ap = copyip (ap, arguments);
                     72:     }
                     73:     else
                     74:        ap = arguments;
                     75:     (void) copyip (argv + 1, ap);
                     76:     argp = arguments;
                     77: 
                     78: /*  */
                     79: 
                     80:     while (cp = *argp++) {
                     81:        if (*cp == '-')
                     82:            switch (smatch (++cp, switches)) {
                     83:                case AMBIGSW: 
                     84:                    ambigsw (cp, switches);
                     85:                    done (1);
                     86:                case UNKWNSW: 
                     87:                    adios (NULLCP, "-%s unknown", cp);
                     88:                case HELPSW: 
                     89:                    (void) sprintf (buf, "%s [+folder] [switches]", invo_name);
                     90:                    help (buf, switches);
                     91:                    done (1);
                     92: 
                     93:                case SEQSW: 
                     94:                    if (!(cp = *argp++) || *cp == '-')
                     95:                        adios (NULLCP, "missing argument name to %s",
                     96:                                argp[-2]);
                     97:                    if (seqp < NATTRS)
                     98:                        seqs[seqp++] = cp;
                     99:                    else
                    100:                        adios (NULLCP, "only %d sequences allowed!", NATTRS);
                    101:                    continue;
                    102:                case PUBSW: 
                    103:                    publicsw = 1;
                    104:                    continue;
                    105:                case NPUBSW: 
                    106:                    publicsw = 0;
                    107:                    continue;
                    108:                case ZEROSW: 
                    109:                    zerosw++;
                    110:                    continue;
                    111:                case NZEROSW: 
                    112:                    zerosw = 0;
                    113:                    continue;
                    114: 
                    115:                case CRETSW: 
                    116:                    create++;
                    117:                    continue;
                    118:                case NCRETSW: 
                    119:                    create = 0;
                    120:                    continue;
                    121:            }
                    122:        if (*cp == '+' || *cp == '@') {
                    123:            if (folder)
                    124:                adios (NULLCP, "only one folder at a time!");
                    125:            else
                    126:                folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
                    127:        }
                    128:        else
                    129:            adios (NULLCP, "usage: %s [+folder] [switches]", invo_name);
                    130:     }
                    131: 
                    132: /*  */
                    133: 
                    134:     if (!m_find ("path"))
                    135:        free (path ("./", TFOLDER));
                    136:     if (!folder)
                    137:        folder = defalt;
                    138:     maildir = m_maildir (folder);
                    139: 
                    140:     if (stat (maildir, &st) == NOTOK) {
                    141:        if (errno != ENOENT)
                    142:            adios (maildir, "error on folder");
                    143:        if (!create)
                    144:            adios (NULLCP, "folder %s doesn't exist", maildir);
                    145:        if (!makedir (maildir))
                    146:            adios (NULLCP, "unable to create folder %s", maildir);
                    147:     }
                    148: 
                    149:     if (chdir (maildir) == NOTOK)
                    150:        adios (maildir, "unable to change directory to");
                    151:     if (!(mp = m_gmsg (folder)))
                    152:        adios (NULLCP, "unable to read folder %s", folder);
                    153: 
                    154:     (void) signal (SIGHUP, SIG_IGN);
                    155:     (void) signal (SIGINT, SIG_IGN);
                    156:     (void) signal (SIGQUIT, SIG_IGN);
                    157:     (void) signal (SIGTERM, SIG_IGN);
                    158: 
                    159: /*  */
                    160: 
                    161:     if ((fd = creat (cp = m_scratch ("", invo_name), m_gmprot ())) == NOTOK)
                    162:        adios (cp, "unable to create");
                    163: 
                    164:     cpydata (fileno (stdin), fd, "standard input", cp);
                    165: 
                    166:     if (fstat (fd, &st) == NOTOK) {
                    167:        (void) unlink (cp);
                    168:        adios (cp, "unable to fstat");
                    169:     }
                    170:     (void) close (fd);
                    171:     if (st.st_size == 0) {
                    172:        (void) unlink (cp);
                    173:        advise (NULLCP, "empty file");
                    174:        done (0);
                    175:     }
                    176: 
                    177:     msgnum = mp -> hghmsg;
                    178:     do {
                    179:        msgnum++, mp -> hghmsg++;
                    180:        if (msgnum > mp -> hghoff)
                    181:            if ((mp = m_remsg (mp, 0, mp -> hghoff + MAXFOLDER)) == NULL)
                    182:                adios (NULLCP, "unable to allocate folder storage");
                    183: 
                    184:        mp -> msgstats[msgnum] |= EXISTS | UNSEEN;
                    185:        errno = 0;
                    186:     } while (link (cp, m_name (msgnum)) == NOTOK && errno == EEXIST);
                    187: 
                    188:     (void) unlink (cp);
                    189:     if (errno != 0)
                    190:        adios (NULLCP, "can't file message %d", msgnum);
                    191: 
                    192:     if (mp -> lowmsg == 0)
                    193:        mp -> lowmsg = msgnum;
                    194:     mp -> msgflags |= SEQMOD;
                    195: 
                    196:     seqs[seqp] = NULL;
                    197:     for (seqp = 0; seqs[seqp]; seqp++) {
                    198:        if (zerosw && !m_seqnew (mp, seqs[seqp], publicsw))
                    199:            done (1);
                    200:        if (!m_seqadd (mp, seqs[seqp], msgnum, publicsw))
                    201:            done (1);
                    202:     }
                    203: 
                    204:     m_setvis (mp, 0);
                    205:     m_sync (mp);
                    206:     m_update ();
                    207: 
                    208:     done (0);
                    209: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.