Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.