diff --git a/src/server.c b/src/server.c index 6aeb489..c7c974d 100644 --- a/src/server.c +++ b/src/server.c @@ -2097,34 +2097,44 @@ error_unknown: static int handle_sock_raw(patty_ax25_server *server, patty_ax25_sock *sock) { - if (!FD_ISSET(sock->fd, &server->fds_r) || sock->iface == NULL) { + patty_kiss_tnc *raw = sock->raw; + patty_ax25_if *iface = sock->iface; + + ssize_t len; + + if (!FD_ISSET(sock->fd, &server->fds_r) || raw == NULL || iface == NULL) { return 0; } - do { + if ((len = patty_kiss_tnc_fill(raw)) < 0) { + goto error_io; + } else if (len == 0) { + (void)sock_close(server, sock); + + goto done; + } + + while (1) { ssize_t len; - if ((len = patty_ax25_sock_recv(sock, - sock->iface->tx_buf, - sock->iface->mtu)) < 0) { - if (errno == EIO) { - (void)sock_close(server, sock); - - break; - } else { - goto error_io; - } - } else if (len == 0) { - (void)sock_close(server, sock); + if ((len = patty_kiss_tnc_drain(raw, iface->tx_buf, iface->mtu)) < 0) { + goto error_io; + } + if (!patty_kiss_tnc_ready(raw)) { break; } - if (patty_ax25_if_send(sock->iface, sock->iface->tx_buf, len) < 0) { + if ((len = patty_kiss_tnc_flush(raw)) < 0) { goto error_io; } - } while (patty_ax25_sock_recv_pending(sock)); + if (patty_ax25_if_send(iface, iface->tx_buf, len) < 0) { + goto error_io; + } + } + +done: return 0; error_io: