static void multi_server_accept_inet(int unused_event, char *context) { int listen_fd = CAST_CHAR_PTR_TO_INT(context); int time_left = -1; int fd; /* * Be prepared for accept() to fail because some other process already * got the connection (the number of processes competing for clients is * kept small, so this is not a "thundering herd" problem). If the * accept() succeeds, be sure to disable non-blocking I/O, in order to * minimize confusion. */ if (client_count == 0 && var_idle_limit > 0) time_left = event_cancel_timer(multi_server_timeout, (char *) 0); if (multi_server_pre_accept) multi_server_pre_accept(multi_server_name, multi_server_argv); fd = inet_accept(listen_fd); if (multi_server_lock != 0 && myflock(vstream_fileno(multi_server_lock), INTERNAL_LOCK, MYFLOCK_OP_NONE) < 0) msg_fatal("select unlock: %m"); if (fd < 0) { if (errno != EAGAIN) msg_error("accept connection: %m"); if (time_left >= 0) event_request_timer(multi_server_timeout, (char *) 0, time_left); return; } multi_server_wakeup(fd, (HTABLE *) 0); }
static void single_server_accept_inet(int unused_event, void *context) { int listen_fd = CAST_ANY_PTR_TO_INT(context); int time_left = -1; int fd; /* * Be prepared for accept() to fail because some other process already * got the connection. We use select() + accept(), instead of simply * blocking in accept(), because we must be able to detect that the * master process has gone away unexpectedly. */ if (var_idle_limit > 0) time_left = event_cancel_timer(single_server_timeout, (void *) 0); if (single_server_pre_accept) single_server_pre_accept(single_server_name, single_server_argv); fd = inet_accept(listen_fd); if (single_server_lock != 0 && myflock(vstream_fileno(single_server_lock), INTERNAL_LOCK, MYFLOCK_OP_NONE) < 0) msg_fatal("select unlock: %m"); if (fd < 0) { if (errno != EAGAIN) msg_error("accept connection: %m"); if (time_left >= 0) event_request_timer(single_server_timeout, (void *) 0, time_left); return; } single_server_wakeup(fd, (HTABLE *) 0); }
static int ftp_client_receive_file(struct network_client *client, const char *ip, u16 port) { int ret; int sockfd, data_sockfd; ssize_t rdlen; char buff[1024], *p; struct sockaddr_in addr; socklen_t addrlen; sockfd = inet_create_tcp_service(port); if (sockfd < 0) { pr_red_info("inet_create_tcp_service"); return sockfd; } p = text_copy(buff, "PORT "); p = text_replace_char2(ip, p, '.', ','); p += sprintf(p, ",%d,%d\r\n", port >> 8, port & 0xFF); rdlen = ftp_client_send_command(client, buff, p - buff, buff, sizeof(buff)); if (rdlen < 0) { pr_red_info("ftp_client_send_command"); return rdlen; } rdlen = ftp_client_send_command(client, "LIST\r\n", 0, buff, sizeof(buff)); if (rdlen < 0) { pr_red_info("ftp_client_send_command"); return rdlen; } data_sockfd = inet_accept(sockfd, &addr, &addrlen); if (data_sockfd < 0) { pr_red_info("inet_accept"); ret = data_sockfd; goto out_close_sockfd; } while (1) { rdlen = inet_recv(data_sockfd, buff, sizeof(buff)); if (rdlen < 0) { pr_red_info("inet_recv"); ret = rdlen; goto out_close_data_link; } if (rdlen == 0) { pr_green_info("data receive complete"); break; } #if FTP_DEBUG print_ntext(buff, rdlen); #endif } ret = 0; out_close_data_link: shutdown(data_sockfd, SHUT_RDWR); inet_close_tcp_socket(data_sockfd); out_close_sockfd: inet_close_tcp_socket(sockfd); return ret; }