diff --git a/ip/ip6tunnel.c b/ip/ip6tunnel.c index 07010d31..8b842b68 100644 --- a/ip/ip6tunnel.c +++ b/ip/ip6tunnel.c @@ -230,45 +230,18 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p) invarg("not inherit", *argv); p->flags |= IP6_TNL_F_RCV_DSCP_COPY; } else if (strcmp(*argv, "key") == 0) { - unsigned uval; NEXT_ARG(); p->i_flags |= GRE_KEY; p->o_flags |= GRE_KEY; - if (strchr(*argv, '.')) - p->i_key = p->o_key = get_addr32(*argv); - else { - if (get_unsigned(&uval, *argv, 0) < 0) { - fprintf(stderr, "invalid value of \"key\"\n"); - exit(-1); - } - p->i_key = p->o_key = htonl(uval); - } + p->i_key = p->o_key = tnl_parse_key("key", *argv); } else if (strcmp(*argv, "ikey") == 0) { - unsigned uval; NEXT_ARG(); p->i_flags |= GRE_KEY; - if (strchr(*argv, '.')) - p->i_key = get_addr32(*argv); - else { - if (get_unsigned(&uval, *argv, 0)<0) { - fprintf(stderr, "invalid value of \"ikey\"\n"); - exit(-1); - } - p->i_key = htonl(uval); - } + p->i_key = tnl_parse_key("ikey", *argv); } else if (strcmp(*argv, "okey") == 0) { - unsigned uval; NEXT_ARG(); p->o_flags |= GRE_KEY; - if (strchr(*argv, '.')) - p->o_key = get_addr32(*argv); - else { - if (get_unsigned(&uval, *argv, 0)<0) { - fprintf(stderr, "invalid value of \"okey\"\n"); - exit(-1); - } - p->o_key = htonl(uval); - } + p->o_key = tnl_parse_key("okey", *argv); } else if (strcmp(*argv, "seq") == 0) { p->i_flags |= GRE_SEQ; p->o_flags |= GRE_SEQ; diff --git a/ip/iptunnel.c b/ip/iptunnel.c index 36534f29..9c9dc548 100644 --- a/ip/iptunnel.c +++ b/ip/iptunnel.c @@ -106,45 +106,18 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) exit(-1); } } else if (strcmp(*argv, "key") == 0) { - unsigned uval; NEXT_ARG(); p->i_flags |= GRE_KEY; p->o_flags |= GRE_KEY; - if (strchr(*argv, '.')) - p->i_key = p->o_key = get_addr32(*argv); - else { - if (get_unsigned(&uval, *argv, 0)<0) { - fprintf(stderr, "invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv); - exit(-1); - } - p->i_key = p->o_key = htonl(uval); - } + p->i_key = p->o_key = tnl_parse_key("key", *argv); } else if (strcmp(*argv, "ikey") == 0) { - unsigned uval; NEXT_ARG(); p->i_flags |= GRE_KEY; - if (strchr(*argv, '.')) - p->i_key = get_addr32(*argv); - else { - if (get_unsigned(&uval, *argv, 0)<0) { - fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv); - exit(-1); - } - p->i_key = htonl(uval); - } + p->i_key = tnl_parse_key("ikey", *argv); } else if (strcmp(*argv, "okey") == 0) { - unsigned uval; NEXT_ARG(); p->o_flags |= GRE_KEY; - if (strchr(*argv, '.')) - p->o_key = get_addr32(*argv); - else { - if (get_unsigned(&uval, *argv, 0)<0) { - fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv); - exit(-1); - } - p->o_key = htonl(uval); - } + p->o_key = tnl_parse_key("okey", *argv); } else if (strcmp(*argv, "seq") == 0) { p->i_flags |= GRE_SEQ; p->o_flags |= GRE_SEQ; diff --git a/ip/tunnel.c b/ip/tunnel.c index d69fe84d..79f2201f 100644 --- a/ip/tunnel.c +++ b/ip/tunnel.c @@ -180,3 +180,18 @@ int tnl_ioctl_get_6rd(const char *name, void *p) { return tnl_gen_ioctl(SIOCGET6RD, name, p, EINVAL); } + +__be32 tnl_parse_key(const char *name, const char *key) +{ + unsigned uval; + + if (strchr(key, '.')) + return get_addr32(key); + + if (get_unsigned(&uval, key, 0) < 0) { + fprintf(stderr, "invalid value for \"%s\": \"%s\";", name, key); + fprintf(stderr, " it should be an unsigned integer\n"); + exit(-1); + } + return htonl(uval); +} diff --git a/ip/tunnel.h b/ip/tunnel.h index 9c2f5d29..9fb4a186 100644 --- a/ip/tunnel.h +++ b/ip/tunnel.h @@ -31,5 +31,6 @@ int tnl_del_ioctl(const char *basedev, const char *name, void *p); int tnl_prl_ioctl(int cmd, const char *name, void *p); int tnl_6rd_ioctl(int cmd, const char *name, void *p); int tnl_ioctl_get_6rd(const char *name, void *p); +__be32 tnl_parse_key(const char *name, const char *key); #endif