mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-30 22:43:12 +03:00
Update.
1998-04-23 07:31 H.J. Lu <hjl@gnu.org> * resolv/inet_addr.c (inet_aton): Use __strtoul_internal to check overflow. * resolv/Makefile (tests): New, add tst-aton. * resolv/tst-aton.c: New file. 1998-04-29 Ulrich Drepper <drepper@cygnus.com> * sysdeps/sparc/sparc32/dl-machine.h (WEAKADDR): Add missing semicolon. * sysdeps/unix/sysv/linux/alpha/bits/signum.h: Add SIGCLD definition.
This commit is contained in:
@ -27,6 +27,8 @@ distribute := ../conf/portability.h mapv4v6addr.h mapv4v6hostent.h \
|
||||
|
||||
routines := herror inet_addr inet_ntop inet_pton nsap_addr res_init
|
||||
|
||||
tests = tst-aton
|
||||
|
||||
include ../Makeconfig
|
||||
|
||||
extra-libs := libresolv libnss_dns
|
||||
|
@ -63,6 +63,11 @@ static char rcsid[] = "$Id$";
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <ctype.h>
|
||||
#ifdef _LIBC
|
||||
# include <stdlib.h>
|
||||
# include <limits.h>
|
||||
# include <errno.h>
|
||||
#endif
|
||||
#include "../conf/portability.h"
|
||||
|
||||
/* these are compatibility routines, not needed on recent BSD releases */
|
||||
@ -91,7 +96,7 @@ inet_addr(cp)
|
||||
*/
|
||||
int
|
||||
inet_aton(cp, addr)
|
||||
register const char *cp;
|
||||
const char *cp;
|
||||
struct in_addr *addr;
|
||||
{
|
||||
register u_int32_t val; /* changed from u_long --david */
|
||||
@ -99,7 +104,11 @@ inet_aton(cp, addr)
|
||||
register char c;
|
||||
u_int parts[4];
|
||||
register u_int *pp = parts;
|
||||
#ifdef _LIBC
|
||||
int saved_errno = errno;
|
||||
|
||||
__set_errno (0);
|
||||
#endif
|
||||
c = *cp;
|
||||
for (;;) {
|
||||
/*
|
||||
@ -109,7 +118,7 @@ inet_aton(cp, addr)
|
||||
*/
|
||||
if (!isdigit(c))
|
||||
return (0);
|
||||
val = 0; base = 10;
|
||||
base = 10;
|
||||
if (c == '0') {
|
||||
c = *++cp;
|
||||
if (c == 'x' || c == 'X')
|
||||
@ -117,6 +126,16 @@ inet_aton(cp, addr)
|
||||
else
|
||||
base = 8;
|
||||
}
|
||||
#ifdef _LIBC
|
||||
val = strtoul (cp, (char **) &cp, base);
|
||||
if (val == ULONG_MAX && errno == ERANGE)
|
||||
{
|
||||
__set_errno (saved_errno);
|
||||
return 0;
|
||||
}
|
||||
c = *cp;
|
||||
#else
|
||||
val = 0;
|
||||
for (;;) {
|
||||
if (isascii(c) && isdigit(c)) {
|
||||
val = (val * base) + (c - '0');
|
||||
@ -128,6 +147,7 @@ inet_aton(cp, addr)
|
||||
} else
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (c == '.') {
|
||||
/*
|
||||
* Internet format:
|
||||
|
22
resolv/tst-aton.c
Normal file
22
resolv/tst-aton.c
Normal file
@ -0,0 +1,22 @@
|
||||
#include <stdio.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
enum { buf_size = 16 };
|
||||
static char buf[buf_size] = "323543357756889";
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
struct in_addr addr;
|
||||
int result = 0;
|
||||
|
||||
if (inet_aton (buf, &addr) != 0)
|
||||
{
|
||||
printf ("%s is seen as a valid IP address\n", buf);
|
||||
result = 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
Reference in New Issue
Block a user