Home | History | Annotate | Line # | Download | only in libterminfo
      1 /* $NetBSD: curterm.c,v 1.14 2020/05/30 16:03:58 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.14 2020/05/30 16:03:58 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 
     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 = (short)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)) < l) {
    103 			p += n;
    104 			l -= n;
    105 			*p++ = '|';
    106 			l--;
    107 			if (nterm->_alias != NULL &&
    108 			    (n = strlcpy(p, nterm->_alias, l)) < l)
    109 			{
    110 				p += n;
    111 				l -= n;
    112 				*p++ = '|';
    113 				l--;
    114 			}
    115 			if (nterm->desc != NULL &&
    116 			    (n = strlcpy(p, nterm->desc, l)) < l)
    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->_buf);
    143 	free(oterm);
    144 	if (oterm == cur_term)
    145 		cur_term = NULL;
    146 	return OK;
    147 }
    148 
    149 char *
    150 termname(void)
    151 {
    152 
    153         _DIAGASSERT(cur_term != NULL);
    154 	return __UNCONST(cur_term->name);
    155 }
    156 
    157 static const char * nullname = "";
    158 
    159 char *
    160 longname(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