Minor fixes here and there
This commit is contained in:
@@ -256,8 +256,9 @@ int fd_write_reply( int fd, char *handle, int error )
|
|||||||
memcpy( reply.handle, handle, 8 );
|
memcpy( reply.handle, handle, 8 );
|
||||||
|
|
||||||
nbd_h2r_reply( &reply, &reply_raw );
|
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 ) {
|
switch( errno ) {
|
||||||
case ECONNRESET:
|
case ECONNRESET:
|
||||||
error( "Connection reset while writing reply" );
|
error( "Connection reset while writing reply" );
|
||||||
@@ -365,7 +366,7 @@ int client_request_needs_reply( struct client * client,
|
|||||||
* forever.
|
* forever.
|
||||||
*/
|
*/
|
||||||
if (request.magic != REQUEST_MAGIC) {
|
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_write_reply( client, &request, EBADMSG );
|
||||||
client->disconnect = 1; // no need to flush
|
client->disconnect = 1; // no need to flush
|
||||||
return 0;
|
return 0;
|
||||||
|
18
src/ioutil.c
18
src/ioutil.c
@@ -121,7 +121,12 @@ int writeloop(int filedes, const void *buffer, size_t size)
|
|||||||
size_t written=0;
|
size_t written=0;
|
||||||
while (written < size) {
|
while (written < size) {
|
||||||
ssize_t result = write(filedes, buffer+written, size-written);
|
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;
|
written += result;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -132,9 +137,18 @@ int readloop(int filedes, void *buffer, size_t size)
|
|||||||
size_t readden=0;
|
size_t readden=0;
|
||||||
while (readden < size) {
|
while (readden < size) {
|
||||||
ssize_t result = read(filedes, buffer+readden, size-readden);
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( result == -1 ) {
|
||||||
|
if ( errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK ) {
|
||||||
|
continue; // busy-wait
|
||||||
|
}
|
||||||
|
return -1; // failure
|
||||||
|
}
|
||||||
readden += result;
|
readden += result;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include "nbdtypes.h"
|
||||||
|
|
||||||
int socket_connect(struct sockaddr* to, struct sockaddr* from);
|
int socket_connect(struct sockaddr* to, struct sockaddr* from);
|
||||||
int socket_nbd_read_hello(int fd, off64_t * size);
|
int socket_nbd_read_hello(int fd, off64_t * size);
|
||||||
|
Reference in New Issue
Block a user