]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/nfsmount.c
mount.nfs: Use nfs_error in nfsmount.c, nfsumount.c, and nfs4mount.c
[nfs-utils.git] / utils / mount / nfsmount.c
index 9c08ff5837b22d4b18115e25a3e948ccade47edb..a59d2c29271acda8b1a8975c55087f43aff7a21f 100644 (file)
@@ -89,6 +89,7 @@ typedef union {
 } mntres_t;
 
 extern int nfs_mount_data_version;
+extern char *progname;
 extern int verbose;
 extern int sloppy;
 
@@ -459,22 +460,22 @@ static int nfsmnt_check_compat(const struct pmap *nfs_pmap,
        unsigned int max_mnt_vers = (nfs_mount_data_version >= 4) ? 3 : 2;
 
        if (nfs_pmap->pm_vers == 4) {
-               fprintf(stderr, _("Please use '-t nfs4' "
-                                       "instead of '-o vers=4'.\n"));
+               nfs_error(_("%s: Please use '-t nfs4' "
+                               "instead of '-o vers=4'"), progname);
                goto out_bad;
        }
 
        if (nfs_pmap->pm_vers) {
                if (nfs_pmap->pm_vers > max_nfs_vers || nfs_pmap->pm_vers < 2) {
-                       fprintf(stderr, _("NFS version %ld is not supported.\n"), 
-                                       nfs_pmap->pm_vers);
+                       nfs_error(_("%s: NFS version %ld is not supported"),
+                                       progname, nfs_pmap->pm_vers);
                        goto out_bad;
                }
        }
 
        if (mnt_pmap->pm_vers > max_mnt_vers) {
-               fprintf(stderr, _("NFS mount version %ld s not supported.\n"), 
-                       mnt_pmap->pm_vers);
+               nfs_error(_("%s: NFS mount version %ld s not supported"),
+                               progname, mnt_pmap->pm_vers);
                goto out_bad;
        }
 
@@ -485,16 +486,15 @@ out_bad:
 }
 
 int
-nfsmount(const char *spec, const char *node, int *flags,
-        char **extra_opts, char **mount_opts,
-        int running_bg, int *need_statd)
+nfsmount(const char *spec, const char *node, int flags,
+        char **extra_opts, int fake)
 {
        static char *prev_bg_host;
        char hostdir[1024];
        char *hostname, *dirname, *old_opts, *mounthost = NULL;
        char new_opts[1024], cbuf[1024];
        static struct nfs_mount_data data;
-       int val;
+       int val, running_bg = 0;
        static int doonce = 0;
 
        clnt_addr_t mnt_server = { &mounthost, };
@@ -517,8 +517,8 @@ nfsmount(const char *spec, const char *node, int *flags,
        time_t timeout;
 
        if (strlen(spec) >= sizeof(hostdir)) {
-               fprintf(stderr, _("mount: "
-                                 "excessively long host:dir argument\n"));
+               nfs_error(_("%s: excessively long host:dir argument"),
+                               progname);
                goto fail;
        }
        strcpy(hostdir, spec);
@@ -530,14 +530,13 @@ nfsmount(const char *spec, const char *node, int *flags,
                   until they can be fully supported. (mack@sgi.com) */
                if ((s = strchr(hostdir, ','))) {
                        *s = '\0';
-                       fprintf(stderr,
-                               _("mount: warning: "
-                                 "multiple hostnames not supported\n"));
+                       nfs_error(_("%s: warning: "
+                                 "multiple hostnames not supported"),
+                                       progname);
                }
        } else {
-               fprintf(stderr,
-                       _("mount: "
-                         "directory to mount not in host:dir format\n"));
+               nfs_error(_("%s: directory to mount not in host:dir format"),
+                               progname);
                goto fail;
        }
 
@@ -617,9 +616,8 @@ nfsmount(const char *spec, const char *node, int *flags,
 #endif
 
        data.version = nfs_mount_data_version;
-       *mount_opts = (char *) &data;
 
-       if (*flags & MS_REMOUNT)
+       if (flags & MS_REMOUNT)
                goto out_ok;
 
        /*
@@ -718,10 +716,9 @@ nfsmount(const char *spec, const char *node, int *flags,
 
        if (nfs_pmap->pm_vers == 2) {
                if (mntres.nfsv2.fhs_status != 0) {
-                       fprintf(stderr,
-                               _("mount: %s:%s failed, reason given by server: %s\n"),
-                               hostname, dirname,
-                               nfs_strerror(mntres.nfsv2.fhs_status));
+                       nfs_error(_("%s: %s:%s failed, reason given by server: %s"),
+                                       progname, hostname, dirname,
+                                       nfs_strerror(mntres.nfsv2.fhs_status));
                        goto fail;
                }
                memcpy(data.root.data,
@@ -739,10 +736,9 @@ nfsmount(const char *spec, const char *node, int *flags,
                fhandle3 *fhandle;
                int i, *flavor, yum = 0;
                if (mntres.nfsv3.fhs_status != 0) {
-                       fprintf(stderr,
-                               _("mount: %s:%s failed, reason given by server: %s\n"),
-                               hostname, dirname,
-                               nfs_strerror(mntres.nfsv3.fhs_status));
+                       nfs_error(_("%s: %s:%s failed, reason given by server: %s"),
+                                       progname, hostname, dirname,
+                                       nfs_strerror(mntres.nfsv3.fhs_status));
                        goto fail;
                }
 #if NFS_MOUNT_VERSION >= 5
@@ -770,10 +766,9 @@ nfsmount(const char *spec, const char *node, int *flags,
 #endif
                }
                if (!yum) {
-                       fprintf(stderr,
-                               "mount: %s:%s failed, "
-                               "security flavor not supported\n",
-                               hostname, dirname);
+                       nfs_error(_("%s: %s:%s failed, security flavor "
+                                       "not supported"),
+                                       progname, hostname, dirname);
                        /* server has registered us in rmtab, send umount */
                        nfs_call_umount(&mnt_server, &dirname);
                        goto fail;
@@ -840,8 +835,8 @@ noauth_flavors:
  out_ok:
        /* Ensure we have enough padding for the following strcat()s */
        if (strlen(new_opts) + strlen(s) + 30 >= sizeof(new_opts)) {
-               fprintf(stderr, _("mount: "
-                                 "excessively long option argument\n"));
+               nfs_error(_("%s: excessively long option argument"),
+                               progname);
                goto fail;
        }
 
@@ -849,7 +844,26 @@ noauth_flavors:
        strcat(new_opts, cbuf);
 
        *extra_opts = xstrdup(new_opts);
-       *need_statd = ! (data.flags & NFS_MOUNT_NONLM);
+
+       if (!fake && !(data.flags & NFS_MOUNT_NONLM)) {
+               if (!start_statd()) {
+                       nfs_error(_("%s: rpc.statd is not running but is "
+                               "required for remote locking.\n"
+                               "   Either use '-o nolocks' to keep "
+                               "locks local, or start statd."),
+                                       progname);
+                       goto fail;
+               }
+       }
+
+       if (!fake) {
+               if (mount(spec, node, "nfs",
+                               flags & ~(MS_USER|MS_USERS), &data)) {
+                       mount_error(spec, node, errno);
+                       goto fail;
+               }
+       }
+
        return 0;
 
        /* abort */