diff --git a/src/readwrite.c b/src/readwrite.c index 8759602..0f20f24 100644 --- a/src/readwrite.c +++ b/src/readwrite.c @@ -56,6 +56,25 @@ fail: return 0; } +int socket_nbd_write_hello(int fd, off64_t out_size) +{ + struct nbd_init init; + struct nbd_init_raw init_raw; + + memcpy(&init.passwd, INIT_PASSWD, 8); + init.magic = INIT_MAGIC; + init.size = out_size; + + memset( &init_raw, 0, sizeof( init_raw ) ); // ensure reserved is 0s + nbd_h2r_init(&init, &init_raw); + + if ( 0 > writeloop( fd, &init_raw, sizeof( init_raw ) ) ) { + warn( SHOW_ERRNO( "failed to write hello to socket" ) ); + return 0; + } + return 1; +} + void fill_request(struct nbd_request *request, int type, off64_t from, int len) { request->magic = htobe32(REQUEST_MAGIC); diff --git a/src/readwrite.h b/src/readwrite.h index bb3029c..e58c398 100644 --- a/src/readwrite.h +++ b/src/readwrite.h @@ -7,6 +7,7 @@ int socket_connect(struct sockaddr* to, struct sockaddr* from); int socket_nbd_read_hello(int fd, off64_t * size); +int socket_nbd_write_hello(int fd, off64_t size); void socket_nbd_read(int fd, off64_t from, int len, int out_fd, void* out_buf, int timeout_secs); void socket_nbd_write(int fd, off64_t from, int len, int out_fd, void* out_buf, int timeout_secs); int socket_nbd_disconnect( int fd ); diff --git a/src/util.h b/src/util.h index 15181a5..24a1838 100644 --- a/src/util.h +++ b/src/util.h @@ -148,6 +148,7 @@ void mylog(int line_level, const char* format, ...); #define NULLCHECK(value) FATAL_IF_NULL(value, "BUG: " #value " is null") +#define SHOW_ERRNO( msg ) msg ": %s (%i)", ( errno == 0 ? "EOF" : strerror(errno) ), errno #endif