summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsr2013-01-03 20:43:40 +0100
committersr2013-01-03 20:43:40 +0100
commit6c2aa01b41cd89b13196772e5b1563c7bfe18c0d (patch)
tree6fb7cf2adb9dae3c740ad6964887e39f1e133bd2
parent[SERVER] Fix RPC_ADD_IMG (diff)
downloaddnbd3-6c2aa01b41cd89b13196772e5b1563c7bfe18c0d.tar.gz
dnbd3-6c2aa01b41cd89b13196772e5b1563c7bfe18c0d.tar.xz
dnbd3-6c2aa01b41cd89b13196772e5b1563c7bfe18c0d.zip
[SERVER] pthread_spin_lock != pthread_spin_unlock
[SERVER] Implement RPC_DEL_IMG
-rw-r--r--src/server/rpc.c18
-rw-r--r--src/server/saveload.c52
-rw-r--r--src/server/server.c1
-rw-r--r--src/server/server.h2
4 files changed, 25 insertions, 48 deletions
diff --git a/src/server/rpc.c b/src/server/rpc.c
index 1875cde..3bd4a07 100644
--- a/src/server/rpc.c
+++ b/src/server/rpc.c
@@ -484,10 +484,10 @@ static int rpc_receive(int client_sock)
++count;
dnbd3_image_t image;
memset(&image, 0, sizeof(dnbd3_image_t));
- image.config_group = (char *)XML_GETPROP(cur, "name");
- char *rid_str = (char *)XML_GETPROP(cur, "rid");
- image.file = (char *)XML_GETPROP(cur, "file");
- image.cache_file = (char *)XML_GETPROP(cur, "cache");
+ image.config_group = XML_GETPROP(cur, "name");
+ char *rid_str = XML_GETPROP(cur, "rid");
+ image.file = XML_GETPROP(cur, "file");
+ image.cache_file = XML_GETPROP(cur, "cache");
if (image.file && !file_exists(image.file))
{
printf("Image File: %s\n", image.file);
@@ -503,9 +503,19 @@ static int rpc_receive(int client_sock)
{
image.rid = atoi(rid_str);
if (cmd == RPC_ADD_IMG)
+ {
rpc_error = dnbd3_add_image(&image);
+ }
else
+ {
+ char *soft = XML_GETPROP(cur, "softdelete");
+ char *hard = XML_GETPROP(cur, "harddelete");
+ image.delete_soft = time(NULL);
+ image.delete_hard = time(NULL);
+ if (soft) image.delete_soft += atoi(soft);
+ if (hard) image.delete_hard += atoi(hard);
rpc_error = dnbd3_del_image(&image);
+ }
}
else
rpc_error = ERROR_MISSING_ARGUMENT;
diff --git a/src/server/saveload.c b/src/server/saveload.c
index c7cc544..75ee554 100644
--- a/src/server/saveload.c
+++ b/src/server/saveload.c
@@ -56,14 +56,6 @@ void dnbd3_load_config()
exit(EXIT_FAILURE);
}
- _local_namespace = g_key_file_get_string(_config_handle, "settings", "default_namespace", NULL);
- if (_local_namespace && !is_valid_namespace(_local_namespace))
- {
- memlogf("[ERROR] Ignoring default namespace: '%s' is not a valid namespace", _local_namespace);
- g_free(_local_namespace);
- _local_namespace = NULL;
- }
-
srand(time(NULL));
_rpc_password = g_key_file_get_string(_config_handle, "settings", "password", NULL);
@@ -209,8 +201,8 @@ int dnbd3_del_image(dnbd3_image_t *image)
return ERROR_IMAGE_NOT_FOUND;
}
- existing_image->delete_soft = 1; // TODO: Configurable.
- existing_image->delete_hard = time(NULL) + 86400; // TODO: Configurable
+ existing_image->delete_soft = image->delete_soft;
+ existing_image->delete_hard = image->delete_hard;
g_key_file_set_int64(_config_handle, image->config_group, "delete_soft", existing_image->delete_soft);
g_key_file_set_int64(_config_handle, image->config_group, "delete_hard", existing_image->delete_hard);
@@ -257,17 +249,8 @@ dnbd3_image_t *dnbd3_get_image(char *name_orig, int rid, const char do_lock)
dnbd3_image_t *result = NULL, *image;
GSList *iterator;
// For comparison, make sure the name is global and lowercased
- int slen;
- int islocal = (strchr(name_orig, '/') == NULL);
- if (islocal)
- slen = strlen(name_orig) + strlen(_local_namespace) + 2;
- else
- slen = strlen(name_orig) + 1;
- char name[slen];
- if (islocal)
- sprintf(name, "%s/%s", _local_namespace, name_orig);
- else
- strcpy(name, name_orig);
+ char name[strlen(name_orig) + 1];
+ strcpy(name, name_orig);
strtolower(name);
// Now find the image
if (do_lock)
@@ -326,16 +309,8 @@ static dnbd3_image_t *prepare_image(char *image_name, int rid, char *image_file,
if (slash == NULL)
{
- if (!is_valid_imagename(image_name))
- {
- memlogf("[ERROR] Invalid image name: '%s'", image_name);
- return NULL;
- }
- if (_local_namespace == NULL)
- {
- memlogf("[ERROR] Image '%s' has local name and no default namespace is defined; entry ignored.", image_name);
- return NULL;
- }
+ memlogf("[ERROR] Invalid image name: '%s'", image_name);
+ return NULL;
}
else
{
@@ -362,16 +337,7 @@ static dnbd3_image_t *prepare_image(char *image_name, int rid, char *image_file,
return NULL;
}
- if (slash == NULL)
- {
- // Local image, build global name
- image->low_name = calloc(strlen(_local_namespace) + strlen(image_name) + 2, sizeof(char));
- sprintf(image->low_name, "%s/%s", _local_namespace, image_name);
- }
- else
- {
- image->low_name = strdup(image_name);
- }
+ image->low_name = strdup(image_name);
strtolower(image->low_name);
memlogf("[INFO] Loading image '%s'", image->low_name);
@@ -568,7 +534,9 @@ void dnbd3_exec_delete(int save_if_changed)
}
}
else // Neither hard nor soft delete, keep it
+ {
delete_now = FALSE;
+ }
if (delete_now)
{
// Image was not in use and should be deleted, free it!
@@ -587,7 +555,7 @@ void dnbd3_exec_delete(int save_if_changed)
image_iterator = _dnbd3_images;
}
} // END image iteration
- pthread_spin_lock(&_spinlock);
+ pthread_spin_unlock(&_spinlock);
if (changed && save_if_changed)
dnbd3_save_config();
diff --git a/src/server/server.c b/src/server/server.c
index 0c2f37a..a020b40 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -46,7 +46,6 @@ pthread_spinlock_t _spinlock;
GSList *_dnbd3_clients = NULL;
char *_config_file_name = DEFAULT_SERVER_CONFIG_FILE;
-char *_local_namespace = NULL;
char *_rpc_password = NULL;
char *_cache_dir = NULL;
GSList *_dnbd3_images = NULL; // of dnbd3_image_t
diff --git a/src/server/server.h b/src/server/server.h
index 8fb4f21..47aa0c0 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -83,7 +83,7 @@ typedef struct
extern GSList *_dnbd3_clients; // of dnbd3_client_t
extern pthread_spinlock_t _spinlock;
-extern char *_config_file_name, *_local_namespace, *_rpc_password, *_cache_dir;
+extern char *_config_file_name, *_rpc_password, *_cache_dir;
extern GSList *_dnbd3_images; // of dnbd3_image_t
extern GSList *_trusted_servers;