* Fix termcap handling to use the new interface to avoid buffer
overflows with extended termcap entries. * Made delay_output use usleep instead of the grungy tgoto hack it had.
This commit is contained in:
parent
dd22c41749
commit
cd583077db
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: hack.termcap.c,v 1.9 1999/10/04 23:27:01 lukem Exp $ */
|
||||
/* $NetBSD: hack.termcap.c,v 1.10 2000/05/20 14:01:42 blymn Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
|
||||
@ -6,22 +6,25 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: hack.termcap.c,v 1.9 1999/10/04 23:27:01 lukem Exp $");
|
||||
__RCSID("$NetBSD: hack.termcap.c,v 1.10 2000/05/20 14:01:42 blymn Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <termcap.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include "hack.h"
|
||||
#include "extern.h"
|
||||
#include "def.flag.h" /* for flags.nonull */
|
||||
|
||||
static char tbuf[512];
|
||||
static char *tbuf;
|
||||
static struct tinfo *info;
|
||||
static char *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE, *TI, *TE;
|
||||
static char *VS, *VE;
|
||||
static int SG;
|
||||
static char PC = '\0';
|
||||
static char BC_char = '\b'; /* if bc is not set use this */
|
||||
char *CD; /* tested in pri.c: docorner() */
|
||||
int CO, LI; /* used in pri.c and whatis.c */
|
||||
|
||||
@ -29,63 +32,56 @@ void
|
||||
startup()
|
||||
{
|
||||
char *term;
|
||||
char *tptr;
|
||||
char *tbufptr, *pc;
|
||||
|
||||
tptr = (char *) alloc(1024);
|
||||
|
||||
tbufptr = tbuf;
|
||||
if (!(term = getenv("TERM")))
|
||||
tbuf = NULL;
|
||||
|
||||
if (!(term = getenv("TERM")))
|
||||
error("Can't get TERM.");
|
||||
if (!strncmp(term, "5620", 4))
|
||||
flags.nonull = 1; /* this should be a termcap flag */
|
||||
if (tgetent(tptr, term) < 1)
|
||||
if (t_getent(&info, term) < 1)
|
||||
error("Unknown terminal type: %s.", term);
|
||||
if ((pc = tgetstr("pc", &tbufptr)) != NULL)
|
||||
if ((pc = t_agetstr(info, "pc", &tbuf, &tbufptr)) != NULL)
|
||||
PC = *pc;
|
||||
if (!(BC = tgetstr("bc", &tbufptr))) {
|
||||
if (!tgetflag("bs"))
|
||||
if (!(BC = t_agetstr(info, "bc", &tbuf, &tbufptr))) {
|
||||
if (!t_getflag(info, "bs"))
|
||||
error("Terminal must backspace.");
|
||||
BC = tbufptr;
|
||||
tbufptr += 2;
|
||||
*BC = '\b';
|
||||
BC = &BC_char;
|
||||
}
|
||||
HO = tgetstr("ho", &tbufptr);
|
||||
CO = tgetnum("co");
|
||||
LI = tgetnum("li");
|
||||
HO = t_agetstr(info, "ho", &tbuf, &tbufptr);
|
||||
CO = t_getnum(info, "co");
|
||||
LI = t_getnum(info, "li");
|
||||
if (CO < COLNO || LI < ROWNO + 2)
|
||||
setclipped();
|
||||
if (!(CL = tgetstr("cl", &tbufptr)))
|
||||
if (!(CL = t_agetstr(info, "cl", &tbuf, &tbufptr)))
|
||||
error("Hack needs CL.");
|
||||
ND = tgetstr("nd", &tbufptr);
|
||||
if (tgetflag("os"))
|
||||
ND = t_agetstr(info, "nd", &tbuf, &tbufptr);
|
||||
if (t_getflag(info, "os"))
|
||||
error("Hack can't have OS.");
|
||||
CE = tgetstr("ce", &tbufptr);
|
||||
UP = tgetstr("up", &tbufptr);
|
||||
CE = t_agetstr(info, "ce", &tbuf, &tbufptr);
|
||||
UP = t_agetstr(info, "up", &tbuf, &tbufptr);
|
||||
/*
|
||||
* It seems that xd is no longer supported, and we should use a
|
||||
* linefeed instead; unfortunately this requires resetting CRMOD, and
|
||||
* many output routines will have to be modified slightly. Let's
|
||||
* leave that till the next release.
|
||||
*/
|
||||
XD = tgetstr("xd", &tbufptr);
|
||||
/* not: XD = tgetstr("do", &tbufptr); */
|
||||
if (!(CM = tgetstr("cm", &tbufptr))) {
|
||||
XD = t_agetstr(info, "xd", &tbuf, &tbufptr);
|
||||
/* not: XD = t_agetstr(info, "do", &tbuf, &tbufptr); */
|
||||
if (!(CM = t_agetstr(info, "cm", &tbuf, &tbufptr))) {
|
||||
if (!UP && !HO)
|
||||
error("Hack needs CM or UP or HO.");
|
||||
printf("Playing hack on terminals without cm is suspect...\n");
|
||||
getret();
|
||||
}
|
||||
SO = tgetstr("so", &tbufptr);
|
||||
SE = tgetstr("se", &tbufptr);
|
||||
SG = tgetnum("sg"); /* -1: not fnd; else # of spaces left by so */
|
||||
SO = t_agetstr(info, "so", &tbuf, &tbufptr);
|
||||
SE = t_agetstr(info, "se", &tbuf, &tbufptr);
|
||||
SG = t_getnum(info, "sg"); /* -1: not fnd; else # of spaces left by so */
|
||||
if (!SO || !SE || (SG > 0))
|
||||
SO = SE = 0;
|
||||
CD = tgetstr("cd", &tbufptr);
|
||||
CD = t_agetstr(info, "cd", &tbuf, &tbufptr);
|
||||
set_whole_screen(); /* uses LI and CD */
|
||||
if (tbufptr - tbuf > sizeof(tbuf))
|
||||
error("TERMCAP entry too big...\n");
|
||||
free(tptr);
|
||||
}
|
||||
|
||||
void
|
||||
@ -180,9 +176,13 @@ void
|
||||
cmov(x, y)
|
||||
int x, y;
|
||||
{
|
||||
xputs(tgoto(CM, x - 1, y - 1));
|
||||
cury = y;
|
||||
curx = x;
|
||||
char buf[256];
|
||||
|
||||
if (t_goto(info, CM, x - 1, y - 1, buf, 255) >= 0) {
|
||||
xputs(buf);
|
||||
cury = y;
|
||||
curx = x;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
@ -229,10 +229,12 @@ clear_screen()
|
||||
void
|
||||
home()
|
||||
{
|
||||
char buf[256];
|
||||
|
||||
if (HO)
|
||||
xputs(HO);
|
||||
else if (CM)
|
||||
xputs(tgoto(CM, 0, 0));
|
||||
else if ((CM) && (t_goto(info, CM, 0, 0, buf, 255) >= 0))
|
||||
xputs(buf);
|
||||
else
|
||||
curs(1, 1); /* using UP ... */
|
||||
curx = cury = 1;
|
||||
@ -269,31 +271,10 @@ bell()
|
||||
void
|
||||
delay_output()
|
||||
{
|
||||
|
||||
/* delay 50 ms - could also use a 'nap'-system call */
|
||||
/*
|
||||
* BUG: if the padding character is visible, as it is on the 5620
|
||||
* then this looks terrible.
|
||||
*/
|
||||
if (!flags.nonull)
|
||||
tputs("50", 1, xputc);
|
||||
|
||||
/* cbosgd!cbcephus!pds for SYS V R2 */
|
||||
/* is this terminfo, or what? */
|
||||
/* tputs("$<50>", 1, xputc); */
|
||||
|
||||
else if (ospeed > 0)
|
||||
if (CM) {
|
||||
/*
|
||||
* delay by sending cm(here) an appropriate number of
|
||||
* times
|
||||
*/
|
||||
int cmlen = strlen(tgoto(CM, curx - 1, cury - 1));
|
||||
int i = (ospeed + (100 * cmlen)) / (200 * cmlen);
|
||||
|
||||
while (i > 0) {
|
||||
cmov(curx, cury);
|
||||
}
|
||||
}
|
||||
/* or the usleep call like this :-) */
|
||||
usleep(50000);
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user