summaryrefslogtreecommitdiff
path: root/src/tools/ifaddrs
diff options
context:
space:
mode:
authorTom Lane2009-10-01 01:58:58 +0000
committerTom Lane2009-10-01 01:58:58 +0000
commitf3aec2c7f51904e7920cd27115fdab831795d96b (patch)
tree6c81410fb6470f1ab8b7a4e5b74ec3ebbab775f6 /src/tools/ifaddrs
parentf7082f269eb2ee5347ddd411602a870866d783d2 (diff)
Support "samehost" and "samenet" specifications in pg_hba.conf,
by enumerating the machine's IP interfaces to look for a match. Stef Walter
Diffstat (limited to 'src/tools/ifaddrs')
-rw-r--r--src/tools/ifaddrs/Makefile27
-rw-r--r--src/tools/ifaddrs/README12
-rw-r--r--src/tools/ifaddrs/test_ifaddrs.c73
3 files changed, 112 insertions, 0 deletions
diff --git a/src/tools/ifaddrs/Makefile b/src/tools/ifaddrs/Makefile
new file mode 100644
index 0000000000..6f5df48556
--- /dev/null
+++ b/src/tools/ifaddrs/Makefile
@@ -0,0 +1,27 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/tools/ifaddrs
+#
+# Copyright (c) 2003-2009, PostgreSQL Global Development Group
+#
+# $PostgreSQL: pgsql/src/tools/ifaddrs/Makefile,v 1.1 2009/10/01 01:58:58 tgl Exp $
+#
+#-------------------------------------------------------------------------
+
+subdir = src/tools/ifaddrs
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+libpq_backend_dir = $(top_builddir)/src/backend/libpq
+
+override CPPFLAGS := -I$(libpq_backend_dir) $(CPPFLAGS)
+
+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) $(LIBS) -o $@$(X)
+
+clean distclean maintainer-clean:
+ rm -f test_ifaddrs$(X) $(OBJS)
diff --git a/src/tools/ifaddrs/README b/src/tools/ifaddrs/README
new file mode 100644
index 0000000000..9b0bd58517
--- /dev/null
+++ b/src/tools/ifaddrs/README
@@ -0,0 +1,12 @@
+$PostgreSQL: pgsql/src/tools/ifaddrs/README,v 1.1 2009/10/01 01:58:58 tgl Exp $
+
+test_ifaddrs
+============
+
+This program prints the addresses and netmasks of all the IPv4 and IPv6
+interfaces on the local machine. It is useful for testing that this
+functionality works on various platforms. If "samehost" and "samenet"
+in pg_hba.conf don't seem to work right, run this program to see what
+is happening.
+
+Usage: test_ifaddrs
diff --git a/src/tools/ifaddrs/test_ifaddrs.c b/src/tools/ifaddrs/test_ifaddrs.c
new file mode 100644
index 0000000000..78013106cc
--- /dev/null
+++ b/src/tools/ifaddrs/test_ifaddrs.c
@@ -0,0 +1,73 @@
+/*
+ * $PostgreSQL: pgsql/src/tools/ifaddrs/test_ifaddrs.c,v 1.1 2009/10/01 01:58:58 tgl Exp $
+ *
+ *
+ * test_ifaddrs.c
+ * test pg_foreach_ifaddr()
+ */
+
+#include "postgres.h"
+
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+
+#include "libpq/ip.h"
+
+
+static void
+print_addr(struct sockaddr *addr)
+{
+ char buffer[256];
+ int ret, len;
+
+ switch (addr->sa_family)
+ {
+ case AF_INET:
+ len = sizeof(struct sockaddr_in);
+ break;
+#ifdef HAVE_IPV6
+ case AF_INET6:
+ len = sizeof(struct sockaddr_in6);
+ break;
+#endif
+ default:
+ len = sizeof(struct sockaddr_storage);
+ break;
+ }
+
+ ret = getnameinfo(addr, len, buffer, sizeof(buffer), NULL, 0,
+ NI_NUMERICHOST);
+ if (ret != 0)
+ printf("[unknown: family %d]", addr->sa_family);
+ else
+ printf("%s", buffer);
+}
+
+static void
+callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
+{
+ printf("addr: ");
+ print_addr(addr);
+ printf(" mask: ");
+ print_addr(mask);
+ printf("\n");
+}
+
+int
+main(int argc, char *argv[])
+{
+#ifdef WIN32
+ WSADATA wsaData;
+
+ if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
+ {
+ fprintf(stderr, "WSAStartup failed\n");
+ return 1;
+ }
+#endif
+
+ if (pg_foreach_ifaddr(callback, NULL) < 0)
+ fprintf(stderr, "pg_foreach_ifaddr failed: %s\n", strerror(errno));
+ return 0;
+}