mirror of https://gitee.com/openkylin/qemu.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 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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue