From 8a40ed68071594e64a381859d6d4302a9e7dd7bf Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 29 Apr 1999 18:20:05 +0000 Subject: [PATCH] Update. * resolv/inet_addr.c (inet_aton): Optimize switch statement away. --- ChangeLog | 2 ++ FAQ.in | 12 ++++++++++++ resolv/inet_addr.c | 32 ++++++++------------------------ resolv/inet_pton.c | 1 + 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index bd689ee..8a7fe6e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 1999-04-29 Ulrich Drepper + * resolv/inet_addr.c (inet_aton): Optimize switch statement away. + * resolv/inet_pton.c (inet_pton4): Little optimizations. (inet_pton6): Likewise. diff --git a/FAQ.in b/FAQ.in index 1152b53..0b950c8 100644 --- a/FAQ.in +++ b/FAQ.in @@ -1314,6 +1314,18 @@ interface. For compilation with the old API, has to be included (and not ) and you can link with either `-ldb1' or `-ldb' for either of the db formats. +?? Autoconf's AC_CHECK_FUNC macro reports that a function exists, but + when I try to use it, it always returns -1 and sets errno to ENOSYS. + +{ZW} You are using a 2.0 Linux kernel, and the function you are trying to +use is only implemented in 2.1/2.2. Libc considers this to be a function +which exists, because if you upgrade to a 2.2 kernel, it will work. One +such function is sigaltstack. + +Your program should check at runtime whether the function works, and +implement a fallback. Note that Autoconf cannot detect unimplemented +functions in other systems' C libraries, so you need to do this anyway. + ? Miscellaneous diff --git a/resolv/inet_addr.c b/resolv/inet_addr.c index a5667eb..fe15b57 100644 --- a/resolv/inet_addr.c +++ b/resolv/inet_addr.c @@ -99,6 +99,7 @@ inet_aton(cp, addr) const char *cp; struct in_addr *addr; { + static const u_int32_t max[4] = { 0xffffffff, 0xffffff, 0xffff, 0xff }; register u_int32_t val; /* changed from u_long --david */ #ifndef _LIBC register int base; @@ -113,6 +114,8 @@ inet_aton(cp, addr) __set_errno (0); #endif + memset (parts, '\0', sizeof (parts)); + c = *cp; for (;;) { /* @@ -178,33 +181,14 @@ inet_aton(cp, addr) * the number of parts specified. */ n = pp - parts + 1; - switch (n) { - - case 0: - goto ret_0; /* initial nondigit */ - case 1: /* a -- 32 bits */ - break; + if (n == 0 /* initial nondigit */ + || parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff + || val > max[n - 1]) + goto ret_0; - case 2: /* a.b -- 8.24 bits */ - if (parts[0] > 0xff || val > 0xffffff) - goto ret_0; - val |= parts[0] << 24; - break; + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); - case 3: /* a.b.c -- 8.8.16 bits */ - if (parts[0] > 0xff || parts[1] > 0xff || val > 0xffff) - goto ret_0; - val |= (parts[0] << 24) | (parts[1] << 16); - break; - - case 4: /* a.b.c.d -- 8.8.8.8 bits */ - if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff - || val > 0xff) - goto ret_0; - val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); - break; - } if (addr) addr->s_addr = htonl(val); diff --git a/resolv/inet_pton.c b/resolv/inet_pton.c index d9e1f1d..e1419b9 100644 --- a/resolv/inet_pton.c +++ b/resolv/inet_pton.c @@ -24,6 +24,7 @@ static char rcsid[] = "$Id$"; #include #include #include +#include #include #include #include -- 2.7.4