> As I stated upthread, PQping("host='0.0.0.0'") is _not portable_. It works on > GNU/Linux, which I used for that demo. It fails on OpenBSD and Windows. > >> I'd be inclined to suggest fixing it like this: >> >> /* If postmaster is listening on "*", use localhost >> */ >> - if (strcmp(host_str, "*") == 0) >> + if (strcmp(host_str, "*") == 0 || >> + strcmp(host_str, "0.0.0.0") == 0 || >> + strcmp(host_str, "::") == 0) >> strcpy(host_str, "localhost"); >> >> which covers the cases we document as supported. > > On RHEL 5 and some other "active adult" systems, "localhost" does not reach a > listen_addresses='::' server. IPv6 is available, but "localhost" resolves to > 127.0.0.1 only. > > The latest systems resolve "localhost" to both 127.0.0.1 and ::1, in which > case PQping("host='localhost'") will attempt both addresses in an unspecified > order. Given a postmaster with listen_addresses='0.0.0.0', contacting ::1 > first will fail (fine) or reach a different postmaster (not fine). > > Kondo's design is correct.
So more proper fix looks like this? diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index dacdfef..23d5a3c 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -646,9 +646,11 @@ test_postmaster_connection(pgpid_t pm_pid, bool do_checkpoint) return PQPING_NO_ATTEMPT; } - /* If postmaster is listening on "*", use localhost */ - if (strcmp(host_str, "*") == 0) - strcpy(host_str, "localhost"); + /* If postmaster is listening on "*", "0.0.0.0" or "::", use 127.0.0.1 */ + if (strcmp(host_str, "*") == 0 || + strcmp(host_str, "0.0.0.0") == 0 || + strcmp(host_str, "::") == 0) + strcpy(host_str, "127.0.0.1"); /* * We need to set connect_timeout otherwise on Windows Best regards, -- Tatsuo Ishii SRA OSS, Inc. Japan English: http://www.sraoss.co.jp/index_en.php Japanese:http://www.sraoss.co.jp -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers