| /* |
| * Copyright (c) 2017 Oticon A/S |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** |
| * Functions to print errors and traces |
| */ |
| |
| #include <stdlib.h> /* for exit */ |
| #include <stdio.h> /* for printfs */ |
| #include <stdarg.h> /* for va args */ |
| #include <unistd.h> |
| #include "soc.h" |
| #include "posix_board_if.h" |
| #include "cmdline.h" |
| |
| void posix_vprint_error_and_exit(const char *format, va_list vargs) |
| { |
| vfprintf(stderr, format, vargs); |
| posix_exit(1); |
| } |
| |
| void posix_vprint_warning(const char *format, va_list vargs) |
| { |
| vfprintf(stderr, format, vargs); |
| } |
| |
| void posix_vprint_trace(const char *format, va_list vargs) |
| { |
| vfprintf(stdout, format, vargs); |
| } |
| |
| void posix_print_error_and_exit(const char *format, ...) |
| { |
| va_list variable_args; |
| |
| va_start(variable_args, format); |
| posix_vprint_error_and_exit(format, variable_args); |
| va_end(variable_args); |
| } |
| |
| void posix_print_warning(const char *format, ...) |
| { |
| va_list variable_args; |
| |
| va_start(variable_args, format); |
| vfprintf(stderr, format, variable_args); |
| va_end(variable_args); |
| } |
| |
| void posix_print_trace(const char *format, ...) |
| { |
| va_list variable_args; |
| |
| va_start(variable_args, format); |
| vfprintf(stdout, format, variable_args); |
| va_end(variable_args); |
| } |
| |
| /** |
| * Are stdout and stderr connected to a tty |
| * 0 = no |
| * 1 = yes |
| * -1 = we do not know yet |
| * Indexed 0:stdout, 1:stderr |
| */ |
| static int is_a_tty[2] = {-1, -1}; |
| |
| void trace_disable_color(char *argv, int offset) |
| { |
| is_a_tty[0] = 0; |
| is_a_tty[1] = 0; |
| } |
| |
| void trace_enable_color(char *argv, int offset) |
| { |
| is_a_tty[0] = -1; |
| is_a_tty[1] = -1; |
| |
| } |
| |
| void trace_force_color(char *argv, int offset) |
| { |
| is_a_tty[0] = 1; |
| is_a_tty[1] = 1; |
| } |
| |
| int posix_trace_over_tty(int file_number) |
| { |
| return is_a_tty[file_number]; |
| } |
| |
| static void decide_about_color(void) |
| { |
| if (is_a_tty[0] == -1) { |
| is_a_tty[0] = isatty(STDOUT_FILENO); |
| } |
| if (is_a_tty[1] == -1) { |
| is_a_tty[1] = isatty(STDERR_FILENO); |
| } |
| } |
| |
| NATIVE_TASK(decide_about_color, PRE_BOOT_2, 0); |
| |
| void native_add_tracing_options(void) |
| { |
| static struct args_struct_t trace_options[] = { |
| /* |
| * Fields: |
| * manual, mandatory, switch, |
| * option_name, var_name ,type, |
| * destination, callback, |
| * description |
| */ |
| { false, false, true, |
| "color", "color", 'b', |
| NULL, trace_enable_color, |
| "(default) Enable color in traces if printing to console"}, |
| { false, false, true, |
| "no-color", "no-color", 'b', |
| NULL, trace_disable_color, |
| "Disable color in traces even if printing to console"}, |
| { false, false, true, |
| "force-color", "force-color", 'b', |
| NULL, trace_force_color, |
| "Enable color in traces even if printing to files/pipes"}, |
| ARG_TABLE_ENDMARKER}; |
| |
| native_add_command_line_opts(trace_options); |
| } |