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
This commit is contained in:
Edward Tomasz Napierala 2016-03-23 12:13:53 +00:00
parent 6336aefc1d
commit e299e01f56
3 changed files with 39 additions and 8 deletions

View File

@ -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" }'

View File

@ -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

View File

@ -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);
}