#include <config.h>
#endif
-#include <ctype.h>
#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <time.h>
#include "xcommon.h"
#include "mount.h"
#include "nls.h"
-#include "nfs_mount.h"
#include "mount_constants.h"
#include "stropts.h"
#include "error.h"
#include "version.h"
#include "parse_dev.h"
-#ifdef HAVE_RPCSVC_NFS_PROT_H
-#include <rpcsvc/nfs_prot.h>
-#else
-#include <linux/nfs.h>
-#define nfsstat nfs_stat
+#ifndef NFS_PROGRAM
+#define NFS_PROGRAM (100003)
#endif
#ifndef NFS_PORT
-#define NFS_PORT 2049
+#define NFS_PORT (2049)
#endif
#ifndef NFS_MAXHOSTNAME
sa_family_t family; /* supported address family */
};
-static int fill_ipv4_sockaddr(const char *hostname, struct sockaddr_in *addr)
-{
- struct hostent *hp;
- addr->sin_family = AF_INET;
-
- if (inet_aton(hostname, &addr->sin_addr))
- return 1;
- if ((hp = gethostbyname(hostname)) == NULL) {
- nfs_error(_("%s: can't get address for %s\n"),
- progname, hostname);
- return 0;
- }
- if (hp->h_length > sizeof(struct in_addr)) {
- nfs_error(_("%s: got bad hp->h_length"), progname);
- hp->h_length = sizeof(struct in_addr);
- }
- memcpy(&addr->sin_addr, hp->h_addr, hp->h_length);
- return 1;
-}
-
/*
* Obtain a retry timeout value based on the value of the "retry=" option.
*
* Returns zero if the "lock" option is in effect, but statd
* can't be started. Otherwise, returns 1.
*/
-static int verify_lock_option(struct mount_options *options)
+static int nfs_verify_lock_option(struct mount_options *options)
{
if (po_rightmost(options, "nolock", "lock") == PO_KEY1_RIGHTMOST)
return 1;
} else {
if (!nfs_fix_mounthost_option(mi->family, mi->options))
return 0;
- if (!mi->fake && !verify_lock_option(mi->options))
+ if (!mi->fake && !nfs_verify_lock_option(mi->options))
return 0;
}
* passed-in error is permanent, thus the mount system call
* should not be retried.
*/
-static int is_permanent_error(int error)
+static int nfs_is_permanent_error(int error)
{
switch (error) {
case ESTALE:
*
* To handle version and transport protocol fallback properly, we
* need to parse some of the mount options in order to set up a
- * portmap probe. Mount options that rewrite_mount_options()
+ * portmap probe. Mount options that nfs_rewrite_mount_options()
* doesn't recognize are left alone.
*
* Returns a new group of mount options if successful; otherwise
* NULL is returned if some failure occurred.
*/
-static struct mount_options *rewrite_mount_options(char *str)
+static struct mount_options *nfs_rewrite_mount_options(char *str)
{
struct mount_options *options;
char *option, new_option[64];
option = po_get(options, "mountvers");
if (option)
mnt_server.pmap.pm_vers = atoi(option);
+ option = po_get(options, "mountproto");
+ if (option) {
+ if (strcmp(option, "tcp") == 0) {
+ mnt_server.pmap.pm_prot = IPPROTO_TCP;
+ po_remove_all(options, "mountproto");
+ }
+ if (strcmp(option, "udp") == 0) {
+ mnt_server.pmap.pm_prot = IPPROTO_UDP;
+ po_remove_all(options, "mountproto");
+ }
+ }
option = po_get(options, "port");
if (option) {
}
+ if (mnt_server.pmap.pm_prot == IPPROTO_TCP)
+ snprintf(new_option, sizeof(new_option) - 1,
+ "mountproto=tcp");
+ else
+ snprintf(new_option, sizeof(new_option) - 1,
+ "mountproto=udp");
+ if (po_append(options, new_option) == PO_FAILED)
+ goto err;
+
+ snprintf(new_option, sizeof(new_option) - 1,
+ "mountport=%lu", mnt_server.pmap.pm_port);
+ if (po_append(options, new_option) == PO_FAILED)
+ goto err;
+
errno = 0;
return options;
char *retry_str = NULL;
char **extra_opts = mi->extra_opts;
- retry_options = rewrite_mount_options(*extra_opts);
+ retry_options = nfs_rewrite_mount_options(*extra_opts);
if (!retry_options)
return 0;
if (nfs_try_mount(mi))
return EX_SUCCESS;
- if (is_permanent_error(errno))
+ if (nfs_is_permanent_error(errno))
break;
if (time(NULL) > timeout) {
if (nfs_try_mount(mi))
return EX_SUCCESS;
- if (is_permanent_error(errno)) {
+ if (nfs_is_permanent_error(errno)) {
mount_error(mi->spec, mi->node, errno);
return EX_FAIL;
}
if (nfs_try_mount(mi))
return EX_SUCCESS;
- if (is_permanent_error(errno))
+ if (nfs_is_permanent_error(errno))
break;
if (time(NULL) > timeout)