Asterisk - The Open Source Telephony Project  18.5.0
Data Structures | Functions | Variables
term.c File Reference

Terminal Routines. More...

#include "asterisk.h"
#include "asterisk/_private.h"
#include <sys/time.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "asterisk/term.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
#include "asterisk/threadstorage.h"
Include dependency graph for term.c:

Go to the source code of this file.

Data Structures

struct  commonbuf
 

Functions

static void __init_commonbuf (void)
 
const char * ast_term_color (int fgcolor, int bgcolor)
 Return a color sequence string. More...
 
int ast_term_color_code (struct ast_str **str, int fgcolor, int bgcolor)
 Append a color sequence to an ast_str. More...
 
int ast_term_init (void)
 
const char * ast_term_reset (void)
 Returns the terminal reset code. More...
 
static void check_bgcolor (int *bgcolor)
 
static int check_colors_allowed (void)
 
static void check_fgcolor (int *fgcolor, int *attr)
 
static short convshort (char *s)
 
static int opposite (int color)
 
char * term_color (char *outbuf, const char *inbuf, int fgcolor, int bgcolor, int maxout)
 Colorize a specified string by adding terminal color codes. More...
 
char * term_color_code (char *outbuf, int fgcolor, int bgcolor, int maxout)
 Write a color sequence to a string. More...
 
const char * term_end (void)
 
void term_filter_escapes (char *line)
 
const char * term_quit (void)
 
char * term_strip (char *outbuf, const char *inbuf, int maxout)
 Remove colorings from a specified string. More...
 

Variables

static struct ast_threadstorage commonbuf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_commonbuf , .custom_init = NULL , }
 
static char enddata [80] = ""
 
static char quitdata [80] = ""
 
static const char *const termpath []
 
static int vt100compat
 

Detailed Description

Terminal Routines.

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

Definition in file term.c.

Function Documentation

◆ __init_commonbuf()

static void __init_commonbuf ( void  )
static

Definition at line 55 of file term.c.

57 {

◆ ast_term_color()

const char* ast_term_color ( int  fgcolor,
int  bgcolor 
)

Return a color sequence string.

Parameters
fgcolorforeground color
bgcolorbackground color
Note
This function may be called up to 15 times within the arguments to a single function without the danger of overwriting a common buffer.
Returns
A color sequence string, or the empty string, on error

Definition at line 290 of file term.c.

References AST_TERM_MAX_ESCAPE_CHARS, AST_TERM_MAX_ROTATING_BUFFERS, ast_threadstorage_get(), buf, commonbuf::buffer, term_color_code(), and commonbuf::which.

Referenced by print_app_docs(), print_queue(), and set_header().

291 {
292  struct commonbuf *cb = ast_threadstorage_get(&commonbuf, sizeof(*cb));
293  char *buf;
294 
295  if (!cb) {
296  return "";
297  }
298  buf = cb->buffer[cb->which++];
300  cb->which = 0;
301  }
302 
303  return term_color_code(buf, fgcolor, bgcolor, AST_TERM_MAX_ESCAPE_CHARS);
304 }
#define AST_TERM_MAX_ROTATING_BUFFERS
Definition: term.h:72
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define AST_TERM_MAX_ESCAPE_CHARS
Maximum number of characters needed for a color escape sequence, and another one for a trailing reset...
Definition: term.h:71
Definition: term.c:57
char * term_color_code(char *outbuf, int fgcolor, int bgcolor, int maxout)
Write a color sequence to a string.
Definition: term.c:267
char buffer[AST_TERM_MAX_ROTATING_BUFFERS][AST_TERM_MAX_ESCAPE_CHARS]
Definition: term.c:59
short which
Definition: term.c:58

◆ ast_term_color_code()

int ast_term_color_code ( struct ast_str **  str,
int  fgcolor,
int  bgcolor 
)

Append a color sequence to an ast_str.

Parameters
strThe string to append to
fgcolorforeground color
bgcolorbackground color
Return values
0success
-1failure

Definition at line 245 of file term.c.

References ast_opt_force_black_background, ast_str_append(), check_bgcolor(), check_colors_allowed(), check_fgcolor(), COLOR_BLACK, and ESC.

Referenced by ast_xmldoc_printable(), and cli_prompt().

