X-Git-Url: https://the.earth.li/gitweb/?p=mqtt-arp.git;a=blobdiff_plain;f=mqtt-arp.c;fp=mqtt-arp.c;h=2836366b40391dfa6d9373e8fb9e316268f91d28;hp=de0fcccea27cce24f0f2b4ffb3aeb6fcda8cc2b0;hb=939e344284056025f919de31e56ac4e7a7ea71e2;hpb=8742da72f15ac87fc3f61acaa1ad02e2964c1868 diff --git a/mqtt-arp.c b/mqtt-arp.c index de0fccc..2836366 100644 --- a/mqtt-arp.c +++ b/mqtt-arp.c @@ -16,6 +16,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#include +#include #include #include #include @@ -38,6 +40,7 @@ #define MQTT_PORT 8883 #define MQTT_TOPIC "location/by-mac" #define LOCATION "home" +#define CONFIG_FILE "/etc/mqtt-arp.conf" /* How often (in seconds) to report that we see a device */ #define REPORT_INTERVAL (2 * 60) @@ -283,6 +286,61 @@ int netlink_init(void) return sock; } +int read_config(char *file, struct ma_config *config, int *macs) +{ + FILE *f; + char line[256]; + int i; + + f = fopen(file, "r"); + if (f == NULL) + return errno; + +#define INT_OPTION(opt, var) \ + if (strncmp(line, opt " ", sizeof(opt)) == 0) { \ + var = atoi(&line[sizeof(opt)]); \ + } +#define STRING_OPTION(opt, var) \ + if (strncmp(line, opt " ", sizeof(opt)) == 0) { \ + var = strdup(&line[sizeof(opt)]); \ + } + + while (fgets(line, sizeof(line), f) != NULL) { + for (i = strlen(line) - 1; i >= 0 && isspace(line[i]); i--) + line[i] = '\0'; + if (line[0] == '\0' || line[0] == '#') + continue; + + if (strncmp(line, "mac ", 4) == 0) { + if (*macs >= MAX_MACS) { + printf("Can only accept %d MAC addresses to" + " watch for.\n", MAX_MACS); + exit(EXIT_FAILURE); + } + sscanf(&line[4], + "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", + &config->macs[*macs].mac[0], + &config->macs[*macs].mac[1], + &config->macs[*macs].mac[2], + &config->macs[*macs].mac[3], + &config->macs[*macs].mac[4], + &config->macs[*macs].mac[5]); + config->macs[*macs].valid = true; + (*macs)++; + } else + STRING_OPTION("mqtt_host", config->mqtt_host) else + INT_OPTION("mqtt_port", config->mqtt_port) else + STRING_OPTION("mqtt_user", config->mqtt_username) else + STRING_OPTION("mqtt_pass", config->mqtt_password) else + STRING_OPTION("mqtt_topic", config->mqtt_topic) else + STRING_OPTION("location", config->location) else + STRING_OPTION("capath", config->capath) + } + fclose(f); + + return 0; +} + struct option long_options[] = { { "capath", required_argument, 0, 'c' }, { "host", required_argument, 0, 'h' }, @@ -308,6 +366,9 @@ int main(int argc, char *argv[]) bzero(&config, sizeof(config)); config.mqtt_port = MQTT_PORT; + /* Read config before parsing command line */ + read_config(CONFIG_FILE, &config, &macs); + while (1) { c = getopt_long(argc, argv, "c:h:l:m:p:P:t:u:v", long_options, &option_index);