X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhbuild.c;h=4f764f466c771e92850b3af8f0c30e09957a74fa;hp=01acdb77e030120f951812faafd9efb8fa411ae9;hb=1e99819ed105950cd584c71fa4b2e36b038be102;hpb=4e6362c1749f16f1b09fb04d5951a03c1d9aa9cd diff --git a/uip/mhbuild.c b/uip/mhbuild.c index 01acdb7..4f764f4 100644 --- a/uip/mhbuild.c +++ b/uip/mhbuild.c @@ -312,8 +312,10 @@ unlink_done() static CT build_mime(char *infile) { - int compnum, state; - char buf[BUFSIZ], name[NAMESZ]; + enum state state; + struct field f = {{0}}; + int compnum; + char buf[BUFSIZ]; char *cp, *np, *vp; struct multipart *m; struct part **pp; @@ -324,14 +326,16 @@ build_mime(char *infile) umask(~m_gmprot()); /* open the composition draft */ - if ((in = fopen(infile, "r")) == NULL) + if ((in = fopen(infile, "r")) == NULL) { adios(EX_IOERR, infile, "unable to open for reading"); + } /* ** Allocate space for primary (outside) content */ - if ((ct = (CT) mh_xcalloc(1, sizeof(*ct))) == NULL) + if ((ct = (CT) mh_xcalloc(1, sizeof(*ct))) == NULL) { adios(EX_OSERR, NULL, "out of memory"); + } /* ** Allocate structure for handling decoded content @@ -345,57 +349,45 @@ build_mime(char *infile) ** draft into the linked list of header fields for ** the new MIME message. */ - for (compnum = 1, state = FLD;;) { - switch (state = m_getfld(state, name, buf, sizeof(buf), in)) { - case FLD: - case FLDPLUS: + for (compnum = 1, state = FLD2;;) { + switch (state = m_getfld2(state, &f, in)) { + case FLD2: compnum++; /* abort if draft has Mime-Version header field */ - if (!mh_strcasecmp(name, VRSN_FIELD)) + if (!mh_strcasecmp(f.name, VRSN_FIELD)) { adios(EX_CONFIG, NULL, "draft shouldn't contain %s: field", VRSN_FIELD); + } /* ** abort if draft has Content-Transfer-Encoding ** header field */ - if (!mh_strcasecmp(name, ENCODING_FIELD)) + if (!mh_strcasecmp(f.name, ENCODING_FIELD)) { adios(EX_CONFIG, NULL, "draft shouldn't contain %s: field", ENCODING_FIELD); + } /* ignore any Content-Type fields in the header */ - if (!mh_strcasecmp(name, TYPE_FIELD)) { - while (state == FLDPLUS) - state = m_getfld(state, name, buf, - sizeof(buf), in); + if (!mh_strcasecmp(f.name, TYPE_FIELD)) { continue; } - /* 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 prev value */ - } - - /* Now add the header data to the list */ - add_header(ct, np, vp); + /* add the header data to the list */ + add_header(ct, getcpy(f.name), getcpy(f.value)); continue; - case FILEEOF: + case BODY2: + fseek(in, (long) (-strlen(f.value)), SEEK_CUR); + break; + + case FILEEOF2: adios(EX_CONFIG, NULL, "draft has empty body -- no directives!"); /* NOTREACHED */ - case BODY: - fseek(in, (long) (-strlen(buf)), SEEK_CUR); - break; - - case LENERR: - case FMTERR: + case LENERR2: + case FMTERR2: + case ERR2: adios(EX_CONFIG, NULL, "message format error in component #%d", compnum);