<replaceable class="parameter">host</replaceable> or
<replaceable class="parameter">port</replaceable>
as <literal>-</literal> is equivalent to omitting that parameter.
+ If <literal>hostaddr</literal> was specified in the original
+ connection's <structname>conninfo</structname>, that address is reused
+ for the new connection (disregarding any other host specification).
</para>
<para>
return false;
}
+/* return whether the connection has 'hostaddr' in its conninfo */
+static bool
+has_hostaddr(PGconn *conn)
+{
+ bool used = false;
+ PQconninfoOption *ciopt = PQconninfo(conn);
+
+ for (PQconninfoOption *p = ciopt; p->keyword != NULL; p++)
+ {
+ if (strcmp(p->keyword, "hostaddr") == 0 && p->val != NULL)
+ {
+ used = true;
+ break;
+ }
+ }
+
+ PQconninfoFree(ciopt);
+ return used;
+}
+
/*
* do_connect -- handler for \connect
*
port = NULL;
}
- /* grab missing values from the old connection */
+ /*
+ * Grab missing values from the old connection. If we grab host (or host
+ * is the same as before) and hostaddr was set, grab that too.
+ */
if (reuse_previous)
{
if (!user)
user = PQuser(o_conn);
- if (host && strcmp(host, PQhost(o_conn)) == 0)
+ if (host && strcmp(host, PQhost(o_conn)) == 0 &&
+ has_hostaddr(o_conn))
{
- /*
- * if we are targeting the same host, reuse its hostaddr for
- * consistency
- */
hostaddr = PQhostaddr(o_conn);
}
if (!host)
{
host = PQhost(o_conn);
- /* also set hostaddr for consistency */
- hostaddr = PQhostaddr(o_conn);
+ if (has_hostaddr(o_conn))
+ hostaddr = PQhostaddr(o_conn);
}
if (!port)
port = PQport(o_conn);
char *host = PQhost(pset.db);
char *hostaddr = PQhostaddr(pset.db);
- /* If the host is an absolute path, the connection is via socket */
+ /*
+ * If the host is an absolute path, the connection is via socket
+ * unless overridden by hostaddr
+ */
if (is_absolute_path(host))
{
if (hostaddr && *hostaddr)
{
struct sockaddr_storage *addr = &conn->raddr.addr;
- if (conn->connhost[conn->whichhost].type == CHT_HOST_ADDRESS)
- strlcpy(host_addr, conn->connhost[conn->whichhost].hostaddr, host_addr_len);
- else if (addr->ss_family == AF_INET)
+ if (addr->ss_family == AF_INET)
{
if (inet_net_ntop(AF_INET,
&((struct sockaddr_in *) addr)->sin_addr.s_addr,
if (conn->connhost != NULL)
{
+ /*
+ * Return the verbatim host value provided by user, or hostaddr in its
+ * lack.
+ */
if (conn->connhost[conn->whichhost].host != NULL &&
conn->connhost[conn->whichhost].host[0] != '\0')
return conn->connhost[conn->whichhost].host;
if (!conn)
return NULL;
- if (conn->connhost != NULL)
- {
- if (conn->connhost[conn->whichhost].hostaddr != NULL &&
- conn->connhost[conn->whichhost].hostaddr[0] != '\0')
- return conn->connhost[conn->whichhost].hostaddr;
-
- if (conn->connip != NULL)
- return conn->connip;
- }
+ /* Return the parsed IP address */
+ if (conn->connhost != NULL && conn->connip != NULL)
+ return conn->connip;
return "";
}