Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP3:GA
plymouth
plymouth-filter-escape-codes.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File plymouth-filter-escape-codes.patch of Package plymouth
--- plymouth-0.9.2/src/libply/ply-terminal-session.c +++ plymouth-0.9.2/src/libply/ply-terminal-session.c 2017-01-18 12:13:22.232318860 +0000 @@ -65,6 +65,190 @@ static bool ply_terminal_session_execute static void ply_terminal_session_start_logging (ply_terminal_session_t *session); static void ply_terminal_session_stop_logging (ply_terminal_session_t *session); +enum { + ESnormal, + ESesc, + ESsquare, + ESgetpars, + ESgotpars, + ESfunckey, + EShash, + ESsetG0, + ESsetG1, + ESpercent, + ESignore, + ESnonstd, + ESpalette +}; + +#define NPAR 16 +static unsigned int state = ESnormal; +static int npar; + +static uint8_t color_code[10] = {'\033', '[', 0, 0, 0, 0, 0, 0, 0, 0}; +static unsigned int color_index = 2; +static uint8_t color_seperator = 0; + +static unsigned int ply_terminal_strip_control_codes(ply_logger_t *logger, + uint8_t* buf, size_t s) +{ + uint8_t c; + size_t r = s; + ssize_t up; + uint8_t result[6] = {0, 0, 0, 0, 0, 0}; + unsigned int index = 0; + + while (r > 0) { + c = (unsigned char)*buf; + + switch (state) { + case ESnormal: + default: + state = ESnormal; + switch (c) { + case '\033': + state = ESesc; + break; + case 128 + 27: + state = ESsquare; + break; + case 14: + case 15: + case 24: + case 26: + break; + case 0 ... 8: + case 16 ... 23: + case 25: + case 28 ... 31: + result [0] = '^'; + result [1] = c + 64; + ply_logger_inject_bytes (logger, result, 2); + index += 2; + break; + case 127: + result [0] = '^'; + result [1] = '?'; + ply_logger_inject_bytes (logger, result, 2); + index += 2; + break; + case 128 ... 128+26: + case 128+28 ... 159: + up = snprintf((char*)result, sizeof(result), "\\%03o", c); + if (up > 0) { + ply_logger_inject_bytes (logger, result, up); + index += up; + } + break; + case '\t': + case '\r': + case '\n': + default: + result [0] = c; + ply_logger_inject_bytes (logger, result, 1); + index++; + break; + } + break; + case ESesc: + state = ESnormal; + switch ((unsigned char)c) { + case '[': + state = ESsquare; + break; + case ']': + state = ESnonstd; + break; + case '%': + state = ESpercent; + break; + case '(': + state = ESsetG0; + break; + case ')': + state = ESsetG1; + break; + case '#': + state = EShash; + break; + default: + break; + } + break; + case ESnonstd: + if (c == 'P') { + npar = 0; + state = ESpalette; + } else if (c == 'R') + state = ESnormal; + else + state = ESnormal; + break; + case ESpalette: + if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || + (c >= 'a' && c <= 'f')) { + npar++; + if (npar == 7) + state = ESnormal; + } else + state = ESnormal; + break; + case ESsquare: + npar = 0; + state = ESgetpars; + if (c == '[') { + state = ESfunckey; + break; + } + if (c == '?') + break; + case ESgetpars: + if (c == ';' && npar < NPAR - 1) { + if (color_index > 1 && color_index < 7) { + color_seperator = 1; + color_code [color_index++] = c; + } + npar++; + break; + } else if (c >= '0' && c <= '9') { + if (color_index < 7) { + if (!color_seperator && color_index >= 4) + break; + + color_code [color_index++] = c; + } + break; + } else { + if (c == 'm' && color_index <=7) { + color_code [color_index++] = c; + ply_logger_inject_bytes (logger, color_code, color_index); + index += color_index; + } + state = ESgotpars; + } + case ESgotpars: + memset(color_code+2, 0, 5); + color_index = 2; + color_seperator = 0; + state = ESnormal; + break; + case ESpercent: + state = ESnormal; + break; + case ESfunckey: + case EShash: + case ESsetG0: + case ESsetG1: + state = ESnormal; + break; + } + buf++; + r--; + } + + return index; +} + static bool ply_terminal_session_open_console (ply_terminal_session_t *session) { @@ -432,23 +616,6 @@ ply_terminal_session_get_fd (ply_termina } static void -ply_terminal_session_log_bytes (ply_terminal_session_t *session, - const uint8_t *bytes, - size_t number_of_bytes) -{ - assert (session != NULL); - assert (session->logger != NULL); - assert (bytes != NULL); - assert (number_of_bytes != 0); - - ply_logger_inject_bytes (session->logger, bytes, number_of_bytes); - - if (session->output_handler != NULL) - session->output_handler (session->user_data, - bytes, number_of_bytes, session); -} - -static void ply_terminal_session_on_new_data (ply_terminal_session_t *session, int session_fd) { @@ -460,8 +627,15 @@ ply_terminal_session_on_new_data (ply_te bytes_read = read (session_fd, buffer, sizeof(buffer)); - if (bytes_read > 0) - ply_terminal_session_log_bytes (session, buffer, bytes_read); + if (bytes_read > 0) { + + if (session->output_handler != NULL) + session->output_handler (session->user_data, + buffer, bytes_read, session); + + if (session->logger) + (void) ply_terminal_strip_control_codes(session->logger, buffer, bytes_read); + } ply_logger_flush (session->logger); }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor