/* qotdserver Copyright (C) 2019 Richard Knight This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include "ini.h" #include "qotdserver.h" #include "logger.h" void signal_handler(int sig){ switch(sig){ case SIGTERM: clean_db(); write_log("SIGTERM received"); close_logger(); exit(0); break; case SIGKILL: clean_db(); write_log("SIGKILL received"); close_logger(); exit(0); break; } } static int config_handler(void *user, const char *section, const char *name, const char *value) { Config *cnf = (Config*)user; #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0 if (MATCH("database", "user")) { cnf->db_user = strdup(value); } else if (MATCH("database", "password")) { cnf->db_pass = strdup(value); } else if (MATCH("database", "host")) { cnf->db_host = strdup(value); } else if (MATCH("database", "name")) { cnf->db_name = strdup(value); } else if (MATCH("general", "daily")) { cnf->daily = atoi(value); } else { return 0; } return 1; } int main(int argc, char** argv) { signal(SIGTERM, signal_handler); signal(SIGKILL, signal_handler); char *conf_path = "/etc/qotdserver.conf"; if (ini_parse(conf_path, config_handler, &config) < 0) { printf("Can't load configuration file %s\n", conf_path); return (EXIT_FAILURE); } if (!init_logger(&config)) { printf("Can't open log file for writing\n"); return (EXIT_FAILURE); } if (!db_connect(&config)) { return (EXIT_FAILURE); } write_log("Starting server"); daemon(0, 0); serve(); }