X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhparse.c;h=ece4e8fe6dfae7ad84588b3d39dd92548552b461;hp=db6f0ad92449f5427601c51aceaa885c3ff04252;hb=5b92ee6942b9b466914f5faa5fa4c00a2ebc6d35;hpb=714b5c530ece27ea2835a313013f5b770163403c diff --git a/uip/mhparse.c b/uip/mhparse.c index db6f0ad..ece4e8f 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -89,9 +88,6 @@ struct k2v SubApplication[] = { }; -/* ftpsbr.c */ -int ftp_get(char *, char *, char *, char *, char *, char *, int, int); - /* mhcachesbr.c */ int find_cache(CT, int, int *, char *, char *, int); @@ -199,13 +195,13 @@ parse_mime(char *file) /* ** Check if file is actually standard input */ - if ((is_stdin = !(strcmp(file, "-")))) { + if ((is_stdin = (strcmp(file, "-")==0))) { char *tfile = m_mktemp2(NULL, invo_name, NULL, &fp); if (tfile == NULL) { advise("mhparse", "unable to create temporary file"); return NULL; } - file = add(tfile, NULL); + file = getcpy(tfile); chmod(file, 0600); while (fgets(buffer, sizeof(buffer), stdin)) @@ -281,7 +277,7 @@ get_content(FILE *in, char *file, int toplevel) adios(NULL, "out of memory"); ct->c_fp = in; - ct->c_file = add(file, NULL); + ct->c_file = getcpy(file); ct->c_begin = ftell(ct->c_fp) + 1; /* @@ -296,8 +292,8 @@ get_content(FILE *in, char *file, int toplevel) compnum++; /* get copies of the buffers */ - np = add(name, NULL); - vp = add(buf, NULL); + np = getcpy(name); + vp = getcpy(buf); /* if necessary, get rest of field */ while (state == FLDPLUS) { @@ -357,7 +353,7 @@ get_content(FILE *in, char *file, int toplevel) advise(NULL, "message %s has multiple %s: fields", ct->c_file, VRSN_FIELD); goto next_header; } - ct->c_vrsn = add(hp->value, NULL); + ct->c_vrsn = getcpy(hp->value); /* Now, cleanup this field */ cp = ct->c_vrsn; @@ -429,7 +425,7 @@ get_content(FILE *in, char *file, int toplevel) } /* get copy of this field */ - ct->c_celine = cp = add(hp->value, NULL); + ct->c_celine = cp = getcpy(hp->value); while (isspace(*cp)) cp++; @@ -467,7 +463,7 @@ get_content(FILE *in, char *file, int toplevel) goto next_header; } - ep = cp = add(hp->value, NULL); /* get a copy */ + ep = cp = getcpy(hp->value); while (isspace(*cp)) cp++; @@ -615,7 +611,7 @@ incl_name_value(unsigned char *buf, char *name, char *value) { ** Insert at first semicolon, if any. ** If none, append to end. */ - prefix = add(buf, NULL); + prefix = getcpy(buf); if ((cp = strchr(prefix, ';'))) { suffix = concat(cp, NULL); *cp = '\0'; @@ -688,7 +684,7 @@ get_ctinfo(unsigned char *cp, CT ct, int magic) i = strlen(invo_name) + 2; /* store copy of Content-Type line */ - cp = ct->c_ctline = add(cp, NULL); + cp = ct->c_ctline = getcpy(cp); while (isspace(*cp)) /* trim leading spaces */ cp++; @@ -712,7 +708,7 @@ get_ctinfo(unsigned char *cp, CT ct, int magic) for (dp = cp; istoken(*dp); dp++) continue; c = *dp, *dp = '\0'; - ci->ci_type = add(cp, NULL); /* store content type */ + ci->ci_type = getcpy(cp); /* store content type */ *dp = c, cp = dp; if (!*ci->ci_type) { @@ -734,7 +730,7 @@ get_ctinfo(unsigned char *cp, CT ct, int magic) if (*cp != '/') { if (!magic) - ci->ci_subtype = add("", NULL); + ci->ci_subtype = getcpy(""); goto magic_skip; } @@ -748,7 +744,7 @@ get_ctinfo(unsigned char *cp, CT ct, int magic) for (dp = cp; istoken(*dp); dp++) continue; c = *dp, *dp = '\0'; - ci->ci_subtype = add(cp, NULL); /* store the content subtype */ + ci->ci_subtype = getcpy(cp); /* store the content subtype */ *dp = c, cp = dp; if (!*ci->ci_subtype) { @@ -805,7 +801,7 @@ magic_skip: return NOTOK; } - vp = (*ap = add(cp, NULL)) + (up - cp); + vp = (*ap = getcpy(cp)) + (up - cp); *vp = '\0'; for (dp++; isspace(*dp);) dp++; @@ -816,24 +812,24 @@ magic_skip: if (*dp == '"') { for (cp = ++dp, dp = vp;;) { switch (c = *cp++) { - case '\0': + case '\0': bad_quote: - advise(NULL, "invalid quoted-string in message %s's %s: field\n%*.*s(parameter %s)", ct->c_file, TYPE_FIELD, i, i, "", *ap); - return NOTOK; + advise(NULL, "invalid quoted-string in message %s's %s: field\n%*.*s(parameter %s)", ct->c_file, TYPE_FIELD, i, i, "", *ap); + return NOTOK; - case '\\': - *dp++ = c; - if ((c = *cp++) == '\0') - goto bad_quote; - /* else fall... */ + case '\\': + *dp++ = c; + if ((c = *cp++) == '\0') + goto bad_quote; + /* else fall... */ - default: - *dp++ = c; - continue; + default: + *dp++ = c; + continue; - case '"': - *dp = '\0'; - break; + case '"': + *dp = '\0'; + break; } break; } @@ -941,16 +937,16 @@ bad_quote: */ if (*cp) { if (magic) { - ci->ci_magic = add(cp, NULL); + ci->ci_magic = getcpy(cp); /* ** If there is a Content-Disposition header and ** it doesn't have a *filename=, extract it from - ** the magic contents. The r1bindex call skips + ** the magic contents. The mhbasename call skips ** any leading directory components. */ if (ct->c_dispo) - ct->c_dispo = incl_name_value(ct->c_dispo, "filename", r1bindex(extract_name_value("name", ci->ci_magic), '/')); + ct->c_dispo = incl_name_value(ct->c_dispo, "filename", mhbasename(extract_name_value("name", ci->ci_magic))); } else advise(NULL, "extraneous information in message %s's %s: field\n%*.*s(%s)", ct->c_file, TYPE_FIELD, i, i, "", cp); } @@ -1010,7 +1006,7 @@ invalid: ci->ci_comment = concat(dp, " ", buffer, NULL); free(dp); } else { - ci->ci_comment = add(buffer, NULL); + ci->ci_comment = getcpy(buffer); } } @@ -1197,7 +1193,7 @@ InitMultiPart(CT ct) if (buffer[0] != '-' || buffer[1] != '-') continue; if (inout) { - if (strcmp(buffer + 2, m->mp_start)) + if (strcmp(buffer + 2, m->mp_start)!=0) continue; next_part: if ((part = (struct part *) calloc(1, sizeof(*part))) @@ -1276,7 +1272,7 @@ last_part: p = part->mp_part; sprintf(pp, "%d", partnum); - p->c_partno = add(partnam, NULL); + p->c_partno = getcpy(partnam); /* initialize the content of the subparts */ if (p->c_ctinitfnx && (*p->c_ctinitfnx) (p) == NOTOK) { @@ -1365,137 +1361,133 @@ InitMessage(CT ct) ct->c_subtype = kv->kv_value; switch (ct->c_subtype) { - case MESSAGE_RFC822: - break; + case MESSAGE_RFC822: + break; - case MESSAGE_PARTIAL: - { - char **ap, **ep; - struct partial *p; + case MESSAGE_PARTIAL: + { + char **ap, **ep; + struct partial *p; - if ((p = (struct partial *) - calloc(1, sizeof(*p))) == NULL) - adios(NULL, "out of memory"); - ct->c_ctparams = (void *) p; + if ((p = (struct partial *) calloc(1, sizeof(*p))) == NULL) + adios(NULL, "out of memory"); + ct->c_ctparams = (void *) p; - /* - ** scan for parameters "id", "number", - ** and "total" - */ - for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { - if (!mh_strcasecmp(*ap, "id")) { - p->pm_partid = add(*ep, NULL); - continue; - } - if (!mh_strcasecmp(*ap, "number")) { - if (sscanf(*ep, "%d", &p->pm_partno) != 1 || p->pm_partno < 1) { + /* + ** scan for parameters "id", "number", + ** and "total" + */ + for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { + if (!mh_strcasecmp(*ap, "id")) { + p->pm_partid = getcpy(*ep); + continue; + } + if (!mh_strcasecmp(*ap, "number")) { + if (sscanf(*ep, "%d", &p->pm_partno) != 1 || p->pm_partno < 1) { invalid_param: - advise(NULL, "invalid %s parameter for \"%s/%s\" type in message %s's %s field", *ap, ci->ci_type, ci->ci_subtype, ct->c_file, TYPE_FIELD); - return NOTOK; - } - continue; - } - if (!mh_strcasecmp(*ap, "total")) { - if (sscanf(*ep, "%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)) { - advise(NULL, "invalid parameters for \"%s/%s\" type in message %s's %s field", ci->ci_type, ci->ci_subtype, ct->c_file, TYPE_FIELD); + advise(NULL, "invalid %s parameter for \"%s/%s\" type in message %s's %s field", *ap, ci->ci_type, ci->ci_subtype, ct->c_file, TYPE_FIELD); return NOTOK; } + continue; } - break; - - case MESSAGE_EXTERNAL: - { - int exresult; - struct exbody *e; - CT p; - FILE *fp; + if (!mh_strcasecmp(*ap, "total")) { + if (sscanf(*ep, "%d", &p->pm_maxno) != 1 || + p->pm_maxno < 1) + goto invalid_param; + continue; + } + } - if ((e = (struct exbody *) - calloc(1, sizeof(*e))) == NULL) - adios(NULL, "out of memory"); - ct->c_ctparams = (void *) e; + if (!p->pm_partid || !p->pm_partno + || (p->pm_maxno && p->pm_partno > p->pm_maxno)) { + advise(NULL, "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; - if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) { - advise(ct->c_file, "unable to open for reading"); - return NOTOK; - } + case MESSAGE_EXTERNAL: + { + int exresult; + struct exbody *e; + CT p; + FILE *fp; - fseek(fp = ct->c_fp, ct->c_begin, SEEK_SET); + if ((e = (struct exbody *) calloc(1, sizeof(*e))) == NULL) + adios(NULL, "out of memory"); + ct->c_ctparams = (void *) e; - if (!(p = get_content(fp, ct->c_file, 0))) { - ct->c_fp = NULL; - return NOTOK; - } + if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) { + advise(ct->c_file, "unable to open for reading"); + return NOTOK; + } - e->eb_parent = ct; - e->eb_content = p; - p->c_ctexbody = e; - if ((exresult = params_external(ct, 0)) - != NOTOK && - p->c_ceopenfnx == openMail) { - int cc, size; - char *bp; - - if ((size = ct->c_end - p->c_begin) <= 0) { - if (!e->eb_subject) - content_error(NULL, ct, "empty body for access-type=mail-server"); - goto no_body; - } + fseek(fp = ct->c_fp, ct->c_begin, SEEK_SET); - e->eb_body = bp = mh_xmalloc((unsigned) size); - fseek(p->c_fp, p->c_begin, SEEK_SET); - while (size > 0) - switch (cc = fread(bp, sizeof(*bp), size, p->c_fp)) { - case NOTOK: - adios("failed", "fread"); + if (!(p = get_content(fp, ct->c_file, 0))) { + ct->c_fp = NULL; + return NOTOK; + } - case OK: - adios(NULL, "unexpected EOF from fread"); + e->eb_parent = ct; + e->eb_content = p; + p->c_ctexbody = e; + if ((exresult = params_external(ct, 0)) != NOTOK && + p->c_ceopenfnx == openMail) { + int cc, size; + char *bp; + + if ((size = ct->c_end - p->c_begin) <= 0) { + if (!e->eb_subject) + content_error(NULL, ct, "empty body for access-type=mail-server"); + goto no_body; + } - default: - bp += cc, size -= cc; - break; - } - *bp = 0; + e->eb_body = bp = mh_xmalloc((unsigned) size); + fseek(p->c_fp, p->c_begin, SEEK_SET); + while (size > 0) + switch (cc = fread(bp, sizeof(*bp), size, p->c_fp)) { + case NOTOK: + adios("failed", "fread"); + case OK: + adios(NULL, "unexpected EOF from fread"); + default: + bp += cc, size -= cc; + break; } + *bp = 0; + } no_body: - p->c_fp = NULL; - p->c_end = p->c_begin; + p->c_fp = NULL; + p->c_end = p->c_begin; - fclose(ct->c_fp); - ct->c_fp = NULL; + fclose(ct->c_fp); + ct->c_fp = NULL; - if (exresult == NOTOK) - return NOTOK; - if (e->eb_flags == NOTOK) - return OK; - - switch (p->c_type) { - case CT_MULTIPART: - break; + if (exresult == NOTOK) + return NOTOK; + if (e->eb_flags == NOTOK) + return OK; - case CT_MESSAGE: - if (p->c_subtype != MESSAGE_RFC822) - break; - /* else fall... */ - default: - e->eb_partno = ct->c_partno; - if (p->c_ctinitfnx) - (*p->c_ctinitfnx) (p); - break; - } - } + switch (p->c_type) { + case CT_MULTIPART: break; + case CT_MESSAGE: + if (p->c_subtype != MESSAGE_RFC822) + break; + /* else fall... */ default: + e->eb_partno = ct->c_partno; + if (p->c_ctinitfnx) + (*p->c_ctinitfnx) (p); break; + } + } + break; + + default: + break; } return OK; @@ -1740,10 +1732,10 @@ openBase64(CT ct, char **file) } if (*file == NULL) { - ce->ce_file = add(m_mktemp(tmp, NULL, NULL), NULL); + ce->ce_file = getcpy(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { - ce->ce_file = add(*file, NULL); + ce->ce_file = getcpy(*file); ce->ce_unlink = 0; } @@ -1960,10 +1952,10 @@ openQuoted(CT ct, char **file) } if (*file == NULL) { - ce->ce_file = add(m_mktemp(tmp, NULL, NULL), NULL); + ce->ce_file = getcpy(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { - ce->ce_file = add(*file, NULL); + ce->ce_file = getcpy(*file); ce->ce_unlink = 0; } @@ -2195,10 +2187,10 @@ open7Bit(CT ct, char **file) } if (*file == NULL) { - ce->ce_file = add(m_mktemp(tmp, NULL, NULL), NULL); + ce->ce_file = getcpy(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { - ce->ce_file = add(*file, NULL); + ce->ce_file = getcpy(*file); ce->ce_unlink = 0; } @@ -2399,14 +2391,12 @@ openFile(CT ct, char **file) CE ce = ct->c_cefile; switch (openExternal(e->eb_parent, e->eb_content, ce, file, &fd)) { - case NOTOK: - return NOTOK; - - case OK: - break; - - case DONE: - return fd; + case NOTOK: + return NOTOK; + case OK: + break; + case DONE: + return fd; } if (!e->eb_name) { @@ -2482,6 +2472,8 @@ openFTP(CT ct, char **file) CE ce; static char *username = NULL; static char *password = NULL; + int child_id, vecp; + char *vec[9]; e = ct->c_ctexbody; ce = ct->c_cefile; @@ -2489,20 +2481,16 @@ openFTP(CT ct, char **file) if ((ftp = context_find(nmhaccessftp)) && !*ftp) ftp = NULL; -#ifndef BUILTIN_FTP if (!ftp) return NOTOK; -#endif switch (openExternal(e->eb_parent, e->eb_content, ce, file, &fd)) { - case NOTOK: - return NOTOK; - - case OK: - break; - - case DONE: - return fd; + case NOTOK: + return NOTOK; + case OK: + break; + case DONE: + return fd; } if (!e->eb_name || !e->eb_site) { @@ -2583,11 +2571,11 @@ openFTP(CT ct, char **file) } if (*file) - ce->ce_file = add(*file, NULL); + ce->ce_file = getcpy(*file); else if (caching) - ce->ce_file = add(cachefile, NULL); + ce->ce_file = getcpy(cachefile); else - ce->ce_file = add(m_mktemp(tmp, NULL, NULL), NULL); + ce->ce_file = getcpy(m_mktemp(tmp, NULL, NULL)); if ((ce->ce_fp = fopen(ce->ce_file, "w+")) == NULL) { content_error (ce->ce_file, ct, @@ -2595,61 +2583,42 @@ openFTP(CT ct, char **file) return NOTOK; } -#ifdef BUILTIN_FTP - if (ftp) -#endif - { - int child_id, i, vecp; - char *vec[9]; - - vecp = 0; - vec[vecp++] = r1bindex(ftp, '/'); - vec[vecp++] = e->eb_site; - vec[vecp++] = user; - vec[vecp++] = pass; - vec[vecp++] = e->eb_dir; - vec[vecp++] = e->eb_name; - vec[vecp++] = ce->ce_file, - vec[vecp++] = e->eb_mode && - !mh_strcasecmp(e->eb_mode, "ascii") ? - "ascii" : "binary"; - vec[vecp] = NULL; - - fflush(stdout); - - for (i = 0; (child_id = vfork()) == NOTOK && i < 5; i++) - sleep(5); - switch (child_id) { - case NOTOK: - adios("fork", "unable to"); - /* NOTREACHED */ - - case OK: - close(fileno(ce->ce_fp)); - execvp(ftp, vec); - fprintf(stderr, "unable to exec "); - perror(ftp); - _exit(-1); - /* NOTREACHED */ - - default: - if (pidXwait(child_id, NULL)) { -#ifdef BUILTIN_FTP -losing_ftp: -#endif - username = password = NULL; - ce->ce_unlink = 1; - return NOTOK; - } - break; + vecp = 0; + vec[vecp++] = mhbasename(ftp); + vec[vecp++] = e->eb_site; + vec[vecp++] = user; + vec[vecp++] = pass; + vec[vecp++] = e->eb_dir; + vec[vecp++] = e->eb_name; + vec[vecp++] = ce->ce_file, + vec[vecp++] = e->eb_mode && + !mh_strcasecmp(e->eb_mode, "ascii") ? + "ascii" : "binary"; + vec[vecp] = NULL; + + fflush(stdout); + + switch (child_id = fork()) { + case NOTOK: + adios("fork", "unable to"); + /* NOTREACHED */ + + case OK: + close(fileno(ce->ce_fp)); + execvp(ftp, vec); + fprintf(stderr, "unable to exec "); + perror(ftp); + _exit(-1); + /* NOTREACHED */ + + default: + if (pidXwait(child_id, NULL)) { + username = password = NULL; + ce->ce_unlink = 1; + return NOTOK; } + break; } -#ifdef BUILTIN_FTP - else if (ftp_get(e->eb_site, user, pass, e->eb_dir, e->eb_name, - ce->ce_file, e->eb_mode && !mh_strcasecmp(e->eb_mode, - "ascii"), 0) == NOTOK) - goto losing_ftp; -#endif if (cachefile[0]) { if (caching) @@ -2703,21 +2672,19 @@ InitMail(CT ct) static int openMail(CT ct, char **file) { - int child_id, fd, i, vecp; + int child_id, fd, vecp; int len, buflen; char *bp, buffer[BUFSIZ], *vec[7]; struct exbody *e = ct->c_ctexbody; CE ce = ct->c_cefile; switch (openExternal(e->eb_parent, e->eb_content, ce, file, &fd)) { - case NOTOK: - return NOTOK; - - case OK: - break; - - case DONE: - return fd; + case NOTOK: + return NOTOK; + case OK: + break; + case DONE: + return fd; } if (!e->eb_server) { @@ -2757,7 +2724,7 @@ openMail(CT ct, char **file) return NOTOK; vecp = 0; - vec[vecp++] = r1bindex(mailproc, '/'); + vec[vecp++] = "mhmail"; vec[vecp++] = e->eb_server; vec[vecp++] = "-subject"; vec[vecp++] = e->eb_subject ? e->eb_subject : "mail-server request"; @@ -2765,31 +2732,29 @@ openMail(CT ct, char **file) vec[vecp++] = e->eb_body; vec[vecp] = NULL; - for (i = 0; (child_id = vfork()) == NOTOK && i < 5; i++) - sleep(5); - switch (child_id) { - case NOTOK: - advise("fork", "unable to"); - return NOTOK; + switch (child_id = fork()) { + case NOTOK: + advise("fork", "unable to"); + return NOTOK; - case OK: - execvp(mailproc, vec); - fprintf(stderr, "unable to exec "); - perror(mailproc); - _exit(-1); - /* NOTREACHED */ + case OK: + execvp(*vec, vec); + fprintf(stderr, "unable to exec "); + perror(*vec); + _exit(-1); + /* NOTREACHED */ - default: - if (pidXwait(child_id, NULL) == OK) - advise(NULL, "request sent"); - break; + default: + if (pidXwait(child_id, NULL) == OK) + advise(NULL, "request sent"); + break; } if (*file == NULL) { - ce->ce_file = add(m_mktemp(tmp, NULL, NULL), NULL); + ce->ce_file = getcpy(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { - ce->ce_file = add(*file, NULL); + ce->ce_file = getcpy(*file); ce->ce_unlink = 0; } @@ -2805,7 +2770,7 @@ openMail(CT ct, char **file) */ if (ct->c_showproc) free(ct->c_showproc); - ct->c_showproc = add("true", NULL); + ct->c_showproc = getcpy("true"); fseek(ce->ce_fp, 0L, SEEK_SET); *file = ce->ce_file; @@ -2833,36 +2798,36 @@ readDigest(CT ct, char *cp) for (ep = (dp = ct->c_digest) + sizeof(ct->c_digest) / sizeof(ct->c_digest[0]); *cp; cp++) switch (*cp) { - default: - if (skip || (*cp & 0x80) || - (value = b642nib[*cp & 0x7f]) - > 0x3f) { - if (debugsw) - fprintf(stderr, "invalid BASE64 encoding\n"); - return NOTOK; - } + default: + if (skip || (*cp & 0x80) || + (value = b642nib[*cp & 0x7f]) + > 0x3f) { + if (debugsw) + fprintf(stderr, "invalid BASE64 encoding\n"); + return NOTOK; + } - bits |= value << bitno; + bits |= value << bitno; test_end: - if ((bitno -= 6) < 0) { - if (dp + (3 - skip) > ep) - goto invalid_digest; - *dp++ = *b1; - if (skip < 2) { - *dp++ = *b2; - if (skip < 1) - *dp++ = *b3; - } - bitno = 18; - bits = 0L; - skip = 0; + if ((bitno -= 6) < 0) { + if (dp + (3 - skip) > ep) + goto invalid_digest; + *dp++ = *b1; + if (skip < 2) { + *dp++ = *b2; + if (skip < 1) + *dp++ = *b3; } - break; + bitno = 18; + bits = 0L; + skip = 0; + } + break; - case '=': - if (++skip > 3) - goto self_delimiting; - goto test_end; + case '=': + if (++skip > 3) + goto self_delimiting; + goto test_end; } if (bitno != 18) { if (debugsw)