cpdup(1): Convert to LibreSSL MD5 hash API.
authorzrj <rimvydas.jasinskas@gmail.com>
Wed, 17 Apr 2019 03:35:08 +0000 (06:35 +0300)
committerzrj <zrj@dragonflybsd.org>
Wed, 24 Apr 2019 17:18:26 +0000 (20:18 +0300)
While there, simplify crunchgen by excluding md5 functionality in
rescue tools as in btools.

bin/cpdup/Makefile
bin/cpdup/cpdup.c
bin/cpdup/cpdup.h
bin/cpdup/md5.c

index f0ea8bc..13a15ff 100644 (file)
@@ -2,23 +2,21 @@ PROG= cpdup
 SRCS=  cpdup.c hcproto.c hclink.c misc.c fsmid.c
 
 .if defined(.FreeBSD)
-CFLAGS += -D_ST_FLAGS_PRESENT_=1
+CFLAGS += -D_ST_FLAGS_PRESENT_=1 -DWITH_LIBMD
 WARNS?=        6
 .endif
 
-.if defined(BOOTSTRAPPING)
+.if defined(BOOTSTRAPPING) || defined(RESCUE)
 # For boostrapping buildworld the md5 functionality is not needed
 CFLAGS+=-DNOMD5
 .else
 .if !defined(NOMD5)
 SRCS+= md5.c
+CFLAGS+=       ${PRIVATELIB_CFLAGS}
+DPADD=         ${LIBCRYPTO}
+LDADD=         -lprivate_crypto
+LDFLAGS+=      ${PRIVATELIB_LDFLAGS}
 .endif
-
-# XXX sys/md5.h shim errata for bootstrap REMOVE_OPENSSL_FILES
-CFLAGS+= -I${_SHLIBDIRPREFIX}/usr/include/priv
-
-LDADD+= -lmd
-DPADD+= ${LIBMD}
 .endif
 
 .include <bsd.prog.mk>
index 868bd39..0f3e741 100644 (file)
@@ -49,7 +49,7 @@
  */
 
 /*-
- * Example: cc -O cpdup.c -o cpdup -lmd
+ * Example: cc -O cpdup.c -o cpdup -lcrypto
  *
  * ".MD5.CHECKSUMS" contains md5 checksumms for the current directory.
  * This file is stored on the source.
index 6399887..e3da7f9 100644 (file)
@@ -22,9 +22,6 @@
 #include <pwd.h>
 #include <fnmatch.h>
 #include <assert.h>
-#ifndef NOMD5
-#include <md5.h>
-#endif
 
 /* Solaris needs <strings.h> for bzero(), bcopy() and bcmp(). */
 #include <strings.h>
index 990d864..75900d1 100644 (file)
@@ -4,12 +4,16 @@
  * (c) Copyright 1997-1999 by Matthew Dillon and Dima Ruban.  Permission to
  *     use and distribute based on the FreeBSD copyright.  Supplied as-is,
  *     USE WITH EXTREME CAUTION.
- *
- * $DragonFly: src/bin/cpdup/md5.c,v 1.3 2008/11/10 14:30:02 swildner Exp $
  */
 
 #include "cpdup.h"
 
+#ifdef WITH_LIBMD
+#include <md5.h>
+#else
+#include <openssl/md5.h>
+#endif
+
 typedef struct MD5Node {
     struct MD5Node *md_Next;
     char *md_Name;
@@ -254,6 +258,61 @@ md5_check(const char *spath, const char *dpath)
     return(r);
 }
 
+#ifndef WITH_LIBMD
+static char *
+md5_file(const char *filename, char *buf)
+{
+    unsigned char digest[MD5_DIGEST_LENGTH];
+    static const char hex[]="0123456789abcdef";
+    MD5_CTX ctx;
+    unsigned char buffer[4096];
+    struct stat st;
+    off_t size;
+    int fd, bytes, i;
+
+    fd = open(filename, O_RDONLY);
+    if (fd < 0)
+       return NULL;
+    if (fstat(fd, &st) < 0) {
+       bytes = -1;
+       goto err;
+    }
+
+    MD5_Init(&ctx);
+    size = st.st_size;
+    bytes = 0;
+    while (size > 0) {
+       if ((size_t)size > sizeof(buffer))
+            bytes = read(fd, buffer, sizeof(buffer));
+       else
+            bytes = read(fd, buffer, size);
+       if (bytes < 0)
+            break;
+       MD5_Update(&ctx, buffer, bytes);
+       size -= bytes;
+    }
+
+err:
+    close(fd);
+    if (bytes < 0)
+       return NULL;
+
+    if (!buf)
+       buf = malloc(MD5_DIGEST_LENGTH * 2 + 1);
+    if (!buf)
+       return NULL;
+
+    MD5_Final(digest, &ctx);
+    for (i = 0; i < MD5_DIGEST_LENGTH; i++) {
+       buf[2*i] = hex[digest[i] >> 4];
+       buf[2*i+1] = hex[digest[i] & 0x0f];
+    }
+    buf[MD5_DIGEST_LENGTH * 2] = '\0';
+
+    return buf;
+}
+#endif
+
 char *
 doMD5File(const char *filename, char *buf, int is_target)
 {
@@ -267,6 +326,10 @@ doMD5File(const char *filename, char *buf, int is_target)
                    CountSourceReadBytes += size;
        }
     }
+#ifdef WITH_LIBMD
     return MD5File(filename, buf);
+#else
+    return md5_file(filename, buf);
+#endif
 }