summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorJohann Latocha2012-02-08 21:26:47 +0100
committerJohann Latocha2012-02-08 21:26:47 +0100
commitf7e732e0ab494627666f3affe23622729bd637d7 (patch)
tree453315fec18665f9595b1a2f8bf80a1e7f641060 /src/server
parent[ALL] Request latest available rid (diff)
downloaddnbd3-f7e732e0ab494627666f3affe23622729bd637d7.tar.gz
dnbd3-f7e732e0ab494627666f3affe23622729bd637d7.tar.xz
dnbd3-f7e732e0ab494627666f3affe23622729bd637d7.zip
[ALL] Refactoring
[ALL] Send and receive servers [TODO] Config file reloading is broken
Diffstat (limited to 'src/server')
-rw-r--r--src/server/net.c40
-rw-r--r--src/server/server.c6
-rw-r--r--src/server/server.h4
-rw-r--r--src/server/utils.c5
4 files changed, 38 insertions, 17 deletions
diff --git a/src/server/net.c b/src/server/net.c
index f49305b..4f2ddfa 100644
--- a/src/server/net.c
+++ b/src/server/net.c
@@ -29,6 +29,7 @@
#include <sys/sendfile.h>
#include <sys/types.h>
#include <netinet/in.h>
+#include <arpa/inet.h>
#include "server.h"
#include "utils.h"
@@ -36,20 +37,36 @@
void *dnbd3_handle_query(void *dnbd3_client)
{
dnbd3_client_t *client = (dnbd3_client_t *) (uintptr_t) dnbd3_client;
- int image_file = -1;
dnbd3_request_t request;
dnbd3_reply_t reply;
- uint16_t cmd;
+
+ int image_file = -1;
+
+ struct in_addr server;
+ int i = 0;
while (recv(client->sock, &request, sizeof(dnbd3_request_t), MSG_WAITALL) > 0)
{
- cmd = request.cmd;
- switch (cmd)
+ reply.cmd = request.cmd;
+ memcpy(reply.handle, request.handle, sizeof(request.handle));
+
+ // TODO: lock CMD_GET_SERVERS and CMD_GET_SIZE because of reloading cfg...
+
+ switch (request.cmd)
{
- case CMD_PING:
- reply.cmd = request.cmd;
- memcpy(reply.handle, request.handle, sizeof(request.handle));
+ case CMD_GET_SERVERS:
+ if (client->image->num_servers < MAX_NUMBER_SERVERS)
+ reply.size = client->image->num_servers * sizeof(struct in_addr);
+ else
+ reply.size = MAX_NUMBER_SERVERS * sizeof(struct in_addr);
+
send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0);
+
+ for (i = 0; i < client->image->num_servers && i < MAX_NUMBER_SERVERS; i++)
+ {
+ inet_aton(client->image->servers[i], &server);
+ send(client->sock, (char *) &server, sizeof(struct in_addr), 0);
+ }
break;
case CMD_GET_SIZE:
@@ -59,24 +76,23 @@ void *dnbd3_handle_query(void *dnbd3_client)
if (image)
{
image_file = open(image->file, O_RDONLY);
- reply.filesize = image->filesize;
+ reply.size = sizeof(uint64_t);
client->image = image;
}
else
{
printf("ERROR: Client requested an unknown image id.\n");
- reply.filesize = 0;
+ reply.size = 0;
}
- reply.cmd = request.cmd;
send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0);
+ send(client->sock, &image->filesize, sizeof(uint64_t), 0);
break;
case CMD_GET_BLOCK:
if (image_file < 0)
break;
- reply.cmd = request.cmd;
- memcpy(reply.handle, request.handle, sizeof(request.handle));
+ reply.size = request.size;
send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0);
if (sendfile(client->sock, image_file, (off_t *) &request.offset, request.size) < 0)
diff --git a/src/server/server.c b/src/server/server.c
index bd09115..a767ed6 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -110,8 +110,10 @@ int main(int argc, char* argv[])
demonize = 0;
break;
case 'r':
- printf("INFO: Reloading configuration file...\n");
- dnbd3_ipc_send(IPC_RELOAD);
+ printf("ERROR: Buggy, do not use...\n");
+ // FIXME: segfault in dnbd3_handle_query because of free(_images)
+ // printf("INFO: Reloading configuration file...\n");
+ // dnbd3_ipc_send(IPC_RELOAD);
return EXIT_SUCCESS;
case 's':
printf("INFO: Stopping running server...\n");
diff --git a/src/server/server.h b/src/server/server.h
index dd8584c..02da005 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -31,9 +31,9 @@
typedef struct
{
char *file;
- off_t filesize;
+ uint64_t filesize;
+ size_t num_servers;
char **servers;
- size_t num;
int vid;
int rid;
} dnbd3_image_t;
diff --git a/src/server/utils.c b/src/server/utils.c
index 34da129..3a9215e 100644
--- a/src/server/utils.c
+++ b/src/server/utils.c
@@ -45,10 +45,13 @@ void dnbd3_load_config(char *file)
for (i = 0; i < _num_images; i++)
{
_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].servers = g_key_file_get_string_list(gkf, groups[i], "servers", &_images[i].num_servers, 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);
+ if (_images[i].num_servers > MAX_NUMBER_SERVERS)
+ printf("WARN: Max allowed servers %i\n", MAX_NUMBER_SERVERS);
+
fd = open(_images[i].file, O_RDONLY);
if (fd > 0)
{