summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2005-05-15 20:15:15 +0000
committerume <ume@FreeBSD.org>2005-05-15 20:15:15 +0000
commit7a6cd620d08df24bc7c27e2a13017a1f63f004b2 (patch)
tree309b5291b90b8bac584d010fde9db8ed4db9a767 /include
parentdd14237cdafb5e0124ab3277ac0ac8f9eaf03aa0 (diff)
downloadFreeBSD-src-7a6cd620d08df24bc7c27e2a13017a1f63f004b2.zip
FreeBSD-src-7a6cd620d08df24bc7c27e2a13017a1f63f004b2.tar.gz
- The ai_addrlen of a struct addrinfo used to be a size_t, per
RFC 2553. In XNS5.2, and subsequently in POSIX-2001 and RFC 3493, it was changed to a socklen_t. And, the n_net of a struct netent used to be an unsigned long integer. In XNS5, and subsequently in POSIX-2001, it was changed to an uint32_t. To accomodate for this while preserving ABI compatibility with the old interface, we need to prepend or append 32 bits of padding, depending on the (LP64) architecture's endianness. - Correct 1st argument of getnetbyaddr() to uint32_t on 32 bit arch. Stay as is on 64 bit arch for ABI backward compatibility for now. Reviewed by: das, peter MFC after: 2 weeks
Diffstat (limited to 'include')
-rw-r--r--include/netdb.h51
1 files changed, 46 insertions, 5 deletions
diff --git a/include/netdb.h b/include/netdb.h
index 6a2bd27..35fa2b1 100644
--- a/include/netdb.h
+++ b/include/netdb.h
@@ -63,6 +63,8 @@
#include <sys/cdefs.h>
#include <sys/_types.h>
+#include <machine/_limits.h>
+#include <machine/endian.h>
#ifndef _SIZE_T_DECLARED
typedef __size_t size_t;
@@ -74,6 +76,11 @@ typedef __socklen_t socklen_t;
#define _SOCKLEN_T_DECLARED
#endif
+#ifndef _UINT32_T_DECLARED
+typedef __uint32_t uint32_t;
+#define _UINT32_T_DECLARED
+#endif
+
#ifndef _PATH_HEQUIV
# define _PATH_HEQUIV "/etc/hosts.equiv"
#endif
@@ -99,14 +106,27 @@ struct hostent {
};
/*
- * Assumption here is that a network number
- * fits in an unsigned long -- probably a poor one.
+ * Note: n_net used to be an unsigned long integer.
+ * In XNS5, and subsequently in POSIX-2001 it was changed to an
+ * uint32_t.
+ * To accomodate for this while preserving binary compatibility with
+ * the old interface, we prepend or append 32 bits of padding,
+ * depending on the (LP64) architecture's endianness.
+ *
+ * This should be deleted the next time the libc major number is
+ * incremented.
*/
struct netent {
char *n_name; /* official name of net */
char **n_aliases; /* alias list */
int n_addrtype; /* net address type */
- unsigned long n_net; /* network # */
+#if __LONG_BIT == 64 && _BYTE_ORDER == _BIG_ENDIAN
+ uint32_t __n_pad0; /* ABI compatibility */
+#endif
+ uint32_t n_net; /* network # */
+#if __LONG_BIT == 64 && _BYTE_ORDER == _LITTLE_ENDIAN
+ uint32_t __n_pad0; /* ABI compatibility */
+#endif
};
struct servent {
@@ -122,12 +142,29 @@ struct protoent {
int p_proto; /* protocol # */
};
+/*
+ * Note: ai_addrlen used to be a size_t, per RFC 2553.
+ * In XNS5.2, and subsequently in POSIX-2001 and RFC 3493 it was
+ * changed to a socklen_t.
+ * To accomodate for this while preserving binary compatibility with the
+ * old interface, we prepend or append 32 bits of padding, depending on
+ * the (LP64) architecture's endianness.
+ *
+ * This should be deleted the next time the libc major number is
+ * incremented.
+ */
struct addrinfo {
int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
int ai_family; /* PF_xxx */
int ai_socktype; /* SOCK_xxx */
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
- size_t ai_addrlen; /* length of ai_addr */
+#if __LONG_BIT == 64 && _BYTE_ORDER == _BIG_ENDIAN
+ uint32_t __ai_pad0; /* ABI compatibility */
+#endif
+ socklen_t ai_addrlen; /* length of ai_addr */
+#if __LONG_BIT == 64 && _BYTE_ORDER == _LITTLE_ENDIAN
+ uint32_t __ai_pad0; /* ABI compatibility */
+#endif
char *ai_canonname; /* canonical name for hostname */
struct sockaddr *ai_addr; /* binary address */
struct addrinfo *ai_next; /* next structure in linked list */
@@ -225,7 +262,11 @@ struct hostent *gethostbyname2(const char *, int);
struct hostent *gethostent(void);
struct hostent *getipnodebyaddr(const void *, size_t, int, int *);
struct hostent *getipnodebyname(const char *, int, int, int *);
-struct netent *getnetbyaddr(unsigned long, int);
+#if __LONG_BIT == 64
+struct netent *getnetbyaddr(unsigned long, int); /* ABI compatibility */
+#else
+struct netent *getnetbyaddr(uint32_t, int);
+#endif
struct netent *getnetbyname(const char *);
struct netent *getnetent(void);
int getnetgrent(char **, char **, char **);
OpenPOWER on IntegriCloud