svn commit: r297207 - in head: etc/autofs usr.bin/showmount
Edward Tomasz Napierala
trasz at FreeBSD.org
Wed Mar 23 12:13:54 UTC 2016
Author: trasz
Date: Wed Mar 23 12:13:53 2016
New Revision: 297207
URL: https://svnweb.freebsd.org/changeset/base/297207
Log:
Make the autofs(5) -hosts map more robust, primarily to make it correctly
handle NFS shares containing whitespace. This also adds the -E parameter
to showmount(8).
Reviewed by: emaste@, jhibbits@, wblock@
MFC after: 1 month
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D5649
Modified:
head/etc/autofs/special_hosts
head/usr.bin/showmount/showmount.8
head/usr.bin/showmount/showmount.c
Modified: head/etc/autofs/special_hosts
==============================================================================
--- head/etc/autofs/special_hosts Wed Mar 23 09:58:51 2016 (r297206)
+++ head/etc/autofs/special_hosts Wed Mar 23 12:13:53 2016 (r297207)
@@ -10,8 +10,8 @@ if [ $# -eq 0 ]; then
exit 0
fi
-out=`showmount -e "$1"`
+out=`showmount -E "$1"`
[ $? -eq 0 ] || exit 1
echo "$out" | awk -v host="$1" \
- 'NR > 1 { printf "%s\t%s:%s ", $1, host, $1 } END { printf "\n" }'
+ '{ printf "\"%s\"\t\"%s:%s\" ", $0, host, $0 } END { printf "\n" }'
Modified: head/usr.bin/showmount/showmount.8
==============================================================================
--- head/usr.bin/showmount/showmount.8 Wed Mar 23 09:58:51 2016 (r297206)
+++ head/usr.bin/showmount/showmount.8 Wed Mar 23 12:13:53 2016 (r297207)
@@ -31,7 +31,7 @@
.\" @(#)showmount.8 8.3 (Berkeley) 3/29/95
.\" $FreeBSD$
.\"
-.Dd August 16, 2014
+.Dd March 20, 2016
.Dt SHOWMOUNT 8
.Os
.Sh NAME
@@ -40,6 +40,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl a | d
+.Op Fl E
.Op Fl e
.Op Fl 1
.Op Fl 3
@@ -73,6 +74,12 @@ List all mount points in the form:
.Ed
.It Fl d
List directory paths of mount points instead of hosts.
+.It Fl E
+Show the
+.Ar host Ns 's
+exports list in a script-friendly format.
+Client addresses and the header are not shown, and special
+characters are escaped.
.It Fl e
Show the
.Ar host Ns 's
Modified: head/usr.bin/showmount/showmount.c
==============================================================================
--- head/usr.bin/showmount/showmount.c Wed Mar 23 09:58:51 2016 (r297206)
+++ head/usr.bin/showmount/showmount.c Wed Mar 23 12:13:53 2016 (r297207)
@@ -61,13 +61,15 @@ static const char rcsid[] =
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <vis.h>
/* Constant defs */
#define ALL 1
#define DIRS 2
-#define DODUMP 0x1
-#define DOEXPORTS 0x2
+#define DODUMP 0x1
+#define DOEXPORTS 0x2
+#define DOPARSABLEEXPORTS 0x4
struct mountlist {
struct mountlist *ml_left;
@@ -108,13 +110,14 @@ int tcp_callrpc(const char *host, int pr
int
main(int argc, char **argv)
{
+ char strvised[MNTPATHLEN * 4 + 1];
register struct exportslist *exp;
register struct grouplist *grp;
register int rpcs = 0, mntvers = 3;
const char *host;
- int ch, estat;
+ int ch, estat, nbytes;
- while ((ch = getopt(argc, argv, "ade13")) != -1)
+ while ((ch = getopt(argc, argv, "adEe13")) != -1)
switch (ch) {
case 'a':
if (type == 0) {
@@ -130,6 +133,9 @@ main(int argc, char **argv)
} else
usage();
break;
+ case 'E':
+ rpcs |= DOPARSABLEEXPORTS;
+ break;
case 'e':
rpcs |= DOEXPORTS;
break;
@@ -146,6 +152,13 @@ main(int argc, char **argv)
argc -= optind;
argv += optind;
+ if ((rpcs & DOPARSABLEEXPORTS) != 0) {
+ if ((rpcs & DOEXPORTS) != 0)
+ errx(1, "-E cannot be used with -e");
+ if ((rpcs & DODUMP) != 0)
+ errx(1, "-E cannot be used with -a or -d");
+ }
+
if (argc > 0)
host = *argv;
else
@@ -161,7 +174,7 @@ main(int argc, char **argv)
clnt_perrno(estat);
errx(1, "can't do mountdump rpc");
}
- if (rpcs & DOEXPORTS)
+ if (rpcs & (DOEXPORTS | DOPARSABLEEXPORTS))
if ((estat = tcp_callrpc(host, MOUNTPROG, mntvers,
MOUNTPROC_EXPORT, (xdrproc_t)xdr_void, (char *)0,
(xdrproc_t)xdr_exportslist, (char *)&exportslist)) != 0) {
@@ -202,6 +215,17 @@ main(int argc, char **argv)
exp = exp->ex_next;
}
}
+ if (rpcs & DOPARSABLEEXPORTS) {
+ exp = exportslist;
+ while (exp) {
+ nbytes = strsnvis(strvised, sizeof(strvised),
+ exp->ex_dirp, VIS_GLOB | VIS_NL, "\"'$");
+ if (nbytes == -1)
+ err(1, "strsnvis");
+ printf("%s\n", strvised);
+ exp = exp->ex_next;
+ }
+ }
exit(0);
}
More information about the svn-src-head
mailing list