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: }