diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-07-23 23:30:41 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-07-23 23:30:41 +0000 |
commit | df63503dc2fbe59292a65c685479bf1a439b9b4d (patch) | |
tree | 4f1b242db11a03e2f2ed78092e90f72f416dcd49 /src/backend/postmaster/pgstat.c | |
parent | 93395de092fbec103b2949ba46c2642ef875405c (diff) |
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/backend/postmaster/pgstat.c')
-rw-r--r-- | src/backend/postmaster/pgstat.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 5ed1247e951..f8882737eee 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -13,7 +13,7 @@ * * Copyright (c) 2001-2003, PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.39 2003/07/22 19:13:19 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.40 2003/07/23 23:30:40 tgl Exp $ * ---------- */ #include "postgres.h" @@ -147,7 +147,7 @@ void pgstat_init(void) { ACCEPT_TYPE_ARG3 alen; - struct addrinfo *addr = NULL, hints; + struct addrinfo *addrs = NULL, *addr, hints; int ret; /* @@ -189,17 +189,27 @@ pgstat_init(void) hints.ai_addr = NULL; hints.ai_canonname = NULL; hints.ai_next = NULL; - ret = getaddrinfo2("localhost", NULL, &hints, &addr); - if (ret || !addr) + ret = getaddrinfo_all("localhost", NULL, &hints, &addrs); + if (ret || !addrs) { ereport(LOG, - (errmsg("getaddrinfo2(\"localhost\") failed: %s", + (errmsg("could not resolve \"localhost\": %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 + /* Ignore AF_UNIX sockets, if any are returned. */ + if (addr->ai_family == AF_UNIX) + continue; +#endif + if ((pgStatSock = socket(addr->ai_family, SOCK_DGRAM, 0)) >= 0) + break; + } + + if (!addr || pgStatSock < 0) { ereport(LOG, (errcode_for_socket_access(), @@ -218,8 +228,9 @@ pgstat_init(void) errmsg("could not bind socket for statistics: %m"))); goto startup_failed; } - freeaddrinfo2(hints.ai_family, addr); - addr = NULL; + + freeaddrinfo_all(hints.ai_family, addrs); + addrs = NULL; alen = sizeof(pgStatAddr); if (getsockname(pgStatSock, (struct sockaddr *)&pgStatAddr, &alen) < 0) @@ -272,8 +283,8 @@ pgstat_init(void) return; startup_failed: - if (addr) - freeaddrinfo2(hints.ai_family, addr); + if (addrs) + freeaddrinfo_all(hints.ai_family, addrs); if (pgStatSock >= 0) closesocket(pgStatSock); |