On Thu, Apr 15, 2021 at 7:40 AM Doug Evans <d...@google.com> wrote:

> The parsing is moved into new function inet_parse_host_port.
> Also split out is ipv4=flag, ipv6=flag processing into inet_parse_ipv46.
> This is done in preparation for using these functions in net/slirp.c.
>
> Signed-off-by: Doug Evans <d...@google.com>
>

Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com>

---
>
> Changes from v5:
>
> Also split out parsing of ipv4=on|off, ipv6=on|off
>
>  include/qemu/sockets.h |  3 ++
>  util/qemu-sockets.c    | 65 +++++++++++++++++++++++++++++-------------
>  2 files changed, 48 insertions(+), 20 deletions(-)
>
> diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
> index 7d1f813576..94f4e8de83 100644
> --- a/include/qemu/sockets.h
> +++ b/include/qemu/sockets.h
> @@ -31,6 +31,9 @@ int socket_set_fast_reuse(int fd);
>
>  int inet_ai_family_from_address(InetSocketAddress *addr,
>                                  Error **errp);
> +const char *inet_parse_host_port(InetSocketAddress *addr,
> +                                 const char *str, Error **errp);
> +int inet_parse_ipv46(InetSocketAddress *addr, const char *optstr, Error
> **errp);
>  int inet_parse(InetSocketAddress *addr, const char *str, Error **errp);
>  int inet_connect(const char *str, Error **errp);
>  int inet_connect_saddr(InetSocketAddress *saddr, Error **errp);
> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> index 8af0278f15..c0069f2565 100644
> --- a/util/qemu-sockets.c
> +++ b/util/qemu-sockets.c
> @@ -615,14 +615,12 @@ static int inet_parse_flag(const char *flagname,
> const char *optstr, bool *val,
>      return 0;
>  }
>
> -int inet_parse(InetSocketAddress *addr, const char *str, Error **errp)
> +const char *inet_parse_host_port(InetSocketAddress *addr, const char *str,
> +                                 Error **errp)
>  {
> -    const char *optstr, *h;
>      char host[65];
>      char port[33];
> -    int to;
>      int pos;
> -    char *begin;
>
>      memset(addr, 0, sizeof(*addr));
>
> @@ -632,38 +630,32 @@ int inet_parse(InetSocketAddress *addr, const char
> *str, Error **errp)
>          host[0] = '\0';
>          if (sscanf(str, ":%32[^,]%n", port, &pos) != 1) {
>              error_setg(errp, "error parsing port in address '%s'", str);
> -            return -1;
> +            return NULL;
>          }
>      } else if (str[0] == '[') {
>          /* IPv6 addr */
>          if (sscanf(str, "[%64[^]]]:%32[^,]%n", host, port, &pos) != 2) {
>              error_setg(errp, "error parsing IPv6 address '%s'", str);
> -            return -1;
> +            return NULL;
>          }
>      } else {
>          /* hostname or IPv4 addr */
>          if (sscanf(str, "%64[^:]:%32[^,]%n", host, port, &pos) != 2) {
>              error_setg(errp, "error parsing address '%s'", str);
> -            return -1;
> +            return NULL;
>          }
>      }
>
>      addr->host = g_strdup(host);
>      addr->port = g_strdup(port);
>
> -    /* parse options */
> -    optstr = str + pos;
> -    h = strstr(optstr, ",to=");
> -    if (h) {
> -        h += 4;
> -        if (sscanf(h, "%d%n", &to, &pos) != 1 ||
> -            (h[pos] != '\0' && h[pos] != ',')) {
> -            error_setg(errp, "error parsing to= argument");
> -            return -1;
> -        }
> -        addr->has_to = true;
> -        addr->to = to;
> -    }
> +    return str + pos;
> +}
> +
> +int inet_parse_ipv46(InetSocketAddress *addr, const char *optstr, Error
> **errp)
> +{
> +    char *begin;
> +
>      begin = strstr(optstr, ",ipv4");
>      if (begin) {
>          if (inet_parse_flag("ipv4", begin + 5, &addr->ipv4, errp) < 0) {
> @@ -678,6 +670,39 @@ int inet_parse(InetSocketAddress *addr, const char
> *str, Error **errp)
>          }
>          addr->has_ipv6 = true;
>      }
> +
> +    return 0;
> +}
> +
> +int inet_parse(InetSocketAddress *addr, const char *str, Error **errp)
> +{
> +    const char *optstr, *h;
> +    int to;
> +    int pos;
> +    char *begin;
> +
> +    optstr = inet_parse_host_port(addr, str, errp);
> +    if (optstr == NULL) {
> +        return -1;
> +    }
> +
> +    /* parse options */
> +
> +    if (inet_parse_ipv46(addr, optstr, errp) < 0) {
> +        return -1;
> +    }
> +
> +    h = strstr(optstr, ",to=");
> +    if (h) {
> +        h += 4;
> +        if (sscanf(h, "%d%n", &to, &pos) != 1 ||
> +            (h[pos] != '\0' && h[pos] != ',')) {
> +            error_setg(errp, "error parsing to= argument");
> +            return -1;
> +        }
> +        addr->has_to = true;
> +        addr->to = to;
> +    }
>      begin = strstr(optstr, ",keep-alive");
>      if (begin) {
>          if (inet_parse_flag("keep-alive", begin + strlen(",keep-alive"),
> --
> 2.31.1.295.g9ea45b61b8-goog
>
>
>

-- 
Marc-André Lureau

Reply via email to