17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate * with the License.
87c478bd9Sstevel@tonic-gate *
97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate * and limitations under the License.
137c478bd9Sstevel@tonic-gate *
147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate *
207c478bd9Sstevel@tonic-gate * CDDL HEADER END
217c478bd9Sstevel@tonic-gate */
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate * Copyright 1997 Sun Microsystems, Inc. All rights reserved.
247c478bd9Sstevel@tonic-gate * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate */
267c478bd9Sstevel@tonic-gate
277c478bd9Sstevel@tonic-gate /* Copyright (c) 1988 AT&T */
287c478bd9Sstevel@tonic-gate /* All Rights Reserved */
297c478bd9Sstevel@tonic-gate
307c478bd9Sstevel@tonic-gate /*
317c478bd9Sstevel@tonic-gate * University Copyright- Copyright (c) 1982, 1986, 1988
327c478bd9Sstevel@tonic-gate * The Regents of the University of California
337c478bd9Sstevel@tonic-gate * All Rights Reserved
347c478bd9Sstevel@tonic-gate *
357c478bd9Sstevel@tonic-gate * University Acknowledgment- Portions of this document are derived from
367c478bd9Sstevel@tonic-gate * software developed by the University of California, Berkeley, and its
377c478bd9Sstevel@tonic-gate * contributors.
387c478bd9Sstevel@tonic-gate */
397c478bd9Sstevel@tonic-gate
407c478bd9Sstevel@tonic-gate /*LINTLIBRARY*/
417c478bd9Sstevel@tonic-gate
427c478bd9Sstevel@tonic-gate #include <unistd.h>
437c478bd9Sstevel@tonic-gate #include <sys/types.h>
447c478bd9Sstevel@tonic-gate #include "curses_inc.h"
45*9c88ac3aSToomas Soome #ifdef SYSV
46*9c88ac3aSToomas Soome #include <fcntl.h>
47*9c88ac3aSToomas Soome #endif /* SYSV */
487c478bd9Sstevel@tonic-gate
497c478bd9Sstevel@tonic-gate /*
507c478bd9Sstevel@tonic-gate * Set the file descriptor for typeahead checks to fd. fd can be -1
517c478bd9Sstevel@tonic-gate * to disable the checking.
527c478bd9Sstevel@tonic-gate */
537c478bd9Sstevel@tonic-gate
547c478bd9Sstevel@tonic-gate int
typeahead(int fd)557c478bd9Sstevel@tonic-gate typeahead(int fd)
567c478bd9Sstevel@tonic-gate {
577c478bd9Sstevel@tonic-gate #ifdef SYSV
587c478bd9Sstevel@tonic-gate /*
597c478bd9Sstevel@tonic-gate * Doing fcntls before and after each typeahead check
607c478bd9Sstevel@tonic-gate * read is a serious problem on the 3b2. Profiling
617c478bd9Sstevel@tonic-gate * results indicated that a simple program(edit.c from
627c478bd9Sstevel@tonic-gate * "The New Curses and Terminfo Package") was spending
637c478bd9Sstevel@tonic-gate * 9.2% of the time in fcntl().
647c478bd9Sstevel@tonic-gate */
657c478bd9Sstevel@tonic-gate
667c478bd9Sstevel@tonic-gate int savefd = cur_term->_check_fd;
677c478bd9Sstevel@tonic-gate
687c478bd9Sstevel@tonic-gate /* Close the previous duped file descriptor. */
697c478bd9Sstevel@tonic-gate if (savefd >= 0)
707c478bd9Sstevel@tonic-gate (void) close(savefd);
717c478bd9Sstevel@tonic-gate
727c478bd9Sstevel@tonic-gate /*
737c478bd9Sstevel@tonic-gate * Duplicate the file descriptor so we have one to play with.
747c478bd9Sstevel@tonic-gate * We cannot use dup(2), unfortunately, so we do typeahead checking
757c478bd9Sstevel@tonic-gate * on terminals only. Besides, if typeahead is done when input is
767c478bd9Sstevel@tonic-gate * coming from a file, nothing would EVER get drawn on the screen!
777c478bd9Sstevel@tonic-gate */
787c478bd9Sstevel@tonic-gate
797c478bd9Sstevel@tonic-gate /* MODIFIED: DRS 3/26/89 */
807c478bd9Sstevel@tonic-gate
817c478bd9Sstevel@tonic-gate /*
827c478bd9Sstevel@tonic-gate * a couple of notes by DRS: first, a new file descriptor is
837c478bd9Sstevel@tonic-gate * required, since O_NDELAY must be set. calling fcntl() or dup()
847c478bd9Sstevel@tonic-gate * would provide a new file descriptor, but NOT a new file pointer
857c478bd9Sstevel@tonic-gate * for the open file (by file pointer, i mean a unix kernal file
867c478bd9Sstevel@tonic-gate * ptr). if a new underlying unix file ptr. is not allocated,
877c478bd9Sstevel@tonic-gate * setting O_NDELAY will cause all normal terminal i/o to return
887c478bd9Sstevel@tonic-gate * prematurely without blocking.
897c478bd9Sstevel@tonic-gate *
907c478bd9Sstevel@tonic-gate * second, the call to ttyname is NOT necessary, /dev/tty can be
917c478bd9Sstevel@tonic-gate * used instead. calling ttyname is quite expensive -- especially
927c478bd9Sstevel@tonic-gate * for large /dev directories.
937c478bd9Sstevel@tonic-gate *
947c478bd9Sstevel@tonic-gate * note also that the code for the '#else' clause will not work
957c478bd9Sstevel@tonic-gate * since the new file descriptor MUST have O_NDELAY set for the
967c478bd9Sstevel@tonic-gate * rest of libcurses code to function properly.
977c478bd9Sstevel@tonic-gate *
987c478bd9Sstevel@tonic-gate * 4/24/89: modified to set the close on exec() flag of the newly
997c478bd9Sstevel@tonic-gate * opened file descriptor
1007c478bd9Sstevel@tonic-gate */
1017c478bd9Sstevel@tonic-gate
1027c478bd9Sstevel@tonic-gate /*
1037c478bd9Sstevel@tonic-gate * cur_term->_check_fd = (tty = ttyname(fd)) ?
1047c478bd9Sstevel@tonic-gate * open(tty, O_RDONLY | O_NDELAY) : -1;
1057c478bd9Sstevel@tonic-gate */
1067c478bd9Sstevel@tonic-gate if (isatty(fd)) {
1077c478bd9Sstevel@tonic-gate if ((cur_term->_check_fd = open("/dev/tty", O_RDONLY |
1087c478bd9Sstevel@tonic-gate O_NDELAY)) >= 0)
1097c478bd9Sstevel@tonic-gate (void) fcntl(cur_term->_check_fd, F_SETFD, 1);
1107c478bd9Sstevel@tonic-gate } else
1117c478bd9Sstevel@tonic-gate cur_term->_check_fd = -1;
1127c478bd9Sstevel@tonic-gate
1137c478bd9Sstevel@tonic-gate #else /* SYSV */
1147c478bd9Sstevel@tonic-gate int savefd = cur_term->_check_fd;
1157c478bd9Sstevel@tonic-gate /* Only do typeahead checking if the input is a tty. */
1167c478bd9Sstevel@tonic-gate if (isatty(fd))
1177c478bd9Sstevel@tonic-gate cur_term->_check_fd = fd;
1187c478bd9Sstevel@tonic-gate else
1197c478bd9Sstevel@tonic-gate cur_term->_check_fd = -1;
1207c478bd9Sstevel@tonic-gate #endif /* SYSV */
1217c478bd9Sstevel@tonic-gate return (savefd);
1227c478bd9Sstevel@tonic-gate }
123