|
|
1.1 ! root 1: /* repl.c - reply to a 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 ANNOSW 0 ! 12: "annotate", 0, ! 13: #define NANNOSW 1 ! 14: "noannotate", 0, ! 15: ! 16: #define CCSW 2 ! 17: "cc type", 0, ! 18: #define NCCSW 3 ! 19: "nocc type", 0, ! 20: ! 21: #define DFOLDSW 4 ! 22: "draftfolder +folder", 0, ! 23: #define DMSGSW 5 ! 24: "draftmessage msg", 0, ! 25: #define NDFLDSW 6 ! 26: "nodraftfolder", 0, ! 27: ! 28: #define EDITRSW 7 ! 29: "editor editor", 0, ! 30: #define NEDITSW 8 ! 31: "noedit", 0, ! 32: ! 33: #define FCCSW 9 ! 34: "fcc folder", 0, ! 35: ! 36: #define FILTSW 10 ! 37: "filter filterfile", 0, ! 38: #define FORMSW 11 ! 39: "form formfile", 0, ! 40: ! 41: #define FRMTSW 12 ! 42: "format", 5, ! 43: #define NFRMTSW 13 ! 44: "noformat", 7, ! 45: ! 46: #define INPLSW 14 ! 47: "inplace", 0, ! 48: #define NINPLSW 15 ! 49: "noinplace", 0, ! 50: ! 51: #define QURYSW 16 ! 52: "query", 0, ! 53: #define NQURYSW 17 ! 54: "noquery", 0, ! 55: ! 56: #define WHATSW 18 ! 57: "whatnowproc program", 0, ! 58: #define NWHATSW 19 ! 59: "nowhatnowproc", 0, ! 60: ! 61: #define WIDTHSW 20 ! 62: "width columns", 0, ! 63: ! 64: #define HELPSW 21 ! 65: "help", 4, ! 66: ! 67: #define FILESW 22 ! 68: "file file", -4, /* interface from msh */ ! 69: ! 70: #ifdef MHE ! 71: #define BILDSW 23 ! 72: "build", -5, /* interface from mhe */ ! 73: #endif MHE ! 74: ! 75: NULL, NULL ! 76: }; ! 77: ! 78: ! 79: static struct swit ccswitches[] = { ! 80: #define CTOSW 0 ! 81: "to", 0, ! 82: #define CCCSW 1 ! 83: "cc", 0, ! 84: #define CMESW 2 ! 85: "me", 0, ! 86: #define CALSW 3 ! 87: "all", 0, ! 88: ! 89: NULL, NULL ! 90: }; ! 91: ! 92: /* */ ! 93: ! 94: static struct swit aqrnl[] = { ! 95: #define NOSW 0 ! 96: "quit", 0, ! 97: #define YESW 1 ! 98: "replace", 0, ! 99: #define LISTDSW 2 ! 100: "list", 0, ! 101: #define REFILSW 3 ! 102: "refile +folder", 0, ! 103: #define NEWSW 4 ! 104: "new", 0, ! 105: ! 106: NULL, NULL ! 107: }; ! 108: ! 109: ! 110: static struct swit aqrl[] = { ! 111: "quit", 0, ! 112: "replace", 0, ! 113: "list", 0, ! 114: "refile +folder", 0, ! 115: ! 116: NULL, NULL ! 117: }; ! 118: ! 119: /* */ ! 120: ! 121: #ifndef ATHENA ! 122: #define CCDFLT 1 ! 123: #else ATHENA ! 124: #define CCDFLT 0 ! 125: #endif ATHENA ! 126: ! 127: short ccto = CCDFLT; /* global for replsbr */ ! 128: short cccc = CCDFLT; ! 129: short ccme = CCDFLT; ! 130: short format = 1; ! 131: short outputlinelen = OUTPUTLINELEN; ! 132: short querysw = 0; ! 133: ! 134: char *fcc = NULL; /* global for replsbr */ ! 135: char *filter = NULL; ! 136: char *form = NULL; ! 137: ! 138: /* */ ! 139: ! 140: /* ARGSUSED */ ! 141: ! 142: main (argc, argv) ! 143: int argc; ! 144: char *argv[]; ! 145: { ! 146: int i, ! 147: isdf = 0, ! 148: anot = 0, ! 149: inplace = 0, ! 150: #ifdef MHE ! 151: buildsw = 0, ! 152: #endif MHE ! 153: nedit = 0, ! 154: nwhat = 0; ! 155: char *cp, ! 156: *cwd, ! 157: *dp, ! 158: *maildir, ! 159: *file = NULL, ! 160: *folder = NULL, ! 161: *msg = NULL, ! 162: *dfolder = NULL, ! 163: *dmsg = NULL, ! 164: *ed = NULL, ! 165: drft[BUFSIZ], ! 166: buf[100], ! 167: **ap, ! 168: **argp, ! 169: *arguments[MAXARGS]; ! 170: struct msgs *mp = NULL; ! 171: struct stat st; ! 172: FILE *in; ! 173: ! 174: invo_name = r1bindex (argv[0], '/'); ! 175: if ((cp = m_find (invo_name)) != NULL) { ! 176: ap = brkstring (cp = getcpy (cp), " ", "\n"); ! 177: ap = copyip (ap, arguments); ! 178: } ! 179: else ! 180: ap = arguments; ! 181: (void) copyip (argv + 1, ap); ! 182: argp = arguments; ! 183: ! 184: /* */ ! 185: ! 186: while (cp = *argp++) { ! 187: if (*cp == '-') ! 188: switch (smatch (++cp, switches)) { ! 189: case AMBIGSW: ! 190: ambigsw (cp, switches); ! 191: done (1); ! 192: case UNKWNSW: ! 193: adios (NULLCP, "-%s unknown", cp); ! 194: case HELPSW: ! 195: (void) sprintf (buf, "%s: [+folder] [msg] [switches]", ! 196: invo_name); ! 197: help (buf, switches); ! 198: done (0); ! 199: ! 200: case ANNOSW: ! 201: anot++; ! 202: continue; ! 203: case NANNOSW: ! 204: anot = 0; ! 205: continue; ! 206: ! 207: case CCSW: ! 208: if (!(cp = *argp++) || *cp == '-') ! 209: adios (NULLCP, "missing argument to %s", argp[-2]); ! 210: docc (cp, 1); ! 211: continue; ! 212: case NCCSW: ! 213: if (!(cp = *argp++) || *cp == '-') ! 214: adios (NULLCP, "missing argument to %s", argp[-2]); ! 215: docc (cp, 0); ! 216: continue; ! 217: ! 218: case EDITRSW: ! 219: if (!(ed = *argp++) || *ed == '-') ! 220: adios (NULLCP, "missing argument to %s", argp[-2]); ! 221: nedit = 0; ! 222: continue; ! 223: case NEDITSW: ! 224: nedit++; ! 225: continue; ! 226: ! 227: case WHATSW: ! 228: if (!(whatnowproc = *argp++) || *whatnowproc == '-') ! 229: adios (NULLCP, "missing argument to %s", argp[-2]); ! 230: nwhat = 0; ! 231: continue; ! 232: #ifdef MHE ! 233: case BILDSW: ! 234: buildsw++; /* fall... */ ! 235: #endif MHE ! 236: case NWHATSW: ! 237: nwhat++; ! 238: continue; ! 239: ! 240: case FCCSW: ! 241: if (!(cp = *argp++) || *cp == '-') ! 242: adios (NULLCP, "missing argument to %s", argp[-2]); ! 243: dp = NULL; ! 244: if (*cp == '@') ! 245: cp = dp = path (cp + 1, TSUBCWF); ! 246: if (fcc) ! 247: fcc = add (", ", fcc); ! 248: fcc = add (cp, fcc); ! 249: if (dp) ! 250: free (dp); ! 251: continue; ! 252: ! 253: case FILESW: ! 254: if (file) ! 255: adios (NULLCP, "only one file at a time!"); ! 256: if (!(cp = *argp++) || *cp == '-') ! 257: adios (NULLCP, "missing argument to %s", argp[-2]); ! 258: file = path (cp, TFILE); ! 259: continue; ! 260: case FILTSW: ! 261: if (!(cp = *argp++) || *cp == '-') ! 262: adios (NULLCP, "missing argument to %s", argp[-2]); ! 263: filter = getcpy (m_maildir (cp)); ! 264: continue; ! 265: case FORMSW: ! 266: if (!(form = *argp++) || *form == '-') ! 267: adios (NULLCP, "missing argument to %s", argp[-2]); ! 268: continue; ! 269: ! 270: case FRMTSW: ! 271: format++; ! 272: continue; ! 273: case NFRMTSW: ! 274: format = 0; ! 275: continue; ! 276: ! 277: case INPLSW: ! 278: inplace++; ! 279: continue; ! 280: case NINPLSW: ! 281: inplace = 0; ! 282: continue; ! 283: ! 284: case QURYSW: ! 285: querysw++; ! 286: continue; ! 287: case NQURYSW: ! 288: querysw = 0; ! 289: continue; ! 290: ! 291: case WIDTHSW: ! 292: if (!(cp = *argp++) || *cp == '-') ! 293: adios (NULLCP, "missing argument to %s", argp[-2]); ! 294: if ((outputlinelen = atoi (cp)) < 10) ! 295: adios (NULLCP, "impossible width %d", outputlinelen); ! 296: continue; ! 297: ! 298: case DFOLDSW: ! 299: if (dfolder) ! 300: adios (NULLCP, "only one draft folder at a time!"); ! 301: if (!(cp = *argp++) || *cp == '-') ! 302: adios (NULLCP, "missing argument to %s", argp[-2]); ! 303: dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp, ! 304: *cp != '@' ? TFOLDER : TSUBCWF); ! 305: continue; ! 306: case DMSGSW: ! 307: if (dmsg) ! 308: adios (NULLCP, "only one draft message at a time!"); ! 309: if (!(dmsg = *argp++) || *dmsg == '-') ! 310: adios (NULLCP, "missing argument to %s", argp[-2]); ! 311: continue; ! 312: case NDFLDSW: ! 313: dfolder = NULL; ! 314: isdf = NOTOK; ! 315: continue; ! 316: } ! 317: if (*cp == '+' || *cp == '@') { ! 318: if (folder) ! 319: adios (NULLCP, "only one folder at a time!"); ! 320: else ! 321: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); ! 322: } ! 323: else ! 324: if (msg) ! 325: adios (NULLCP, "only one message at a time!"); ! 326: else ! 327: msg = cp; ! 328: } ! 329: ! 330: /* */ ! 331: ! 332: cwd = getcpy (pwd ()); ! 333: ! 334: if (!m_find ("path")) ! 335: free (path ("./", TFOLDER)); ! 336: if (file && (msg || folder)) ! 337: adios (NULLCP, "can't mix files and folders/msgs"); ! 338: ! 339: try_it_again: ; ! 340: #ifndef MHE ! 341: (void) strcpy (drft, m_draft (dfolder, dmsg, NOUSE, &isdf)); ! 342: if (stat (drft, &st) != NOTOK) { ! 343: #else MHE ! 344: (void) strcpy (drft, buildsw ? m_maildir ("reply") ! 345: : m_draft (dfolder, NULLCP, NOUSE, &isdf)); ! 346: if (!buildsw && stat (drft, &st) != NOTOK) { ! 347: #endif MHE ! 348: printf ("Draft \"%s\" exists (%ld bytes).", drft, st.st_size); ! 349: for (i = LISTDSW; i != YESW;) { ! 350: if (!(argp = getans ("\nDisposition? ", isdf ? aqrnl : aqrl))) ! 351: done (1); ! 352: switch (i = smatch (*argp, isdf ? aqrnl : aqrl)) { ! 353: case NOSW: ! 354: done (0); ! 355: case NEWSW: ! 356: dmsg = NULL; ! 357: goto try_it_again; ! 358: case YESW: ! 359: break; ! 360: case LISTDSW: ! 361: (void) showfile (++argp, drft); ! 362: break; ! 363: case REFILSW: ! 364: if (refile (++argp, drft) == 0) ! 365: i = YESW; ! 366: break; ! 367: default: ! 368: advise (NULLCP, "say what?"); ! 369: break; ! 370: } ! 371: } ! 372: } ! 373: ! 374: /* */ ! 375: ! 376: if (file) { ! 377: anot = 0; ! 378: goto go_to_it; ! 379: } ! 380: ! 381: if (!msg) ! 382: msg = "cur"; ! 383: if (!folder) ! 384: folder = m_getfolder (); ! 385: maildir = m_maildir (folder); ! 386: ! 387: if (chdir (maildir) == NOTOK) ! 388: adios (maildir, "unable to change directory to"); ! 389: if (!(mp = m_gmsg (folder))) ! 390: adios (NULLCP, "unable to read folder %s", folder); ! 391: if (mp -> hghmsg == 0) ! 392: adios (NULLCP, "no messages in %s", folder); ! 393: ! 394: if (!m_convert (mp, msg)) ! 395: done (1); ! 396: m_setseq (mp); ! 397: ! 398: if (mp -> numsel > 1) ! 399: adios (NULLCP, "only one message at a time!"); ! 400: ! 401: m_replace (pfolder, folder); ! 402: if (mp -> lowsel != mp -> curmsg) ! 403: m_setcur (mp, mp -> lowsel); ! 404: m_sync (mp); ! 405: m_update (); ! 406: ! 407: go_to_it: ; ! 408: msg = file ? file : getcpy (m_name (mp -> lowsel)); ! 409: ! 410: if ((in = fopen (msg, "r")) == NULL) ! 411: adios (msg, "unable to open"); ! 412: ! 413: replout (in, msg, drft); ! 414: (void) fclose (in); ! 415: ! 416: if (nwhat) ! 417: done (0); ! 418: (void) m_whatnow (ed, nedit, NOUSE, drft, msg, 0, mp, ! 419: anot ? "Replied" : NULLCP, inplace, cwd); ! 420: done (1); ! 421: } ! 422: ! 423: /* */ ! 424: ! 425: docc (cp, ccflag) ! 426: register char *cp; ! 427: int ccflag; ! 428: { ! 429: switch (smatch (cp, ccswitches)) { ! 430: case AMBIGSW: ! 431: ambigsw (cp, ccswitches); ! 432: done (1); ! 433: case UNKWNSW: ! 434: adios (NULLCP, "-%scc %s unknown", ccflag ? "" : "no", cp); ! 435: ! 436: case CTOSW: ! 437: ccto = ccflag; ! 438: break; ! 439: ! 440: case CCCSW: ! 441: cccc = ccflag; ! 442: break; ! 443: ! 444: case CMESW: ! 445: ccme = ccflag; ! 446: break; ! 447: ! 448: case CALSW: ! 449: ccto = cccc = ccme = ccflag; ! 450: break; ! 451: } ! 452: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.