X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=misc%2Fnetwork_servers%2Fv3_nbd%2Fv3_nbd.cc;h=b3eb805e084b645b0f41cf3ec1eae808c3b3d9b4;hb=d287b841e1a6f753fe57a01a5e11b8a069844b2a;hp=c0b39235d7701ada5740cb08c56642957e91a3a0;hpb=2b1dfc3d1281140e4bcc1ea963ae34e5eef9c8b8;p=palacios.git diff --git a/misc/network_servers/v3_nbd/v3_nbd.cc b/misc/network_servers/v3_nbd/v3_nbd.cc index c0b3923..b3eb805 100644 --- a/misc/network_servers/v3_nbd/v3_nbd.cc +++ b/misc/network_servers/v3_nbd/v3_nbd.cc @@ -416,6 +416,8 @@ int handle_read_request(SOCK conn, v3_disk * disk) { vtl_debug("Read Request\n"); + + if (Receive(conn, (char *)&offset, 8, true) <= 0) { vtl_debug("Error receiving read offset\n"); return -1; @@ -459,10 +461,15 @@ int handle_read_request(SOCK conn, v3_disk * disk) { if (ret_len > 0) { vtl_debug("Sending Data\n"); + + SetNoDelaySocket(conn, false); + if (Send(conn, (char *)buf, ret_len, true) <= 0) { vtl_debug("Error sending Read Data\n"); return -1; } + + SetNoDelaySocket(conn, true); } vtl_debug("Read Complete\n"); @@ -479,7 +486,56 @@ int handle_read_request(SOCK conn, v3_disk * disk) { // send : // 1 bytes : status int handle_write_request(SOCK conn, v3_disk * disk) { - return -1; + off_t offset = 0; + unsigned int length = 0; + unsigned char * buf = NULL; + unsigned int ret_len = 0; + unsigned char status = NBD_STATUS_OK; + + vtl_debug("Write Request\n"); + + if (Receive(conn, (char *)&offset, 8, true) <= 0) { + vtl_debug("Error receiving write offset\n"); + return -1; + } + + vtl_debug("Write Offset %d\n", offset); + + if (Receive(conn, (char *)&length, 4, true) <= 0) { + vtl_debug("Error receiving write length\n"); + return -1; + } + + vtl_debug("Write length: %d\n", length); + + buf = new unsigned char[length]; + + vtl_debug("Receiving Data\n"); + + if (Receive(conn, (char *)buf, length, true) <= 0) { + vtl_debug("Error receiving Write Data\n"); + return -1; + } + + vtl_debug("Wrote %d bytes to source disk\n", ret_len); + + if (disk->write(buf, offset, length) != length) { + vtl_debug("Write Error\n"); + status = NBD_STATUS_ERR; + } + + vtl_debug("Sending Status byte (%d)\n", status); + + if (Send(conn, (char *)&status, 1, true) <= 0) { + vtl_debug("Error Sending Wrte Status\n"); + return -1; + } + + vtl_debug("Write Complete\n"); + + delete buf; + + return 0; } @@ -528,6 +584,7 @@ int handle_new_connection(SOCK new_conn) { disk->attach(); + vtl_debug("Connected to disk %s\n", tag_str.c_str()); return 0;