#include "conn.h"
#include "xcommon.h"
-#include "nfsmount.h"
+#include "mount.h"
#include "nfsumount.h"
#include "nfs_mount.h"
#include "mount_constants.h"
static char errbuf[BUFSIZ];
static char *erreob = &errbuf[BUFSIZ];
extern int verbose;
+extern int sloppy;
/* Convert RPC errors into strings */
int rpc_strerror(int);
enum clnt_stat stat;
saddr->sin_port = htons (PMAPPORT);
- socket = get_socket(saddr, prot, FALSE);
+ socket = get_socket(saddr, prot, FALSE, FALSE);
switch (prot) {
case IPPROTO_UDP:
inet_ntoa(saddr->sin_addr), prog, *p_vers,
*p_prot == IPPROTO_UDP ? "udp" : "tcp", p_port);
}
- if (clnt_ping(saddr, prog, *p_vers, *p_prot))
+ if (clnt_ping(saddr, prog, *p_vers, *p_prot, NULL))
goto out_ok;
if (rpc_createerr.cf_stat == RPC_TIMEDOUT)
goto out_bad;
} else if (!strcmp(opt, "namlen")) {
if (nfs_mount_version >= 2)
data->namlen = val;
+ else if (sloppy)
+ continue;
else
goto bad_parameter;
#endif
} else if (!strcmp(opt, "addr")) {
/* ignore */;
continue;
- } else
+ } else if (sloppy)
+ continue;
+ else
goto bad_parameter;
sprintf(cbuf, "%s=%s,", opt, opteq+1);
} else if (opteq) {
mnt_pmap->pm_prot = IPPROTO_TCP;
data->flags |= NFS_MOUNT_TCP;
#endif
- } else
+ } else if (sloppy)
+ continue;
+ else
goto bad_parameter;
#if NFS_MOUNT_VERSION >= 5
} else if (!strcmp(opt, "sec")) {
if (nfs_mount_version < 5) {
printf(_("Warning: ignoring sec=%s option\n"), secflavor);
continue;
- } else if (!strcmp(secflavor, "sys"))
+ } else if (!strcmp(secflavor, "none"))
+ data->pseudoflavor = AUTH_NONE;
+ else if (!strcmp(secflavor, "sys"))
data->pseudoflavor = AUTH_SYS;
else if (!strcmp(secflavor, "krb5"))
data->pseudoflavor = AUTH_GSS_KRB5;
data->pseudoflavor = AUTH_GSS_SPKMI;
else if (!strcmp(secflavor, "spkm3p"))
data->pseudoflavor = AUTH_GSS_SPKMP;
+ else if (sloppy)
+ continue;
else {
printf(_("Warning: Unrecognized security flavor %s.\n"),
secflavor);
goto bad_parameter;
}
strncpy(data->context, context, NFS_MAX_CONTEXT_LEN);
- } else
+ } else if (sloppy)
+ continue;
+ else
goto bad_parameter;
sprintf(cbuf, "%s=%s,", opt, opteq+1);
} else {
#endif
} else {
bad_option:
+ if (sloppy)
+ continue;
printf(_("Unsupported nfs mount option: "
"%s%s\n"), val ? "" : "no", opt);
goto out_bad;
int
nfsmount(const char *spec, const char *node, int *flags,
char **extra_opts, char **mount_opts, int *nfs_mount_vers,
- int running_bg)
+ int running_bg, int *need_statd)
{
static char *prev_bg_host;
char hostdir[1024];
*nfs_pmap = &nfs_server.pmap;
struct pmap save_mnt, save_nfs;
- int fsock;
+ int fsock = -1;
mntres_t mntres;
struct stat statbuf;
char *s;
int bg, retry;
- int retval;
+ int retval = EX_FAIL;
time_t t;
time_t prevt;
time_t timeout;
*nfs_mount_vers = find_kernel_nfs_mount_version();
nfs_mount_version = *nfs_mount_vers;
- retval = EX_FAIL;
- fsock = -1;
if (strlen(spec) >= sizeof(hostdir)) {
fprintf(stderr, _("mount: "
"excessively long host:dir argument\n"));
#if NFS_MOUNT_VERSION >= 2
data.namlen = NAME_MAX;
#endif
- data.pseudoflavor = AUTH_SYS;
bg = 0;
retry = 10000; /* 10000 minutes ~ 1 week */
}
#if NFS_MOUNT_VERSION >= 5
mountres = &mntres.nfsv3.mountres3_u.mountinfo;
- i = mountres->auth_flavours.auth_flavours_len;
+ i = mountres->auth_flavors.auth_flavors_len;
if (i <= 0)
- goto noauth_flavours;
+ goto noauth_flavors;
- flavor = mountres->auth_flavours.auth_flavours_val;
+ flavor = mountres->auth_flavors.auth_flavors_val;
while (--i >= 0) {
+ /* If no flavour requested, use first simple
+ * flavour that is offered.
+ */
+ if (! (data.flags & NFS_MOUNT_SECFLAVOUR) &&
+ (flavor[i] == AUTH_SYS ||
+ flavor[i] == AUTH_NONE)) {
+ data.pseudoflavor = flavor[i];
+ data.flags |= NFS_MOUNT_SECFLAVOUR;
+ }
if (flavor[i] == data.pseudoflavor)
yum = 1;
#ifdef NFS_MOUNT_DEBUG
"mount: %s:%s failed, "
"security flavor not supported\n",
hostname, dirname);
- /* server has registered us in mtab, send umount */
+ /* server has registered us in rmtab, send umount */
nfs_call_umount(&mnt_server, &dirname);
goto fail;
}
-noauth_flavours:
+noauth_flavors:
#endif
fhandle = &mntres.nfsv3.mountres3_u.mountinfo.fhandle;
memset(data.old_root.data, 0, NFS_FHSIZE);
#endif
}
- /* create nfs socket for kernel */
-
- if (nfs_pmap->pm_prot == IPPROTO_TCP)
- fsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- else
- fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (fsock < 0) {
- perror(_("nfs socket"));
- goto fail;
- }
- if (bindresvport(fsock, 0) < 0) {
- perror(_("nfs bindresvport"));
- goto fail;
+ if (nfs_mount_version == 1) {
+ /* create nfs socket for kernel */
+ if (nfs_pmap->pm_prot == IPPROTO_TCP)
+ fsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ else
+ fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (fsock < 0) {
+ perror(_("nfs socket"));
+ goto fail;
+ }
+ if (bindresvport(fsock, 0) < 0) {
+ perror(_("nfs bindresvport"));
+ goto fail;
+ }
}
+
#ifdef NFS_MOUNT_DEBUG
printf(_("using port %d for nfs deamon\n"), nfs_pmap->pm_port);
#endif
* to avoid problems with multihomed hosts.
* --Swen
*/
- if (linux_version_code() <= 66314
+ if (linux_version_code() <= 0x01030a && fsock != -1
&& connect(fsock, (struct sockaddr *) nfs_saddr,
sizeof (*nfs_saddr)) < 0) {
perror(_("nfs connect"));
strcat(new_opts, cbuf);
*extra_opts = xstrdup(new_opts);
+ *need_statd = ! (data.flags & NFS_MOUNT_NONLM);
return 0;
/* abort */