diff options
author | Johann Latocha | 2012-01-26 18:53:43 +0100 |
---|---|---|
committer | Johann Latocha | 2012-01-26 18:53:43 +0100 |
commit | ecd41fa1ea2b5b267e6f04170bad30b150433fc6 (patch) | |
tree | 5092f862fa50ede329e25a6e104e0cacbbe25eea /src/server/utils.c | |
parent | [KERNEL] Multi device support (diff) | |
download | dnbd3-ecd41fa1ea2b5b267e6f04170bad30b150433fc6.tar.gz dnbd3-ecd41fa1ea2b5b267e6f04170bad30b150433fc6.tar.xz dnbd3-ecd41fa1ea2b5b267e6f04170bad30b150433fc6.zip |
[SERVER] Reload configuration at runtime
Diffstat (limited to 'src/server/utils.c')
-rw-r--r-- | src/server/utils.c | 117 |
1 files changed, 117 insertions, 0 deletions
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 <johann@latocha.de> + * + * 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 <stdio.h> +#include <stdlib.h> +#include <signal.h> + +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"); + } +} |