nbd: move socket wrappers to qemu-nbd
qemu-nbd is one of the few valid users of qerror_report_err. Move the error-reporting socket wrappers there. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
c06b72781d
commit
537b41f501
@ -62,10 +62,6 @@ enum {
|
|||||||
#define NBD_MAX_BUFFER_SIZE (32 * 1024 * 1024)
|
#define NBD_MAX_BUFFER_SIZE (32 * 1024 * 1024)
|
||||||
|
|
||||||
ssize_t nbd_wr_sync(int fd, void *buffer, size_t size, bool do_read);
|
ssize_t nbd_wr_sync(int fd, void *buffer, size_t size, bool do_read);
|
||||||
int tcp_socket_incoming(const char *address, uint16_t port);
|
|
||||||
int unix_socket_outgoing(const char *path);
|
|
||||||
int unix_socket_incoming(const char *path);
|
|
||||||
|
|
||||||
int nbd_receive_negotiate(int csock, const char *name, uint32_t *flags,
|
int nbd_receive_negotiate(int csock, const char *name, uint32_t *flags,
|
||||||
off_t *size, size_t *blocksize);
|
off_t *size, size_t *blocksize);
|
||||||
int nbd_init(int fd, int csock, uint32_t flags, off_t size, size_t blocksize);
|
int nbd_init(int fd, int csock, uint32_t flags, off_t size, size_t blocksize);
|
||||||
|
50
nbd.c
50
nbd.c
@ -188,56 +188,6 @@ static ssize_t write_sync(int fd, void *buffer, size_t size)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void combine_addr(char *buf, size_t len, const char* address,
|
|
||||||
uint16_t port)
|
|
||||||
{
|
|
||||||
/* If the address-part contains a colon, it's an IPv6 IP so needs [] */
|
|
||||||
if (strstr(address, ":")) {
|
|
||||||
snprintf(buf, len, "[%s]:%u", address, port);
|
|
||||||
} else {
|
|
||||||
snprintf(buf, len, "%s:%u", address, port);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int tcp_socket_incoming(const char *address, uint16_t port)
|
|
||||||
{
|
|
||||||
char address_and_port[128];
|
|
||||||
Error *local_err = NULL;
|
|
||||||
|
|
||||||
combine_addr(address_and_port, 128, address, port);
|
|
||||||
int fd = inet_listen(address_and_port, NULL, 0, SOCK_STREAM, 0, &local_err);
|
|
||||||
|
|
||||||
if (local_err != NULL) {
|
|
||||||
qerror_report_err(local_err);
|
|
||||||
error_free(local_err);
|
|
||||||
}
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
int unix_socket_incoming(const char *path)
|
|
||||||
{
|
|
||||||
Error *local_err = NULL;
|
|
||||||
int fd = unix_listen(path, NULL, 0, &local_err);
|
|
||||||
|
|
||||||
if (local_err != NULL) {
|
|
||||||
qerror_report_err(local_err);
|
|
||||||
error_free(local_err);
|
|
||||||
}
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
int unix_socket_outgoing(const char *path)
|
|
||||||
{
|
|
||||||
Error *local_err = NULL;
|
|
||||||
int fd = unix_connect(path, &local_err);
|
|
||||||
|
|
||||||
if (local_err != NULL) {
|
|
||||||
qerror_report_err(local_err);
|
|
||||||
error_free(local_err);
|
|
||||||
}
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Basic flow for negotiation
|
/* Basic flow for negotiation
|
||||||
|
|
||||||
Server Client
|
Server Client
|
||||||
|
52
qemu-nbd.c
52
qemu-nbd.c
@ -20,6 +20,8 @@
|
|||||||
#include "block/block.h"
|
#include "block/block.h"
|
||||||
#include "block/nbd.h"
|
#include "block/nbd.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
|
#include "qemu/sockets.h"
|
||||||
|
#include "qemu/error-report.h"
|
||||||
#include "block/snapshot.h"
|
#include "block/snapshot.h"
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@ -201,6 +203,56 @@ static void termsig_handler(int signum)
|
|||||||
qemu_notify_event();
|
qemu_notify_event();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void combine_addr(char *buf, size_t len, const char* address,
|
||||||
|
uint16_t port)
|
||||||
|
{
|
||||||
|
/* If the address-part contains a colon, it's an IPv6 IP so needs [] */
|
||||||
|
if (strstr(address, ":")) {
|
||||||
|
snprintf(buf, len, "[%s]:%u", address, port);
|
||||||
|
} else {
|
||||||
|
snprintf(buf, len, "%s:%u", address, port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tcp_socket_incoming(const char *address, uint16_t port)
|
||||||
|
{
|
||||||
|
char address_and_port[128];
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
combine_addr(address_and_port, 128, address, port);
|
||||||
|
int fd = inet_listen(address_and_port, NULL, 0, SOCK_STREAM, 0, &local_err);
|
||||||
|
|
||||||
|
if (local_err != NULL) {
|
||||||
|
qerror_report_err(local_err);
|
||||||
|
error_free(local_err);
|
||||||
|
}
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int unix_socket_incoming(const char *path)
|
||||||
|
{
|
||||||
|
Error *local_err = NULL;
|
||||||
|
int fd = unix_listen(path, NULL, 0, &local_err);
|
||||||
|
|
||||||
|
if (local_err != NULL) {
|
||||||
|
qerror_report_err(local_err);
|
||||||
|
error_free(local_err);
|
||||||
|
}
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int unix_socket_outgoing(const char *path)
|
||||||
|
{
|
||||||
|
Error *local_err = NULL;
|
||||||
|
int fd = unix_connect(path, &local_err);
|
||||||
|
|
||||||
|
if (local_err != NULL) {
|
||||||
|
qerror_report_err(local_err);
|
||||||
|
error_free(local_err);
|
||||||
|
}
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
static void *show_parts(void *arg)
|
static void *show_parts(void *arg)
|
||||||
{
|
{
|
||||||
char *device = arg;
|
char *device = arg;
|
||||||
|
Loading…
Reference in New Issue
Block a user