#include <errno.h>
#include <netdb.h>
#include <time.h>
+
#include <sys/socket.h>
#include <sys/mount.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#include "xcommon.h"
#include "mount.h"
#include "error.h"
#include "network.h"
#include "parse_opt.h"
+#include "version.h"
#ifdef HAVE_RPCSVC_NFS_PROT_H
#include <rpcsvc/nfs_prot.h>
extern int nfs_mount_data_version;
extern char *progname;
extern int verbose;
+extern int sloppy;
struct nfsmount_info {
const char *spec, /* server:/path */
return 1;
}
+static int nfs_append_sloppy_option(struct mount_options *options)
+{
+ if (!sloppy || linux_version_code() < MAKE_VERSION(2, 6, 27))
+ return 1;
+
+ if (po_append(options, "sloppy") == PO_FAILED)
+ return 0;
+ return 1;
+}
+
/*
* Set up mandatory NFS mount options.
*
return 0;
}
+ if (!nfs_append_sloppy_option(mi->options))
+ return 0;
+
if (!append_addr_option(&saddr, mi->options))
return 0;
int p;
options = po_split(str);
- if (!options)
+ if (!options) {
+ errno = EFAULT;
return NULL;
+ }
+ errno = EINVAL;
option = po_get(options, "addr");
if (option) {
nfs_server.saddr.sin_family = AF_INET;
po_remove_all(options, "udp");
if (!probe_bothports(&mnt_server, &nfs_server)) {
- rpc_mount_errors("rpcbind", 0, 0);
+ errno = ESPIPE;
goto err;
}
}
+ errno = 0;
return options;
err:
char **extra_opts = mi->extra_opts;
retry_options = rewrite_mount_options(*extra_opts);
- if (!retry_options) {
- errno = EIO;
+ if (!retry_options)
return 0;
- }
if (po_join(retry_options, &retry_str) == PO_FAILED) {
po_destroy(retry_options);