246 {
247  int attr = 0;
248 
249  if (!check_colors_allowed()) {
250  return -1;
251  }
252 
253  check_fgcolor(&fgcolor, &attr);
254  check_bgcolor(&bgcolor);
255 
257  ast_str_append(str, 0, "%c[%d;%d;%dm", ESC, attr, fgcolor, COLOR_BLACK + 10);
258  } else if (bgcolor) {
259  ast_str_append(str, 0, "%c[%d;%d;%dm", ESC, attr, fgcolor, bgcolor + 10);
260  } else {
261  ast_str_append(str, 0, "%c[%d;%dm", ESC, attr, fgcolor);
262  }
263 
264  return 0;
265 }
static void check_fgcolor(int *fgcolor, int *attr)
Definition: term.c:221
#define ast_opt_force_black_background
Definition: options.h:131
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
static int check_colors_allowed(void)
Definition: term.c:240
#define COLOR_BLACK
Definition: term.h:47
static void check_bgcolor(int *bgcolor)
Definition: term.c:233
#define ESC
Definition: term.h:30

◆ ast_term_init()

int ast_term_init ( void  )

Provided by term.c

Definition at line 92 of file term.c.

References ast_opt_console, ast_opt_force_black_background, ast_opt_light_background, ast_opt_no_color, ATTR_RESET, commonbuf::buffer, COLOR_BLACK, COLOR_WHITE, convshort(), end, enddata, ESC, NULL, quitdata, termpath, and vt100compat.

Referenced by ast_remotecontrol(), asterisk_daemon(), and main().

93 {
94  char *term = getenv("TERM");
95  char termfile[256] = "";
96  char buffer[512] = "";
97  int termfd = -1, parseokay = 0, i;
98 
99  if (ast_opt_no_color) {
100  return 0;
101  }
102 
103  if (!ast_opt_console) {
104  /* If any remote console is not compatible, we'll strip the color codes at that point */
105  vt100compat = 1;
106  goto end;
107  }
108 
109  if (!term) {
110  return 0;
111  }
112 
113  for (i = 0;; i++) {
114  if (termpath[i] == NULL) {
115  break;
116  }
117  snprintf(termfile, sizeof(termfile), "%s/%c/%s", termpath[i], *term, term);
118  termfd = open(termfile, O_RDONLY);
119  if (termfd > -1) {
120  break;
121  }
122  }
123  if (termfd > -1) {
124  int actsize = read(termfd, buffer, sizeof(buffer) - 1);
125  short sz_names = convshort(buffer + 2);
126  short sz_bools = convshort(buffer + 4);
127  short n_nums = convshort(buffer + 6);
128 
129  /* if ((sz_names + sz_bools) & 1)
130  sz_bools++; */
131 
132  if (sz_names + sz_bools + n_nums < actsize) {
133  /* Offset 13 is defined in /usr/include/term.h, though we do not
134  * include it here, as it conflicts with include/asterisk/term.h */
135  short max_colors = convshort(buffer + 12 + sz_names + sz_bools + 13 * 2);
136  if (max_colors > 0) {
137  vt100compat = 1;
138  }
139  parseokay = 1;
140  }
141  close(termfd);
142  }
143 
144  if (!parseokay) {
145  /* These comparisons should not be substrings nor case-insensitive, as
146  * terminal types are very particular about how they treat suffixes and
147  * capitalization. For example, terminal type 'linux-m' does NOT
148  * support color, while 'linux' does. Not even all vt100* terminals
149  * support color, either (e.g. 'vt100+fnkeys'). */
150  if (!strcmp(term, "linux")) {
151  vt100compat = 1;
152  } else if (!strcmp(term, "xterm")) {
153  vt100compat = 1;
154  } else if (!strcmp(term, "xterm-color")) {
155  vt100compat = 1;
156  } else if (!strcmp(term, "xterm-256color")) {
157  vt100compat = 1;
158  } else if (!strncmp(term, "Eterm", 5)) {
159  /* Both entries which start with Eterm support color */
160  vt100compat = 1;
161  } else if (!strcmp(term, "vt100")) {
162  vt100compat = 1;
163  } else if (!strncmp(term, "crt", 3)) {
164  /* Both crt terminals support color */
165  vt100compat = 1;
166  }
167  }
168 
169 end:
170  if (vt100compat) {
171  /* Make commands show up in nice colors */
173  snprintf(enddata, sizeof(enddata), "%c[%dm", ESC, COLOR_BLACK);
174  } else if (ast_opt_force_black_background) {
175  snprintf(enddata, sizeof(enddata), "%c[%d;%d;%dm", ESC, ATTR_RESET, COLOR_WHITE, COLOR_BLACK + 10);
176  } else {
177  snprintf(enddata, sizeof(enddata), "%c[%dm", ESC, ATTR_RESET);
178  }
179  snprintf(quitdata, sizeof(quitdata), "%c[%dm", ESC, ATTR_RESET);
180  }
181  return 0;
182 }
#define ast_opt_force_black_background
Definition: options.h:131
static int vt100compat
Definition: term.c:43
static short convshort(char *s)
Definition: term.c:77
#define COLOR_WHITE
Definition: term.h:61
#define NULL
Definition: resample.c:96
char * end
Definition: eagi_proxy.c:73
static char enddata[80]
Definition: term.c:45
#define ast_opt_console
Definition: options.h:109
#define ast_opt_no_color
Definition: options.h:114
static char quitdata[80]
Definition: term.c:46
#define COLOR_BLACK
Definition: term.h:47
#define ATTR_RESET
Definition: term.h:35
char buffer[AST_TERM_MAX_ROTATING_BUFFERS][AST_TERM_MAX_ESCAPE_CHARS]
Definition: term.c:59
#define ast_opt_light_background
Definition: options.h:130
static const char *const termpath[]
Definition: term.c:48
#define ESC
Definition: term.h:30

◆ ast_term_reset()

const char* ast_term_reset ( void  )

Returns the terminal reset code.

Returns
String which, when sent to the screen, resets the terminal colors

Definition at line 306 of file term.c.

References term_end().

Referenced by ast_xmldoc_printable(), cli_show_module_options(), print_app_docs(), print_queue(), and set_header().

307 {
308  return term_end();
309 }
const char * term_end(void)
Definition: term.c:356

◆ check_bgcolor()

static void check_bgcolor ( int *  bgcolor)
static

Definition at line 233 of file term.c.

Referenced by ast_term_color_code(), and term_color_code().

234 {
235  if (*bgcolor) {
236  *bgcolor &= ~128;
237  }
238 }

◆ check_colors_allowed()

static int check_colors_allowed ( void  )
static

Definition at line 240 of file term.c.

References vt100compat.

Referenced by ast_term_color_code(), and term_color_code().

241 {
242  return vt100compat;
243 }
static int vt100compat
Definition: term.c:43

◆ check_fgcolor()

static void check_fgcolor ( int *  fgcolor,
int *  attr 
)
static

Definition at line 221 of file term.c.

References ast_opt_light_background, ATTR_BRIGHT, and opposite().

Referenced by ast_term_color_code(), and term_color_code().

222 {
224  if (*fgcolor & 128) {
225  *fgcolor &= ~128;
226  }
227 
229  *fgcolor = opposite(*fgcolor);
230  }
231 }
#define ATTR_BRIGHT
Definition: term.h:36
#define ast_opt_light_background
Definition: options.h:130
static int opposite(int color)
Definition: term.c:62

◆ convshort()

static short convshort ( char *  s)
static

Definition at line 77 of file term.c.

References a, and b.

Referenced by ast_term_init().

78 {
79  register int a, b;
80 
81  a = (int) s[0] & 0377;
82  b = (int) s[1] & 0377;
83 
84  if (a == 0377 && b == 0377)
85  return -1;
86  if (a == 0376 && b == 0377)
87  return -2;
88 
89  return a + b * 256;
90 }
static struct test_val b
static struct test_val a

◆ opposite()

static int opposite ( int  color)
static

Definition at line 62 of file term.c.

References COLOR_BLACK, COLOR_BLUE, COLOR_BROWN, COLOR_CYAN, COLOR_GREEN, COLOR_MAGENTA, and COLOR_RED.

Referenced by check_fgcolor(), and term_color().

63 {
64  int lookup[] = {
65  /* BLACK */ COLOR_BLACK,
66  /* RED */ COLOR_MAGENTA,
67  /* GREEN */ COLOR_GREEN,
68  /* BROWN */ COLOR_BROWN,
69  /* BLUE */ COLOR_CYAN,
70  /* MAGENTA */ COLOR_RED,
71  /* CYAN */ COLOR_BLUE,
72  /* WHITE */ COLOR_BLACK };
73  return color ? lookup[color - 30] : 0;
74 }
#define COLOR_CYAN
Definition: term.h:59
#define COLOR_GREEN
Definition: term.h:51
#define COLOR_RED
Definition: term.h:49
#define COLOR_BLACK
Definition: term.h:47
#define COLOR_BLUE
Definition: term.h:55
#define COLOR_BROWN
Definition: term.h:53
#define COLOR_MAGENTA
Definition: term.h:57

◆ term_color()

char* term_color ( char *  outbuf,
const char *  inbuf,
int  fgcolor,
int  bgcolor,
int  maxout 
)

Colorize a specified string by adding terminal color codes.

Parameters
outbufResult buffer
inbufStarting string
fgcolorForeground color, specified as one of the constants in include/asterisk/term.h. Use '0' if the want the normal terminal foreground color.
bgcolorBackground color, specified as one of the constants in include/asterisk/term.h. Use '0' if you want the normal terminal background color.
maxoutMaximum size of outbuf
Returns
outbuf
Deprecated:
Due to the necessity of pre-sizing a result buffer, new code should avoid using this function in preference to ast_term_color_code() or ast_term_color().

Definition at line 184 of file term.c.

References ast_copy_string(), ast_opt_force_black_background, ast_opt_light_background, ATTR_BRIGHT, COLOR_BLACK, ESC, opposite(), term_end(), and vt100compat.

Referenced by __ast_register_translator(), ast_frame_dump(), ast_unregister_translator(), cli_show_module_options(), cli_show_module_type(), handle_cli_agi_show(), handle_dahdi_show_cadences(), handle_show_function(), handle_showmancmd(), lua_pbx_exec(), print_event_instance(), realtime_exec(), show_config_description(), start_resource(), test_cli_show_results(), and test_execute_multiple().

185 {
186  int attr = 0;
187 
188  if (!vt100compat) {
189  ast_copy_string(outbuf, inbuf, maxout);
190  return outbuf;
191  }
192  if (!fgcolor) {
193  ast_copy_string(outbuf, inbuf, maxout);
194  return outbuf;
195  }
196 
197  if (fgcolor & 128) {
199  fgcolor &= ~128;
200  }
201 
202  if (bgcolor) {
203  bgcolor &= ~128;
204  }
205 
207  fgcolor = opposite(fgcolor);
208  }
209 
211  if (!bgcolor) {
212  bgcolor = COLOR_BLACK;
213  }
214  snprintf(outbuf, maxout, "%c[%d;%d;%dm%s%s", ESC, attr, fgcolor, bgcolor + 10, inbuf, term_end());
215  } else {
216  snprintf(outbuf, maxout, "%c[%d;%dm%s%s", ESC, attr, fgcolor, inbuf, term_end());
217  }
218  return outbuf;
219 }
#define ast_opt_force_black_background
Definition: options.h:131
static int vt100compat
Definition: term.c:43
static int inbuf(struct baseio *bio, FILE *fi)
utility used by inchar(), for base_encode()
#define ATTR_BRIGHT
Definition: term.h:36
#define COLOR_BLACK
Definition: term.h:47
const char * term_end(void)
Definition: term.c:356
#define ast_opt_light_background
Definition: options.h:130
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
#define ESC
Definition: term.h:30
static int opposite(int color)
Definition: term.c:62

◆ term_color_code()

char* term_color_code ( char *  outbuf,
int  fgcolor,
int  bgcolor,
int  maxout 
)

Write a color sequence to a string.

Parameters
outbufthe location to write to
fgcolorforeground color
bgcolorbackground color
maxoutmaximum number of characters to write
Deprecated:
You should use ast_term_color_code or ast_term_color, instead.
Returns
outbuf

Definition at line 267 of file term.c.

References ast_opt_force_black_background, check_bgcolor(), check_colors_allowed(), check_fgcolor(), COLOR_BLACK, and ESC.

Referenced by ast_term_color().

268 {
269  int attr = 0;
270 
271  if (!check_colors_allowed()) {
272  *outbuf = '\0';
273  return outbuf;
274  }
275 
276  check_fgcolor(&fgcolor, &attr);
277  check_bgcolor(&bgcolor);
278 
280  snprintf(outbuf, maxout, "%c[%d;%d;%dm", ESC, attr, fgcolor, COLOR_BLACK + 10);
281  } else if (bgcolor) {
282  snprintf(outbuf, maxout, "%c[%d;%d;%dm", ESC, attr, fgcolor, bgcolor + 10);
283  } else {
284  snprintf(outbuf, maxout, "%c[%d;%dm", ESC, attr, fgcolor);
285  }
286 
287  return outbuf;
288 }
static void check_fgcolor(int *fgcolor, int *attr)
Definition: term.c:221
#define ast_opt_force_black_background
Definition: options.h:131
static int check_colors_allowed(void)
Definition: term.c:240
#define COLOR_BLACK
Definition: term.h:47
static void check_bgcolor(int *bgcolor)
Definition: term.c:233
#define ESC
Definition: term.h:30

◆ term_end()

const char* term_end ( void  )

Definition at line 356 of file term.c.

References enddata.

Referenced by ast_remotecontrol(), ast_term_reset(), asterisk_daemon(), consolehandler(), main(), and term_color().

357 {
358  return enddata;
359 }
static char enddata[80]
Definition: term.c:45

◆ term_filter_escapes()

void term_filter_escapes ( char *  line)

Definition at line 334 of file term.c.

References ESC, and len().

335 {
336  int i;
337  int len = strlen(line);
338 
339  for (i = 0; i < len; i++) {
340  if (line[i] != ESC)
341  continue;
342  if ((i < (len - 2)) &&
343  (line[i + 1] == 0x5B)) {
344  switch (line[i + 2]) {
345  case 0x30:
346  case 0x31:
347  case 0x33:
348  continue;
349  }
350  }
351  /* replace ESC with a space */
352  line[i] = ' ';
353  }
354 }
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define ESC
Definition: term.h:30

◆ term_quit()

const char* term_quit ( void  )

Definition at line 361 of file term.c.

References quitdata.

Referenced by ast_el_read_char(), check_init(), main(), and really_quit().

362 {
363  return quitdata;
364 }
static char quitdata[80]
Definition: term.c:46

◆ term_strip()

char* term_strip ( char *  outbuf,
const char *  inbuf,
int  maxout 
)

Remove colorings from a specified string.

Parameters
outbufthe location to write to
inbufthe original string
maxoutthe available size of outbuf
Returns
outbuf

Definition at line 311 of file term.c.

References ESC, and inbuf().

Referenced by action_command(), format_log_default(), format_log_json(), and format_log_plain().

312 {
313  char *outbuf_ptr = outbuf;
314  const char *inbuf_ptr = inbuf;
315 
316  while (outbuf_ptr < outbuf + maxout) {
317  switch (*inbuf_ptr) {
318  case ESC:
319  while (*inbuf_ptr && (*inbuf_ptr != 'm'))
320  inbuf_ptr++;
321  break;
322  default:
323  *outbuf_ptr = *inbuf_ptr;
324  outbuf_ptr++;
325  }
326  if (! *inbuf_ptr)
327  break;
328  inbuf_ptr++;
329  }
330  return outbuf;
331 }
static int inbuf(struct baseio *bio, FILE *fi)
utility used by inchar(), for base_encode()
#define ESC
Definition: term.h:30

Variable Documentation

◆ commonbuf

struct ast_threadstorage commonbuf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_commonbuf , .custom_init = NULL , }
static

Definition at line 55 of file term.c.

◆ enddata

char enddata[80] = ""
static

Definition at line 45 of file term.c.

Referenced by ast_term_init(), and term_end().

◆ quitdata

char quitdata[80] = ""
static

Definition at line 46 of file term.c.

Referenced by ast_term_init(), and term_quit().

◆ termpath

const char* const termpath[]
static

Definition at line 48 of file term.c.

Referenced by ast_term_init().

◆ vt100compat

int vt100compat
static

Definition at line 43 of file term.c.

Referenced by ast_term_init(), check_colors_allowed(), and term_color().