summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/src/map.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/src/map.c')
-rw-r--r--contrib/sendmail/src/map.c85
1 files changed, 83 insertions, 2 deletions
diff --git a/contrib/sendmail/src/map.c b/contrib/sendmail/src/map.c
index ad7d818..24ed1f1 100644
--- a/contrib/sendmail/src/map.c
+++ b/contrib/sendmail/src/map.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998-2008 Sendmail, Inc. and its suppliers.
+ * Copyright (c) 1998-2008 Proofpoint, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1992, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1992, 1993
@@ -13,7 +13,7 @@
#include <sendmail.h>
-SM_RCSID("@(#)$Id: map.c,v 8.711 2013/03/12 15:24:52 ca Exp $")
+SM_RCSID("@(#)$Id: map.c,v 8.713 2013/11/22 20:51:55 ca Exp $")
#if LDAPMAP
# include <sm/ldap.h>
@@ -7366,6 +7366,87 @@ arith_map_lookup(map, name, av, statp)
return NULL;
}
+#if _FFR_ARPA_MAP
+char *
+arpa_map_lookup(map, name, av, statp)
+ MAP *map;
+ char *name;
+ char **av;
+ int *statp;
+{
+ int r;
+ char *rval;
+ char result[128]; /* IPv6: 64 + 10 + 1 would be enough */
+
+ if (tTd(38, 2))
+ sm_dprintf("arpa_map_lookup: key '%s'\n", name);
+ *statp = EX_DATAERR;
+ r = 1;
+ memset(result, '\0', sizeof(result));
+ rval = NULL;
+
+# if NETINET6
+ if (sm_strncasecmp(name, "IPv6:", 5) == 0)
+ {
+ struct in6_addr in6_addr;
+
+ r = anynet_pton(AF_INET6, name, &in6_addr);
+ if (r == 1)
+ {
+ static char hex_digits[] =
+ { '0', '1', '2', '3', '4', '5', '6', '7', '8',
+ '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+ unsigned char *src;
+ char *dst;
+ int i;
+
+ src = (unsigned char *) &in6_addr;
+ dst = result;
+ for (i = 15; i >= 0; i--) {
+ *dst++ = hex_digits[src[i] & 0x0f];
+ *dst++ = '.';
+ *dst++ = hex_digits[(src[i] >> 4) & 0x0f];
+ if (i > 0)
+ *dst++ = '.';
+ }
+ *statp = EX_OK;
+ }
+ }
+ else
+# endif /* NETINET6 */
+# if NETINET
+ {
+ struct in_addr in_addr;
+
+ r = anynet_pton(AF_INET, name, &in_addr);
+ if (r == 1)
+ {
+ unsigned char *src;
+
+ src = (unsigned char *) &in_addr;
+ (void) snprintf(result, sizeof(result),
+ "%u.%u.%u.%u",
+ src[3], src[2], src[1], src[0]);
+ *statp = EX_OK;
+ }
+ }
+# endif /* NETINET */
+ if (r < 0)
+ *statp = EX_UNAVAILABLE;
+ if (tTd(38, 2))
+ sm_dprintf("arpa_map_lookup: r=%d, result='%s'\n", r, result);
+ if (*statp == EX_OK)
+ {
+ if (bitset(MF_MATCHONLY, map->map_mflags))
+ rval = map_rewrite(map, name, strlen(name), NULL);
+ else
+ rval = map_rewrite(map, result, strlen(result), av);
+ }
+ return rval;
+}
+#endif /* _FFR_ARPA_MAP */
+
#if SOCKETMAP
# if NETINET || NETINET6
OpenPOWER on IntegriCloud