summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-04-29 18:20:05 +0000
committerUlrich Drepper <drepper@redhat.com>1999-04-29 18:20:05 +0000
commit8a40ed68071594e64a381859d6d4302a9e7dd7bf (patch)
tree0cbc123ba64cfef83cec58ded66610f2ff4eebf5
parent61fab08af7b72e4ddb346a059d279d719e059b9e (diff)
downloadglibc-8a40ed68071594e64a381859d6d4302a9e7dd7bf.tar.gz
Update.
* resolv/inet_addr.c (inet_aton): Optimize switch statement away.
-rw-r--r--ChangeLog2
-rw-r--r--FAQ.in12
-rw-r--r--resolv/inet_addr.c32
-rw-r--r--resolv/inet_pton.c1
4 files changed, 23 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index bd689ee524..8a7fe6e9a2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
1999-04-29 Ulrich Drepper <drepper@cygnus.com>
+ * 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 1152b53e6d..0b950c81c5 100644
--- a/FAQ.in
+++ b/FAQ.in
@@ -1314,6 +1314,18 @@ interface. For compilation with the old API, <db_185.h> has to be included
(and not <db.h>) 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 a5667eb6ed..fe15b5701b 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 d9e1f1dfcd..e1419b96b4 100644
--- a/resolv/inet_pton.c
+++ b/resolv/inet_pton.c
@@ -24,6 +24,7 @@ static char rcsid[] = "$Id$";
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
+#include <ctype.h>
#include <string.h>
#include <errno.h>
#include <conf/portability.h>