svn commit: r265591 - head/usr.bin/stat
Thomas Quinot
thomas at FreeBSD.org
Wed May 7 19:22:55 UTC 2014
Author: thomas
Date: Wed May 7 19:22:54 2014
New Revision: 265591
URL: http://svnweb.freebsd.org/changeset/base/265591
Log:
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
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 Wed May 7 19:20:54 2014 (r265590)
+++ head/usr.bin/stat/stat.1 Wed May 7 19:22:54 2014 (r265591)
@@ -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
Modified: head/usr.bin/stat/stat.c
==============================================================================
--- head/usr.bin/stat/stat.c Wed May 7 19:20:54 2014 (r265590)
+++ head/usr.bin/stat/stat.c Wed May 7 19:22:54 2014 (r265591)
@@ -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
More information about the svn-src-head
mailing list