aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--stdio-common/tmpnam.c2
-rw-r--r--sysdeps/posix/getaddrinfo.c31
3 files changed, 37 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index e895596b50..84493047c9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2000-09-28 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/posix/getaddrinfo.c (gaih_inet): Handle req->ai_socktype
+ correctly. Reported by Felix von Leitner <leitner@convergence.de>.
+
2000-09-19 H.J. Lu <hjl@gnu.org>
* malloc/malloc.h (__memalign_hook): Fix the parameter order.
diff --git a/stdio-common/tmpnam.c b/stdio-common/tmpnam.c
index fc30026648..e1e11aea17 100644
--- a/stdio-common/tmpnam.c
+++ b/stdio-common/tmpnam.c
@@ -30,7 +30,7 @@ tmpnam (char *s)
/* By using two buffers we manage to be thread safe in the case
where S != NULL. */
char tmpbufmem[L_tmpnam];
- char tmpbuf = s ?: tmpbufmem;
+ char *tmpbuf = s ?: tmpbufmem;
/* In the following call we use the buffer pointed to by S if
non-NULL although we don't know the size. But we limit the size
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 7a84cd3030..bbd4dd1429 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -356,6 +356,10 @@ gaih_inet (const char *name, const struct gaih_service *service,
if ((tp->protoflag & GAI_PROTO_NOSERVICE) != 0)
continue;
+ if (req->ai_socktype != 0
+ && req->ai_socktype != tp->socktype)
+ continue;
+
newp = (struct gaih_servtuple *)
__alloca (sizeof (struct gaih_servtuple));
@@ -382,6 +386,33 @@ gaih_inet (const char *name, const struct gaih_service *service,
st->port = htons (service->num);
}
}
+ else if (req->ai_socktype || req->ai_protocol)
+ {
+ st = __alloca (sizeof (struct gaih_servtuple));
+ st->next = NULL;
+ st->socktype = req->ai_socktype;
+ st->protocol = req->ai_protocol;
+ st->port = 0;
+ }
+ else
+ {
+ /* Neither socket type nor protocol is set. Return all socket types
+ we know about. */
+ struct gaih_servtuple **lastp = &st;
+ for (++tp; tp->name != NULL; ++tp)
+ {
+ struct gaih_servtuple *newp;
+
+ newp = __alloca (sizeof (struct gaih_servtuple));
+ newp->next = NULL;
+ newp->socktype = tp->socktype;
+ newp->protocol = tp->protocol;
+ newp->port = 0;
+
+ *lastp = newp;
+ lastp = &newp->next;
+ }
+ }
if (name != NULL)
{