vsock/test: Introduce vsock_bind_try() helper

Create a socket and bind() it. If binding failed, gracefully return an
error code while preserving `errno`.

Base vsock_bind() on top of it.

Suggested-by: Stefano Garzarella <sgarzare@redhat.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Michal Luczaj <mhal@rbox.co>
Reviewed-by: Luigi Leonardi <leonardi@redhat.com>
Link: https://patch.msgid.link/20250611-vsock-test-inc-cov-v3-1-5834060d9c20@rbox.co
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Michal Luczaj 2025-06-11 21:56:50 +02:00 committed by Jakub Kicinski
parent 0f0decc777
commit d56a8dbff8
2 changed files with 22 additions and 3 deletions

View File

@ -121,15 +121,17 @@ bool vsock_wait_sent(int fd)
return !ret;
}
/* Create socket <type>, bind to <cid, port> and return the file descriptor. */
int vsock_bind(unsigned int cid, unsigned int port, int type)
/* Create socket <type>, bind to <cid, port>.
* Return the file descriptor, or -1 on error.
*/
int vsock_bind_try(unsigned int cid, unsigned int port, int type)
{
struct sockaddr_vm sa = {
.svm_family = AF_VSOCK,
.svm_cid = cid,
.svm_port = port,
};
int fd;
int fd, saved_errno;
fd = socket(AF_VSOCK, type, 0);
if (fd < 0) {
@ -138,6 +140,22 @@ int vsock_bind(unsigned int cid, unsigned int port, int type)
}
if (bind(fd, (struct sockaddr *)&sa, sizeof(sa))) {
saved_errno = errno;
close(fd);
errno = saved_errno;
fd = -1;
}
return fd;
}
/* Create socket <type>, bind to <cid, port> and return the file descriptor. */
int vsock_bind(unsigned int cid, unsigned int port, int type)
{
int fd;
fd = vsock_bind_try(cid, port, type);
if (fd < 0) {
perror("bind");
exit(EXIT_FAILURE);
}

View File

@ -44,6 +44,7 @@ int vsock_connect(unsigned int cid, unsigned int port, int type);
int vsock_accept(unsigned int cid, unsigned int port,
struct sockaddr_vm *clientaddrp, int type);
int vsock_stream_connect(unsigned int cid, unsigned int port);
int vsock_bind_try(unsigned int cid, unsigned int port, int type);
int vsock_bind(unsigned int cid, unsigned int port, int type);
int vsock_bind_connect(unsigned int cid, unsigned int port,
unsigned int bind_port, int type);