On Tue, Jul 08, 2003 at 12:34:19PM +0900, Kenji Sugita wrote: > From: Kurt Roeckx <[EMAIL PROTECTED]> > Subject: Re: [HACKERS] PostgreSQL 7.4devel - LOG: PGSTAT: socket() failed: Invalid > argument > Date: Sun, 6 Jul 2003 18:44:35 +0200 > > ;;; On Sun, Jul 06, 2003 at 06:30:04PM +0200, Kurt Roeckx wrote: > ;;; > Try the attached patch instead. > ;;; > ;;; Oops, that one was a little broken. I change it. > ;;; > ;;; Try the attached one instead. > > I tried the newest one.
I did some investigation on a redhat 6.0. It seems getaddrinfo is really broken. It returns an AF_INET socket, but it doesn't say it should be of socket type SOCK_DGRAM. It also returns an AF_UNIX socket and for that it sets the socktype correct, but we don't want to use the AF_UNIX one. I'm going to assume that Mac Os X is broken in the same way. Here is a new patch. 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 8 Jul 2003 20:24:20 -0000 @@ -145,7 +145,7 @@ pgstat_init(void) { ACCEPT_TYPE_ARG3 alen; - struct addrinfo *addr, hints; + struct addrinfo *addrs, *addr, hints; int ret; /* @@ -187,16 +187,32 @@ hints.ai_addr = NULL; hints.ai_canonname = NULL; hints.ai_next = NULL; - ret = getaddrinfo2("localhost", NULL, &hints, &addr); - if (ret || !addr) + ret = getaddrinfo2("localhost", NULL, &hints, &addrs); + + if (ret || !addrs) { 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 (addr = addrs; addr; addr = addr->ai_next) + { +#ifdef HAVE_UNIX_SOCKETS + /* Skip AF_UNIX sockets. */ + if (addr->ai_family == AF_UNIX) + { + continue; + } +#endif + if ((pgStatSock = socket(addr->ai_family, + SOCK_DGRAM, 0)) >= 0) + { + break; + } + } + + if (!addr || pgStatSock < 0) { elog(LOG, "PGSTAT: socket() failed: %m"); goto startup_failed; @@ -211,8 +227,8 @@ elog(LOG, "PGSTAT: bind() failed: %m"); goto startup_failed; } - freeaddrinfo2(hints.ai_family, addr); - addr = NULL; + freeaddrinfo2(hints.ai_family, addrs); + addrs = NULL; alen = sizeof(pgStatAddr); if (getsockname(pgStatSock, (struct sockaddr *)&pgStatAddr, &alen) < 0) @@ -257,9 +273,9 @@ return; startup_failed: - if (addr) + if (addrs) { - freeaddrinfo2(hints.ai_family, addr); + freeaddrinfo2(hints.ai_family, addrs); } if (pgStatSock >= 0) 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 8 Jul 2003 20:24:35 -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 @@ -266,8 +266,7 @@ /* Nothing found. */ break; } - if ((fd = socket(addr->ai_family, addr->ai_socktype, - addr->ai_protocol)) < 0) + if ((fd = socket(addr->ai_family, SOCK_STREAM, 0)) < 0) { elog(LOG, "server socket failure: socket(): %s", strerror(errno));
---------------------------(end of broadcast)--------------------------- TIP 8: explain analyze is your friend