diff options
author | jh <jh@FreeBSD.org> | 2012-01-16 19:34:21 +0000 |
---|---|---|
committer | jh <jh@FreeBSD.org> | 2012-01-16 19:34:21 +0000 |
commit | ae73284c1a1116d89c84235929df10421a348b30 (patch) | |
tree | 54d0a2f2ed01c217587bf7b24aec11a7fbcadd97 /sbin/mount | |
parent | 5a45f730a5625608124e818a7be2c3dbd2d20512 (diff) | |
download | FreeBSD-src-ae73284c1a1116d89c84235929df10421a348b30.zip FreeBSD-src-ae73284c1a1116d89c84235929df10421a348b30.tar.gz |
Change checkpath() to not exit on error. This is a prerequisite for
fixing the mount(8) "failok" option.
PR: 163668
Reviewed by: Garrett Cooper, delphij (previous version)
Diffstat (limited to 'sbin/mount')
-rw-r--r-- | sbin/mount/getmntopts.c | 12 | ||||
-rw-r--r-- | sbin/mount/mntopts.h | 2 | ||||
-rw-r--r-- | sbin/mount/mount.c | 5 | ||||
-rw-r--r-- | sbin/mount/mount_fs.c | 5 |
4 files changed, 17 insertions, 7 deletions
diff --git a/sbin/mount/getmntopts.c b/sbin/mount/getmntopts.c index 194b3df..3503060 100644 --- a/sbin/mount/getmntopts.c +++ b/sbin/mount/getmntopts.c @@ -124,16 +124,20 @@ rmslashes(char *rrpin, char *rrpout) *rrpout = '\0'; } -void +int checkpath(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); + if (!S_ISDIR(sb.st_mode)) { + errno = ENOTDIR; + return (1); + } } else - errx(EX_USAGE, "%s: %s", resolved, strerror(errno)); + return (1); + + return (0); } void diff --git a/sbin/mount/mntopts.h b/sbin/mount/mntopts.h index 2903d55..86a350f 100644 --- a/sbin/mount/mntopts.h +++ b/sbin/mount/mntopts.h @@ -93,7 +93,7 @@ struct mntopt { void getmntopts(const char *, const struct mntopt *, int *, int *); void rmslashes(char *, char *); -void checkpath(const char *, char resolved_path[]); +int checkpath(const char *, char resolved_path[]); extern int getmnt_silent; void build_iovec(struct iovec **iov, int *iovlen, const char *name, void *val, size_t len); void build_iovec_argf(struct iovec **iov, int *iovlen, const char *name, const char *fmt, ...); diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index cf142e4..ca81795 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -539,7 +539,10 @@ mountfs(const char *vfstype, const char *spec, const char *name, int flags, static struct cpa mnt_argv; /* resolve the mountpoint with realpath(3) */ - (void)checkpath(name, mntpath); + if (checkpath(name, mntpath) != 0) { + warn("%s", mntpath); + return (1); + } name = mntpath; if (mntopts == NULL) diff --git a/sbin/mount/mount_fs.c b/sbin/mount/mount_fs.c index 526d493..4c58857 100644 --- a/sbin/mount/mount_fs.c +++ b/sbin/mount/mount_fs.c @@ -118,7 +118,10 @@ mount_fs(const char *vfstype, int argc, char *argv[]) dev = argv[0]; dir = argv[1]; - (void)checkpath(dir, mntpath); + if (checkpath(dir, mntpath) != 0) { + warn("%s", mntpath); + return (1); + } (void)rmslashes(dev, dev); build_iovec(&iov, &iovlen, "fstype", fstype, (size_t)-1); |