]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/nfsmount.c
When mount.nfs reports that statd isn't running, it suggests using the "-o
[nfs-utils.git] / utils / mount / nfsmount.c
index a3cbbbe595680fc612d41e7556eeb1b15e17672f..3d2ebb1066137a2733fe4616c36d097b821e3092 100644 (file)
@@ -23,7 +23,7 @@
  *
  * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
  * - added Native Language Support
- * 
+ *
  * Modified by Olaf Kirch and Trond Myklebust for new NFS code,
  * plus NFSv3 stuff.
  *
 #include <paths.h>
 #include <syslog.h>
 
-#include "conn.h"
 #include "xcommon.h"
 #include "mount.h"
-#include "nfsumount.h"
 #include "nfs_mount.h"
 #include "mount_constants.h"
 #include "nls.h"
@@ -93,7 +91,7 @@ extern char *progname;
 extern int verbose;
 extern int sloppy;
 
-extern int linux_version_code();
+extern int linux_version_code(void);
 
 static inline enum clnt_stat
 nfs3_mount(CLIENT *clnt, mnt3arg_t *mnt3arg, mnt3res_t *mnt3res)
@@ -192,7 +190,6 @@ parse_options(char *old_opts, struct nfs_mount_data *data,
                if ((opteq = strchr(opt, '=')) && isdigit(opteq[1])) {
                        int val = atoi(opteq + 1);      
                        *opteq = '\0';
-/* printf("opt=%s\n", opt); */
                        if (!strcmp(opt, "rsize"))
                                data->rsize = val;
                        else if (!strcmp(opt, "wsize"))
@@ -273,7 +270,8 @@ parse_options(char *old_opts, struct nfs_mount_data *data,
                                char *secflavor = opteq+1;
                                /* see RFC 2623 */
                                if (nfs_mount_data_version < 5) {
-                                       printf(_("Warning: ignoring sec=%s option\n"), secflavor);
+                                       printf(_("Warning: ignoring sec=%s option\n"),
+                                                       secflavor);
                                        continue;
                                } else if (!strcmp(secflavor, "none"))
                                        data->pseudoflavor = AUTH_NONE;
@@ -314,8 +312,9 @@ parse_options(char *old_opts, struct nfs_mount_data *data,
                                int ctxlen = strlen(context);
 
                                if (ctxlen > NFS_MAX_CONTEXT_LEN) {
-                                       printf(_("context parameter exceeds limit of %d\n"),
-                                                NFS_MAX_CONTEXT_LEN);
+                                       nfs_error(_("context parameter exceeds"
+                                                       " limit of %d"),
+                                                       NFS_MAX_CONTEXT_LEN);
                                        goto bad_parameter;
                                }
                                /* The context string is in the format of
@@ -339,9 +338,9 @@ parse_options(char *old_opts, struct nfs_mount_data *data,
                                val = 0;
                                opt += 2;
                        }
-                       if (!strcmp(opt, "bg")) 
+                       if (!strcmp(opt, "bg"))
                                *bg = val;
-                       else if (!strcmp(opt, "fg")) 
+                       else if (!strcmp(opt, "fg"))
                                *bg = !val;
                        else if (!strcmp(opt, "soft")) {
                                data->flags &= ~NFS_MOUNT_SOFT;
@@ -427,15 +426,17 @@ parse_options(char *old_opts, struct nfs_mount_data *data,
                        bad_option:
                                if (sloppy)
                                        continue;
-                               printf(_("Unsupported nfs mount option: "
-                                        "%s%s\n"), val ? "" : "no", opt);
+                               nfs_error(_("%s: Unsupported nfs mount option:"
+                                               " %s%s"), progname,
+                                               val ? "" : "no", opt);
                                goto out_bad;
                        }
-                       sprintf(cbuf, val ? "%s,":"no%s,", opt);
+                       sprintf(cbuf, val ? "%s," : "no%s,", opt);
                }
                len += strlen(cbuf);
                if (len >= opt_size) {
-                       printf(_("mount: excessively long option argument\n"));
+                       nfs_error(_("%s: excessively long option argument"),
+                                       progname);
                        goto out_bad;
                }
                strcat(new_opts, cbuf);
@@ -448,7 +449,7 @@ parse_options(char *old_opts, struct nfs_mount_data *data,
        }
        return 1;
  bad_parameter:
-       printf(_("Bad nfs mount parameter: %s\n"), opt);
+       nfs_error(_("%s: Bad nfs mount parameter: %s\n"), progname, opt);
  out_bad:
        return 0;
 }
@@ -460,22 +461,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;
        }
 
@@ -486,9 +487,8 @@ out_bad:
 }
 
 int
-nfsmount(const char *spec, const char *node, int *flags,
-        char **extra_opts, char **mount_opts,
-        int running_bg, int fake)
+nfsmount(const char *spec, const char *node, int flags,
+        char **extra_opts, int fake, int running_bg)
 {
        static char *prev_bg_host;
        char hostdir[1024];
@@ -501,7 +501,7 @@ nfsmount(const char *spec, const char *node, int *flags,
        clnt_addr_t mnt_server = { &mounthost, };
        clnt_addr_t nfs_server = { &hostname, };
        struct sockaddr_in *nfs_saddr = &nfs_server.saddr;
-       struct pmap  *mnt_pmap = &mnt_server.pmap, 
+       struct pmap  *mnt_pmap = &mnt_server.pmap,
                     *nfs_pmap = &nfs_server.pmap;
        struct pmap  save_mnt, save_nfs;
 
@@ -518,8 +518,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);
@@ -531,14 +531,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;
        }
 
@@ -585,42 +584,40 @@ nfsmount(const char *spec, const char *node, int *flags,
        
        if (retry == 10000 && !bg)
                retry = 2; /* reset for fg mounts */
-       
 
 #ifdef NFS_MOUNT_DEBUG
-       printf("rsize = %d, wsize = %d, timeo = %d, retrans = %d\n",
+       printf(_("rsize = %d, wsize = %d, timeo = %d, retrans = %d\n"),
               data.rsize, data.wsize, data.timeo, data.retrans);
-       printf("acreg (min, max) = (%d, %d), acdir (min, max) = (%d, %d)\n",
+       printf(_("acreg (min, max) = (%d, %d), acdir (min, max) = (%d, %d)\n"),
               data.acregmin, data.acregmax, data.acdirmin, data.acdirmax);
-       printf("port = %d, bg = %d, retry = %d, flags = %.8x\n",
+       printf(_("port = %lu, bg = %d, retry = %d, flags = %.8x\n"),
               nfs_pmap->pm_port, bg, retry, data.flags);
-       printf("mountprog = %d, mountvers = %d, nfsprog = %d, nfsvers = %d\n",
+       printf(_("mountprog = %lu, mountvers = %lu, nfsprog = %lu, nfsvers = %lu\n"),
               mnt_pmap->pm_prog, mnt_pmap->pm_vers,
               nfs_pmap->pm_prog, nfs_pmap->pm_vers);
-       printf("soft = %d, intr = %d, posix = %d, nocto = %d, noac = %d ",
+       printf(_("soft = %d, intr = %d, posix = %d, nocto = %d, noac = %d"),
               (data.flags & NFS_MOUNT_SOFT) != 0,
               (data.flags & NFS_MOUNT_INTR) != 0,
               (data.flags & NFS_MOUNT_POSIX) != 0,
               (data.flags & NFS_MOUNT_NOCTO) != 0,
               (data.flags & NFS_MOUNT_NOAC) != 0);
 #if NFS_MOUNT_VERSION >= 2
-       printf("tcp = %d ",
+       printf(_(", tcp = %d"),
               (data.flags & NFS_MOUNT_TCP) != 0);
 #endif
 #if NFS_MOUNT_VERSION >= 4
-       printf("noacl = %d ", (data.flags & NFS_MOUNT_NOACL) != 0);
+       printf(_(", noacl = %d"), (data.flags & NFS_MOUNT_NOACL) != 0);
 #endif
 #if NFS_MOUNT_VERSION >= 5
-       printf("sec = %u ", data.pseudoflavor);
-       printf("readdirplus = %d ", (data.flags & NFS_MOUNT_NORDIRPLUS) != 0);
+       printf(_(", sec = %u"), data.pseudoflavor);
+       printf(_(", readdirplus = %d"), (data.flags & NFS_MOUNT_NORDIRPLUS) != 0);
 #endif
        printf("\n");
 #endif
 
        data.version = nfs_mount_data_version;
-       *mount_opts = (char *) &data;
 
-       if (*flags & MS_REMOUNT)
+       if (flags & MS_REMOUNT)
                goto out_ok;
 
        /*
@@ -691,15 +688,15 @@ nfsmount(const char *spec, const char *node, int *flags,
                                if (errno == ETIMEDOUT)
                                        break;
                        default:
-                               mount_errors(*nfs_server.hostname, 0, bg);
+                               rpc_mount_errors(*nfs_server.hostname, 0, bg);
                        goto fail;
                        }
                        t = time(NULL);
                        if (t >= timeout) {
-                               mount_errors(*nfs_server.hostname, 0, bg);
+                               rpc_mount_errors(*nfs_server.hostname, 0, bg);
                                goto fail;
                        }
-                       mount_errors(*nfs_server.hostname, 1, bg);
+                       rpc_mount_errors(*nfs_server.hostname, 1, bg);
                        continue;
                }
                if (!running_bg) {
@@ -710,19 +707,18 @@ nfsmount(const char *spec, const char *node, int *flags,
                }
                t = time(NULL);
                if (t >= timeout) {
-                       mount_errors(*nfs_server.hostname, 0, bg);
+                       rpc_mount_errors(*nfs_server.hostname, 0, bg);
                        goto fail;
                }
                if (doonce++ < 1)
-                       mount_errors(*nfs_server.hostname, 1, bg);
+                       rpc_mount_errors(*nfs_server.hostname, 1, bg);
        }
 
        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,
@@ -740,16 +736,15 @@ 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
                mountres = &mntres.nfsv3.mountres3_u.mountinfo;
                i = mountres->auth_flavors.auth_flavors_len;
-               if (i <= 0) 
+               if (i <= 0)
                        goto noauth_flavors;
 
                flavor = mountres->auth_flavors.auth_flavors_val;
@@ -766,15 +761,13 @@ nfsmount(const char *spec, const char *node, int *flags,
                        if (flavor[i] == data.pseudoflavor)
                                yum = 1;
 #ifdef NFS_MOUNT_DEBUG
-                       printf("auth flavor %d: %d\n",
-                               i, flavor[i]);
+                       printf(_("auth flavor %d: %d\n"), i, flavor[i]);
 #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;
@@ -810,7 +803,7 @@ noauth_flavors:
        }
 
 #ifdef NFS_MOUNT_DEBUG
-       printf(_("using port %d for nfs deamon\n"), nfs_pmap->pm_port);
+       printf(_("using port %lu for nfs deamon\n"), nfs_pmap->pm_port);
 #endif
        nfs_saddr->sin_port = htons(nfs_pmap->pm_port);
        /*
@@ -841,8 +834,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;
        }
 
@@ -855,14 +848,22 @@ noauth_flavors:
                if (!start_statd()) {
                        nfs_error(_("%s: rpc.statd is not running but is "
                                "required for remote locking.\n"
-                               "   Either use '-o nolocks' to keep "
+                               "   Either use '-o nolock' to keep "
                                "locks local, or start statd."),
                                        progname);
                        goto fail;
                }
        }
 
-       return 0;
+       if (!fake) {
+               if (mount(spec, node, "nfs",
+                               flags & ~(MS_USER|MS_USERS), &data)) {
+                       mount_error(spec, node, errno);
+                       goto fail;
+               }
+       }
+
+       return EX_SUCCESS;
 
        /* abort */
  fail: