On Mon, Jul 07, 2003 at 12:38:57AM +0900, [EMAIL PROTECTED] wrote: > > On Wed, Jul 02, 2003 at 03:49:19PM +0900, Kenji Sugita wrote: > > It seems that a value of addr->ai_socktype returned by getaddrinfo in > > pg_stat.c is not SOCK_DGRAM. > > Please try the following untested patch: [...]
> + for (; addr != NULL; addr = addr->ai_next) > + if ((pgStatSock = socket(addr->ai_family, > + addr->ai_socktype, addr->ai_protocol)) >= 0) > + break; This will break. You should use a pointer to the addr, and go over the list using that. freeaddrinfo() needs to have the original addr back. He seems to have 2 problems: - On Mac OS X getaddrinfo() returns something it shouldn't. A patch like that could fix it. - On Linux Redhat 6.2 (and 6.0) getaddrinfo() seems to have a problem with AI_ADDRCONFIG. Which is also used in StreamServerPort(). So he won't be able to listen to any socket there either. Not being able to use AI_ADDRCONFIG is rather annoying, but I guess if we just try all the returned addresses until 1 works will have to do. Try the attached patch instead. Kurt
Index: ./src/backend/postmaster/pgstat.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/pgstat.c,v retrieving revision 1.37 diff -u -r1.37 pgstat.c --- ./src/backend/postmaster/pgstat.c 12 Jun 2003 07:36:51 -0000 1.37 +++ ./src/backend/postmaster/pgstat.c 6 Jul 2003 16:27:20 -0000 @@ -146,6 +146,7 @@ { ACCEPT_TYPE_ARG3 alen; struct addrinfo *addr, hints; + struct addrinfo *addrp; int ret; /* @@ -188,15 +189,38 @@ hints.ai_canonname = NULL; hints.ai_next = NULL; ret = getaddrinfo2("localhost", NULL, &hints, &addr); - if (ret || !addr) + + addrp = addr; + +#ifdef HAVE_UNIX_SOCKETS + /* Skip AF_UNIX sockets. */ + if (!ret) + { + while (addrp && addrp->ai_family == AF_UNIX) + { + addrp = addrp->ai_next; + } + } +#endif + + if (ret || !addrp) { elog(LOG, "PGSTAT: getaddrinfo2() failed: %s", gai_strerror(ret)); goto startup_failed; } + - if ((pgStatSock = socket(addr->ai_family, - addr->ai_socktype, addr->ai_protocol)) < 0) + for (; addrp; addrp = addrp->ai_next) + { + if ((pgStatSock = socket(addrp->ai_family, + addrp->ai_socktype, addrp->ai_protocol)) >= 0) + { + break; + } + } + + if (!addrp) { elog(LOG, "PGSTAT: socket() failed: %m"); goto startup_failed; @@ -206,7 +230,7 @@ * Bind it to a kernel assigned port on localhost and get the assigned * port via getsockname(). */ - if (bind(pgStatSock, addr->ai_addr, addr->ai_addrlen) < 0) + if (bind(pgStatSock, addrp->ai_addr, addrp->ai_addrlen) < 0) { elog(LOG, "PGSTAT: bind() failed: %m"); goto startup_failed; Index: ./src/backend/libpq/pqcomm.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/libpq/pqcomm.c,v retrieving revision 1.157 diff -u -r1.157 pqcomm.c --- ./src/backend/libpq/pqcomm.c 12 Jun 2003 07:36:51 -0000 1.157 +++ ./src/backend/libpq/pqcomm.c 6 Jul 2003 16:28:01 -0000 @@ -216,7 +216,7 @@ /* Initialize hint structure */ MemSet(&hint, 0, sizeof(hint)); hint.ai_family = family; - hint.ai_flags = AI_PASSIVE | AI_ADDRCONFIG; + hint.ai_flags = AI_PASSIVE; hint.ai_socktype = SOCK_STREAM; #ifdef HAVE_UNIX_SOCKETS
---------------------------(end of broadcast)--------------------------- TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]