mhshow/mhstore: Removed support for retrieving message/external-body parts.
[mmh] / uip / mhbuild.c
index 3ed31f9..d22e455 100644 (file)
 #include <h/mh.h>
 #include <fcntl.h>
 #include <h/signals.h>
-#include <h/md5.h>
 #include <errno.h>
 #include <signal.h>
 #include <h/tws.h>
 #include <h/mime.h>
 #include <h/mhparse.h>
-#include <h/mhcachesbr.h>
 #include <h/utils.h>
 
-#ifdef TIME_WITH_SYS_TIME
+#ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
-# include <time.h>
-#else
-# ifdef TM_IN_SYS_TIME
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#ifdef HAVE_SYS_WAIT_H
-# include <sys/wait.h>
 #endif
+#include <time.h>
 
 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;
-}