diff options
Diffstat (limited to 'sbin/mount_ifs')
-rw-r--r-- | sbin/mount_ifs/getmntopts.c | 39 | ||||
-rw-r--r-- | sbin/mount_ifs/mntopts.h | 2 | ||||
-rw-r--r-- | sbin/mount_ifs/mount.c | 14 |
3 files changed, 44 insertions, 11 deletions
diff --git a/sbin/mount_ifs/getmntopts.c b/sbin/mount_ifs/getmntopts.c index c80c262..ffc18bf 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 <sys/param.h> +#include <sys/stat.h> #include <err.h> +#include <errno.h> #include <stdlib.h> #include <string.h> +#include <sysexits.h> #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 dd98298..73c3c15 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 039ee95..b84696a 100644 --- a/sbin/mount_ifs/mount.c +++ b/sbin/mount_ifs/mount.c @@ -61,6 +61,7 @@ static const char rcsid[] = #include <unistd.h> #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) |