vsock/test: Introduce vsock_connect_fd()
Distill timeout-guarded vsock_connect_fd(). Adapt callers. Suggested-by: Stefano Garzarella <sgarzare@redhat.com> Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> Signed-off-by: Michal Luczaj <mhal@rbox.co> Link: https://patch.msgid.link/20250128-vsock-transport-vs-autobind-v3-4-1cf57065b770@rbox.co Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
852a00c428
commit
ac12b7e291
2 changed files with 18 additions and 28 deletions
|
@ -120,27 +120,33 @@ int vsock_bind(unsigned int cid, unsigned int port, int type)
|
|||
return fd;
|
||||
}
|
||||
|
||||
/* Bind to <bind_port>, connect to <cid, port> and return the file descriptor. */
|
||||
int vsock_bind_connect(unsigned int cid, unsigned int port, unsigned int bind_port, int type)
|
||||
int vsock_connect_fd(int fd, unsigned int cid, unsigned int port)
|
||||
{
|
||||
struct sockaddr_vm sa_server = {
|
||||
struct sockaddr_vm sa = {
|
||||
.svm_family = AF_VSOCK,
|
||||
.svm_cid = cid,
|
||||
.svm_port = port,
|
||||
};
|
||||
|
||||
int client_fd, ret;
|
||||
|
||||
client_fd = vsock_bind(VMADDR_CID_ANY, bind_port, type);
|
||||
int ret;
|
||||
|
||||
timeout_begin(TIMEOUT);
|
||||
do {
|
||||
ret = connect(client_fd, (struct sockaddr *)&sa_server, sizeof(sa_server));
|
||||
ret = connect(fd, (struct sockaddr *)&sa, sizeof(sa));
|
||||
timeout_check("connect");
|
||||
} while (ret < 0 && errno == EINTR);
|
||||
timeout_end();
|
||||
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Bind to <bind_port>, connect to <cid, port> and return the file descriptor. */
|
||||
int vsock_bind_connect(unsigned int cid, unsigned int port, unsigned int bind_port, int type)
|
||||
{
|
||||
int client_fd;
|
||||
|
||||
client_fd = vsock_bind(VMADDR_CID_ANY, bind_port, type);
|
||||
|
||||
if (vsock_connect_fd(client_fd, cid, port)) {
|
||||
perror("connect");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
@ -151,17 +157,6 @@ int vsock_bind_connect(unsigned int cid, unsigned int port, unsigned int bind_po
|
|||
/* Connect to <cid, port> and return the file descriptor. */
|
||||
int vsock_connect(unsigned int cid, unsigned int port, int type)
|
||||
{
|
||||
union {
|
||||
struct sockaddr sa;
|
||||
struct sockaddr_vm svm;
|
||||
} addr = {
|
||||
.svm = {
|
||||
.svm_family = AF_VSOCK,
|
||||
.svm_port = port,
|
||||
.svm_cid = cid,
|
||||
},
|
||||
};
|
||||
int ret;
|
||||
int fd;
|
||||
|
||||
control_expectln("LISTENING");
|
||||
|
@ -172,20 +167,14 @@ int vsock_connect(unsigned int cid, unsigned int port, int type)
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
timeout_begin(TIMEOUT);
|
||||
do {
|
||||
ret = connect(fd, &addr.sa, sizeof(addr.svm));
|
||||
timeout_check("connect");
|
||||
} while (ret < 0 && errno == EINTR);
|
||||
timeout_end();
|
||||
|
||||
if (ret < 0) {
|
||||
if (vsock_connect_fd(fd, cid, port)) {
|
||||
int old_errno = errno;
|
||||
|
||||
close(fd);
|
||||
fd = -1;
|
||||
errno = old_errno;
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ struct test_case {
|
|||
void init_signals(void);
|
||||
unsigned int parse_cid(const char *str);
|
||||
unsigned int parse_port(const char *str);
|
||||
int vsock_connect_fd(int fd, unsigned int cid, unsigned int port);
|
||||
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);
|
||||
|
|
Loading…
Add table
Reference in a new issue