X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=sidebyside;f=socket.c;h=1ef8131334df394d460dd5145091e75f6285bc17;hb=7dce450bdc23ea306a61e00f914481e29ebcb176;hp=54433d6e026042fd54cbf3561dacc73c1913cb43;hpb=c8dd2dc8f91a322178c43281cbc5c8fc16da5219;p=catta diff --git a/socket.c b/socket.c index 54433d6..1ef8131 100644 --- a/socket.c +++ b/socket.c @@ -13,8 +13,7 @@ #include "dns.h" #include "util.h" - -#define MDNS_PORT 5353 +#include "socket.h" static void mdns_mcast_group_ipv4(struct sockaddr_in *ret_sa) { g_assert(ret_sa); @@ -22,16 +21,100 @@ static void mdns_mcast_group_ipv4(struct sockaddr_in *ret_sa) { memset(ret_sa, 0, sizeof(struct sockaddr_in)); ret_sa->sin_family = AF_INET; - ret_sa->sin_port = htons(MDNS_PORT); + ret_sa->sin_port = htons(AVAHI_MDNS_PORT); inet_pton(AF_INET, "224.0.0.251", &ret_sa->sin_addr); } -gint flx_open_socket_ipv4(void) { - struct ip_mreqn mreq; +static void mdns_mcast_group_ipv6(struct sockaddr_in6 *ret_sa) { + + g_assert(ret_sa); + + memset(ret_sa, 0, sizeof(struct sockaddr_in6)); + + ret_sa->sin6_family = AF_INET6; + ret_sa->sin6_port = htons(AVAHI_MDNS_PORT); + inet_pton(AF_INET6, "ff02::fb", &ret_sa->sin6_addr); +} + +int avahi_mdns_mcast_join_ipv4 (int index, int fd) +{ + struct ip_mreqn mreq; + struct sockaddr_in sa; + + mdns_mcast_group_ipv4 (&sa); + + memset(&mreq, 0, sizeof(mreq)); + mreq.imr_multiaddr = sa.sin_addr; + mreq.imr_ifindex = index; + + if (setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { + g_warning("IP_ADD_MEMBERSHIP failed: %s\n", strerror(errno)); + return -1; + } + + return 0; +} + +int avahi_mdns_mcast_join_ipv6 (int index, int fd) +{ + struct ipv6_mreq mreq6; + struct sockaddr_in6 sa6; + + mdns_mcast_group_ipv6 (&sa6); + + memset(&mreq6, 0, sizeof(mreq6)); + mreq6.ipv6mr_multiaddr = sa6.sin6_addr; + mreq6.ipv6mr_interface = index; + + if (setsockopt(fd, SOL_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) { + g_warning("IPV6_ADD_MEMBERSHIP failed: %s\n", strerror(errno)); + return -1; + } + + return 0; +} + +int avahi_mdns_mcast_leave_ipv4 (int index, int fd) +{ + struct ip_mreqn mreq; + struct sockaddr_in sa; + + mdns_mcast_group_ipv4 (&sa); + + memset(&mreq, 0, sizeof(mreq)); + mreq.imr_multiaddr = sa.sin_addr; + mreq.imr_ifindex = index; + + if (setsockopt(fd, SOL_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { + g_warning("IP_DROP_MEMBERSHIP failed: %s\n", strerror(errno)); + return -1; + } + + return 0; +} + +int avahi_mdns_mcast_leave_ipv6 (int index, int fd) +{ + struct ipv6_mreq mreq6; + struct sockaddr_in6 sa6; + + mdns_mcast_group_ipv6 (&sa6); + + memset(&mreq6, 0, sizeof(mreq6)); + mreq6.ipv6mr_multiaddr = sa6.sin6_addr; + mreq6.ipv6mr_interface = index; + + if (setsockopt(fd, SOL_IPV6, IPV6_DROP_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) { + g_warning("IPV6_DROP_MEMBERSHIP failed: %s\n", strerror(errno)); + return -1; + } + + return 0; +} + +gint avahi_open_socket_ipv4(void) { struct sockaddr_in sa, local; int fd = -1, ttl, yes; - - mdns_mcast_group_ipv4(&sa); if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { g_warning("socket() failed: %s\n", strerror(errno)); @@ -65,23 +148,13 @@ gint flx_open_socket_ipv4(void) { memset(&local, 0, sizeof(local)); local.sin_family = AF_INET; - local.sin_port = htons(MDNS_PORT); + local.sin_port = htons(AVAHI_MDNS_PORT); if (bind(fd, (struct sockaddr*) &local, sizeof(local)) < 0) { g_warning("bind() failed: %s\n", strerror(errno)); goto fail; } - memset(&mreq, 0, sizeof(mreq)); - mreq.imr_multiaddr = sa.sin_addr; - mreq.imr_address.s_addr = htonl(INADDR_ANY); - mreq.imr_ifindex = 0; - - if (setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { - g_warning("IP_ADD_MEMBERSHIP failed: %s\n", strerror(errno)); - goto fail; - } - yes = 1; if (setsockopt(fd, SOL_IP, IP_RECVTTL, &yes, sizeof(yes)) < 0) { g_warning("IP_RECVTTL failed: %s\n", strerror(errno)); @@ -94,12 +167,12 @@ gint flx_open_socket_ipv4(void) { goto fail; } - if (flx_set_cloexec(fd) < 0) { + if (avahi_set_cloexec(fd) < 0) { g_warning("FD_CLOEXEC failed: %s\n", strerror(errno)); goto fail; } - if (flx_set_nonblock(fd) < 0) { + if (avahi_set_nonblock(fd) < 0) { g_warning("O_NONBLOCK failed: %s\n", strerror(errno)); goto fail; } @@ -113,19 +186,7 @@ fail: return -1; } -static void mdns_mcast_group_ipv6(struct sockaddr_in6 *ret_sa) { - g_assert(ret_sa); - - memset(ret_sa, 0, sizeof(struct sockaddr_in6)); - - ret_sa->sin6_family = AF_INET6; - ret_sa->sin6_port = htons(MDNS_PORT); - inet_pton(AF_INET6, "ff02::fb", &ret_sa->sin6_addr); -} - - -gint flx_open_socket_ipv6(void) { - struct ipv6_mreq mreq; +gint avahi_open_socket_ipv6(void) { struct sockaddr_in6 sa, local; int fd = -1, ttl, yes; @@ -168,22 +229,13 @@ gint flx_open_socket_ipv6(void) { memset(&local, 0, sizeof(local)); local.sin6_family = AF_INET6; - local.sin6_port = htons(MDNS_PORT); + local.sin6_port = htons(AVAHI_MDNS_PORT); if (bind(fd, (struct sockaddr*) &local, sizeof(local)) < 0) { g_warning("bind() failed: %s\n", strerror(errno)); goto fail; } - memset(&mreq, 0, sizeof(mreq)); - mreq.ipv6mr_multiaddr = sa.sin6_addr; - mreq.ipv6mr_interface = 0; - - if (setsockopt(fd, SOL_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { - g_warning("IPV6_ADD_MEMBERSHIP failed: %s\n", strerror(errno)); - goto fail; - } - yes = 1; if (setsockopt(fd, SOL_IPV6, IPV6_HOPLIMIT, &yes, sizeof(yes)) < 0) { g_warning("IPV6_HOPLIMIT failed: %s\n", strerror(errno)); @@ -196,12 +248,12 @@ gint flx_open_socket_ipv6(void) { goto fail; } - if (flx_set_cloexec(fd) < 0) { + if (avahi_set_cloexec(fd) < 0) { g_warning("FD_CLOEXEC failed: %s\n", strerror(errno)); goto fail; } - if (flx_set_nonblock(fd) < 0) { + if (avahi_set_nonblock(fd) < 0) { g_warning("O_NONBLOCK failed: %s\n", strerror(errno)); goto fail; } @@ -229,14 +281,14 @@ static gint sendmsg_loop(gint fd, struct msghdr *msg, gint flags) { return -1; } - if (flx_wait_for_write(fd) < 0) + if (avahi_wait_for_write(fd) < 0) return -1; } return 0; } -gint flx_send_dns_packet_ipv4(gint fd, gint interface, flxDnsPacket *p) { +gint avahi_send_dns_packet_ipv4(gint fd, gint interface, AvahiDnsPacket *p) { struct sockaddr_in sa; struct msghdr msg; struct iovec io; @@ -247,12 +299,12 @@ gint flx_send_dns_packet_ipv4(gint fd, gint interface, flxDnsPacket *p) { g_assert(fd >= 0); g_assert(p); - g_assert(flx_dns_packet_check_valid(p) >= 0); + g_assert(avahi_dns_packet_check_valid(p) >= 0); mdns_mcast_group_ipv4(&sa); memset(&io, 0, sizeof(io)); - io.iov_base = FLX_DNS_PACKET_DATA(p); + io.iov_base = AVAHI_DNS_PACKET_DATA(p); io.iov_len = p->size; memset(cmsg_data, 0, sizeof(cmsg_data)); @@ -276,7 +328,7 @@ gint flx_send_dns_packet_ipv4(gint fd, gint interface, flxDnsPacket *p) { return sendmsg_loop(fd, &msg, MSG_DONTROUTE); } -gint flx_send_dns_packet_ipv6(gint fd, gint interface, flxDnsPacket *p) { +gint avahi_send_dns_packet_ipv6(gint fd, gint interface, AvahiDnsPacket *p) { struct sockaddr_in6 sa; struct msghdr msg; struct iovec io; @@ -287,12 +339,12 @@ gint flx_send_dns_packet_ipv6(gint fd, gint interface, flxDnsPacket *p) { g_assert(fd >= 0); g_assert(p); - g_assert(flx_dns_packet_check_valid(p) >= 0); + g_assert(avahi_dns_packet_check_valid(p) >= 0); mdns_mcast_group_ipv6(&sa); memset(&io, 0, sizeof(io)); - io.iov_base = FLX_DNS_PACKET_DATA(p); + io.iov_base = AVAHI_DNS_PACKET_DATA(p); io.iov_len = p->size; memset(cmsg_data, 0, sizeof(cmsg_data)); @@ -316,8 +368,8 @@ gint flx_send_dns_packet_ipv6(gint fd, gint interface, flxDnsPacket *p) { return sendmsg_loop(fd, &msg, MSG_DONTROUTE); } -flxDnsPacket* flx_recv_dns_packet_ipv4(gint fd, struct sockaddr_in *ret_sa, gint *ret_iface, guint8* ret_ttl) { - flxDnsPacket *p= NULL; +AvahiDnsPacket* avahi_recv_dns_packet_ipv4(gint fd, struct sockaddr_in *ret_sa, gint *ret_iface, guint8* ret_ttl) { + AvahiDnsPacket *p= NULL; struct msghdr msg; struct iovec io; uint8_t aux[64]; @@ -330,9 +382,9 @@ flxDnsPacket* flx_recv_dns_packet_ipv4(gint fd, struct sockaddr_in *ret_sa, gint g_assert(ret_iface); g_assert(ret_ttl); - p = flx_dns_packet_new(0); + p = avahi_dns_packet_new(0); - io.iov_base = FLX_DNS_PACKET_DATA(p); + io.iov_base = AVAHI_DNS_PACKET_DATA(p); io.iov_len = p->max_size; memset(&msg, 0, sizeof(msg)); @@ -370,13 +422,13 @@ flxDnsPacket* flx_recv_dns_packet_ipv4(gint fd, struct sockaddr_in *ret_sa, gint fail: if (p) - flx_dns_packet_free(p); + avahi_dns_packet_free(p); return NULL; } -flxDnsPacket* flx_recv_dns_packet_ipv6(gint fd, struct sockaddr_in6 *ret_sa, gint *ret_iface, guint8* ret_ttl) { - flxDnsPacket *p = NULL; +AvahiDnsPacket* avahi_recv_dns_packet_ipv6(gint fd, struct sockaddr_in6 *ret_sa, gint *ret_iface, guint8* ret_ttl) { + AvahiDnsPacket *p = NULL; struct msghdr msg; struct iovec io; uint8_t aux[64]; @@ -389,9 +441,9 @@ flxDnsPacket* flx_recv_dns_packet_ipv6(gint fd, struct sockaddr_in6 *ret_sa, gin g_assert(ret_iface); g_assert(ret_ttl); - p = flx_dns_packet_new(0); + p = avahi_dns_packet_new(0); - io.iov_base = FLX_DNS_PACKET_DATA(p); + io.iov_base = AVAHI_DNS_PACKET_DATA(p); io.iov_len = p->max_size; memset(&msg, 0, sizeof(msg)); @@ -429,7 +481,7 @@ flxDnsPacket* flx_recv_dns_packet_ipv6(gint fd, struct sockaddr_in6 *ret_sa, gin fail: if (p) - flx_dns_packet_free(p); + avahi_dns_packet_free(p); return NULL; }