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:
parent
7b5f4e1d30
commit
9251cd97a6
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user