--- lbbs/src/io.c 2025/06/21 02:15:18 1.47 +++ lbbs/src/io.c 2025/06/27 13:01:24 1.48 @@ -237,136 +237,142 @@ int igetch(int timeout) int i = 0; int flags; - epollfd = epoll_create1(0); - if (epollfd < 0) + if (pos >= len) { - log_error("epoll_create1() error (%d)\n", errno); - return -1; - } - - ev.events = EPOLLIN; - ev.data.fd = STDIN_FILENO; - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1) - { - log_error("epoll_ctl(STDIN_FILENO) error (%d)\n", errno); + len = 0; + pos = 0; - if (close(epollfd) < 0) + epollfd = epoll_create1(0); + if (epollfd < 0) { - log_error("close(epoll) error (%d)\n"); + log_error("epoll_create1() error (%d)\n", errno); + return -1; } - return -1; - } - flags = fcntl(STDIN_FILENO, F_GETFL, 0); - fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); + ev.events = EPOLLIN; + ev.data.fd = STDIN_FILENO; + if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1) + { + log_error("epoll_ctl(STDIN_FILENO) error (%d)\n", errno); - loop = 1; + if (close(epollfd) < 0) + { + log_error("close(epoll) error (%d)\n"); + } + return -1; + } - while (loop && pos >= len && !SYS_server_exit) - { - len = 0; - pos = 0; + flags = fcntl(STDIN_FILENO, F_GETFL, 0); + fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); - if (SSH_v2 && ssh_channel_is_closed(SSH_channel)) + for (loop = 1; loop && !SYS_server_exit;) { - log_error("SSH channel is closed\n"); - loop = 0; - break; - } + if (SSH_v2 && ssh_channel_is_closed(SSH_channel)) + { + log_error("SSH channel is closed\n"); + loop = 0; + break; + } - nfds = epoll_wait(epollfd, events, MAX_EVENTS, timeout); + nfds = epoll_wait(epollfd, events, MAX_EVENTS, timeout); - if (nfds < 0) - { - if (errno != EINTR) + if (nfds < 0) + { + if (errno != EINTR) + { + log_error("epoll_wait() error (%d)\n", errno); + break; + } + continue; + } + else if (nfds == 0) // timeout { - log_error("epoll_wait() error (%d)\n", errno); + out = KEY_TIMEOUT; break; } - continue; - } - else if (nfds == 0) // timeout - { - out = KEY_TIMEOUT; - break; - } - for (int i = 0; i < nfds; i++) - { - if (events[i].data.fd == STDIN_FILENO) + for (int i = 0; i < nfds; i++) { - while (len < sizeof(buf) && !SYS_server_exit) // read until complete or error + if (events[i].data.fd == STDIN_FILENO) { - if (SSH_v2) + while (len < sizeof(buf) && !SYS_server_exit) // read until complete or error { - ret = ssh_channel_read_nonblocking(SSH_channel, buf + len, sizeof(buf) - (uint32_t)len, 0); - if (ret == SSH_ERROR) + if (SSH_v2) { - log_error("ssh_channel_read_nonblocking() error: %s\n", ssh_get_error(SSH_session)); - loop = 0; - break; + ret = ssh_channel_read_nonblocking(SSH_channel, buf + len, sizeof(buf) - (uint32_t)len, 0); + if (ret == SSH_ERROR) + { + log_error("ssh_channel_read_nonblocking() error: %s\n", ssh_get_error(SSH_session)); + loop = 0; + break; + } + else if (ret == SSH_EOF) + { + loop = 0; + break; + } + else if (ret == 0) + { + out = 0; + break; // Check whether channel is still open + } } - else if (ret == SSH_EOF) + else { - loop = 0; - break; + ret = (int)read(STDIN_FILENO, buf + len, sizeof(buf) - (size_t)len); } - else if (ret == 0) + if (ret < 0) { - out = 0; - break; // Check whether channel is still open + if (errno == EAGAIN || errno == EWOULDBLOCK) + { + out = 0; + loop = 0; + break; + } + else if (errno == EINTR) + { + continue; + } + else + { +#ifdef _DEBUG + log_error("read(STDIN) error (%d)\n", errno); +#endif + loop = 0; + break; + } } - } - else - { - ret = (int)read(STDIN_FILENO, buf + len, sizeof(buf) - (size_t)len); - } - if (ret < 0) - { - if (errno == EAGAIN || errno == EWOULDBLOCK) + else if (ret == 0) // broken pipe { - out = 0; loop = 0; break; } - else if (errno == EINTR) - { - continue; - } else { -#ifdef _DEBUG - log_error("read(STDIN) error (%d)\n", errno); -#endif - loop = 0; - break; + len += ret; + continue; } } - else if (ret == 0) // broken pipe - { - loop = 0; - break; - } - else - { - len += ret; - continue; - } } } - } - // For debug + // For debug #ifdef _DEBUG - for (int j = pos; j < len; j++) + for (int j = pos; j < len; j++) + { + log_common("Debug: <--[%u]\n", (buf[j] + 256) % 256); + } +#endif + } + + fcntl(STDIN_FILENO, F_SETFL, flags); + + if (close(epollfd) < 0) { - log_common("Debug: <--[%u]\n", (buf[j] + 256) % 256); + log_error("close(epoll) error (%d)\n"); } -#endif } - fcntl(STDIN_FILENO, F_SETFL, flags); - while (pos < len) { unsigned char c = buf[pos++]; @@ -805,11 +811,6 @@ int igetch(int timeout) break; } - if (close(epollfd) < 0) - { - log_error("close(epoll) error (%d)\n"); - } - // For ESC key if (out == 0 && in_esc) {