From ba0f9ff3bac5205687f172d9e9a846b42ce34d3d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 13 Jun 2004 19:56:52 +0000 Subject: [PATCH] Code review for recently-added network functions. Get it to work when log_hostname is enabled, clean up documentation. --- doc/src/sgml/func.sgml | 48 +++++--- src/backend/utils/adt/network.c | 249 +++++++++++++++++++++++----------------- src/include/catalog/pg_proc.h | 20 ++-- src/include/utils/builtins.h | 10 +- 4 files changed, 192 insertions(+), 135 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index a5d81b6fdd..ecf344453f 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1,5 +1,5 @@ @@ -6609,25 +6609,25 @@ SELECT NULLIF(value, '(none)') ... - inet_client_addr + inet_client_addr() inet address of the remote connection - inet_client_port + inet_client_port() int4 port of the remote connection - inet_server_addr + inet_server_addr() inet address of the local connection - inet_server_port + inet_server_port() int4 port of the local connection @@ -6688,17 +6688,6 @@ SELECT NULLIF(value, '(none)') ... - inet_client_addr and - inet_server_addr return the IPv4 or IPv6 (if - configured) address of the remote or local host connecting to the - database, respectively. inet_client_port - and inet_server_port return the port number - of the remote or local host connecting to the database, - respectively. If the connection is not a network connection, - these functions will return NULL. - - - current_schema returns the name of the schema that is at the front of the search path (or a null value if the search path is empty). This is the schema that will be used for any tables or @@ -6719,6 +6708,33 @@ SET search_path TO schema , schema, .. + inet_client_addr + + + + inet_client_port + + + + inet_server_addr + + + + inet_server_port + + + + inet_client_addr returns the IP address of the + current client, and inet_client_port returns the + port number. + inet_server_addr returns the IP address on which + the server accepted the current connection, and + inet_server_port returns the port number. + All these functions return NULL if the connection is via a Unix-domain + socket. + + + version diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c index 49e2694261..32ebc66fd0 100644 --- a/src/backend/utils/adt/network.c +++ b/src/backend/utils/adt/network.c @@ -1,7 +1,7 @@ /* * PostgreSQL type definitions for the INET and CIDR types. * - * $PostgreSQL: pgsql/src/backend/utils/adt/network.c,v 1.50 2004/05/26 18:35:38 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/network.c,v 1.51 2004/06/13 19:56:50 tgl Exp $ * * Jon Postel RIP 16 Oct 1998 */ @@ -133,109 +133,6 @@ cidr_in(PG_FUNCTION_ARGS) PG_RETURN_INET_P(network_in(src, 1)); } -/* INET that the client is connecting from */ -Datum -inet_client_addr(PG_FUNCTION_ARGS) -{ - Port *port = MyProcPort; - - if (port == NULL) - PG_RETURN_NULL(); - - switch (port->raddr.addr.ss_family) { - case AF_INET: -#ifdef HAVE_IPV6 - case AF_INET6: -#endif - break; - default: - PG_RETURN_NULL(); - } - - PG_RETURN_INET_P(network_in(port->remote_host, 0)); -} - - -/* port that the client is connecting from */ -Datum -inet_client_port(PG_FUNCTION_ARGS) -{ - Port *port = MyProcPort; - - if (port == NULL) - PG_RETURN_NULL(); - - PG_RETURN_INT32(DirectFunctionCall1(int4in, CStringGetDatum(port->remote_port))); -} - - -/* server INET that the client connected to */ -Datum -inet_server_addr(PG_FUNCTION_ARGS) -{ - Port *port = MyProcPort; - char local_host[NI_MAXHOST]; - int ret; - - if (port == NULL) - PG_RETURN_NULL(); - - switch (port->laddr.addr.ss_family) { - case AF_INET: -#ifdef HAVE_IPV6 - case AF_INET6: -#endif - break; - default: - PG_RETURN_NULL(); - } - - local_host[0] = '\0'; - - ret = getnameinfo_all(&port->laddr.addr, port->laddr.salen, - local_host, sizeof(local_host), - NULL, 0, - NI_NUMERICHOST | NI_NUMERICSERV); - if (ret) - PG_RETURN_NULL(); - - PG_RETURN_INET_P(network_in(local_host, 0)); -} - - -/* port that the server accepted the connection on */ -Datum -inet_server_port(PG_FUNCTION_ARGS) -{ - Port *port = MyProcPort; - char local_port[NI_MAXSERV]; - int ret; - - if (port == NULL) - PG_RETURN_NULL(); - - switch (port->laddr.addr.ss_family) { - case AF_INET: -#ifdef HAVE_IPV6 - case AF_INET6: -#endif - break; - default: - PG_RETURN_NULL(); - } - - local_port[0] = '\0'; - - ret = getnameinfo_all(&port->laddr.addr, port->laddr.salen, - NULL, 0, - local_port, sizeof(local_port), - NI_NUMERICHOST | NI_NUMERICSERV); - if (ret) - PG_RETURN_NULL(); - - PG_RETURN_INT32(DirectFunctionCall1(int4in, CStringGetDatum(local_port))); -} - /* * INET address output function. @@ -1069,3 +966,147 @@ network_scan_last(Datum in) DirectFunctionCall1(network_broadcast, in), Int32GetDatum(-1)); } + + +/* + * IP address that the client is connecting from (NULL if Unix socket) + */ +Datum +inet_client_addr(PG_FUNCTION_ARGS) +{ + Port *port = MyProcPort; + char remote_host[NI_MAXHOST]; + int ret; + + if (port == NULL) + PG_RETURN_NULL(); + + switch (port->raddr.addr.ss_family) { + case AF_INET: +#ifdef HAVE_IPV6 + case AF_INET6: +#endif + break; + default: + PG_RETURN_NULL(); + } + + remote_host[0] = '\0'; + + ret = getnameinfo_all(&port->raddr.addr, port->raddr.salen, + remote_host, sizeof(remote_host), + NULL, 0, + NI_NUMERICHOST | NI_NUMERICSERV); + if (ret) + PG_RETURN_NULL(); + + PG_RETURN_INET_P(network_in(remote_host, 0)); +} + + +/* + * port that the client is connecting from (NULL if Unix socket) + */ +Datum +inet_client_port(PG_FUNCTION_ARGS) +{ + Port *port = MyProcPort; + char remote_port[NI_MAXSERV]; + int ret; + + if (port == NULL) + PG_RETURN_NULL(); + + switch (port->raddr.addr.ss_family) { + case AF_INET: +#ifdef HAVE_IPV6 + case AF_INET6: +#endif + break; + default: + PG_RETURN_NULL(); + } + + remote_port[0] = '\0'; + + ret = getnameinfo_all(&port->raddr.addr, port->raddr.salen, + NULL, 0, + remote_port, sizeof(remote_port), + NI_NUMERICHOST | NI_NUMERICSERV); + if (ret) + PG_RETURN_NULL(); + + PG_RETURN_DATUM(DirectFunctionCall1(int4in, CStringGetDatum(remote_port))); +} + + +/* + * IP address that the server accepted the connection on (NULL if Unix socket) + */ +Datum +inet_server_addr(PG_FUNCTION_ARGS) +{ + Port *port = MyProcPort; + char local_host[NI_MAXHOST]; + int ret; + + if (port == NULL) + PG_RETURN_NULL(); + + switch (port->laddr.addr.ss_family) { + case AF_INET: +#ifdef HAVE_IPV6 + case AF_INET6: +#endif + break; + default: + PG_RETURN_NULL(); + } + + local_host[0] = '\0'; + + ret = getnameinfo_all(&port->laddr.addr, port->laddr.salen, + local_host, sizeof(local_host), + NULL, 0, + NI_NUMERICHOST | NI_NUMERICSERV); + if (ret) + PG_RETURN_NULL(); + + PG_RETURN_INET_P(network_in(local_host, 0)); +} + + +/* + * port that the server accepted the connection on (NULL if Unix socket) + */ +Datum +inet_server_port(PG_FUNCTION_ARGS) +{ + Port *port = MyProcPort; + char local_port[NI_MAXSERV]; + int ret; + + if (port == NULL) + PG_RETURN_NULL(); + + switch (port->laddr.addr.ss_family) { + case AF_INET: +#ifdef HAVE_IPV6 + case AF_INET6: +#endif + break; + default: + PG_RETURN_NULL(); + } + + local_port[0] = '\0'; + + ret = getnameinfo_all(&port->laddr.addr, port->laddr.salen, + NULL, 0, + local_port, sizeof(local_port), + NI_NUMERICHOST | NI_NUMERICSERV); + if (ret) + PG_RETURN_NULL(); + + PG_RETURN_DATUM(DirectFunctionCall1(int4in, CStringGetDatum(local_port))); +} diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index f59528d9f4..d2bc1e1893 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.335 2004/06/06 19:07:00 tgl Exp $ + * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.336 2004/06/13 19:56:51 tgl Exp $ * * NOTES * The script catalog/genbki.sh reads this file and generates .bki @@ -2346,15 +2346,6 @@ DESCR("I/O"); DATA(insert OID = 911 ( inet_out PGNSP PGUID 12 f f t f i 1 2275 "869" _null_ inet_out - _null_ )); DESCR("I/O"); -DATA(insert OID = 2196 ( inet_client_addr PGNSP PGUID 12 f f f f s 0 869 "" _null_ inet_client_addr - _null_ )); -DESCR("Returns the INET address of the client connected to the backend"); -DATA(insert OID = 2197 ( inet_client_port PGNSP PGUID 12 f f f f s 0 23 "" _null_ inet_client_port - _null_ )); -DESCR("Returns the client's port number for this connection"); -DATA(insert OID = 2198 ( inet_server_addr PGNSP PGUID 12 f f f f s 0 869 "" _null_ inet_server_addr - _null_ )); -DESCR("Returns the INET address that the backend is using to service the connection"); -DATA(insert OID = 2199 ( inet_server_port PGNSP PGUID 12 f f f f s 0 23 "" _null_ inet_server_port - _null_ )); -DESCR("Returns the servers's port number for this connection"); - /* for cidr type support */ DATA(insert OID = 1267 ( cidr_in PGNSP PGUID 12 f f t f i 1 650 "2275" _null_ cidr_in - _null_ )); DESCR("I/O"); @@ -2411,6 +2402,15 @@ DESCR("text to cidr"); DATA(insert OID = 1715 ( set_masklen PGNSP PGUID 12 f f t f i 2 869 "869 23" _null_ inet_set_masklen - _null_ )); DESCR("change the netmask of an inet"); +DATA(insert OID = 2196 ( inet_client_addr PGNSP PGUID 12 f f f f s 0 869 "" _null_ inet_client_addr - _null_ )); +DESCR("INET address of the client"); +DATA(insert OID = 2197 ( inet_client_port PGNSP PGUID 12 f f f f s 0 23 "" _null_ inet_client_port - _null_ )); +DESCR("client's port number for this connection"); +DATA(insert OID = 2198 ( inet_server_addr PGNSP PGUID 12 f f f f s 0 869 "" _null_ inet_server_addr - _null_ )); +DESCR("INET address of the server"); +DATA(insert OID = 2199 ( inet_server_port PGNSP PGUID 12 f f f f s 0 23 "" _null_ inet_server_port - _null_ )); +DESCR("server's port number for this connection"); + DATA(insert OID = 1686 ( numeric PGNSP PGUID 12 f f t f i 1 1700 "25" _null_ text_numeric - _null_ )); DESCR("(internal)"); DATA(insert OID = 1688 ( text PGNSP PGUID 12 f f t f i 1 25 "1700" _null_ numeric_text - _null_ )); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 1fc26e69a1..6516c81d52 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.241 2004/06/02 21:29:29 momjian Exp $ + * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.242 2004/06/13 19:56:52 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -649,10 +649,6 @@ extern int inet_net_pton(int af, const char *src, void *dst, size_t size); /* network.c */ -extern Datum inet_client_addr(PG_FUNCTION_ARGS); -extern Datum inet_client_port(PG_FUNCTION_ARGS); -extern Datum inet_server_addr(PG_FUNCTION_ARGS); -extern Datum inet_server_port(PG_FUNCTION_ARGS); extern Datum inet_in(PG_FUNCTION_ARGS); extern Datum inet_out(PG_FUNCTION_ARGS); extern Datum inet_recv(PG_FUNCTION_ARGS); @@ -687,6 +683,10 @@ extern Datum text_inet(PG_FUNCTION_ARGS); extern Datum inet_set_masklen(PG_FUNCTION_ARGS); extern Datum network_scan_first(Datum in); extern Datum network_scan_last(Datum in); +extern Datum inet_client_addr(PG_FUNCTION_ARGS); +extern Datum inet_client_port(PG_FUNCTION_ARGS); +extern Datum inet_server_addr(PG_FUNCTION_ARGS); +extern Datum inet_server_port(PG_FUNCTION_ARGS); /* mac.c */ extern Datum macaddr_in(PG_FUNCTION_ARGS); -- 2.11.0