X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fmhbuildsbr.c;h=ec2c195a2c6a7ed85b05beb96e5718e24ac95531;hb=bfad64befb4d6696fdfb63b119666eec4bac6fb3;hp=fd6a974724f9bbd1f01d7505cf4f9ec3c590e43e;hpb=bc7839e29d6a4906bd0b8909fd12bb01933b143c;p=mmh diff --git a/uip/mhbuildsbr.c b/uip/mhbuildsbr.c index fd6a974..ec2c195 100644 --- a/uip/mhbuildsbr.c +++ b/uip/mhbuildsbr.c @@ -41,8 +41,6 @@ extern int listsw; extern int rfc934sw; extern int contentidsw; -extern int endian; /* mhmisc.c */ - /* cache policies */ extern int rcachesw; /* mhcachesbr.c */ extern int wcachesw; /* mhcachesbr.c */ @@ -72,7 +70,7 @@ void free_encoding (CT, int); /* * prototypes */ -CT build_mime (char *); +CT build_mime (char *, int); /* * static prototypes @@ -87,6 +85,37 @@ static int build_headers (CT); static char *calculate_digest (CT, int); +static unsigned char directives_stack[32]; +static unsigned int directives_index; + +static int do_direct(void) +{ + return directives_stack[directives_index]; +} + +static void directive_onoff(int onoff) +{ + if (directives_index >= sizeof(directives_stack) - 1) { + fprintf(stderr, "mhbuild: #on/off overflow, continuing\n"); + return; + } + directives_stack[++directives_index] = onoff; +} + +static void directive_init(int onoff) +{ + directives_index = 0; + directives_stack[0] = onoff; +} + +static void directive_pop(void) +{ + if (directives_index > 0) + directives_index--; + else + fprintf(stderr, "mhbuild: #pop underflow, continuing\n"); +} + /* * Main routine for translating composition file * into valid MIME message. It translates the draft @@ -97,7 +126,7 @@ static char *calculate_digest (CT, int); */ CT -build_mime (char *infile) +build_mime (char *infile, int directives) { int compnum, state; char buf[BUFSIZ], name[NAMESZ]; @@ -107,6 +136,8 @@ build_mime (char *infile) CT ct; FILE *in; + directive_init(directives); + umask (~m_gmprot ()); /* open the composition draft */ @@ -327,20 +358,34 @@ static char * fgetstr (char *s, int n, FILE *stream) { char *cp, *ep; + int o_n = n; - for (ep = (cp = s) + n; cp < ep; ) { - int i; + while(1) { + for (ep = (cp = s) + o_n; cp < ep; ) { + int i; - if (!fgets (cp, n, stream)) - return (cp != s ? s : NULL); - if (cp == s && *cp != '#') - return s; + if (!fgets (cp, n, stream)) + return (cp != s ? s : NULL); + + if (cp == s && *cp != '#') + return s; + + cp += (i = strlen (cp)) - 1; + if (i <= 1 || *cp-- != '\n' || *cp != '\\') + break; + *cp = '\0'; + n -= (i - 2); + } - cp += (i = strlen (cp)) - 1; - if (i <= 1 || *cp-- != '\n' || *cp != '\\') + if (strcmp(s, "#on\n") == 0) { + directive_onoff(1); + } else if (strcmp(s, "#off\n") == 0) { + directive_onoff(0); + } else if (strcmp(s, "#pop\n") == 0) { + directive_pop(); + } else { break; - *cp = '\0'; - n -= (i - 2); + } } return s; @@ -367,7 +412,7 @@ user_content (FILE *in, char *file, char *buf, CT *ctp) CT ct; CE ce; - if (buf[0] == '\n' || strcmp (buf, "#\n") == 0) { + if (buf[0] == '\n' || (do_direct() && strcmp (buf, "#\n") == 0)) { *ctp = NULL; return OK; } @@ -392,7 +437,7 @@ user_content (FILE *in, char *file, char *buf, CT *ctp) * 2) begins with "##" (implicit directive) * 3) begins with "#<" */ - if (buf[0] != '#' || buf[1] == '#' || buf[1] == '<') { + if (!do_direct() || buf[0] != '#' || buf[1] == '#' || buf[1] == '<') { int headers; int inlineD; long pos; @@ -407,7 +452,7 @@ user_content (FILE *in, char *file, char *buf, CT *ctp) ce->ce_file = add (cp, NULL); ce->ce_unlink = 1; - if (buf[0] == '#' && buf[1] == '<') { + if (do_direct() && (buf[0] == '#' && buf[1] == '<')) { strncpy (content, buf + 2, sizeof(content)); inlineD = 1; goto rock_and_roll; @@ -418,11 +463,11 @@ user_content (FILE *in, char *file, char *buf, CT *ctp) /* the directive is implicit */ strncpy (content, "text/plain", sizeof(content)); headers = 0; - strncpy (buffer, buf[0] != '#' ? buf : buf + 1, sizeof(buffer)); + strncpy (buffer, (!do_direct() || buf[0] != '#') ? buf : buf + 1, sizeof(buffer)); for (;;) { int i; - if (headers >= 0 && uprf (buffer, DESCR_FIELD) + if (headers >= 0 && do_direct() && uprf (buffer, DESCR_FIELD) && buffer[i = strlen (DESCR_FIELD)] == ':') { headers = 1; @@ -445,7 +490,7 @@ again_descr: } } - if (headers >= 0 && uprf (buffer, DISPO_FIELD) + if (headers >= 0 && do_direct() && uprf (buffer, DISPO_FIELD) && buffer[i = strlen (DISPO_FIELD)] == ':') { headers = 1; @@ -476,7 +521,7 @@ rock_and_roll: pos = ftell (in); if ((cp = fgetstr (buffer, sizeof(buffer) - 1, in)) == NULL) break; - if (buffer[0] == '#') { + if (do_direct() && buffer[0] == '#') { char *bp; if (buffer[1] != '#') @@ -850,20 +895,19 @@ use_forw: static void set_id (CT ct, int top) { - char msgid[BUFSIZ]; + char contentid[BUFSIZ]; static int partno; static time_t clock = 0; static char *msgfmt; if (clock == 0) { time (&clock); - snprintf (msgid, sizeof(msgid), "<%d.%ld.%%d@%s>\n", - (int) getpid(), (long) clock, LocalName(1)); + snprintf (contentid, sizeof(contentid), "%s\n", message_id (clock, 1)); partno = 0; - msgfmt = getcpy(msgid); + msgfmt = getcpy(contentid); } - snprintf (msgid, sizeof(msgid), msgfmt, top ? 0 : ++partno); - ct->c_id = getcpy (msgid); + snprintf (contentid, sizeof(contentid), msgfmt, top ? 0 : ++partno); + ct->c_id = getcpy (contentid); } @@ -1314,12 +1358,11 @@ scan_content (CT ct) continue; if (contains8bit) { - t->tx_charset = CHARSET_UNKNOWN; *ap = concat ("charset=", write_charset_8bit(), NULL); } else { - t->tx_charset = CHARSET_USASCII; *ap = add ("charset=us-ascii", NULL); } + t->tx_charset = CHARSET_SPECIFIED; cp = strchr(*ap++, '='); *ap = NULL; @@ -1506,11 +1549,6 @@ skip_headers: switch (ct->c_encoding) { case CE_7BIT: /* Nothing to output */ -#if 0 - np = add (ENCODING_FIELD, NULL); - vp = concat (" ", "7bit", "\n", NULL); - add_header (ct, np, vp); -#endif break; case CE_8BIT: