From 64702d992d030ba229a9fe7aa8fc1445351453d6 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 9 Aug 2013 17:02:33 +0100 Subject: [PATCH] Minor fixes here and there --- src/client.c | 5 +++-- src/ioutil.c | 18 ++++++++++++++++-- src/readwrite.h | 1 + 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/client.c b/src/client.c index fb7a366..fbc55d7 100644 --- a/src/client.c +++ b/src/client.c @@ -256,8 +256,9 @@ int fd_write_reply( int fd, char *handle, int error ) memcpy( reply.handle, handle, 8 ); nbd_h2r_reply( &reply, &reply_raw ); + debug( "Replying with %s, %d", handle, error ); - if( -1 == write( fd, &reply_raw, sizeof( reply_raw ) ) ) { + if( -1 == writeloop( fd, &reply_raw, sizeof( reply_raw ) ) ) { switch( errno ) { case ECONNRESET: error( "Connection reset while writing reply" ); @@ -365,7 +366,7 @@ int client_request_needs_reply( struct client * client, * forever. */ if (request.magic != REQUEST_MAGIC) { - warn("Bad magic %08x from client", request.magic); + warn("Bad magic 0x%08x from client", request.magic); client_write_reply( client, &request, EBADMSG ); client->disconnect = 1; // no need to flush return 0; diff --git a/src/ioutil.c b/src/ioutil.c index bcdf7f3..1c8d059 100644 --- a/src/ioutil.c +++ b/src/ioutil.c @@ -121,7 +121,12 @@ int writeloop(int filedes, const void *buffer, size_t size) size_t written=0; while (written < size) { ssize_t result = write(filedes, buffer+written, size-written); - if (result == -1) { return -1; } + if (result == -1) { + if ( errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK ) { + continue; // busy-wait + } + return -1; // failure + } written += result; } return 0; @@ -132,9 +137,18 @@ int readloop(int filedes, void *buffer, size_t size) size_t readden=0; while (readden < size) { ssize_t result = read(filedes, buffer+readden, size-readden); - if (result == 0 /* EOF */ || result == -1 /* error */) { + + if ( result == 0 /* EOF */ ) { + warn( "end-of-file detected while reading" ); return -1; } + + if ( result == -1 ) { + if ( errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK ) { + continue; // busy-wait + } + return -1; // failure + } readden += result; } return 0; diff --git a/src/readwrite.h b/src/readwrite.h index 947f20b..155edd7 100644 --- a/src/readwrite.h +++ b/src/readwrite.h @@ -4,6 +4,7 @@ #include #include +#include "nbdtypes.h" int socket_connect(struct sockaddr* to, struct sockaddr* from); int socket_nbd_read_hello(int fd, off64_t * size);