Commit | Line | Data |
---|---|---|
78b88f48 | 1 | #ifndef lint |
60de5df9 | 2 | static char sccsid[] = "@(#)wwrint.c 3.4 %G%"; |
78b88f48 EW |
3 | #endif |
4 | ||
60de5df9 EW |
5 | /* |
6 | * Copyright (c) 1983 Regents of the University of California, | |
7 | * All rights reserved. Redistribution permitted subject to | |
8 | * the terms of the Berkeley Software License Agreement. | |
9 | */ | |
10 | ||
78b88f48 EW |
11 | #include "ww.h" |
12 | #include <fcntl.h> | |
13 | #include <sys/signal.h> | |
14 | ||
15 | /* | |
16 | * Tty input interrupt handler. | |
17 | * (1) Read input into buffer (wwib*). | |
18 | * (2) If the flag wwsetjmp is true, do longjmp(wwjmpbuf) for asyncronous | |
19 | * actions, and to avoid race conditions, clear wwsetjmp. | |
20 | * Currently, the last is used to get out of the blocking | |
21 | * select() in wwiomux(). | |
22 | * To avoid race conditions, we only modify wwibq in here, except | |
23 | * when the buffer is empty; and everywhere else, we only change wwibp. | |
24 | * It should be completely safe. | |
25 | */ | |
26 | wwrint() | |
27 | { | |
28 | register n; | |
29 | ||
30 | if (wwibp == wwibq) | |
31 | wwibp = wwibq = wwib; | |
32 | wwnread++; | |
33 | (void) fcntl(0, F_SETFL, FNDELAY|wwnewtty.ww_fflags); | |
34 | n = read(0, wwibq, wwibe - wwibq); | |
35 | (void) fcntl(0, F_SETFL, wwnewtty.ww_fflags); | |
36 | if (n > 0) { | |
37 | wwibq += n; | |
38 | wwnreadc += n; | |
39 | } else if (n == 0) | |
40 | wwnreadz++; | |
41 | else | |
42 | wwnreade++; | |
43 | if (wwinterrupt() && wwsetjmp) { | |
44 | wwsetjmp = 0; | |
7c38ad4d | 45 | (void) sigsetmask(sigblock(0) & ~sigmask(SIGIO)); |
78b88f48 EW |
46 | longjmp(wwjmpbuf, 1); |
47 | } | |
48 | } |