X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fstropts.c;h=43791e615edabc8d21b37a093b61e47f941e9320;hp=c4f2326ce9162ef63d08c649be0f7091532ca37e;hb=3f23f712477df48fd1d57376b65c44bb2a19ec16;hpb=1d61a1116198714f50b081daecc663625124403d diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index c4f2326..43791e6 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -25,11 +25,7 @@ #include #endif -#include #include -#include -#include -#include #include #include #include @@ -42,7 +38,6 @@ #include "xcommon.h" #include "mount.h" #include "nls.h" -#include "nfs_mount.h" #include "mount_constants.h" #include "stropts.h" #include "error.h" @@ -51,15 +46,12 @@ #include "version.h" #include "parse_dev.h" -#ifdef HAVE_RPCSVC_NFS_PROT_H -#include -#else -#include -#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 @@ -99,26 +91,6 @@ struct nfsmount_info { 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. * @@ -127,19 +99,21 @@ static int fill_ipv4_sockaddr(const char *hostname, struct sockaddr_in *addr) static time_t nfs_parse_retry_option(struct mount_options *options, unsigned int timeout_minutes) { - char *retry_option, *endptr; + long tmp; - retry_option = po_get(options, "retry"); - if (retry_option) { - long tmp; - - errno = 0; - tmp = strtol(retry_option, &endptr, 10); - if (errno == 0 && endptr != retry_option && tmp >= 0) + switch (po_get_numeric(options, "retry", &tmp)) { + case PO_NOT_FOUND: + break; + case PO_FOUND: + if (tmp >= 0) { timeout_minutes = tmp; - else if (verbose) + break; + } + case PO_BAD_VALUE: + if (verbose) nfs_error(_("%s: invalid retry timeout was specified; " "using default timeout"), progname); + break; } return time(NULL) + (time_t)(timeout_minutes * 60); @@ -250,7 +224,7 @@ static int nfs_fix_mounthost_option(const sa_family_t family, * 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; @@ -299,7 +273,7 @@ static int nfs_validate_options(struct nfsmount_info *mi) } 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; } @@ -317,7 +291,7 @@ static int nfs_validate_options(struct nfsmount_info *mi) * 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: @@ -336,13 +310,13 @@ static int is_permanent_error(int error) * * 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]; @@ -381,6 +355,17 @@ static struct mount_options *rewrite_mount_options(char *str) 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) { @@ -449,6 +434,20 @@ static struct mount_options *rewrite_mount_options(char *str) } + 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; @@ -495,7 +494,7 @@ static int nfs_retry_nfs23mount(struct nfsmount_info *mi) 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; @@ -624,7 +623,7 @@ static int nfsmount_fg(struct nfsmount_info *mi) if (nfs_try_mount(mi)) return EX_SUCCESS; - if (is_permanent_error(errno)) + if (nfs_is_permanent_error(errno)) break; if (time(NULL) > timeout) { @@ -657,7 +656,7 @@ static int nfsmount_parent(struct nfsmount_info *mi) 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; } @@ -692,7 +691,7 @@ static int nfsmount_child(struct nfsmount_info *mi) if (nfs_try_mount(mi)) return EX_SUCCESS; - if (is_permanent_error(errno)) + if (nfs_is_permanent_error(errno)) break; if (time(NULL) > timeout)