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