Skip to content

Instantly share code, notes, and snippets.

@KristianLyng
Created April 21, 2010 10:58
Show Gist options
  • Save KristianLyng/373701 to your computer and use it in GitHub Desktop.
Save KristianLyng/373701 to your computer and use it in GitHub Desktop.
/* Compare an IPv4 backend to a IPv4 addr/len */
static int
vdi_dns_comp_addrinfo4(struct backend *bp,
const struct sockaddr_in *addr,
const socklen_t len)
{
uint32_t u, p;
struct sockaddr_in *bps = (struct sockaddr_in *) bp->ipv4;
if (bp->ipv4len != len || len <= 0)
return 0;
u = addr->sin_addr.s_addr;
p = bps->sin_addr.s_addr;
return u == p;
}
/* Compare an IPv6 backend to a IPv6 addr/len */
static int
vdi_dns_comp_addrinfo6(struct backend *bp,
struct sockaddr_in6 *addr,
const socklen_t len)
{
uint8_t *u, *p;
int i;
struct sockaddr_in6 *bps = (struct sockaddr_in6 *) bp->ipv6;
if (bp->ipv6len != len || len <= 0)
return 0;
u = addr->sin6_addr.s6_addr;
p = bps->sin6_addr.s6_addr;
for (i=0; i < 16; i++) {
if (u[i] != p[i])
return 0;
}
return 1;
}
struct backend *
vdi_get_backend_if_simple(const struct director *d);
/* Check if a backends socket is the same as addr */
static int
vdi_dns_comp_addrinfo(struct director *dir,
struct sockaddr *addr,
const socklen_t len)
{
struct backend *bp;
int ret = 0;
bp = vdi_get_backend_if_simple(dir);
if (bp->ipv4) {
ret = memcmp(addr, bp->ipv4, len);
printf("ipv4. ret: %d. len: %d\n", ret, len);
return !ret;
}
if (addr->sa_family == PF_INET && bp->ipv4) {
return (vdi_dns_comp_addrinfo4(bp, (struct sockaddr_in *)
addr, len));
} else if (addr->sa_family == PF_INET6 && bp->ipv6) {
return (vdi_dns_comp_addrinfo6(bp, (struct sockaddr_in6 *)
addr, len));
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment