diff --git a/contrib/passwordcheck/passwordcheck.c b/contrib/passwordcheck/passwordcheck.c index b4c1ce005b..a0db89bbbf 100644 --- a/contrib/passwordcheck/passwordcheck.c +++ b/contrib/passwordcheck/passwordcheck.c @@ -21,8 +21,8 @@ #endif #include "commands/user.h" +#include "common/md5.h" #include "fmgr.h" -#include "libpq/md5.h" PG_MODULE_MAGIC; diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index b6ea95061d..821dce3ce7 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -29,7 +29,7 @@ #include "commands/dbcommands.h" #include "commands/seclabel.h" #include "commands/user.h" -#include "libpq/md5.h" +#include "common/md5.h" #include "miscadmin.h" #include "storage/lmgr.h" #include "utils/acl.h" diff --git a/src/backend/libpq/Makefile b/src/backend/libpq/Makefile index 09410c4bb1..1bdd8adde2 100644 --- a/src/backend/libpq/Makefile +++ b/src/backend/libpq/Makefile @@ -14,7 +14,7 @@ include $(top_builddir)/src/Makefile.global # be-fsstubs is here for historical reasons, probably belongs elsewhere -OBJS = be-fsstubs.o be-secure.o auth.o crypt.o hba.o ip.o md5.o pqcomm.o \ +OBJS = be-fsstubs.o be-secure.o auth.o crypt.o hba.o ifaddr.o pqcomm.o \ pqformat.o pqmq.o pqsignal.o ifeq ($(with_openssl),yes) diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index fc8b99b444..d907e6bc91 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -21,12 +21,12 @@ #include #include +#include "common/ip.h" +#include "common/md5.h" #include "libpq/auth.h" #include "libpq/crypt.h" -#include "libpq/ip.h" #include "libpq/libpq.h" #include "libpq/pqformat.h" -#include "libpq/md5.h" #include "miscadmin.h" #include "replication/walsender.h" #include "storage/ipc.h" diff --git a/src/backend/libpq/crypt.c b/src/backend/libpq/crypt.c index d79f5a2496..d84a180330 100644 --- a/src/backend/libpq/crypt.c +++ b/src/backend/libpq/crypt.c @@ -21,8 +21,8 @@ #endif #include "catalog/pg_authid.h" +#include "common/md5.h" #include "libpq/crypt.h" -#include "libpq/md5.h" #include "miscadmin.h" #include "utils/builtins.h" #include "utils/syscache.h" diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index d612c11159..f1e9a38c92 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -26,7 +26,8 @@ #include #include "catalog/pg_collation.h" -#include "libpq/ip.h" +#include "common/ip.h" +#include "libpq/ifaddr.h" #include "libpq/libpq.h" #include "postmaster/postmaster.h" #include "regex/regex.h" diff --git a/src/backend/libpq/ip.c b/src/backend/libpq/ifaddr.c similarity index 72% rename from src/backend/libpq/ip.c rename to src/backend/libpq/ifaddr.c index 9591ed2862..8f7fa2015d 100644 --- a/src/backend/libpq/ip.c +++ b/src/backend/libpq/ifaddr.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * - * ip.c - * IPv6-aware network access. + * ifaddr.c + * IP netmask calculations, and enumerating network interfaces. * * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * src/backend/libpq/ip.c + * src/backend/libpq/ifaddr.c * * This file and the IPV6 implementation were initially provided by * Nigel Kukard , Linux Based Systems Design @@ -17,8 +17,7 @@ *------------------------------------------------------------------------- */ -/* This is intended to be used in both frontend and backend, so use c.h */ -#include "c.h" +#include "postgres.h" #include #include @@ -32,8 +31,7 @@ #include #include -#include "libpq/ip.h" - +#include "libpq/ifaddr.h" static int range_sockaddr_AF_INET(const struct sockaddr_in * addr, const struct sockaddr_in * netaddr, @@ -45,226 +43,6 @@ static int range_sockaddr_AF_INET6(const struct sockaddr_in6 * addr, const struct sockaddr_in6 * netmask); #endif -#ifdef HAVE_UNIX_SOCKETS -static int getaddrinfo_unix(const char *path, - const struct addrinfo * hintsp, - struct addrinfo ** result); - -static int getnameinfo_unix(const struct sockaddr_un * sa, int salen, - char *node, int nodelen, - char *service, int servicelen, - int flags); -#endif - - -/* - * pg_getaddrinfo_all - get address info for Unix, IPv4 and IPv6 sockets - */ -int -pg_getaddrinfo_all(const char *hostname, const char *servname, - const struct addrinfo * hintp, struct addrinfo ** result) -{ - 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; -} - - -/* - * pg_freeaddrinfo_all - free addrinfo structures for IPv4, IPv6, or Unix - * - * Note: the ai_family field of the original hint structure must be passed - * so that we can tell whether the addrinfo struct was built by the system's - * getaddrinfo() routine or our own getaddrinfo_unix() routine. Some versions - * of getaddrinfo() might be willing to return AF_UNIX addresses, so it's - * not safe to look at ai_family in the addrinfo itself. - */ -void -pg_freeaddrinfo_all(int hint_ai_family, struct addrinfo * ai) -{ -#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); - } -} - - -/* - * pg_getnameinfo_all - get name info for Unix, IPv4 and IPv6 sockets - * - * The API of this routine differs from the standard getnameinfo() definition - * in two ways: first, the addr parameter is declared as sockaddr_storage - * rather than struct sockaddr, and second, the node and service fields are - * guaranteed to be filled with something even on failure return. - */ -int -pg_getnameinfo_all(const struct sockaddr_storage * addr, int salen, - char *node, int nodelen, - char *service, int servicelen, - int flags) -{ - 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; -} - - -#if defined(HAVE_UNIX_SOCKETS) - -/* ------- - * getaddrinfo_unix - get unix socket info using IPv6-compatible API - * - * Bugs: only one addrinfo is set even though hintsp is NULL or - * ai_socktype is 0 - * AI_CANONNAME is not supported. - * ------- - */ -static int -getaddrinfo_unix(const char *path, const struct addrinfo * hintsp, - struct addrinfo ** result) -{ - struct addrinfo hints; - struct addrinfo *aip; - struct sockaddr_un *unp; - - *result = NULL; - - MemSet(&hints, 0, sizeof(hints)); - - if (strlen(path) >= sizeof(unp->sun_path)) - return EAI_FAIL; - - if (hintsp == NULL) - { - hints.ai_family = AF_UNIX; - hints.ai_socktype = SOCK_STREAM; - } - else - memcpy(&hints, hintsp, sizeof(hints)); - - if (hints.ai_socktype == 0) - hints.ai_socktype = SOCK_STREAM; - - if (hints.ai_family != AF_UNIX) - { - /* shouldn't have been called */ - return EAI_FAIL; - } - - aip = calloc(1, sizeof(struct addrinfo)); - if (aip == NULL) - return EAI_MEMORY; - - unp = calloc(1, sizeof(struct sockaddr_un)); - if (unp == NULL) - { - free(aip); - return EAI_MEMORY; - } - - aip->ai_family = AF_UNIX; - aip->ai_socktype = hints.ai_socktype; - aip->ai_protocol = hints.ai_protocol; - aip->ai_next = NULL; - aip->ai_canonname = NULL; - *result = aip; - - unp->sun_family = AF_UNIX; - aip->ai_addr = (struct sockaddr *) unp; - aip->ai_addrlen = sizeof(struct sockaddr_un); - - strcpy(unp->sun_path, path); - -#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN - unp->sun_len = sizeof(struct sockaddr_un); -#endif - - return 0; -} - -/* - * Convert an address to a hostname. - */ -static int -getnameinfo_unix(const struct sockaddr_un * sa, int salen, - char *node, int nodelen, - char *service, int servicelen, - int flags) -{ - int ret = -1; - - /* Invalid arguments. */ - if (sa == NULL || sa->sun_family != AF_UNIX || - (node == NULL && service == NULL)) - return EAI_FAIL; - - if (node) - { - ret = snprintf(node, nodelen, "%s", "[local]"); - if (ret == -1 || ret > nodelen) - return EAI_MEMORY; - } - - if (service) - { - ret = snprintf(service, servicelen, "%s", sa->sun_path); - if (ret == -1 || ret > servicelen) - return EAI_MEMORY; - } - - return 0; -} -#endif /* HAVE_UNIX_SOCKETS */ - /* * pg_range_sockaddr - is addr within the subnet specified by netaddr/netmask ? diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 90b6946b38..bae96bf18f 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -89,7 +89,7 @@ #include #endif -#include "libpq/ip.h" +#include "common/ip.h" #include "libpq/libpq.h" #include "miscadmin.h" #include "storage/ipc.h" diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 2f99aea791..8a2ce91344 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -38,7 +38,7 @@ #include "access/xact.h" #include "catalog/pg_database.h" #include "catalog/pg_proc.h" -#include "libpq/ip.h" +#include "common/ip.h" #include "libpq/libpq.h" #include "libpq/pqsignal.h" #include "mb/pg_wchar.h" diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index a28e215e2d..eaf3f61ecf 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -99,9 +99,9 @@ #include "access/xlog.h" #include "bootstrap/bootstrap.h" #include "catalog/pg_control.h" +#include "common/ip.h" #include "lib/ilist.h" #include "libpq/auth.h" -#include "libpq/ip.h" #include "libpq/libpq.h" #include "libpq/pqsignal.h" #include "miscadmin.h" diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c index 3f6987af04..dbc557e583 100644 --- a/src/backend/utils/adt/network.c +++ b/src/backend/utils/adt/network.c @@ -14,7 +14,7 @@ #include "access/hash.h" #include "catalog/pg_type.h" -#include "libpq/ip.h" +#include "common/ip.h" #include "libpq/libpq-be.h" #include "libpq/pqformat.h" #include "miscadmin.h" diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 1bba5fa8c8..5d1ccf51d4 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -16,8 +16,8 @@ #include "access/htup_details.h" #include "catalog/pg_type.h" +#include "common/ip.h" #include "funcapi.h" -#include "libpq/ip.h" #include "miscadmin.h" #include "pgstat.h" #include "storage/proc.h" diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index bf7c0cd735..582d3e460b 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -21,8 +21,8 @@ #include "access/tuptoaster.h" #include "catalog/pg_collation.h" #include "catalog/pg_type.h" +#include "common/md5.h" #include "lib/hyperloglog.h" -#include "libpq/md5.h" #include "libpq/pqformat.h" #include "miscadmin.h" #include "parser/scansup.h" diff --git a/src/common/Makefile b/src/common/Makefile index 72b73697a8..a5fa649766 100644 --- a/src/common/Makefile +++ b/src/common/Makefile @@ -6,11 +6,15 @@ # This makefile generates two outputs: # # libpgcommon.a - contains object files with FRONTEND defined, -# for use by client application and libraries +# for use by client applications # # libpgcommon_srv.a - contains object files without FRONTEND defined, # for use only by the backend binaries # +# You can also symlink/copy individual source files from this directory, +# to compile with different options. (libpq does that, because it needs +# to use -fPIC on some platforms.) +# # IDENTIFICATION # src/common/Makefile # @@ -36,8 +40,8 @@ override CPPFLAGS += -DVAL_LDFLAGS_EX="\"$(LDFLAGS_EX)\"" override CPPFLAGS += -DVAL_LDFLAGS_SL="\"$(LDFLAGS_SL)\"" override CPPFLAGS += -DVAL_LIBS="\"$(LIBS)\"" -OBJS_COMMON = config_info.o controldata_utils.o exec.o keywords.o \ - pg_lzcompress.o pgfnames.o psprintf.o relpath.o rmtree.o \ +OBJS_COMMON = config_info.o controldata_utils.o exec.o ip.o keywords.o \ + md5.o pg_lzcompress.o pgfnames.o psprintf.o relpath.o rmtree.o \ string.o username.o wait_error.o OBJS_FRONTEND = $(OBJS_COMMON) fe_memutils.o restricted_token.o diff --git a/src/common/ip.c b/src/common/ip.c new file mode 100644 index 0000000000..797d9109ab --- /dev/null +++ b/src/common/ip.c @@ -0,0 +1,260 @@ +/*------------------------------------------------------------------------- + * + * ip.c + * IPv6-aware network access. + * + * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/common/ip.c + * + * This file and the IPV6 implementation were initially provided by + * Nigel Kukard , Linux Based Systems Design + * http://www.lbsd.net. + * + *------------------------------------------------------------------------- + */ + +#ifndef FRONTEND +#include "postgres.h" +#else +#include "postgres_fe.h" +#endif + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_NETINET_TCP_H +#include +#endif +#include +#include + +#include "common/ip.h" + + + +#ifdef HAVE_UNIX_SOCKETS +static int getaddrinfo_unix(const char *path, + const struct addrinfo * hintsp, + struct addrinfo ** result); + +static int getnameinfo_unix(const struct sockaddr_un * sa, int salen, + char *node, int nodelen, + char *service, int servicelen, + int flags); +#endif + + +/* + * pg_getaddrinfo_all - get address info for Unix, IPv4 and IPv6 sockets + */ +int +pg_getaddrinfo_all(const char *hostname, const char *servname, + const struct addrinfo * hintp, struct addrinfo ** result) +{ + 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; +} + + +/* + * pg_freeaddrinfo_all - free addrinfo structures for IPv4, IPv6, or Unix + * + * Note: the ai_family field of the original hint structure must be passed + * so that we can tell whether the addrinfo struct was built by the system's + * getaddrinfo() routine or our own getaddrinfo_unix() routine. Some versions + * of getaddrinfo() might be willing to return AF_UNIX addresses, so it's + * not safe to look at ai_family in the addrinfo itself. + */ +void +pg_freeaddrinfo_all(int hint_ai_family, struct addrinfo * ai) +{ +#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); + } +} + + +/* + * pg_getnameinfo_all - get name info for Unix, IPv4 and IPv6 sockets + * + * The API of this routine differs from the standard getnameinfo() definition + * in two ways: first, the addr parameter is declared as sockaddr_storage + * rather than struct sockaddr, and second, the node and service fields are + * guaranteed to be filled with something even on failure return. + */ +int +pg_getnameinfo_all(const struct sockaddr_storage * addr, int salen, + char *node, int nodelen, + char *service, int servicelen, + int flags) +{ + 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; +} + + +#if defined(HAVE_UNIX_SOCKETS) + +/* ------- + * getaddrinfo_unix - get unix socket info using IPv6-compatible API + * + * Bugs: only one addrinfo is set even though hintsp is NULL or + * ai_socktype is 0 + * AI_CANONNAME is not supported. + * ------- + */ +static int +getaddrinfo_unix(const char *path, const struct addrinfo * hintsp, + struct addrinfo ** result) +{ + struct addrinfo hints; + struct addrinfo *aip; + struct sockaddr_un *unp; + + *result = NULL; + + MemSet(&hints, 0, sizeof(hints)); + + if (strlen(path) >= sizeof(unp->sun_path)) + return EAI_FAIL; + + if (hintsp == NULL) + { + hints.ai_family = AF_UNIX; + hints.ai_socktype = SOCK_STREAM; + } + else + memcpy(&hints, hintsp, sizeof(hints)); + + if (hints.ai_socktype == 0) + hints.ai_socktype = SOCK_STREAM; + + if (hints.ai_family != AF_UNIX) + { + /* shouldn't have been called */ + return EAI_FAIL; + } + + aip = calloc(1, sizeof(struct addrinfo)); + if (aip == NULL) + return EAI_MEMORY; + + unp = calloc(1, sizeof(struct sockaddr_un)); + if (unp == NULL) + { + free(aip); + return EAI_MEMORY; + } + + aip->ai_family = AF_UNIX; + aip->ai_socktype = hints.ai_socktype; + aip->ai_protocol = hints.ai_protocol; + aip->ai_next = NULL; + aip->ai_canonname = NULL; + *result = aip; + + unp->sun_family = AF_UNIX; + aip->ai_addr = (struct sockaddr *) unp; + aip->ai_addrlen = sizeof(struct sockaddr_un); + + strcpy(unp->sun_path, path); + +#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN + unp->sun_len = sizeof(struct sockaddr_un); +#endif + + return 0; +} + +/* + * Convert an address to a hostname. + */ +static int +getnameinfo_unix(const struct sockaddr_un * sa, int salen, + char *node, int nodelen, + char *service, int servicelen, + int flags) +{ + int ret = -1; + + /* Invalid arguments. */ + if (sa == NULL || sa->sun_family != AF_UNIX || + (node == NULL && service == NULL)) + return EAI_FAIL; + + if (node) + { + ret = snprintf(node, nodelen, "%s", "[local]"); + if (ret == -1 || ret > nodelen) + return EAI_MEMORY; + } + + if (service) + { + ret = snprintf(service, servicelen, "%s", sa->sun_path); + if (ret == -1 || ret > servicelen) + return EAI_MEMORY; + } + + return 0; +} +#endif /* HAVE_UNIX_SOCKETS */ diff --git a/src/backend/libpq/md5.c b/src/common/md5.c similarity index 98% rename from src/backend/libpq/md5.c rename to src/common/md5.c index 5af54e6c56..6dad16529c 100644 --- a/src/backend/libpq/md5.c +++ b/src/common/md5.c @@ -14,13 +14,16 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * src/backend/libpq/md5.c + * src/common/md5.c */ -/* This is intended to be used in both frontend and backend, so use c.h */ -#include "c.h" +#ifndef FRONTEND +#include "postgres.h" +#else +#include "postgres_fe.h" +#endif -#include "libpq/md5.h" +#include "common/md5.h" /* diff --git a/src/include/libpq/ip.h b/src/include/common/ip.h similarity index 65% rename from src/include/libpq/ip.h rename to src/include/common/ip.h index ce9bc6e225..36e0511324 100644 --- a/src/include/libpq/ip.h +++ b/src/include/common/ip.h @@ -3,12 +3,11 @@ * ip.h * Definitions for IPv6-aware network access. * - * These definitions are used by both frontend and backend code. Be careful - * what you include here! + * These definitions are used by both frontend and backend code. * * Copyright (c) 2003-2016, PostgreSQL Global Development Group * - * src/include/libpq/ip.h + * src/include/common/ip.h * *------------------------------------------------------------------------- */ @@ -25,10 +24,6 @@ #define IS_AF_UNIX(fam) (0) #endif -typedef void (*PgIfAddrCallback) (struct sockaddr * addr, - struct sockaddr * netmask, - void *cb_data); - extern int pg_getaddrinfo_all(const char *hostname, const char *servname, const struct addrinfo * hintp, struct addrinfo ** result); @@ -39,13 +34,4 @@ extern int pg_getnameinfo_all(const struct sockaddr_storage * addr, int salen, char *service, int servicelen, int flags); -extern int pg_range_sockaddr(const struct sockaddr_storage * addr, - const struct sockaddr_storage * netaddr, - const struct sockaddr_storage * netmask); - -extern int pg_sockaddr_cidr_mask(struct sockaddr_storage * mask, - char *numbits, int family); - -extern int pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data); - #endif /* IP_H */ diff --git a/src/include/libpq/md5.h b/src/include/common/md5.h similarity index 96% rename from src/include/libpq/md5.h rename to src/include/common/md5.h index f3eec8b4f4..4a0432076a 100644 --- a/src/include/libpq/md5.h +++ b/src/include/common/md5.h @@ -9,7 +9,7 @@ * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * src/include/libpq/md5.h + * src/include/common/md5.h * *------------------------------------------------------------------------- */ diff --git a/src/include/libpq/ifaddr.h b/src/include/libpq/ifaddr.h new file mode 100644 index 0000000000..40094a612a --- /dev/null +++ b/src/include/libpq/ifaddr.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------- + * + * ifaddr.h + * IP netmask calculations, and enumerating network interfaces. + * + * Copyright (c) 2003-2016, PostgreSQL Global Development Group + * + * src/include/libpq/ifaddr.h + * + *------------------------------------------------------------------------- + */ +#ifndef IFADDR_H +#define IFADDR_H + +#include "libpq/pqcomm.h" /* pgrminclude ignore */ + +typedef void (*PgIfAddrCallback) (struct sockaddr * addr, + struct sockaddr * netmask, + void *cb_data); + +extern int pg_range_sockaddr(const struct sockaddr_storage * addr, + const struct sockaddr_storage * netaddr, + const struct sockaddr_storage * netmask); + +extern int pg_sockaddr_cidr_mask(struct sockaddr_storage * mask, + char *numbits, int family); + +extern int pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data); + +#endif /* IFADDR_H */ diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index 0b4065ed8f..b1789eb35e 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -39,10 +39,10 @@ OBJS += chklocale.o inet_net_ntop.o noblock.o pgstrcasecmp.o pqsignal.o \ thread.o # libpgport C files that are needed if identified by configure OBJS += $(filter crypt.o getaddrinfo.o getpeereid.o inet_aton.o open.o system.o snprintf.o strerror.o strlcpy.o win32error.o win32setlocale.o, $(LIBOBJS)) -# backend/libpq -OBJS += ip.o md5.o -# utils/mb +# src/backend/utils/mb OBJS += encnames.o wchar.o +# src/common +OBJS += ip.o md5.o ifeq ($(with_openssl),yes) OBJS += fe-secure-openssl.o @@ -96,7 +96,7 @@ backend_src = $(top_srcdir)/src/backend chklocale.c crypt.c getaddrinfo.c getpeereid.c inet_aton.c inet_net_ntop.c noblock.c open.c system.c pgsleep.c pgstrcasecmp.c pqsignal.c snprintf.c strerror.c strlcpy.c thread.c win32error.c win32setlocale.c: % : $(top_srcdir)/src/port/% rm -f $@ && $(LN_S) $< . -ip.c md5.c: % : $(backend_src)/libpq/% +ip.c md5.c: % : $(top_srcdir)/src/common/% rm -f $@ && $(LN_S) $< . encnames.c wchar.c: % : $(backend_src)/utils/mb/% diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c index d23726215b..404bc93306 100644 --- a/src/interfaces/libpq/fe-auth.c +++ b/src/interfaces/libpq/fe-auth.c @@ -38,9 +38,9 @@ #include #endif +#include "common/md5.h" #include "libpq-fe.h" #include "fe-auth.h" -#include "libpq/md5.h" #ifdef ENABLE_GSS diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 76b61bdc25..9668b52103 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -72,7 +72,7 @@ static int ldapServiceLookup(const char *purl, PQconninfoOption *options, PQExpBuffer errorMessage); #endif -#include "libpq/ip.h" +#include "common/ip.h" #include "mb/pg_wchar.h" #ifndef FD_CLOEXEC diff --git a/src/tools/ifaddrs/Makefile b/src/tools/ifaddrs/Makefile index 231f388901..eed6af41e6 100644 --- a/src/tools/ifaddrs/Makefile +++ b/src/tools/ifaddrs/Makefile @@ -20,8 +20,8 @@ OBJS = test_ifaddrs.o all: test_ifaddrs -test_ifaddrs: test_ifaddrs.o $(libpq_backend_dir)/ip.o - $(CC) $(CFLAGS) test_ifaddrs.o $(libpq_backend_dir)/ip.o $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) +test_ifaddrs: test_ifaddrs.o $(libpq_backend_dir)/ifaddr.o + $(CC) $(CFLAGS) test_ifaddrs.o $(libpq_backend_dir)/ifaddr.o $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) clean distclean maintainer-clean: rm -f test_ifaddrs$(X) $(OBJS) diff --git a/src/tools/ifaddrs/test_ifaddrs.c b/src/tools/ifaddrs/test_ifaddrs.c index 48d184c84a..80b9bb0266 100644 --- a/src/tools/ifaddrs/test_ifaddrs.c +++ b/src/tools/ifaddrs/test_ifaddrs.c @@ -12,7 +12,7 @@ #include #include -#include "libpq/ip.h" +#include "libpq/ifaddr.h" static void diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index 6746728616..b3ed1f56e2 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -110,8 +110,8 @@ sub mkvcbuild } our @pgcommonallfiles = qw( - config_info.c controldata_utils.c exec.c keywords.c - pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c + config_info.c controldata_utils.c exec.c ip.c keywords.c + md5.c pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c string.c username.c wait_error.c); our @pgcommonfrontendfiles = (