]> diplodocus.org Git - nmh/blobdiff - uip/mhparse.c
Commit ddf3a8574f65 is a fix to commit af586ebe59b7.
[nmh] / uip / mhparse.c
index f0cdc687a12531af88b7bc2131c4dccb784d1c1b..cb9d2799e781949cc2ca6ce91fd93b0af3a67fee 100644 (file)
@@ -89,7 +89,6 @@ struct k2v SubMultiPart[] = {
  */
 struct k2v SubMessage[] = {
     { "rfc822",        MESSAGE_RFC822 },
-    { "partial",       MESSAGE_PARTIAL },
     { "external-body", MESSAGE_EXTERNAL },
     { NULL,            MESSAGE_UNKNOWN }       /* this one must be last! */
 };
@@ -626,7 +625,7 @@ get_ctinfo (char *cp, CT ct, int magic)
        fprintf (stderr, "%s: %s\n", TYPE_FIELD, cp);
 
     if (*cp == '(' && get_comment (ct->c_file, TYPE_FIELD, &cp,
-                                  &ci->ci_comment) == NOTOK)
+                                  &ci->ci_comment) == NOTOK)
        return NOTOK;
 
     for (dp = cp; istoken (*dp); dp++)
@@ -648,7 +647,7 @@ get_ctinfo (char *cp, CT ct, int magic)
        cp++;
 
     if (*cp == '(' && get_comment (ct->c_file, TYPE_FIELD, &cp,
-                                  &ci->ci_comment) == NOTOK)
+                                  &ci->ci_comment) == NOTOK)
        return NOTOK;
 
     if (*cp != '/') {
@@ -662,7 +661,7 @@ get_ctinfo (char *cp, CT ct, int magic)
        cp++;
 
     if (*cp == '(' && get_comment (ct->c_file, TYPE_FIELD, &cp,
-                                  &ci->ci_comment) == NOTOK)
+                                  &ci->ci_comment) == NOTOK)
        return NOTOK;
 
     for (dp = cp; istoken (*dp); dp++)
@@ -685,11 +684,11 @@ magic_skip:
        cp++;
 
     if (*cp == '(' && get_comment (ct->c_file, TYPE_FIELD, &cp,
-                                  &ci->ci_comment) == NOTOK)
+                                  &ci->ci_comment) == NOTOK)
        return NOTOK;
 
     if ((status = parse_header_attrs (ct->c_file, TYPE_FIELD, &cp,
-                                     &ci->ci_first_pm, &ci->ci_last_pm,
+                                     &ci->ci_first_pm, &ci->ci_last_pm,
                                      &ci->ci_comment)) != OK) {
        return status == NOTOK ? NOTOK : OK;
     }
