[PATCH] Add crypt.[ch] and update md5sum and sha1sum

From: sin <sin_AT_2f30.org>
Date: Sun, 7 Jul 2013 15:29:45 +0100

Factor out the code from md5sum and sha1sum into a util function.

Use FILE * instead of a file descriptor. This will make it a bit
easier/more consistent when we implement support for the -c option.
---
 Makefile     |  1 +
 crypt.h      |  9 +++++++
 md5sum.c     | 78 +++++++++++++++++++++++++++++++++++++++---------------------
 sha1sum.c    | 78 +++++++++++++++++++++++++++++++++++++++---------------------
 util/crypt.c | 25 +++++++++++++++++++
 5 files changed, 137 insertions(+), 54 deletions(-)
 create mode 100644 crypt.h
 create mode 100644 util/crypt.c
diff --git a/Makefile b/Makefile
index f825ec4..c58fb86 100644
--- a/Makefile
+++ b/Makefile
_AT_@ -10,6 +10,7 @@ LIB = \
 	util/apathmax.o  \
 	util/concat.o    \
 	util/cp.o        \
+	util/crypt.o     \
 	util/enmasse.o   \
 	util/eprintf.o   \
 	util/estrtol.o   \
diff --git a/crypt.h b/crypt.h
new file mode 100644
index 0000000..ad0392e
--- /dev/null
+++ b/crypt.h
_AT_@ -0,0 +1,9 @@
+struct crypt_ops {
+	void (*init)(struct crypt_ops *);
+	void (*update)(struct crypt_ops *, const void *, unsigned long);
+	void (*sum)(struct crypt_ops *);
+	void (*print)(struct crypt_ops *, const char *);
+	void *priv;
+};
+
+int cryptsum(struct crypt_ops *ops, FILE *fp, const char *f);
diff --git a/md5sum.c b/md5sum.c
index 722416f..c66909c 100644
--- a/md5sum.c
+++ b/md5sum.c
_AT_@ -1,15 +1,28 @@
 /* See LICENSE file for copyright and license details. */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include "util.h"
+#include "crypt.h"
 #include "md5.h"
 
-static void md5sum(int fd, const char *f);
+static void crypt_md5_init(struct crypt_ops *);
+static void crypt_md5_update(struct crypt_ops *, const void *, unsigned long);
+static void crypt_md5_sum(struct crypt_ops *);
+static void crypt_md5_print(struct crypt_ops *, const char *);
+
+struct md5_priv {
+	struct md5 s;
+	unsigned char digest[MD5_DIGEST_LENGTH];
+} md5_priv;
+
+struct crypt_ops md5_ops = {
+	crypt_md5_init,
+	crypt_md5_update,
+	crypt_md5_sum,
+	crypt_md5_print,
+	&md5_priv,
+};
 
 static void
 usage(void)
_AT_@ -20,7 +33,7 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
-	int fd;
+	FILE *fp;
 
 	ARGBEGIN {
 	default:
_AT_@ -28,13 +41,13 @@ main(int argc, char *argv[])
 	} ARGEND;
 
 	if (argc == 0) {
-		md5sum(STDIN_FILENO, "<stdin>");
+		cryptsum(&md5_ops, stdin, "<stdin>");
 	} else {
 		for (; argc > 0; argc--) {
-			if ((fd = open(*argv, O_RDONLY)) < 0)
-				eprintf("open %s:", *argv);
-			md5sum(fd, *argv);
-			close(fd);
+			if ((fp = fopen(*argv, "r"))  == NULL)
+				eprintf("fopen %s:", *argv);
+			cryptsum(&md5_ops, fp, *argv);
+			fclose(fp);
 			argv++;
 		}
 	}
_AT_@ -43,25 +56,36 @@ main(int argc, char *argv[])
 }
 
 static void
-md5sum(int fd, const char *f)
+crypt_md5_init(struct crypt_ops *ops)
 {
-	unsigned char buf[BUFSIZ];
-	unsigned char digest[MD5_DIGEST_LENGTH];
-	struct md5 s;
-	ssize_t n;
-	int i;
+	struct md5_priv *priv = ops->priv;
 
-	md5_init(&s);
-	while ((n = read(fd, buf, sizeof buf)) > 0)
-		md5_update(&s, buf, n);
-	if (n < 0) {
-		eprintf("%s: read error:", f);
-		return;
-	}
+	md5_init(&priv->s);
+}
+
+static void
+crypt_md5_update(struct crypt_ops *ops, const void *m, unsigned long len)
+{
+	struct md5_priv *priv = ops->priv;
+
+	md5_update(&priv->s, m, len);
+}
+
+static void
+crypt_md5_sum(struct crypt_ops *ops)
+{
+	struct md5_priv *priv = ops->priv;
 
-	md5_sum(&s, digest);
+	md5_sum(&priv->s, priv->digest);
+}
+
+static void
+crypt_md5_print(struct crypt_ops *ops, const char *f)
+{
+	struct md5_priv *priv = ops->priv;
+	int i;
 
-	for (i = 0; i < sizeof(digest); i++)
-		printf("%02x", digest[i]);
+	for (i = 0; i < sizeof(priv->digest); i++)
+		printf("%02x", priv->digest[i]);
 	printf("  %s\n", f);
 }
