summaryrefslogtreecommitdiff
path: root/usr.bin/stat
diff options
context:
space:
mode:
authorThomas Quinot <thomas@FreeBSD.org>2014-05-07 19:22:54 +0000
committerThomas Quinot <thomas@FreeBSD.org>2014-05-07 19:22:54 +0000
commit4d6bab260694ec8e1dc76b18a11d95fcdd7a0a8a (patch)
treea33cedebf41dae95e04622bee9dcdc3a96a7cdbc /usr.bin/stat
parent37e9c1d132f9f9dc8f1cc1f83dadb851d26bcb2f (diff)
downloadsrc-test-4d6bab260694ec8e1dc76b18a11d95fcdd7a0a8a.tar.gz
src-test-4d6bab260694ec8e1dc76b18a11d95fcdd7a0a8a.zip
Introduce a new command line switch '-H' for stat(1)
causing arguments to be interpreted as NFS file handles. Reviewed by: -arch (jhb, eadler) MFC after: 1 month
Notes
Notes: svn path=/head/; revision=265591
Diffstat (limited to 'usr.bin/stat')
-rw-r--r--usr.bin/stat/stat.18
-rw-r--r--usr.bin/stat/stat.c41
2 files changed, 44 insertions, 5 deletions
diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1
index 7d591b88a03a5..eb8894ca8cda0 100644
--- a/usr.bin/stat/stat.1
+++ b/usr.bin/stat/stat.1
@@ -38,7 +38,7 @@
.Nd display file status
.Sh SYNOPSIS
.Nm
-.Op Fl FLnq
+.Op Fl FHLnq
.Op Fl f Ar format | Fl l | r | s | x
.Op Fl t Ar timefmt
.Op Ar
@@ -124,6 +124,12 @@ The use of
.Fl F
implies
.Fl l .
+.It Fl H
+Treat each argument as the hexadecimal representation of an NFS file handle,
+and use
+.Xr fhstat 2
+instead of
+.Xr lstat 2 .
.It Fl L
Use
.Xr stat 2
diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c
index 984ec7b493b85..7b43882c606e0 100644
--- a/usr.bin/stat/stat.c
+++ b/usr.bin/stat/stat.c
@@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/mount.h>
#include <ctype.h>
#include <err.h>
@@ -203,15 +204,17 @@ main(int argc, char *argv[])
{
struct stat st;
int ch, rc, errs, am_readlink;
- int lsF, fmtchar, usestat, fn, nonl, quiet;
+ int lsF, fmtchar, usestat, nfs_handle, fn, nonl, quiet;
const char *statfmt, *options, *synopsis;
char dname[sizeof _PATH_DEV + SPECNAMELEN] = _PATH_DEV;
+ fhandle_t fhnd;
const char *file;
am_readlink = 0;
lsF = 0;
fmtchar = '\0';
usestat = 0;
+ nfs_handle = 0;
nonl = 0;
quiet = 0;
linkfail = 0;
@@ -226,9 +229,9 @@ main(int argc, char *argv[])
fmtchar = 'f';
quiet = 1;
} else {
- options = "f:FlLnqrst:x";
+ options = "f:FHlLnqrst:x";
synopsis = "[-FLnq] [-f format | -l | -r | -s | -x] "
- "[-t timefmt] [file ...]";
+ "[-t timefmt] [file|handle ...]";
}
while ((ch = getopt(argc, argv, options)) != -1)
@@ -236,6 +239,9 @@ main(int argc, char *argv[])
case 'F':
lsF = 1;
break;
+ case 'H':
+ nfs_handle = 1;
+ break;
case 'L':
usestat = 1;
break;
@@ -320,8 +326,35 @@ main(int argc, char *argv[])
file = "(stdin)";
rc = fstat(STDIN_FILENO, &st);
} else {
+ int j;
+ char *inval;
+
file = argv[0];
- if (usestat) {
+ if (nfs_handle) {
+ rc = 0;
+ bzero (&fhnd, sizeof fhnd);
+ j = MIN(2 * sizeof fhnd, strlen(file));
+ if (j & 1) {
+ rc = -1;
+ } else {
+ while (j) {
+ ((char*) &fhnd)[j / 2 - 1] =
+ strtol(&file[j - 2],
+ &inval, 16);
+ if (inval != NULL) {
+ rc = -1;
+ break;
+ }
+ argv[0][j - 2] = '\0';
+ j -= 2;
+ }
+ if (!rc)
+ rc = fhstat(&fhnd, &st);
+ else
+ errno = EINVAL;
+ }
+
+ } else if (usestat) {
/*
* Try stat() and if it fails, fall back to
* lstat() just in case we're examining a