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:
parent
37e9c1d132
commit
4d6bab2606
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user