summaryrefslogtreecommitdiffstats
path: root/src/server/utils.c
diff options
context:
space:
mode:
authorJohann Latocha2012-01-26 18:53:43 +0100
committerJohann Latocha2012-01-26 18:53:43 +0100
commitecd41fa1ea2b5b267e6f04170bad30b150433fc6 (patch)
tree5092f862fa50ede329e25a6e104e0cacbbe25eea /src/server/utils.c
parent[KERNEL] Multi device support (diff)
downloaddnbd3-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.c117
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");
+ }
+}