summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorJohann Latocha2012-02-10 23:47:32 +0100
committerJohann Latocha2012-02-10 23:47:32 +0100
commit79bb581eb0373c717d1ce95e817fd7411b07ff92 (patch)
tree79309d8030bec24bd80c7b534dc026f1ebf488c8 /src/server
parent[CLIENT] Get host by name (diff)
downloaddnbd3-79bb581eb0373c717d1ce95e817fd7411b07ff92.tar.gz
dnbd3-79bb581eb0373c717d1ce95e817fd7411b07ff92.tar.xz
dnbd3-79bb581eb0373c717d1ce95e817fd7411b07ff92.zip
[SERVER] Config reload fixed
Diffstat (limited to 'src/server')
-rw-r--r--src/server/ipc.c10
-rw-r--r--src/server/net.c45
-rw-r--r--src/server/server.c6
-rw-r--r--src/server/utils.c8
4 files changed, 39 insertions, 30 deletions
diff --git a/src/server/ipc.c b/src/server/ipc.c
index b5651ac..4adbb7e 100644
--- a/src/server/ipc.c
+++ b/src/server/ipc.c
@@ -67,8 +67,7 @@ void* dnbd3_ipc_receive()
while (1)
{
- int cmd;
- int num = 0;
+ int cmd, num = 0;
char buf[4096];
// Accept connection
@@ -114,9 +113,7 @@ void* dnbd3_ipc_receive()
break;
}
-
}
-
close(server_sock);
}
@@ -131,7 +128,6 @@ void dnbd3_ipc_send(int cmd)
perror("ERROR: IPC socket");
exit(EXIT_FAILURE);
}
-
server.sun_family = AF_UNIX;
strcpy(server.sun_path, UNIX_SOCKET);
@@ -158,15 +154,12 @@ void dnbd3_ipc_send(int cmd)
case IPC_INFO:
send(client_sock, &cmd, sizeof(int), MSG_WAITALL);
recv(client_sock, &num, sizeof(int), MSG_WAITALL);
-
printf("INFO: Number clients connected: %i\n", num);
-
for (i = 0; i < num; i++)
{
if (recv(client_sock, &buf, sizeof(buf), MSG_WAITALL) > 0)
printf("INFO: %s", buf);
}
-
break;
default:
@@ -174,6 +167,5 @@ void dnbd3_ipc_send(int cmd)
break;
}
-
close(client_sock);
}
diff --git a/src/server/net.c b/src/server/net.c
index 4f2ddfa..e4be703 100644
--- a/src/server/net.c
+++ b/src/server/net.c
@@ -41,6 +41,7 @@ void *dnbd3_handle_query(void *dnbd3_client)
dnbd3_reply_t reply;
int image_file = -1;
+ dnbd3_image_t *image;
struct in_addr server;
int i = 0;
@@ -48,13 +49,24 @@ void *dnbd3_handle_query(void *dnbd3_client)
while (recv(client->sock, &request, sizeof(dnbd3_request_t), MSG_WAITALL) > 0)
{
reply.cmd = request.cmd;
+ reply.error = 0;
memcpy(reply.handle, request.handle, sizeof(request.handle));
// TODO: lock CMD_GET_SERVERS and CMD_GET_SIZE because of reloading cfg...
+ // pthread_spin_lock(&_spinlock);
+ // pthread_spin_unlock(&_spinlock);
switch (request.cmd)
{
case CMD_GET_SERVERS:
+ if(!client->image)
+ { // configuration was reloaded, send error
+ reply.size = 0;
+ reply.error = ERROR_RELOAD;
+ send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0);
+ continue;
+ }
+
if (client->image->num_servers < MAX_NUMBER_SERVERS)
reply.size = client->image->num_servers * sizeof(struct in_addr);
else
@@ -67,30 +79,30 @@ void *dnbd3_handle_query(void *dnbd3_client)
inet_aton(client->image->servers[i], &server);
send(client->sock, (char *) &server, sizeof(struct in_addr), 0);
}
- break;
+ continue;
case CMD_GET_SIZE:
- pthread_spin_lock(&_spinlock); // because of reloading config
- dnbd3_image_t *image = dnbd3_get_image(request.vid, request.rid);
- pthread_spin_unlock(&_spinlock);
- if (image)
- {
- image_file = open(image->file, O_RDONLY);
- reply.size = sizeof(uint64_t);
- client->image = image;
- }
- else
- {
+ image = dnbd3_get_image(request.vid, request.rid);
+
+ if(!image)
+ { // image not found, send error
printf("ERROR: Client requested an unknown image id.\n");
reply.size = 0;
+ reply.error = ERROR_SIZE;
+ send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0);
+ continue;
}
+
+ image_file = open(image->file, O_RDONLY);
+ reply.size = sizeof(uint64_t);
+ client->image = image;
send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0);
send(client->sock, &image->filesize, sizeof(uint64_t), 0);
- break;
+ continue;
case CMD_GET_BLOCK:
if (image_file < 0)
- break;
+ continue;
reply.size = request.size;
send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0);
@@ -98,11 +110,12 @@ void *dnbd3_handle_query(void *dnbd3_client)
if (sendfile(client->sock, image_file, (off_t *) &request.offset, request.size) < 0)
printf("ERROR: sendfile returned -1\n");
- break;
+ continue;
default:
printf("ERROR: Unknown command\n");
- break;
+ continue;
+
}
}
diff --git a/src/server/server.c b/src/server/server.c
index a767ed6..786cc40 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -110,10 +110,8 @@ int main(int argc, char* argv[])
demonize = 0;
break;
case 'r':
- 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);
+ 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/utils.c b/src/server/utils.c
index 3a9215e..3091b2f 100644
--- a/src/server/utils.c
+++ b/src/server/utils.c
@@ -72,8 +72,14 @@ void dnbd3_load_config(char *file)
void dnbd3_reload_config(char* config_file_name)
{
- free(_images);
_num_images = 0;
+ GSList *iterator = NULL;
+ for (iterator = _dnbd3_clients; iterator; iterator = iterator->next)
+ {
+ dnbd3_client_t *client = iterator->data;
+ client->image = NULL;
+ }
+ free(_images);
dnbd3_load_config(config_file_name);
}