+ hosts = malloc(sizeof(struct monitor_host *) * host_count);
+ for (int i=0; i < host_count; i++) {
+ /* Allocate a buffer large enough to hold the full 'section:key' string. */
+ int section_len = strlen(iniparser_getsecname(conf, i));
+ char * key_buf = malloc(section_len + 1 + MAXCONFKEYLEN + 1);
+ strcpy(key_buf, iniparser_getsecname(conf, i));
+ key_buf[section_len++] = ':';
+
+ hosts[i] = malloc(sizeof(struct monitor_host));
+ for (int k=0; k<6; k++) {
+ key_buf[section_len] = '\0'; /* Reuse the section name and colon on each pass through this loop. */
+ switch (k) {
+ case 0:
+ strncat(key_buf, "host", MAXCONFKEYLEN);
+ hosts[i]->name = strdup(iniparser_getstring(conf, key_buf, NULL));
+ break;
+ case 1:
+ strncat(key_buf, "interval", MAXCONFKEYLEN);
+ hosts[i]->ping_interval = iniparser_getint(conf, key_buf, -1);
+ break;
+ case 2:
+ strncat(key_buf, "max_delay", MAXCONFKEYLEN);
+ hosts[i]->max_delay = iniparser_getint(conf, key_buf, -1);
+ break;
+ case 3:
+ strncat(key_buf, "up_cmd", MAXCONFKEYLEN);
+ hosts[i]->up_cmd = strdup(iniparser_getstring(conf, key_buf, NULL));
+ break;
+ case 4:
+ strncat(key_buf, "down_cmd", MAXCONFKEYLEN);
+ hosts[i]->down_cmd = strdup(iniparser_getstring(conf, key_buf, NULL));
+ break;
+ case 5:
+ /* TODO: Parse for up/down/auto in start_condition. */
+ /* TODO: Do a host up/down check if necessary. */
+ hosts[i]->host_up = true;
+ break;
+ }
+ }
+ /* TODO: Do I want to make any checks for up_cmd, down_cmd, and start_condition? */
+ if (hosts[i]->name == NULL || hosts[i]->ping_interval == -1 || hosts[i]->max_delay == -1) {
+ fprintf(stderr, "ERROR: Problems parsing section %s.\n", iniparser_getsecname(conf, i));
+ exit(EXIT_FAILURE);
+ }