diff options
author | Lars Müller | 2008-03-01 19:30:38 +0100 |
---|---|---|
committer | Lars Müller | 2008-03-01 19:30:38 +0100 |
commit | 93b9103f7383d400616d222606c294e07b16e1aa (patch) | |
tree | 611a39f7bc1d1dd5a4335157ef95c101d64dddc8 /server/query.c | |
download | dnbd2-93b9103f7383d400616d222606c294e07b16e1aa.tar.gz dnbd2-93b9103f7383d400616d222606c294e07b16e1aa.tar.xz dnbd2-93b9103f7383d400616d222606c294e07b16e1aa.zip |
Import dnbd* from the former openslx-contrib repo as of revision 92.
openslx-contrib is currently read only and will get removed in some
days.
git-svn-id: http://svn.openslx.org/svn/openslx/contrib/dnbd2/trunk@1592 95ad53e4-c205-0410-b2fa-d234c58c8868
Diffstat (limited to 'server/query.c')
-rw-r--r-- | server/query.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/server/query.c b/server/query.c new file mode 100644 index 0000000..16f48b6 --- /dev/null +++ b/server/query.c @@ -0,0 +1,74 @@ +/* + * server/query.c + */ + + +#include <arpa/inet.h> +#include <inttypes.h> +#include <byteswap.h> +#include <syslog.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include "dnbd2.h" +#include "query.h" +#include "tree.h" +#include "file.h" + + +int handle_query(dnbd2_data_request_t *request, + dnbd2_data_reply_t *reply, + void **tree) +{ + int fd, i; + node_t node1; + node_t *node2; + dataset_t ds; + off_t size, pos; + uint16_t cmd; + + /* Fetch the right fd for this vid/rid pair. */ + ds.vid = ntohs(request->vid); + ds.rid = ntohs(request->rid); + node1.ds = &ds; + node2 = tree_find(&node1, tree); + if (!node2) + return -1; + fd = node2->fd; + + cmd = ntohs(request->cmd); + switch (cmd) { + case CMD_GET_BLOCK: + reply->num = request->num; + pos = ntohll(request->num); + file_read(fd, reply->payload.data, DNBD2_BLOCK_SIZE, pos); + break; + + case CMD_GET_SIZE: + if (file_getsize(fd, &size) == -1) + return -1; + reply->num = htonll(size); + break; + + case CMD_GET_SERVERS: + /* Fetch a random block to deliver a more realistic RTT. */ + pos = 0; + if (!file_getsize(fd, &size)) + pos = (off_t) (size * (rand() / (RAND_MAX + 1.0))); + file_read(fd, reply->payload.data, DNBD2_BLOCK_SIZE, pos); + reply->num = htonll(node2->servers); + for (i=0 ; i<node2->servers ; i++) { + memcpy(&reply->payload.server[i], + &node2->server[i], + sizeof(dnbd2_server_t)); + } + break; + } + + reply->cmd = request->cmd; + reply->time = request->time; + reply->vid = request->vid; + reply->rid = request->rid; + + return 0; +} |