*
* 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"
} mntres_t;
extern int nfs_mount_data_version;
+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)
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"))
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;
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
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;
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);
}
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;
}
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;
}
}
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, int running_bg)
{
static char *prev_bg_host;
char hostdir[1024];
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;
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);
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;
}
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;
/*
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) {
}
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,
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;
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;
}
#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);
/*
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;
}
strcat(new_opts, cbuf);
*extra_opts = xstrdup(new_opts);
- *need_statd = ! (data.flags & NFS_MOUNT_NONLM);
- return 0;
+
+ 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 EX_SUCCESS;
/* abort */
fail: