mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-11-15 14:56:13 +01:00
Add proper build infrastructure for teken.
I'm not sure whether we should install teken as a library on any stock FreeBSD installation, but I can imagine people want to tinker around with it now and then. Create a /sys/teken/libteken, which holds a Makefile to install a shared library version of the terminal emulator, complete with a manpage. Also add Makefiles for the demo/stress applications, to build it against the shared library.
This commit is contained in:
parent
f895cc0c50
commit
ecc16c8d3a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=221698
@ -1,13 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= teken_demo
|
||||
SRCS= teken_demo.c teken.c teken_state.h
|
||||
CLEANFILES= teken_state.h teken.log
|
||||
LDADD= -lncurses -lutil
|
||||
NO_MAN=
|
||||
WARNS?= 6
|
||||
|
||||
teken_state.h: gensequences sequences
|
||||
awk -f gensequences sequences > ${.TARGET}
|
||||
|
||||
.include <bsd.prog.mk>
|
9
sys/teken/demo/Makefile
Normal file
9
sys/teken/demo/Makefile
Normal file
@ -0,0 +1,9 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= teken_demo
|
||||
LDADD= -lncurses -lteken -lutil
|
||||
MAN=
|
||||
|
||||
WARNS?= 6
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -45,7 +45,7 @@
|
||||
#include <util.h>
|
||||
#endif
|
||||
|
||||
#include "teken.h"
|
||||
#include <teken.h>
|
||||
|
||||
static tf_bell_t test_bell;
|
||||
static tf_cursor_t test_cursor;
|
39
sys/teken/libteken/Makefile
Normal file
39
sys/teken/libteken/Makefile
Normal file
@ -0,0 +1,39 @@
|
||||
# $FreeBSD$
|
||||
|
||||
LIB= teken
|
||||
SHLIB_MAJOR= 0
|
||||
|
||||
CFLAGS+=-I.
|
||||
WARNS?= 6
|
||||
|
||||
SRCDIR= ${.CURDIR}/..
|
||||
.PATH: ${SRCDIR}
|
||||
|
||||
SRCS= teken.c teken_state.h
|
||||
INCS= teken.h
|
||||
CLEANFILES=teken_state.h
|
||||
|
||||
MAN= teken.3
|
||||
MLINKS= teken.3 teken_256to8.3 \
|
||||
teken.3 teken_get_curattr.3 \
|
||||
teken.3 teken_get_cursor.3 \
|
||||
teken.3 teken_get_defattr.3 \
|
||||
teken.3 teken_get_defattr_cons25.3 \
|
||||
teken.3 teken_get_sequence.3 \
|
||||
teken.3 teken_get_winsize.3 \
|
||||
teken.3 teken_init.3 \
|
||||
teken.3 teken_input.3 \
|
||||
teken.3 teken_set_8bit.3 \
|
||||
teken.3 teken_set_cons25.3 \
|
||||
teken.3 teken_set_curattr.3 \
|
||||
teken.3 teken_set_cursor.3 \
|
||||
teken.3 teken_set_defattr.3 \
|
||||
teken.3 teken_set_winsize.3
|
||||
|
||||
teken_state.h: ${SRCDIR}/gensequences ${SRCDIR}/sequences
|
||||
awk -f ${SRCDIR}/gensequences ${SRCDIR}/sequences > ${.TARGET}
|
||||
|
||||
VERSION_DEF= ${.CURDIR}/../../../lib/libc/Versions.def
|
||||
SYMBOL_MAPS= ${.CURDIR}/Symbol.map
|
||||
|
||||
.include <bsd.lib.mk>
|
21
sys/teken/libteken/Symbol.map
Normal file
21
sys/teken/libteken/Symbol.map
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
FBSD_1.2 {
|
||||
teken_256to8;
|
||||
teken_get_curattr;
|
||||
teken_get_cursor;
|
||||
teken_get_defattr;
|
||||
teken_get_defattr_cons25;
|
||||
teken_get_sequence;
|
||||
teken_get_winsize;
|
||||
teken_init;
|
||||
teken_input;
|
||||
teken_set_8bit;
|
||||
teken_set_cons25;
|
||||
teken_set_curattr;
|
||||
teken_set_cursor;
|
||||
teken_set_defattr;
|
||||
teken_set_winsize;
|
||||
};
|
220
sys/teken/libteken/teken.3
Normal file
220
sys/teken/libteken/teken.3
Normal file
@ -0,0 +1,220 @@
|
||||
.\" Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd May 9, 2011
|
||||
.Dt TEKEN 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm teken
|
||||
.Nd xterm-like terminal emulation interface
|
||||
.Sh LIBRARY
|
||||
.Lb libteken
|
||||
.Sh SYNOPSIS
|
||||
.In teken.h
|
||||
.Ft void
|
||||
.Fn teken_init "teken_t *t" "const teken_funcs_t *funcs" "void *thunk"
|
||||
.Ft void
|
||||
.Fn teken_input "teken_t *t" "const void *buf" "size_t nbytes"
|
||||
.Ft const teken_pos_t *
|
||||
.Fn teken_get_winsize "teken_t *t"
|
||||
.Ft void
|
||||
.Fn teken_set_winsize "teken_t *t" "const teken_pos_t *size"
|
||||
.Ft const teken_pos_t *
|
||||
.Fn teken_get_cursor "teken_t *t"
|
||||
.Ft void
|
||||
.Fn teken_set_cursor "teken_t *t" "const teken_pos_t *pos"
|
||||
.Ft const teken_attr_t *
|
||||
.Fn teken_get_curattr "teken_t *t"
|
||||
.Ft void
|
||||
.Fn teken_set_curattr "teken_t *t" "const teken_attr_t *attr"
|
||||
.Ft const teken_attr_t *
|
||||
.Fn teken_get_defattr "teken_t *t"
|
||||
.Ft void
|
||||
.Fn teken_set_defattr "teken_t *t" "const teken_attr_t *attr"
|
||||
.Ft const char *
|
||||
.Fn teken_get_sequence "teken_t *t" "unsigned int id"
|
||||
.Ft teken_color_t
|
||||
.Fn teken_256to8 "teken_color_t color"
|
||||
.Ft void
|
||||
.Fn teken_get_defattr_cons25 "teken_t *t" "int *fg" "int *bg"
|
||||
.Ft void
|
||||
.Fn teken_set_8bit "teken_t *t"
|
||||
.Ft void
|
||||
.Fn teken_set_cons25 "teken_t *t"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
library implements the input parser of a 256-color xterm-like terminal.
|
||||
It converts a stream of UTF-8 encoded characters into a series of
|
||||
primitive drawing instructions that can be used by a console driver or
|
||||
terminal emulator to render a terminal application.
|
||||
.Pp
|
||||
The
|
||||
.Fn teken_init
|
||||
function is used to initialize terminal state object
|
||||
.Fa t ,
|
||||
having type
|
||||
.Vt teken_t .
|
||||
The supplied
|
||||
.Vt teken_funcs_t
|
||||
structure
|
||||
.Fa funcs
|
||||
contains a set of callback functions, which are called when supplying
|
||||
data to
|
||||
.Fn teken_input .
|
||||
The
|
||||
.Fa thunk
|
||||
argument stores an arbitrary pointer, which is passed to each invocation
|
||||
of the callback functions.
|
||||
.Pp
|
||||
The
|
||||
.Vt teken_funcs_t
|
||||
structure stores the following callbacks:
|
||||
.Bd -literal -offset indent
|
||||
typedef struct {
|
||||
tf_bell_t *tf_bell; /* Audible/visible bell. */
|
||||
tf_cursor_t *tf_cursor; /* Move cursor to x/y. */
|
||||
tf_putchar_t *tf_putchar; /* Put Unicode character at x/y. */
|
||||
tf_fill_t *tf_fill; /* Fill rectangle with character. */
|
||||
tf_copy_t *tf_copy; /* Copy rectangle to new location. */
|
||||
tf_param_t *tf_param; /* Miscellaneous options. */
|
||||
tf_respond_t *tf_respond; /* Send response string to user. */
|
||||
} teken_funcs_t;
|
||||
.Ed
|
||||
.Pp
|
||||
All callbacks must be provided, though unimplemented callbacks may some
|
||||
times be sufficient.
|
||||
The actual types of these callbacks can be found in
|
||||
.In teken.h .
|
||||
.Pp
|
||||
By default,
|
||||
.Fn teken_init
|
||||
initializes the
|
||||
.Vt teken_t
|
||||
structure to emulate a terminal having 24 rows and 80 columns.
|
||||
The
|
||||
.Fn teken_get_winsize
|
||||
and
|
||||
.Fn teken_set_winsize
|
||||
functions can be used to obtain and modify the dimensions of the
|
||||
terminal.
|
||||
.Pp
|
||||
Even though the cursor position is normally controlled by input of data
|
||||
through
|
||||
.Fn teken_input
|
||||
and returned by the
|
||||
.Fn tf_cursor
|
||||
callback, it can be obtained and modified manually using the
|
||||
.Fn teken_get_cursor
|
||||
and
|
||||
.Fn teken_set_cursor
|
||||
functions.
|
||||
The same holds for
|
||||
.Fn teken_get_curattr
|
||||
and
|
||||
.Fn teken_set_curattr ,
|
||||
which can be used to change the currently selected font attributes and
|
||||
foreground and background color.
|
||||
.Pp
|
||||
By default,
|
||||
.Nm
|
||||
emulates a white-on-black terminal, which means the default foreground
|
||||
color is white, while the background color is black.
|
||||
These defaults can be modified using
|
||||
.Fn teken_get_defattr
|
||||
and
|
||||
.Fn teken_set_defattr .
|
||||
.Pp
|
||||
The
|
||||
.Fn teken_get_sequence
|
||||
function is a utility function that can be used to obtain escape
|
||||
sequences of special keyboard keys, generated by user input.
|
||||
The
|
||||
.Fa id
|
||||
parameter must be one of the
|
||||
.Dv TKEY_*
|
||||
parameters listed in
|
||||
.In teken.h .
|
||||
.Sh LEGACY FEATURES
|
||||
This library also provides a set of functions that shouldn't be used in
|
||||
any modern applications.
|
||||
.Pp
|
||||
The
|
||||
.Fn teken_256to8
|
||||
function converts a color code to one of the 8 primary colors, allowing
|
||||
the terminal to be rendered on graphics hardware that only supports 8 or
|
||||
16 colors (e.g. VGA).
|
||||
.Pp
|
||||
The
|
||||
.Fn teken_get_defattr_cons25
|
||||
function obtains the default terminal attributes as a pair of foreground
|
||||
and background colors, using ANSI color numbering.
|
||||
.Pp
|
||||
The
|
||||
.Fn teken_set_8bit
|
||||
function disables UTF-8 processing and switches to 8-bit character mode,
|
||||
which can be used to support character sets like CP437 and ISO-8859-1.
|
||||
.Pp
|
||||
The
|
||||
.Fn teken_set_cons25
|
||||
function switches terminal emulation to
|
||||
.Dv cons25 ,
|
||||
which is used by versions of
|
||||
.Fx
|
||||
prior to 9.0.
|
||||
.Sh SECURITY CONSIDERATIONS
|
||||
The
|
||||
.Fn tf_respond
|
||||
callback is used to respond to device status requests commands generated
|
||||
by an application.
|
||||
In the past, there have been various security issues, where a malicious
|
||||
application sends a device status request before termination, causing
|
||||
the generated response to be interpreted by applications such as
|
||||
.Xr sh 1 .
|
||||
.Pp
|
||||
.Nm
|
||||
only implements a small subset of responses which are unlikely to cause
|
||||
any harm.
|
||||
Still, it is advised to leave
|
||||
.Fn tf_respond
|
||||
unimplemented.
|
||||
.Sh SEE ALSO
|
||||
.Xr ncurses 3 ,
|
||||
.Xr termcap 3 ,
|
||||
.Xr syscons 4 .
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
library appeared in
|
||||
.Fx 8.0 ,
|
||||
though it was only available and used inside the kernel.
|
||||
In
|
||||
.Fx 9.0 ,
|
||||
the
|
||||
.Nm
|
||||
library appeared in userspace.
|
||||
.Sh AUTHORS
|
||||
.An Ed Schouten Aq ed@FreeBSD.org
|
9
sys/teken/stress/Makefile
Normal file
9
sys/teken/stress/Makefile
Normal file
@ -0,0 +1,9 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= teken_stress
|
||||
LDADD= -lteken
|
||||
MAN=
|
||||
|
||||
WARNS?= 6
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -34,7 +34,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "teken.h"
|
||||
#include <teken.h>
|
||||
|
||||
static tf_bell_t stress_bell;
|
||||
static tf_cursor_t stress_cursor;
|
@ -32,7 +32,6 @@
|
||||
#include <sys/lock.h>
|
||||
#include <sys/systm.h>
|
||||
#define teken_assert(x) MPASS(x)
|
||||
#define teken_printf(x,...)
|
||||
#else /* !(__FreeBSD__ && _KERNEL) */
|
||||
#include <sys/types.h>
|
||||
#include <assert.h>
|
||||
@ -40,14 +39,11 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#define teken_assert(x) assert(x)
|
||||
#define teken_printf(x,...) do { \
|
||||
if (df != NULL) \
|
||||
fprintf(df, x, ## __VA_ARGS__); \
|
||||
} while (0)
|
||||
/* debug messages */
|
||||
static FILE *df;
|
||||
#endif /* __FreeBSD__ && _KERNEL */
|
||||
|
||||
/* debug messages */
|
||||
#define teken_printf(x,...)
|
||||
|
||||
/* Private flags for t_stateflags. */
|
||||
#define TS_FIRSTDIGIT 0x0001 /* First numeric digit in escape sequence. */
|
||||
#define TS_INSERT 0x0002 /* Insert mode. */
|
||||
@ -153,12 +149,6 @@ teken_init(teken_t *t, const teken_funcs_t *tf, void *softc)
|
||||
{
|
||||
teken_pos_t tp = { .tp_row = 24, .tp_col = 80 };
|
||||
|
||||
#if !(defined(__FreeBSD__) && defined(_KERNEL))
|
||||
df = fopen("teken.log", "w");
|
||||
if (df != NULL)
|
||||
setvbuf(df, NULL, _IOLBF, BUFSIZ);
|
||||
#endif /* !(__FreeBSD__ && _KERNEL) */
|
||||
|
||||
t->t_funcs = tf;
|
||||
t->t_softc = softc;
|
||||
|
||||
|
@ -29,6 +29,8 @@
|
||||
#ifndef _TEKEN_H_
|
||||
#define _TEKEN_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
/*
|
||||
* libteken: terminal emulation library.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user