X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=utils%2Fmount%2Fstropts.c;h=bd127ab6bc017e8e9fef2c267666c752571b555c;hb=0dcb83a870926de215307472676096056dabc9b0;hp=e4a440890e89ad01b628b4d8aebd4e865e1c8e1f;hpb=1a1d3757d8881000496b838ff7d1ede981e9c40d;p=nfs-utils.git diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index e4a4408..bd127ab 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -99,19 +99,21 @@ struct nfsmount_info { 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); @@ -222,9 +224,15 @@ 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 const char *nfs_lock_opttbl[] = { + "nolock", + "lock", + NULL, +}; + static int nfs_verify_lock_option(struct mount_options *options) { - if (po_rightmost(options, "nolock", "lock") == PO_KEY1_RIGHTMOST) + if (po_rightmost(options, nfs_lock_opttbl) == 1) return 1; if (!start_statd()) { @@ -314,6 +322,12 @@ static int nfs_is_permanent_error(int error) * Returns a new group of mount options if successful; otherwise * NULL is returned if some failure occurred. */ +static const char *nfs_transport_opttbl[] = { + "udp", + "tcp", + NULL, +}; + static struct mount_options *nfs_rewrite_mount_options(char *str) { struct mount_options *options; @@ -353,6 +367,17 @@ static struct mount_options *nfs_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) { @@ -382,12 +407,12 @@ static struct mount_options *nfs_rewrite_mount_options(char *str) po_remove_all(options, "proto"); } } - p = po_rightmost(options, "tcp", "udp"); + p = po_rightmost(options, nfs_transport_opttbl); switch (p) { - case PO_KEY2_RIGHTMOST: + case 1: nfs_server.pmap.pm_prot = IPPROTO_UDP; break; - case PO_KEY1_RIGHTMOST: + case 2: nfs_server.pmap.pm_prot = IPPROTO_TCP; break; } @@ -421,6 +446,20 @@ static struct mount_options *nfs_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; @@ -695,12 +734,18 @@ static int nfsmount_bg(struct nfsmount_info *mi) * * Returns a valid mount command exit code. */ +static const char *nfs_background_opttbl[] = { + "bg", + "fg", + NULL, +}; + static int nfsmount_start(struct nfsmount_info *mi) { if (!nfs_validate_options(mi)) return EX_FAIL; - if (po_rightmost(mi->options, "bg", "fg") == PO_KEY1_RIGHTMOST) + if (po_rightmost(mi->options, nfs_background_opttbl) == 1) return nfsmount_bg(mi); else return nfsmount_fg(mi);