]> granicus.if.org Git - postgresql/commitdiff
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:34:14 +0000 (12:34 -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 58052876d6929daa3f89720d00611be75ec39a15..39bd3617b942f0d9acc011ecdefd11d80354839e 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);
                }
        }