Renamed -version switch to -Version to remove the conflict with -verbose.
[mmh] / uip / mhstore.c
index 6f6746d..259acf3 100644 (file)
@@ -29,7 +29,7 @@ static struct swit switches[] = {
 #define TYPESW  4
        { "type content", 0 },
 #define VERSIONSW  5
-       { "version", 0 },
+       { "Version", 0 },
 #define HELPSW  6
        { "help", 0 },
 #define DEBUGSW  7
@@ -466,34 +466,34 @@ store_switch(CT ct)
 ** Generic routine to store a MIME content.
 ** (application, audio, video, image, text, message/rfc922)
 */
-
 static int
 store_generic(CT ct)
 {
-       char **ap, **ep, *cp;
+       char **ap, **vp, *cp;
        CI ci = &ct->c_ctinfo;
 
        /*
        ** Check if the content specifies a filename in its MIME parameters.
        ** Don't bother with this for type "message"
        ** (only the "message" subtype "rfc822" will use store_generic).
-       ** The storeproc may already be defined, if this content
-       ** is part of a "message/external", for instance.
        */
-       if (autosw && ct->c_type != CT_MESSAGE && !ct->c_storeproc) {
+       if (autosw && ct->c_type != CT_MESSAGE) {
                /*
                ** Check the attribute/value pairs, for the attribute "name".
-               ** If found, do a few sanity checks and copy the value into
-               ** the storeproc.
+               ** If found, take the basename, do a few sanity checks and
+               ** copy the value into c_storeproc.
                */
-               for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
-                       if (mh_strcasecmp(*ap, "name")==0 &&
-                                       *(cp = *ep) != '/' && *cp != '.' &&
-                                       *cp != '|' && *cp != '!' &&
+               for (ap = ci->ci_attrs, vp = ci->ci_values; *ap; ap++,vp++) {
+                       if (mh_strcasecmp(*ap, "name")!=0) {
+                               continue;
+                       }
+                       cp = mhbasename(*vp);
+                       if (*cp && *cp!='.' && *cp!='|' && *cp!='!' &&
                                        !strchr(cp, '%')) {
+                               /* filename looks good: use it */
                                ct->c_storeproc = getcpy(cp);
-                               break;
                        }
+                       break;
                }
        }
 
@@ -630,48 +630,36 @@ losing:
 
 
 /*
-** Store content from a message of type "message/external".
+** Show how to retrieve content of type "message/external".
 */
-
 static int
 store_external(CT ct)
 {
-       int result = NOTOK;
-       struct exbody *e = (struct exbody *) ct->c_ctparams;
-       CT p = e->eb_content;
-
-       if (!type_ok(p, 1))
-               return OK;
-
-       /*
-       ** Check if the parameters for the external body
-       ** specified a filename.
-       */
-       if (autosw) {
-               char *cp;
+       char **ap, **ep;
+       char *msg;
+       FILE *fp;
+       char buf[BUFSIZ];
 
-               if ((cp = e->eb_name) && *cp != '/' && *cp != '.' &&
-                               *cp != '|' && *cp != '!' && !strchr(cp, '%')) {
-                       if (!ct->c_storeproc)
-                               ct->c_storeproc = getcpy(cp);
-                       if (!p->c_storeproc)
-                               p->c_storeproc = getcpy(cp);
+       msg = add("You need to fetch the contents yourself:", NULL);
+       ap = ct->c_ctinfo.ci_attrs;
+       ep = ct->c_ctinfo.ci_values;
+       for (; *ap; ap++, ep++) {
+               msg = add(concat("\n\t", *ap, ": ", *ep, NULL), msg);
+       }
+       if (!(fp = fopen(ct->c_file, "r"))) {
+               adios(ct->c_file, "unable to open");
+       }
+       fseek(fp, ct->c_begin, SEEK_SET);
+       while (!feof(fp) && ftell(fp) < ct->c_end) {
+               if (!fgets(buf, sizeof buf, fp)) {
+                       adios(ct->c_file, "unable to read");
                }
+               *strchr(buf, '\n') = '\0';
+               msg = add(concat("\n\t", buf, NULL), msg);
        }
-
-       /*
-       ** Since we will let the Content structure for the
-       ** external body substitute for the current content,
-       ** we temporarily change its partno (number inside
-       ** multipart), so everything looks right.
-       */
-       p->c_partno = ct->c_partno;
-
-       /* we probably need to check if content is really there */
-       result = store_switch(p);
-
-       p->c_partno = NULL;
-       return result;
+       fclose(fp);
+       advise(NULL, msg);
+       return OK;
 }
 
 
@@ -761,7 +749,7 @@ store_content(CT ct, CT p)
        ** 4) Else if content is "message", use "+" (current folder)
        ** 5) Else use string "%m%P.%s".
        */
-       if ((cp = ct->c_storeproc) == NULL || *cp == '\0') {
+       if (!(cp = ct->c_storeproc) || !*cp) {
                CI ci = &ct->c_ctinfo;
 
                snprintf(buffer, sizeof(buffer), "%s-store-%s/%s",
@@ -900,8 +888,8 @@ output_content_file(CT ct, int appending)
        FILE *fp;
 
        /*
-       ** If the pathname is absolute, make sure
-       ** all the relevant directories exist.
+       ** If the pathname contains directories, make sure
+       ** all of them exist.
        */
        if (strchr(ct->c_storage, '/') && make_intermediates(ct->c_storage)
                        == NOTOK)