diff --git a/connection.c b/connection.c index 0d77cbb..3694931 100644 --- a/connection.c +++ b/connection.c @@ -269,10 +269,7 @@ int ctcs_httpd_quit(struct httpd_con *con, void *privdata) list_for_each_entry(torrent, &torrent_list, list) { struct client_con *search; list_for_each_entry(search, &torrent->client_list, list) { - if (search->addr.sin_addr.s_addr != addr.sin_addr.s_addr) - continue; - - if (search->addr.sin_port != addr.sin_port) + if (!same_sockaddr(&search->addr, &addr)) continue; write(event_get_fd(search->event), "CTQUIT\n", 7); diff --git a/sockaddr.c b/sockaddr.c index 91a5c20..d2ed9d1 100644 --- a/sockaddr.c +++ b/sockaddr.c @@ -90,3 +90,10 @@ char * get_sockaddr_buf(struct sockaddr_in *addr) get_sockaddr(ret, sizeof(ret), addr); return ret; } + +int same_sockaddr(struct sockaddr_in *a, struct sockaddr_in *b) +{ + return !((a->sin_family ^ b->sin_family) | + (a->sin_addr.s_addr ^ b->sin_addr.s_addr) | + (a->sin_port ^ b->sin_port)); +} diff --git a/sockaddr.h b/sockaddr.h index 6345285..6d1d936 100644 --- a/sockaddr.h +++ b/sockaddr.h @@ -9,4 +9,6 @@ int parse_subnet(const char *addr, struct in_addr *net, struct in_addr *mask); int get_sockaddr(char *buf, int size, struct sockaddr_in *addr); char * get_sockaddr_buf(struct sockaddr_in *addr); +int same_sockaddr(struct sockaddr_in *a, struct sockaddr_in *b); + #endif /* _SOCKADDR_H_ */