X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=mqtt-arp.c;h=19da3304117ace9589b3d17cf148cf89484aaaad;hb=6121bfeaf48b68f62c814ca094f5ffb2d32b7dc2;hp=2badfac8eda176fb95ff2a978163101a5f1655a2;hpb=94ab2e9b79f7327fcbccde503b0699217634bf2c;p=mqtt-arp.git diff --git a/mqtt-arp.c b/mqtt-arp.c index 2badfac..19da330 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); @@ -280,8 +287,10 @@ struct option long_options[] = { { "host", required_argument, 0, 'h' }, { "location", required_argument, 0, 'l' }, { "mac", required_argument, 0, 'm' }, + { "password", required_argument, 0, 'P' }, { "port", required_argument, 0, 'p' }, { "topic", required_argument, 0, 't' }, + { "username", required_argument, 0, 'u' }, { "verbose", no_argument, 0, 'v' }, { 0, 0, 0, 0 } }; @@ -299,7 +308,7 @@ int main(int argc, char *argv[]) config.mqtt_port = MQTT_PORT; while (1) { - c = getopt_long(argc, argv, "c:h:l:m:p:t:v", + c = getopt_long(argc, argv, "c:h:l:m:p:P:t:u:v", long_options, &option_index); if (c == -1) @@ -335,9 +344,15 @@ int main(int argc, char *argv[]) case 'p': config.mqtt_port = atoi(optarg); break; + case 'P': + config.mqtt_password = optarg; + break; case 't': config.mqtt_topic = optarg; break; + case 'u': + config.mqtt_username = optarg; + break; case 'v': debug = true; break; @@ -354,8 +369,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); }