ment.mnt_freq = 0;
ment.mnt_passno= 0;
+ if(flags & MS_REMOUNT) {
+ update_mtab(ment.mnt_dir, &ment);
+ return 0;
+ }
+
lock_mtab();
if ((mtab = setmntent(MOUNTED, "a+")) == NULL) {
{
if (options != NULL) {
char *opts = xstrdup(options);
- char *opt;
- int len = strlen(opts) + 20;
+ char *opt, *p;
+ int len = strlen(opts) + 1; /* include room for a null */
+ int open_quote = 0;
*extra_opts = xmalloc(len);
**extra_opts = '\0';
- for (opt = strtok(opts, ","); opt; opt = strtok(NULL, ","))
- parse_opt(opt, flags, *extra_opts, len);
-
+ for (p=opts, opt=NULL; p && *p; p++) {
+ if (!opt)
+ opt = p; /* begin of the option item */
+ if (*p == '"')
+ open_quote ^= 1; /* reverse the status */
+ if (open_quote)
+ continue; /* still in a quoted block */
+ if (*p == ',')
+ *p = '\0'; /* terminate the option item */
+ /* end of option item or last item */
+ if (*p == '\0' || *(p+1) == '\0') {
+ parse_opt(opt, flags, *extra_opts, len);
+ opt = NULL;
+ }
+ }
free(opts);
}
-
}
static void mount_error(char *node)
uid_t uid = getuid();
progname = argv[0];
+ if (!progname)
+ exit(2);
+
if ((p = strrchr(progname, '/')) != NULL)
progname = p+1;
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
return 0;
}
+ if ((argc < 3)) {
+ mount_usage();
+ exit(1);
+ }
+
+ spec = argv[1];
+ mount_point = argv[2];
+
+ argv[2] = argv[0]; /* so that getopt error messages are correct */
while ((c = getopt_long (argc - 2, argv + 2, "rt:vVwfno:hs",
longopts, NULL)) != -1) {
switch (c) {
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;
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.nfs4") == 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_opts, mount_opts) != 0) {
+ strcmp(mc->m.mnt_type, (nfs_mount_vers == 4 ? "nfs4":"nfs")) != 0
+ ) {
fprintf(stderr, "%s: permission died - no match for fstab\n",
progname);
exit(1);
}
+ /* 'mount' munges the options from fstab before passing them
+ * to us, so it is non-trivial to test that we have the correct
+ * set of options and we don't want to trust what the user
+ * gave us, so just take whatever is in fstab
+ */
+ mount_opts = strdup(mc->m.mnt_opts);
mounttype = 0;
}
mount_point = canonicalize(mount_point);
+ if (mount_point == NULL ||
+ mount_point[0] != '/') {
+ fprintf(stderr, "%s: unknown mount point %s\n",
+ progname, mount_point ? : "");
+ exit(1);
+ }
parse_opts(mount_opts, &flags, &extra_opts);
}
}
- 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,
if (!fake) {
mnt_err = do_mount_syscall(spec, mount_point,
nfs_mount_vers == 4 ? "nfs4" : "nfs",
- flags, mount_opts);
+ flags & ~(MS_USER|MS_USERS) ,
+ mount_opts);
if (mnt_err) {
mount_error(mount_point);