diff options
author | Johann Latocha | 2012-02-08 21:26:47 +0100 |
---|---|---|
committer | Johann Latocha | 2012-02-08 21:26:47 +0100 |
commit | f7e732e0ab494627666f3affe23622729bd637d7 (patch) | |
tree | 453315fec18665f9595b1a2f8bf80a1e7f641060 /src/server | |
parent | [ALL] Request latest available rid (diff) | |
download | dnbd3-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.c | 40 | ||||
-rw-r--r-- | src/server/server.c | 6 | ||||
-rw-r--r-- | src/server/server.h | 4 | ||||
-rw-r--r-- | src/server/utils.c | 5 |
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) { |