|
Lines 32-37
Link Here
|
| 32 |
#include <netinet/in.h> |
32 |
#include <netinet/in.h> |
| 33 |
#include <arpa/inet.h> |
33 |
#include <arpa/inet.h> |
| 34 |
#include <net/if.h> |
34 |
#include <net/if.h> |
|
|
35 |
#include <errno.h> |
| 35 |
|
36 |
|
| 36 |
#define PACKAGE "mdns-repeater" |
37 |
#define PACKAGE "mdns-repeater" |
| 37 |
#define MDNS_ADDR "224.0.0.251" |
38 |
#define MDNS_ADDR "224.0.0.251" |
|
Lines 79-85
void log_message(int loglevel, char *fmt
Link Here
|
| 79 |
static int create_recv_sock() { |
80 |
static int create_recv_sock() { |
| 80 |
int sd = socket(AF_INET, SOCK_DGRAM, 0); |
81 |
int sd = socket(AF_INET, SOCK_DGRAM, 0); |
| 81 |
if (sd < 0) { |
82 |
if (sd < 0) { |
| 82 |
log_message(LOG_ERR, "recv socket(): %m"); |
83 |
log_message(LOG_ERR, "recv socket(): %s", strerror(errno)); |
| 83 |
return sd; |
84 |
return sd; |
| 84 |
} |
85 |
} |
| 85 |
|
86 |
|
|
Lines 87-93
static int create_recv_sock() {
Link Here
|
| 87 |
|
88 |
|
| 88 |
int on = 1; |
89 |
int on = 1; |
| 89 |
if ((r = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0) { |
90 |
if ((r = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0) { |
| 90 |
log_message(LOG_ERR, "recv setsockopt(SO_REUSEADDR): %m"); |
91 |
log_message(LOG_ERR, "recv setsockopt(SO_REUSEADDR): %s", strerror(errno)); |
| 91 |
return r; |
92 |
return r; |
| 92 |
} |
93 |
} |
| 93 |
|
94 |
|
|
Lines 98-115
static int create_recv_sock() {
Link Here
|
| 98 |
serveraddr.sin_port = htons(MDNS_PORT); |
99 |
serveraddr.sin_port = htons(MDNS_PORT); |
| 99 |
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /* receive multicast */ |
100 |
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /* receive multicast */ |
| 100 |
if ((r = bind(sd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0) { |
101 |
if ((r = bind(sd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0) { |
| 101 |
log_message(LOG_ERR, "recv bind(): %m"); |
102 |
log_message(LOG_ERR, "recv bind(): %s", strerror(errno)); |
| 102 |
} |
103 |
} |
| 103 |
|
104 |
|
| 104 |
// enable loopback in case someone else needs the data |
105 |
// enable loopback in case someone else needs the data |
| 105 |
if ((r = setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, &on, sizeof(on))) < 0) { |
106 |
if ((r = setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, &on, sizeof(on))) < 0) { |
| 106 |
log_message(LOG_ERR, "recv setsockopt(IP_MULTICAST_LOOP): %m"); |
107 |
log_message(LOG_ERR, "recv setsockopt(IP_MULTICAST_LOOP): %s", strerror(errno)); |
| 107 |
return r; |
108 |
return r; |
| 108 |
} |
109 |
} |
| 109 |
|
110 |
|
| 110 |
#ifdef IP_PKTINFO |
111 |
#ifdef IP_PKTINFO |
| 111 |
if ((r = setsockopt(sd, SOL_IP, IP_PKTINFO, &on, sizeof(on))) < 0) { |
112 |
if ((r = setsockopt(sd, SOL_IP, IP_PKTINFO, &on, sizeof(on))) < 0) { |
| 112 |
log_message(LOG_ERR, "recv setsockopt(IP_PKTINFO): %m"); |
113 |
log_message(LOG_ERR, "recv setsockopt(IP_PKTINFO): %s", strerror(errno)); |
| 113 |
return r; |
114 |
return r; |
| 114 |
} |
115 |
} |
| 115 |
#endif |
116 |
#endif |
|
Lines 120-126
static int create_recv_sock() {
Link Here
|
| 120 |
static int create_send_sock(int recv_sockfd, const char *ifname, struct if_sock *sockdata) { |
121 |
static int create_send_sock(int recv_sockfd, const char *ifname, struct if_sock *sockdata) { |
| 121 |
int sd = socket(AF_INET, SOCK_DGRAM, 0); |
122 |
int sd = socket(AF_INET, SOCK_DGRAM, 0); |
| 122 |
if (sd < 0) { |
123 |
if (sd < 0) { |
| 123 |
log_message(LOG_ERR, "send socket(): %m"); |
124 |
log_message(LOG_ERR, "send socket(): %s", strerror(errno)); |
| 124 |
return sd; |
125 |
return sd; |
| 125 |
} |
126 |
} |
| 126 |
|
127 |
|
|
Lines 136-142
static int create_send_sock(int recv_soc
Link Here
|
| 136 |
|
137 |
|
| 137 |
#ifdef SO_BINDTODEVICE |
138 |
#ifdef SO_BINDTODEVICE |
| 138 |
if ((r = setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(struct ifreq))) < 0) { |
139 |
if ((r = setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(struct ifreq))) < 0) { |
| 139 |
log_message(LOG_ERR, "send setsockopt(SO_BINDTODEVICE): %m"); |
140 |
log_message(LOG_ERR, "send setsockopt(SO_BINDTODEVICE): %s", strerror(errno)); |
| 140 |
return r; |
141 |
return r; |
| 141 |
} |
142 |
} |
| 142 |
#endif |
143 |
#endif |
|
Lines 156-162
static int create_send_sock(int recv_soc
Link Here
|
| 156 |
|
157 |
|
| 157 |
int on = 1; |
158 |
int on = 1; |
| 158 |
if ((r = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0) { |
159 |
if ((r = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0) { |
| 159 |
log_message(LOG_ERR, "send setsockopt(SO_REUSEADDR): %m"); |
160 |
log_message(LOG_ERR, "send setsockopt(SO_REUSEADDR): %s", strerror(errno)); |
| 160 |
return r; |
161 |
return r; |
| 161 |
} |
162 |
} |
| 162 |
|
163 |
|
|
Lines 167-188
static int create_send_sock(int recv_soc
Link Here
|
| 167 |
serveraddr.sin_port = htons(MDNS_PORT); |
168 |
serveraddr.sin_port = htons(MDNS_PORT); |
| 168 |
serveraddr.sin_addr.s_addr = if_addr->s_addr; |
169 |
serveraddr.sin_addr.s_addr = if_addr->s_addr; |
| 169 |
if ((r = bind(sd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0) { |
170 |
if ((r = bind(sd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0) { |
| 170 |
log_message(LOG_ERR, "send bind(): %m"); |
171 |
log_message(LOG_ERR, "send bind(): %s", strerror(errno)); |
| 171 |
} |
172 |
} |
| 172 |
|
173 |
|
|
|
174 |
#if __FreeBSD__ |
| 175 |
if((r = setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, &serveraddr.sin_addr, sizeof(serveraddr.sin_addr))) < 0) { |
| 176 |
log_message(LOG_ERR, "send ip_multicast_if(): errno %d: %s", errno, strerror(errno)); |
| 177 |
} |
| 178 |
#endif |
| 179 |
|
| 173 |
// add membership to receiving socket |
180 |
// add membership to receiving socket |
| 174 |
struct ip_mreq mreq; |
181 |
struct ip_mreq mreq; |
| 175 |
memset(&mreq, 0, sizeof(struct ip_mreq)); |
182 |
memset(&mreq, 0, sizeof(struct ip_mreq)); |
| 176 |
mreq.imr_interface.s_addr = if_addr->s_addr; |
183 |
mreq.imr_interface.s_addr = if_addr->s_addr; |
| 177 |
mreq.imr_multiaddr.s_addr = inet_addr(MDNS_ADDR); |
184 |
mreq.imr_multiaddr.s_addr = inet_addr(MDNS_ADDR); |
| 178 |
if ((r = setsockopt(recv_sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) < 0) { |
185 |
if ((r = setsockopt(recv_sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) < 0) { |
| 179 |
log_message(LOG_ERR, "recv setsockopt(IP_ADD_MEMBERSHIP): %m"); |
186 |
log_message(LOG_ERR, "recv setsockopt(IP_ADD_MEMBERSHIP): %s", strerror(errno)); |
| 180 |
return r; |
187 |
return r; |
| 181 |
} |
188 |
} |
| 182 |
|
189 |
|
| 183 |
// enable loopback in case someone else needs the data |
190 |
// enable loopback in case someone else needs the data |
| 184 |
if ((r = setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, &on, sizeof(on))) < 0) { |
191 |
if ((r = setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, &on, sizeof(on))) < 0) { |
| 185 |
log_message(LOG_ERR, "send setsockopt(IP_MULTICAST_LOOP): %m"); |
192 |
log_message(LOG_ERR, "send setsockopt(IP_MULTICAST_LOOP): %s", strerror(errno)); |
| 186 |
return r; |
193 |
return r; |
| 187 |
} |
194 |
} |
| 188 |
|
195 |
|
|
Lines 249-255
static void daemonize() {
Link Here
|
| 249 |
pid_t running_pid; |
256 |
pid_t running_pid; |
| 250 |
pid_t pid = fork(); |
257 |
pid_t pid = fork(); |
| 251 |
if (pid < 0) { |
258 |
if (pid < 0) { |
| 252 |
log_message(LOG_ERR, "fork(): %m"); |
259 |
log_message(LOG_ERR, "fork(): %s", strerror(errno)); |
| 253 |
exit(1); |
260 |
exit(1); |
| 254 |
} |
261 |
} |
| 255 |
|
262 |
|
|
Lines 385-391
int main(int argc, char *argv[]) {
Link Here
|
| 385 |
|
392 |
|
| 386 |
pkt_data = malloc(PACKET_SIZE); |
393 |
pkt_data = malloc(PACKET_SIZE); |
| 387 |
if (pkt_data == NULL) { |
394 |
if (pkt_data == NULL) { |
| 388 |
log_message(LOG_ERR, "cannot malloc() packet buffer: %m"); |
395 |
log_message(LOG_ERR, "cannot malloc() packet buffer: %s", strerror(errno)); |
| 389 |
r = 1; |
396 |
r = 1; |
| 390 |
goto end_main; |
397 |
goto end_main; |
| 391 |
} |
398 |
} |
|
Lines 409-415
int main(int argc, char *argv[]) {
Link Here
|
| 409 |
ssize_t recvsize = recvfrom(server_sockfd, pkt_data, PACKET_SIZE, 0, |
416 |
ssize_t recvsize = recvfrom(server_sockfd, pkt_data, PACKET_SIZE, 0, |
| 410 |
(struct sockaddr *) &fromaddr, &sockaddr_size); |
417 |
(struct sockaddr *) &fromaddr, &sockaddr_size); |
| 411 |
if (recvsize < 0) { |
418 |
if (recvsize < 0) { |
| 412 |
log_message(LOG_ERR, "recv(): %m"); |
419 |
log_message(LOG_ERR, "recv(): %s", strerror(errno)); |
| 413 |
} |
420 |
} |
| 414 |
|
421 |
|
| 415 |
int j; |
422 |
int j; |
|
Lines 440-446
int main(int argc, char *argv[]) {
Link Here
|
| 440 |
ssize_t sentsize = send_packet(socks[j].sockfd, pkt_data, (size_t) recvsize); |
447 |
ssize_t sentsize = send_packet(socks[j].sockfd, pkt_data, (size_t) recvsize); |
| 441 |
if (sentsize != recvsize) { |
448 |
if (sentsize != recvsize) { |
| 442 |
if (sentsize < 0) |
449 |
if (sentsize < 0) |
| 443 |
log_message(LOG_ERR, "send()"); |
450 |
log_message(LOG_ERR, "send(): %s", strerror(errno)); |
| 444 |
else |
451 |
else |
| 445 |
log_message(LOG_ERR, "send_packet size differs: sent=%ld actual=%ld", |
452 |
log_message(LOG_ERR, "send_packet size differs: sent=%ld actual=%ld", |
| 446 |
recvsize, sentsize); |
453 |
recvsize, sentsize); |