summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-07-23 23:30:41 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-07-23 23:30:41 +0000
commitdf63503dc2fbe59292a65c685479bf1a439b9b4d (patch)
tree4f1b242db11a03e2f2ed78092e90f72f416dcd49 /src/include
parent93395de092fbec103b2949ba46c2642ef875405c (diff)
downloadpostgresql-df63503dc2fbe59292a65c685479bf1a439b9b4d.tar.gz
Have a go at fixing various outstanding portability issues in code that
was modified for IPv6. Use a robust definition of struct sockaddr_storage, do a proper configure test to see if ss_len exists, don't assume that getnameinfo() will handle AF_UNIX sockets, don't trust getaddrinfo to return the protocol we ask for, etc. This incorporates several outstanding patches from Kurt Roeckx, but I'm to blame for anything that doesn't work ...
Diffstat (limited to 'src/include')
-rw-r--r--src/include/getaddrinfo.h3
-rw-r--r--src/include/libpq/ip.h17
-rw-r--r--src/include/libpq/pqcomm.h61
-rw-r--r--src/include/pg_config.h.in12
4 files changed, 49 insertions, 44 deletions
diff --git a/src/include/getaddrinfo.h b/src/include/getaddrinfo.h
index ced6df07e9..6312482a7a 100644
--- a/src/include/getaddrinfo.h
+++ b/src/include/getaddrinfo.h
@@ -3,7 +3,6 @@
* getaddrinfo.h
* Support getaddrinfo() on platforms that don't have it.
*
- *
* Note: we use our own routines on platforms that don't HAVE_STRUCT_ADDRINFO,
* whether or not the library routine getaddrinfo() can be found. This
* policy is needed because on some platforms a manually installed libbind.a
@@ -16,7 +15,7 @@
*
* Copyright (c) 2003, PostgreSQL Global Development Group
*
- * $Id: getaddrinfo.h,v 1.6 2003/06/12 08:15:29 momjian Exp $
+ * $Id: getaddrinfo.h,v 1.7 2003/07/23 23:30:40 tgl Exp $
*
*-------------------------------------------------------------------------
*/
diff --git a/src/include/libpq/ip.h b/src/include/libpq/ip.h
index b770d33bfe..5c614b1681 100644
--- a/src/include/libpq/ip.h
+++ b/src/include/libpq/ip.h
@@ -5,7 +5,7 @@
*
* Copyright (c) 2003, PostgreSQL Global Development Group
*
- * $Id: ip.h,v 1.8 2003/06/12 07:36:51 momjian Exp $
+ * $Id: ip.h,v 1.9 2003/07/23 23:30:41 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -16,10 +16,15 @@
#include "libpq/pqcomm.h"
-extern int getaddrinfo2(const char *hostname, const char *servname,
- const struct addrinfo *hintp,
- struct addrinfo **result);
-extern void freeaddrinfo2(int hint_ai_family, struct addrinfo *ai);
+extern int getaddrinfo_all(const char *hostname, const char *servname,
+ const struct addrinfo *hintp,
+ struct addrinfo **result);
+extern void freeaddrinfo_all(int hint_ai_family, struct addrinfo *ai);
+
+extern int getnameinfo_all(const struct sockaddr_storage *addr, int salen,
+ char *node, int nodelen,
+ char *service, int servicelen,
+ int flags);
extern int rangeSockAddr(const struct sockaddr_storage *addr,
const struct sockaddr_storage *netaddr,
@@ -29,7 +34,7 @@ extern int SockAddr_cidr_mask(struct sockaddr_storage **mask,
char *numbits, int family);
#ifdef HAVE_UNIX_SOCKETS
-#define IS_AF_UNIX(fam) (fam == AF_UNIX)
+#define IS_AF_UNIX(fam) ((fam) == AF_UNIX)
#else
#define IS_AF_UNIX(fam) (0)
#endif
diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h
index 0cabdc24c1..caa186b832 100644
--- a/src/include/libpq/pqcomm.h
+++ b/src/include/libpq/pqcomm.h
@@ -9,7 +9,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: pqcomm.h,v 1.89 2003/07/15 17:54:34 tgl Exp $
+ * $Id: pqcomm.h,v 1.90 2003/07/23 23:30:41 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -32,56 +32,47 @@
#include <netinet/in.h>
#endif /* not WIN32 */
-#ifndef HAVE_STRUCT_SOCKADDR_STORAGE
-/* Define a struct sockaddr_storage if we don't have one. */
-
-#define _SS_MAXSIZE 128 /* Implementation specific max size */
+#ifdef HAVE_STRUCT_SOCKADDR_STORAGE
-#ifdef __CYGWIN__
-typedef unsigned short sa_family_t;
+#ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY
+# ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
+# define ss_family __ss_family
+# else
+# error struct sockaddr_storage does not provide an ss_family member
+# endif
#endif
-/* This must exactly match the non-padding fields of sockaddr_storage! */
-struct nopad_sockaddr_storage {
-#ifdef SALEN
- uint8 __ss_len; /* address length */
+#ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN
+#define ss_len __ss_len
+#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1
#endif
- sa_family_t ss_family; /* address family */
-
- int64 __ss_align; /* ensures struct is properly aligned */
-};
-struct sockaddr_storage {
-#ifdef SALEN
- uint8 __ss_len; /* address length */
-#endif
- sa_family_t ss_family; /* address family */
+#else /* !HAVE_STRUCT_SOCKADDR_STORAGE */
- int64 __ss_align; /* ensures struct is properly aligned */
+/* Define a struct sockaddr_storage if we don't have one. */
- char __ss_pad[_SS_MAXSIZE - sizeof(struct nopad_sockaddr_storage)];
- /* ensures struct has desired size */
+struct sockaddr_storage {
+ union {
+ struct sockaddr sa; /* get the system-dependent fields */
+ int64 ss_align; /* ensures struct is properly aligned */
+ char ss_pad[128]; /* ensures struct has desired size */
+ } ss_stuff;
};
-#elif !defined(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)
-# ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
-# define ss_family __ss_family
-# else
-# error struct sockaddr_storage does not provide an ss_family member
-# endif
+#define ss_family ss_stuff.sa.sa_family
+/* It should have an ss_len field if sockaddr has sa_len. */
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+#define ss_len ss_stuff.sa.sa_len
+#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1
#endif
+#endif /* HAVE_STRUCT_SOCKADDR_STORAGE */
+
typedef struct {
struct sockaddr_storage addr;
ACCEPT_TYPE_ARG3 salen;
} SockAddr;
-/* Some systems don't have it, so default it to 0 so it doesn't
- * have any effect on those systems. */
-#ifndef AI_ADDRCONFIG
-#define AI_ADDRCONFIG 0
-#endif
-
/* Configure the UNIX socket location for the well known port. */
#define UNIXSOCK_PATH(path,port,defpath) \
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 41806fe8fb..2fe4cd3ea1 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -420,15 +420,24 @@
/* Define to 1 if the system has the type `struct fcred'. */
#undef HAVE_STRUCT_FCRED
+/* Define to 1 if `sa_len' is member of `struct sockaddr'. */
+#undef HAVE_STRUCT_SOCKADDR_SA_LEN
+
/* Define to 1 if the system has the type `struct sockaddr_storage'. */
#undef HAVE_STRUCT_SOCKADDR_STORAGE
/* Define to 1 if `ss_family' is member of `struct sockaddr_storage'. */
#undef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY
+/* Define to 1 if `ss_len' is member of `struct sockaddr_storage'. */
+#undef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN
+
/* Define to 1 if `__ss_family' is member of `struct sockaddr_storage'. */
#undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
+/* Define to 1 if `__ss_len' is member of `struct sockaddr_storage'. */
+#undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN
+
/* Define to 1 if the system has the type `struct sockaddr_un'. */
#undef HAVE_STRUCT_SOCKADDR_UN
@@ -594,7 +603,8 @@
/* Define to select SysV-style shared memory. */
#undef USE_SYSV_SHARED_MEMORY
-/* Define to 1 to build libpq and ecpg to be thread-safe. (--with-threads) */
+/* Define to 1 to build libpq and ecpg to be thread-safe.
+ (--enable-thread-safeness) */
#undef USE_THREADS
/* Define to select unnamed POSIX semaphores. */