linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jiri Slaby <jirislaby@kernel.org>
To: nick black <dankamongmen@gmail.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	linux-kernel@vger.kernel.org,
	Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH] console: consume APC, DM, DCS
Date: Mon, 30 Aug 2021 11:17:29 +0200	[thread overview]
Message-ID: <0f094eb9-11d4-1bd5-0a1b-823317ad4f7d@kernel.org> (raw)
In-Reply-To: <YSydL0q8iaUfkphg@schwarzgerat.orthanc>

On 30. 08. 21, 10:56, nick black wrote:
> console: consume APC, DM, DCS
> 
> The Linux console's VT102 implementation already
> consumes OSC ("Operating System Command") sequences,
> probably because that's how palette changes are
> transmitted. In addition to OSC, there are three other
> major clases of ANSI control strings: APC ("Application
> Program Command"), PM ("Privacy Message", and DCS
> ("Device Control String"). They are handled similarly
> to OSC in terms of termination.
> 
> Source: vt100.net
> 
> Add three new enumerated states, one for each of these
> types. All three are handled the same way right now--they
> simply consume input until terminated. I hope to expand
> upon this firmament in the future. Add new predicate
> ansi_control_string(), returning true for any of these
> states. Replace explicit checks against ESosc with calls
> to this function. Transition to these states appropriately
> from the escape initiation (ESesc) state.
> 
> This was motivated by the following Notcurses bugs:
> 
>   https://github.com/dankamongmen/notcurses/issues/2050
>   https://github.com/dankamongmen/notcurses/issues/1828
>   https://github.com/dankamongmen/notcurses/issues/2069
> 
> where standard VT sequences are not consumed by the
> Linux console. It's not necessary that the Linux console
> *support* these sequences, but it ought *consume* these
> well-specified classes of sequences.
> 
> Tested by sending a variety of escape sequences to the
> console, and verifying that they still worked, or were
> now properly consumed. Verified that the escapes were
> properly terminated at a generic level. Verified that
> the Notcurses tools continued to show expected output on
> the Linux console, except now without escape bleedthrough.
> 
> Signed-off-by: nick black <dankamongmen@gmail.com>
> ---
> diff --git drivers/tty/vt/vt.c drivers/tty/vt/vt.c
> index ef981d3b7bb4..62b77ee3f8d1 100644
> --- a/drivers/tty/vt/vt.c
> +++ b/drivers/tty/vt/vt.c
> @@ -2059,7 +2059,7 @@ static void restore_cur(struct vc_data *vc)
>   
>   enum { ESnormal, ESesc, ESsquare, ESgetpars, ESfunckey,
>   	EShash, ESsetG0, ESsetG1, ESpercent, EScsiignore, ESnonstd,
> -	ESpalette, ESosc };
> +	ESpalette, ESosc, ESapc, ESpm, ESdcs };
>   
>   /* console_lock is held (except via vc_init()) */
>   static void reset_terminal(struct vc_data *vc, int do_clear)
> @@ -2133,20 +2133,28 @@ static void vc_setGx(struct vc_data *vc, unsigned int which, int c)
>   		vc->vc_translate = set_translate(*charset, vc);
>   }
>   
> +/* is this state an ANSI control string? */
> +static bool ansi_control_string(unsigned int state)
> +{
> +	if (state == ESosc || state == ESapc || state == ESpm || state == ESdcs)
> +		return true;
> +	return false;

So simply:
return state == ESosc || state == ESapc || state == ESpm || state == ESdcs;

I wonder if we can simply hide them all behind single ESignore?

> +}
> +
>   /* console_lock is held */
>   static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
>   {
>   	/*
>   	 *  Control characters can be used in the _middle_
> -	 *  of an escape sequence.
> +	 *  of an escape sequence, aside from ANSI control strings.
>   	 */
> -	if (vc->vc_state == ESosc && c>=8 && c<=13) /* ... except for OSC */
> +	if (ansi_control_string(vc->vc_state) && c >= 8 && c <= 13)
>   		return;
>   	switch (c) {
>   	case 0:
>   		return;
>   	case 7:
> -		if (vc->vc_state == ESosc)
> +		if (ansi_control_string(vc->vc_state))
>   			vc->vc_state = ESnormal;
>   		else if (vc->vc_bell_duration)
>   			kd_mksound(vc->vc_bell_pitch, vc->vc_bell_duration);
> @@ -2207,6 +2215,12 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
>   		case ']':
>   			vc->vc_state = ESnonstd;
>   			return;
> +		case '_':
> +			vc->vc_state = ESapc;
> +			return;
> +		case '^':
> +			vc->vc_state = ESpm;
> +			return;
>   		case '%':
>   			vc->vc_state = ESpercent;
>   			return;
> @@ -2224,6 +2238,9 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
>   			if (vc->state.x < VC_TABSTOPS_COUNT)
>   				set_bit(vc->state.x, vc->vc_tab_stop);
>   			return;
> +		case 'P':
> +			vc->vc_state = ESdcs;
> +			return;
>   		case 'Z':
>   			respond_ID(tty);
>   			return;
> @@ -2520,8 +2537,14 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
>   		vc_setGx(vc, 1, c);
>   		vc->vc_state = ESnormal;
>   		return;
> +	case ESapc:
> +		return;
>   	case ESosc:
>   		return;
> +	case ESpm:
> +		return;
> +	case ESdcs:
> +		return;
>   	default:
>   		vc->vc_state = ESnormal;
>   	}
> 


-- 
js
suse labs

  reply	other threads:[~2021-08-30  9:17 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-30  8:56 nick black
2021-08-30  9:17 ` Jiri Slaby [this message]
2021-08-30  9:59   ` nick black
2021-08-30 15:31     ` Linus Torvalds
2021-08-30 15:37       ` Linus Torvalds
2021-08-30 15:50         ` nick black
  -- strict thread matches above, loose matches on Subject: below --
2021-08-19  3:48 nick black

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0f094eb9-11d4-1bd5-0a1b-823317ad4f7d@kernel.org \
    --to=jirislaby@kernel.org \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dankamongmen@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=penguin-kernel@i-love.sakura.ne.jp \
    --cc=torvalds@linux-foundation.org \
    --subject='Re: [PATCH] console: consume APC, DM, DCS' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).