File 2928-kernel-Make-user-configure-correct-standard_error.patch of Package erlang
From e8849e6746f76aa5babc18b04cde21d398f09ee4 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Wed, 11 May 2022 08:05:11 +0200
Subject: [PATCH 08/34] kernel: Make `user` configure correct standard_error
---
lib/kernel/src/standard_error.erl | 41 +++++++++++++-----------
lib/kernel/src/user_drv.erl | 10 ++++++
lib/kernel/test/standard_error_SUITE.erl | 4 ++-
3 files changed, 35 insertions(+), 20 deletions(-)
diff --git a/lib/kernel/src/standard_error.erl b/lib/kernel/src/standard_error.erl
index 1aad064392..58831f0ba7 100644
--- a/lib/kernel/src/standard_error.erl
+++ b/lib/kernel/src/standard_error.erl
@@ -66,6 +66,7 @@ server(PortName,PortSettings) ->
run(P) ->
put(encoding, latin1),
+ put(onlcr, false),
server_loop(P).
server_loop(Port) ->
@@ -161,7 +162,7 @@ io_request({get_geometry,rows},Port) ->
io_request(getopts, _Port) ->
getopts();
io_request({setopts,Opts}, _Port) when is_list(Opts) ->
- setopts(Opts);
+ do_setopts(Opts);
io_request({requests,Reqs}, Port) ->
io_requests(Reqs, {ok,ok}, Port);
io_request(R, _Port) -> %Unknown request
@@ -203,19 +204,27 @@ put_chars(Chars, Port) when is_binary(Chars) ->
{ok,ok}.
%% setopts
-setopts(Opts0) ->
+do_setopts(Opts0) ->
Opts = expand_encoding(Opts0),
case check_valid_opts(Opts) of
true ->
- do_setopts(Opts);
+ lists:foreach(
+ fun({encoding, Enc}) ->
+ put(encoding, Enc);
+ ({onlcr, Bool}) ->
+ put(onlcr, Bool)
+ end, Opts),
+ {ok, ok};
false ->
{error,{error,enotsup}}
end.
check_valid_opts([]) ->
true;
-check_valid_opts([{encoding,Valid}|T]) when Valid =:= unicode;
- Valid =:= utf8; Valid =:= latin1 ->
+check_valid_opts([{encoding,Valid}|T]) when Valid =:= unicode; Valid =:= utf8;
+ Valid =:= latin1 ->
+ check_valid_opts(T);
+check_valid_opts([{onlcr,Bool}|T]) when is_boolean(Bool) ->
check_valid_opts(T);
check_valid_opts(_) ->
false.
@@ -226,27 +235,21 @@ expand_encoding([latin1 | T]) ->
[{encoding,latin1} | expand_encoding(T)];
expand_encoding([unicode | T]) ->
[{encoding,unicode} | expand_encoding(T)];
+expand_encoding([utf8 | T]) ->
+ [{encoding,unicode} | expand_encoding(T)];
+expand_encoding([{encoding,utf8} | T]) ->
+ [{encoding,unicode} | expand_encoding(T)];
expand_encoding([H|T]) ->
[H|expand_encoding(T)].
-do_setopts(Opts) ->
- case proplists:get_value(encoding, Opts) of
- Valid when Valid =:= unicode; Valid =:= utf8 ->
- put(encoding, unicode);
- latin1 ->
- put(encoding, latin1);
- undefined ->
- ok
- end,
- {ok,ok}.
-
getopts() ->
Uni = {encoding,get(encoding)},
- {ok,[Uni]}.
+ Onlcr = {onlcr, get(onlcr)},
+ {ok,[Uni, Onlcr]}.
wrap_characters_to_binary(Chars,From,To) ->
- TrNl = (whereis(user_drv) =/= undefined),
- Limit = case To of
+ TrNl = get(onlcr),
+ Limit = case To of
latin1 ->
255;
_Else ->
diff --git a/lib/kernel/src/user_drv.erl b/lib/kernel/src/user_drv.erl
index 520dba9419..aed09f6125 100644
--- a/lib/kernel/src/user_drv.erl
+++ b/lib/kernel/src/user_drv.erl
@@ -92,6 +92,16 @@ server(Iname, Oname, Shell) ->
end.
server1(Iport, Oport, Shell) ->
+
+ Encoding =
+ case get_unicode_state(Iport) of
+ true -> unicode;
+ false -> latin1
+ end,
+
+ %% Initialize standard_error
+ ok = io:setopts(standard_error, [{encoding, Encoding}, {onlcr,true}]),
+
put(eof, false),
%% Start user and initial shell.
User = start_user(),
diff --git a/lib/kernel/test/standard_error_SUITE.erl b/lib/kernel/test/standard_error_SUITE.erl
index 1d9026dc58..34bb880db8 100644
--- a/lib/kernel/test/standard_error_SUITE.erl
+++ b/lib/kernel/test/standard_error_SUITE.erl
@@ -34,8 +34,10 @@ badarg(Config) when is_list(Config) ->
true = erlang:is_process_alive(whereis(standard_error)),
ok.
+%% Check that standard_out and standard_error have the same encoding
getopts(Config) when is_list(Config) ->
- [{encoding,latin1}] = io:getopts(standard_error),
+ Encoding = proplists:get_value(encoding, io:getopts(user)),
+ Encoding = proplists:get_value(encoding, io:getopts(standard_error)),
ok.
%% Test that writing a lot of output to standard_error does not cause the
--
2.35.3