View | Details | Raw Unified | Return to bug 208652
Collapse All | Expand All

(-)mdns-repeater.c (-15 / +22 lines)
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);

Return to bug 208652