|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.