Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:25
erlang
1928-kernel-Make-user-configure-correct-standar...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 1928-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
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