From owner-freebsd-arch@FreeBSD.ORG Wed May 7 09:12:24 2014 Return-Path: Delivered-To: freebsd-arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 06A53CF for ; Wed, 7 May 2014 09:12:24 +0000 (UTC) Received: from melamine.cuivre.fr.eu.org (houdart.cuivre.fr.eu.org [81.57.40.110]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B74C8C7E for ; Wed, 7 May 2014 09:12:23 +0000 (UTC) Received: by melamine.cuivre.fr.eu.org (Postfix, from userid 1000) id A00DEF093; Wed, 7 May 2014 11:12:13 +0200 (CEST) Date: Wed, 7 May 2014 11:12:13 +0200 From: Thomas Quinot To: freebsd-arch@freebsd.org Subject: Proposed extension to stat(1) Message-ID: <20140507091213.GA55856@melamine.cuivre.fr.eu.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit X-message-flag: WARNING! Using Outlook can damage your computer. User-Agent: Mutt/1.5.22 (2013-10-16) X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 May 2014 09:12:24 -0000 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 #include #include +#include #include #include @@ -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