poll(3) is a purely Unix facility, so it cannot be directly used by
common code. read(2) is limited in device support outside of Unix.
Create wrapper functions and implement them for Unix.

Signed-off-by: Dmitry Kozlyuk <dmitry.kozl...@gmail.com>
---
 lib/librte_cmdline/cmdline.c         | 12 +++---------
 lib/librte_cmdline/cmdline_os_unix.c | 20 ++++++++++++++++++++
 lib/librte_cmdline/cmdline_private.h |  6 ++++++
 3 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/lib/librte_cmdline/cmdline.c b/lib/librte_cmdline/cmdline.c
index 6f3fdd598..a04719998 100644
--- a/lib/librte_cmdline/cmdline.c
+++ b/lib/librte_cmdline/cmdline.c
@@ -11,7 +11,6 @@
 #include <stdarg.h>
 #include <inttypes.h>
 #include <fcntl.h>
-#include <poll.h>
 #include <errno.h>
 #include <netinet/in.h>
 
@@ -185,7 +184,6 @@ cmdline_quit(struct cmdline *cl)
 int
 cmdline_poll(struct cmdline *cl)
 {
-       struct pollfd pfd;
        int status;
        ssize_t read_status;
        char c;
@@ -195,16 +193,12 @@ cmdline_poll(struct cmdline *cl)
        else if (cl->rdl.status == RDLINE_EXITED)
                return RDLINE_EXITED;
 
-       pfd.fd = cl->s_in;
-       pfd.events = POLLIN;
-       pfd.revents = 0;
-
-       status = poll(&pfd, 1, 0);
+       status = cmdline_poll_char(cl);
        if (status < 0)
                return status;
        else if (status > 0) {
                c = -1;
-               read_status = read(cl->s_in, &c, 1);
+               read_status = cmdline_read_char(cl, &c);
                if (read_status < 0)
                        return read_status;
 
@@ -226,7 +220,7 @@ cmdline_interact(struct cmdline *cl)
 
        c = -1;
        while (1) {
-               if (read(cl->s_in, &c, 1) <= 0)
+               if (cmdline_read_char(cl, &c) <= 0)
                        break;
                if (cmdline_in(cl, &c, 1) < 0)
                        break;
diff --git a/lib/librte_cmdline/cmdline_os_unix.c 
b/lib/librte_cmdline/cmdline_os_unix.c
index ca47bd19f..865a89ddd 100644
--- a/lib/librte_cmdline/cmdline_os_unix.c
+++ b/lib/librte_cmdline/cmdline_os_unix.c
@@ -2,7 +2,9 @@
  * Copyright (c) 2020 Dmitry Kozlyuk
  */
 
+#include <poll.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "cmdline_private.h"
 
@@ -25,3 +27,21 @@ terminal_restore(const struct terminal *oldterm)
 {
        tcsetattr(fileno(stdin), TCSANOW, &oldterm->termios);
 }
+
+int
+cmdline_poll_char(struct cmdline *cl)
+{
+       struct pollfd pfd;
+
+       pfd.fd = cl->s_in;
+       pfd.events = POLLIN;
+       pfd.revents = 0;
+
+       return poll(&pfd, 1, 0);
+}
+
+ssize_t
+cmdline_read_char(struct cmdline *cl, char *c)
+{
+       return read(cl->s_in, c, 1);
+}
diff --git a/lib/librte_cmdline/cmdline_private.h 
b/lib/librte_cmdline/cmdline_private.h
index adc552845..ecfeb89f6 100644
--- a/lib/librte_cmdline/cmdline_private.h
+++ b/lib/librte_cmdline/cmdline_private.h
@@ -29,4 +29,10 @@ struct cmdline {
        struct terminal oldterm;
 };
 
+/* Check if a single character can be read from input. */
+int cmdline_poll_char(struct cmdline *cl);
+
+/* Read one character from input. */
+ssize_t cmdline_read_char(struct cmdline *cl, char *c);
+
 #endif
-- 
2.25.4

Reply via email to