Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 May 2014 18:49:19 +0000 (UTC)
From:      Thomas Quinot <thomas@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r265893 - head/usr.bin/stat
Message-ID:  <201405111849.s4BInJwS025302@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: thomas
Date: Sun May 11 18:49:18 2014
New Revision: 265893
URL: http://svnweb.freebsd.org/changeset/base/265893

Log:
  Minor fixes to previous change introducing switch -H, as per comments
  on -arch.
  
  Reviewed by:	gleb

Modified:
  head/usr.bin/stat/stat.1
  head/usr.bin/stat/stat.c

Modified: head/usr.bin/stat/stat.1
==============================================================================
--- head/usr.bin/stat/stat.1	Sun May 11 18:27:04 2014	(r265892)
+++ head/usr.bin/stat/stat.1	Sun May 11 18:49:18 2014	(r265893)
@@ -130,6 +130,7 @@ and use
 .Xr fhstat 2
 instead of
 .Xr lstat 2 .
+This requires root privileges.
 .It Fl L
 Use
 .Xr stat 2

Modified: head/usr.bin/stat/stat.c
==============================================================================
--- head/usr.bin/stat/stat.c	Sun May 11 18:27:04 2014	(r265892)
+++ head/usr.bin/stat/stat.c	Sun May 11 18:49:18 2014	(r265893)
@@ -186,6 +186,7 @@ int	format1(const struct stat *,	/* stat
 	    char *, size_t,		/* a place to put the output */
 	    int, int, int, int,		/* the parsed format */
 	    int, int);
+int	hex2byte(const char [2]);
 #if HAVE_STRUCT_STAT_ST_FLAGS
 char   *xfflagstostr(unsigned long);
 #endif
@@ -214,7 +215,7 @@ main(int argc, char *argv[])
 	lsF = 0;
 	fmtchar = '\0';
 	usestat = 0;
-        nfs_handle = 0;
+	nfs_handle = 0;
 	nonl = 0;
 	quiet = 0;
 	linkfail = 0;
@@ -327,32 +328,27 @@ main(int argc, char *argv[])
 			rc = fstat(STDIN_FILENO, &st);
 		} else {
 			int j;
-			char *inval;
 
 			file = argv[0];
 			if (nfs_handle) {
 				rc = 0;
-				bzero (&fhnd, sizeof fhnd);
-				j = MIN(2 * sizeof fhnd, strlen(file));
-				if (j & 1) {
+				bzero(&fhnd, sizeof(fhnd));
+				j = MIN(2 * sizeof(fhnd), strlen(file));
+				if ((j & 1) != 0) {
 					rc = -1;
 				} else {
 					while (j) {
-						((char*) &fhnd)[j / 2 - 1] =
-						    strtol(&file[j - 2],
-						           &inval, 16);
-						if (inval != NULL) {
-							rc = -1;
+						rc = hex2byte(&file[j - 2]);
+						if (rc == -1)
 							break;
-						}
-						argv[0][j - 2] = '\0';
+						((char*) &fhnd)[j / 2 - 1] = rc;
 						j -= 2;
 					}
-					if (!rc)
-						rc = fhstat(&fhnd, &st);
-					else
-						errno = EINVAL;
 				}
+				if (rc == -1)
+					errno = EINVAL;
+				else
+					rc = fhstat(&fhnd, &st);
 
 			} else if (usestat) {
 				/*
@@ -1091,3 +1087,12 @@ format1(const struct stat *st,
 
 	return (snprintf(buf, blen, lfmt, data));
 }
+
+
+#define hex2nibble(c) (c <= '9' ? c - '0' : toupper(c) - 'A' + 10)
+int
+hex2byte(const char c[2]) {
+	if (!(ishexnumber(c[0]) && ishexnumber(c[1])))
+		return -1;
+	return (hex2nibble(c[0]) << 4) + hex2nibble(c[1]);
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405111849.s4BInJwS025302>