X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fmhbuild.c;h=d22e455d1418dcbafb930b08b9427cbcfef755e8;hb=0da86af19c369b20713d0cedf7b0b3319560f69e;hp=3ed31f98fbc9ec2021c3f2d051d1056e16252f6d;hpb=1577ee015a08dd21f0f57f8a8f9a9396c31e884d;p=mmh diff --git a/uip/mhbuild.c b/uip/mhbuild.c index 3ed31f9..d22e455 100644 --- a/uip/mhbuild.c +++ b/uip/mhbuild.c @@ -16,72 +16,52 @@ #include #include #include -#include #include #include #include #include #include -#include #include -#ifdef TIME_WITH_SYS_TIME +#ifdef HAVE_SYS_TIME_H # include -# include -#else -# ifdef TM_IN_SYS_TIME -# include -# else -# include -# endif -#endif - -#ifdef HAVE_SYS_WAIT_H -# include #endif +#include static struct swit switches[] = { -#define CHECKSW 0 - { "check", 0 }, -#define NCHECKSW 1 - { "nocheck", 0 }, -#define EBCDICSW 2 +#define EBCDICSW 0 { "ebcdicsafe", 0 }, -#define NEBCDICSW 3 +#define NEBCDICSW 1 { "noebcdicsafe", 0 }, -#define HEADSW 4 +#define HEADSW 2 { "headers", 0 }, -#define NHEADSW 5 +#define NHEADSW 3 { "noheaders", 0 }, -#define LISTSW 6 +#define LISTSW 4 { "list", 0 }, -#define NLISTSW 7 +#define NLISTSW 5 { "nolist", 0 }, -#define SIZESW 8 +#define SIZESW 6 { "realsize", 0 }, -#define NSIZESW 9 +#define NSIZESW 7 { "norealsize", 0 }, -#define RFC934SW 10 +#define RFC934SW 8 { "rfc934mode", 0 }, -#define NRFC934SW 11 +#define NRFC934SW 9 { "norfc934mode", 0 }, -#define VERBSW 12 +#define VERBSW 10 { "verbose", 0 }, -#define NVERBSW 13 +#define NVERBSW 11 { "noverbose", 0 }, -#define RCACHESW 14 - { "rcache policy", 0 }, -#define WCACHESW 15 - { "wcache policy", 0 }, -#define CONTENTIDSW 16 +#define CONTENTIDSW 12 { "contentid", 0 }, -#define NCONTENTIDSW 17 +#define NCONTENTIDSW 13 { "nocontentid", 0 }, -#define VERSIONSW 18 +#define VERSIONSW 14 { "version", 0 }, -#define HELPSW 19 +#define HELPSW 15 { "help", 0 }, -#define DEBUGSW 20 +#define DEBUGSW 16 { "debug", -5 }, { NULL, 0 } }; @@ -106,12 +86,6 @@ static char prefix[] = "----- =_aaaaaaaaaa"; int make_intermediates(char *); void content_error(char *, CT, char *, ...); -/* mhcachesbr.c */ -int find_cache(CT, int, int *, char *, char *, int); - -/* ftpsbr.c */ -int ftp_get(char *, char *, char *, char *, char *, char *, int, int); - /* mhfree.c */ void free_content(CT); void free_ctinfo(CT); @@ -127,17 +101,9 @@ static void set_id(CT, int); static int compose_content(CT); static int scan_content(CT); static int build_headers(CT); -static char *calculate_digest(CT, int); static CT build_mime(char *); - -/* mhcachesbr.c */ -extern int rcachesw; -extern int wcachesw; -extern char *cache_public; -extern char *cache_private; - int debugsw = 0; int verbosw = 0; @@ -175,7 +141,6 @@ int main(int argc, char **argv) { int sizesw = 1, headsw = 1; - int *icachesw; char *cp, buf[BUFSIZ]; char buffer[BUFSIZ], *compfile = NULL; char **argp, **arguments; @@ -222,33 +187,6 @@ main(int argc, char **argv) print_version(invo_name); done(1); - case RCACHESW: - icachesw = &rcachesw; - goto do_cache; - case WCACHESW: - icachesw = &wcachesw; - do_cache: ; - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", - argp[-2]); - switch (*icachesw = smatch(cp, caches)) { - case AMBIGSW: - ambigsw(cp, caches); - done(1); - case UNKWNSW: - adios(NULL, "%s unknown", cp); - default: - break; - } - continue; - - case CHECKSW: - checksw++; - continue; - case NCHECKSW: - checksw = 0; - continue; - case EBCDICSW: ebcdicsw++; continue; @@ -334,15 +272,6 @@ main(int argc, char **argv) fclose(fp); } - /* Check for public cache location */ - if ((cache_public = context_find(nmhcache)) && *cache_public != '/') - cache_public = NULL; - - /* Check for private cache location */ - if (!(cache_private = context_find(nmhprivcache))) - cache_private = ".cache"; - cache_private = getcpy(toabsdir(cache_private)); - /* ** Check for storage directory. If defined, we ** will store temporary files there. Else we @@ -732,7 +661,7 @@ fgetstr(char *s, int n, FILE *stream) static int user_content(FILE *in, char *file, char *buf, CT *ctp) { - int extrnal, vrsn; + int vrsn; unsigned char *cp; char **ap; char buffer[BUFSIZ]; @@ -913,11 +842,13 @@ call_init: ** must be some type of explicit directive. */ - /* check if directive is external-type */ - extrnal = (buf[1] == '@'); + if (buf[1] == '@') { + adios(NULL, "The #@ directive i.e. message/external-body " + "is not supported anymore."); + } /* parse directive */ - if (get_ctinfo(buf + (extrnal ? 2 : 1), ct, 1) == NOTOK) + if (get_ctinfo(buf+1, ct, 1) == NOTOK) done(1); /* check directive against the list of MIME types */ @@ -929,8 +860,7 @@ call_init: ** Check if the directive specified a valid type. ** This will happen if it was one of the following forms: ** - ** #type/subtype (or) - ** #@type/subtype + ** #type/subtype */ if (s2i->si_key) { if (!ci->ci_subtype) @@ -942,10 +872,11 @@ call_init: /* NOTREACHED */ case CT_MESSAGE: - if (!mh_strcasecmp(ci->ci_subtype, "partial")) + if (!mh_strcasecmp(ci->ci_subtype, "partial") || + !mh_strcasecmp(ci->ci_subtype, + "external-body")) { adios(NULL, "sorry, \"#%s/%s\" isn't supported", ci->ci_type, ci->ci_subtype); - if (!mh_strcasecmp(ci->ci_subtype, "external-body")) - adios(NULL, "use \"#@type/subtype ... [] ...\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype); + } use_forw: adios(NULL, "use \"#forw [+folder] [msgs]\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype); /* NOTREACHED */ @@ -956,52 +887,6 @@ use_forw: break; } - /* - ** #@type/subtype (external types directive) - */ - if (extrnal) { - struct exbody *e; - CT p; - - if (!ci->ci_magic) - adios(NULL, "need external information for \"#@%s/%s\"", ci->ci_type, ci->ci_subtype); - p = ct; - - snprintf(buffer, sizeof(buffer), "message/external-body; %s", ci->ci_magic); - free(ci->ci_magic); - ci->ci_magic = NULL; - - /* - ** Since we are using the current Content structure to - ** hold information about the type of the external - ** reference, we need to create another Content - ** structure for the message/external-body to wrap - ** it in. - */ - if ((ct = (CT) calloc(1, sizeof(*ct))) == NULL) - adios(NULL, "out of memory"); - *ctp = ct; - ci = &ct->c_ctinfo; - if (get_ctinfo(buffer, ct, 0) == NOTOK) - done(1); - ct->c_type = CT_MESSAGE; - ct->c_subtype = MESSAGE_EXTERNAL; - - if ((e = (struct exbody *) - calloc(1, sizeof(*e))) == NULL) - adios(NULL, "out of memory"); - ct->c_ctparams = (void *) e; - - e->eb_parent = ct; - e->eb_content = p; - p->c_ctexbody = e; - - if (params_external(ct, 1) == NOTOK) - done(1); - - return OK; - } - /* Handle [file] argument */ if (ci->ci_magic) { /* check if specifies command to execute */ @@ -1044,10 +929,6 @@ use_forw: return OK; } - if (extrnal) - adios(NULL, "external definition not allowed for \"#%s\"", - ci->ci_type); - /* ** Message directive ** #forw [+folder] [msgs] @@ -1612,12 +1493,7 @@ scan_content(CT ct) checkebcdic = 0; checklinelen = 0; checklinespace = 0; - - /* don't check anything for message/external */ - if (ct->c_subtype == MESSAGE_EXTERNAL) - checkboundary = 0; - else - checkboundary = 1; + checkboundary = 1; break; case CT_AUDIO: @@ -1740,8 +1616,7 @@ scan_content(CT ct) *ep = cp; } - if (contains8bit || ebcdicunsafe || linelen || linespace || - checksw) + if (contains8bit || ebcdicunsafe || linelen || linespace) ct->c_encoding = CE_QUOTED; else ct->c_encoding = CE_7BIT; @@ -1749,8 +1624,7 @@ scan_content(CT ct) case CT_APPLICATION: /* For application type, use base64, except when postscript */ - if (contains8bit || ebcdicunsafe || linelen || linespace || - checksw) + if (contains8bit || ebcdicunsafe || linelen || linespace) ct->c_encoding = (ct->c_subtype == APPLICATION_POSTSCRIPT) ? CE_QUOTED : CE_BASE64; @@ -1783,7 +1657,7 @@ scan_content(CT ct) static int build_headers(CT ct) { - int cc, mailbody, len; + int cc, len; char **ap, **ep; char *np, *vp, buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; @@ -1826,18 +1700,11 @@ build_headers(CT ct) len = strlen(TYPE_FIELD) + strlen(ci->ci_type) + strlen(ci->ci_subtype) + 3; - mailbody = ct->c_type == CT_MESSAGE && - ct->c_subtype == MESSAGE_EXTERNAL && - ((struct exbody *) ct->c_ctparams)->eb_body; - /* ** Append the attribute/value pairs to ** the end of the Content-Type line. */ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { - if (mailbody && !mh_strcasecmp(*ap, "body")) - continue; - vp = add(";", vp); len++; @@ -1901,24 +1768,6 @@ build_headers(CT ct) skip_headers: /* - ** If this is the internal content structure for a - ** "message/external", then we are done with the - ** headers (since it has no body). - */ - if (ct->c_ctexbody) - return OK; - - /* - ** output the Content-MD5 - */ - if (checksw) { - np = getcpy(MD5_FIELD); - vp = calculate_digest(ct, (ct->c_encoding == CE_QUOTED) ? - 1 : 0); - add_header(ct, np, vp); - } - - /* ** output the Content-Transfer-Encoding */ switch (ct->c_encoding) { @@ -1986,15 +1835,6 @@ skip_headers: } break; - case CT_MESSAGE: - if (ct->c_subtype == MESSAGE_EXTERNAL) { - struct exbody *e; - - e = (struct exbody *) ct->c_ctparams; - build_headers(e->eb_content); - } - break; - default: /* Nothing to do */ break; @@ -2002,96 +1842,3 @@ skip_headers: return OK; } - - -static char nib2b64[0x40+1] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -static char * -calculate_digest(CT ct, int asciiP) -{ - int cc; - char buffer[BUFSIZ], *vp, *op; - unsigned char *dp; - unsigned char digest[16]; - unsigned char outbuf[25]; - FILE *in; - MD5_CTX mdContext; - CE ce = ct->c_cefile; - - /* open content */ - if ((in = fopen(ce->ce_file, "r")) == NULL) - adios(ce->ce_file, "unable to open for reading"); - - /* Initialize md5 context */ - MD5Init(&mdContext); - - /* calculate md5 message digest */ - if (asciiP) { - while (fgets(buffer, sizeof(buffer) - 1, in)) { - char c, *cp; - - cp = buffer + strlen(buffer) - 1; - if ((c = *cp) == '\n') - *cp = '\0'; - - MD5Update(&mdContext, (unsigned char *) buffer, - (unsigned int) strlen(buffer)); - - if (c == '\n') - MD5Update(&mdContext, (unsigned char *) "\r\n", - 2); - } - } else { - while ((cc = fread(buffer, sizeof(*buffer), sizeof(buffer), - in)) > 0) - MD5Update(&mdContext, (unsigned char *) buffer, - (unsigned int) cc); - } - - /* md5 finalization. Write digest and zero md5 context */ - MD5Final(digest, &mdContext); - - /* close content */ - fclose(in); - - /* print debugging info */ - if (debugsw) { - unsigned char *ep; - - fprintf(stderr, "MD5 digest="); - for (ep = (dp = digest) + sizeof(digest) / sizeof(digest[0]); - dp < ep; dp++) - fprintf(stderr, "%02x", *dp & 0xff); - fprintf(stderr, "\n"); - } - - /* encode the digest using base64 */ - for (dp = digest, op = outbuf, cc = sizeof(digest) / sizeof(digest[0]); - cc > 0; cc -= 3, op += 4) { - unsigned long bits; - char *bp; - - bits = (*dp++ & 0xff) << 16; - if (cc > 1) { - bits |= (*dp++ & 0xff) << 8; - if (cc > 2) - bits |= *dp++ & 0xff; - } - - for (bp = op + 4; bp > op; bits >>= 6) - *--bp = nib2b64[bits & 0x3f]; - if (cc < 3) { - *(op + 3) = '='; - if (cc < 2) - *(op + 2) = '='; - } - } - - /* null terminate string */ - outbuf[24] = '\0'; - - /* now make copy and return string */ - vp = concat(" ", outbuf, "\n", NULL); - return vp; -}