Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 May 2014 19:22:54 +0000 (UTC)
From:      Thomas Quinot <thomas@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r265591 - head/usr.bin/stat
Message-ID:  <201405071922.s47JMs6Q042026@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405071922.s47JMs6Q042026>