int nomtab;
int verbose;
int mounttype;
+int sloppy;
static struct option longopts[] = {
{ "fake", 0, 0, 'f' },
int add_mtab(char *fsname, char *mount_point, char *fstype, int flags, char *opts, int freq, int passno)
{
struct mntent ment;
- int fd;
FILE *mtab;
ment.mnt_fsname = fsname;
ment.mnt_freq = 0;
ment.mnt_passno= 0;
- if ((fd = open(MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) == -1) {
- fprintf(stderr, "Can't get "MOUNTED"~ lock file");
- return 1;
- }
- close(fd);
+ lock_mtab();
if ((mtab = setmntent(MOUNTED, "a+")) == NULL) {
fprintf(stderr, "Can't open " MOUNTED);
}
if (addmntent(mtab, &ment) == 1) {
+ endmntent(mtab);
+ unlock_mtab();
fprintf(stderr, "Can't write mount entry");
return 1;
}
if (fchmod(fileno(mtab), 0644) == -1) {
+ endmntent(mtab);
+ unlock_mtab();
fprintf(stderr, "Can't set perms on " MOUNTED);
return 1;
}
endmntent(mtab);
- if (unlink(MOUNTED"~") == -1) {
- fprintf(stderr, "Can't remove "MOUNTED"~");
- return 1;
- }
+ unlock_mtab();
return 0;
}
printf("\t-w\t\tMount file system read-write\n");
printf("\t-f\t\tFake mount, don't actually mount\n");
printf("\t-n\t\tDo not update /etc/mtab\n");
+ printf("\t-s\t\tTolerate sloppy mount options rather than failing.\n");
printf("\t-h\t\tPrint this help\n");
printf("\tversion\t\tnfs4 - NFS version 4, nfs - older NFS version supported\n");
printf("\tnfsoptions\tRefer mount.nfs(8) or nfs(5)\n\n");
}
}
+static void start_statd()
+{
+ /* If /var/run/rpc.statd.pid exists and is non-empty,
+ * assume statd already running.
+ * If START_STATD not defined, or defined to a non-existent file,
+ * don't bother,
+ * else run that file (typically a shell script)
+ */
+ struct stat stb;
+ if (stat("/var/run/rpc.statd.pid", &stb) == 0 &&
+ stb.st_size > 0)
+ return;
+#ifdef START_STATD
+ if (stat(START_STATD, &stb) ==0 &&
+ S_ISREG(stb.st_mode) &&
+ (stb.st_mode & S_IXUSR))
+ system(START_STATD);
+#endif
+}
+
int main(int argc, char *argv[])
{
int c, flags = 0, nfs_mount_vers = 0, mnt_err = 1, fake = 0;
umount_usage();
exit(1);
}
- return(nfsumount(argc, argv));
+ exit(nfsumount(argc, argv) ? 0 : 1);
}
if ((argc < 2)) {
return 0;
}
- while ((c = getopt_long (argc - 2, argv + 2, "rt:vVwfno:h",
+ while ((c = getopt_long (argc - 2, argv + 2, "rt:vVwfno:hs",
longopts, NULL)) != -1) {
switch (c) {
case 'r':
else
mount_opts = xstrdup(optarg);
break;
+ case 's':
+ ++sloppy;
+ break;
case 128: /* bind */
mounttype = MS_BIND;
break;
nfs_mount_vers = 4;
mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0);
}
- else {
- if (!strcmp(progname, "mount.nfs")) {
- mnt_err = nfsmount(spec, mount_point, &flags,
- &extra_opts, &mount_opts, &nfs_mount_vers, 0);
- }
+ else if (!strcmp(progname, "mount.nfs")) {
+ int need_statd = 0;
+ mnt_err = nfsmount(spec, mount_point, &flags,
+ &extra_opts, &mount_opts, &nfs_mount_vers,
+ 0, &need_statd);
+ if (!mnt_err && !fake && need_statd)
+ start_statd();
}
if (!mnt_err && !fake) {