From ecd41fa1ea2b5b267e6f04170bad30b150433fc6 Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Thu, 26 Jan 2012 18:53:43 +0100 Subject: [SERVER] Reload configuration at runtime --- src/server/utils.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/server/utils.c (limited to 'src/server/utils.c') diff --git a/src/server/utils.c b/src/server/utils.c new file mode 100644 index 0000000..e0bbecf --- /dev/null +++ b/src/server/utils.c @@ -0,0 +1,117 @@ +/* + * This file is part of the Distributed Network Block Device 3 + * + * Copyright(c) 2011-2012 Johann Latocha + * + * This file may be licensed under the terms of of the + * GNU General Public License Version 2 (the ``GPL''). + * + * Software distributed under the License is distributed + * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + * express or implied. See the GPL for the specific language + * governing rights and limitations. + * + * You should have received a copy of the GPL along with this + * program. If not, go to http://www.gnu.org/licenses/gpl.html + * or write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "utils.h" +#include "hashtable.h" + +#include +#include +#include + +void write_pid_file(pid_t pid) +{ + FILE *f = fopen(SERVER_PID_FILE, "w"); + if(f != NULL) + { + fprintf(f, "%i", pid); + fclose(f); + } + else + { + printf("ERROR: Couldn't write pid file (%s).\n", SERVER_PID_FILE); + } +} + +pid_t read_pid_file() +{ + pid_t pid = 0; + + FILE *f = fopen(SERVER_PID_FILE, "r"); + if(f != NULL) + { + fscanf(f, "%i", &pid); + fclose(f); + } + else + { + printf("ERROR: Couldn't read pid file (%s).\n", SERVER_PID_FILE); + } + + return pid; +} + +void delete_pid_file() +{ + if (unlink(SERVER_PID_FILE) != 0) + { + printf("ERROR: Couldn't delete pid file (%s).\n", SERVER_PID_FILE); + } +} + + +void load_config(char* config_file_name) +{ + ht_create(); + FILE *config_file = fopen(config_file_name, "r"); + + if (config_file == NULL) + { + printf("ERROR: Config file not found: %s\n", config_file_name); + exit(EXIT_FAILURE); + } + + char line[MAX_FILE_NAME + 1 + MAX_FILE_ID]; + char* image_name = NULL; + char* image_id = NULL; + + while (fgets(line, sizeof(line), config_file) != NULL) + { + sscanf(line, "%as %as", &image_name, &image_id); + if (ht_insert(image_id, image_name) < 0) + { + printf("ERROR: Image name or ID is too big\n"); + exit(EXIT_FAILURE); + } + } + fclose(config_file); +} + +void reload_config(char* config_file_name) +{ + ht_destroy(); + load_config(config_file_name); +} + +void send_signal(int signum) +{ + pid_t pid = read_pid_file(); + if (pid != 0) + { + if (kill(pid, signum) != 0) + { + printf("ERROR: dnbd3-server is not running\n"); + delete_pid_file(); + } + } + else + { + printf("ERROR: dnbd3-server is not running\n"); + } +} -- cgit v1.2.3-55-g7522