Reimplement 9f80f4835a55a1cbffcda5d23a617917f3286c14 with PQconninfo().
authorNoah Misch <noah@leadboat.com>
Sat, 29 Nov 2014 17:31:43 +0000 (12:31 -0500)
committerNoah Misch <noah@leadboat.com>
Sat, 29 Nov 2014 17:31:43 +0000 (12:31 -0500)
Apart from ignoring "hostaddr" set to the empty string, this behaves
identically to its predecessor.  Back-patch to 9.4, where the original
commit first appeared.

Reviewed by Fujii Masao.

src/bin/psql/command.c

index eb281a3dcbce50f251cd4184078f4c98b9105f92..c7a17d7469fc53d43d75618fdbc080b21bd006de 100644 (file)
@@ -302,14 +302,33 @@ exec_command(const char *cmd,
    else if (strcmp(cmd, "conninfo") == 0)
    {
        char       *db = PQdb(pset.db);
-       char       *host = PQhost(pset.db);
 
        if (db == NULL)
            printf(_("You are currently not connected to a database.\n"));
        else
        {
+           char       *host;
+           PQconninfoOption *connOptions;
+           PQconninfoOption *option;
+
+           host = PQhost(pset.db);
            if (host == NULL)
                host = DEFAULT_PGSOCKET_DIR;
+           /* A usable "hostaddr" overrides the basic sense of host. */
+           connOptions = PQconninfo(pset.db);
+           if (connOptions == NULL)
+           {
+               psql_error("out of memory\n");
+               exit(EXIT_FAILURE);
+           }
+           for (option = connOptions; option && option->keyword; option++)
+               if (strcmp(option->keyword, "hostaddr") == 0)
+               {
+                   if (option->val != NULL && option->val[0] != '\0')
+                       host = option->val;
+                   break;
+               }
+
            /* If the host is an absolute path, the connection is via socket */
            if (is_absolute_path(host))
                printf(_("You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"),
@@ -318,6 +337,8 @@ exec_command(const char *cmd,
                printf(_("You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"),
                       db, PQuser(pset.db), host, PQport(pset.db));
            printSSLInfo();
+
+           PQconninfoFree(connOptions);
        }
    }