extern int debugsw;
-extern pid_t xpid; /* mhshowsbr.c */
-
/* cache policies */
extern int rcachesw; /* mhcachesbr.c */
extern int wcachesw; /* mhcachesbr.c */
static int InitGeneric (CT);
static int InitText (CT);
static int InitMultiPart (CT);
-void reverse_parts (CT);
+static void reverse_parts (CT);
static int InitMessage (CT);
static int InitApplication (CT);
static int init_encoding (CT, OpenCEFunc);
};
-int
-pidcheck (int status)
-{
- if ((status & 0xff00) == 0xff00 || (status & 0x007f) != SIGQUIT)
- return status;
-
- fflush (stdout);
- fflush (stderr);
- done (1);
- return 1;
-}
-
-
/*
* Main entry point for parsing a MIME message or file.
* It returns the Content structure for the top level
char buffer[BUFSIZ];
FILE *fp;
CT ct;
+ size_t n;
/*
* Check if file is actually standard input
}
file = add (tfile, NULL);
- while (fgets (buffer, sizeof(buffer), stdin))
- fputs (buffer, fp);
+ while ((n = fread(buffer, 1, sizeof(buffer), stdin)) > 0) {
+ if (fwrite(buffer, 1, n, fp) != n) {
+ (void) m_unlink (file);
+ advise (file, "error copying to temporary file");
+ return NULL;
+ }
+ }
fflush (fp);
if (ferror (stdin)) {
long last, pos;
char *cp, *dp;
PM pm;
- char *bp, buffer[BUFSIZ];
+ char *bp;
+ char *bufp = NULL;
+ size_t buflen;
+ ssize_t gotlen;
struct multipart *m;
struct k2v *kv;
struct part *part, **next;
part = NULL;
inout = 1;
- while (fgets (buffer, sizeof(buffer) - 1, fp)) {
+ while ((gotlen = getline(&bufp, &buflen, fp)) != -1) {
if (pos > last)
break;
- pos += strlen (buffer);
- if (buffer[0] != '-' || buffer[1] != '-')
+ pos += gotlen;
+ if (bufp[0] != '-' || bufp[1] != '-')
continue;
if (inout) {
- if (strcmp (buffer + 2, m->mp_start))
+ if (strcmp (bufp + 2, m->mp_start))
continue;
next_part:
if ((part = (struct part *) calloc (1, sizeof(*part))) == NULL)
if (!(p = get_content (fp, ct->c_file,
ct->c_subtype == MULTI_DIGEST ? -1 : 0))) {
+ free(bufp);
+ fclose (ct->c_fp);
ct->c_fp = NULL;
return NOTOK;
}
fseek (fp, pos, SEEK_SET);
inout = 0;
} else {
- if (strcmp (buffer + 2, m->mp_start) == 0) {
+ if (strcmp (bufp + 2, m->mp_start) == 0) {
inout = 1;
end_part:
p = part->mp_part;
- p->c_end = ftell(fp) - (strlen(buffer) + 1);
+ p->c_end = ftell(fp) - (gotlen + 1);
if (p->c_end < p->c_begin)
p->c_begin = p->c_end;
if (inout)
goto next_part;
goto last_part;
} else {
- if (strcmp (buffer + 2, m->mp_stop) == 0)
+ if (strcmp (bufp + 2, m->mp_stop) == 0)
goto end_part;
}
}
/* initialize the content of the subparts */
if (p->c_ctinitfnx && (*p->c_ctinitfnx) (p) == NOTOK) {
+ free(bufp);
fclose (ct->c_fp);
ct->c_fp = NULL;
return NOTOK;
get_leftover_mp_content (ct, 1);
get_leftover_mp_content (ct, 0);
+ free(bufp);
fclose (ct->c_fp);
ct->c_fp = NULL;
return OK;
* reverse the order of the parts of a multipart/alternative
*/
-void
+static void
reverse_parts (CT ct)
{
struct multipart *m = (struct multipart *) ct->c_ctparams;
}
+
+
+/* parse_mime() arranges alternates in reverse (priority) order. This
+ function can be used to reverse them back. This will put, for
+ example, a text/plain part before a text/html part in a
+ multipart/alternative part, for example, where it belongs. */
+void
+reverse_alternative_parts (CT ct) {
+ if (ct->c_type == CT_MULTIPART) {
+ struct multipart *m = (struct multipart *) ct->c_ctparams;
+ struct part *part;
+
+ if (ct->c_subtype == MULTI_ALTERNATE) {
+ reverse_parts (ct);
+ }
+
+ /* And call recursively on each part of a multipart. */
+ for (part = m->mp_parts; part; part = part->mp_next) {
+ reverse_alternative_parts (part->mp_part);
+ }
+ }
+}
+
+
/*
* MESSAGE
*/
/* sbeck@cise.ufl.edu -- handle suffixes */
ci = &ct->c_ctinfo;
- snprintf (buffer, sizeof(buffer), "%s-suffix-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
- cp = context_find (buffer);
- if (cp == NULL || *cp == '\0') {
- snprintf (buffer, sizeof(buffer), "%s-suffix-%s", invo_name,
- ci->ci_type);
- cp = context_find (buffer);
- }
- if (cp != NULL && *cp != '\0') {
+ if ((cp = context_find_by_type ("suffix", ci->ci_type, ci->ci_subtype))) {
if (ce->ce_unlink) {
/* Create temporary file with filename extension. */
if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
{
int cc, digested, len, quoted, own_ct_fp = 0;
char *cp, *ep;
- char buffer[BUFSIZ];
+ char *bufp = NULL;
+ size_t buflen;
+ ssize_t gotlen;
unsigned char mask;
CE ce = &ct->c_cefile;
/* sbeck -- handle suffixes */
/* sbeck@cise.ufl.edu -- handle suffixes */
ci = &ct->c_ctinfo;
- snprintf (buffer, sizeof(buffer), "%s-suffix-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
- cp = context_find (buffer);
- if (cp == NULL || *cp == '\0') {
- snprintf (buffer, sizeof(buffer), "%s-suffix-%s", invo_name,
- ci->ci_type);
- cp = context_find (buffer);
- }
- if (cp != NULL && *cp != '\0') {
+ if ((cp = context_find_by_type ("suffix", ci->ci_type, ci->ci_subtype))) {
if (ce->ce_unlink) {
/* Create temporary file with filename extension. */
if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
fseek (ct->c_fp, ct->c_begin, SEEK_SET);
while (len > 0) {
- if (fgets (buffer, sizeof(buffer) - 1, ct->c_fp) == NULL) {
+ if ((gotlen = getline(&bufp, &buflen, ct->c_fp)) == -1) {
content_error (NULL, ct, "premature eof");
goto clean_up;
}
- if ((cc = strlen (buffer)) > len)
+ if ((cc = gotlen) > len)
cc = len;
len -= cc;
- for (ep = (cp = buffer) + cc - 1; cp <= ep; ep--)
+ for (ep = (cp = bufp) + cc - 1; cp <= ep; ep--)
if (!isspace ((unsigned char) *ep))
break;
*++ep = '\n', ep++;
/* sbeck@cise.ufl.edu -- handle suffixes */
ci = &ct->c_ctinfo;
- snprintf (buffer, sizeof(buffer), "%s-suffix-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
- cp = context_find (buffer);
- if (cp == NULL || *cp == '\0') {
- snprintf (buffer, sizeof(buffer), "%s-suffix-%s", invo_name,
- ci->ci_type);
- cp = context_find (buffer);
- }
- if (cp != NULL && *cp != '\0') {
+ if ((cp = context_find_by_type ("suffix", ci->ci_type, ci->ci_subtype))) {
if (ce->ce_unlink) {
/* Create temporary file with filename extension. */
if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
cc = len;
len -= cc;
- fwrite (buffer, sizeof(*buffer), cc, ce->ce_fp);
+ if ((int) fwrite (buffer, sizeof(*buffer), cc, ce->ce_fp) < cc) {
+ advise ("open7Bit", "fwrite");
+ }
if (ferror (ce->ce_fp)) {
content_error (ce->ce_file, ct, "error writing to");
goto clean_up;
}
}
+ *fd = fileno (ce->ce_fp);
return OK;
ready_already:
while ((cc = fread (buffer, sizeof(*buffer), sizeof(buffer), gp))
> 0)
- fwrite (buffer, sizeof(*buffer), cc, fp);
+ if ((int) fwrite (buffer, sizeof(*buffer), cc, fp) < cc) {
+ advise ("openFile", "fwrite");
+ }
fflush (fp);
if (ferror (gp)) {
return NOTOK;
}
- if (xpid) {
- if (xpid < 0)
- xpid = -xpid;
- pidcheck (pidwait (xpid, NOTOK));
- xpid = 0;
- }
-
/* Get the buffer ready to go */
bp = buffer;
buflen = sizeof(buffer);
while ((cc= fread (buffer, sizeof(*buffer), sizeof(buffer), gp))
> 0)
- fwrite (buffer, sizeof(*buffer), cc, fp);
+ if ((int) fwrite (buffer, sizeof(*buffer), cc, fp) < cc) {
+ advise ("openFTP", "fwrite");
+ }
fflush (fp);
if (ferror (gp)) {
return NOTOK;
}
- if (xpid) {
- if (xpid < 0)
- xpid = -xpid;
- pidcheck (pidwait (xpid, NOTOK));
- xpid = 0;
- }
-
/* Get buffer ready to go */
bp = buffer;
buflen = sizeof(buffer);
return NOTOK;
}
- if (xpid) {
- if (xpid < 0)
- xpid = -xpid;
- pidcheck (pidwait (xpid, NOTOK));
- xpid = 0;
- }
-
ce->ce_unlink = (*file == NULL);
caching = 0;
cachefile[0] = '\0';
while ((cc = fread(buffer, sizeof(*buffer),
sizeof(buffer), gp)) > 0)
- fwrite(buffer, sizeof(*buffer), cc, fp);
+ if ((int) fwrite(buffer, sizeof(*buffer), cc, fp) < cc) {
+ advise ("openURL", "fwrite");
+ }
fflush(fp);
after the last subpart that hasn't been stored anywhere else, so do
that. */
int
-get_leftover_mp_content (CT ct, int before /* or after */) {
+get_leftover_mp_content (CT ct, int before /* or after */)
+{
struct multipart *m = (struct multipart *) ct->c_ctparams;
char *boundary;
int found_boundary = 0;
- char buffer[BUFSIZ];
int max = BUFSIZ;
+ char *bufp = NULL;
+ size_t buflen;
+ ssize_t gotlen;
int read = 0;
char *content = NULL;
}
/* Back up by 1 to pick up the newline. */
- while (fgets (buffer, sizeof(buffer) - 1, ct->c_fp)) {
- read += strlen (buffer);
+ while ((gotlen = getline(&bufp, &buflen, ct->c_fp)) != -1) {
+ read += gotlen;
/* Don't look beyond beginning of first subpart (before) or
next part (after). */
- if (read > max) buffer[read-max] = '\0';
+ if (read > max) bufp[read-max] = '\0';
if (before) {
- if (! strcmp (buffer, boundary)) {
+ if (! strcmp (bufp, boundary)) {
found_boundary = 1;
}
} else {
- if (! found_boundary && ! strcmp (buffer, boundary)) {
+ if (! found_boundary && ! strcmp (bufp, boundary)) {
found_boundary = 1;
continue;
}
if ((before && ! found_boundary) || (! before && found_boundary)) {
if (content) {
char *old_content = content;
- content = concat (content, buffer, NULL);
+ content = concat (content, bufp, NULL);
free (old_content);
} else {
content = before
- ? concat ("\n", buffer, NULL)
- : concat (buffer, NULL);
+ ? concat ("\n", bufp, NULL)
+ : concat (bufp, NULL);
}
}
}
free (boundary);
+ free (bufp);
return OK;
}
* add them now.
*/
- if (! pm->pm_charset)
+ if (! pm->pm_charset) {
pm->pm_charset = getcpy(write_charset_8bit());
+ if (strcasecmp(pm->pm_charset, "US-ASCII") == 0)
+ adios(NULL, "8-bit characters in parameter \"%s\", but "
+ "local character set is US-ASCII", pm->pm_name);
+ }
if (! pm->pm_lang)
pm->pm_lang = getcpy(NULL); /* Default to a blank lang tag */
int utf8;
iconv_t cd;
ICONV_CONST char *p;
+#else /* HAVE_ICONV */
+ char *p;
#endif /* HAVE_ICONV */
+
char *q;
/*
*q = '\0';
return buffer;
-#endif /* HAVE_ICONV */
noiconv:
+#endif /* HAVE_ICONV */
+
/*
* Take everything non-ASCII and substituite the replacement character
*/