diff options
author | kaiw <kaiw@FreeBSD.org> | 2014-01-28 19:12:31 +0000 |
---|---|---|
committer | kaiw <kaiw@FreeBSD.org> | 2014-01-28 19:12:31 +0000 |
commit | 9c3c6fdae0b43f1bbd5486754c20e403fc83c3b6 (patch) | |
tree | c000f1bf7a21df619e5cc1ac52b3edc991b884d0 /contrib/sendmail/src/map.c | |
parent | 0fb1cfad9518e33fe20de1d9d694d0d5c2044fa2 (diff) | |
parent | 17e24564634134c9b7145fcf8d1c7d51b93c3182 (diff) | |
download | FreeBSD-src-9c3c6fdae0b43f1bbd5486754c20e403fc83c3b6.zip FreeBSD-src-9c3c6fdae0b43f1bbd5486754c20e403fc83c3b6.tar.gz |
MFH@261240.
Diffstat (limited to 'contrib/sendmail/src/map.c')
-rw-r--r-- | contrib/sendmail/src/map.c | 85 |
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 |