#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);
}
1.7.1