ptty: add event loop to handle input and output for future tests - scroll - scr… | |
git clone git://git.suckless.org/scroll | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 6010f1f28817ad49ed50eca2a0b3a8a90126fd95 | |
parent 4c4aa0e7eb7df99f1bcad885432141dc1cf43dc7 | |
Author: Jan Klemkow <[email protected]> | |
Date: Wed, 15 Apr 2020 22:07:56 +0200 | |
ptty: add event loop to handle input and output for future tests | |
Diffstat: | |
M ptty.c | 39 ++++++++++++++++++++++++++---… | |
1 file changed, 33 insertions(+), 6 deletions(-) | |
--- | |
diff --git a/ptty.c b/ptty.c | |
@@ -3,6 +3,7 @@ | |
#include <errno.h> | |
#include <inttypes.h> | |
#include <limits.h> | |
+#include <poll.h> | |
#include <stdarg.h> | |
#include <stdbool.h> | |
#include <stdio.h> | |
@@ -88,16 +89,42 @@ main(int argc, char *argv[]) | |
} | |
/* parent */ | |
- FILE *fh = fdopen(mfd, "rw"); | |
- if (fh == NULL) | |
- die("fdopen"); | |
if (closeflag && close(mfd) == -1) | |
die("close:"); | |
- char buf[BUFSIZ]; | |
- while (fgets(buf, sizeof buf, fh) != NULL) | |
- fputs(buf, stdout); | |
+ struct pollfd pfd[2] = { | |
+ { STDIN_FILENO, POLLIN, 0}, | |
+ { mfd, POLLIN, 0} | |
+ }; | |
+ | |
+ for (;;) { | |
+ char buf[BUFSIZ]; | |
+ ssize_t n; | |
+ int r; | |
+ | |
+ if ((r = poll(pfd, 2, -1)) == -1) | |
+ die("poll:"); | |
+ | |
+ if (pfd[0].revents & POLLIN) { | |
+ if ((n = read(STDIN_FILENO, buf, sizeof buf)) == -1) | |
+ die("read:"); | |
+ if (n == 0) break; | |
+ if (write(mfd, buf, n) == -1) | |
+ die("write:"); | |
+ } | |
+ | |
+ if (pfd[1].revents & POLLIN) { | |
+ if ((n = read(mfd, buf, sizeof buf)) == -1) | |
+ die("read:"); | |
+ if (n == 0) break; | |
+ if (write(STDOUT_FILENO, buf, n) == -1) | |
+ die("write:"); | |
+ } | |
+ | |
+ if (pfd[0].revents & POLLHUP || pfd[1].revents & POLLHUP) | |
+ break; | |
+ } | |
int status; | |
waitpid(pid, &status, 0); |