aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/stat
diff options
context:
space:
mode:
authorThomas Quinot <thomas@FreeBSD.org>2014-05-11 18:49:18 +0000
committerThomas Quinot <thomas@FreeBSD.org>2014-05-11 18:49:18 +0000
commit55298f03973650da6a63a786de542874120efb12 (patch)
treebb0ed1187909ad92dba66f0f75069f3c2da71d02 /usr.bin/stat
parente2fc1af45ed774470562952b97e52e9f57651bbd (diff)
downloadsrc-55298f03973650da6a63a786de542874120efb12.tar.gz
src-55298f03973650da6a63a786de542874120efb12.zip
Minor fixes to previous change introducing switch -H, as per comments
on -arch. Reviewed by: gleb
Notes
Notes: svn path=/head/; revision=265893
Diffstat (limited to 'usr.bin/stat')
-rw-r--r--usr.bin/stat/stat.11
-rw-r--r--usr.bin/stat/stat.c37
2 files changed, 22 insertions, 16 deletions
diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1
index eb8894ca8cda..0d6f3a2cba32 100644
--- a/usr.bin/stat/stat.1
+++ b/usr.bin/stat/stat.1
@@ -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
diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c
index 7b43882c606e..120febe18d60 100644
--- a/usr.bin/stat/stat.c
+++ b/usr.bin/stat/stat.c
@@ -186,6 +186,7 @@ int format1(const struct stat *, /* stat info */
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]);
+}