[PATCH] Add sum.[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    |  3 ++-
 md5.h       |  6 +++---
 md5sum.c    | 49 +++++++++++++++++++++----------------------------
 sha1.h      |  6 +++---
 sha1sum.c   | 49 +++++++++++++++++++++----------------------------
 sum.h       | 10 ++++++++++
 util/md5.c  |  9 ++++++---
 util/sha1.c | 10 +++++++---
 util/sum.c  | 25 +++++++++++++++++++++++++
 9 files changed, 98 insertions(+), 69 deletions(-)
 create mode 100644 sum.h
 create mode 100644 util/sum.c
diff --git a/Makefile b/Makefile
index f825ec4..a5cd1e4 100644
--- a/Makefile
+++ b/Makefile
_AT_@ -19,7 +19,8 @@ LIB = \
 	util/putword.o   \
 	util/recurse.o   \
 	util/rm.o        \
-	util/sha1.o
+	util/sha1.o      \
+	util/sum.o
 
 SRC = \
 	basename.c \
diff --git a/md5.h b/md5.h
index 0895d3e..0b5005e 100644
--- a/md5.h
+++ b/md5.h
_AT_@ -9,10 +9,10 @@ struct md5 {
 enum { MD5_DIGEST_LENGTH = 16 };
 
 /* reset state */
-void md5_init(struct md5 *s);
+void md5_init(void *ctx);
 /* process message */
-void md5_update(struct md5 *s, const void *m, unsigned long len);
+void md5_update(void *ctx, const void *m, unsigned long len);
 /* get message digest */
 /* state is ruined after sum, keep a copy if multiple sum is needed */
 /* part of the message might be left in s, zero it if secrecy is needed */
-void md5_sum(struct md5 *s, uint8_t md[MD5_DIGEST_LENGTH]);
+void md5_sum(void *ctx, uint8_t md[MD5_DIGEST_LENGTH]);
diff --git a/md5sum.c b/md5sum.c
index 722416f..4077bc8 100644
--- a/md5sum.c
+++ b/md5sum.c
_AT_@ -1,15 +1,21 @@
 /* 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 "sum.h"
 #include "md5.h"
 
-static void md5sum(int fd, const char *f);
+static void md5_print(void *, const char *, uint8_t *);
+
+struct md5 s;
+struct sum_ops md5_ops = {
+	md5_init,
+	md5_update,
+	md5_sum,
+	md5_print,
+	&s,
+};
 
 static void
 usage(void)
_AT_@ -20,7 +26,8 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
-	int fd;
+	FILE *fp;
+	uint8_t md[MD5_DIGEST_LENGTH];
 
 	ARGBEGIN {
 	default:
_AT_@ -28,13 +35,13 @@ main(int argc, char *argv[])
 	} ARGEND;
 
 	if (argc == 0) {
-		md5sum(STDIN_FILENO, "<stdin>");
+		sum(&md5_ops, stdin, "<stdin>", md);
 	} 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);
+			sum(&md5_ops, fp, *argv, md);
+			fclose(fp);
 			argv++;
 		}
 	}
_AT_@ -43,25 +50,11 @@ main(int argc, char *argv[])
 }
 
 static void
-md5sum(int fd, const char *f)
+md5_print(void *s, const char *f, uint8_t *md)
 {
-	unsigned char buf[BUFSIZ];
-	unsigned char digest[MD5_DIGEST_LENGTH];
-	struct md5 s;
-	ssize_t n;
 	int i;
 
-	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_sum(&s, digest);
-
-	for (i = 0; i < sizeof(digest); i++)
-		printf("%02x", digest[i]);
+	for (i = 0; i < MD5_DIGEST_LENGTH; i++)
+		printf("%02x", md[i]);
 	printf("  %s\n", f);
 }
diff --git a/sha1.h b/sha1.h
index e11f49e..8631777 100644
--- a/sha1.h
+++ b/sha1.h
_AT_@ -9,10 +9,10 @@ struct sha1 {
 enum { SHA1_DIGEST_LENGTH = 20 };
 
 /* reset state */
-void sha1_init(struct sha1 *s);
+void sha1_init(void *ctx);
 /* process message */
-void sha1_update(struct sha1 *s, const void *m, unsigned long len);
+void sha1_update(void *ctx, const void *m, unsigned long len);
 /* get message digest */
 /* state is ruined after sum, keep a copy if multiple sum is needed */
 /* part of the message might be left in s, zero it if secrecy is needed */
-void sha1_sum(struct sha1 *s, uint8_t md[SHA1_DIGEST_LENGTH]);
+void sha1_sum(void *ctx, uint8_t md[SHA1_DIGEST_LENGTH]);
diff --git a/sha1sum.c b/sha1sum.c
index e38346a..d948966 100644
--- a/sha1sum.c
+++ b/sha1sum.c
_AT_@ -1,15 +1,21 @@
 /* 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 "sum.h"
 #include "sha1.h"
 
-static void sha1sum(int fd, const char *f);
+static void sha1_print(void *, const char *, uint8_t *);
+
+struct sha1 s;
+struct sum_ops sha1_ops = {
+	sha1_init,
+	sha1_update,
+	sha1_sum,
+	sha1_print,
+	&s,
+};
 
 static void
 usage(void)
_AT_@ -20,7 +26,8 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
-	int fd;
+	FILE *fp;
+	uint8_t md[SHA1_DIGEST_LENGTH];
 
 	ARGBEGIN {
 	default:
_AT_@ -28,13 +35,13 @@ main(int argc, char *argv[])
 	} ARGEND;
 
 	if (argc == 0) {
-		sha1sum(STDIN_FILENO, "<stdin>");
+		sum(&sha1_ops, stdin, "<stdin>", md);
 	} 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);
+			sum(&sha1_ops, fp, *argv, md);
+			fclose(fp);
 			argv++;
 		}
 	}
_AT_@ -43,25 +50,11 @@ main(int argc, char *argv[])
 }
 
 static void
-sha1sum(int fd, const char *f)
+sha1_print(void *s, const char *f, uint8_t *md)
 {
-	unsigned char buf[BUFSIZ];
-	unsigned char digest[SHA1_DIGEST_LENGTH];
-	struct sha1 s;
-	ssize_t n;
 	int i;
 
-	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_sum(&s, digest);
-
-	for (i = 0; i < sizeof(digest); i++)
-		printf("%02x", digest[i]);
+	for (i = 0; i < SHA1_DIGEST_LENGTH; i++)
+		printf("%02x", md[i]);
 	printf("  %s\n", f);
 }
diff --git a/sum.h b/sum.h
new file mode 100644
index 0000000..0804fff
--- /dev/null
+++ b/sum.h
_AT_@ -0,0 +1,10 @@
+struct sum_ops {
+	void (*init)(void *);
+	void (*update)(void *, const void *, unsigned long);
+	void (*sum)(void *, uint8_t *);
+	void (*print)(void *, const char *, uint8_t *);
+	void *s;
+};
+
+int sum(struct sum_ops *ops, FILE *fp, const char *f,
+	uint8_t *md);
diff --git a/util/md5.c b/util/md5.c
index 0d8353d..b68f729 100644
--- a/util/md5.c
+++ b/util/md5.c
_AT_@ -95,8 +95,9 @@ static void pad(struct md5 *s)
 	processblock(s, s->buf);
 }
 
-void md5_init(struct md5 *s)
+void md5_init(void *ctx)
 {
+	struct md5 *s = ctx;
 	s->len = 0;
 	s->h[0] = 0x67452301;
 	s->h[1] = 0xefcdab89;
_AT_@ -104,8 +105,9 @@ void md5_init(struct md5 *s)
 	s->h[3] = 0x10325476;
 }
 
-void md5_sum(struct md5 *s, uint8_t md[16])
+void md5_sum(void *ctx, uint8_t md[16])
 {
+	struct md5 *s = ctx;
 	int i;
 
 	pad(s);
_AT_@ -117,8 +119,9 @@ void md5_sum(struct md5 *s, uint8_t md[16])
 	}
 }
 
-void md5_update(struct md5 *s, const void *m, unsigned long len)
+void md5_update(void *ctx, const void *m, unsigned long len)
 {
+	struct md5 *s = ctx;
 	const uint8_t *p = m;
 	unsigned r = s->len % 64;
 
diff --git a/util/sha1.c b/util/sha1.c
index 9910d78..a298f9f 100644
--- a/util/sha1.c
+++ b/util/sha1.c
_AT_@ -89,8 +89,10 @@ static void pad(struct sha1 *s)
 	processblock(s, s->buf);
 }
 
-void sha1_init(struct sha1 *s)
+void sha1_init(void *ctx)
 {
+	struct sha1 *s = ctx;
+
 	s->len = 0;
 	s->h[0] = 0x67452301;
 	s->h[1] = 0xEFCDAB89;
_AT_@ -99,8 +101,9 @@ void sha1_init(struct sha1 *s)
 	s->h[4] = 0xC3D2E1F0;
 }
 
-void sha1_sum(struct sha1 *s, uint8_t md[20])
+void sha1_sum(void *ctx, uint8_t md[20])
 {
+	struct sha1 *s = ctx;
 	int i;
 
 	pad(s);
_AT_@ -112,8 +115,9 @@ void sha1_sum(struct sha1 *s, uint8_t md[20])
 	}
 }
 
-void sha1_update(struct sha1 *s, const void *m, unsigned long len)
+void sha1_update(void *ctx, const void *m, unsigned long len)
 {
+	struct sha1 *s = ctx;
 	const uint8_t *p = m;
 	unsigned r = s->len % 64;
 
diff --git a/util/sum.c b/util/sum.c
new file mode 100644
index 0000000..66dcb4d
--- /dev/null
+++ b/util/sum.c
_AT_@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "../util.h"
+#include "../sum.h"
+
+int
+sum(struct sum_ops *ops, FILE *fp, const char *f,
+    uint8_t *md)
+{
+	unsigned char buf[BUFSIZ];
+	size_t n;
+
+	ops->init(ops->s);
+	while ((n = fread(buf, 1, sizeof(buf), fp)) > 0)
+		ops->update(ops->s, buf, n);
+	if (ferror(fp)) {
+		eprintf("%s: read error:", f);
+		return 1;
+	}
+	ops->sum(ops->s, md);
+	if (ops->print)
+		ops->print(ops->s, f, md);
+	return 0;
+}
-- 
1.8.3.2
--J2SCkAp4GZ/dPZZf--
Received on Mon Sep 17 2001 - 00:00:00 CEST

This archive was generated by hypermail 2.3.0 : Fri Jul 12 2013 - 14:12:03 CEST