#include <h/md5.h>
#include <h/mts.h>
#include <h/tws.h>
+#include <h/fmt_scan.h>
#include <h/mime.h>
#include <h/mhparse.h>
#include <h/utils.h>
+#include "h/mhcachesbr.h"
+#include "mhmisc.h"
+#include "sbr/m_mktemp.h"
+#include "sbr/message_id.h"
+#include "sbr/mime_type.h"
+#include "mhfree.h"
+#include "mhshowsbr.h"
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
extern int rfc934sw;
extern int contentidsw;
-/* cache policies */
-extern int rcachesw; /* mhcachesbr.c */
-extern int wcachesw; /* mhcachesbr.c */
-
static char prefix[] = "----- =_aaaaaaaaaa";
struct attach_list {
} convert_list;
-/* mhmisc.c */
-void content_error (char *, CT, char *, ...);
-
-/* mhcachesbr.c */
-int find_cache (CT, int, int *, char *, char *, int);
-
-/* mhfree.c */
-extern CT *cts;
-void freects_done (int) NORETURN;
-void free_ctinfo (CT);
-void free_encoding (CT, int);
-
/*
* static prototypes
*/
CT ct;
FILE *in;
HF hp;
- m_getfld_state_t gstate = 0;
+ m_getfld_state_t gstate;
struct attach_list *attach_head = NULL, *attach_tail = NULL, *at_entry;
convert_list *convert_head = NULL, *convert_tail = NULL, *convert;
* draft into the linked list of header fields for
* the new MIME message.
*/
- m_getfld_track_filepos (&gstate, in);
+ gstate = m_getfld_state_init(in);
+ m_getfld_track_filepos2(&gstate);
for (compnum = 1;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) {
+ switch (state = m_getfld2(&gstate, name, buf, &bufsz)) {
case FLD:
case FLDPLUS:
compnum++;
if (!strcasecmp (name, TYPE_FIELD)) {
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (&gstate, name, buf, &bufsz, in);
+ state = m_getfld2(&gstate, name, buf, &bufsz);
}
goto finish_field;
}
/* if necessary, get rest of field */
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (&gstate, name, buf, &bufsz, in);
+ state = m_getfld2(&gstate, name, buf, &bufsz);
vp = add (buf, vp); /* add to previous value */
}
attach_head = attach_tail = entry;
}
} else if (strncasecmp(MHBUILD_FILE_PSEUDOHEADER, np,
- strlen (MHBUILD_FILE_PSEUDOHEADER)) == 0) {
+ LEN(MHBUILD_FILE_PSEUDOHEADER)) == 0) {
/* E.g.,
* Nmh-mhbuild-file-text/calendar: /home/user/Mail/inbox/9
*/
- char *type = np + strlen (MHBUILD_FILE_PSEUDOHEADER);
+ char *type = np + LEN(MHBUILD_FILE_PSEUDOHEADER);
char *filename = vp;
- /* vp should begin with a space because m_getfld()
+ /* vp should begin with a space because m_getfld2()
includes the space after the colon in buf. */
while (isspace((unsigned char) *filename)) { ++filename; }
/* Trim trailing newline and any other whitespace. */
free (vp);
free (np);
} else if (strncasecmp(MHBUILD_ARGS_PSEUDOHEADER, np,
- strlen (MHBUILD_ARGS_PSEUDOHEADER)) == 0) {
+ LEN(MHBUILD_ARGS_PSEUDOHEADER)) == 0) {
/* E.g.,
* Nmh-mhbuild-args-text/calendar: -reply accept
*/
- char *type = np + strlen (MHBUILD_ARGS_PSEUDOHEADER);
+ char *type = np + LEN(MHBUILD_ARGS_PSEUDOHEADER);
char *argstring = vp;
- /* vp should begin with a space because m_getfld()
+ /* vp should begin with a space because m_getfld2()
includes the space after the colon in buf. */
while (isspace((unsigned char) *argstring)) { ++argstring; }
/* Trim trailing newline and any other whitespace. */
case BODY:
fseek (in, (long) (-strlen (buf)), SEEK_CUR);
- /* FALLTHRU */
+ break;
case FILEEOF:
break;
} else {
if (*++cp == 0)
adios (NULL, "giving up trying to find a unique delimiter string");
- else
- (*cp)++;
+ (*cp)++;
}
}
ct->c_ceclosefnx = close_encoding;
ct->c_cesizefnx = NULL; /* since unencoded */
ct->c_encoding = CE_7BIT; /* Seems like a reasonable default */
- ct->c_file = add(filename, NULL);
+ ct->c_file = mh_xstrdup(FENDNULL(filename));
return OK;
}
{
int extrnal, vrsn;
char *cp, **ap;
- char buffer[BUFSIZ];
+ char buffer[NMH_BUFSIZ];
struct multipart *m;
struct part **pp;
struct stat st;
int i;
if (headers >= 0 && do_direct() && uprf (buffer, DESCR_FIELD)
- && buffer[i = strlen (DESCR_FIELD)] == ':') {
+ && buffer[i = LEN(DESCR_FIELD)] == ':') {
headers = 1;
again_descr:
}
if (headers >= 0 && do_direct() && uprf (buffer, DISPO_FIELD)
- && buffer[i = strlen (DISPO_FIELD)] == ':') {
+ && buffer[i = LEN(DISPO_FIELD)] == ':') {
headers = 1;
again_dispo:
if (*cp == '+' || *cp == '@') {
if (folder)
adios (NULL, "only one folder per #forw directive");
- else
- folder = pluspath (cp);
+ folder = pluspath (cp);
}
}
default:
if (!ce->ce_file) {
pid_t child_id;
- int i, xstdout, len, buflen;
+ int xstdout, len, buflen;
char *bp, *cp;
char *vec[4], buffer[BUFSIZ];
FILE *out;
if ((out = fopen (ce->ce_file, "w")) == NULL)
adios (ce->ce_file, "unable to open for writing");
- for (i = 0; (child_id = fork()) == NOTOK && i > 5; i++)
- sleep (5);
+ child_id = fork();
switch (child_id) {
case NOTOK:
adios ("fork", "unable to fork");
vp = concat (" ", ci->ci_type, "/", ci->ci_subtype, NULL);
/* keep track of length of line */
- len = strlen (TYPE_FIELD) + strlen (ci->ci_type)
+ len = LEN(TYPE_FIELD) + strlen (ci->ci_type)
+ strlen (ci->ci_subtype) + 3;
extbody = ct->c_type == CT_MESSAGE && ct->c_subtype == MESSAGE_EXTERNAL;
add_header (ct, np, vp);
} else if (ct->c_dispo_type) {
vp = concat (" ", ct->c_dispo_type, NULL);
- len = strlen(DISPO_FIELD) + strlen(vp) + 1;
+ len = LEN(DISPO_FIELD) + strlen(vp) + 1;
np = output_params(len, ct->c_dispo_first, NULL, 0);
vp = add(np, vp);
vp = add("\n", vp);
unsigned char *ep;
fprintf (stderr, "MD5 digest=");
- for (ep = (dp = digest) + sizeof(digest) / sizeof(digest[0]);
+ for (ep = (dp = digest) + sizeof digest;
dp < ep; dp++)
fprintf (stderr, "%02x", *dp & 0xff);
fprintf (stderr, "\n");
/* encode the digest using base64 */
for (dp = digest, op = (char *) outbuf,
- cc = sizeof(digest) / sizeof(digest[0]);
+ cc = sizeof digest;
cc > 0; cc -= 3, op += 4) {
unsigned long bits;
char *bp;
"continuing...", invo_name,
ct->c_ctinfo.ci_type,
ct->c_ctinfo.ci_subtype ? "/" : "",
- ct->c_ctinfo.ci_subtype ? ct->c_ctinfo.ci_subtype : "",
+ FENDNULL(ct->c_ctinfo.ci_subtype),
cp);
}
struct str2init *s2i;
CT reply_ct;
struct part *part;
- int eightbit = 0;
int status;
type_p = getcpy (type);
free (type_p);
if (! (convert)) {
- /* No mhbuild-convert- entry in mhn.defaults or profile
- for type. */
+ /* No mhbuild-convert- entry in mhn.defaults or profile for type. */
return;
}
/* reply_file is used to pass the output of the convert. */
reply_file = getcpy (m_mktemp2 (NULL, invo_name, NULL, NULL));
convert_command =
- concat (convert, " ", argstring ? argstring : "", " >", reply_file,
- NULL);
+ concat (convert, " ", FENDNULL(argstring), " >", reply_file, NULL);
/* Convert here . . . */
ct->c_storeproc = mh_xstrdup(convert_command);
init_decoded_content (reply_ct, infile);
if (extract_headers (reply_ct, reply_file, &reply_fp) == NOTOK) {
- free (reply_file);
inform("failed to extract headers from convert output in %s, "
"continuing...", reply_file);
+ free(reply_file);
return;
}
- /* For text content only, see if it is 8-bit text. */
- if (reply_ct->c_type == CT_TEXT) {
- int fd;
-
- if ((fd = open (reply_file, O_RDONLY)) == NOTOK ||
- scan_input (fd, &eightbit) == NOTOK) {
- free (reply_file);
- inform("failed to read %s, continuing...", reply_file);
- return;
- }
- (void) close (fd);
- }
-
/* This sets reply_ct->c_ctparams, and reply_ct->c_termproc if the
charset can't be handled natively. */
for (s2i = str2cts; s2i->si_key; s2i++) {
(*reply_ct->c_ctinitfnx)(reply_ct);
}
- if ((cp =
- get_param (reply_ct->c_ctinfo.ci_first_pm, "charset", '?', 1))) {
+ if ((cp = get_param (reply_ct->c_ctinfo.ci_first_pm, "charset", '?', 1))) {
/* The reply Content-Type had the charset. */
charset = cp;
} else {
set_charset (reply_ct, -1);
charset = get_param (reply_ct->c_ctinfo.ci_first_pm, "charset", '?', 1);
- if (reply_ct->c_reqencoding == CE_UNKNOWN &&
- reply_ct->c_type == CT_TEXT) {
- /* Assume that 8bit is sufficient (for text). In other words,
- don't allow it to be encoded as quoted printable if lines
- are too long. This also sidesteps the check for whether
- it needs to be encoded as binary; instead, it relies on
- the applicable mhbuild-convert-text directive to ensure
- that the resultant text is not binary. */
- reply_ct->c_reqencoding = eightbit ? CE_8BIT : CE_7BIT;
- }
}
/* Concatenate text/plain parts. */
- if (reply_ct->c_type == CT_TEXT &&
- reply_ct->c_subtype == TEXT_PLAIN) {
+ if (reply_ct->c_type == CT_TEXT && reply_ct->c_subtype == TEXT_PLAIN) {
if (! *text_plain_ct && m->mp_parts && m->mp_parts->mp_part &&
m->mp_parts->mp_part->c_type == CT_TEXT &&
m->mp_parts->mp_part->c_subtype == TEXT_PLAIN) {
*text_plain_ct = m->mp_parts->mp_part;
- /* Make sure that the charset is set in the text/plain
- part. */
+ /* Make sure that the charset is set in the text/plain part. */
set_charset (*text_plain_ct, -1);
- if ((*text_plain_ct)->c_reqencoding == CE_UNKNOWN) {
- /* Assume that 8bit is sufficient (for text). In other words,
- don't allow it to be encoded as quoted printable if lines
- are too long. This also sidesteps the check for whether
- it needs to be encoded as binary; instead, it relies on
- the applicable mhbuild-convert-text directive to ensure
- that the resultant text is not binary. */
- (*text_plain_ct)->c_reqencoding =
- eightbit ? CE_8BIT : CE_7BIT;
- }
}
if (*text_plain_ct) {
buffer[statbuf.st_size] = '\0';
/* Look for a header in the convert reply. */
- if (strncasecmp (buffer, TYPE_FIELD, strlen (TYPE_FIELD)) == 0 &&
- buffer[strlen (TYPE_FIELD)] == ':') {
+ if (strncasecmp (buffer, TYPE_FIELD, LEN(TYPE_FIELD)) == 0 &&
+ buffer[LEN(TYPE_FIELD)] == ':') {
if ((end_of_header = strstr (buffer, "\r\n\r\n"))) {
end_of_header += 2;
found_header = 1;
CT tmp_ct;
char *tmp_file;
FILE *tmp_f;
- size_t n;
+ size_t n, written;
/* Truncate buffer to just the C-T. */
*end_of_header = '\0';
/* Hack. Use parse_mime() to detect the type/subtype of the
reply, which we'll use below. */
tmp_file = getcpy (m_mktemp2 (NULL, invo_name, NULL, NULL));
- if ((tmp_f = fopen (tmp_file, "w")) &&
- fwrite (buffer, 1, n, tmp_f) == n) {
- fclose (tmp_f);
- } else {
+ tmp_f = fopen(tmp_file, "w");
+ if (!tmp_f)
+ goto failed_to_extract_ct;
+ written = fwrite(buffer, 1, n, tmp_f);
+ fclose(tmp_f);
+ if (written != n)
goto failed_to_extract_ct;
- }
- tmp_ct = parse_mime (tmp_file);
+ tmp_ct = parse_mime (tmp_file);
if (tmp_ct) {
/* The type and subtype were detected from the reply
using parse_mime() above. */