diff options
author | Stef Walter <stef@memberwebs.com> | 2004-09-04 00:05:08 +0000 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2004-09-04 00:05:08 +0000 |
commit | fdafaaeec8b05ab1e62457ecb6202ced98caa202 (patch) | |
tree | 3b093585fcce8975acee7b8b5ca5700702821ec6 /common/sock_any.c | |
parent | 4fb48e235e0f76d3e5fcdd61e88ac63fa46cc14d (diff) |
Transparent proxy support.
Diffstat (limited to 'common/sock_any.c')
-rw-r--r-- | common/sock_any.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/common/sock_any.c b/common/sock_any.c index 03621ff..e5f24c0 100644 --- a/common/sock_any.c +++ b/common/sock_any.c @@ -353,3 +353,33 @@ int sock_any_ntop(struct sockaddr_any* any, char* addr, size_t addrlen, int opts return 0; } + +int sock_any_cmp(struct sockaddr_any* a1, struct sockaddr_any* a2, int opts) +{ + if(a1->s.a.sa_family != a2->s.a.sa_family) + return -1; + + switch(a1->s.a.sa_family) + { + case AF_UNIX: + return strcmp(a1->s.un.sun_path, a2->s.un.sun_path); + + case AF_INET: + if(memcmp(&(a1->s.in.sin_addr), &(a2->s.in.sin_addr), sizeof(a2->s.in.sin_addr)) != 0) + return -1; + if(!(opts && SANY_OPT_NOPORT) && a1->s.in.sin_port != a2->s.in.sin_port) + return -1; + return 0; +#ifdef HAVE_INET6 + case AF_INET6: + if(memcmp(&(a1->s.in6.sin6_addr), &(a2->s.in6.sin6_addr), sizeof(a2->s.in6.sin6_addr)) != 0) + return -1; + if(!(opts && SANY_OPT_NOPORT) && a1->s.in6.sin6_port != a2->s.in6.sin6_port) + return -1; + return 0; +#endif + default: + errno = EAFNOSUPPORT; + return -1; + } +} |