Blame SOURCES/autofs-5.0.9-amd-lookup-move-get_proximity-to-parse_subs-c.patch

306fa1
autofs-5.0.9 - amd lookup move get_proximity() to parse_subs.c
306fa1
306fa1
From: Ian Kent <raven@themaw.net>
306fa1
306fa1
Later we'll need to use get_proximity() from outside modules/replicated.c
306fa1
so move it to the autofs library.
306fa1
---
306fa1
 include/parse_subs.h |    8 ++
306fa1
 lib/parse_subs.c     |  199 ++++++++++++++++++++++++++++++++++++++++++++++++++
306fa1
 modules/replicated.c |  197 -------------------------------------------------
306fa1
 3 files changed, 207 insertions(+), 197 deletions(-)
306fa1
306fa1
diff --git a/include/parse_subs.h b/include/parse_subs.h
306fa1
index ecc712d..c0da5ae 100644
306fa1
--- a/include/parse_subs.h
306fa1
+++ b/include/parse_subs.h
306fa1
@@ -18,6 +18,13 @@
306fa1
 #ifndef PARSE_SUBS_H
306fa1
 #define PARSE_SUBS_H
306fa1
 
306fa1
+#define PROXIMITY_ERROR		0x0000
306fa1
+#define PROXIMITY_LOCAL         0x0001
306fa1
+#define PROXIMITY_SUBNET        0x0002
306fa1
+#define PROXIMITY_NET           0x0004
306fa1
+#define PROXIMITY_OTHER         0x0008
306fa1
+#define PROXIMITY_UNSUPPORTED   0x0010
306fa1
+
306fa1
 struct mapent;
306fa1
 
