Previously, if no host information had been specified at connection time,
PQhost() would return NULL (unless you are on Windows, in which case you
got "localhost"). This is an unhelpful definition for a couple of reasons:
it can cause corner-case crashes in applications (cf commit
c5ef8ce53d),
and there's no well-defined way for applications to find out the socket
directory path that's actually in use. As an example of the latter
problem, psql substituted DEFAULT_PGSOCKET_DIR for NULL in a couple of
places, but this is subtly wrong because it's conceivable that psql is
using a libpq shared library that was built with a different setting.
Hence, change PQhost() to return DEFAULT_PGSOCKET_DIR when appropriate,
and strip out the now-dead substitutions in psql. (There is still one
remaining reference to DEFAULT_PGSOCKET_DIR in psql, in prompt.c, which
I don't see a nice way to get rid of. But it only controls a prompt
abbreviation decision, so it seems noncritical.)
Also update the docs for PQhost, which had never previously mentioned
the possibility of a socket directory path being returned. In passing
fix the outright-incorrect code comment about PGconn.pgunixsocket.
<listitem>
<para>
Returns the server host name of the connection.
+ This can be a host name, an IP address, or a directory path if the
+ connection is via Unix socket. (The path case can be distinguished
+ because it will always be an absolute path, beginning
+ with <literal>/</>.)
<synopsis>
char *PQhost(const PGconn *conn);
</synopsis>
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)
/*
* Any change in the parameters read above makes us discard the password.
* We also discard it if we're to use a conninfo rather than the
- * positional syntax. Note that currently, PQhost() can return NULL for a
- * default Unix-socket connection, so we have to allow NULL for host.
+ * positional syntax.
*/
if (has_connection_string)
keep_password = false;
else
keep_password =
(user && PQuser(o_conn) && strcmp(user, PQuser(o_conn)) == 0) &&
- ((host && PQhost(o_conn) && strcmp(host, PQhost(o_conn)) == 0) ||
- (host == NULL && PQhost(o_conn) == NULL)) &&
+ (host && PQhost(o_conn) && strcmp(host, PQhost(o_conn)) == 0) &&
(port && PQport(o_conn) && strcmp(port, PQport(o_conn)) == 0);
/*
{
char *host = PQhost(pset.db);
- if (host == NULL)
- host = DEFAULT_PGSOCKET_DIR;
/* If the host is an absolute path, the connection is via socket */
if (is_absolute_path(host))
printf(_("You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"),
else
{
#ifdef HAVE_UNIX_SOCKETS
- return conn->pgunixsocket;
+ if (conn->pgunixsocket != NULL && conn->pgunixsocket[0] != '\0')
+ return conn->pgunixsocket;
+ else
+ return DEFAULT_PGSOCKET_DIR;
#else
return DefaultHost;
#endif
char *pghostaddr; /* the numeric IP address of the machine on
* which the server is running. Takes
* precedence over above. */
- char *pgport; /* the server's communication port */
- char *pgunixsocket; /* the Unix-domain socket that the server is
- * listening on; if NULL, uses a default
- * constructed from pgport */
+ char *pgport; /* the server's communication port number */
+ char *pgunixsocket; /* the directory of the server's Unix-domain
+ * socket; if NULL, use DEFAULT_PGSOCKET_DIR */
char *pgtty; /* tty on which the backend messages is
* displayed (OBSOLETE, NOT USED) */
char *connect_timeout; /* connection timeout (numeric string) */