#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 HAVE_SYS_TIME_H
#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 }
};
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);
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;
main(int argc, char **argv)
{
int sizesw = 1, headsw = 1;
- int *icachesw;
char *cp, buf[BUFSIZ];
char buffer[BUFSIZ], *compfile = NULL;
char **argp, **arguments;
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;
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
*ep = cp;
}
- if (contains8bit || ebcdicunsafe || linelen || linespace ||
- checksw)
+ if (contains8bit || ebcdicunsafe || linelen || linespace)
ct->c_encoding = CE_QUOTED;
else
ct->c_encoding = CE_7BIT;
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;
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) {
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;
-}