On Tue, Nov 25, 2014 at 09:53:10PM +0900, Fujii Masao wrote:
> On Tue, Nov 25, 2014 at 12:37 PM, Noah Misch <[email protected]> wrote:
> > On Wed, Jan 22, 2014 at 11:48:26PM +0900, Fujii Masao wrote:
> >> (3) PQhost() cannot return the hostaddr.
> >
> >> We can fix the problem (3) by changing PQhost() so that it also
> >> returns the hostaddr. But this change might break the existing
> >> application using PQhost(). So, I added new libpq function PQhostaddr()
> >> which returns the hostaddr, and changed \conninfo so that it reports
> >> correct connection information by using both PQhost() and PQhostaddr().
> >
> >> + <varlistentry id="libpq-pqhostaddr">
> >> + <term>
> >> + <function>PQhostaddr</function>
> >> + <indexterm>
> >> + <primary>PQhostaddr</primary>
> >> + </indexterm>
> >> + </term>
> >> +
> >> + <listitem>
> >> + <para>
> >> + Returns the server numeric IP address or host name of the
> >> connection.
> >> + <synopsis>
> >> + char *PQhostaddr(const PGconn *conn);
> >> + </synopsis>
> >> + </para>
> >> + </listitem>
> >> + </varlistentry>
> >
> > From reading this documentation, I assumed this function would return a
> > non-empty value for every TCP connection. After all, every TCP connection
> > has
> > a peer IP address. In fact, PQhostaddr() returns the raw value of the
> > "hostaddr" connection parameter, whether from a libpq function argument or
> > from the PGHOSTADDR environment variable. (If the parameter and environment
> > variable are absent, it returns NULL. Adding "hostaddr=" to the connection
> > string makes it return the empty string.) A caller wanting the specific raw
> > value of a parameter could already use PQconninfo(). I suspect this new
> > function will confuse more than help. What do you think of reverting it and
> > having \conninfo use PQconninfo() to discover any "hostaddr" value?
>
> Sounds reasonable to me. Are you planning to implement and commit the patch?
Sure. I'll first issue "git revert 9f80f48", then apply the attached patch.
Since libpq ignores a hostaddr parameter equal to the empty string, this
implementation does likewise. Apart from that, I anticipate behavior
identical to today's code.
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index b518fb1..0c60746 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -302,13 +302,32 @@ 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
{
- if (host == NULL)
+ char *host;
+ PQconninfoOption *connOptions;
+ PQconninfoOption *option;
+
+ /* Report "hostaddr" if libpq used it, otherwise
PQhost(). */
+ host = PQhost(pset.db);
+ connOptions = PQconninfo(pset.db);
+ if (connOptions == NULL)
+ {
+ fprintf(stderr, _("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 (host == NULL) /* can't happen */
host = DEFAULT_PGSOCKET_DIR;
/* If the host is an absolute path, the connection is
via socket */
if (is_absolute_path(host))
@@ -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);
}
}
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers