resolv: Reformat inet_addr, inet_aton to GNU style

This commit is contained in:
Florian Weimer 2019-01-21 08:59:42 +01:00
parent 71effcea34
commit 5e30b8ef07
2 changed files with 100 additions and 85 deletions

View File

@ -1,3 +1,8 @@
2019-01-21 Florian Weimer <fweimer@redhat.com>
* resolv/inet_addr.c: Reformat to GNU style.
(__inet_addr, __inet_aton): Update comment.
2019-01-18 Florian Weimer <fweimer@redhat.com>
malloc: Revert commit 6923f6db1e688dedcf3a6556da76e0bf24a41872

View File

@ -1,3 +1,21 @@
/* Legacy IPv4 text-to-address functions.
Copyright (C) 2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/*
* Copyright (c) 1983, 1990, 1993
* The Regents of the University of California. All rights reserved.
@ -78,105 +96,97 @@
#include <limits.h>
#include <errno.h>
/*
* Ascii internet address interpretation routine.
* The value returned is in network order.
*/
/* ASCII IPv4 Internet address interpretation routine. The value
returned is in network order. */
in_addr_t
__inet_addr(const char *cp) {
struct in_addr val;
__inet_addr (const char *cp)
{
struct in_addr val;
if (__inet_aton(cp, &val))
return (val.s_addr);
return (INADDR_NONE);
if (__inet_aton (cp, &val))
return val.s_addr;
return INADDR_NONE;
}
weak_alias (__inet_addr, inet_addr)
/*
* Check whether "cp" is a valid ascii representation
* of an Internet address and convert to a binary address.
* Returns 1 if the address is valid, 0 if not.
* This replaces inet_addr, the return value from which
* cannot distinguish between failure and a local broadcast address.
*/
/* Check whether "cp" is a valid ASCII representation of an IPv4
Internet address and convert it to a binary address. Returns 1 if
the address is valid, 0 if not. This replaces inet_addr, the
return value from which cannot distinguish between failure and a
local broadcast address. */
int
__inet_aton(const char *cp, struct in_addr *addr)
__inet_aton (const char *cp, struct in_addr *addr)
{
static const in_addr_t max[4] = { 0xffffffff, 0xffffff, 0xffff, 0xff };
in_addr_t val;
char c;
union iaddr {
uint8_t bytes[4];
uint32_t word;
} res;
uint8_t *pp = res.bytes;
int digit;
static const in_addr_t max[4] = { 0xffffffff, 0xffffff, 0xffff, 0xff };
in_addr_t val;
char c;
union iaddr
{
uint8_t bytes[4];
uint32_t word;
} res;
uint8_t *pp = res.bytes;
int digit;
int saved_errno = errno;
__set_errno (0);
int saved_errno = errno;
__set_errno (0);
res.word = 0;
res.word = 0;
c = *cp;
for (;;) {
/*
* Collect number up to ``.''.
* Values are specified as for C:
* 0x=hex, 0=octal, isdigit=decimal.
*/
if (!isdigit(c))
goto ret_0;
{
char *endp;
unsigned long ul = strtoul (cp, (char **) &endp, 0);
if (ul == ULONG_MAX && errno == ERANGE)
goto ret_0;
if (ul > 0xfffffffful)
goto ret_0;
val = ul;
digit = cp != endp;
cp = endp;
}
c = *cp;
if (c == '.') {
/*
* Internet format:
* a.b.c.d
* a.b.c (with c treated as 16 bits)
* a.b (with b treated as 24 bits)
*/
if (pp > res.bytes + 2 || val > 0xff)
goto ret_0;
*pp++ = val;
c = *++cp;
} else
break;
}
/*
* Check for trailing characters.
*/
if (c != '\0' && (!isascii(c) || !isspace(c)))
goto ret_0;
/*
* Did we get a valid digit?
*/
if (!digit)
goto ret_0;
/* Check whether the last part is in its limits depending on
the number of parts in total. */
if (val > max[pp - res.bytes])
c = *cp;
for (;;)
{
/* Collect number up to ``.''. Values are specified as for C:
0x=hex, 0=octal, isdigit=decimal. */
if (!isdigit (c))
goto ret_0;
{
char *endp;
unsigned long ul = strtoul (cp, &endp, 0);
if (ul == ULONG_MAX && errno == ERANGE)
goto ret_0;
if (ul > 0xfffffffful)
goto ret_0;
val = ul;
digit = cp != endp;
cp = endp;
}
c = *cp;
if (c == '.')
{
/* Internet format:
a.b.c.d
a.b.c (with c treated as 16 bits)
a.b (with b treated as 24 bits). */
if (pp > res.bytes + 2 || val > 0xff)
goto ret_0;
*pp++ = val;
c = *++cp;
}
else
break;
}
/* Check for trailing characters. */
if (c != '\0' && (!isascii (c) || !isspace (c)))
goto ret_0;
/* Did we get a valid digit? */
if (!digit)
goto ret_0;
if (addr != NULL)
addr->s_addr = res.word | htonl (val);
/* Check whether the last part is in its limits depending on the
number of parts in total. */
if (val > max[pp - res.bytes])
goto ret_0;
__set_errno (saved_errno);
return (1);
if (addr != NULL)
addr->s_addr = res.word | htonl (val);
ret_0:
__set_errno (saved_errno);
return (0);
__set_errno (saved_errno);
return 1;
ret_0:
__set_errno (saved_errno);
return 0;
}
weak_alias (__inet_aton, inet_aton)
libc_hidden_def (__inet_aton)