Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 May 2014 11:12:13 +0200
From:      Thomas Quinot <thomas@FreeBSD.ORG>
To:        freebsd-arch@freebsd.org
Subject:   Proposed extension to stat(1)
Message-ID:  <20140507091213.GA55856@melamine.cuivre.fr.eu.org>

next in thread | raw e-mail | index | archive | help
I'm proposing the addition of a command line switch -H to stat(1),
causing arguments to be interpreted as NFS file handles instead of file
names. This comes in handy when investigating NFS load issues.

(A further possible extension would be to optionally include information
from statfs/fhstatfs, but that's next on my list :) ).

Thomas.

Index: usr.bin/stat/stat.1
===================================================================
--- usr.bin/stat/stat.1	(révision 265192)
+++ usr.bin/stat/stat.1	(copie de travail)
@@ -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 @@
 .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
Index: usr.bin/stat/stat.c
===================================================================
--- usr.bin/stat/stat.c	(révision 265192)
+++ usr.bin/stat/stat.c	(copie de travail)
@@ -50,6 +50,7 @@
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/mount.h>
 
 #include <ctype.h>
 #include <err.h>
@@ -203,9 +204,10 @@
 {
 	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;
@@ -212,6 +214,7 @@
 	lsF = 0;
 	fmtchar = '\0';
 	usestat = 0;
+        nfs_handle = 0;
 	nonl = 0;
 	quiet = 0;
 	linkfail = 0;
@@ -226,9 +229,9 @@
 		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 @@
 		case 'F':
 			lsF = 1;
 			break;
+                case 'H':
+			nfs_handle = 1;
+			break;
 		case 'L':
 			usestat = 1;
 			break;
@@ -320,8 +326,33 @@
 				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?20140507091213.GA55856>