#include <h/mime.h>
#include <h/mhparse.h>
#include <h/utils.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <sysexits.h>
extern int debugsw;
fflush(stdout);
fflush(stderr);
- exit(1);
+ exit(EX_SOFTWARE);
return 1;
}
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 = {{0}};
+ 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);
** 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);
+ /* add the header data to the list */
+ add_header(ct, getcpy(f.name), getcpy(f.value));
- /* 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 */
- }
-
- /* 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;
}
}
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++;
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 */
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 */
}
/* 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 */
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;
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 */
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;
/*
{
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;
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);
}
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) {
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);
}
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) {
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);
}
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) {