cmdline: add internal wrappers for character input

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.kozliuk@gmail.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
This commit is contained in:
Dmitry Kozlyuk 2020-09-29 00:50:48 +03:00 committed by Thomas Monjalon
parent 7b5f4e1d30
commit 9251cd97a6
3 changed files with 30 additions and 10 deletions

View File

@ -11,13 +11,12 @@
#include <stdarg.h>
#include <inttypes.h>
#include <fcntl.h>
#include <poll.h>
#include <errno.h>
#include <netinet/in.h>
#include <rte_string_fns.h>
#include "cmdline.h"
#include "cmdline_private.h"
static void
cmdline_valid_buffer(struct rdline *rdl, const char *buf,
@ -184,7 +183,6 @@ cmdline_quit(struct cmdline *cl)
int
cmdline_poll(struct cmdline *cl)
{
struct pollfd pfd;
int status;
ssize_t read_status;
char c;
@ -194,16 +192,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;
@ -225,7 +219,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;

View File

@ -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 cmdline *cl)
{
tcsetattr(fileno(stdin), TCSANOW, &cl->oldterm);
}
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);
}

View File

@ -13,4 +13,10 @@ void terminal_adjust(struct cmdline *cl);
/* Restore terminal settings form oldterm. */
void terminal_restore(const struct cmdline *cl);
/* 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