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

Defined functions

main defined in line 81; never used

Defined variables

aqrl defined in line 68; used 2 times
aqrnl defined in line 52; used 2 times
switches defined in line 10; used 3 times

Defined macros

ANNOSW defined in line 11; never used
DFOLDSW defined in line 16; never used
DMSGSW defined in line 18; never used
EDITRSW defined in line 23; never used
FILESW defined in line 44; never used
FORMSW defined in line 28; never used
HELPSW defined in line 41; never used
INPLSW defined in line 31; never used
LISTDSW defined in line 57; used 1 times
NANNOSW defined in line 13; never used
NDFLDSW defined in line 20; never used
NEDITSW defined in line 25; never used
NEWSW defined in line 61; never used
NINPLSW defined in line 33; never used
NOSW defined in line 53; never used
NWHATSW defined in line 38; never used
REFILSW defined in line 59; never used
WHATSW defined in line 36; never used
YESW defined in line 55; used 2 times
Last modified: 1985-10-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1474
Valid CSS Valid XHTML 1.0 Strict