|
|
1.1 ! root 1: /* send.c - send a composed message */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <stdio.h> ! 5: #include <sys/types.h> ! 6: #include <sys/stat.h> ! 7: ! 8: /* */ ! 9: ! 10: static struct swit switches[] = { ! 11: #define ALIASW 0 ! 12: "alias aliasfile", 0, ! 13: ! 14: #define DEBUGSW 1 ! 15: "debug", -5, ! 16: ! 17: #define DRAFTSW 2 ! 18: "draft", 0, ! 19: ! 20: #define DFOLDSW 3 ! 21: "draftfolder +folder", 6, ! 22: #define DMSGSW 4 ! 23: "draftmessage msg", 6, ! 24: #define NDFLDSW 5 ! 25: "nodraftfolder", 0, ! 26: ! 27: #define ENCRSW 6 ! 28: "encrypt", ! 29: #ifndef TMA ! 30: -7, ! 31: #else TMA ! 32: 0, ! 33: #endif TMA ! 34: #define NENCRSW 7 ! 35: "noencrypt", ! 36: #ifndef TMA ! 37: -9, ! 38: #else TMA ! 39: 0, ! 40: #endif TMA ! 41: ! 42: #define FILTSW 8 ! 43: "filter filterfile", 0, ! 44: #define NFILTSW 9 ! 45: "nofilter", 0, ! 46: ! 47: #define FRMTSW 10 ! 48: "format", 0, ! 49: #define NFRMTSW 11 ! 50: "noformat", 0, ! 51: ! 52: #define FORWSW 12 ! 53: "forward", 0, ! 54: #define NFORWSW 13 ! 55: "noforward", 0, ! 56: ! 57: #define MSGDSW 14 ! 58: "msgid", 0, ! 59: #define NMSGDSW 15 ! 60: "nomsgid", 0, ! 61: ! 62: #define PUSHSW 16 ! 63: "push", 0, ! 64: #define NPUSHSW 17 ! 65: "nopush", 0, ! 66: ! 67: #define UNIQSW 18 ! 68: "unique", -6, ! 69: #define NUNIQSW 19 ! 70: "nounique", -8, ! 71: ! 72: #define VERBSW 20 ! 73: "verbose", 0, ! 74: #define NVERBSW 21 ! 75: "noverbose", 0, ! 76: ! 77: #define WATCSW 22 ! 78: "watch", 0, ! 79: #define NWATCSW 23 ! 80: "nowatch", 0, ! 81: ! 82: #define WIDTHSW 24 ! 83: "width columns", 0, ! 84: ! 85: #define HELPSW 25 ! 86: "help", 4, ! 87: ! 88: #define MAILSW 26 ! 89: "mail", -4, ! 90: #define SAMLSW 27 ! 91: "saml", -4, ! 92: #define SENDSW 28 ! 93: "send", -4, ! 94: #define SOMLSW 29 ! 95: "soml", -4, ! 96: ! 97: #define CLIESW 30 ! 98: "client host", -6, ! 99: #define SERVSW 31 ! 100: "server host", -6, ! 101: #define SNOOPSW 32 ! 102: "snoop", -5, ! 103: ! 104: NULL, NULL ! 105: }; ! 106: ! 107: static struct swit anyl[] = { ! 108: #define NOSW 0 ! 109: "no", 0, ! 110: #define YESW 1 ! 111: "yes", 0, ! 112: #define LISTDSW 2 ! 113: "list", 0, ! 114: ! 115: NULL, NULL ! 116: }; ! 117: ! 118: /* */ ! 119: ! 120: extern int debugsw; /* from sendsbr.c */ ! 121: extern int forwsw; ! 122: extern int inplace; ! 123: extern int pushsw; ! 124: extern int unique; ! 125: ! 126: extern char *altmsg; /* .. */ ! 127: extern char *annotext; ! 128: extern char *distfile; ! 129: ! 130: /* */ ! 131: ! 132: /* ARGSUSED */ ! 133: ! 134: main (argc, argv) ! 135: int argc; ! 136: char *argv[]; ! 137: { ! 138: int msgp = 0, ! 139: distsw = 0, ! 140: vecp = 1, ! 141: isdf = 0, ! 142: msgnum, ! 143: status; ! 144: char *cp, ! 145: *dfolder = NULL, ! 146: *maildir, ! 147: buf[100], ! 148: **ap, ! 149: **argp, ! 150: *arguments[MAXARGS], ! 151: *msgs[MAXARGS], ! 152: *vec[MAXARGS]; ! 153: struct msgs *mp; ! 154: struct stat st; ! 155: #ifdef UCI ! 156: FILE *fp; ! 157: #endif UCI ! 158: ! 159: invo_name = r1bindex (argv[0], '/'); ! 160: if ((cp = m_find (invo_name)) != NULL) { ! 161: ap = brkstring (cp = getcpy (cp), " ", "\n"); ! 162: ap = copyip (ap, arguments); ! 163: } ! 164: else ! 165: ap = arguments; ! 166: (void) copyip (argv + 1, ap); ! 167: argp = arguments; ! 168: ! 169: vec[vecp++] = "-library"; ! 170: vec[vecp++] = getcpy (m_maildir ("")); ! 171: ! 172: /* */ ! 173: ! 174: while (cp = *argp++) { ! 175: if (*cp == '-') ! 176: switch (smatch (++cp, switches)) { ! 177: case AMBIGSW: ! 178: ambigsw (cp, switches); ! 179: senddone (1); ! 180: case UNKWNSW: ! 181: adios (NULLCP, "-%s unknown\n", cp); ! 182: case HELPSW: ! 183: (void) sprintf (buf, "%s [file] [switches]", invo_name); ! 184: help (buf, switches); ! 185: senddone (1); /* thanks, phyl */ ! 186: ! 187: case DRAFTSW: ! 188: msgs[msgp++] = draft; ! 189: continue; ! 190: ! 191: case DFOLDSW: ! 192: if (dfolder) ! 193: adios (NULLCP, "only one draft folder at a time!"); ! 194: if (!(cp = *argp++) || *cp == '-') ! 195: adios (NULLCP, "missing argument to %s", argp[-2]); ! 196: dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp, ! 197: *cp != '@' ? TFOLDER : TSUBCWF); ! 198: continue; ! 199: case DMSGSW: ! 200: if (!(cp = *argp++) || *cp == '-') ! 201: adios (NULLCP, "missing argument to %s", argp[-2]); ! 202: msgs[msgp++] = cp; ! 203: continue; ! 204: case NDFLDSW: ! 205: dfolder = NULL; ! 206: isdf = NOTOK; ! 207: continue; ! 208: ! 209: case PUSHSW: ! 210: pushsw++; ! 211: continue; ! 212: case NPUSHSW: ! 213: pushsw = 0; ! 214: continue; ! 215: ! 216: case UNIQSW: ! 217: unique++; ! 218: continue; ! 219: case NUNIQSW: ! 220: unique = 0; ! 221: continue; ! 222: ! 223: case FORWSW: ! 224: forwsw++; ! 225: continue; ! 226: case NFORWSW: ! 227: forwsw = 0; ! 228: continue; ! 229: ! 230: case DEBUGSW: ! 231: debugsw++; /* fall */ ! 232: case NFILTSW: ! 233: case FRMTSW: ! 234: case NFRMTSW: ! 235: case MSGDSW: ! 236: case NMSGDSW: ! 237: case VERBSW: ! 238: case NVERBSW: ! 239: case WATCSW: ! 240: case NWATCSW: ! 241: case MAILSW: ! 242: case SAMLSW: ! 243: case SENDSW: ! 244: case SOMLSW: ! 245: case ENCRSW: ! 246: case NENCRSW: ! 247: case SNOOPSW: ! 248: vec[vecp++] = --cp; ! 249: continue; ! 250: ! 251: case ALIASW: ! 252: case FILTSW: ! 253: case WIDTHSW: ! 254: case CLIESW: ! 255: case SERVSW: ! 256: vec[vecp++] = --cp; ! 257: if (!(cp = *argp++) || *cp == '-') ! 258: adios (NULLCP, "missing argument to %s", argp[-2]); ! 259: vec[vecp++] = cp; ! 260: continue; ! 261: } ! 262: else ! 263: msgs[msgp++] = cp; ! 264: } ! 265: ! 266: /* */ ! 267: ! 268: if (dfolder == NULL) { ! 269: if (msgp == 0) { ! 270: #ifdef WHATNOW ! 271: if ((cp = getenv ("mhdraft")) && *cp) { ! 272: msgs[msgp++] = cp; ! 273: goto go_to_it; ! 274: } ! 275: #endif WHATNOW ! 276: msgs[msgp++] = getcpy (m_draft (NULLCP, NULLCP, 1, &isdf)); ! 277: if (stat (msgs[0], &st) == NOTOK) ! 278: adios (msgs[0], "unable to stat draft file"); ! 279: cp = concat ("Use \"", msgs[0], "\"? ", NULLCP); ! 280: for (status = LISTDSW; status != YESW;) { ! 281: if (!(argp = getans (cp, anyl))) ! 282: senddone (1); ! 283: switch (status = smatch (*argp, anyl)) { ! 284: case NOSW: ! 285: senddone (0); ! 286: case YESW: ! 287: break; ! 288: case LISTDSW: ! 289: (void) showfile (++argp, msgs[0]); ! 290: break; ! 291: default: ! 292: advise (NULLCP, "say what?"); ! 293: break; ! 294: } ! 295: } ! 296: } ! 297: else ! 298: for (msgnum = 0; msgnum < msgp; msgnum++) ! 299: msgs[msgnum] = getcpy (m_maildir (msgs[msgnum])); ! 300: } ! 301: else { ! 302: if (!m_find ("path")) ! 303: free (path ("./", TFOLDER)); ! 304: ! 305: if (!msgp) ! 306: msgs[msgp++] = "cur"; ! 307: maildir = m_maildir (dfolder); ! 308: ! 309: if (chdir (maildir) == NOTOK) ! 310: adios (maildir, "unable to change directory to"); ! 311: if (!(mp = m_gmsg (dfolder))) ! 312: adios (NULLCP, "unable to read folder %s", dfolder); ! 313: if (mp -> hghmsg == 0) ! 314: adios (NULLCP, "no messages in %s", dfolder); ! 315: ! 316: for (msgnum = 0; msgnum < msgp; msgnum++) ! 317: if (!m_convert (mp, msgs[msgnum])) ! 318: senddone (1); ! 319: m_setseq (mp); ! 320: ! 321: for (msgp = 0, msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++) ! 322: if (mp -> msgstats[msgnum] & SELECTED) { ! 323: msgs[msgp++] = getcpy (m_name (msgnum)); ! 324: #ifdef notdef ! 325: mp -> msgstats[msgnum] |= DELETED; ! 326: #endif notdef ! 327: mp -> msgstats[msgnum] &= ~EXISTS; ! 328: } ! 329: mp -> msgflags |= SEQMOD; ! 330: ! 331: m_sync (mp); ! 332: } ! 333: #ifdef WHATNOW ! 334: go_to_it: ; ! 335: #endif WHATNOW ! 336: ! 337: /* */ ! 338: ! 339: #ifdef TMA ! 340: if ((cp = getenv ("KDS")) == NULL || *cp == NULL) ! 341: if ((cp = m_find ("kdsproc")) && *cp) ! 342: (void) putenv ("KDS", cp); ! 343: if ((cp = getenv ("TMADB")) == NULL || *cp == NULL) ! 344: if ((cp = m_find ("tmadb")) && *cp) ! 345: (void) putenv ("TMADB", m_maildir (cp)); ! 346: #endif TMA ! 347: ! 348: if ((cp = getenv ("SIGNATURE")) == NULL || *cp == NULL) ! 349: if ((cp = m_find ("signature")) && *cp) ! 350: (void) putenv ("SIGNATURE", cp); ! 351: #ifdef UCI ! 352: else { ! 353: (void) sprintf (buf, "%s/.signature", mypath); ! 354: if ((fp = fopen (buf, "r")) != NULL ! 355: && fgets (buf, sizeof buf, fp) != NULL) { ! 356: (void) fclose (fp); ! 357: if (cp = index (buf, '\n')) ! 358: *cp = NULL; ! 359: (void) putenv ("SIGNATURE", buf); ! 360: } ! 361: } ! 362: #endif UCI ! 363: ! 364: for (msgnum = 0; msgnum < msgp; msgnum++) ! 365: if (stat (msgs[msgnum], &st) == NOTOK) ! 366: adios (msgs[msgnum], "unable to stat draft file"); ! 367: ! 368: if ((annotext = getenv ("mhannotate")) == NULL || *annotext == NULL) ! 369: annotext = NULL; ! 370: if (annotext ! 371: && ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == NULL)) ! 372: altmsg = NULL; ! 373: if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != NULL)) ! 374: inplace = atoi (cp); ! 375: ! 376: if ((cp = getenv ("mhdist")) ! 377: && *cp ! 378: && (distsw = atoi (cp)) ! 379: && altmsg) { ! 380: vec[vecp++] = "-dist"; ! 381: distfile = getcpy (m_scratch (altmsg, invo_name)); ! 382: if (link (altmsg, distfile) == NOTOK) ! 383: adios (distfile, "unable to link %s to", altmsg); ! 384: } ! 385: else ! 386: distfile = NULL; ! 387: ! 388: if (altmsg == NULL || stat (altmsg, &st) == NOTOK) ! 389: st.st_mtime = 0, st.st_dev = 0, st.st_ino = 0; ! 390: if (pushsw) ! 391: push (); ! 392: ! 393: status = 0; ! 394: vec[0] = r1bindex (postproc, '/'); ! 395: closefds (3); ! 396: ! 397: for (msgnum = 0; msgnum < msgp; msgnum++) ! 398: switch (sendsbr (vec, vecp, msgs[msgnum], &st)) { ! 399: case DONE: ! 400: senddone (++status); ! 401: ! 402: case NOTOK: ! 403: status++; /* fall */ ! 404: case OK: ! 405: break; ! 406: } ! 407: ! 408: m_update (); ! 409: ! 410: senddone (status); ! 411: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.