6811333 Remove prom_printf() message in emlxs driver
[opensolaris.git] / usr / src / lib / libcurses / screen / typeahead.c
blob0d343b7539921ba5768f199567fc19da0abc5910
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
20 * CDDL HEADER END
23 * Copyright 1997 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1988 AT&T */
28 /* All Rights Reserved */
31 * University Copyright- Copyright (c) 1982, 1986, 1988
32 * The Regents of the University of California
33 * All Rights Reserved
35 * University Acknowledgment- Portions of this document are derived from
36 * software developed by the University of California, Berkeley, and its
37 * contributors.
40 #pragma ident "%Z%%M% %I% %E% SMI"
42 /*LINTLIBRARY*/
44 #include <unistd.h>
45 #include <sys/types.h>
46 #include "curses_inc.h"
49 * Set the file descriptor for typeahead checks to fd. fd can be -1
50 * to disable the checking.
53 int
54 typeahead(int fd)
56 #ifdef SYSV
58 * Doing fcntls before and after each typeahead check
59 * read is a serious problem on the 3b2. Profiling
60 * results indicated that a simple program(edit.c from
61 * "The New Curses and Terminfo Package") was spending
62 * 9.2% of the time in fcntl().
65 #include <fcntl.h>
66 int savefd = cur_term->_check_fd;
68 /* Close the previous duped file descriptor. */
69 if (savefd >= 0)
70 (void) close(savefd);
73 * Duplicate the file descriptor so we have one to play with.
74 * We cannot use dup(2), unfortunately, so we do typeahead checking
75 * on terminals only. Besides, if typeahead is done when input is
76 * coming from a file, nothing would EVER get drawn on the screen!
79 /* MODIFIED: DRS 3/26/89 */
82 * a couple of notes by DRS: first, a new file descriptor is
83 * required, since O_NDELAY must be set. calling fcntl() or dup()
84 * would provide a new file descriptor, but NOT a new file pointer
85 * for the open file (by file pointer, i mean a unix kernal file
86 * ptr). if a new underlying unix file ptr. is not allocated,
87 * setting O_NDELAY will cause all normal terminal i/o to return
88 * prematurely without blocking.
90 * second, the call to ttyname is NOT necessary, /dev/tty can be
91 * used instead. calling ttyname is quite expensive -- especially
92 * for large /dev directories.
94 * note also that the code for the '#else' clause will not work
95 * since the new file descriptor MUST have O_NDELAY set for the
96 * rest of libcurses code to function properly.
98 * 4/24/89: modified to set the close on exec() flag of the newly
99 * opened file descriptor
103 * cur_term->_check_fd = (tty = ttyname(fd)) ?
104 * open(tty, O_RDONLY | O_NDELAY) : -1;
106 if (isatty(fd)) {
107 if ((cur_term->_check_fd = open("/dev/tty", O_RDONLY |
108 O_NDELAY)) >= 0)
109 (void) fcntl(cur_term->_check_fd, F_SETFD, 1);
110 } else
111 cur_term->_check_fd = -1;
113 #else /* SYSV */
114 int savefd = cur_term->_check_fd;
115 /* Only do typeahead checking if the input is a tty. */
116 if (isatty(fd))
117 cur_term->_check_fd = fd;
118 else
119 cur_term->_check_fd = -1;
120 #endif /* SYSV */
121 return (savefd);