mirror of https://github.com/xemu-project/xemu.git
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:
parent
7a5ed43764
commit
48bec07e8d
102
qemu-nbd.c
102
qemu-nbd.c
|
@ -49,7 +49,7 @@
|
||||||
static NBDExport *exp;
|
static NBDExport *exp;
|
||||||
static int verbose;
|
static int verbose;
|
||||||
static char *srcpath;
|
static char *srcpath;
|
||||||
static char *sockpath;
|
static SocketAddress *saddr;
|
||||||
static int persistent = 0;
|
static int persistent = 0;
|
||||||
static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state;
|
static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state;
|
||||||
static int shared = 1;
|
static int shared = 1;
|
||||||
|
@ -213,52 +213,6 @@ 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) {
|
|
||||||
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)
|
static void *show_parts(void *arg)
|
||||||
{
|
{
|
||||||
|
@ -287,8 +241,10 @@ static void *nbd_client_thread(void *arg)
|
||||||
pthread_t show_parts_thread;
|
pthread_t show_parts_thread;
|
||||||
Error *local_error = NULL;
|
Error *local_error = NULL;
|
||||||
|
|
||||||
sock = unix_socket_outgoing(sockpath);
|
|
||||||
|
sock = socket_connect(saddr, &local_error, NULL, NULL);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
|
error_report_err(local_error);
|
||||||
goto out;
|
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)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
|
@ -407,8 +390,9 @@ int main(int argc, char **argv)
|
||||||
uint32_t nbdflags = 0;
|
uint32_t nbdflags = 0;
|
||||||
bool disconnect = false;
|
bool disconnect = false;
|
||||||
const char *bindto = "0.0.0.0";
|
const char *bindto = "0.0.0.0";
|
||||||
|
const char *port = NULL;
|
||||||
|
char *sockpath = NULL;
|
||||||
char *device = NULL;
|
char *device = NULL;
|
||||||
int port = NBD_DEFAULT_PORT;
|
|
||||||
off_t fd_size;
|
off_t fd_size;
|
||||||
QemuOpts *sn_opts = NULL;
|
QemuOpts *sn_opts = NULL;
|
||||||
const char *sn_id_or_name = NULL;
|
const char *sn_id_or_name = NULL;
|
||||||
|
@ -441,7 +425,6 @@ int main(int argc, char **argv)
|
||||||
};
|
};
|
||||||
int ch;
|
int ch;
|
||||||
int opt_ind = 0;
|
int opt_ind = 0;
|
||||||
int li;
|
|
||||||
char *end;
|
char *end;
|
||||||
int flags = BDRV_O_RDWR;
|
int flags = BDRV_O_RDWR;
|
||||||
int partition = -1;
|
int partition = -1;
|
||||||
|
@ -529,14 +512,7 @@ int main(int argc, char **argv)
|
||||||
bindto = optarg;
|
bindto = optarg;
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
li = strtol(optarg, &end, 0);
|
port = optarg;
|
||||||
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;
|
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
dev_offset = strtoll (optarg, &end, 0);
|
dev_offset = strtoll (optarg, &end, 0);
|
||||||
|
@ -695,6 +671,8 @@ int main(int argc, char **argv)
|
||||||
snprintf(sockpath, 128, SOCKET_PATH, basename(device));
|
snprintf(sockpath, 128, SOCKET_PATH, basename(device));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
saddr = nbd_build_socket_address(sockpath, bindto, port);
|
||||||
|
|
||||||
if (qemu_init_main_loop(&local_err)) {
|
if (qemu_init_main_loop(&local_err)) {
|
||||||
error_report_err(local_err);
|
error_report_err(local_err);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
@ -752,13 +730,9 @@ int main(int argc, char **argv)
|
||||||
errx(EXIT_FAILURE, "%s", error_get_pretty(local_err));
|
errx(EXIT_FAILURE, "%s", error_get_pretty(local_err));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sockpath) {
|
fd = socket_listen(saddr, &local_err);
|
||||||
fd = unix_socket_incoming(sockpath);
|
|
||||||
} else {
|
|
||||||
fd = tcp_socket_incoming(bindto, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
|
error_report_err(local_err);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue