enum connect_result tcp_socket_state(int fd, thread * thread_obj, uint32_t addr_ip, uint16_t addr_port, int (*func) (struct _thread *)) { int status; socklen_t slen; int ret = 0; TIMEVAL timer_min; /* Handle connection timeout */ if (thread_obj->type == THREAD_WRITE_TIMEOUT) { DBG("TCP connection timeout to [%s:%d].", inet_ntop2(addr_ip), ntohs(addr_port)); close(thread_obj->u.fd); return connect_timeout; } /* Check file descriptor */ slen = sizeof (status); if (getsockopt (thread_obj->u.fd, SOL_SOCKET, SO_ERROR, (void *) &status, &slen) < 0) ret = errno; /* Connection failed !!! */ if (ret) { DBG("TCP connection failed to [%s:%d].", inet_ntop2(addr_ip), ntohs(addr_port)); close(thread_obj->u.fd); return connect_error; } /* If status = 0, TCP connection to remote host is established. * Otherwise register checker thread to handle connection in progress, * and other error code until connection is established. * Recompute the write timeout (or pending connection). */ if (status == EINPROGRESS) { DBG("TCP connection to [%s:%d] still IN_PROGRESS.", inet_ntop2(addr_ip), ntohs(addr_port)); timer_min = timer_sub_now(thread_obj->sands); thread_add_write(thread_obj->master, func, THREAD_ARG(thread_obj) , thread_obj->u.fd, TIMER_LONG(timer_min)); return connect_in_progress; } else if (status != 0) { close(thread_obj->u.fd); return connect_error; } return connect_success; }
enum connect_result tcp_socket_state(int fd, thread_t * thread, int (*func) (thread_t *)) { int status; socklen_t addrlen; int ret = 0; timeval_t timer_min; /* Handle connection timeout */ if (thread->type == THREAD_WRITE_TIMEOUT) { close(thread->u.fd); return connect_timeout; } /* Check file descriptor */ addrlen = sizeof(status); if (getsockopt(thread->u.fd, SOL_SOCKET, SO_ERROR, (void *) &status, &addrlen) < 0) ret = errno; /* Connection failed !!! */ if (ret) { close(thread->u.fd); return connect_error; } /* If status = 0, TCP connection to remote host is established. * Otherwise register checker thread to handle connection in progress, * and other error code until connection is established. * Recompute the write timeout (or pending connection). */ if (status == EINPROGRESS) { timer_min = timer_sub_now(thread->sands); thread_add_write(thread->master, func, THREAD_ARG(thread), thread->u.fd, timer_long(timer_min)); return connect_in_progress; } else if (status != 0) { close(thread->u.fd); return connect_error; } return connect_success; }