extern int debugsw;
-extern pid_t xpid; /* mhshowsbr.c */
-
/* cache policies */
extern int rcachesw; /* mhcachesbr.c */
extern int wcachesw; /* mhcachesbr.c */
};
-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;
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 */
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++;
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);
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';
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;
}