Hi,
I've been looking through the mail archives in the
hope of finding a function to get the client IP address according to the
backend.
Found lots of requests but no actual answers or
examples.
I've trawled through the backend code and as a
result created a function to do the job.
I thought I would post it here (may be it should go
into hackers) so that others can find and use it as they wish.
regards
Donald Fraser.
Place the following into an appropriate file and
follow the c compiling rules as with contrib examples.
#include "postgres.h"
#include "miscadmin.h" #include "libpq/libpq.h" extern Datum
get_ip_address(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(get_ip_address); extern
Datum
get_ip_address(PG_FUNCTION_ARGS) { char remote_addr_s[NI_MAXHOST]; char remote_port[NI_MAXSERV]; text *ptext; getnameinfo_all(&(MyProcPort->raddr.addr),
MyProcPort->raddr.salen,
remote_addr_s, sizeof(remote_addr_s), remote_port, sizeof(remote_port), NI_NUMERICHOST | NI_NUMERICSERV); ptext = DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(&remote_addr_s[0]))); if (ptext == NULL) PG_RETURN_NULL(); PG_RETURN_TEXT_P(ptext); } |