From 076010d3539f16dc3954db963e06c9d0ddfedb77 Mon Sep 17 00:00:00 2001 From: Wouter Verhelst Date: Tue, 27 Jul 2010 14:35:12 -0400 Subject: [PATCH] Functional fixes Result of tests. It works! Whee! --- nbd-client.c | 2 +- nbd-server.c | 37 ++++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/nbd-client.c b/nbd-client.c index 63202d2..aeaa231 100644 --- a/nbd-client.c +++ b/nbd-client.c @@ -358,12 +358,12 @@ int main(int argc, char *argv[]) { break; case 1: // port - port = optarg; if(!strtol(optarg, NULL, 0)) { // not parseable as a number, assume it's the device and we have a name nbddev = optarg; nonspecial++; } else { + port = optarg; if(name) { usage("port and name specified at the same time. This is not supported."); exit(EXIT_FAILURE); diff --git a/nbd-server.c b/nbd-server.c index 30b6181..1b665b9 100644 --- a/nbd-server.c +++ b/nbd-server.c @@ -570,20 +570,20 @@ SERVER* dup_serve(SERVER *s) { SERVER *serve = NULL; serve=g_new0(SERVER, 1); - if (serve == NULL) + if(serve == NULL) return NULL; - if (s->exportname) + if(s->exportname) serve->exportname = g_strdup(s->exportname); serve->expected_size = s->expected_size; - if (s->listenaddr) + if(s->listenaddr) serve->listenaddr = g_strdup(s->listenaddr); serve->port = s->port; - if (s->authname) + if(s->authname) serve->authname = strdup(s->authname); serve->flags = s->flags; @@ -591,11 +591,14 @@ SERVER* dup_serve(SERVER *s) { serve->socket_family = serve->socket_family; serve->cidrlen = s->cidrlen; - if (s->prerun) + if(s->prerun) serve->prerun = g_strdup(s->prerun); - if (s->postrun) + if(s->postrun) serve->postrun = g_strdup(s->postrun); + + if(s->servename) + serve->servename = g_strdup(s->servename); return serve; } @@ -1262,7 +1265,7 @@ CLIENT* negotiate(int net, CLIENT *client, GArray* servers) { namelen = ntohll(namelen); name = malloc(namelen+1); name[namelen+1]=0; - read(net, &name, namelen); + read(net, name, namelen); for(i=0; ilen; i++) { SERVER* serve = &(g_array_index(servers, SERVER, i)); if(!strcmp(serve->servename, name)) { @@ -1280,9 +1283,16 @@ CLIENT* negotiate(int net, CLIENT *client, GArray* servers) { err("Negotiation failed: %m"); if (client->server->flags & F_READONLY) flags |= NBD_FLAG_READ_ONLY; + if (!client->modern) { flags = htonl(flags); - if (write(client->net, &flags, 4) < 0) - err("Negotiation failed: %m"); + if (write(client->net, &flags, 4) < 0) + err("Negotiation failed: %m"); + } else { + smallflags = (uint16_t)(flags & ~((uint16_t)0)); + if (write(client->net, &smallflags, sizeof(smallflags)) < 0) { + err("Negotiation failed: %m"); + } + } if (write(client->net, zeros, 124) < 0) err("Negotiation failed: %m"); return NULL; @@ -1660,13 +1670,14 @@ int serveloop(GArray* servers) { max=0; FD_ZERO(&mset); for(i=0;ilen;i++) { - sock=(g_array_index(servers, SERVER, i)).socket; - FD_SET(sock, &mset); - max=sock>max?sock:max; + if((sock=(g_array_index(servers, SERVER, i)).socket)) { + FD_SET(sock, &mset); + max=sock>max?sock:max; + } } if(modernsock) { FD_SET(modernsock, &mset); - max=modernsock>max?sock:max; + max=modernsock>max?modernsock:max; } for(;;) { CLIENT *client = NULL; -- 1.7.10.4