qemu-nbd: convert to use the QAPI SocketAddress object

The qemu-nbd program currently uses a QemuOpts objects
when setting up sockets. Switch it over to use the
QAPI SocketAddress objects instead.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1442411543-28513-3-git-send-email-berrange@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Daniel P. Berrange 2015-09-16 14:52:23 +01:00 committed by Paolo Bonzini
parent 7a5ed43764
commit 48bec07e8d
1 changed files with 38 additions and 64 deletions

View File

@ -49,7 +49,7 @@
static NBDExport *exp;
static int verbose;
static char *srcpath;
static char *sockpath;
static SocketAddress *saddr;
static int persistent = 0;
static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state;
static int shared = 1;
@ -213,52 +213,6 @@ static void termsig_handler(int signum)
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) {
error_report_err(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) {
error_report_err(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) {
error_report_err(local_err);
}
return fd;
}
static void *show_parts(void *arg)
{
@ -287,8 +241,10 @@ static void *nbd_client_thread(void *arg)
pthread_t show_parts_thread;
Error *local_error = NULL;
sock = unix_socket_outgoing(sockpath);
sock = socket_connect(saddr, &local_error, NULL, NULL);
if (sock < 0) {
error_report_err(local_error);
goto out;
}
@ -399,6 +355,33 @@ static void nbd_update_server_fd_handler(int fd)
}
}
static SocketAddress *nbd_build_socket_address(const char *sockpath,
const char *bindto,
const char *port)
{
SocketAddress *saddr;
saddr = g_new0(SocketAddress, 1);
if (sockpath) {
saddr->kind = SOCKET_ADDRESS_KIND_UNIX;
saddr->q_unix = g_new0(UnixSocketAddress, 1);
saddr->q_unix->path = g_strdup(sockpath);
} else {
saddr->kind = SOCKET_ADDRESS_KIND_INET;
saddr->inet = g_new0(InetSocketAddress, 1);
saddr->inet->host = g_strdup(bindto);
if (port) {
saddr->inet->port = g_strdup(port);
} else {
saddr->inet->port = g_strdup_printf("%d", NBD_DEFAULT_PORT);
}
}
return saddr;
}
int main(int argc, char **argv)
{
BlockBackend *blk;
@ -407,8 +390,9 @@ int main(int argc, char **argv)
uint32_t nbdflags = 0;
bool disconnect = false;
const char *bindto = "0.0.0.0";
const char *port = NULL;
char *sockpath = NULL;
char *device = NULL;
int port = NBD_DEFAULT_PORT;
off_t fd_size;
QemuOpts *sn_opts = NULL;
const char *sn_id_or_name = NULL;
@ -441,7 +425,6 @@ int main(int argc, char **argv)
};
int ch;
int opt_ind = 0;
int li;
char *end;
int flags = BDRV_O_RDWR;
int partition = -1;
@ -529,14 +512,7 @@ int main(int argc, char **argv)
bindto = optarg;
break;
case 'p':
li = strtol(optarg, &end, 0);
if (*end) {
errx(EXIT_FAILURE, "Invalid port `%s'", optarg);
}
if (li < 1 || li > 65535) {
errx(EXIT_FAILURE, "Port out of range `%s'", optarg);
}
port = (uint16_t)li;
port = optarg;
break;
case 'o':
dev_offset = strtoll (optarg, &end, 0);
@ -695,6 +671,8 @@ int main(int argc, char **argv)
snprintf(sockpath, 128, SOCKET_PATH, basename(device));
}
saddr = nbd_build_socket_address(sockpath, bindto, port);
if (qemu_init_main_loop(&local_err)) {
error_report_err(local_err);
exit(EXIT_FAILURE);
@ -752,13 +730,9 @@ int main(int argc, char **argv)
errx(EXIT_FAILURE, "%s", error_get_pretty(local_err));
}
if (sockpath) {
fd = unix_socket_incoming(sockpath);
} else {
fd = tcp_socket_incoming(bindto, port);
}
fd = socket_listen(saddr, &local_err);
if (fd < 0) {
error_report_err(local_err);
return 1;
}