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
This commit is contained in:
Thomas Quinot 2014-05-07 19:22:54 +00:00
parent 37e9c1d132
commit 4d6bab2606
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=265591
2 changed files with 44 additions and 5 deletions

View File

@ -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

View File

@ -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