X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fsocket.c;h=842d09a62f251a3f54bd6526cc65fad4c678bed8;hb=cc0a4994f07b61952a77549fffa1711014f936be;hp=8f3d89689ce190fbca21cd1469ec05d736ec0a2a;hpb=ad7b145ebe82c3a53632eaa6ec75b014d91a7bea;p=catta diff --git a/avahi-core/socket.c b/avahi-core/socket.c index 8f3d896..842d09a 100644 --- a/avahi-core/socket.c +++ b/avahi-core/socket.c @@ -48,7 +48,7 @@ static void mdns_mcast_group_ipv4(struct sockaddr_in *ret_sa) { ret_sa->sin_family = AF_INET; ret_sa->sin_port = htons(AVAHI_MDNS_PORT); - inet_pton(AF_INET, "224.0.0.251", &ret_sa->sin_addr); + inet_pton(AF_INET, AVAHI_IPV4_MCAST_GROUP, &ret_sa->sin_addr); } static void mdns_mcast_group_ipv6(struct sockaddr_in6 *ret_sa) { @@ -59,7 +59,7 @@ static void mdns_mcast_group_ipv6(struct sockaddr_in6 *ret_sa) { ret_sa->sin6_family = AF_INET6; ret_sa->sin6_port = htons(AVAHI_MDNS_PORT); - inet_pton(AF_INET6, "ff02::fb", &ret_sa->sin6_addr); + inet_pton(AF_INET6, AVAHI_IPV6_MCAST_GROUP, &ret_sa->sin6_addr); } static void ipv4_address_to_sockaddr(struct sockaddr_in *ret_sa, const AvahiIPv4Address *a, guint16 port) { @@ -84,7 +84,7 @@ static void ipv6_address_to_sockaddr(struct sockaddr_in6 *ret_sa, const AvahiIPv memcpy(&ret_sa->sin6_addr, a, sizeof(AvahiIPv6Address)); } -int avahi_mdns_mcast_join_ipv4 (int index, int fd) { +int avahi_mdns_mcast_join_ipv4(gint fd, gint idx) { struct ip_mreqn mreq; struct sockaddr_in sa; @@ -92,7 +92,7 @@ int avahi_mdns_mcast_join_ipv4 (int index, int fd) { memset(&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr = sa.sin_addr; - mreq.imr_ifindex = index; + mreq.imr_ifindex = idx; if (setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { avahi_log_warn("IP_ADD_MEMBERSHIP failed: %s\n", strerror(errno)); @@ -102,7 +102,7 @@ int avahi_mdns_mcast_join_ipv4 (int index, int fd) { return 0; } -int avahi_mdns_mcast_join_ipv6 (int index, int fd) { +int avahi_mdns_mcast_join_ipv6(gint fd, gint idx) { struct ipv6_mreq mreq6; struct sockaddr_in6 sa6; @@ -110,7 +110,7 @@ int avahi_mdns_mcast_join_ipv6 (int index, int fd) { memset(&mreq6, 0, sizeof(mreq6)); mreq6.ipv6mr_multiaddr = sa6.sin6_addr; - mreq6.ipv6mr_interface = index; + mreq6.ipv6mr_interface = idx; if (setsockopt(fd, SOL_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) { avahi_log_warn("IPV6_ADD_MEMBERSHIP failed: %s\n", strerror(errno)); @@ -120,7 +120,7 @@ int avahi_mdns_mcast_join_ipv6 (int index, int fd) { return 0; } -int avahi_mdns_mcast_leave_ipv4 (int index, int fd) { +int avahi_mdns_mcast_leave_ipv4(gint fd, gint idx) { struct ip_mreqn mreq; struct sockaddr_in sa; @@ -128,7 +128,7 @@ int avahi_mdns_mcast_leave_ipv4 (int index, int fd) { memset(&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr = sa.sin_addr; - mreq.imr_ifindex = index; + mreq.imr_ifindex = idx; if (setsockopt(fd, SOL_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { avahi_log_warn("IP_DROP_MEMBERSHIP failed: %s\n", strerror(errno)); @@ -138,7 +138,7 @@ int avahi_mdns_mcast_leave_ipv4 (int index, int fd) { return 0; } -int avahi_mdns_mcast_leave_ipv6 (int index, int fd) { +int avahi_mdns_mcast_leave_ipv6(gint fd, gint idx) { struct ipv6_mreq mreq6; struct sockaddr_in6 sa6; @@ -146,7 +146,7 @@ int avahi_mdns_mcast_leave_ipv6 (int index, int fd) { memset(&mreq6, 0, sizeof(mreq6)); mreq6.ipv6mr_multiaddr = sa6.sin6_addr; - mreq6.ipv6mr_interface = index; + mreq6.ipv6mr_interface = idx; if (setsockopt(fd, SOL_IPV6, IPV6_DROP_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) { avahi_log_warn("IPV6_DROP_MEMBERSHIP failed: %s\n", strerror(errno)); @@ -399,7 +399,7 @@ gint avahi_send_dns_packet_ipv4(gint fd, gint interface, AvahiDnsPacket *p, cons msg.msg_controllen = sizeof(cmsg_data); msg.msg_flags = 0; - return sendmsg_loop(fd, &msg, MSG_DONTROUTE); + return sendmsg_loop(fd, &msg, 0 /*MSG_DONTROUTE*/); } gint avahi_send_dns_packet_ipv6(gint fd, gint interface, AvahiDnsPacket *p, const AvahiIPv6Address *a, guint16 port) { @@ -441,10 +441,10 @@ gint avahi_send_dns_packet_ipv6(gint fd, gint interface, AvahiDnsPacket *p, cons msg.msg_controllen = sizeof(cmsg_data); msg.msg_flags = 0; - return sendmsg_loop(fd, &msg, MSG_DONTROUTE); + return sendmsg_loop(fd, &msg, 0 /*MSG_DONTROUTE*/); } -AvahiDnsPacket* avahi_recv_dns_packet_ipv4(gint fd, struct sockaddr_in *ret_sa, gint *ret_iface, guint8* ret_ttl) { +AvahiDnsPacket* avahi_recv_dns_packet_ipv4(gint fd, struct sockaddr_in *ret_sa, AvahiIPv4Address *ret_dest_address, gint *ret_iface, guint8* ret_ttl) { AvahiDnsPacket *p= NULL; struct msghdr msg; struct iovec io; @@ -452,10 +452,11 @@ AvahiDnsPacket* avahi_recv_dns_packet_ipv4(gint fd, struct sockaddr_in *ret_sa, ssize_t l; struct cmsghdr *cmsg; gboolean found_ttl = FALSE, found_iface = FALSE; - guint ms; + gint ms; g_assert(fd >= 0); g_assert(ret_sa); + g_assert(ret_dest_address); g_assert(ret_iface); g_assert(ret_ttl); @@ -486,9 +487,7 @@ AvahiDnsPacket* avahi_recv_dns_packet_ipv4(gint fd, struct sockaddr_in *ret_sa, if (ret_sa->sin_addr.s_addr == INADDR_ANY) { /* Linux 2.4 behaves very strangely sometimes! */ - avahi_hexdump(AVAHI_DNS_PACKET_DATA(p), l); - - + /*avahi_hexdump(AVAHI_DNS_PACKET_DATA(p), l); */ goto fail; } @@ -510,7 +509,9 @@ AvahiDnsPacket* avahi_recv_dns_packet_ipv4(gint fd, struct sockaddr_in *ret_sa, *ret_ttl = (uint8_t) (*(int *) CMSG_DATA(cmsg)); found_ttl = TRUE; } else if (cmsg->cmsg_type == IP_PKTINFO) { - *ret_iface = (gint) ((struct in_pktinfo*) CMSG_DATA(cmsg))->ipi_ifindex; + struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg); + *ret_iface = (gint) i->ipi_ifindex; + ret_dest_address->address = i->ipi_addr.s_addr; found_iface = TRUE; } } @@ -530,19 +531,20 @@ fail: return NULL; } -AvahiDnsPacket* avahi_recv_dns_packet_ipv6(gint fd, struct sockaddr_in6 *ret_sa, gint *ret_iface, guint8* ret_ttl) { +AvahiDnsPacket* avahi_recv_dns_packet_ipv6(gint fd, struct sockaddr_in6 *ret_sa, AvahiIPv6Address *ret_dest_address, gint *ret_iface, guint8* ret_ttl) { AvahiDnsPacket *p = NULL; struct msghdr msg; struct iovec io; uint8_t aux[64]; ssize_t l; - guint ms; + gint ms; struct cmsghdr *cmsg; gboolean found_ttl = FALSE, found_iface = FALSE; g_assert(fd >= 0); g_assert(ret_sa); + g_assert(ret_dest_address); g_assert(ret_iface); g_assert(ret_ttl); @@ -581,7 +583,9 @@ AvahiDnsPacket* avahi_recv_dns_packet_ipv6(gint fd, struct sockaddr_in6 *ret_sa, } if (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) { - *ret_iface = ((struct in6_pktinfo*) CMSG_DATA(cmsg))->ipi6_ifindex; + struct in6_pktinfo *i = (struct in6_pktinfo*) CMSG_DATA(cmsg); + *ret_iface = i->ipi6_ifindex; + memcpy(ret_dest_address->address, i->ipi6_addr.s6_addr, 16); found_iface = TRUE; } }