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

openSUSE Build Service is sponsored by