diff --git a/src/server.c b/src/server.c index 99f9d30..244db3f 100644 --- a/src/server.c +++ b/src/server.c @@ -1805,6 +1805,35 @@ error_io: return -1; } +static int handle_sock_dgram(patty_ax25_server *server, + patty_ax25_sock *sock) { + ssize_t len; + + if (!FD_ISSET(sock->fd, &server->fds_r)) { + return 0; + } + + if ((len = read(sock->fd, sock->rx_buf, sock->n_maxlen_rx)) < 0) { + if (errno == EIO) { + (void)sock_close(server, sock); + } else { + goto error_unknown; + } + } else if (len == 0) { + (void)sock_close(server, sock); + } else if (len > 0) { + if (patty_ax25_sock_write(sock, sock->rx_buf, len) < 0) { + goto error_sock_write; + } + } + + return 0; + +error_sock_write: +error_unknown: + return -1; +} + static int handle_sock_raw(patty_ax25_server *server, patty_ax25_sock *sock) { if (!FD_ISSET(sock->fd, &server->fds_r) || sock->iface == NULL) { @@ -1839,14 +1868,23 @@ static int handle_sock(uint32_t key, ssize_t len; - if (sock->type == PATTY_AX25_SOCK_RAW) { - return handle_sock_raw(server, sock); + switch (sock->type) { + case PATTY_AX25_SOCK_DGRAM: + return handle_sock_dgram(server, sock); + + case PATTY_AX25_SOCK_RAW: + return handle_sock_raw(server, sock); + + case PATTY_AX25_SOCK_STREAM: + break; } + patty_timer_tick(&sock->timer_t1, &server->elapsed); + patty_timer_tick(&sock->timer_t2, &server->elapsed); + patty_timer_tick(&sock->timer_t3, &server->elapsed); + switch (sock->state) { case PATTY_AX25_SOCK_PENDING_CONNECT: - patty_timer_tick(&sock->timer_t1, &server->elapsed); - if (patty_timer_expired(&sock->timer_t1)) { if (sock->retries) { int ret = patty_ax25_sock_send_sabm(sock, PATTY_AX25_FRAME_POLL); @@ -1869,12 +1907,9 @@ static int handle_sock(uint32_t key, } } - goto done; + return 0; case PATTY_AX25_SOCK_ESTABLISHED: - patty_timer_tick(&sock->timer_t2, &server->elapsed); - patty_timer_tick(&sock->timer_t3, &server->elapsed); - if (patty_timer_expired(&sock->timer_t1)) { if (sock->retries) { int ret = patty_ax25_sock_send_rr(sock, @@ -1921,7 +1956,7 @@ static int handle_sock(uint32_t key, } if (!FD_ISSET(sock->fd, &server->fds_r)) { - goto done; + return 0; } /* @@ -1945,32 +1980,27 @@ static int handle_sock(uint32_t key, if ((len = read(sock->fd, sock->rx_buf, sock->n_maxlen_rx)) < 0) { if (errno == EIO) { (void)sock_shutdown(server, sock); - - goto done; + } else { + goto error_unknown; } - - goto error_io; } else if (len == 0) { (void)sock_shutdown(server, sock); + } else if (len > 0) { + if (patty_ax25_sock_write(sock, sock->rx_buf, len) < 0) { + goto error_sock_write; + } - goto done; + /* + * AX.25 v2.2, Section 6.4.1, "Sending I Frames" + */ + patty_timer_start(&sock->timer_t1, sock->n_ack); } - if (patty_ax25_sock_write(sock, sock->rx_buf, len) < 0) { - goto error_sock_write; - } - - /* - * AX.25 v2.2, Section 6.4.1, "Sending I Frames" - */ - patty_timer_start(&sock->timer_t1, sock->n_ack); - -done: return 0; error_client_by_sock: error_sock_write: -error_io: +error_unknown: return -1; }