Fix gethostbyaddr() prototype to conform to IEEE Std 1003.1:
http://www.opengroup.org/onlinepubs/009695399/functions/gethostbyaddr.html gethostbyaddr_r() is changed as well. It breaks ABI backward compatibility on 64 bit arch. So, we fix it on 32 bit arch only for now. Reported by: Rostislav Krasny <rosti.bsd@gmail.com>
This commit is contained in:
parent
08978d5bee
commit
ab3eacdf31
@ -63,6 +63,7 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/_types.h>
|
||||
#include <machine/_limits.h>
|
||||
|
||||
#ifndef _SIZE_T_DECLARED
|
||||
typedef __size_t size_t;
|
||||
@ -220,9 +221,15 @@ void endnetgrent(void);
|
||||
void endprotoent(void);
|
||||
void endservent(void);
|
||||
void freehostent(struct hostent *);
|
||||
struct hostent *gethostbyaddr(const char *, int, int);
|
||||
int gethostbyaddr_r(const char *, int, int, struct hostent *,
|
||||
#if __LONG_BIT == 64
|
||||
struct hostent *gethostbyaddr(const void *, int, int);
|
||||
int gethostbyaddr_r(const void *, int, int, struct hostent *,
|
||||
char *, size_t, struct hostent **, int *);
|
||||
#else
|
||||
struct hostent *gethostbyaddr(const void *, socklen_t, int);
|
||||
int gethostbyaddr_r(const void *, socklen_t, int, struct hostent *,
|
||||
char *, size_t, struct hostent **, int *);
|
||||
#endif
|
||||
struct hostent *gethostbyname(const char *);
|
||||
int gethostbyname_r(const char *, struct hostent *, char *, size_t,
|
||||
struct hostent **, int *);
|
||||
|
@ -550,11 +550,13 @@ _dns_gethostbyname(void *rval, void *cb_data, va_list ap)
|
||||
int
|
||||
_dns_gethostbyaddr(void *rval, void *cb_data, va_list ap)
|
||||
{
|
||||
const u_char *uaddr;
|
||||
int len, af;
|
||||
const void *addr;
|
||||
socklen_t len;
|
||||
int af;
|
||||
char *buffer;
|
||||
size_t buflen;
|
||||
int *errnop, *h_errnop;
|
||||
const u_char *uaddr;
|
||||
struct hostent *hptr, he;
|
||||
struct hostent_data *hed;
|
||||
int n;
|
||||
@ -570,14 +572,15 @@ _dns_gethostbyaddr(void *rval, void *cb_data, va_list ap)
|
||||
int ret_h_error;
|
||||
#endif /*SUNSECURITY*/
|
||||
|
||||
uaddr = va_arg(ap, const u_char *);
|
||||
len = va_arg(ap, int);
|
||||
addr = va_arg(ap, const void *);
|
||||
len = va_arg(ap, socklen_t);
|
||||
af = va_arg(ap, int);
|
||||
hptr = va_arg(ap, struct hostent *);
|
||||
buffer = va_arg(ap, char *);
|
||||
buflen = va_arg(ap, size_t);
|
||||
errnop = va_arg(ap, int *);
|
||||
h_errnop = va_arg(ap, int *);
|
||||
uaddr = (const u_char *)addr;
|
||||
|
||||
*((struct hostent **)rval) = NULL;
|
||||
|
||||
|
@ -282,8 +282,9 @@ found:
|
||||
int
|
||||
_ht_gethostbyaddr(void *rval, void *cb_data, va_list ap)
|
||||
{
|
||||
const char *addr;
|
||||
int len, af;
|
||||
const void *addr;
|
||||
socklen_t len;
|
||||
int af;
|
||||
char *buffer;
|
||||
size_t buflen;
|
||||
int *errnop, *h_errnop;
|
||||
@ -292,8 +293,8 @@ _ht_gethostbyaddr(void *rval, void *cb_data, va_list ap)
|
||||
res_state statp;
|
||||
int error;
|
||||
|
||||
addr = va_arg(ap, const char *);
|
||||
len = va_arg(ap, int);
|
||||
addr = va_arg(ap, const void *);
|
||||
len = va_arg(ap, socklen_t);
|
||||
af = va_arg(ap, int);
|
||||
hptr = va_arg(ap, struct hostent *);
|
||||
buffer = va_arg(ap, char *);
|
||||
|
@ -55,7 +55,7 @@
|
||||
.Ft struct hostent *
|
||||
.Fn gethostbyname2 "const char *name" "int af"
|
||||
.Ft struct hostent *
|
||||
.Fn gethostbyaddr "const char *addr" "int len" "int type"
|
||||
.Fn gethostbyaddr "const void *addr" "socklen_t len" "int type"
|
||||
.Ft struct hostent *
|
||||
.Fn gethostent void
|
||||
.Ft void
|
||||
@ -246,7 +246,7 @@ struct hostent *hp;
|
||||
if (!inet_aton(ipstr, &ip))
|
||||
errx(1, "can't parse IP address %s", ipstr);
|
||||
|
||||
if ((hp = gethostbyaddr((const char *)&ip,
|
||||
if ((hp = gethostbyaddr((const void *)&ip,
|
||||
sizeof ip, AF_INET)) == NULL)
|
||||
errx(1, "no name associated with %s", ipstr);
|
||||
|
||||
|
@ -178,8 +178,8 @@ _gethostbynisname_r(const char *name, int af, struct hostent *he,
|
||||
}
|
||||
|
||||
static int
|
||||
_gethostbynisaddr_r(const char *addr, int len, int af, struct hostent *he,
|
||||
struct hostent_data *hed)
|
||||
_gethostbynisaddr_r(const void *addr, socklen_t len, int af,
|
||||
struct hostent *he, struct hostent_data *hed)
|
||||
{
|
||||
char *map;
|
||||
char numaddr[46];
|
||||
@ -227,7 +227,7 @@ _gethostbynisname(const char *name, int af)
|
||||
}
|
||||
|
||||
struct hostent *
|
||||
_gethostbynisaddr(const char *addr, int len, int af)
|
||||
_gethostbynisaddr(const void *addr, socklen_t len, int af)
|
||||
{
|
||||
#ifdef YP
|
||||
struct hostent *he;
|
||||
@ -303,8 +303,8 @@ int
|
||||
_nis_gethostbyaddr(void *rval, void *cb_data, va_list ap)
|
||||
{
|
||||
#ifdef YP
|
||||
const char *addr;
|
||||
int len;
|
||||
const void *addr;
|
||||
socklen_t len;
|
||||
int af;
|
||||
char *buffer;
|
||||
size_t buflen;
|
||||
@ -313,8 +313,8 @@ _nis_gethostbyaddr(void *rval, void *cb_data, va_list ap)
|
||||
struct hostent_data *hed;
|
||||
res_state statp;
|
||||
|
||||
addr = va_arg(ap, const char *);
|
||||
len = va_arg(ap, int);
|
||||
addr = va_arg(ap, const void *);
|
||||
len = va_arg(ap, socklen_t);
|
||||
af = va_arg(ap, int);
|
||||
hptr = va_arg(ap, struct hostent *);
|
||||
buffer = va_arg(ap, char *);
|
||||
|
@ -573,8 +573,14 @@ gethostbyname_internal(const char *name, int af, struct hostent *hp, char *buf,
|
||||
}
|
||||
|
||||
int
|
||||
gethostbyaddr_r(const char *addr, int len, int af, struct hostent *hp,
|
||||
char *buf, size_t buflen, struct hostent **result, int *h_errnop)
|
||||
gethostbyaddr_r(const void *addr,
|
||||
#if __LONG_BIT == 64
|
||||
int len,
|
||||
#else
|
||||
socklen_t len,
|
||||
#endif
|
||||
int af, struct hostent *hp, char *buf, size_t buflen,
|
||||
struct hostent **result, int *h_errnop)
|
||||
{
|
||||
const u_char *uaddr = (const u_char *)addr;
|
||||
const struct in6_addr *addr6;
|
||||
@ -606,7 +612,7 @@ gethostbyaddr_r(const char *addr, int len, int af, struct hostent *hp,
|
||||
}
|
||||
|
||||
if (af == AF_INET6 && len == NS_IN6ADDRSZ) {
|
||||
addr6 = (const struct in6_addr *)(const void *)uaddr;
|
||||
addr6 = (const struct in6_addr *)addr;
|
||||
if (IN6_IS_ADDR_LINKLOCAL(addr6)) {
|
||||
RES_SET_H_ERRNO(statp, HOST_NOT_FOUND);
|
||||
*h_errnop = statp->res_h_errno;
|
||||
@ -678,7 +684,11 @@ gethostbyname2(const char *name, int af)
|
||||
}
|
||||
|
||||
struct hostent *
|
||||
gethostbyaddr(const char *addr, int len, int af)
|
||||
#if __LONG_BIT == 64
|
||||
gethostbyaddr(const void *addr, int len, int af)
|
||||
#else
|
||||
gethostbyaddr(const void *addr, socklen_t len, int af)
|
||||
#endif
|
||||
{
|
||||
struct hostdata *hd;
|
||||
struct hostent *rval;
|
||||
|
@ -133,7 +133,7 @@ void _endhostdnsent(void);
|
||||
void _endhosthtent(struct hostent_data *);
|
||||
void _endnetdnsent(void);
|
||||
void _endnethtent(struct netent_data *);
|
||||
struct hostent *_gethostbynisaddr(const char *, int, int);
|
||||
struct hostent *_gethostbynisaddr(const void *, socklen_t, int);
|
||||
struct hostent *_gethostbynisname(const char *, int);
|
||||
void _map_v4v6_address(const char *, char *);
|
||||
void _map_v4v6_hostent(struct hostent *, char **, char *);
|
||||
|
Loading…
x
Reference in New Issue
Block a user