Thread: Fetching Server configured port from C Module

Fetching Server configured port from C Module

From
Mike Roest
Date:
Hi There,
   I'm having a bit of an issue finding a C function to fetch the configured server port from a C module.

We have written a C module to allow for remote clients to call a function to run pg_dump/pg_restore remotely but create files locally on the db server.  

Currently it works fine if the client connects through a network socket as we're using inet_server_port to get the port to pass onto pg_dump/restore.  But if the client is connected through a unix socket (actually a remote client connecting to pgbouncer which is connecting to postgres though the unix socket) inet_server_port is null.  I've looked for a function that we can use to get the configured server port but haven't had any luck.  

I could hard code the port in the module when we build it but it would be nice to be able to change the configured postgres port and not have to rebuild the module.

Anyone have any suggestions?

I've posted the code for our backup module here:


Re: Fetching Server configured port from C Module

From
Bruce Momjian
Date:
On Wed, Apr 17, 2013 at 01:08:18PM -0600, Mike Roest wrote:
> Hi There,
>    I'm having a bit of an issue finding a C function to fetch the configured
> server port from a C module.
>
> We have written a C module to allow for remote clients to call a function to
> run pg_dump/pg_restore remotely but create files locally on the db server.
>
> Currently it works fine if the client connects through a network socket as
> we're using inet_server_port to get the port to pass onto pg_dump/restore.  But
> if the client is connected through a unix socket (actually a remote client
> connecting to pgbouncer which is connecting to postgres though the unix socket)
> inet_server_port is null.  I've looked for a function that we can use to get
> the configured server port but haven't had any luck.
>
> I could hard code the port in the module when we build it but it would be nice
> to be able to change the configured postgres port and not have to rebuild the
> module.

Well, there are technically no _ports_ in unix-domain sockets.  However,
the TCP port number is used to construct the socket file;  I think you
can use the simple "port" server-side variable for this;  does this help
you?

    test=> SELECT setting FROM pg_settings WHERE name = 'port';
     setting
    ---------
     5432
    (1 row)

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +


Re: Fetching Server configured port from C Module

From
John R Pierce
Date:
On 4/17/2013 12:08 PM, Mike Roest wrote:
> I could hard code the port in the module when we build it but it would
> be nice to be able to change the configured postgres port and not have
> to rebuild the module.
>
> Anyone have any suggestions?


SHOW PORT;

?

works in 9.2, anyways.



--
john r pierce                                      37N 122W
somewhere on the middle of the left coast



Re: Fetching Server configured port from C Module

From
Mike Roest
Date:



SHOW PORT;
 test=> SELECT setting FROM pg_settings WHERE name = 'port';
         setting
        ---------
         5432
  
Both of these are from a query context.  This is in a C module, I suppose I could run a query but there has to be a direct C function to get this data. 

Re: Fetching Server configured port from C Module

From
Bruce Momjian
Date:
On Wed, Apr 17, 2013 at 01:32:00PM -0600, Mike Roest wrote:
>
>
>
>     SHOW PORT;
>
>  test=> SELECT setting FROM pg_settings WHERE name = 'port';
>          setting
>         ---------
>          5432
>
> Both of these are from a query context.  This is in a C module, I suppose I
> could run a query but there has to be a direct C function to get this data.

Well, you could look at how to access the PostPortNumber global
variable.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +


Re: Fetching Server configured port from C Module

From
Mike Roest
Date:
Perfect thanks Bruce that worked.

I just extern'd PostPortNumber in my module and everything seems to be working.

--Mike