X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/43d9833bf1dcf38c7892a23951bf1d968028a15e..8aeb28b95bce93b69967f612ee437b66b61a332b:/uip/mhparse.c?ds=sidebyside diff --git a/uip/mhparse.c b/uip/mhparse.c index 74ec577f..cb9d2799 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -27,7 +27,6 @@ #include "h/mhparse.h" #include "h/utils.h" #include "mhmisc.h" -#include "h/mhcachesbr.h" #include "sbr/m_mktemp.h" #include "mhfree.h" #ifdef HAVE_ICONV @@ -90,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! */ }; @@ -138,7 +136,7 @@ static int openBase64 (CT, char **); static int InitQuoted (CT); static int openQuoted (CT, char **); static int Init7Bit (CT); -static int openExternal (CT, CT, CE, char **, int *); +static int openExternal (CT, CE, char **, int *); static int InitFile (CT); static int openFile (CT, char **); static int InitFTP (CT); @@ -627,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++) @@ -649,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 != '/') { @@ -663,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++) @@ -686,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; } @@ -778,7 +776,7 @@ magic_skip: */ if (magic && *cp == '*') { - /* + /* * See if it's a CTE we match on */ struct k2v *kv; @@ -876,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; } @@ -893,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); @@ -905,7 +903,7 @@ get_dispo (char *cp, CT ct, int buildflag) } if (buildflag) - free(dispoheader); + free(dispoheader); else ct->c_dispo = dispoheader; @@ -1154,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; @@ -1392,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; @@ -1600,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; } @@ -2242,10 +2214,8 @@ clean_up: */ static int -openExternal (CT ct, CT cb, CE ce, char **file, int *fd) +openExternal (CT ct, CE ce, char **file, int *fd) { - char cachefile[BUFSIZ]; - if (ce->ce_fp) { fseek (ce->ce_fp, 0L, SEEK_SET); goto ready_already; @@ -2259,16 +2229,6 @@ openExternal (CT ct, CT cb, CE ce, char **file, int *fd) goto ready_already; } - if (find_cache(ct, rcachesw, NULL, cb->c_id, - cachefile, sizeof(cachefile)) != NOTOK) { - if ((ce->ce_fp = fopen (cachefile, "r"))) { - ce->ce_file = mh_xstrdup(cachefile); - ce->ce_unlink = 0; - goto ready_already; - } - admonish (cachefile, "unable to fopen for reading"); - } - *fd = ce->ce_fp ? fileno (ce->ce_fp) : -1; return OK; @@ -2292,12 +2252,11 @@ InitFile (CT ct) static int openFile (CT ct, char **file) { - int fd, cachetype; - char cachefile[BUFSIZ]; + int fd; struct exbody *e = ct->c_ctexbody; CE ce = &ct->c_cefile; - switch (openExternal (e->eb_parent, e->eb_content, ce, file, &fd)) { + switch (openExternal (e->eb_parent, ce, file, &fd)) { case NOTOK: return NOTOK; @@ -2321,39 +2280,6 @@ openFile (CT ct, char **file) return NOTOK; } - if ((!e->eb_permission || strcasecmp (e->eb_permission, "read-write")) - && find_cache (NULL, wcachesw, &cachetype, e->eb_content->c_id, - cachefile, sizeof(cachefile)) != NOTOK) { - int mask; - FILE *fp; - - mask = umask (cachetype ? ~m_gmprot () : 0222); - if ((fp = fopen (cachefile, "w"))) { - int cc; - char buffer[BUFSIZ]; - FILE *gp = ce->ce_fp; - - fseek (gp, 0L, SEEK_SET); - - while ((cc = fread (buffer, sizeof(*buffer), sizeof(buffer), gp)) - > 0) - if ((int) fwrite (buffer, sizeof(*buffer), cc, fp) < cc) { - advise ("openFile", "fwrite"); - } - fflush (fp); - - if (ferror (gp)) { - admonish (ce->ce_file, "error reading"); - (void) m_unlink (cachefile); - } else if (ferror (fp)) { - admonish (cachefile, "error writing"); - (void) m_unlink (cachefile); - } - fclose (fp); - } - umask (mask); - } - fseek (ce->ce_fp, 0L, SEEK_SET); *file = ce->ce_file; return fileno (ce->ce_fp); @@ -2373,12 +2299,10 @@ InitFTP (CT ct) static int openFTP (CT ct, char **file) { - int cachetype; - bool caching; int fd; int len, buflen; char *bp, *ftp, *user, *pass; - char buffer[BUFSIZ], cachefile[BUFSIZ]; + char buffer[BUFSIZ]; struct exbody *e; CE ce = &ct->c_cefile; static char *username = NULL; @@ -2392,7 +2316,7 @@ openFTP (CT ct, char **file) if (!ftp) return NOTOK; - switch (openExternal (e->eb_parent, e->eb_content, ce, file, &fd)) { + switch (openExternal (e->eb_parent, ce, file, &fd)) { case NOTOK: return NOTOK; @@ -2450,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 { @@ -2460,21 +2384,9 @@ openFTP (CT ct, char **file) } ce->ce_unlink = (*file == NULL); - caching = false; - cachefile[0] = '\0'; - if ((!e->eb_permission || strcasecmp (e->eb_permission, "read-write")) - && find_cache (NULL, wcachesw, &cachetype, e->eb_content->c_id, - cachefile, sizeof(cachefile)) != NOTOK) { - if (*file == NULL) { - ce->ce_unlink = 0; - caching = true; - } - } if (*file) ce->ce_file = mh_xstrdup(*file); - else if (caching) - ce->ce_file = mh_xstrdup(cachefile); else { char *tempfile; if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) { @@ -2502,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); @@ -2531,40 +2443,6 @@ openFTP (CT ct, char **file) } } - if (cachefile[0]) { - if (caching) - chmod (cachefile, cachetype ? m_gmprot () : 0444); - else { - int mask; - FILE *fp; - - mask = umask (cachetype ? ~m_gmprot () : 0222); - if ((fp = fopen (cachefile, "w"))) { - int cc; - FILE *gp = ce->ce_fp; - - fseek (gp, 0L, SEEK_SET); - - while ((cc= fread (buffer, sizeof(*buffer), sizeof(buffer), gp)) - > 0) - if ((int) fwrite (buffer, sizeof(*buffer), cc, fp) < cc) { - advise ("openFTP", "fwrite"); - } - fflush (fp); - - if (ferror (gp)) { - admonish (ce->ce_file, "error reading"); - (void) m_unlink (cachefile); - } else if (ferror (fp)) { - admonish (cachefile, "error writing"); - (void) m_unlink (cachefile); - } - fclose (fp); - } - umask (mask); - } - } - fseek (ce->ce_fp, 0L, SEEK_SET); *file = ce->ce_file; return fileno (ce->ce_fp); @@ -2591,7 +2469,7 @@ openMail (CT ct, char **file) struct exbody *e = ct->c_ctexbody; CE ce = &ct->c_cefile; - switch (openExternal (e->eb_parent, e->eb_content, ce, file, &fd)) { + switch (openExternal (e->eb_parent, ce, file, &fd)) { case NOTOK: return NOTOK; @@ -2706,23 +2584,20 @@ openURL (CT ct, char **file) struct exbody *e = ct->c_ctexbody; CE ce = &ct->c_cefile; char *urlprog, *program; - char buffer[BUFSIZ], cachefile[BUFSIZ]; int fd; - bool caching; - int cachetype; struct msgs_array args = { 0, 0, NULL}; 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, e->eb_content, ce, file, &fd)) { - case NOTOK: + switch (openExternal(e->eb_parent, ce, file, &fd)) { + case NOTOK: return NOTOK; case OK: @@ -2733,26 +2608,14 @@ 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; } ce->ce_unlink = (*file == NULL); - caching = false; - cachefile[0] = '\0'; - - if (find_cache(NULL, wcachesw, &cachetype, e->eb_content->c_id, - cachefile, sizeof(cachefile)) != NOTOK) { - if (*file == NULL) { - ce->ce_unlink = 0; - caching = true; - } - } if (*file) ce->ce_file = mh_xstrdup(*file); - else if (caching) - ce->ce_file = mh_xstrdup(cachefile); else { char *tempfile; if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) { @@ -2763,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); @@ -2785,43 +2648,12 @@ openURL (CT ct, char **file) /* NOTREACHED */ default: - if (pidXwait(child_id, NULL)) { + if (pidXwait(child_id, NULL)) { ce->ce_unlink = 1; return NOTOK; } } - if (cachefile[0]) { - if (caching) - chmod(cachefile, cachetype ? m_gmprot() : 0444); - else { - int mask; - FILE *fp; - - mask = umask (cachetype ? ~m_gmprot() : 0222); - if ((fp = fopen(cachefile, "w"))) { - int cc; - FILE *gp = ce->ce_fp; - - fseeko(gp, 0, SEEK_SET); - - while ((cc = fread(buffer, sizeof(*buffer), - sizeof(buffer), gp)) > 0) - if ((int) fwrite(buffer, sizeof(*buffer), cc, fp) < cc) { - advise ("openURL", "fwrite"); - } - - fflush(fp); - - if (ferror(gp)) { - admonish(ce->ce_file, "error reading"); - (void) m_unlink (cachefile); - } - } - umask(mask); - } - } - fseeko(ce->ce_fp, 0, SEEK_SET); *file = ce->ce_file; return fileno(ce->ce_fp); @@ -2981,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: @@ -3229,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; @@ -3262,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++; @@ -3392,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++; @@ -3401,7 +3231,7 @@ bad_quote: } cp++; } else { - strncpy(valptr, cp = dp, len); + strncpy(valptr, cp = dp, len); cp += len; } @@ -3475,7 +3305,7 @@ bad_quote: if (index == 0 && encoded) { free(pp->charset); - pp->charset = charset; + pp->charset = charset; free(pp->lang); pp->lang = lang; } @@ -3499,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) { @@ -3662,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); @@ -3670,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); @@ -3801,7 +3631,7 @@ param_len(PM pm, int index, size_t valueoff, int *encode, int *cont, len += 3; maxfit -= 3; } else { - len++; + len++; maxfit--; } /* @@ -3814,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. @@ -3823,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: @@ -3972,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; } @@ -4017,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; @@ -4054,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; }