Annotation of 43BSDReno/contrib/mh/uip/rcvstore.c, revision 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.