summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Dickson <steved@redhat.com>2007-05-17 10:04:19 +1000
committerNeil Brown <neilb@suse.de>2007-05-17 10:04:19 +1000
commit3b55934b9baefecee17aefc3ea139e261a4b03b8 (patch)
tree7f142f4dce457576bc9d0d6229cf6d5e04f1f0e5
parent1cb4a250fb9f0a8ba34befa47d951430e444a58e (diff)
downloadnfs-utils-3b55934b9baefecee17aefc3ea139e261a4b03b8.tar.gz
nfs-utils-3b55934b9baefecee17aefc3ea139e261a4b03b8.tar.xz
nfs-utils-3b55934b9baefecee17aefc3ea139e261a4b03b8.zip
mount.nfs - NFSv4 mounts give wrong error message when server denies the mount
When nfs4 mount fail because the exported directory does not exist, the mount command claims the local mount point does not exist which is wrong. This patch fixes that problem as well as makes the v4 mount failures look like v3/v2 failures. Signed-off-by: Steve Dickson <steved@redhat.com> Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r--utils/mount/mount.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/utils/mount/mount.c b/utils/mount/mount.c
index 52b0d67..171c714 100644
--- a/utils/mount/mount.c
+++ b/utils/mount/mount.c
@@ -285,22 +285,49 @@ static void parse_opts (const char *options, int *flags, char **extra_opts)
}
}
-static void mount_error(char *node)
+static void mount_error(char *mntpnt, char *node)
{
switch(errno) {
case ENOTDIR:
- fprintf(stderr, "%s: mount point %s is not a directory\n", progname, node);
+ fprintf(stderr, "%s: mount point %s is not a directory\n",
+ progname, mntpnt);
break;
case EBUSY:
- fprintf(stderr, "%s: %s is already mounted or busy\n", progname, node);
+ fprintf(stderr, "%s: %s is already mounted or busy\n",
+ progname, mntpnt);
break;
case ENOENT:
- fprintf(stderr, "%s: mount point %s does not exist\n", progname, node);
+ if (node) {
+ fprintf(stderr, "%s: %s failed, reason given by server: %s\n",
+ progname, node, strerror(errno));
+ } else
+ fprintf(stderr, "%s: mount point %s does not exist\n",
+ progname, mntpnt);
break;
default:
fprintf(stderr, "%s: %s\n", progname, strerror(errno));
}
}
+static int chk_mountpoint(mount_point)
+{
+ struct stat sb;
+
+ if (stat(mount_point, &sb) < 0){
+ mount_error(mount_point, NULL);
+ return 1;
+ }
+ if (S_ISDIR(sb.st_mode) == 0){
+ errno = ENOTDIR;
+ mount_error(mount_point, NULL);
+ return 1;
+ }
+ if (access(mount_point, X_OK) < 0) {
+ mount_error(mount_point, NULL);
+ return 1;
+ }
+
+ return 0;
+}
extern u_short getport(
struct sockaddr_in *saddr,
@@ -508,6 +535,9 @@ int main(int argc, char *argv[])
}
}
+ if (chk_mountpoint(mount_point))
+ exit(EX_FAIL);
+
if (nfs_mount_vers == 4)
mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0);
else {
@@ -538,7 +568,7 @@ int main(int argc, char *argv[])
mount_opts);
if (mnt_err) {
- mount_error(mount_point);
+ mount_error(mount_point, spec);
exit(EX_FAIL);
}
}