openwrt/package/network/services/ipset-dns/patches/100-simultaneous-ipv4-ipv6....

58 lines
1.7 KiB
Diff
Raw Normal View History

--- a/ipset-dns.c
+++ b/ipset-dns.c
@@ -307,19 +307,20 @@ int main(int argc, char *argv[])
struct timeval tv;
char msg[512];
char ip[INET6_ADDRSTRLEN];
- char *ipset;
+ char *ipset, *ipset6;
int listen_sock, upstream_sock;
int pos, i, size, af;
socklen_t len;
size_t received;
pid_t child;
- if (argc != 4) {
- fprintf(stderr, "Usage: %s ipset port upstream\n", argv[0]);
+ if (argc != 5) {
+ fprintf(stderr, "Usage: %s ipv4-ipset ipv6-ipset port upstream\n", argv[0]);
return 1;
}
ipset = argv[1];
+ ipset6 = argv[2];
listen_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (listen_sock < 0) {
@@ -329,7 +330,7 @@ int main(int argc, char *argv[])
memset(&listen_addr, 0, sizeof(listen_addr));
listen_addr.sin_family = AF_INET;
- listen_addr.sin_port = htons(atoi(argv[2]));
+ listen_addr.sin_port = htons(atoi(argv[3]));
listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
i = 1;
setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
@@ -341,7 +342,7 @@ int main(int argc, char *argv[])
memset(&upstream_addr, 0, sizeof(upstream_addr));
upstream_addr.sin_family = AF_INET;
upstream_addr.sin_port = htons(53);
- inet_aton(argv[3], &upstream_addr.sin_addr);
+ inet_aton(argv[4], &upstream_addr.sin_addr);
/* TODO: Put all of the below code in several forks all listening on the same sock. */
@@ -434,8 +435,11 @@ int main(int argc, char *argv[])
continue;
}
+ if ((af == AF_INET && !*ipset) || (af == AF_INET6 && !*ipset6))
+ continue;
+
printf("%s: %s\n", answer.dotted, ip);
- if (add_to_ipset(ipset, answer.rdata, af) < 0)
+ if (add_to_ipset((af == AF_INET) ? ipset : ipset6, answer.rdata, af) < 0)
perror("add_to_ipset");
}