END_TEST START_TEST (inet_accept_nowait_test) { int sockfd = -1, port = INPORT_ANY, res; conn_t *conn; res = pr_inet_accept_nowait(NULL, NULL); fail_unless(res < 0, "Failed to handle null arguments"); fail_unless(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL, strerror(errno), errno); conn = pr_inet_create_conn(p, sockfd, NULL, port, FALSE); fail_unless(conn != NULL, "Failed to create conn: %s", strerror(errno)); res = pr_inet_accept_nowait(p, conn); fail_unless(res < 0, "Accepted connection unexpectedly"); fail_unless(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL, strerror(errno), errno); pr_inet_close(p, conn); }
conn_t *pr_ipbind_accept_conn(fd_set *readfds, int *listenfd) { conn_t **listeners = listener_list->elts; register unsigned int i = 0; if (readfds == NULL || listenfd == NULL) { errno = EINVAL; return NULL; } for (i = 0; i < listener_list->nelts; i++) { conn_t *listener = listeners[i]; pr_signals_handle(); if (FD_ISSET(listener->listen_fd, readfds) && listener->mode == CM_LISTEN) { int fd = pr_inet_accept_nowait(listener->pool, listener); if (fd == -1) { int xerrno = errno; /* Handle errors gracefully. If we're here, then * ipbind->ib_server->listen contains either error information, or * we just got caught in a blocking condition. */ if (listener->mode == CM_ERROR) { /* Ignore ECONNABORTED, as they tend to be health checks/probes by * e.g. load balancers and other naive TCP clients. */ if (listener->xerrno != ECONNABORTED) { pr_log_pri(PR_LOG_ERR, "error: unable to accept an incoming " "connection: %s", strerror(listener->xerrno)); } listener->xerrno = 0; listener->mode = CM_LISTEN; errno = xerrno; return NULL; } } *listenfd = fd; return listener; } } errno = ENOENT; return NULL; }