added "more" command
[unix-history] / usr / src / usr.bin / window / wwrint.c
CommitLineData
78b88f48 1#ifndef lint
60de5df9 2static 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 */
26wwrint()
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}