]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/mount.c
Return the correct exit status on failed mounts
[nfs-utils.git] / utils / mount / mount.c
index ca87e3d1b7fb60bc04d7e3504a7bcb4985e79b38..72cb89d7602ef6c0f00ea686d58f2a9d8443b01e 100644 (file)
@@ -43,6 +43,7 @@ char *progname;
 int nomtab;
 int verbose;
 int mounttype;
+int sloppy;
 
 static struct option longopts[] = {
   { "fake", 0, 0, 'f' },
@@ -139,7 +140,6 @@ static char * fix_opts_string (int flags, const char *extra_opts) {
 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;
@@ -149,11 +149,7 @@ int add_mtab(char *fsname, char *mount_point, char *fstype, int flags, char *opt
        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);
@@ -161,21 +157,22 @@ int add_mtab(char *fsname, char *mount_point, char *fstype, int flags, char *opt
        }
 
         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;
 }
@@ -194,6 +191,7 @@ void mount_usage()
        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");
@@ -259,6 +257,26 @@ static void mount_error(char *node)
        }
 }
 
+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;
@@ -279,7 +297,7 @@ int main(int argc, char *argv[])
                        umount_usage();
                        exit(1);
                }
-               return(nfsumount(argc, argv));
+               exit(nfsumount(argc, argv) ? 0 : 1);
        }
 
        if ((argc < 2)) {
@@ -295,7 +313,7 @@ int main(int argc, char *argv[])
                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':
@@ -325,6 +343,9 @@ int main(int argc, char *argv[])
                        else
                                mount_opts = xstrdup(optarg);
                        break;
+               case 's':
+                       ++sloppy;
+                       break;
                case 128: /* bind */
                        mounttype = MS_BIND;
                        break;
@@ -362,26 +383,34 @@ int main(int argc, char *argv[])
                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) {
-               mnt_err = do_mount_syscall(spec, mount_point, nfs_mount_vers == 4 ? "nfs4" : "nfs", flags, mount_opts);
-               
-               if(mnt_err) {
-                       mount_error(mount_point);
-                       exit(-1);
-               }
+       if (fake)
+               return 0;
+       if (mnt_err)
+               exit(EX_FAIL);
 
-               if(!nomtab)
-                       add_mtab(spec, mount_point, nfs_mount_vers == 4 ? "nfs4" : "nfs",
-                                flags, extra_opts, 0, 0);
+       mnt_err = do_mount_syscall(spec, mount_point,
+                                  nfs_mount_vers == 4 ? "nfs4" : "nfs",
+                                  flags, mount_opts);
+               
+       if (mnt_err) {
+               mount_error(mount_point);
+               exit(EX_FAIL);
        }
 
+       if (!nomtab)
+               add_mtab(spec, mount_point,
+                        nfs_mount_vers == 4 ? "nfs4" : "nfs",
+                        flags, extra_opts, 0, 0);
+
        return 0;
 }