forked from koreader/koreader-base
-
Notifications
You must be signed in to change notification settings - Fork 0
/
zbeacon.patch
48 lines (44 loc) · 2.11 KB
/
zbeacon.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
diff --git a/src/zbeacon.c b/src/zbeacon.c
index 249c37c..7c5bc47 100644
--- a/src/zbeacon.c
+++ b/src/zbeacon.c
@@ -324,6 +324,7 @@ typedef struct {
zframe_t *transmit; // Beacon transmit data
zframe_t *filter; // Beacon filter data
inaddr_t address; // Our own address
+ inaddr_t netmask; // Our own netmask
inaddr_t broadcast; // Our broadcast address
} agent_t;
@@ -471,6 +472,13 @@ s_get_interface (agent_t *self)
self->broadcast.sin_addr.s_addr
|= ~(((inaddr_t *) interface->ifa_netmask)->sin_addr.s_addr);
+ // If the returned broadcast address is the limited broadcast
+ // address, build the broadcast address from the source
+ // address and netmask.
+ if (self->broadcast.sin_addr.s_addr == INADDR_BROADCAST)
+ self->broadcast.sin_addr.s_addr = self->address.sin_addr.s_addr
+ | ~(((inaddr_t *) interface->ifa_netmask)->sin_addr.s_addr);
+
// Keep track of the number of interfaces on this host
if (self->address.sin_addr.s_addr != ntohl (INADDR_LOOPBACK))
num_interfaces++;
@@ -535,6 +543,21 @@ s_get_interface (agent_t *self)
zsys_socket_error ("siocgifbrdaddr");
memcpy (&self->broadcast, ((inaddr_t *) &ifr.ifr_broadaddr), sizeof (inaddr_t));
+
+ self->broadcast.sin_port = htons (self->port_nbr);
+
+ // If the returned broadcast address is the limited broadcast
+ // address, build the broadcast address from the source
+ // address and netmask.
+ if (self->broadcast.sin_addr.s_addr == INADDR_BROADCAST) {
+ rc = ioctl (sock, SIOCGIFNETMASK, (caddr_t) &ifr, sizeof (struct ifreq));
+ if (rc == -1)
+ zsys_socket_error ("siocgifnetmask");
+ memcpy (&self->netmask, ((inaddr_t *) &ifr.ifr_netmask), sizeof (inaddr_t));
+ self->broadcast.sin_addr.s_addr = self->address.sin_addr.s_addr
+ | ~(self->netmask.sin_addr.s_addr);
+ }
+
close (sock);
# elif defined (__WINDOWS__)