X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fstropts.c;h=09fca86d1e1705a72e8a6bfb805a9d861f8fdfb8;hp=a51cf0b720fbfee20d085c959911c5bf91d30826;hb=299a990de1b16ff769201fa0ed38249853254497;hpb=abb44f59bd004112a217011a2560dd7c7f94b5a2 diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index a51cf0b..09fca86 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 @@ -230,7 +222,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; @@ -279,7 +271,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; } @@ -297,7 +289,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: @@ -316,13 +308,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]; @@ -361,6 +353,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) { @@ -429,6 +432,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; @@ -475,7 +492,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; @@ -604,7 +621,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) { @@ -637,7 +654,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; } @@ -672,7 +689,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)