From 2b931ec357a3b0ec456c3851fb9fc64d42f7425c Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sat, 3 Oct 2020 14:56:58 -0400 Subject: [PATCH] Implement patty_ax25_if_ready() Implement patty_ax25_if_ready() to provide a means of testing an interface's readiness for performing I/O; this may also be used in the future for some interface drivers which may require occasional keepalive timers to maintain a link --- include/patty/ax25/aprs_is.h | 2 ++ include/patty/ax25/if.h | 5 +++++ include/patty/kiss/tnc.h | 2 ++ src/aprs_is.c | 5 +++++ src/if.c | 4 ++++ src/server.c | 2 +- src/tnc.c | 5 +++++ 7 files changed, 24 insertions(+), 1 deletion(-) diff --git a/include/patty/ax25/aprs_is.h b/include/patty/ax25/aprs_is.h index 577789d..1a0ff1a 100644 --- a/include/patty/ax25/aprs_is.h +++ b/include/patty/ax25/aprs_is.h @@ -37,6 +37,8 @@ void patty_ax25_aprs_is_destroy(patty_ax25_aprs_is *aprs); int patty_ax25_aprs_is_fd(patty_ax25_aprs_is *aprs); +int patty_ax25_aprs_is_ready(patty_ax25_aprs_is *aprs, fd_set *fds); + ssize_t patty_ax25_aprs_is_fill(patty_ax25_aprs_is *aprs); ssize_t patty_ax25_aprs_is_drain(patty_ax25_aprs_is *, void *buf, size_t len); diff --git a/include/patty/ax25/if.h b/include/patty/ax25/if.h index 75d9a0f..1ad5c00 100644 --- a/include/patty/ax25/if.h +++ b/include/patty/ax25/if.h @@ -35,6 +35,8 @@ typedef patty_ax25_if_stats *(patty_ax25_if_driver_stats)(void *); typedef int (patty_ax25_if_driver_fd)(void *); +typedef int (patty_ax25_if_driver_ready)(void *, fd_set *); + typedef ssize_t (patty_ax25_if_driver_fill)(void *); typedef ssize_t (patty_ax25_if_driver_drain)(void *, void *, size_t); @@ -50,6 +52,7 @@ typedef struct _patty_ax25_if_driver { patty_ax25_if_driver_destroy *destroy; patty_ax25_if_driver_stats *stats; patty_ax25_if_driver_fd *fd; + patty_ax25_if_driver_ready *ready; patty_ax25_if_driver_fill *fill; patty_ax25_if_driver_drain *drain; patty_ax25_if_driver_pending *pending; @@ -104,6 +107,8 @@ void patty_ax25_if_drop(patty_ax25_if *iface); int patty_ax25_if_fd(patty_ax25_if *iface); +int patty_ax25_if_ready(patty_ax25_if *iface, fd_set *fds); + ssize_t patty_ax25_if_fill(patty_ax25_if *iface); ssize_t patty_ax25_if_drain(patty_ax25_if *iface, void *buf, size_t len); diff --git a/include/patty/kiss/tnc.h b/include/patty/kiss/tnc.h index 98e9b51..9a44450 100644 --- a/include/patty/kiss/tnc.h +++ b/include/patty/kiss/tnc.h @@ -35,6 +35,8 @@ patty_kiss_tnc *patty_kiss_tnc_new(patty_kiss_tnc_info *info); int patty_kiss_tnc_fd(patty_kiss_tnc *tnc); +int patty_kiss_tnc_ready(patty_kiss_tnc *tnc, fd_set *fds); + void patty_kiss_tnc_destroy(patty_kiss_tnc *tnc); ssize_t patty_kiss_tnc_fill(patty_kiss_tnc *tnc); diff --git a/src/aprs_is.c b/src/aprs_is.c index 7bc1b1a..f3b00dd 100644 --- a/src/aprs_is.c +++ b/src/aprs_is.c @@ -173,6 +173,10 @@ int patty_ax25_aprs_is_fd(patty_ax25_aprs_is *aprs) { return aprs->fd; } +int patty_ax25_aprs_is_ready(patty_ax25_aprs_is *aprs, fd_set *fds) { + return FD_ISSET(aprs->fd, fds); +} + ssize_t patty_ax25_aprs_is_fill(patty_ax25_aprs_is *aprs) { int attempt = 0; @@ -442,6 +446,7 @@ patty_ax25_if_driver *patty_ax25_aprs_is_driver() { .destroy = (patty_ax25_if_driver_destroy *)patty_ax25_aprs_is_destroy, .stats = (patty_ax25_if_driver_stats *)patty_ax25_aprs_is_stats, .fd = (patty_ax25_if_driver_fd *)patty_ax25_aprs_is_fd, + .ready = (patty_ax25_if_driver_ready *)patty_ax25_aprs_is_ready, .fill = (patty_ax25_if_driver_fill *)patty_ax25_aprs_is_fill, .drain = (patty_ax25_if_driver_drain *)patty_ax25_aprs_is_drain, .pending = (patty_ax25_if_driver_pending *)patty_ax25_aprs_is_pending, diff --git a/src/if.c b/src/if.c index 1a43248..f34b1b1 100644 --- a/src/if.c +++ b/src/if.c @@ -272,6 +272,10 @@ int patty_ax25_if_fd(patty_ax25_if *iface) { return iface->driver->fd(iface->phy); } +int patty_ax25_if_ready(patty_ax25_if *iface, fd_set *fds) { + return iface->driver->ready(iface->phy, fds); +} + ssize_t patty_ax25_if_fill(patty_ax25_if *iface) { return iface->driver->fill(iface->phy); } diff --git a/src/server.c b/src/server.c index 5f683b9..d7252cb 100644 --- a/src/server.c +++ b/src/server.c @@ -2038,7 +2038,7 @@ static int handle_iface(patty_ax25_server *server, struct if_entry *entry) { ssize_t len; - if (!FD_ISSET(entry->fd, &server->fds_r)) { + if (!patty_ax25_if_ready(entry->iface, &server->fds_r)) { goto done; } diff --git a/src/tnc.c b/src/tnc.c index 14278c9..b4eb0ce 100644 --- a/src/tnc.c +++ b/src/tnc.c @@ -201,6 +201,10 @@ int patty_kiss_tnc_fd(patty_kiss_tnc *tnc) { return tnc->fd; } +int patty_kiss_tnc_ready(patty_kiss_tnc *tnc, fd_set *fds) { + return FD_ISSET(tnc->fd, fds); +} + static void tnc_drop(patty_kiss_tnc *tnc) { tnc->state = KISS_NONE; tnc->offset_i = 0; @@ -366,6 +370,7 @@ patty_ax25_if_driver *patty_kiss_tnc_driver() { .destroy = (patty_ax25_if_driver_destroy *)patty_kiss_tnc_destroy, .stats = (patty_ax25_if_driver_stats *)patty_kiss_tnc_stats, .fd = (patty_ax25_if_driver_fd *)patty_kiss_tnc_fd, + .ready = (patty_ax25_if_driver_ready *)patty_kiss_tnc_ready, .fill = (patty_ax25_if_driver_fill *)patty_kiss_tnc_fill, .drain = (patty_ax25_if_driver_drain *)patty_kiss_tnc_drain, .pending = (patty_ax25_if_driver_pending *)patty_kiss_tnc_pending,