//=-------------------------------------------------------------------------=// // Main // // // // Copyright © 2021 The Gem-graph Project // // // // This file is part of gem-graph. // // // // This program is free software: you can redistribute it and/or modify // // it under the terms of the GNU Affero 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 Affero General Public License for more details. // // // // You should have received a copy of the GNU Affero General Public License // // along with this program. If not, see . // //=-------------------------------------------------------------------------=// #include "../include/base.h" #include "../include/server.h" #include "../include/model.h" /* -------------------------------------------------------------------------- */ static Server_t *server; static void SigIntTermHandler(int signum) { server->pleaseStop = true; printLog("Server stopping\n"); ModelShutdown(); printLog("All model shutted down\n"); } // TODO parse args to discover : // - config files directory // - models & users directories int main(int argc, char **argv) { int options; time_t t; int returnValue = 0; Parameters_t *parameters; // Get parameters TODO from args parameters = (Parameters_t*) calloc(sizeof(Parameters_t), 1); while ((options = getopt(argc, argv, ":C:M:U:")) != -1) { switch (options) { case 'C': printLog("Config : %s\n", optarg); parameters->configDir = (char*) malloc(strlen(optarg) + 1); strcpy(parameters->configDir, optarg); break; case 'M': printLog("Models : %s\n", optarg); parameters->modelDir = (char*) malloc(strlen(optarg) + 1); strcpy(parameters->modelDir, optarg); break; case 'U': printLog("User : %s\n", optarg); parameters->userDir = (char*) malloc(strlen(optarg) + 1); strcpy(parameters->userDir, optarg); break; case ':': printLog("Option missing argument : %c\n", optopt); if (parameters->configDir) free(parameters->configDir); if (parameters->modelDir) free(parameters->modelDir); if (parameters->userDir) free(parameters->userDir); free(parameters); return ENOSYS; break; case '?': printLog("Unknown option : %c\n", optopt); if (parameters->configDir) free(parameters->configDir); if (parameters->modelDir) free(parameters->modelDir); if (parameters->userDir) free(parameters->userDir); free(parameters); return ENOSYS; break; } } if (!parameters->configDir | !parameters->modelDir | !parameters->userDir) { printLog("Missing arguments\n"); if (parameters->configDir) free(parameters->configDir); if (parameters->modelDir) free(parameters->modelDir); if (parameters->userDir) free(parameters->userDir); free(parameters); return ENOSYS; } // Go! printLog("Starting gem-graph-server...\n"); // Register new interrupt handler signal(SIGINT, SigIntTermHandler); signal(SIGTERM, SigIntTermHandler); // Initializing random generator t = time(&t); srand((unsigned) t); server = (Server_t*) calloc(1, sizeof(Server_t)); // Initializing model system ModelSystemInit(parameters); // Launching server ServerInit(server); // Waiting for termination ServerWait(server); // Exiting returnValue |= server->returnValue; ModelSystemDestroy(); free(server); server = NULL; free(parameters->userDir); free(parameters->modelDir); free(parameters->configDir); free(parameters); parameters = NULL; return returnValue; }