extern int rcachesw; /* mhcachesbr.c */
extern int wcachesw; /* mhcachesbr.c */
-pid_t xpid = 0;
-
static char prefix[] = "----- =_aaaaaaaaaa";
struct attach_list {
/*
* static prototypes
*/
-static int init_decoded_content (CT);
+static int init_decoded_content (CT, const char *);
static void setup_attach_content(CT, char *);
static char *fgetstr (char *, int, FILE *);
-static int user_content (FILE *, char *, CT *);
+static int user_content (FILE *, char *, CT *, const char *infilename);
static void set_id (CT, int);
static int compose_content (CT, int);
static int scan_content (CT, size_t);
* for this part. We don't really need this, but
* allocate it to remain consistent.
*/
- init_decoded_content (ct);
+ init_decoded_content (ct, infile);
/*
* Parse some of the header fields in the composition
done (1);
ct->c_type = CT_MULTIPART;
ct->c_subtype = MULTI_MIXED;
- ct->c_file = add (infile, NULL);
if ((m = (struct multipart *) calloc (1, sizeof(*m))) == NULL)
adios (NULL, "out of memory");
struct part *part;
CT p;
- if (user_content (in, buf, &p) == DONE) {
+ if (user_content (in, buf, &p, infile) == DONE) {
admonish (NULL, "ignoring spurious #end");
continue;
}
if ((p = (CT) calloc (1, sizeof(*p))) == NULL)
adios(NULL, "out of memory");
- init_decoded_content(p);
+ init_decoded_content(p, infile);
/*
* Initialize our content structure based on the filename,
if ((p = (CT) calloc (1, sizeof(*p))) == NULL)
adios(NULL, "out of memory");
- init_decoded_content(p);
+ init_decoded_content(p, infile);
if (get_ctinfo ("text/plain", p, 0) == NOTOK)
done (1);
p->c_type = CT_TEXT;
p->c_subtype = TEXT_PLAIN;
p->c_encoding = CE_7BIT;
- p->c_file = getcpy(infile);
/*
* Sigh. ce_file contains the "decoded" contents of this part.
* So this seems like the best option available since we're going
*/
static int
-init_decoded_content (CT ct)
+init_decoded_content (CT ct, const char *filename)
{
ct->c_ceopenfnx = open7Bit; /* since unencoded */
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);
return OK;
}
*/
static int
-user_content (FILE *in, char *buf, CT *ctp)
+user_content (FILE *in, char *buf, CT *ctp, const char *infilename)
{
int extrnal, vrsn;
char *cp, **ap;
*ctp = ct;
/* allocate basic structure for handling decoded content */
- init_decoded_content (ct);
+ init_decoded_content (ct, infilename);
ce = &ct->c_cefile;
ci = &ct->c_ctinfo;
if ((p = (CT) calloc (1, sizeof(*p))) == NULL)
adios (NULL, "out of memory");
- init_decoded_content (p);
+ init_decoded_content (p, infilename);
pe = &p->c_cefile;
if (get_ctinfo ("message/rfc822", p, 0) == NOTOK)
done (1);
struct part *part;
CT p;
- if (user_content (in, buffer, &p) == DONE) {
+ if (user_content (in, buffer, &p, infilename) == DONE) {
if (!m->mp_parts)
adios (NULL, "empty \"#begin ... #end\" sequence");
return OK;
break;
case CT_MESSAGE:
- check8bit = 0;
checklinelen = 0;
checklinespace = 0;
/* don't check anything for message/external */
- if (ct->c_subtype == MESSAGE_EXTERNAL)
+ if (ct->c_subtype == MESSAGE_EXTERNAL) {
checkboundary = 0;
- else
+ check8bit = 0;
+ } else {
checkboundary = 1;
+ check8bit = 1;
+ }
break;
case CT_AUDIO:
if (!isascii ((unsigned char) *cp)) {
contains8bit = 1;
check8bit = 0; /* no need to keep checking */
+ break;
}
}
}
break;
case CT_MESSAGE:
- ct->c_encoding = CE_7BIT;
+ ct->c_encoding = contains8bit ? CE_8BIT : CE_7BIT;
break;
case CT_AUDIO:
break;
case CE_8BIT:
- if (ct->c_type == CT_MESSAGE)
- adios (NULL, "internal error, invalid encoding");
-
np = add (ENCODING_FIELD, NULL);
vp = concat (" ", "8bit", "\n", NULL);
add_header (ct, np, vp);