mirror of
git://git.musl-libc.org/musl
synced 2025-03-03 10:17:31 +00:00
dynamically allocate storage for gethostby* buffers
this change shaves ~1k off libc.so bss size, and also avoids hard errors in the case where the static buffer was not large enough to hold the result. this whole framework is really ugly and might should be replaced or at least heavily overhauled when some changes/factorizations are made to getaddrinfo internals in the future.
This commit is contained in:
parent
c0193550a0
commit
a47ad3ebce
@ -3,13 +3,24 @@
|
||||
#include <netdb.h>
|
||||
#include <string.h>
|
||||
#include <netinet/in.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
struct hostent *gethostbyaddr(const void *a, socklen_t l, int af)
|
||||
{
|
||||
static struct hostent h;
|
||||
static long buf[512/sizeof(long)];
|
||||
static struct hostent *h;
|
||||
size_t size = 63;
|
||||
struct hostent *res;
|
||||
if (gethostbyaddr_r(a, l, af, &h,
|
||||
(void *)buf, sizeof buf, &res, &h_errno)) return 0;
|
||||
return &h;
|
||||
int err;
|
||||
do {
|
||||
free(h);
|
||||
h = malloc(size+=size+1);
|
||||
if (!h) {
|
||||
h_errno = NO_RECOVERY;
|
||||
return 0;
|
||||
}
|
||||
err = gethostbyaddr_r(a, l, af, h,
|
||||
(void *)(h+1), size-sizeof *h, &res, &h_errno);
|
||||
} while (err == ERANGE);
|
||||
return err ? 0 : h;
|
||||
}
|
||||
|
@ -4,13 +4,24 @@
|
||||
#include <netdb.h>
|
||||
#include <string.h>
|
||||
#include <netinet/in.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
struct hostent *gethostbyname2(const char *name, int af)
|
||||
{
|
||||
static struct hostent h;
|
||||
static long buf[512/sizeof(long)];
|
||||
static struct hostent *h;
|
||||
size_t size = 63;
|
||||
struct hostent *res;
|
||||
if (gethostbyname2_r(name, af, &h,
|
||||
(void *)buf, sizeof buf, &res, &h_errno)) return 0;
|
||||
return &h;
|
||||
int err;
|
||||
do {
|
||||
free(h);
|
||||
h = malloc(size+=size+1);
|
||||
if (!h) {
|
||||
h_errno = NO_RECOVERY;
|
||||
return 0;
|
||||
}
|
||||
err = gethostbyname2_r(name, af, h,
|
||||
(void *)(h+1), size-sizeof *h, &res, &h_errno);
|
||||
} while (err == ERANGE);
|
||||
return err ? 0 : h;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user