]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/basic/terminal-util.c
basic/terminal-util: accept ST or BEL to end escape sequence queries
[thirdparty/systemd.git] / src / basic / terminal-util.c
index aa1cf7cfff71eceff0a19ebb4190811deb05f9b9..8b5a9fa8c68ffbb266683ee95ffb1656858ee9e8 100644 (file)
@@ -1581,6 +1581,7 @@ typedef enum BackgroundColorState {
         BACKGROUND_RED,
         BACKGROUND_GREEN,
         BACKGROUND_BLUE,
+        BACKGROUND_STRING_TERMINATOR,
 } BackgroundColorState;
 
 typedef struct BackgroundColorContext {
@@ -1672,7 +1673,9 @@ static int scan_background_color_response(
                                         return 1; /* success! */
 
                                 context->state = BACKGROUND_TEXT;
-                        } else {
+                        } else if (c == '\x1b')
+                                context->state = context->blue_bits > 0 ? BACKGROUND_STRING_TERMINATOR : BACKGROUND_TEXT;
+                        else {
                                 int d = unhexchar(c);
                                 if (d < 0 || context->blue_bits >= sizeof(context->blue)*8)
                                         context->state = BACKGROUND_TEXT;
@@ -1682,10 +1685,18 @@ static int scan_background_color_response(
                                 }
                         }
                         break;
+
+                case BACKGROUND_STRING_TERMINATOR:
+                        if (c == '\\')
+                                return 1; /* success! */
+
+                        context->state = c == ']' ? BACKGROUND_ESCAPE : BACKGROUND_TEXT;
+                        break;
+
                 }
 
                 /* Reset any colors we might have picked up */
-                if (context->state == BACKGROUND_TEXT) {
+                if (IN_SET(context->state, BACKGROUND_TEXT, BACKGROUND_ESCAPE)) {
                         /* reset color */
                         context->red = context->green = context->blue = 0;
                         context->red_bits = context->green_bits = context->blue_bits = 0;