1 /* $NetBSD: curterm.c,v 1.10 2013/11/18 20:51:03 joerg Exp $ */ 2 3 /* 4 * Copyright (c) 2009, 2011 The NetBSD Foundation, Inc. 5 * 6 * This code is derived from software contributed to The NetBSD Foundation 7 * by Roy Marples. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #include <sys/cdefs.h> 31 __RCSID("$NetBSD: curterm.c,v 1.10 2013/11/18 20:51:03 joerg Exp $"); 32 33 #include <assert.h> 34 #include <stdlib.h> 35 #include <string.h> 36 #include <term_private.h> 37 #include <term.h> 38 #include <termios.h> 39 #include <stdio.h> 40 41 TERMINAL *cur_term; 42 43 /* 44 * There is no standard way of getting a list of aliases for the 45 * terminal. However, some applications such as telnet want to know this. 46 * ncurses dumps the terminfo header into an undefined variable ttytype 47 * and these applications then parse it to work out the aliases. 48 * We should do the same for now, until a standard mechanism for getting 49 * the information is available or the need for it goes away. 50 */ 51 #define NAMESIZE 256 52 char ttytype[NAMESIZE]; 53 54 static const speed_t bauds[] = { 55 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 2400, 4800, 9600, 56 19200, 38400, 57600, 115200, 230400, 460800, 921600 57 }; 58 59 void 60 _ti_setospeed(TERMINAL *term) 61 { 62 struct termios termios; 63 speed_t os; 64 size_t i; 65 66 _DIAGASSERT(term != NULL); 67 68 term->_ospeed = 0; 69 if (tcgetattr(term->fildes, &termios) == 0) { 70 os = cfgetospeed(&termios); 71 for (i = 0; i < __arraycount(bauds); i++) 72 if (bauds[i] == os) { 73 term->_ospeed = i; 74 break; 75 } 76 } 77 } 78 79 TERMINAL * 80 set_curterm(TERMINAL *nterm) 81 { 82 TERMINAL *oterm; 83 size_t l, n; 84 char *p; 85 86 oterm = cur_term; 87 cur_term = nterm; 88 89 ospeed = 0; 90 if (cur_term == NULL) 91 PC = '\0'; 92 else { 93 if (pad_char == NULL) 94 PC = '\0'; 95 else 96 PC = *pad_char; 97 _ti_setospeed(nterm); 98 ospeed = nterm->_ospeed; 99 100 p = ttytype; 101 l = sizeof(ttytype); 102 if ((n = strlcpy(p, nterm->name, l)) == strlen(p)) { 103 p += n; 104 l -= n; 105 *p++ = '|'; 106 l--; 107 if (nterm->_alias && 108 (n = strlcpy(p, nterm->_alias, l)) == strlen(p)) 109 { 110 p += n; 111 l -= n; 112 *p++ = '|'; 113 l--; 114 } 115 if (nterm->desc && 116 (n = strlcpy(p, nterm->desc, l)) == strlen(p)) 117 { 118 p += n; 119 l -= n; 120 *p++ = '|'; 121 l--; 122 } 123 p--; 124 } 125 *p = '\0'; 126 } 127 128 return oterm; 129 } 130 131 int 132 del_curterm(TERMINAL *oterm) 133 { 134 135 if (oterm == NULL) 136 return ERR; 137 free(oterm->_area); 138 free(oterm->strs); 139 free(oterm->nums); 140 free(oterm->flags); 141 free(oterm->_userdefs); 142 free(oterm); 143 return OK; 144 } 145 146 char * 147 termname(void) 148 { 149 150 _DIAGASSERT(cur_term != NULL); 151 return __UNCONST(cur_term->name); 152 } 153 154 static const char * nullname = ""; 155 156 char * 157 longname(void) 158 { 159 160 _DIAGASSERT(cur_term != NULL); 161 if (cur_term->desc == NULL) 162 return __UNCONST(nullname); 163 return __UNCONST(cur_term->desc); 164 } 165