diff -r 2924fe4911d9 -r ee1bcad035f0 thermferm/mqtt.c --- a/thermferm/mqtt.c Fri Jul 20 21:37:45 2018 +0200 +++ b/thermferm/mqtt.c Sat Jul 21 20:40:02 2018 +0200 @@ -634,8 +634,59 @@ } payload = xstrcat(payload, (char *)"}"); } + + /* + * Find our network information + */ + FILE *f; + char line[100], *ifname, *c, ip[NI_MAXHOST]; + struct ifaddrs *ifaddr, *ifa; + int family, s; + + if (birth && (f = fopen("/proc/net/route" , "r"))) { + while (fgets(line, 100, f)) { + ifname = strtok(line , " \t"); + c = strtok(NULL , " \t"); + + // Take the entry with destination '00000000' + if (ifname != NULL && c != NULL && (strcmp(c , "00000000") == 0)) { + + if (getifaddrs(&ifaddr) == -1) { + syslog(LOG_NOTICE, "error getifaddrs error %d", errno); + goto neterr; + } + + //Walk through linked list, maintaining head pointer so we can free list later + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == NULL) { + continue; + } + + family = ifa->ifa_addr->sa_family; + + if ((strcmp( ifa->ifa_name, ifname) == 0) && (family == AF_INET)) { + s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + if (s != 0) { + syslog(LOG_NOTICE, "getnameinfo() error=%d for %s", errno, ifname); + goto neterr; + } + payload = xstrcat(payload, (char *)",\"net\":{\"address\":\""); + payload = xstrcat(payload, ip); + payload = xstrcat(payload, (char *)"\",\"ifname\":\""); + payload = xstrcat(payload, ifname); + payload = xstrcat(payload, (char *)"\",\"rssi\":0}"); + // TODO: get rssi if wlan interface. + } + } + + freeifaddrs(ifaddr); + } + } + fclose(f); + } +neterr: + payload = xstrcat(payload, (char *)"}}"); - if (birth) publisher(mosq, topic_base((char *)"NBIRTH"), payload, true); else