Commit afaa7355 authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

sock: add new opt to posix poll function



It is a prework for async connect.

Change-Id: I175a77445de6c642f0617c7728ef383d70666768
Signed-off-by: default avatarJacek Kalwas <jacek.kalwas@nutanix.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/25905


Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent 2f222bcc
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -461,15 +461,16 @@ spdk_sock_posix_fd_create(struct addrinfo *res, struct spdk_sock_opts *opts,
}


/* Returns 0 on success, -1 on failure, 1 to retry with different address if available. */
/* Returns 0 on success, -1 on failure, 1 to retry with different address if available.
 * If block set to false it can return -EAGAIN to retry later. */
static int
sock_posix_fd_connect_poll(int fd, struct spdk_sock_opts *opts)
sock_posix_fd_connect_poll(int fd, struct spdk_sock_opts *opts, bool block)
{
	int rc, err, timeout = 0;
	struct pollfd pfd = {.fd = fd, .events = POLLOUT};
	socklen_t len = sizeof(err);

	if (opts) {
	if (opts && block) {
		assert(opts->connect_timeout <= INT_MAX);
		timeout = opts->connect_timeout ? (int)opts->connect_timeout : -1;
	}
@@ -481,10 +482,14 @@ sock_posix_fd_connect_poll(int fd, struct spdk_sock_opts *opts)
	}

	if (rc == 0) {
		if (block) {
			SPDK_ERRLOG("poll() timeout after %d ms\n", timeout);
			return -1;
		}

		return -EAGAIN;
	}

	rc = getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &len);
	if (rc != 0) {
		SPDK_ERRLOG("getsockopt() failed, errno = %d\n", errno);
@@ -558,7 +563,7 @@ spdk_sock_posix_fd_connect(int fd, struct addrinfo *res, struct spdk_sock_opts *
		return 1;
	}

	rc = sock_posix_fd_connect_poll(fd, opts);
	rc = sock_posix_fd_connect_poll(fd, opts, true);
	if (rc) {
		return rc;
	}