[PATCH 1/3] gaiconf_init: Refactor some bits for readability
DJ Delorie
dj@redhat.com
Thu Mar 17 22:41:41 GMT 2022
Siddhesh Poyarekar via Libc-alpha <libc-alpha@sourceware.org> writes:
> Split out line processing for `label`, `precedence` and `scopev4` into
> separate functions instead of the gotos.
LGTM.
Reviewed-by: DJ Delorie <dj@redhat.com>
> diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
> +static bool
> +add_prefixlist (struct prefixlist **listp, size_t *lenp, bool *nullbitsp,
> + char *val1, char *val2, char **pos)
> +{
> + struct in6_addr prefix;
> + unsigned long int bits;
> + unsigned long int val;
> + char *endp;
> +
> + bits = 128;
> + __set_errno (0);
> + char *cp = strchr (val1, '/');
> + if (cp != NULL)
> + *cp++ = '\0';
> + *pos = cp;
> + if (inet_pton (AF_INET6, val1, &prefix)
> + && (cp == NULL
> + || (bits = strtoul (cp, &endp, 10)) != ULONG_MAX
> + || errno != ERANGE)
> + && *endp == '\0'
> + && bits <= 128
> + && ((val = strtoul (val2, &endp, 10)) != ULONG_MAX
> + || errno != ERANGE)
> + && *endp == '\0'
> + && val <= INT_MAX)
> + {
> + struct prefixlist *newp = malloc (sizeof (*newp));
> + if (newp == NULL)
> + return false;
> +
> + memcpy (&newp->entry.prefix, &prefix, sizeof (prefix));
> + newp->entry.bits = bits;
> + newp->entry.val = val;
> + newp->next = *listp;
> + *listp = newp;
> + ++*lenp;
> + *nullbitsp |= bits == 0;
> + }
> + return true;
> +}
Matches removed code, ok.
> +static bool
> +add_scopelist (struct scopelist **listp, size_t *lenp, bool *nullbitsp,
> + const struct in6_addr *prefixp, unsigned long int bits,
> + unsigned long int val)
> +{
> + struct scopelist *newp = malloc (sizeof (*newp));
> + if (newp == NULL)
> + return false;
> +
> + newp->entry.netmask = htonl (bits != 96 ? (0xffffffff << (128 - bits)) : 0);
> + newp->entry.addr32 = (prefixp->s6_addr32[3] & newp->entry.netmask);
> + newp->entry.scope = val;
> + newp->next = *listp;
> + *listp = newp;
> + ++*lenp;
> + *nullbitsp |= bits == 96;
> +
> + return true;
> +}
matches removed code, ok.
> static void
> gaiconf_init (void)
> @@ -1836,55 +1896,17 @@ gaiconf_init (void)
> /* Ignore the rest of the line. */
> *cp = '\0';
>
> - struct prefixlist **listp;
> - size_t *lenp;
> - bool *nullbitsp;
> switch (cmdlen)
> {
> case 5:
> if (strcmp (cmd, "label") == 0)
> {
> + if (!add_prefixlist (&labellist, &nlabellist,
> + &labellist_nullbits, val1, val2, &cp))
> {
> + free (line);
> + fclose (fp);
> + goto no_file;
> }
Ok.
> - struct in6_addr prefix;
> - unsigned long int bits;
> - unsigned long int val;
> - char *endp;
> -
> - listp = &labellist;
> - lenp = &nlabellist;
> - nullbitsp = &labellist_nullbits;
> -
> - new_elem:
> - bits = 128;
> - __set_errno (0);
> - cp = strchr (val1, '/');
> - if (cp != NULL)
> - *cp++ = '\0';
> - if (inet_pton (AF_INET6, val1, &prefix)
> - && (cp == NULL
> - || (bits = strtoul (cp, &endp, 10)) != ULONG_MAX
> - || errno != ERANGE)
> - && *endp == '\0'
> - && bits <= 128
> - && ((val = strtoul (val2, &endp, 10)) != ULONG_MAX
> - || errno != ERANGE)
> - && *endp == '\0'
> - && val <= INT_MAX)
> {
> - struct prefixlist *newp = malloc (sizeof (*newp));
> - if (newp == NULL)
> - {
> - free (line);
> - fclose (fp);
> - goto no_file;
> - }
> -
> - memcpy (&newp->entry.prefix, &prefix, sizeof (prefix));
> - newp->entry.bits = bits;
> - newp->entry.val = val;
> - newp->next = *listp;
> - *listp = newp;
> - ++*lenp;
> - *nullbitsp |= bits == 0;
Matches extracted code, ok.
> }
> }
> break;
> @@ -1926,27 +1948,14 @@ gaiconf_init (void)
> && *endp == '\0'
> && val <= INT_MAX)
> {
> + if (!add_scopelist (&scopelist, &nscopelist,
> + &scopelist_nullbits, &prefix,
> + bits, val))
Ok.
> {
> free (line);
> fclose (fp);
> goto no_file;
> }
> - struct scopelist *newp;
> - new_scope:
> - newp = malloc (sizeof (*newp));
> - if (newp == NULL)
> - ...
> -
> - newp->entry.netmask = htonl (bits != 96
> - ? (0xffffffff
> - << (128 - bits))
> - : 0);
> - newp->entry.addr32 = (prefix.s6_addr32[3]
> - & newp->entry.netmask);
> - newp->entry.scope = val;
> - newp->next = scopelist;
> - scopelist = newp;
> - ++nscopelist;
> - scopelist_nullbits |= bits == 96;
Matches extracted code, ok.
> }
> else if (inet_pton (AF_INET, val1, &prefix.s6_addr32[3])
> @@ -1960,8 +1969,14 @@ gaiconf_init (void)
> && *endp == '\0'
> && val <= INT_MAX)
> {
> - bits += 96;
> - goto new_scope;
> + if (!add_scopelist (&scopelist, &nscopelist,
> + &scopelist_nullbits, &prefix,
> + bits + 96, val))
> + {
> + free (line);
> + fclose (fp);
> + goto no_file;
> + }
Ok.
> @@ -1969,10 +1984,14 @@ gaiconf_init (void)
> case 10:
> if (strcmp (cmd, "precedence") == 0)
> {
> - listp = &precedencelist;
> - lenp = &nprecedencelist;
> - nullbitsp = &precedencelist_nullbits;
> - goto new_elem;
> + if (!add_prefixlist (&precedencelist, &nprecedencelist,
> + &precedencelist_nullbits, val1, val2,
> + &cp))
> + {
> + free (line);
> + fclose (fp);
> + goto no_file;
> + }
Ok.
More information about the Libc-alpha
mailing list