svn commit: r294037 - head/lib/libmd

Jonathan T. Looney jtl at FreeBSD.org
Thu Jan 14 21:08:25 UTC 2016


Author: jtl
Date: Thu Jan 14 21:08:23 2016
New Revision: 294037
URL: https://svnweb.freebsd.org/changeset/base/294037

Log:
  Improvements to the MDXFileChunk() template function:
  - Remove unneeded fstat()/lseek() calls.
  - Return NULL and set errno to EINVAL on negative length.
  - Fix small style problems and expand variable names.
  
  After this change, it is possible to use this code for some irregular
  files. For example, 'md5 /dev/md0' should now succeed.
  
  Differential Revision:	https://reviews.freebsd.org/D4748
  Suggested by:	bde
  Reviewed by:	bde, allanjude, delphij

Modified:
  head/lib/libmd/mdXhl.c

Modified: head/lib/libmd/mdXhl.c
==============================================================================
--- head/lib/libmd/mdXhl.c	Thu Jan 14 20:51:48 2016	(r294036)
+++ head/lib/libmd/mdXhl.c	Thu Jan 14 21:08:23 2016	(r294037)
@@ -1,4 +1,5 @@
-/* mdXhl.c * ----------------------------------------------------------------------------
+/* mdXhl.c
+ * ----------------------------------------------------------------------------
  * "THE BEER-WARE LICENSE" (Revision 42):
  * <phk at FreeBSD.org> wrote this file.  As long as you retain this notice you
  * can do whatever you want with this stuff. If we meet some day, and you think
@@ -52,43 +53,44 @@ MDXFileChunk(const char *filename, char 
 	unsigned char buffer[16*1024];
 	MDX_CTX ctx;
 	struct stat stbuf;
-	int f, i, e;
-	off_t n;
+	int fd, readrv, e;
+	off_t remain;
 
-	MDXInit(&ctx);
-	f = open(filename, O_RDONLY);
-	if (f < 0)
-		return 0;
-	if (fstat(f, &stbuf) < 0) {
-		i = -1;
-		goto error;
+	if (len < 0) {
+		errno = EINVAL;
+		return NULL;
 	}
-	if (ofs > stbuf.st_size)
-		ofs = stbuf.st_size;
-	if ((len == 0) || (len > stbuf.st_size - ofs))
-		len = stbuf.st_size - ofs;
-	if (lseek(f, ofs, SEEK_SET) < 0) {
-		i = -1;
-		goto error;
+
+	MDXInit(&ctx);
+	fd = open(filename, O_RDONLY);
+	if (fd < 0)
+		return NULL;
+	if (ofs != 0) {
+		errno = 0;
+		if (lseek(fd, ofs, SEEK_SET) != ofs ||
+		    (ofs == -1 && errno != 0)) {
+			readrv = -1;
+			goto error;
+		}
 	}
-	n = len;
-	i = 0;
-	while (n > 0) {
-		if (n > sizeof(buffer))
-			i = read(f, buffer, sizeof(buffer));
+	remain = len;
+	readrv = 0;
+	while (len == 0 || remain > 0) {
+		if (len == 0 || remain > sizeof(buffer))
+			readrv = read(fd, buffer, sizeof(buffer));
 		else
-			i = read(f, buffer, n);
-		if (i <= 0) 
+			readrv = read(fd, buffer, remain);
+		if (readrv <= 0) 
 			break;
-		MDXUpdate(&ctx, buffer, i);
-		n -= i;
+		MDXUpdate(&ctx, buffer, readrv);
+		remain -= readrv;
 	} 
 error:
 	e = errno;
-	close(f);
+	close(fd);
 	errno = e;
-	if (i < 0)
-		return 0;
+	if (readrv < 0)
+		return NULL;
 	return (MDXEnd(&ctx, buf));
 }
 


More information about the svn-src-head mailing list