summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-03-20 12:39:06 +1100
committerNeil Brown <neilb@suse.de>2007-03-20 12:39:06 +1100
commit44a3727a3243e674a1f1fdad5cbbc639aa25d01c (patch)
tree7f1853f20e590cd38ea497f48c92524049bfbbc6
parent7829fe89c152888f737dfd0e05850bc28671991d (diff)
downloadnfs-utils-44a3727a3243e674a1f1fdad5cbbc639aa25d01c.tar.gz
nfs-utils-44a3727a3243e674a1f1fdad5cbbc639aa25d01c.tar.xz
nfs-utils-44a3727a3243e674a1f1fdad5cbbc639aa25d01c.zip
mount.nfs - Tidy up option parsing.
Make sure all possible invalid arguments are discovered and reported. Make sure nothing gets by for uid!=0 that doesn't perfectly match fstab.
-rw-r--r--utils/mount/mount.c52
1 files changed, 38 insertions, 14 deletions
diff --git a/utils/mount/mount.c b/utils/mount/mount.c
index 4da9002..71a8737 100644
--- a/utils/mount/mount.c
+++ b/utils/mount/mount.c
@@ -320,6 +320,9 @@ int main(int argc, char *argv[])
uid_t uid = getuid();
progname = argv[0];
+ if (!progname)
+ exit(2);
+
if ((p = strrchr(progname, '/')) != NULL)
progname = p+1;
@@ -331,12 +334,7 @@ int main(int argc, char *argv[])
exit(nfsumount(argc, argv) ? 0 : 1);
}
- if ((argc < 2)) {
- mount_usage();
- exit(1);
- }
-
- if(argv[1][0] == '-') {
+ if(argv[1] && argv[1][0] == '-') {
if(argv[1][1] == 'V')
printf("%s ("PACKAGE_STRING")\n", progname);
else
@@ -344,6 +342,14 @@ int main(int argc, char *argv[])
return 0;
}
+ if ((argc < 3)) {
+ mount_usage();
+ exit(1);
+ }
+
+ spec = argv[1];
+ mount_point = argv[2];
+
while ((c = getopt_long (argc - 2, argv + 2, "rt:vVwfno:hs",
longopts, NULL)) != -1) {
switch (c) {
@@ -351,7 +357,15 @@ int main(int argc, char *argv[])
flags |= MS_RDONLY;
break;
case 't':
- nfs_mount_vers = (strncmp(optarg, "nfs4", 4)) ? 0 : 4;
+ if (strcmp(optarg, "nfs4") == 0)
+ nfs_mount_vers = 4;
+ else if (strcmp(optarg, "nfs") == 0)
+ nfs_mount_vers = 0;
+ else {
+ fprintf(stderr, "%s: unknown filesystem type: %s\n",
+ progname, optarg);
+ exit(1);
+ }
break;
case 'v':
++verbose;
@@ -404,18 +418,24 @@ int main(int argc, char *argv[])
exit(1);
}
}
+ if (optind != argc-2) {
+ /* Extra non-option words at the end... */
+ mount_usage();
+ exit(1);
+ }
- spec = argv[1];
- mount_point = argv[2];
+ if (strcmp(progname, "mount.nfsv4") == 0)
+ nfs_mount_vers = 4;
if (uid != 0) {
/* don't even think about it unless options exactly
- * make fstab
+ * match fstab
*/
struct mntentchn *mc;
if ((mc = getfsfile(mount_point)) == NULL ||
strcmp(mc->m.mnt_fsname, spec) != 0 ||
+ strcmp(mc->m.mnt_type, (nfs_mount_vers == 4 ? "nfs4":"nfs")) != 0 ||
strcmp(mc->m.mnt_opts, mount_opts) != 0) {
fprintf(stderr, "%s: permission died - no match for fstab\n",
progname);
@@ -425,6 +445,12 @@ int main(int argc, char *argv[])
}
mount_point = canonicalize(mount_point);
+ if (mount_point == NULL ||
+ mount_point[0] != '/') {
+ fprintf(stderr, "%s: unknown mount point %s\n",
+ progname, argv[2]);
+ exit(1);
+ }
parse_opts(mount_opts, &flags, &extra_opts);
@@ -435,11 +461,9 @@ int main(int argc, char *argv[])
}
}
- if (!strcmp(progname, "mount.nfs4") || nfs_mount_vers == 4) {
- nfs_mount_vers = 4;
+ if (nfs_mount_vers == 4)
mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0);
- }
- else if (!strcmp(progname, "mount.nfs")) {
+ else {
int need_statd = 0;
mnt_err = nfsmount(spec, mount_point, &flags,
&extra_opts, &mount_opts,