curterm.c revision 1.13
1/* $NetBSD: curterm.c,v 1.13 2017/05/04 09:42:23 roy 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.13 2017/05/04 09:42:23 roy 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 41TERMINAL *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 52char ttytype[NAMESIZE]; 53 54static 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 59void 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 = (short)i; 74 break; 75 } 76 } 77} 78 79TERMINAL * 80set_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 131int 132del_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->_buf); 143 free(oterm); 144 if (oterm == cur_term) 145 cur_term = NULL; 146 return OK; 147} 148 149char * 150termname(void) 151{ 152 153 _DIAGASSERT(cur_term != NULL); 154 return __UNCONST(cur_term->name); 155} 156 157static const char * nullname = ""; 158 159char * 160longname(void) 161{ 162 163 _DIAGASSERT(cur_term != NULL); 164 if (cur_term->desc == NULL) 165 return __UNCONST(nullname); 166 return __UNCONST(cur_term->desc); 167} 168