X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhparse.c;h=04333f49b2f069943312b8f9ea9f9d090a692351;hp=cf264c6f2f433a5b3b934db6062364899cab473b;hb=a87df3543d3bc128ba4079d1f95638476ba5ca50;hpb=55e1d8c654ee0f7c45b9361ce34617983b454c32 diff --git a/uip/mhparse.c b/uip/mhparse.c index cf264c6..04333f4 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -8,14 +8,16 @@ #include #include -#include -#include -#include #include +#include #include #include #include #include +#include +#include +#include +#include extern int debugsw; @@ -137,7 +139,7 @@ pidcheck(int status) fflush(stdout); fflush(stderr); - done(1); + exit(EX_SOFTWARE); return 1; } @@ -229,15 +231,14 @@ parse_mime(char *file) static CT get_content(FILE *in, char *file, int toplevel) { - int compnum, state; - char buf[BUFSIZ], name[NAMESZ]; - char *np, *vp; + enum state state; + struct field f = free_field; + int compnum; CT ct; HF hp; /* allocate the content structure */ - if (!(ct = (CT) calloc(1, sizeof(*ct)))) - adios(NULL, "out of memory"); + ct = (CT) mh_xcalloc(1, sizeof(*ct)); ct->c_fp = in; ct->c_file = getcpy(file); @@ -247,53 +248,34 @@ get_content(FILE *in, char *file, int toplevel) ** Parse the header fields for this ** content into a linked list. */ - for (compnum = 1, state = FLD;;) { - switch (state = m_getfld(state, name, buf, sizeof(buf), in)) { - case FLD: - case FLDPLUS: - case FLDEOF: + for (compnum = 1, state = FLD2;;) { + switch (state = m_getfld2(state, &f, in)) { + case FLD2: compnum++; - /* get copies of the buffers */ - np = getcpy(name); - vp = getcpy(buf); - - /* if necessary, get rest of field */ - while (state == FLDPLUS) { - state = m_getfld(state, name, buf, - sizeof(buf), in); - vp = add(buf, vp); /* add to previous value */ - } + /* add the header data to the list */ + add_header(ct, getcpy(f.name), getcpy(f.value)); - /* Now add the header data to the list */ - add_header(ct, np, vp); - - /* continue, if this isn't the last header field */ - if (state != FLDEOF) { - ct->c_begin = ftell(in) + 1; - continue; - } - /* else fall... */ + ct->c_begin = ftell(in) + 1; + continue; - case BODY: - case BODYEOF: - ct->c_begin = ftell(in) - strlen(buf); + case BODY2: + ct->c_begin = ftell(in) - strlen(f.value); break; - case FILEEOF: + case FILEEOF2: ct->c_begin = ftell(in); break; - case LENERR: - case FMTERR: - adios(NULL, "message format error in component #%d", + case LENERR2: + case FMTERR2: + case IOERR2: + adios(EX_DATAERR, NULL, "message format error in component #%d", compnum); default: - adios(NULL, "getfld() returned %d", state); + adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } - - /* break out of the loop */ break; } @@ -764,7 +746,9 @@ bad_quote: } if (!*vp) { advise(NULL, "invalid parameter in message %s's %s: field\n%*.*s(parameter %s)", ct->c_file, TYPE_FIELD, i, i, "", *ap); - return NOTOK; + *ci->ci_values[ap - ci->ci_attrs] = '\0'; + *ci->ci_attrs[ap - ci->ci_attrs] = '\0'; + continue; } ap++; @@ -963,9 +947,7 @@ InitGeneric(CT ct) static int InitText(CT ct) { - char buffer[BUFSIZ]; - char *chset = NULL; - char **ap, **ep, *cp; + char **ap, **ep; struct k2v *kv; struct text *t; CI ci = &ct->c_ctinfo; @@ -981,8 +963,7 @@ InitText(CT ct) ct->c_subtype = kv->kv_value; /* allocate text character set structure */ - if ((t = (struct text *) calloc(1, sizeof(*t))) == NULL) - adios(NULL, "out of memory"); + t = (struct text *) mh_xcalloc(1, sizeof(*t)); ct->c_ctparams = (void *) t; /* scan for charset parameter */ @@ -992,10 +973,11 @@ InitText(CT ct) /* check if content specified a character set */ if (*ap) { + /* store its name */ + ct->c_charset = getcpy(norm_charmap(*ep)); /* match character set or set to CHARSET_UNKNOWN */ for (kv = Charset; kv->kv_key; kv++) { if (!mh_strcasecmp(*ep, kv->kv_key)) { - chset = *ep; break; } } @@ -1004,20 +986,6 @@ InitText(CT ct) t->tx_charset = CHARSET_UNSPECIFIED; } - /* - ** If we can not handle character set natively, - ** then check profile for string to modify the - ** terminal or display method. - ** - ** termproc is for mhshow, though mhlist -debug prints it, too. - */ - if (chset != NULL && !check_charset(chset, strlen(chset))) { - snprintf(buffer, sizeof(buffer), "%s-charset-%s", - invo_name, chset); - if ((cp = context_find(buffer))) - ct->c_termproc = getcpy(cp); - } - return OK; } @@ -1048,7 +1016,7 @@ InitMultiPart(CT ct) if (ct->c_encoding != CE_7BIT && ct->c_encoding != CE_8BIT && ct->c_encoding != CE_BINARY) { admonish(NULL, "\"%s/%s\" type in message %s must be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); - return NOTOK; + ct->c_encoding = CE_7BIT; } /* match subtype */ @@ -1076,8 +1044,7 @@ InitMultiPart(CT ct) } /* allocate primary structure for multipart info */ - if ((m = (struct multipart *) calloc(1, sizeof(*m))) == NULL) - adios(NULL, "out of memory"); + m = (struct multipart *) mh_xcalloc(1, sizeof(*m)); ct->c_ctparams = (void *) m; /* check if boundary parameter contains only whitespace characters */ @@ -1120,9 +1087,7 @@ InitMultiPart(CT ct) if (strcmp(buffer + 2, m->mp_start)!=0) continue; next_part: - if ((part = (struct part *) calloc(1, sizeof(*part))) - == NULL) - adios(NULL, "out of memory"); + part = (struct part *) mh_xcalloc(1, sizeof(*part)); *next = part; next = &part->mp_next; @@ -1236,8 +1201,7 @@ reverse_parts(CT ct) i++; /* allocate array of pointers to the parts */ - if (!(base = (struct part **) calloc((size_t) (i + 1), sizeof(*base)))) - adios(NULL, "out of memory"); + base = (struct part **) mh_xcalloc((size_t) (i + 1), sizeof(*base)); bmp = base; /* point at all the parts */ @@ -1293,8 +1257,7 @@ InitMessage(CT ct) char **ap, **ep; struct partial *p; - if ((p = (struct partial *) calloc(1, sizeof(*p))) == NULL) - adios(NULL, "out of memory"); + p = (struct partial *) mh_xcalloc(1, sizeof(*p)); ct->c_ctparams = (void *) p; /* @@ -1406,8 +1369,7 @@ init_encoding(CT ct, OpenCEFunc openfnx) { CE ce; - if ((ce = (CE) calloc(1, sizeof(*ce))) == NULL) - adios(NULL, "out of memory"); + ce = (CE) mh_xcalloc(1, sizeof(*ce)); ct->c_cefile = ce; ct->c_ceopenfnx = openfnx; @@ -1551,7 +1513,7 @@ openBase64(CT ct, char **file) cp = context_find(buffer); if (cp == NULL || *cp == '\0') { snprintf(buffer, sizeof(buffer), "%s-suffix-%s", invo_name, - ci->ci_type); + ci->ci_type); cp = context_find(buffer); } if (cp != NULL && *cp != '\0') { @@ -1563,7 +1525,7 @@ openBase64(CT ct, char **file) char *file_org = strdup(ce->ce_file); ce->ce_file = add(cp, ce->ce_file); if (rename(file_org, ce->ce_file)) { - adios(ce->ce_file, "unable to rename %s to ", + adios(EX_IOERR, ce->ce_file, "unable to rename %s to ", file_org); } free(file_org); @@ -1580,7 +1542,7 @@ openBase64(CT ct, char **file) } if ((len = ct->c_end - ct->c_begin) < 0) - adios(NULL, "internal error(1)"); + adios(EX_SOFTWARE, NULL, "internal error(1)"); if (!ct->c_fp) { if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) { @@ -1767,12 +1729,14 @@ openQuoted(CT ct, char **file) } if (cp != NULL && *cp != '\0') { if (ce->ce_unlink) { - // Temporary file already exists, so we rename to - // version with extension. + /* + ** Temporary file already exists, so we rename to + ** version with extension. + */ char *file_org = strdup(ce->ce_file); ce->ce_file = add(cp, ce->ce_file); if (rename(file_org, ce->ce_file)) { - adios(ce->ce_file, "unable to rename %s to ", + adios(EX_IOERR, ce->ce_file, "unable to rename %s to ", file_org); } free(file_org); @@ -1789,7 +1753,7 @@ openQuoted(CT ct, char **file) } if ((len = ct->c_end - ct->c_begin) < 0) - adios(NULL, "internal error(2)"); + adios(EX_SOFTWARE, NULL, "internal error(2)"); if (!ct->c_fp) { if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) { @@ -1977,7 +1941,7 @@ open7Bit(CT ct, char **file) cp = context_find(buffer); if (cp == NULL || *cp == '\0') { snprintf(buffer, sizeof(buffer), "%s-suffix-%s", invo_name, - ci->ci_type); + ci->ci_type); cp = context_find(buffer); } if (cp != NULL && *cp != '\0') { @@ -1989,7 +1953,7 @@ open7Bit(CT ct, char **file) char *file_org = strdup(ce->ce_file); ce->ce_file = add(cp, ce->ce_file); if (rename(file_org, ce->ce_file)) { - adios(ce->ce_file, "unable to rename %s to ", + adios(EX_IOERR, ce->ce_file, "unable to rename %s to ", file_org); } free(file_org); @@ -2055,7 +2019,7 @@ open7Bit(CT ct, char **file) } if ((len = ct->c_end - ct->c_begin) < 0) - adios(NULL, "internal error(3)"); + adios(EX_SOFTWARE, NULL, "internal error(3)"); if (!ct->c_fp) { if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) {