summaryrefslogtreecommitdiffstats
path: root/src/server/ipc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/ipc.c')
-rw-r--r--src/server/ipc.c62
1 files changed, 53 insertions, 9 deletions
diff --git a/src/server/ipc.c b/src/server/ipc.c
index b455c44..76c3ff5 100644
--- a/src/server/ipc.c
+++ b/src/server/ipc.c
@@ -336,6 +336,8 @@ static int ipc_receive(int client_sock)
}
if (!recv_data(client_sock, payload, header.size))
return 0;
+
+ docRequest = xmlReadMemory(payload, header.size, "noname.xml", NULL, 0);
}
switch (cmd)
@@ -495,15 +497,6 @@ get_info_reply_cleanup:
case IPC_ADDIMG:
case IPC_DELIMG:
- if (header.size == 0)
- {
- header.size = htonl(0);
- header.error = htonl(ERROR_MISSING_ARGUMENT);
- return_value = send_data(client_sock, &header, sizeof(header));
- break;
- }
- docRequest = xmlReadMemory(payload, header.size, "noname.xml", NULL, 0);
-
if (docRequest)
{
if (!is_password_correct(docRequest))
@@ -551,6 +544,57 @@ get_info_reply_cleanup:
return_value = send_data(client_sock, &header, sizeof(header));
break;
+ case IPC_ADDNS:
+ case IPC_DELNS:
+ if (docRequest)
+ {
+ if (!is_password_correct(docRequest))
+ {
+ header.error = htonl(ERROR_WRONG_PASSWORD);
+ header.size = htonl(0);
+ return_value = send_data(client_sock, &header, sizeof(header));
+ break;
+ }
+
+ xmlNodePtr cur = NULL;
+
+ FOR_EACH_NODE(docRequest, "/data/namespaces/namespace", cur)
+ {
+ if (cur->type != XML_ELEMENT_NODE)
+ continue;
+ NEW_POINTERLIST;
+ char *host = (char *)XML_GETPROP(cur, "server");
+ char *ns = (char *)XML_GETPROP(cur, "name");
+ char *flags = (char *)XML_GETPROP(cur, "flags");
+ char *comment = (char *)XML_GETPROP(cur, "comment");
+ pthread_spin_lock(&_spinlock);
+ if (host && ns)
+ {
+ if (cmd == IPC_ADDNS)
+ {
+ dnbd3_trusted_server_t *server = dnbd3_get_trusted_server(host, TRUE, comment);
+ if (server)
+ dnbd3_add_trusted_namespace(server, ns, flags);
+ }
+ else
+ {
+ dnbd3_trusted_server_t *server = dnbd3_get_trusted_server(host, FALSE, comment);
+ if (server)
+ dnbd3_del_trusted_namespace(server, ns);
+ }
+ }
+ pthread_spin_unlock(&_spinlock);
+ FREE_POINTERLIST;
+ } END_FOR_EACH;
+
+ }
+ else
+ header.error = htonl(ERROR_INVALID_XML);
+
+ header.size = htonl(0);
+ return_value = send_data(client_sock, &header, sizeof(header));
+ break;
+
default:
memlogf("[ERROR] Unknown IPC command: %u", (unsigned int)header.cmd);
header.size = htonl(0);