From 73dd3167345391095dd7c75aefa870a5bce92397 Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Sat, 9 Oct 1999 11:54:14 +0000 Subject: mount* fixes from Martin Blapp : Made mount more userfriendly (bad slashes are now filtered out) and we remove in mount_nfs trailing slashes if there are any. Fixed mount_xxx binarys to resolve with realpath(3) the mountpoint. Translate the deprecated nfs-syntax with '@' to ':' . The ':' syntax has now precedence, but '@' still works. Notify the user that the '@' syntax should not be used. PR: 7846 PR: 13692 Submitted by: Martin Blapp Reviewed by: phk --- sbin/mount_ifs/getmntopts.c | 39 +++++++++++++++++++++++++++++++++++++++ sbin/mount_ifs/mntopts.h | 2 ++ sbin/mount_ifs/mount.c | 14 +++----------- 3 files changed, 44 insertions(+), 11 deletions(-) (limited to 'sbin/mount_ifs') diff --git a/sbin/mount_ifs/getmntopts.c b/sbin/mount_ifs/getmntopts.c index c80c26281fb6..ffc18bfac219 100644 --- a/sbin/mount_ifs/getmntopts.c +++ b/sbin/mount_ifs/getmntopts.c @@ -41,10 +41,13 @@ static const char rcsid[] = #endif /* not lint */ #include +#include #include +#include #include #include +#include #include "mntopts.h" @@ -106,3 +109,39 @@ getmntopts(options, m0, flagp, altflagp) free(optbuf); } + +void +rmslashes(rrpin, rrpout) + char *rrpin; + char *rrpout; +{ + char *rrpoutstart; + + *rrpout = *rrpin; + for (rrpoutstart = rrpout; *rrpin != '\0'; *rrpout++ = *rrpin++) { + + /* skip all double slashes */ + while (*rrpin == '/' && *(rrpin + 1) == '/') + rrpin++; + } + + /* remove trailing slash if necessary */ + if (rrpout - rrpoutstart > 1 && *(rrpout - 1) == '/') + *(rrpout - 1) = '\0'; + else + *rrpout = '\0'; +} + +void +checkpath(path, resolved) + const char *path; + char *resolved; +{ + struct stat sb; + + if (realpath(path, resolved) != NULL && stat(resolved, &sb) == 0) { + if (!S_ISDIR(sb.st_mode)) + errx(EX_USAGE, "%s: not a directory", resolved); + } else + errx(EX_USAGE, "%s: %s", resolved, strerror(errno)); +} diff --git a/sbin/mount_ifs/mntopts.h b/sbin/mount_ifs/mntopts.h index dd98298dba62..73c3c15a838f 100644 --- a/sbin/mount_ifs/mntopts.h +++ b/sbin/mount_ifs/mntopts.h @@ -88,4 +88,6 @@ struct mntopt { MOPT_NOCLUSTERW void getmntopts __P((const char *, const struct mntopt *, int *, int *)); +void rmslashes __P((char *, char *)); +void checkpath __P((const char *, char resolved_path[])); extern int getmnt_silent; diff --git a/sbin/mount_ifs/mount.c b/sbin/mount_ifs/mount.c index 039ee9542e07..b84696a2944d 100644 --- a/sbin/mount_ifs/mount.c +++ b/sbin/mount_ifs/mount.c @@ -61,6 +61,7 @@ static const char rcsid[] = #include #include "extern.h" +#include "mntopts.h" #include "pathnames.h" /* `meta' options */ @@ -354,7 +355,6 @@ mountfs(vfstype, spec, name, flags, options, mntopts) NULL }; const char *argv[100], **edir; - struct stat sb; struct statfs sf; pid_t pid; int argc, i, status; @@ -365,16 +365,8 @@ mountfs(vfstype, spec, name, flags, options, mntopts) (void)&name; #endif - if (realpath(name, mntpath) != NULL && stat(mntpath, &sb) == 0) { - if (!S_ISDIR(sb.st_mode)) { - warnx("%s: not a directory", mntpath); - return (1); - } - } else { - warn("%s", mntpath); - return (1); - } - + /* resolve the mountpoint with realpath(3) */ + (void)checkpath(name, mntpath); name = mntpath; if (mntopts == NULL) -- cgit v1.2.3