summaryrefslogtreecommitdiffstats
path: root/src/server/utils.c
diff options
context:
space:
mode:
authorJohann Latocha2012-02-02 01:13:50 +0100
committerJohann Latocha2012-02-02 01:13:50 +0100
commit37e4ed696b77455a738fa948b93498c8740721bc (patch)
tree14306f376ef7132d2cac1624e3aafa8dbba035b0 /src/server/utils.c
parent[SERVER] Close all client sockets on shutdown (diff)
downloaddnbd3-37e4ed696b77455a738fa948b93498c8740721bc.tar.gz
dnbd3-37e4ed696b77455a738fa948b93498c8740721bc.tar.xz
dnbd3-37e4ed696b77455a738fa948b93498c8740721bc.zip
[SERVER] Parsing config file with glib
[KERNEL] Bugfixes [CLIENT] Using vid and rid
Diffstat (limited to 'src/server/utils.c')
-rw-r--r--src/server/utils.c90
1 files changed, 61 insertions, 29 deletions
diff --git a/src/server/utils.c b/src/server/utils.c
index 3a42849..f3a4c5e 100644
--- a/src/server/utils.c
+++ b/src/server/utils.c
@@ -18,12 +18,15 @@
*
*/
+#include "server.h"
#include "utils.h"
-#include "hashtable.h"
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
void dnbd3_write_pid_file(pid_t pid)
{
@@ -65,52 +68,81 @@ void dnbd3_delete_pid_file()
}
}
-void dnbd3_load_config(char* config_file_name)
+void dnbd3_send_signal(int signum)
+{
+ pid_t pid = dnbd3_read_pid_file();
+ if (pid != 0)
+ {
+ if (kill(pid, signum) != 0)
+ {
+ printf("ERROR: dnbd3-server is not running\n");
+ dnbd3_delete_pid_file();
+ }
+ }
+ else
+ {
+ printf("ERROR: dnbd3-server is not running\n");
+ }
+}
+
+void dnbd3_load_config(char *file)
{
- dnbd3_ht_create();
- FILE *config_file = fopen(config_file_name, "r");
+ int fd;
+ gint i;
+ GKeyFile* gkf;
- if (config_file == NULL)
+ gkf = g_key_file_new();
+ if (!g_key_file_load_from_file(gkf, file, G_KEY_FILE_NONE, NULL))
{
- printf("ERROR: Config file not found: %s\n", config_file_name);
+ printf("ERROR: Config file not found: %s\n", file);
exit(EXIT_FAILURE);
}
- char line[MAX_FILE_NAME + 1 + MAX_FILE_ID];
- char* image_name = NULL;
- char* image_id = NULL;
+ gchar **groups = NULL;
+ groups = g_key_file_get_groups(gkf, &_num_images);
+ _images = calloc(_num_images, sizeof(dnbd3_image_t));
- while (fgets(line, sizeof(line), config_file) != NULL)
+ for (i = 0; i < _num_images; i++)
{
- sscanf(line, "%as %as", &image_name, &image_id);
- if (dnbd3_ht_insert(image_id, image_name) < 0)
+ _images[i].file = g_key_file_get_string(gkf, groups[i], "file", NULL);
+ _images[i].servers = g_key_file_get_string_list(gkf, groups[i], "servers", &_images[i].num, NULL);
+ _images[i].vid = g_key_file_get_integer(gkf, groups[i], "vid", NULL);
+ _images[i].rid = g_key_file_get_integer(gkf, groups[i], "rid", NULL);
+
+ fd = open(_images[i].file, O_RDONLY);
+ if (fd > 0)
+ {
+ struct stat st;
+ fstat(fd, &st);
+ _images[i].filesize = st.st_size;
+ }
+ else
{
- printf("ERROR: Image name or ID is too big\n");
- exit(EXIT_FAILURE);
+ printf("ERROR: Image not found: %s\n", _images[i].file);
}
+ close(fd);
}
- fclose(config_file);
+
+ g_strfreev(groups);
+ g_key_file_free (gkf);
}
void dnbd3_reload_config(char* config_file_name)
{
- dnbd3_ht_destroy();
+ free(_images);
+ _num_images = 0;
dnbd3_load_config(config_file_name);
}
-void dnbd3_send_signal(int signum)
+dnbd3_image_t* dnbd3_get_image(int vid, int rid)
{
- pid_t pid = dnbd3_read_pid_file();
- if (pid != 0)
- {
- if (kill(pid, signum) != 0)
- {
- printf("ERROR: dnbd3-server is not running\n");
- dnbd3_delete_pid_file();
- }
- }
- else
- {
- printf("ERROR: dnbd3-server is not running\n");
+ // TODO: find better data structure
+ dnbd3_image_t *result = NULL;
+ int i;
+ for (i = 0; i < _num_images; ++i) {
+ if (_images[i].vid == vid && _images[i].rid == rid)
+ result = &_images[i];
+
}
+ return result;
}