306fa1
 struct map_type_info {
306fa1
@@ -26,6 +33,7 @@ struct map_type_info {
306fa1
 	char *map;
306fa1
 };
306fa1
 
306fa1
+unsigned int get_proximity(struct sockaddr *);
306fa1
 const char *skipspace(const char *);
306fa1
 int check_colon(const char *);
306fa1
 int chunklen(const char *, int);
306fa1
diff --git a/lib/parse_subs.c b/lib/parse_subs.c
306fa1
index dd2a784..b77d890 100644
306fa1
--- a/lib/parse_subs.c
306fa1
+++ b/lib/parse_subs.c
306fa1
@@ -18,8 +18,24 @@
306fa1
 #include <stdlib.h>
306fa1
 #include <string.h>
306fa1
 #include <ctype.h>
306fa1
+#include <sys/types.h>
306fa1
+#include <ifaddrs.h>
306fa1
+#include <net/if.h>
306fa1
 #include "automount.h"
306fa1
 
306fa1
+#define MAX_NETWORK_LEN		255
306fa1
+
306fa1
+#define MAX_IFC_BUF		2048
306fa1
+static int volatile ifc_buf_len = MAX_IFC_BUF;
306fa1
+static int volatile ifc_last_len = 0;
306fa1
+
306fa1
+#define MASK_A  0x7F000000
306fa1
+#define MASK_B  0xBFFF0000
306fa1
+#define MASK_C  0xDFFFFF00
306fa1
+
306fa1
+/* Get numeric value of the n bits starting at position p */
306fa1
+#define getbits(x, p, n)	((x >> (p + 1 - n)) & ~(~0 << n))
306fa1
+
306fa1
 struct types {
306fa1
 	char *type;
306fa1
 	unsigned int len;
306fa1
@@ -45,6 +61,189 @@ static struct types format_type[] = {
306fa1
 };
306fa1
 static unsigned int format_type_count = sizeof(format_type)/sizeof(struct types);
306fa1
 
306fa1
+static unsigned int ipv6_mask_cmp(uint32_t *host, uint32_t *iface, uint32_t *mask)
306fa1
+{
306fa1
+	unsigned int ret = 1;
306fa1
+	unsigned int i;
306fa1
+
306fa1
+	for (i = 0; i < 4; i++) {
306fa1
+		if ((host[i] & mask[i]) != (iface[i] & mask[i])) {
306fa1
+			ret = 0;
306fa1
+			break;
306fa1
+		}
306fa1
+	}
306fa1
+	return ret;
306fa1
+}
306fa1
+
306fa1
+unsigned int get_proximity(struct sockaddr *host_addr)
306fa1
+{
306fa1
+	struct ifaddrs *ifa = NULL;
306fa1
+	struct ifaddrs *this;
306fa1
+	struct sockaddr_in *addr, *msk_addr, *if_addr;
306fa1
+	struct sockaddr_in6 *addr6, *msk6_addr, *if6_addr;
306fa1
+	struct in_addr *hst_addr;
306fa1
+	struct in6_addr *hst6_addr;
306fa1
+	int addr_len;
306fa1
+	char buf[MAX_ERR_BUF];
306fa1
+	uint32_t mask, ha, ia, *mask6, *ha6, *ia6;
306fa1
+	int ret;
306fa1
+
306fa1
+	addr = NULL;
306fa1
+	addr6 = NULL;
306fa1
+	hst_addr = NULL;
306fa1
+	hst6_addr = NULL;
306fa1
+	mask6 = NULL;
306fa1
+	ha6 = NULL;
306fa1
+	ia6 = NULL;
306fa1
+	ha = 0;
306fa1
+
306fa1
+	switch (host_addr->sa_family) {
306fa1
+	case AF_INET:
306fa1
+		addr = (struct sockaddr_in *) host_addr;
306fa1
+		hst_addr = (struct in_addr *) &addr->sin_addr;
306fa1
+		ha = ntohl((uint32_t) hst_addr->s_addr);
306fa1
+		addr_len = sizeof(*hst_addr);
306fa1
+		break;
306fa1
+
306fa1
+	case AF_INET6:
306fa1
+#ifndef WITH_LIBTIRPC
306fa1
+		return PROXIMITY_UNSUPPORTED;
306fa1
+#else
306fa1
+		addr6 = (struct sockaddr_in6 *) host_addr;
306fa1
+		hst6_addr = (struct in6_addr *) &addr6->sin6_addr;
306fa1
+		ha6 = &hst6_addr->s6_addr32[0];
306fa1
+		addr_len = sizeof(*hst6_addr);
306fa1
+		break;
306fa1
+#endif
306fa1
+
306fa1
+	default:
306fa1
+		return PROXIMITY_ERROR;
306fa1
+	}
306fa1
+
306fa1
+	ret = getifaddrs(&ifa;;
306fa1
+	if (ret) {
306fa1
+		char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
306fa1
+		logerr("getifaddrs: %s", estr);
306fa1
+		return PROXIMITY_ERROR;
306fa1
+	}
306fa1
+
306fa1
+	this = ifa;
306fa1
+	while (this) {
306fa1
+		if (!(this->ifa_flags & IFF_UP) ||
306fa1
+		    this->ifa_flags & IFF_POINTOPOINT ||
306fa1
+		    this->ifa_addr == NULL) {
306fa1
+			this = this->ifa_next;
306fa1
+			continue;
306fa1
+		}
306fa1
+
306fa1
+		switch (this->ifa_addr->sa_family) {
306fa1
+		case AF_INET:
306fa1
+			if (host_addr->sa_family == AF_INET6)
306fa1
+				break;
306fa1
+			if_addr = (struct sockaddr_in *) this->ifa_addr;
306fa1
+			ret = memcmp(&if_addr->sin_addr, hst_addr, addr_len);
306fa1
+			if (!ret) {
306fa1
+				freeifaddrs(ifa);
306fa1
+				return PROXIMITY_LOCAL;
306fa1
+			}
306fa1
+			break;
306fa1
+
306fa1
+		case AF_INET6:
306fa1
+#ifdef WITH_LIBTIRPC
306fa1
+			if (host_addr->sa_family == AF_INET)
306fa1
+				break;
306fa1
+			if6_addr = (struct sockaddr_in6 *) this->ifa_addr;
306fa1
+			ret = memcmp(&if6_addr->sin6_addr, hst6_addr, addr_len);
306fa1
+			if (!ret) {
306fa1
+				freeifaddrs(ifa);
306fa1
+				return PROXIMITY_LOCAL;
306fa1
+			}
306fa1
+#endif
306fa1
+		default:
306fa1
+			break;
306fa1
+		}
306fa1
+		this = this->ifa_next;
306fa1
+	}
306fa1
+
306fa1
+	this = ifa;
306fa1
+	while (this) {
306fa1
+		if (!(this->ifa_flags & IFF_UP) ||
306fa1
+		    this->ifa_flags & IFF_POINTOPOINT ||
306fa1
+		    this->ifa_addr == NULL) {
306fa1
+			this = this->ifa_next;
306fa1
+			continue;
306fa1
+		}
306fa1
+
306fa1
+		switch (this->ifa_addr->sa_family) {
306fa1
+		case AF_INET:
306fa1
+			if (host_addr->sa_family == AF_INET6)
306fa1
+				break;
306fa1
+			if_addr = (struct sockaddr_in *) this->ifa_addr;
306fa1
+			ia =  ntohl((uint32_t) if_addr->sin_addr.s_addr);
306fa1
+
306fa1
+			/* Is the address within a localy attached subnet */
306fa1
+
306fa1
+			msk_addr = (struct sockaddr_in *) this->ifa_netmask;
306fa1
+			mask = ntohl((uint32_t) msk_addr->sin_addr.s_addr);
306fa1
+
306fa1
+			if ((ia & mask) == (ha & mask)) {
306fa1
+				freeifaddrs(ifa);
306fa1
+				return PROXIMITY_SUBNET;
306fa1
+			}
306fa1
+
306fa1
+			/*
306fa1
+			 * Is the address within a local ipv4 network.
306fa1
+			 *
306fa1
+			 * Bit position 31 == 0 => class A.
306fa1
+			 * Bit position 30 == 0 => class B.
306fa1
+			 * Bit position 29 == 0 => class C.
306fa1
+			 */
306fa1
+
306fa1
+			if (!getbits(ia, 31, 1))
306fa1
+				mask = MASK_A;
306fa1
+			else if (!getbits(ia, 30, 1))
306fa1
+				mask = MASK_B;
306fa1
+			else if (!getbits(ia, 29, 1))
306fa1
+				mask = MASK_C;
306fa1
+			else
306fa1
+				break;
306fa1
+
306fa1
+			if ((ia & mask) == (ha & mask)) {
306fa1
+				freeifaddrs(ifa);
306fa1
+				return PROXIMITY_NET;
306fa1
+			}
306fa1
+			break;
306fa1
+
306fa1
+		case AF_INET6:
306fa1
+#ifdef WITH_LIBTIRPC
306fa1
+			if (host_addr->sa_family == AF_INET)
306fa1
+				break;
306fa1
+			if6_addr = (struct sockaddr_in6 *) this->ifa_addr;
306fa1
+			ia6 = &if6_addr->sin6_addr.s6_addr32[0];
306fa1
+
306fa1
+			/* Is the address within the network of the interface */
306fa1
+
306fa1
+			msk6_addr = (struct sockaddr_in6 *) this->ifa_netmask;
306fa1
+			mask6 = &msk6_addr->sin6_addr.s6_addr32[0];
306fa1
+
306fa1
+			if (ipv6_mask_cmp(ha6, ia6, mask6)) {
306fa1
+				freeifaddrs(ifa);
306fa1
+				return PROXIMITY_SUBNET;
306fa1
+			}
306fa1
+
306fa1
+			/* How do we define "local network" in ipv6? */
306fa1
+#endif
306fa1
+		default:
306fa1
+			break;
306fa1
+		}
306fa1
+		this = this->ifa_next;
306fa1
+	}
306fa1
+
306fa1
+	freeifaddrs(ifa);
306fa1
+
306fa1
+	return PROXIMITY_OTHER;
306fa1
+}
306fa1
+
306fa1
 /*
306fa1
  * Skip whitespace in a string; if we hit a #, consider the rest of the
306fa1
  * entry a comment.
306fa1
diff --git a/modules/replicated.c b/modules/replicated.c
306fa1
index d43f778..0c1a8a7 100644
306fa1
--- a/modules/replicated.c
306fa1
+++ b/modules/replicated.c
306fa1
@@ -48,11 +48,8 @@
306fa1
 #include <stdint.h>
306fa1
 #include <sys/ioctl.h>
306fa1
 #include <sys/socket.h>
306fa1
-#include <arpa/inet.h>
306fa1
-#include <net/if.h>
306fa1
 #include <netinet/in.h>
306fa1
 #include <netdb.h>
306fa1
-#include <ifaddrs.h>
306fa1
 
306fa1
 #include "rpc_subs.h"
306fa1
 #include "replicated.h"
306fa1
@@ -62,34 +59,9 @@
306fa1
 #define MAX_ERR_BUF		512
306fa1
 #endif
306fa1
 
306fa1
-#define MAX_IFC_BUF		2048
306fa1
-static int volatile ifc_buf_len = MAX_IFC_BUF;
306fa1
-static int volatile ifc_last_len = 0;
306fa1
-
306fa1
-#define MASK_A  0x7F000000
306fa1
-#define MASK_B  0xBFFF0000
306fa1
-#define MASK_C  0xDFFFFF00
306fa1
-
306fa1
-/* Get numeric value of the n bits starting at position p */
306fa1
-#define getbits(x, p, n)	((x >> (p + 1 - n)) & ~(~0 << n))
306fa1
-
306fa1
 #define mymax(x, y)	(x >= y ? x : y)
306fa1
 #define mmax(x, y, z)	(mymax(x, y) == x ? mymax(x, z) : mymax(y, z))
306fa1
 
306fa1
-unsigned int ipv6_mask_cmp(uint32_t *host, uint32_t *iface, uint32_t *mask)
306fa1
-{
306fa1
-	unsigned int ret = 1;
306fa1
-	unsigned int i;
306fa1
-
306fa1
-	for (i = 0; i < 4; i++) {
306fa1
-		if ((host[i] & mask[i]) != (iface[i] & mask[i])) {
306fa1
-			ret = 0;
306fa1
-			break;
306fa1
-		}
306fa1
-	}
306fa1
-	return ret;
306fa1
-}
306fa1
-
306fa1
 void seed_random(void)
306fa1
 {
306fa1
 	int fd;
306fa1
@@ -111,175 +83,6 @@ void seed_random(void)
306fa1
 	return;
306fa1
 }
306fa1
 
306fa1
-static unsigned int get_proximity(struct sockaddr *host_addr)
306fa1
-{
306fa1
-	struct ifaddrs *ifa = NULL;
306fa1
-	struct ifaddrs *this;
306fa1
-	struct sockaddr_in *addr, *msk_addr, *if_addr;
306fa1
-	struct sockaddr_in6 *addr6, *msk6_addr, *if6_addr;
306fa1
-	struct in_addr *hst_addr;
306fa1
-	struct in6_addr *hst6_addr;
306fa1
-	int addr_len;
306fa1
-	char buf[MAX_ERR_BUF];
306fa1
-	uint32_t mask, ha, ia, *mask6, *ha6, *ia6;
306fa1
-	int ret;
306fa1
-
306fa1
-	addr = NULL;
306fa1
-	addr6 = NULL;
306fa1
-	hst_addr = NULL;
306fa1
-	hst6_addr = NULL;
306fa1
-	mask6 = NULL;
306fa1
-	ha6 = NULL;
306fa1
-	ia6 = NULL;
306fa1
-	ha = 0;
306fa1
-
306fa1
-	switch (host_addr->sa_family) {
306fa1
-	case AF_INET:
306fa1
-		addr = (struct sockaddr_in *) host_addr;
306fa1
-		hst_addr = (struct in_addr *) &addr->sin_addr;
306fa1
-		ha = ntohl((uint32_t) hst_addr->s_addr);
306fa1
-		addr_len = sizeof(*hst_addr);
306fa1
-		break;
306fa1
-
306fa1
-	case AF_INET6:
306fa1
-#ifndef WITH_LIBTIRPC
306fa1
-		return PROXIMITY_UNSUPPORTED;
306fa1
-#else
306fa1
-		addr6 = (struct sockaddr_in6 *) host_addr;
306fa1
-		hst6_addr = (struct in6_addr *) &addr6->sin6_addr;
306fa1
-		ha6 = &hst6_addr->s6_addr32[0];
306fa1
-		addr_len = sizeof(*hst6_addr);
306fa1
-		break;
306fa1
-#endif
306fa1
-
306fa1
-	default:
306fa1
-		return PROXIMITY_ERROR;
306fa1
-	}
306fa1
-
306fa1
-	ret = getifaddrs(&ifa;;
306fa1
-	if (ret) {
306fa1
-		char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
306fa1
-		logerr("getifaddrs: %s", estr);
306fa1
-		return PROXIMITY_ERROR;
306fa1
-	}
306fa1
-
306fa1
-	this = ifa;
306fa1
-	while (this) {
306fa1
-		if (!(this->ifa_flags & IFF_UP) ||
306fa1
-		    this->ifa_flags & IFF_POINTOPOINT ||
306fa1
-		    this->ifa_addr == NULL) {
306fa1
-			this = this->ifa_next;
306fa1
-			continue;
306fa1
-		}
306fa1
-
306fa1
-		switch (this->ifa_addr->sa_family) {
306fa1
-		case AF_INET:
306fa1
-			if (host_addr->sa_family == AF_INET6)
306fa1
-				break;
306fa1
-			if_addr = (struct sockaddr_in *) this->ifa_addr;
306fa1
-			ret = memcmp(&if_addr->sin_addr, hst_addr, addr_len);
306fa1
-			if (!ret) {
306fa1
-				freeifaddrs(ifa);
306fa1
-				return PROXIMITY_LOCAL;
306fa1
-			}
306fa1
-			break;
306fa1
-
306fa1
-		case AF_INET6:
306fa1
-#ifdef WITH_LIBTIRPC
306fa1
-			if (host_addr->sa_family == AF_INET)
306fa1
-				break;
306fa1
-			if6_addr = (struct sockaddr_in6 *) this->ifa_addr;
306fa1
-			ret = memcmp(&if6_addr->sin6_addr, hst6_addr, addr_len);
306fa1
-			if (!ret) {
306fa1
-				freeifaddrs(ifa);
306fa1
-				return PROXIMITY_LOCAL;
306fa1
-			}
306fa1
-#endif
306fa1
-		default:
306fa1
-			break;
306fa1
-		}
306fa1
-		this = this->ifa_next;
306fa1
-	}
306fa1
-
306fa1
-	this = ifa;
306fa1
-	while (this) {
306fa1
-		if (!(this->ifa_flags & IFF_UP) ||
306fa1
-		    this->ifa_flags & IFF_POINTOPOINT ||
306fa1
-		    this->ifa_addr == NULL) {
306fa1
-			this = this->ifa_next;
306fa1
-			continue;
306fa1
-		}
306fa1
-
306fa1
-		switch (this->ifa_addr->sa_family) {
306fa1
-		case AF_INET:
306fa1
-			if (host_addr->sa_family == AF_INET6)
306fa1
-				break;
306fa1
-			if_addr = (struct sockaddr_in *) this->ifa_addr;
306fa1
-			ia =  ntohl((uint32_t) if_addr->sin_addr.s_addr);
306fa1
-
306fa1
-			/* Is the address within a localy attached subnet */
306fa1
-
306fa1
-			msk_addr = (struct sockaddr_in *) this->ifa_netmask;
306fa1
-			mask = ntohl((uint32_t) msk_addr->sin_addr.s_addr);
306fa1
-
306fa1
-			if ((ia & mask) == (ha & mask)) {
306fa1
-				freeifaddrs(ifa);
306fa1
-				return PROXIMITY_SUBNET;
306fa1
-			}
306fa1
-
306fa1
-			/*
306fa1
-			 * Is the address within a local ipv4 network.
306fa1
-			 *
306fa1
-			 * Bit position 31 == 0 => class A.
306fa1
-			 * Bit position 30 == 0 => class B.
306fa1
-			 * Bit position 29 == 0 => class C.
306fa1
-			 */
306fa1
-
306fa1
-			if (!getbits(ia, 31, 1))
306fa1
-				mask = MASK_A;
306fa1
-			else if (!getbits(ia, 30, 1))
306fa1
-				mask = MASK_B;
306fa1
-			else if (!getbits(ia, 29, 1))
306fa1
-				mask = MASK_C;
306fa1
-			else
306fa1
-				break;
306fa1
-
306fa1
-			if ((ia & mask) == (ha & mask)) {
306fa1
-				freeifaddrs(ifa);
306fa1
-				return PROXIMITY_NET;
306fa1
-			}
306fa1
-			break;
306fa1
-
306fa1
-		case AF_INET6:
306fa1
-#ifdef WITH_LIBTIRPC
306fa1
-			if (host_addr->sa_family == AF_INET)
306fa1
-				break;
306fa1
-			if6_addr = (struct sockaddr_in6 *) this->ifa_addr;
306fa1
-			ia6 = &if6_addr->sin6_addr.s6_addr32[0];
306fa1
-
306fa1
-			/* Is the address within the network of the interface */
306fa1
-
306fa1
-			msk6_addr = (struct sockaddr_in6 *) this->ifa_netmask;
306fa1
-			mask6 = &msk6_addr->sin6_addr.s6_addr32[0];
306fa1
-
306fa1
-			if (ipv6_mask_cmp(ha6, ia6, mask6)) {
306fa1
-				freeifaddrs(ifa);
306fa1
-				return PROXIMITY_SUBNET;
306fa1
-			}
306fa1
-
306fa1
-			/* How do we define "local network" in ipv6? */
306fa1
-#endif
306fa1
-		default:
306fa1
-			break;
306fa1
-		}
306fa1
-		this = this->ifa_next;
306fa1
-	}
306fa1
-
306fa1
-	freeifaddrs(ifa);
306fa1
-
306fa1
-	return PROXIMITY_OTHER;
306fa1
-}
306fa1
-
306fa1
 struct host *new_host(const char *name,
306fa1
 		      struct sockaddr *addr, size_t addr_len,
306fa1
 		      unsigned int proximity, unsigned int weight,