aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/showmount/showmount.c
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2016-03-23 12:13:53 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2016-03-23 12:13:53 +0000
commite299e01f56f4f92cf7a69bf772e61bb01ef6802c (patch)
tree27d180cd2ef5ba04581cc4aeb1f0d24cca04c440 /usr.bin/showmount/showmount.c
parent6336aefc1d959e7de287f7685381d5a496de1520 (diff)
downloadsrc-e299e01f56f4f92cf7a69bf772e61bb01ef6802c.tar.gz
src-e299e01f56f4f92cf7a69bf772e61bb01ef6802c.zip
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
Notes
Notes: svn path=/head/; revision=297207
Diffstat (limited to 'usr.bin/showmount/showmount.c')
-rw-r--r--usr.bin/showmount/showmount.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/usr.bin/showmount/showmount.c b/usr.bin/showmount/showmount.c
index d0da5705064c..46e58e4ba74a 100644
--- a/usr.bin/showmount/showmount.c
+++ b/usr.bin/showmount/showmount.c
@@ -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 prognum, int versnum, int procnum,
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);
}