1 /* $NetBSD: term.c,v 1.14 2000/05/31 05:50:06 blymn Exp $ */
4 * Copyright (c) 1991, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
35 static char sccsid
[] = "@(#)term.c 8.1 (Berkeley) 6/9/93";
37 __RCSID("$NetBSD: term.c,v 1.14 2000/05/31 05:50:06 blymn Exp $");
40 #include <sys/types.h>
51 char *tbuf
; /* Termcap entry. */
53 const char *askuser
__P((const char *));
54 char *ttys
__P((char *));
57 * Figure out what kind of terminal we're dealing with, and then read in
61 get_termcap_entry(userarg
, tcapbufp
, extended
)
70 char zz
[1024], *zz_ptr
;
71 char *ext_tc
, *newptr
;
78 /* Try the environment. */
79 if ((ttype
= getenv("TERM")) != NULL
)
82 /* Try ttyname(3); check for dialup or other mapping. */
83 if ((ttypath
= ttyname(STDERR_FILENO
)) != NULL
) {
84 if ((p
= strrchr(ttypath
, '/')) != NULL
)
88 if ((t
= getttynam(p
))) {
94 /* If still undefined, use "unknown". */
97 map
: ttype
= mapped(ttype
);
100 * If not a path, remove TERMCAP from the environment so we get a
101 * real entry from /etc/termcap. This prevents us from being fooled
102 * by out of date stuff in the environment.
104 found
: if ((p
= getenv("TERMCAP")) != NULL
&& *p
!= '/')
108 * ttype now contains a pointer to the type of the terminal.
109 * If the first character is '?', ask the user.
111 if (ttype
[0] == '?') {
112 if (ttype
[1] != '\0')
113 ttype
= askuser(ttype
+ 1);
115 ttype
= askuser(NULL
);
117 /* Find the termcap entry. If it doesn't exist, ask the user. */
118 if ((tbuf
= (char *) malloc(1024)) == NULL
) {
119 fprintf(stderr
, "Could not malloc termcap buffer\n");
123 while ((rval
= tgetent(tbuf
, ttype
)) == 0) {
124 warnx("terminal type %s is unknown", ttype
);
125 ttype
= askuser(NULL
);
133 /* check if we get a truncated termcap entry, fish back the full
134 * one if need be and the user has asked for it.
137 if ((extended
== 1) && (tgetstr("ZZ", &zz_ptr
) != NULL
)) {
138 /* it was, fish back the full termcap */
139 sscanf(zz
, "%p", &ext_tc
);
140 if ((newptr
= (char *) realloc(tbuf
, strlen(ext_tc
) + 1))
143 "reallocate of termcap falied\n");
147 strcpy(newptr
, ext_tc
);
155 /* Prompt the user for a terminal type. */
160 static char answer
[256];
163 /* We can get recalled; if so, don't continue uselessly. */
164 if (feof(stdin
) || ferror(stdin
)) {
165 (void)fprintf(stderr
, "\n");
170 (void)fprintf(stderr
, "Terminal type? [%s] ", dflt
);
172 (void)fprintf(stderr
, "Terminal type? ");
173 (void)fflush(stderr
);
175 if (fgets(answer
, sizeof(answer
), stdin
) == NULL
) {
177 (void)fprintf(stderr
, "\n");
183 if ((p
= strchr(answer
, '\n')) != NULL
)