summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);
}
}