diff --git a/sha1sum.c b/sha1sum.c
index e38346a..558be90 100644
--- a/sha1sum.c
+++ b/sha1sum.c
_AT_@ -1,15 +1,28 @@
 /* See LICENSE file for copyright and license details. */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include "util.h"
+#include "crypt.h"
 #include "sha1.h"
 
-static void sha1sum(int fd, const char *f);
+static void crypt_sha1_init(struct crypt_ops *);
+static void crypt_sha1_update(struct crypt_ops *, const void *, unsigned long);
+static void crypt_sha1_sum(struct crypt_ops *);
+static void crypt_sha1_print(struct crypt_ops *, const char *);
+
+struct sha1_priv {
+	struct sha1 s;
+	unsigned char digest[SHA1_DIGEST_LENGTH];
+} sha1_priv;
+
+struct crypt_ops sha1_ops = {
+	crypt_sha1_init,
+	crypt_sha1_update,
+	crypt_sha1_sum,
+	crypt_sha1_print,
+	&sha1_priv,
+};
 
 static void
 usage(void)
_AT_@ -20,7 +33,7 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
-	int fd;
+	FILE *fp;
 
 	ARGBEGIN {
 	default:
_AT_@ -28,13 +41,13 @@ main(int argc, char *argv[])
 	} ARGEND;
 
 	if (argc == 0) {
-		sha1sum(STDIN_FILENO, "<stdin>");
+		cryptsum(&sha1_ops, stdin, "<stdin>");
 	} else {
 		for (; argc > 0; argc--) {
-			if ((fd = open(*argv, O_RDONLY)) < 0)
-				eprintf("open %s:", *argv);
-			sha1sum(fd, *argv);
-			close(fd);
+			if ((fp = fopen(*argv, "r")) == NULL)
+				eprintf("fopen %s:", *argv);
+			cryptsum(&sha1_ops, fp, *argv);
+			fclose(fp);
 			argv++;
 		}
 	}
_AT_@ -43,25 +56,36 @@ main(int argc, char *argv[])
 }
 
 static void
-sha1sum(int fd, const char *f)
+crypt_sha1_init(struct crypt_ops *ops)
 {
-	unsigned char buf[BUFSIZ];
-	unsigned char digest[SHA1_DIGEST_LENGTH];
-	struct sha1 s;
-	ssize_t n;
-	int i;
+	struct sha1_priv *priv = ops->priv;
 
-	sha1_init(&s);
-	while ((n = read(fd, buf, sizeof buf)) > 0)
-		sha1_update(&s, buf, n);
-	if (n < 0) {
-		eprintf("%s: read error:", f);
-		return;
-	}
+	sha1_init(&priv->s);
+}
+
+static void
+crypt_sha1_update(struct crypt_ops *ops, const void *m, unsigned long len)
+{
+	struct sha1_priv *priv = ops->priv;
+
+	sha1_update(&priv->s, m, len);
+}
+
+static void
+crypt_sha1_sum(struct crypt_ops *ops)
+{
+	struct sha1_priv *priv = ops->priv;
 
-	sha1_sum(&s, digest);
+	sha1_sum(&priv->s, priv->digest);
+}
+
+static void
+crypt_sha1_print(struct crypt_ops *ops, const char *f)
+{
+	struct sha1_priv *priv = ops->priv;
+	int i;
 
-	for (i = 0; i < sizeof(digest); i++)
-		printf("%02x", digest[i]);
+	for (i = 0; i < sizeof(priv->digest); i++)
+		printf("%02x", priv->digest[i]);
 	printf("  %s\n", f);
 }
diff --git a/util/crypt.c b/util/crypt.c
new file mode 100644
index 0000000..878e18d
--- /dev/null
+++ b/util/crypt.c
_AT_@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "../util.h"
+#include "../crypt.h"
+
+int
+cryptsum(struct crypt_ops *ops, FILE *fp, const char *f)
+{
+	unsigned char buf[BUFSIZ];
+	size_t n;
+
+	ops->init(ops);
+	while ((n = fread(buf, 1, sizeof(buf), fp)) > 0)
+		ops->update(ops, buf, n);
+	if (ferror(fp)) {
+		eprintf("%s: read error:", f);
+		return 1;
+	}
+	ops->sum(ops);
+	/* Optionally, print the message digest */
+	if (ops->print)
+		ops->print(ops, f);
+	return 0;
+}
-- 
1.8.3.2
--/04w6evG8XlLl3ft--
Received on Mon Sep 17 2001 - 00:00:00 CEST

This archive was generated by hypermail 2.3.0 : Sun Jul 07 2013 - 17:24:05 CEST