diff options
author | Vladimir Sementsov-Ogievskiy | 2021-06-10 12:07:35 +0200 |
---|---|---|
committer | Eric Blake | 2021-06-18 17:59:53 +0200 |
commit | c5423704184c43cadd7b3c5ff0aea3925c5509bc (patch) | |
tree | 9ec78685f696ba2344ff9686108bdd7d8385106d | |
parent | block/nbd: connect_thread_func(): do qio_channel_set_delay(false) (diff) | |
download | qemu-c5423704184c43cadd7b3c5ff0aea3925c5509bc.tar.gz qemu-c5423704184c43cadd7b3c5ff0aea3925c5509bc.tar.xz qemu-c5423704184c43cadd7b3c5ff0aea3925c5509bc.zip |
qemu-sockets: introduce socket_address_parse_named_fd()
Add function that transforms named fd inside SocketAddress structure
into number representation. This way it may be then used in a context
where current monitor is not available.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20210610100802.5888-6-vsementsov@virtuozzo.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
[eblake: comment tweak]
Signed-off-by: Eric Blake <eblake@redhat.com>
-rw-r--r-- | include/qemu/sockets.h | 11 | ||||
-rw-r--r-- | util/qemu-sockets.c | 19 |
2 files changed, 30 insertions, 0 deletions
diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h index 7d1f813576..0c34bf2398 100644 --- a/include/qemu/sockets.h +++ b/include/qemu/sockets.h @@ -111,4 +111,15 @@ SocketAddress *socket_remote_address(int fd, Error **errp); */ SocketAddress *socket_address_flatten(SocketAddressLegacy *addr); +/** + * socket_address_parse_named_fd: + * + * Modify @addr, replacing a named fd by its corresponding number. + * Needed for callers that plan to pass @addr to a context where the + * current monitor is not available. + * + * Return 0 on success. + */ +int socket_address_parse_named_fd(SocketAddress *addr, Error **errp); + #endif /* QEMU_SOCKETS_H */ diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index c415c342c1..080a240b74 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -1164,6 +1164,25 @@ static int socket_get_fd(const char *fdstr, Error **errp) return fd; } +int socket_address_parse_named_fd(SocketAddress *addr, Error **errp) +{ + int fd; + + if (addr->type != SOCKET_ADDRESS_TYPE_FD) { + return 0; + } + + fd = socket_get_fd(addr->u.fd.str, errp); + if (fd < 0) { + return fd; + } + + g_free(addr->u.fd.str); + addr->u.fd.str = g_strdup_printf("%d", fd); + + return 0; +} + int socket_connect(SocketAddress *addr, Error **errp) { int fd; |