|
|
1.1 ! root 1: /* comp.c - compose 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 DFOLDSW 0 ! 12: "draftfolder +folder", 0, ! 13: #define DMSGSW 1 ! 14: "draftmessage msg", 0, ! 15: #define NDFLDSW 2 ! 16: "nodraftfolder", 0, ! 17: ! 18: #define EDITRSW 3 ! 19: "editor editor", 0, ! 20: #define NEDITSW 4 ! 21: "noedit", 0, ! 22: ! 23: #define FILESW 5 ! 24: "file file", 0, ! 25: #define FORMSW 6 ! 26: "form formfile", 0, ! 27: ! 28: #define USESW 7 ! 29: "use", 0, ! 30: #define NUSESW 8 ! 31: "nouse", 0, ! 32: ! 33: #define WHATSW 9 ! 34: "whatnowproc program", 0, ! 35: #define NWHATSW 10 ! 36: "nowhatnowproc", 0, ! 37: ! 38: #define HELPSW 11 ! 39: "help", 4, ! 40: ! 41: ! 42: NULL, NULL ! 43: }; ! 44: ! 45: /* */ ! 46: ! 47: static struct swit aqrunl[] = { ! 48: #define NOSW 0 ! 49: "quit", 0, ! 50: #define YESW 1 ! 51: "replace", 0, ! 52: #define USELSW 2 ! 53: "use", 0, ! 54: #define LISTDSW 3 ! 55: "list", 0, ! 56: #define REFILSW 4 ! 57: "refile +folder", 0, ! 58: #define NEWSW 5 ! 59: "new", 0, ! 60: ! 61: NULL, NULL ! 62: }; ! 63: ! 64: ! 65: static struct swit aqrul[] = { ! 66: "quit", 0, ! 67: "replace", 0, ! 68: "use", 0, ! 69: "list", 0, ! 70: "refile", 0, ! 71: ! 72: NULL, NULL ! 73: }; ! 74: ! 75: /* */ ! 76: ! 77: /* ARGSUSED */ ! 78: ! 79: main (argc, argv) ! 80: int argc; ! 81: char *argv[]; ! 82: { ! 83: int use = NOUSE, ! 84: nedit = 0, ! 85: nwhat = 0, ! 86: i, ! 87: in, ! 88: isdf = 0, ! 89: out; ! 90: char *cp, ! 91: *cwd, ! 92: *maildir, ! 93: *dfolder = NULL, ! 94: *ed = NULL, ! 95: *file = NULL, ! 96: *form = NULL, ! 97: *folder = NULL, ! 98: *msg = NULL, ! 99: buf[BUFSIZ], ! 100: drft[BUFSIZ], ! 101: **ap, ! 102: **argp, ! 103: *arguments[MAXARGS]; ! 104: struct msgs *mp = NULL; ! 105: struct stat st; ! 106: ! 107: invo_name = r1bindex (argv[0], '/'); ! 108: if ((cp = m_find (invo_name)) != NULL) { ! 109: ap = brkstring (cp = getcpy (cp), " ", "\n"); ! 110: ap = copyip (ap, arguments); ! 111: } ! 112: else ! 113: ap = arguments; ! 114: (void) copyip (argv + 1, ap); ! 115: argp = arguments; ! 116: ! 117: /* */ ! 118: ! 119: while (cp = *argp++) { ! 120: if (*cp == '-') ! 121: switch (smatch (++cp, switches)) { ! 122: case AMBIGSW: ! 123: ambigsw (cp, switches); ! 124: done (1); ! 125: case UNKWNSW: ! 126: adios (NULLCP, "-%s unknown", cp); ! 127: case HELPSW: ! 128: (void) sprintf (buf, "%s [+folder] [msg] [switches]", ! 129: invo_name); ! 130: help (buf, switches); ! 131: done (1); ! 132: ! 133: case EDITRSW: ! 134: if (!(ed = *argp++) || *ed == '-') ! 135: adios (NULLCP, "missing argument to %s", argp[-2]); ! 136: nedit = 0; ! 137: continue; ! 138: case NEDITSW: ! 139: nedit++; ! 140: continue; ! 141: ! 142: case WHATSW: ! 143: if (!(whatnowproc = *argp++) || *whatnowproc == '-') ! 144: adios (NULLCP, "missing argument to %s", argp[-2]); ! 145: nwhat = 0; ! 146: continue; ! 147: case NWHATSW: ! 148: nwhat++; ! 149: continue; ! 150: ! 151: case FORMSW: ! 152: if (!(form = *argp++) || *form == '-') ! 153: adios (NULLCP, "missing argument to %s", argp[-2]); ! 154: continue; ! 155: ! 156: case USESW: ! 157: use++; ! 158: continue; ! 159: case NUSESW: ! 160: use = NOUSE; ! 161: continue; ! 162: ! 163: case FILESW: /* compatibility */ ! 164: if (file) ! 165: adios (NULLCP, "only one file at a time!"); ! 166: if (!(file = *argp++) || *file == '-') ! 167: adios (NULLCP, "missing argument to %s", argp[-2]); ! 168: continue; ! 169: ! 170: case DFOLDSW: ! 171: if (dfolder) ! 172: adios (NULLCP, "only one draft folder at a time!"); ! 173: if (!(cp = *argp++) || *cp == '-') ! 174: adios (NULLCP, "missing argument to %s", argp[-2]); ! 175: dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp, ! 176: *cp != '@' ? TFOLDER : TSUBCWF); ! 177: continue; ! 178: case DMSGSW: ! 179: if (file) ! 180: adios (NULLCP, "only one draft message at a time!"); ! 181: if (!(file = *argp++) || *file == '-') ! 182: adios (NULLCP, "missing argument to %s", argp[-2]); ! 183: continue; ! 184: case NDFLDSW: ! 185: dfolder = NULL; ! 186: isdf = NOTOK; ! 187: continue; ! 188: } ! 189: if (*cp == '+' || *cp == '@') { ! 190: if (folder) ! 191: adios (NULLCP, "only one folder at a time!"); ! 192: else ! 193: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); ! 194: } ! 195: else ! 196: if (msg) ! 197: adios (NULLCP, "only one message at a time!"); ! 198: else ! 199: msg = cp; ! 200: } ! 201: ! 202: /* */ ! 203: ! 204: cwd = getcpy (pwd ()); ! 205: ! 206: if (!m_find ("path")) ! 207: free (path ("./", TFOLDER)); ! 208: ! 209: if ((dfolder || m_find ("Draft-Folder")) && !folder && msg && !file) ! 210: file = msg, msg = NULL; ! 211: if (form && (folder || msg)) ! 212: adios (NULLCP, "can't mix forms and folders/msgs"); ! 213: ! 214: if (folder || msg) { ! 215: if (!msg) ! 216: msg = "cur"; ! 217: if (!folder) ! 218: folder = m_getfolder (); ! 219: maildir = m_maildir (folder); ! 220: ! 221: if (chdir (maildir) == NOTOK) ! 222: adios (maildir, "unable to change directory to"); ! 223: if (!(mp = m_gmsg (folder))) ! 224: adios (NULLCP, "unable to read folder %s", folder); ! 225: if (mp -> hghmsg == 0) ! 226: adios (NULLCP, "no messages in %s", folder); ! 227: ! 228: if (!m_convert (mp, msg)) ! 229: done (1); ! 230: m_setseq (mp); ! 231: ! 232: if (mp -> numsel > 1) ! 233: adios (NULLCP, "only one message at a time!"); ! 234: ! 235: if ((in = open (form = getcpy (m_name (mp -> lowsel)), 0)) == NOTOK) ! 236: adios (form, "unable to open message"); ! 237: } ! 238: else ! 239: if (form) { ! 240: if ((in = open (libpath (form), 0)) == NOTOK) ! 241: adios (form, "unable to open form file"); ! 242: } ! 243: else { ! 244: if ((in = open (libpath (components), 0)) == NOTOK) ! 245: adios (components, "unable to open default components file"); ! 246: form = components; ! 247: } ! 248: ! 249: /* */ ! 250: ! 251: try_it_again: ; ! 252: (void) strcpy (drft, m_draft (dfolder, file, use, &isdf)); ! 253: if ((out = open (drft, 0)) != NOTOK) { ! 254: i = fdcompare (in, out); ! 255: (void) close (out); ! 256: if (use || i) ! 257: goto edit_it; ! 258: ! 259: if (stat (drft, &st) == NOTOK) ! 260: adios (drft, "unable to stat"); ! 261: printf ("Draft \"%s\" exists (%ld bytes).", drft, st.st_size); ! 262: for (i = LISTDSW; i != YESW;) { ! 263: if (!(argp = getans ("\nDisposition? ", isdf ? aqrunl : aqrul))) ! 264: done (1); ! 265: switch (i = smatch (*argp, isdf ? aqrunl : aqrul)) { ! 266: case NOSW: ! 267: done (0); ! 268: case NEWSW: ! 269: file = NULL; ! 270: use = NOUSE; ! 271: goto try_it_again; ! 272: case YESW: ! 273: break; ! 274: case USELSW: ! 275: use++; ! 276: goto edit_it; ! 277: case LISTDSW: ! 278: (void) showfile (++argp, drft); ! 279: break; ! 280: case REFILSW: ! 281: if (refile (++argp, drft) == 0) ! 282: i = YESW; ! 283: break; ! 284: default: ! 285: advise (NULLCP, "say what?"); ! 286: break; ! 287: } ! 288: } ! 289: } ! 290: else ! 291: if (use) ! 292: adios (drft, "unable to open"); ! 293: ! 294: if ((out = creat (drft, m_gmprot ())) == NOTOK) ! 295: adios (drft, "unable to create"); ! 296: cpydata (in, out, form, drft); ! 297: (void) close (in); ! 298: (void) close (out); ! 299: ! 300: edit_it: ; ! 301: m_update (); ! 302: ! 303: if (nwhat) ! 304: done (0); ! 305: (void) m_whatnow (ed, nedit, use, drft, NULLCP, 0, NULLMP, NULLCP, 0, cwd); ! 306: done (1); ! 307: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.