Index: configure.in =================================================================== RCS file: /projects/cvsroot/pgsql-server/configure.in,v retrieving revision 1.266 diff -u -r1.266 configure.in --- configure.in 18 Jun 2003 16:04:15 -0000 1.266 +++ configure.in 19 Jun 2003 20:56:20 -0000 @@ -778,6 +778,7 @@ PGAC_UNION_SEMUN PGAC_STRUCT_SOCKADDR_UN PGAC_STRUCT_SOCKADDR_STORAGE +PGAC_STRUCT_SOCKADDR_STORAGE_SS_FAMILY PGAC_STRUCT_ADDRINFO AC_CHECK_TYPES([struct cmsgcred, struct fcred, struct sockcred], [], [], Index: config/c-library.m4 =================================================================== RCS file: /projects/cvsroot/pgsql-server/config/c-library.m4,v retrieving revision 1.21 diff -u -r1.21 c-library.m4 --- config/c-library.m4 12 Jun 2003 16:05:10 -0000 1.21 +++ config/c-library.m4 19 Jun 2003 20:56:20 -0000 @@ -110,6 +110,19 @@ #endif ])])# PGAC_STRUCT_SOCKADDR_STORAGE +# PGAC_STRUCT_SOCKADDR_STORAGE_SS_FAMILY +# -------------------------------------- +# This checks if the struct sockaddr has a proper ss_family and not an +# __ss_family as rfc2553 defined. +AC_DEFUN([PGAC_STRUCT_SOCKADDR_STORAGE_SS_FAMILY], +[AC_CHECK_MEMBERS([struct sockaddr_storage.ss_family, + struct sockaddr_storage.__ss_family], [], [], +[#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +])])# PGAC_STRUCT_SOCKADDR_STORAGE_SS_FAMILY + # PGAC_STRUCT_ADDRINFO # ----------------------- Index: src/include/pg_config.h.in =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/pg_config.h.in,v retrieving revision 1.53 diff -u -r1.53 pg_config.h.in --- src/include/pg_config.h.in 15 Jun 2003 04:09:18 -0000 1.53 +++ src/include/pg_config.h.in 19 Jun 2003 20:56:21 -0000 @@ -423,6 +423,12 @@ /* Define to 1 if the system has the type `struct sockaddr_storage'. */ #undef HAVE_STRUCT_SOCKADDR_STORAGE +/* Define to 1 if your struct sockaddr_storage has an ss_family member */ +#undef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY + +/* Define to 1 if your struct sockaddr_storage has an __ss_family member */ +#undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY + /* Define to 1 if the system has the type `struct sockaddr_un'. */ #undef HAVE_STRUCT_SOCKADDR_UN Index: src/include/libpq/pqcomm.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/libpq/pqcomm.h,v retrieving revision 1.86 diff -u -r1.86 pqcomm.h --- src/include/libpq/pqcomm.h 12 Jun 2003 07:36:51 -0000 1.86 +++ src/include/libpq/pqcomm.h 19 Jun 2003 20:56:21 -0000 @@ -43,15 +43,25 @@ /* * Definitions used for sockaddr_storage structure paddings design. */ -#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (sa_family_t)) -#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (sa_family_t) + \ +/* Some platforms don't have sa_family_t, so we compute it ourselves */ +#define SIZEOF_SOCKADDR_FAMILY sizeof(((struct sockaddr *)0)->sa_family) + +#define _SS_PAD1SIZE (_SS_ALIGNSIZE - SIZEOF_SOCKADDR_FAMILY) +#define _SS_PAD2SIZE (_SS_MAXSIZE - (SIZEOF_SOCKADDR_FAMILY + \ _SS_PAD1SIZE + _SS_ALIGNSIZE)) struct sockaddr_storage { #ifdef SALEN uint8_t __ss_len; /* address length */ #endif - sa_family_t ss_family; /* address family */ + +#if SIZEOF_SOCKADDR_FAMILY == 1 + uint8_t ss_family; +#elif SIZEOF_SOCKADDR_FAMILY == 2 + uint16_t ss_family; +#else +#error unsupported sa_family size +#endif char __ss_pad1[_SS_PAD1SIZE]; /* 6 byte pad, this is to make implementation @@ -65,6 +75,12 @@ * _SS_MAXSIZE value minus size of ss_family * __ss_pad1, __ss_align fields is 112 */ }; +#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 #endif typedef struct { Index: src/port/getaddrinfo.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/port/getaddrinfo.c,v retrieving revision 1.8 diff -u -r1.8 getaddrinfo.c --- src/port/getaddrinfo.c 14 Jun 2003 18:20:33 -0000 1.8 +++ src/port/getaddrinfo.c 19 Jun 2003 20:56:22 -0000 @@ -220,7 +220,6 @@ char *node, int nodelen, char *service, int servicelen, int flags) { - sa_family_t family; int ret = -1; /* Invalid arguments. */ @@ -236,9 +235,8 @@ return EAI_FAIL; } - family = sa->sa_family; #ifdef HAVE_IPV6 - if (family == AF_INET6) + if (sa->sa_family == AF_INET6) { return EAI_FAMILY; } @@ -246,13 +244,13 @@ if (service) { - if (family == AF_INET) + if (sa->sa_family == AF_INET) { ret = snprintf(service, servicelen, "%d", ntohs(((struct sockaddr_in *)sa)->sin_port)); } #ifdef HAVE_UNIX_SOCKETS - else if (family == AF_UNIX) + else if (sa->sa_family == AF_UNIX) { ret = snprintf(service, servicelen, "%s", ((struct sockaddr_un *)sa)->sun_path); @@ -266,14 +264,14 @@ if (node) { - if (family == AF_INET) + if (sa->sa_family == AF_INET) { char *p; p = inet_ntoa(((struct sockaddr_in *)sa)->sin_addr); ret = snprintf(node, nodelen, "%s", p); } #ifdef HAVE_UNIX_SOCKETS - else if (family == AF_UNIX) + else if (sa->sa_family == AF_UNIX) { ret = snprintf(node, nodelen, "%s", "localhost"); }