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

Reply via email to