@@ -777,7 +776,7 @@ magic_skip:
      */
 
     if (magic && *cp == '*') {
-       /*
+       /*
         * See if it's a CTE we match on
         */
        struct k2v *kv;
@@ -875,7 +874,7 @@ get_dispo (char *cp, CT ct, int buildflag)
        fprintf (stderr, "%s: %s\n", DISPO_FIELD, cp);
 
     if (*cp == '(' && get_comment (ct->c_file, DISPO_FIELD, &cp, NULL) ==
-                                                       NOTOK) {
+                                                       NOTOK) {
        free(dispoheader);
        return NOTOK;
     }
@@ -892,7 +891,7 @@ get_dispo (char *cp, CT ct, int buildflag)
        return NOTOK;
 
     if ((status = parse_header_attrs (ct->c_file, DISPO_FIELD, &cp,
-                                     &ct->c_dispo_first, &ct->c_dispo_last,
+                                     &ct->c_dispo_first, &ct->c_dispo_last,
                                      NULL)) != OK) {
        if (status == NOTOK) {
            free(dispoheader);
@@ -904,7 +903,7 @@ get_dispo (char *cp, CT ct, int buildflag)
     }
 
     if (buildflag)
-       free(dispoheader);
+       free(dispoheader);
     else
        ct->c_dispo = dispoheader;
 
@@ -1153,6 +1152,23 @@ InitMultiPart (CT ct)
        pos += gotlen;
        if (bufp[0] != '-' || bufp[1] != '-')
            continue;
+
+       /*
+        * A bit of a lame hack; if this line ends in \r\n then replace
+        * the \r\n with just a \n so that the boundary markers will match
+        * up properly in case this uses "MS-DOS" line endings.
+        */
+
+       if (gotlen > 2 && bufp[gotlen - 1] == '\n' &&
+           bufp[gotlen - 2] == '\r') {
+               /*
+                * Note we don't change getpos here, because it is used to
+                * calculate multipart offsets.
+                */
+               bufp[gotlen - 2] = '\n';
+               bufp[gotlen - 1] = '\0';
+       }
+
        if (inout) {
            if (strcmp (bufp + 2, m->mp_start))
                continue;
@@ -1391,49 +1407,6 @@ InitMessage (CT ct)
        case MESSAGE_RFC822:
            break;
 
-       case MESSAGE_PARTIAL:
-           {
-               PM pm;
-               struct partial *p;
-
-               NEW0(p);
-               ct->c_ctparams = (void *) p;
-
-               /* scan for parameters "id", "number", and "total" */
-               for (pm = ci->ci_first_pm; pm; pm = pm->pm_next) {
-                   if (!strcasecmp (pm->pm_name, "id")) {
-                       p->pm_partid = mh_xstrdup(FENDNULL(pm->pm_value));
-                       continue;
-                   }
-                   if (!strcasecmp (pm->pm_name, "number")) {
-                       if (sscanf (pm->pm_value, "%d", &p->pm_partno) != 1
-                               || p->pm_partno < 1) {
-invalid_param:
-                           inform("invalid %s parameter for \"%s/%s\" type in message %s's %s field",
-                                pm->pm_name, ci->ci_type, ci->ci_subtype,
-                                ct->c_file, TYPE_FIELD);
-                           return NOTOK;
-                       }
-                       continue;
-                   }
-                   if (!strcasecmp (pm->pm_name, "total")) {
-                       if (sscanf (pm->pm_value, "%d", &p->pm_maxno) != 1
-                               || p->pm_maxno < 1)
-                           goto invalid_param;
-                       continue;
-                   }
-               }
-
-               if (!p->pm_partid
-                       || !p->pm_partno
-                       || (p->pm_maxno && p->pm_partno > p->pm_maxno)) {
-                   inform("invalid parameters for \"%s/%s\" type in message %s's %s field",
-                        ci->ci_type, ci->ci_subtype, ct->c_file, TYPE_FIELD);
-                   return NOTOK;
-               }
-           }
-           break;
-
        case MESSAGE_EXTERNAL:
            {
                int exresult;
@@ -1599,7 +1572,7 @@ params_external (CT ct, int composing)
            e->eb_url = u = mh_xmalloc(strlen(pm->pm_value) + 1);
 
            for (; *p != '\0'; p++) {
-               if (! isspace((unsigned char) *p))
+               if (! isspace((unsigned char) *p))
                    *u++ = *p;
            }
 
@@ -2401,7 +2374,7 @@ openFTP (CT ct, char **file)
 
     if (e->eb_flags) {
        user = "anonymous";
-       snprintf (buffer, sizeof(buffer), "%s@%s", getusername (),
+       snprintf (buffer, sizeof(buffer), "%s@%s", getusername (1),
                  LocalName (1));
        pass = buffer;
     } else {
@@ -2441,7 +2414,7 @@ openFTP (CT ct, char **file)
        vec[vecp++] = e->eb_name;
        vec[vecp++] = ce->ce_file,
        vec[vecp++] = e->eb_mode && !strcasecmp (e->eb_mode, "ascii")
-                       ? "ascii" : "binary";
+                       ? "ascii" : "binary";
        vec[vecp] = NULL;
 
        fflush (stdout);
@@ -2616,15 +2589,15 @@ openURL (CT ct, char **file)
     pid_t child_id;
 
     if ((urlprog = context_find(nmhaccessurl)) && *urlprog == '\0')
-       urlprog = NULL;
+       urlprog = NULL;
 
     if (! urlprog) {
-       content_error(NULL, ct, "No entry for nmh-access-url in profile");
-       return NOTOK;
+       content_error(NULL, ct, "No entry for nmh-access-url in profile");
+       return NOTOK;
     }
 
     switch (openExternal(e->eb_parent, ce, file, &fd)) {
-       case NOTOK:
+       case NOTOK:
            return NOTOK;
 
        case OK:
@@ -2635,7 +2608,7 @@ openURL (CT ct, char **file)
     }
 
     if (!e->eb_url) {
-       content_error(NULL, ct, "missing url parameter");
+       content_error(NULL, ct, "missing url parameter");
        return NOTOK;
     }
 
@@ -2653,17 +2626,17 @@ openURL (CT ct, char **file)
     }
 
     if ((ce->ce_fp = fopen(ce->ce_file, "w+")) == NULL) {
-       content_error(ce->ce_file, ct, "unable to fopen for read/writing");
+       content_error(ce->ce_file, ct, "unable to fopen for read/writing");
        return NOTOK;
     }
 
     switch (child_id = fork()) {
     case NOTOK:
-       adios ("fork", "unable to");
+       adios ("fork", "unable to");
        /* NOTREACHED */
 
     case OK:
-       argsplit_msgarg(&args, urlprog, &program);
+       argsplit_msgarg(&args, urlprog, &program);
        app_msgarg(&args, e->eb_url);
        app_msgarg(&args, NULL);
        dup2(fileno(ce->ce_fp), 1);
@@ -2675,7 +2648,7 @@ openURL (CT ct, char **file)
        /* NOTREACHED */
 
     default:
-       if (pidXwait(child_id, NULL)) {
+       if (pidXwait(child_id, NULL)) {
            ce->ce_unlink = 1;
            return NOTOK;
        }
@@ -2840,8 +2813,6 @@ ct_subtype_str (int type, int subtype)
         switch (subtype) {
         case MESSAGE_RFC822:
             return "rfc822";
-        case MESSAGE_PARTIAL:
-            return "partial";
         case MESSAGE_EXTERNAL:
             return "external";
         default:
@@ -3088,7 +3059,7 @@ parse_header_attrs (const char *filename, const char *fieldname,
                continue;
            }
             if (*vp == '*' && vp == up - 1) {
-               encoded = true;
+               encoded = true;
            } else if (partial) {
                if (isdigit((unsigned char) *vp))
                    index = *vp - '0' + index * 10;
@@ -3121,7 +3092,7 @@ parse_header_attrs (const char *filename, const char *fieldname,
             * parameter).
             */
            if (index == 0) {
-               vp = dp;
+               vp = dp;
                while (*vp != '\'' && !isspace((unsigned char) *vp) &&
                                                        *vp != '\0')
                    vp++;
@@ -3251,7 +3222,7 @@ bad_quote:
            valptr = mh_xmalloc(len + 1);
 
            if (*dp == '"') {
-               int i;
+               int i;
                for (cp = dp + 1, vp = valptr, i = 0; i < len; i++) {
                    if (*cp == '\\') {
                        cp++;
@@ -3260,7 +3231,7 @@ bad_quote:
                }
                cp++;
            } else {
-               strncpy(valptr, cp = dp, len);
+               strncpy(valptr, cp = dp, len);
                cp += len;
            }
 
@@ -3334,7 +3305,7 @@ bad_quote:
 
            if (index == 0 && encoded) {
                 free(pp->charset);
-               pp->charset = charset;
+               pp->charset = charset;
                 free(pp->lang);
                pp->lang = lang;
            }
@@ -3358,7 +3329,7 @@ bad_quote:
      */
 
     for (pp = phead; pp != NULL; ) {
-       char *p, *q;
+       char *p, *q;
        size_t tlen = 0;
        int pindex = 0;
        for (sp = pp->sechead; sp != NULL; sp = sp->next) {
@@ -3521,7 +3492,7 @@ output_params(size_t initialwidth, PM params, int *offsetout, int external)
 
        if (index > 0) {
            q += snprintf(q, sizeof(line) - (q - line), "%s*%d",
-                         params->pm_name, index);
+                         params->pm_name, index);
        } else {
            strncpy(q, params->pm_name, sizeof(line) - (q - line));
            q += strlen(q);
@@ -3529,10 +3500,10 @@ output_params(size_t initialwidth, PM params, int *offsetout, int external)
 
        if (encode)
            i = encode_param(params, q, sizeof(line) - (q - line),
-                            strlen(params->pm_value + valoff), valoff, index);
+                            strlen(params->pm_value + valoff), valoff, index);
        else
            i = normal_param(params, q, sizeof(line) - (q - line),
-                            strlen(params->pm_value + valoff), valoff);
+                            strlen(params->pm_value + valoff), valoff);
 
        if (i == 0) {
             free(paramout);
@@ -3660,7 +3631,7 @@ param_len(PM pm, int index, size_t valueoff, int *encode, int *cont,
                len += 3;
                maxfit -= 3;
            } else {
-               len++;
+               len++;
                maxfit--;
            }
            /*
@@ -3673,7 +3644,7 @@ param_len(PM pm, int index, size_t valueoff, int *encode, int *cont,
                fitlimit++;
        }
     } else {
-       /*
+       /*
         * Calculate the string length, but add room for quoting \
         * and " if necessary.  Also account for quotes at beginning
         * and end.
@@ -3682,7 +3653,7 @@ param_len(PM pm, int index, size_t valueoff, int *encode, int *cont,
            switch (*p) {
            case '"':
            case '\\':
-               len++;
+               len++;
                maxfit--;
            /* FALLTHRU */
            default:
@@ -3831,7 +3802,7 @@ add_param(PM *first, PM *last, char *name, char *value, int nocopy)
        (*last)->pm_next = pm;
        *last = pm;
     } else {
-       *first = pm;
+       *first = pm;
        *last = pm;
     }
 
@@ -3876,7 +3847,7 @@ get_param(PM first, const char *name, char replace, int fetchonly)
     while (first != NULL) {
        if (strcasecmp(name, first->pm_name) == 0) {
            if (fetchonly)
-               return first->pm_value;
+               return first->pm_value;
             return getcpy(get_param_value(first, replace));
        }
        first = first->pm_next;
@@ -3913,7 +3884,7 @@ get_param_value(PM pm, char replace)
      */
 
     if (!pm->pm_charset || check_charset(pm->pm_charset,
-                                        strlen(pm->pm_charset))) {
+                                        strlen(pm->pm_charset))) {
        return pm->pm_value;
     }