diff --git a/include/patty/ax25/if.h b/include/patty/ax25/if.h index 8317b0d..23e39e2 100644 --- a/include/patty/ax25/if.h +++ b/include/patty/ax25/if.h @@ -122,6 +122,8 @@ int patty_ax25_if_ready(patty_ax25_if *iface); ssize_t patty_ax25_if_flush(patty_ax25_if *iface); +ssize_t patty_ax25_if_recv(patty_ax25_if *iface, void *buf, size_t len); + ssize_t patty_ax25_if_send(patty_ax25_if *iface, const void *buf, size_t len); diff --git a/src/if.c b/src/if.c index c414cad..bb9cf50 100644 --- a/src/if.c +++ b/src/if.c @@ -323,6 +323,30 @@ error_handle_promisc_frame: return -1; } +ssize_t patty_ax25_if_recv(patty_ax25_if *iface, void *buf, size_t len) { + while (!patty_ax25_if_ready(iface)) { + ssize_t drained; + + if ((drained = patty_ax25_if_drain(iface, buf, len)) < 0) { + goto error_drain; + } else if (drained == 0) { + ssize_t filled; + + if ((filled = patty_ax25_if_fill(iface)) < 0) { + goto error_fill; + } else if (filled == 0) { + return 0; + } + } + } + + return patty_ax25_if_flush(iface); + +error_drain: +error_fill: + return -1; +} + ssize_t patty_ax25_if_send(patty_ax25_if *iface, const void *buf, size_t len) {