X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=mqtt-arp.c;h=71d8567e39653ca73b2fc75b5d70eebdc676ca02;hb=e6c7ebbe87ce08a21b3b5d77b82f7a03efa32e88;hp=114e0efff80889fc96e5d0fd406301893f00be38;hpb=35f4b6d147a8ab61fadc8a72118c18bd930e9160;p=mqtt-arp.git diff --git a/mqtt-arp.c b/mqtt-arp.c index 114e0ef..71d8567 100644 --- a/mqtt-arp.c +++ b/mqtt-arp.c @@ -17,6 +17,7 @@ * along with this program. If not, see . */ #include +#include #include #include #include @@ -64,6 +65,12 @@ struct ma_config { }; bool debug = false; +bool want_shutdown = false; + +void shutdown_request(int signal) +{ + want_shutdown = true; +} bool mac_compare(uint8_t *a, uint8_t *b) { @@ -167,7 +174,7 @@ void main_loop(struct ma_config *config, struct mosquitto *mosq, int sock) hdr = (struct nlmsghdr *) buf; nd = (struct ndmsg *) (hdr + 1); - while (1) { + while (!want_shutdown) { received = recv(sock, buf, sizeof(buf), 0); if (debug) { t = time(NULL); @@ -190,19 +197,20 @@ void main_loop(struct ma_config *config, struct mosquitto *mosq, int sock) nd->ndm_type); } attr = (struct nlattr *) (nd + 1); - while (attr->nla_len > 0) { - data = (((uint8_t *) attr) + 4); + while (((uint8_t *) attr - buf) < hdr->nlmsg_len) { + data = (((uint8_t *) attr) + NLA_HDRLEN); if (attr->nla_type == NDA_LLADDR && nd->ndm_state == NUD_REACHABLE) { mqtt_mac_presence(config, mosq, data, true); } - attr = (struct nlattr *) - (((uint8_t *) attr) + attr->nla_len); + attr = (struct nlattr *) (((uint8_t *) attr) + + NLA_ALIGN(attr->nla_len)); } break; case RTM_DELNEIGH: case RTM_GETNEIGH: + break; default: printf("Unknown message type: %d\n", hdr->nlmsg_type); } @@ -362,8 +370,16 @@ int main(int argc, char *argv[]) if (!config.location) config.mqtt_host = LOCATION; + signal(SIGTERM, shutdown_request); + sock = netlink_init(); mosq = mqtt_init(&config); main_loop(&config, mosq, sock); + + mosquitto_disconnect(mosq); + mosquitto_loop_stop(mosq, true); + mosquitto_destroy(mosq); + mosquitto_lib_cleanup(); + close(sock); }