From 74095e535619353c24ba6628689ae43e6e896d81 Mon Sep 17 00:00:00 2001 From: Jeremy Lakeman Date: Wed, 25 Jul 2012 14:53:53 +0930 Subject: [PATCH] Correctly display interface ip addresses on android --- lsif.c | 29 ++++++++++++++--------------- overlay_interface.c | 30 +++++++++++++++--------------- serval.h | 8 ++++---- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/lsif.c b/lsif.c index 1dad378d..e2cb088a 100644 --- a/lsif.c +++ b/lsif.c @@ -93,7 +93,7 @@ int scrapeProcNetRoute() if (!(d&(~m))) { local.sin_addr.s_addr=d; broadcast.sin_addr.s_addr=d|~m; - overlay_interface_register(name,local,broadcast); + overlay_interface_register(name,&local,&broadcast); } } @@ -117,7 +117,7 @@ lsif(void) { struct ifconf ifc; int sck, nInterfaces, ofs; struct ifreq *ifr; - struct sockaddr_in local, broadcast; + struct sockaddr_in local, *broadcast; if (debug & DEBUG_OVERLAYINTERFACES) DEBUG("called"); @@ -139,7 +139,8 @@ lsif(void) { /* Iterate through the list of interfaces. */ nInterfaces = 0; ofs = 0; - while (ofs < ifc.ifc_len) { + + while (ofs < ifc.ifc_len && ofs < sizeof(buf)) { ifr = (struct ifreq *)(ifc.ifc_ifcu.ifcu_buf + ofs); ofs += _SIZEOF_ADDR_IFREQ(*ifr); @@ -149,32 +150,30 @@ lsif(void) { continue; } + bcopy(&ifr->ifr_ifru.ifru_addr, &local, sizeof(struct sockaddr_in)); + /* Get interface flags */ if (ioctl(sck, SIOCGIFFLAGS, ifr) == -1) FATAL_perror("ioctl(SIOCGIFFLAGS)"); - + /* Not broadcast? Not interested.. */ if ((ifr->ifr_ifru.ifru_flags & IFF_BROADCAST) == 0) { if (debug & DEBUG_OVERLAYINTERFACES) DEBUGF("Skipping non-broadcast address on %s", ifr->ifr_name); continue; } - + /* Get broadcast address */ if (ioctl(sck, SIOCGIFBRDADDR, ifr, sizeof(*ifr)) == -1) FATAL_perror("ioctl(SIOCGIFBRDADDR)"); - bcopy(&ifr->ifr_ifru.ifru_addr, &local, sizeof(local)); - bcopy(&ifr->ifr_ifru.ifru_broadaddr, &broadcast ,sizeof(broadcast)); + broadcast = (struct sockaddr_in *)&ifr->ifr_ifru.ifru_broadaddr; if (debug & DEBUG_OVERLAYINTERFACES) { - char addrtxt[INET_ADDRSTRLEN], bcasttxt[INET_ADDRSTRLEN]; - assert(inet_ntop(AF_INET, (const void *)&local.sin_addr, addrtxt, INET_ADDRSTRLEN) != NULL); - assert(inet_ntop(AF_INET, (const void *)&broadcast.sin_addr, bcasttxt, INET_ADDRSTRLEN) != NULL); - DEBUGF("name=%s addr=%s, broad=%s\n", - ifr->ifr_name, - addrtxt, bcasttxt); + // note, inet_ntop doesn't seem to behave on android + DEBUGF("%s address: %s", ifr->ifr_name, inet_ntoa(local.sin_addr)); + DEBUGF("%s broadcast address: %s", ifr->ifr_name, inet_ntoa(broadcast->sin_addr)); } - overlay_interface_register(ifr->ifr_name, local, broadcast); + overlay_interface_register(ifr->ifr_name, &local, broadcast); nInterfaces++; } @@ -226,7 +225,7 @@ doifaddrs(void) { DEBUGF("name=%s addr=%s broad=%s", name, addrtxt, bcasttxt); } - overlay_interface_register(name,local,broadcast); + overlay_interface_register(name,&local,&broadcast); } freeifaddrs(ifaddr); diff --git a/overlay_interface.c b/overlay_interface.c index 21c24551..aa81fd61 100644 --- a/overlay_interface.c +++ b/overlay_interface.c @@ -187,11 +187,11 @@ int overlay_interface_args(const char *arg) } int -overlay_interface_init_socket(int interface, struct sockaddr_in src_addr, struct sockaddr_in broadcast) { +overlay_interface_init_socket(int interface, struct sockaddr_in *src_addr, struct sockaddr_in *broadcast) { char srctxt[INET_ADDRSTRLEN]; #define I(X) overlay_interfaces[interface].X - I(broadcast_address) = broadcast; + bcopy(broadcast, &I(broadcast_address), sizeof(struct sockaddr_in)); I(fileP) = 0; I(alarm.poll.fd) = socket(PF_INET,SOCK_DGRAM,0); @@ -230,15 +230,15 @@ overlay_interface_init_socket(int interface, struct sockaddr_in src_addr, struct traffic on all platforms. BUT on OSX we really need a non-broadcast socket to send from, because you cannot send from a broadcast socket on OSX it seems. */ - broadcast.sin_family = AF_INET; - broadcast.sin_port = htons(I(port)); - if (bind(I(alarm.poll.fd), (struct sockaddr *)&broadcast, sizeof(broadcast))) { + I(broadcast_address.sin_family) = AF_INET; + I(broadcast_address.sin_port) = htons(I(port)); + if (bind(I(alarm.poll.fd), (const struct sockaddr *)&I(broadcast_address), sizeof(I(broadcast_address)))) { WHY_perror("bind"); WHY("MP HLR server could not bind to requested UDP port (bind() failed)"); goto error; } - assert(inet_ntop(AF_INET, (const void *)&broadcast.sin_addr, srctxt, INET_ADDRSTRLEN) != NULL); - if (debug & (DEBUG_PACKETRX | DEBUG_IO)) DEBUGF("Bound to %s:%d", srctxt, ntohs(broadcast.sin_port)); + assert(inet_ntop(AF_INET, (const void *)&I(broadcast_address.sin_addr), srctxt, INET_ADDRSTRLEN) != NULL); + if (debug & (DEBUG_PACKETRX | DEBUG_IO)) DEBUGF("Bound to %s:%d", srctxt, ntohs(I(broadcast_address.sin_port))); I(alarm.poll.events)=POLLIN; I(alarm.function) = overlay_interface_poll; @@ -261,7 +261,7 @@ overlay_interface_init_socket(int interface, struct sockaddr_in src_addr, struct #undef I } -int overlay_interface_init(char *name,struct sockaddr_in src_addr,struct sockaddr_in broadcast, +int overlay_interface_init(char *name,struct sockaddr_in *src_addr,struct sockaddr_in *broadcast, int speed_in_bits,int port,int type) { /* Too many interfaces */ @@ -554,8 +554,8 @@ int overlay_sendto(struct sockaddr_in *recipientaddr,unsigned char *bytes,int le /* Register the interface, or update the existing interface registration */ int overlay_interface_register(char *name, - struct sockaddr_in local, - struct sockaddr_in broadcast) { + struct sockaddr_in *local, + struct sockaddr_in *broadcast) { struct interface_rules *r, *me; int i; @@ -588,7 +588,7 @@ overlay_interface_register(char *name, DOC 20120608 */ if ((overlay_interfaces[i].broadcast_address.sin_addr.s_addr & 0xffffffff) - == (broadcast.sin_addr.s_addr & 0xffffffff)) { + == (broadcast->sin_addr.s_addr & 0xffffffff)) { /* Same address, mark it as being seen */ overlay_interfaces[i].observed = 1; return 0; @@ -600,8 +600,8 @@ overlay_interface_register(char *name, INFOF("Interface changed %08llx.%08llx vs %08llx.%08llx", /* overlay_interfaces[i].local_address.sin_addr.s_addr */0, overlay_interfaces[i].broadcast_address.sin_addr.s_addr, - local.sin_addr.s_addr, - broadcast.sin_addr.s_addr); + local->sin_addr.s_addr, + broadcast->sin_addr.s_addr); unwatch(&overlay_interfaces[i].alarm); close(overlay_interfaces[i].alarm.poll.fd); overlay_interfaces[i].alarm.poll.fd = -1; @@ -611,7 +611,7 @@ overlay_interface_register(char *name, } } else { /* New interface, so register it */ - if (overlay_interface_init(name,local, broadcast, me->speed_in_bits, me->port, me->type)) + if (overlay_interface_init(name, local, broadcast, me->speed_in_bits, me->port, me->type)) WHYF("Could not initialise newly seen interface %s", name); else if (debug & DEBUG_OVERLAYINTERFACES) DEBUGF("Registered interface %s", name); @@ -643,7 +643,7 @@ void overlay_interface_discover(struct sched_ent *alarm){ overlay_interfaces[i].observed = 1; else { /* New interface, so register it */ - if (overlay_interface_init(r->namespec,dummyaddr,dummyaddr, + if (overlay_interface_init(r->namespec,&dummyaddr,&dummyaddr, 1000000,PORT_DNA,OVERLAY_INTERFACE_WIFI)) { if (debug & DEBUG_OVERLAYINTERFACES) DEBUGF("Could not initialise newly seen interface %s", r->namespec); } diff --git a/serval.h b/serval.h index 6a29420f..a489e614 100644 --- a/serval.h +++ b/serval.h @@ -860,9 +860,9 @@ overlay_frame *op_dup(overlay_frame *f); long long parse_quantity(char *q); -int overlay_interface_init(char *name,struct sockaddr_in src_addr,struct sockaddr_in broadcast, +int overlay_interface_init(char *name,struct sockaddr_in *src_addr,struct sockaddr_in *broadcast, int speed_in_bits,int port,int type); -int overlay_interface_init_socket(int i,struct sockaddr_in src_addr,struct sockaddr_in broadcast); +int overlay_interface_init_socket(int i,struct sockaddr_in *src_addr,struct sockaddr_in *broadcast); long long overlay_time_until_next_tick(); int overlay_rx_messages(); @@ -1499,8 +1499,8 @@ int overlay_mdp_bind(unsigned char *localaddr,int port); int overlay_route_node_info(overlay_mdp_frame *mdp, struct sockaddr_un *addr,int addrlen); int overlay_interface_register(char *name, - struct sockaddr_in local, - struct sockaddr_in broadcast); + struct sockaddr_in *local, + struct sockaddr_in *broadcast); int overlay_queue_dump(overlay_txqueue *q); int overlay_broadcast_ensemble(int interface_number, struct sockaddr_in *recipientaddr /* NULL == broadcast */,