summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1997-11-11 12:28:02 +0000
committerbrian <brian@FreeBSD.org>1997-11-11 12:28:02 +0000
commit90324e9327365460167787b036a8b4a6f37fe0e8 (patch)
tree17ac453ac7ccb7d06824fee93af8c4c53c6f6add
parent474d294d46696245d3ace21106015186dfde8a3e (diff)
downloadFreeBSD-src-90324e9327365460167787b036a8b4a6f37fe0e8.zip
FreeBSD-src-90324e9327365460167787b036a8b4a6f37fe0e8.tar.gz
Poll the socket descriptor while in el_gets()
so that our display is scribbled over as we requested.
-rw-r--r--usr.sbin/pppctl/pppctl.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/usr.sbin/pppctl/pppctl.c b/usr.sbin/pppctl/pppctl.c
index ea5b115..e86033c 100644
--- a/usr.sbin/pppctl/pppctl.c
+++ b/usr.sbin/pppctl/pppctl.c
@@ -7,6 +7,7 @@
#include <netdb.h>
#include <histedit.h>
+#include <poll.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
@@ -128,6 +129,40 @@ Receive(int fd, unsigned TimeoutVal, int display)
return Result;
}
+static int data = -1;
+
+static void
+check_fd(int sig)
+{
+ if (data != -1) {
+ struct pollfd p;
+ static char buf[LINELEN];
+
+ p.fd = data;
+ p.events = POLLIN|POLLPRI;
+ p.revents = p.events|POLLOUT;
+ if (poll(&p, 1, 0) > 0)
+ write(1, buf, read(data, buf, sizeof buf));
+ }
+}
+
+static const char *
+smartgets(EditLine *e, int *count, int fd)
+{
+ const char *result;
+ /* struct itimerval it; */
+
+ data = fd;
+ signal(SIGALRM, check_fd);
+ ualarm(500000, 500000);
+ result = el_gets(e, count);
+ ualarm(0,0);
+ signal(SIGALRM, SIG_DFL);
+ data = -1;
+
+ return result;
+}
+
int
main(int argc, char **argv)
{
@@ -307,7 +342,7 @@ main(int argc, char **argv)
el_set(edit, EL_EDITOR, "emacs");
el_set(edit, EL_SIGNAL, 1);
el_set(edit, EL_HIST, history, (const char *)hist);
- while ((l = el_gets(edit, &len))) {
+ while ((l = smartgets(edit, &len, fd))) {
if (len > 1)
history(hist, H_ENTER, l);
write(fd, l, len);
OpenPOWER on IntegriCloud