Subject: issue with reading hostname

From: Atul Kumar <[email-masked]>
Date: Tue, 23 Apr 2024 01:43:58 +0530

Hi,

I have postgresql  version 15 running on centos7.

I have below query that reads hostname from /tmp directory:

psql postgres -A -t -p 5432 -h /tmp/ -c 'SELECT pg_is_in_recovery();'

so below are my questions:

1. Is the psql client reading the socket file that resides in the /tmp
directory to fetch the hostname ?

2. I saw the socket file in /tmp and it is empty. Then how is the psql
client still reading the socket file successfully for hostname ?

this is my socket looks ( the size is 0 as the file is empty):

srwxrwxrwx.  1 postgres postgres      0 Apr 22 12:47 .s.PGSQL.5432

Please help me clarify these doubts.

Regards.

---

From: Adrian Klaver <[email-masked]>
Date: Mon, 22 Apr 2024 13:25:51 -0700

> Please help me clarify these doubts.

https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS

"host

     Name of host to connect to. If a host name looks like an absolute 
path name, it specifies Unix-domain communication rather than TCP/IP 
communication; the value is the name of the directory in which the 
socket file is stored. (On Unix, an absolute path name begins with a 
slash. On Windows, paths starting with drive letters are also 
recognized.) If the host name starts with @, it is taken as a 
Unix-domain socket in the abstract namespace (currently supported on 
Linux and Windows). The default behavior when host is not specified, or 
is empty, is to connect to a Unix-domain socket in /tmp (or whatever 
socket directory was specified when PostgreSQL was built). On Windows, 
the default is to connect to localhost.

     A comma-separated list of host names is also accepted, in which 
case each host name in the list is tried in order; an empty item in the 
list selects the default behavior as explained above. See Section 
34.1.1.3 for details.
"

The simplistic explanation is that the socket is the "host".

-- 
Adrian Klaver
[email-masked]

---

From: Ron Johnson <[email-masked]>
Date: Mon, 22 Apr 2024 17:11:22 -0400

> psql postgres -A -t -p 5432 -h /tmp/ -c 'SELECT pg_is_in_recovery();'

If you installed from the PGDG repository (possibly also the CENTOS repos,
but I'm not sure), then the domain socket also lives in :
/var/run/postgresql

* I find that more expressive than /tmp.
* No need to specify the host when using sockets.
* Using a socket name makes parameterizing the hostname easier in scripts.

---

From: Atul Kumar <[email-masked]>
Date: Tue, 23 Apr 2024 03:07:32 +0530

Can we edit the socket to change the hostname in it ?

Regards.

---

From: Ron Johnson <[email-masked]>
Date: Mon, 22 Apr 2024 17:44:43 -0400

There's no hostname in a socket directory.

Do you mean :"change the socket name from /tmp or /var/run/postgresql to
something else?"

If so, then
https://www.postgresql.org/docs/16/runtime-config-connection.html mentions
sockets.

On Mon, Apr 22, 2024 at 5:37 PM Atul Kumar <[email-masked]> wrote:

>> If you installed from the PGDG repository (possibly also the CENTOS
>> repos, but I'm not sure), then the domain socket also lives in :
>> /var/run/postgresql
>>

---

From: "David G. Johnston" <[email-masked]>
Date: Mon, 22 Apr 2024 14:54:57 -0700

> client still reading the socket file successfully for hostname ?
Unix sockets are not a PostgreSQL-specific thing, they are an OS thing.
You should be able to find information on them if you search but it isn't
something our documentation is on the hook to teach.

But, in many ways, it is just a file name (Unix philosophy, everything is a
file) that programs can hook their standard input and standard output up to
such that the standard output sent by one process is directed to the
standard input of the other process.  All on the fly, nothing gets
persisted into the physical file.  It's a tin-can-and-string solution to
interprocess communication.

David J.