#include "c.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/file.h>
#include "libpq/ip.h"
Go to the source code of this file.
Functions | |
static int | range_sockaddr_AF_INET (const struct sockaddr_in *addr, const struct sockaddr_in *netaddr, const struct sockaddr_in *netmask) |
int | pg_getaddrinfo_all (const char *hostname, const char *servname, const struct addrinfo *hintp, struct addrinfo **result) |
void | pg_freeaddrinfo_all (int hint_ai_family, struct addrinfo *ai) |
int | pg_getnameinfo_all (const struct sockaddr_storage *addr, int salen, char *node, int nodelen, char *service, int servicelen, int flags) |
int | pg_range_sockaddr (const struct sockaddr_storage *addr, const struct sockaddr_storage *netaddr, const struct sockaddr_storage *netmask) |
int | pg_sockaddr_cidr_mask (struct sockaddr_storage *mask, char *numbits, int family) |
static void | run_ifaddr_callback (PgIfAddrCallback callback, void *cb_data, struct sockaddr *addr, struct sockaddr *mask) |
int | pg_foreach_ifaddr (PgIfAddrCallback callback, void *cb_data) |
int pg_foreach_ifaddr | ( | PgIfAddrCallback | callback, | |
void * | cb_data | |||
) |
Definition at line 857 of file ip.c.
References pg_sockaddr_cidr_mask(), and run_ifaddr_callback().
Referenced by check_same_host_or_net(), and main().
{ struct sockaddr_in addr; struct sockaddr_storage mask; #ifdef HAVE_IPV6 struct sockaddr_in6 addr6; #endif /* addr 127.0.0.1/8 */ memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = ntohl(0x7f000001); memset(&mask, 0, sizeof(mask)); pg_sockaddr_cidr_mask(&mask, "8", AF_INET); run_ifaddr_callback(callback, cb_data, (struct sockaddr *) & addr, (struct sockaddr *) & mask); #ifdef HAVE_IPV6 /* addr ::1/128 */ memset(&addr6, 0, sizeof(addr6)); addr6.sin6_family = AF_INET6; addr6.sin6_addr.s6_addr[15] = 1; memset(&mask, 0, sizeof(mask)); pg_sockaddr_cidr_mask(&mask, "128", AF_INET6); run_ifaddr_callback(callback, cb_data, (struct sockaddr *) & addr6, (struct sockaddr *) & mask); #endif return 0; }
void pg_freeaddrinfo_all | ( | int | hint_ai_family, | |
struct addrinfo * | ai | |||
) |
Definition at line 95 of file ip.c.
References addrinfo::ai_addr, addrinfo::ai_next, free, freeaddrinfo, and NULL.
Referenced by CheckRADIUSAuth(), closePGconn(), connectDBStart(), ident_inet(), parse_hba_auth_opt(), parse_hba_line(), pgstat_init(), PQconnectPoll(), and StreamServerPort().
{ #ifdef HAVE_UNIX_SOCKETS if (hint_ai_family == AF_UNIX) { /* struct was built by getaddrinfo_unix (see pg_getaddrinfo_all) */ while (ai != NULL) { struct addrinfo *p = ai; ai = ai->ai_next; free(p->ai_addr); free(p); } } else #endif /* HAVE_UNIX_SOCKETS */ { /* struct was built by getaddrinfo() */ if (ai != NULL) freeaddrinfo(ai); } }
int pg_getaddrinfo_all | ( | const char * | hostname, | |
const char * | servname, | |||
const struct addrinfo * | hintp, | |||
struct addrinfo ** | result | |||
) |
Definition at line 64 of file ip.c.
References addrinfo::ai_family, getaddrinfo, and NULL.
Referenced by CheckRADIUSAuth(), connectDBStart(), ident_inet(), parse_hba_auth_opt(), parse_hba_line(), pgstat_init(), and StreamServerPort().
{ int rc; /* not all versions of getaddrinfo() zero *result on failure */ *result = NULL; #ifdef HAVE_UNIX_SOCKETS if (hintp->ai_family == AF_UNIX) return getaddrinfo_unix(servname, hintp, result); #endif /* NULL has special meaning to getaddrinfo(). */ rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname, servname, hintp, result); return rc; }
int pg_getnameinfo_all | ( | const struct sockaddr_storage * | addr, | |
int | salen, | |||
char * | node, | |||
int | nodelen, | |||
char * | service, | |||
int | servicelen, | |||
int | flags | |||
) |
Definition at line 129 of file ip.c.
References getnameinfo, and strlcpy().
Referenced by BackendInitialize(), check_hostname(), ClientAuthentication(), connectFailureMessage(), ident_inet(), inet_client_addr(), inet_client_port(), inet_server_addr(), inet_server_port(), pg_stat_get_activity(), pg_stat_get_backend_client_addr(), and pg_stat_get_backend_client_port().
{ int rc; #ifdef HAVE_UNIX_SOCKETS if (addr && addr->ss_family == AF_UNIX) rc = getnameinfo_unix((const struct sockaddr_un *) addr, salen, node, nodelen, service, servicelen, flags); else #endif rc = getnameinfo((const struct sockaddr *) addr, salen, node, nodelen, service, servicelen, flags); if (rc != 0) { if (node) strlcpy(node, "???", nodelen); if (service) strlcpy(service, "???", servicelen); } return rc; }
int pg_range_sockaddr | ( | const struct sockaddr_storage * | addr, | |
const struct sockaddr_storage * | netaddr, | |||
const struct sockaddr_storage * | netmask | |||
) |
Definition at line 276 of file ip.c.
References range_sockaddr_AF_INET().
Referenced by check_ip().
{ if (addr->ss_family == AF_INET) return range_sockaddr_AF_INET((const struct sockaddr_in *) addr, (const struct sockaddr_in *) netaddr, (const struct sockaddr_in *) netmask); #ifdef HAVE_IPV6 else if (addr->ss_family == AF_INET6) return range_sockaddr_AF_INET6((const struct sockaddr_in6 *) addr, (const struct sockaddr_in6 *) netaddr, (const struct sockaddr_in6 *) netmask); #endif else return 0; }
int pg_sockaddr_cidr_mask | ( | struct sockaddr_storage * | mask, | |
char * | numbits, | |||
int | family | |||
) |
Definition at line 338 of file ip.c.
References NULL.
Referenced by check_network_callback(), parse_hba_line(), pg_foreach_ifaddr(), and run_ifaddr_callback().
{ long bits; char *endptr; if (numbits == NULL) { bits = (family == AF_INET) ? 32 : 128; } else { bits = strtol(numbits, &endptr, 10); if (*numbits == '\0' || *endptr != '\0') return -1; } switch (family) { case AF_INET: { struct sockaddr_in mask4; long maskl; if (bits < 0 || bits > 32) return -1; memset(&mask4, 0, sizeof(mask4)); /* avoid "x << 32", which is not portable */ if (bits > 0) maskl = (0xffffffffUL << (32 - (int) bits)) & 0xffffffffUL; else maskl = 0; mask4.sin_addr.s_addr = htonl(maskl); memcpy(mask, &mask4, sizeof(mask4)); break; } #ifdef HAVE_IPV6 case AF_INET6: { struct sockaddr_in6 mask6; int i; if (bits < 0 || bits > 128) return -1; memset(&mask6, 0, sizeof(mask6)); for (i = 0; i < 16; i++) { if (bits <= 0) mask6.sin6_addr.s6_addr[i] = 0; else if (bits >= 8) mask6.sin6_addr.s6_addr[i] = 0xff; else { mask6.sin6_addr.s6_addr[i] = (0xff << (8 - (int) bits)) & 0xff; } bits -= 8; } memcpy(mask, &mask6, sizeof(mask6)); break; } #endif default: return -1; } mask->ss_family = family; return 0; }
static int range_sockaddr_AF_INET | ( | const struct sockaddr_in * | addr, | |
const struct sockaddr_in * | netaddr, | |||
const struct sockaddr_in * | netmask | |||
) | [static] |
Definition at line 295 of file ip.c.
Referenced by pg_range_sockaddr().
{ if (((addr->sin_addr.s_addr ^ netaddr->sin_addr.s_addr) & netmask->sin_addr.s_addr) == 0) return 1; else return 0; }
static void run_ifaddr_callback | ( | PgIfAddrCallback | callback, | |
void * | cb_data, | |||
struct sockaddr * | addr, | |||
struct sockaddr * | mask | |||
) | [static] |
Definition at line 488 of file ip.c.
References NULL, and pg_sockaddr_cidr_mask().
Referenced by pg_foreach_ifaddr().
{ struct sockaddr_storage fullmask; if (!addr) return; /* Check that the mask is valid */ if (mask) { if (mask->sa_family != addr->sa_family) { mask = NULL; } else if (mask->sa_family == AF_INET) { if (((struct sockaddr_in *) mask)->sin_addr.s_addr == INADDR_ANY) mask = NULL; } #ifdef HAVE_IPV6 else if (mask->sa_family == AF_INET6) { if (IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *) mask)->sin6_addr)) mask = NULL; } #endif } /* If mask is invalid, generate our own fully-set mask */ if (!mask) { pg_sockaddr_cidr_mask(&fullmask, NULL, addr->sa_family); mask = (struct sockaddr *) & fullmask; } (*callback) (addr, mask, cb_data); }