From 0740af1e47aacf61a6c3f617e8930dbb4ae3756c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Backstr=C3=B6m?= <lukas@erlang.org> Date: Wed, 4 Sep 2024 11:40:40 +0200 Subject: [PATCH 1/7] stdlib: Add custom shell user's guide --- lib/stdlib/doc/assets/pshell.es | 87 ++++++++ lib/stdlib/doc/docs.exs | 2 + lib/stdlib/doc/guides/custom_shell.md | 220 ++++++++++++++++++++ lib/stdlib/doc/guides/terminal_interface.md | 21 ++ lib/stdlib/src/shell.erl | 6 +- 5 files changed, 334 insertions(+), 2 deletions(-) create mode 100755 lib/stdlib/doc/assets/pshell.es create mode 100644 lib/stdlib/doc/guides/custom_shell.md create mode 100644 lib/stdlib/doc/guides/terminal_interface.md diff --git a/lib/stdlib/doc/assets/pshell.es b/lib/stdlib/doc/assets/pshell.es new file mode 100755 index 000000000000..b2cb0583dfb1 --- /dev/null +++ b/lib/stdlib/doc/assets/pshell.es @@ -0,0 +1,87 @@ +#!/usr/bin/env escript +%% pshell.es +-export([start/0]). +main(_Args) -> + shell:start_interactive({?MODULE, start, []}), + timer:sleep(infinity). %% Make sure the escript does not exit + +-spec start() -> pid(). +start() -> + spawn(fun() -> + io:setopts([{expand_fun, fun expand_fun/1}]), + io:format("Starting process inspection shell~n"), + loop() + end). + +-spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} | + {no, nil(), nil()}. +expand_fun("") -> + {yes, "", ["list", "inspect", "suspend", "resume"]}; +expand_fun(Curr) -> + expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]). + +expand_fun(_Curr, []) -> + {no, "", []}; +expand_fun(Curr, [H | T]) -> + case lists:prefix(Curr, H) of + true -> + {yes, lists:reverse(lists:reverse(H) -- lists:reverse(Curr)), []}; + false -> + expand_fun(Curr, T) + end. + +loop() -> + case io:get_line("> ") of + eof -> ok; + {error, Reason} -> exit(Reason); + Data -> eval(string:trim(Data)) + end, + loop(). + +eval("list") -> + Format = " ~.10ts | ~.10ts | ~.10ts~n", + io:format(Format,["Pid", "Name", "MsgQ Len"]), + [begin + [{registered_name,Name},{message_queue_len,Len}] + = erlang:process_info(Pid, [registered_name, message_queue_len]), + io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)]) + end || Pid <- processes()]; +eval("inspect " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] = + erlang:process_info(Pid, [registered_name, memory, messages, status]), + io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n", + [Pid, to_list(Name), Status, Memory, Messages]) + end; +eval("suspend " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + erlang:suspend_process(Pid), + io:format("Suspeneded ~ts~n", [Pid]) + end; +eval("resume " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + erlang:resumne_process(Pid), + io:format("Resumed ~ts~n", [Pid]) + end; +eval(Unknown) -> + io:format("Unknown command: '~ts'~n",[Unknown]). + +to_list(Pid) when is_pid(Pid) -> + pid_to_list(Pid); +to_list(Atom) when is_atom(Atom) -> + atom_to_list(Atom); +to_list(Int) when is_integer(Int) -> + integer_to_list(Int); +to_list(List) when is_list(List) -> + List. + +parse_pid(PidStr) -> + try list_to_pid(PidStr) + catch _:_ -> io:format("Invalid pid format~n"), invalid + end. \ No newline at end of file diff --git a/lib/stdlib/doc/docs.exs b/lib/stdlib/doc/docs.exs index 15957e70f56c..d3cb216f15b3 100644 --- a/lib/stdlib/doc/docs.exs +++ b/lib/stdlib/doc/docs.exs @@ -71,6 +71,8 @@ extras: [ "guides/introduction.md", "guides/io_protocol.md", + "guides/custom_shell.md", + "guides/terminal_interface.md", "guides/unicode_usage.md", "guides/uri_string_usage.md", "references/assert_hrl.md", diff --git a/lib/stdlib/doc/guides/custom_shell.md b/lib/stdlib/doc/guides/custom_shell.md new file mode 100644 index 000000000000..4e36d87d94cb --- /dev/null +++ b/lib/stdlib/doc/guides/custom_shell.md @@ -0,0 +1,220 @@ +<!-- +%CopyrightBegin% + +Copyright Ericsson AB 2024. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +%CopyrightEnd% +--> +# Creating a custom shell + +This guide will show how to create a custom shell. The most common +use case for this is to support other languages running on the Erlang VM, +but it can also be used to create specialized debugging shells a system. + +This guide will build on top of the built-in [Erlang line editor](`m:edlin`), +which means that the keybindings described in [tty - A Command-Line Interface](`e:erts:tty.md`) +can be used edit the input before it is passed to the custom shell. This +somewhat limits what the custom shell can do, but it also means that we do not +have to implement line editing ourselves. If you need more control over the +shell, then use [Creating a terminal application](terminal_interface.md) as +a starting-point to build your own line editor and shell. + +## A process inspection shell + +The custom shell that we are going to build is a process inspection shell +that supports the following commands: + +* `list` - lists all processes +* `inspect pid()` - inspect a process +* `suspend pid()` - suspend a process +* `resume pid()` - resume a process + +Lets get started! + +## Starting with a custom shell + +The custom shell will be implemented in an `m:escript`, but it could just +as well be in a regular system or as a remote shell. To start a custom shell +we first need to start Erlang in `-noinput` or `-noshell` mode. `m:escript` are +started by default in `-noshell` mode, so we don't have to do anything special here. +To start the custom shell we then call `shell:start_interactive/1`. + +``` +#!/usr/bin/env escript +%% pshell.es +-export([start/0]). +main(_Args) -> + shell:start_interactive({?MODULE, start, []}), + timer:sleep(infinity). %% Make sure the escript does not exit + +-spec start() -> pid(). +start() -> + spawn(fun() -> + io:format(~"Starting process inspection shell~n"), + loop() + end). + +loop() -> + receive _M -> loop() end. +``` + +If we run the above we will get this: + +``` +$ ./pshell.es +Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns] + +Starting process inspection shell + +``` + +The `t:io:standard_io/0` of the created shell process will be set to the +Erlang line editor, which means that we can use the normal `m:io` functions +to read and write data to the terminal. + +## Adding our first command + +Let's start adding the shell interface. We will use `io:get_line/1` to read from +`t:io:standard_io/0` as this shell will be line based. However, for a more complex +shell it is better to send [`get_until` I/O requests](io_protocol.md#input-requests) +as commands read that way can span multiple lines. So we expand our `loop/0` with +a `io:get_line/1` and pass the results to our parser. + +``` +loop() -> + case io:get_line("> ") of + eof -> ok; + {error, Reason} -> exit(Reason); + Data -> eval(string:trim(Data)) + end, + loop(). + +eval("list") -> + Format = " ~.10ts | ~.10ts | ~.10ts~n", + io:format(Format,["Pid", "Name", "MsgQ Len"]), + [begin + [{registered_name,Name},{message_queue_len,Len}] + = erlang:process_info(Pid, [registered_name, message_queue_len]), + io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)]) + end || Pid <- processes()]; +eval(Unknown) -> + io:format("Unknown command: '~ts'~n",[Unknown]). + +to_list(Pid) when is_pid(Pid) -> + pid_to_list(Pid); +to_list(Atom) when is_atom(Atom) -> + atom_to_list(Atom); +to_list(Int) when is_integer(Int) -> + integer_to_list(Int); +to_list(List) when is_list(List) -> + List. +``` + +If we run the above we will get this: + +```txt +$ ./pshell.es +Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns] + +Starting process inspection shell +> list + Pid | Name | MsgQ Len + <0.0.0> | init | 0 + <0.1.0> | erts_code_ | 0 + <0.2.0> | | 0 + <0.3.0> | | 0 + <0.4.0> | | 0 + <0.5.0> | | 0 + <0.6.0> | | 0 + <0.7.0> | | 0 + <0.8.0> | socket_reg | 0 + <0.10.0> | | 0 + <0.11.0> | erl_prim_l | 0 + <0.43.0> | logger | 0 + <0.45.0> | applicatio | 0 +... +``` + +With this all in place we can now easily add `inspect`, `suspend` and `resume` as well. + +``` +eval("inspect " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] = + erlang:process_info(Pid, [registered_name, memory, messages, status]), + io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n", + [Pid, to_list(Name), Status, Memory, Messages]) + end; +eval("suspend " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + erlang:suspend_process(Pid), + io:format("Suspeneded ~ts~n") + end; +eval("resume " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + erlang:resumne_process(Pid), + io:format("Resumed ~ts~n") + end; +``` + +## Adding autocompletion + +Wouldn't it be great if we could add some simple auto-completion for our shell? We can do that +by setting a `m:edlin_expand` fun for our shell. This is done by calling [`io:setopts([{expand_fun, Fun}])`](`io:setopts/2`). The fun that we provide is will receive the reversed current line from +`m:edlin` and is expected to return possible expansions. Let's start by adding a simple fun to +expand our commands. + +``` +-spec start() -> pid(). +start() -> + spawn(fun() -> + io:setopts([{expand_fun, fun expand_fun/1}]), + io:format(~"Starting process inspection shell~n"), + loop() + end). + +-spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} | + {no, nil(), nil()}. +expand_fun("") -> %% If line is empty, we list all available commands + {yes, "", ["list", "inspect", "suspend", "resume"]}; +expand_fun(Curr) -> + expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]). + +expand_fun(_Curr, []) -> + {no, "", []}; +expand_fun(Curr, [Cmd | T]) -> + case lists:prefix(Curr, Cmd) of + true -> + %% If Curr is a prefix of Cmd we subtract Curr from Cmd to get the + %% characters we need to complete with. + {yes, lists:reverse(lists:reverse(Cmd) -- lists:reverse(Curr)), []}; + false -> + expand_fun(Curr, T) + end. +``` + +With the above code we will get expansions of our commands if we hit `<TAB>` in the shell. +Its possible to make very complex completion algorithms, for example the Erlang shell +has completions based on the function specifications of your code. It is important though that +the shell still feels responsive, so calling out to a LLM model for completion may or may not +be a good idea. + +The complete source code for this example can be found [here](assets/pshell.es). \ No newline at end of file diff --git a/lib/stdlib/doc/guides/terminal_interface.md b/lib/stdlib/doc/guides/terminal_interface.md new file mode 100644 index 000000000000..54eec5e6140e --- /dev/null +++ b/lib/stdlib/doc/guides/terminal_interface.md @@ -0,0 +1,21 @@ +<!-- +%CopyrightBegin% + +Copyright Ericsson AB 2024. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +%CopyrightEnd% +--> +# Creating a terminal application + diff --git a/lib/stdlib/src/shell.erl b/lib/stdlib/src/shell.erl index 775fcf5219d7..3135c95c2461 100644 --- a/lib/stdlib/src/shell.erl +++ b/lib/stdlib/src/shell.erl @@ -85,11 +85,13 @@ allowed: data. - **[mfa()](`t:erlang:mfa/0`)** - Starts the interactive shell using - [`mfa()`](`t:erlang:mfa/0`) as the default shell. + [`mfa()`](`t:erlang:mfa/0`) as the default shell. The `t:mfa/0` should + return the `t:pid/0` of the created shell process. - **\{[node()](`t:erlang:node/0`), [mfa()](`t:erlang:mfa/0`)\}** - Starts the interactive shell using [`mfa()`](`t:erlang:mfa/0`) on - [`node()`](`t:erlang:node/0`) as the default shell. + [`node()`](`t:erlang:node/0`) as the default shell. The `t:mfa/0` should + return the `t:pid/0` of the created shell process. - **\{remote, [`string()`](`t:erlang:string/0`)\}** - Starts the interactive shell using as if [`-remsh`](`e:erts:erl_cmd.md#remsh`) was given to From eeff64c77548b7011d6eadcdac32356e7ded3c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Backstr=C3=B6m?= <lukas@erlang.org> Date: Thu, 5 Sep 2024 17:18:26 +0200 Subject: [PATCH 2/7] shell: Add support for reading individual keystrokes --- bootstrap/lib/kernel/ebin/group.beam | Bin 20640 -> 20976 bytes bootstrap/lib/kernel/ebin/prim_tty.beam | Bin 23764 -> 23732 bytes bootstrap/lib/kernel/ebin/user_drv.beam | Bin 18512 -> 18772 bytes bootstrap/lib/kernel/ebin/user_sup.beam | Bin 1968 -> 1976 bytes bootstrap/lib/stdlib/ebin/io_lib.beam | Bin 14600 -> 14760 bytes bootstrap/lib/stdlib/ebin/shell.beam | Bin 41564 -> 41660 bytes erts/emulator/nifs/common/prim_tty_nif.c | 227 ++++++++++---------- lib/kernel/src/group.erl | 59 +++-- lib/kernel/src/prim_tty.erl | 83 ++++--- lib/kernel/src/user_drv.erl | 64 ++++-- lib/kernel/src/user_sup.erl | 4 +- lib/kernel/test/interactive_shell_SUITE.erl | 140 ++++++++++++ lib/stdlib/doc/assets/tic-tac-toe.es | 106 +++++++++ lib/stdlib/doc/guides/terminal_interface.md | 154 +++++++++++++ lib/stdlib/src/io_lib.erl | 16 +- lib/stdlib/src/shell.erl | 6 +- make/ex_doc.exs | 12 +- 17 files changed, 673 insertions(+), 198 deletions(-) create mode 100755 lib/stdlib/doc/assets/tic-tac-toe.es diff --git a/bootstrap/lib/kernel/ebin/group.beam b/bootstrap/lib/kernel/ebin/group.beam index dcba3c61415b757514032e8abd660f4eabfef705..d286e8c78648f38f6418868adf2cec9553067ce2 100644 GIT binary patch literal 20976 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 P=NbFMGbfRU%K!a82B--^ literal 20640 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 VK%4l;-?$&o=!4IgL=mL$`G30<m5u-a diff --git a/bootstrap/lib/kernel/ebin/prim_tty.beam b/bootstrap/lib/kernel/ebin/prim_tty.beam index 724616684b8a6dbe717a8710a0d5f87cc61076f2..5135bdfdbba1acd9e498c9fc18a9158d7daa331f 100644 GIT binary patch literal 23732 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ⅆ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 literal 23764 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 diff --git a/bootstrap/lib/kernel/ebin/user_drv.beam b/bootstrap/lib/kernel/ebin/user_drv.beam index cc7c72ac9e67464340fcba905a1ad3665f10c707..599f7d5f2909a22dba0093ff42f0262727667feb 100644 GIT binary patch literal 18772 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 b1O9MXE&*kw!UWeEQ$t_hpFdoh%k_T%(olwo literal 18512 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 diff --git a/bootstrap/lib/kernel/ebin/user_sup.beam b/bootstrap/lib/kernel/ebin/user_sup.beam index 8235b0e0e205fe5e401a4439f369ec0b58e8fa91..7b35ff2a247fa2bd993367efc5b8ec54f31db1e2 100644 GIT binary patch delta 209 zcmV;?051Qq54aBqMo&^P000NDu?SZNf205a0W^4=rH#D~!Y~YkL!m!Q7bF;%`WWm; zh_|Q$v1lN~$Z_!l<i$w}6GAL3*7;8Nol>e+O106YJCns2fG$aH;#IA8+I!^g4BQdi zkfF<QN|$jcqy!=)sXV^jRUGEh<fk|EkTS3)&amybU>f9UwYA=|)vgZ%I42D{CNrtr z-T&+spWWKyOO)2%N0#b@cm<P5hyO^8u|XeQVm$#!3tw)N{03DJ9Sth?!6fPZQ-?Wl LW|njflVJx>vzA|z delta 201 zcmV;)05<=)53mmiMo&^P000N5u?SZNf13aR0U~&um5nhD!Y~X)O(C>P7bF;%dW*6n z&QV3Gp(!Cjj*AbFi<4A{36NN<Z$CYM04M>VjyBDOtfqi8rnrw+*d4WVo|_ADLwNIy zO~#3C;!ub}B2Th*{&n5PVJTH!x}F}Q0&C*@?C=T9g*>;`#u+x+c40tkrSi6)9#eMP z|J>5~w|e@i7T;7+#@#0tb=EfE_ymoXSd9Ra1P4_RbsqN+D{BsF64uMe3;tV`lW7M} DVQg6W diff --git a/bootstrap/lib/stdlib/ebin/io_lib.beam b/bootstrap/lib/stdlib/ebin/io_lib.beam index 1f443d22f601af949ce2640d60be77f12da517c7..74b8894b67edf6f3ef6a41f4f1f59d17775879ab 100644 GIT binary patch delta 3382 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 delta 3165 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 diff --git a/bootstrap/lib/stdlib/ebin/shell.beam b/bootstrap/lib/stdlib/ebin/shell.beam index eafb537cd6aee9740f36813a66dd1e54f191e36d..67e6fe0cb794bc879bbe960bdf2d3b45771ee033 100644 GIT binary patch literal 41660 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 literal 41564 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 Bp^^Xq diff --git a/erts/emulator/nifs/common/prim_tty_nif.c b/erts/emulator/nifs/common/prim_tty_nif.c index 825677d56364..73fd7569abf2 100644 --- a/erts/emulator/nifs/common/prim_tty_nif.c +++ b/erts/emulator/nifs/common/prim_tty_nif.c @@ -82,6 +82,12 @@ #define DEF_HEIGHT 24 #define DEF_WIDTH 80 +enum TTYState { + unavailable, + disabled, + enabled +}; + typedef struct { #ifdef __WIN32__ HANDLE ofd; @@ -101,7 +107,7 @@ typedef struct { #endif ErlNifPid self; ErlNifPid reader; - int tty; /* if the tty is initialized */ + enum TTYState tty; /* if the tty is initialized */ #ifdef HAVE_TERMCAP struct termios tty_smode; struct termios tty_rmode; @@ -123,7 +129,6 @@ static ErlNifResourceType *tty_rt; static ERL_NIF_TERM isatty_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); -static ERL_NIF_TERM tty_set_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM setlocale_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_select_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_write_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); @@ -140,11 +145,14 @@ static ERL_NIF_TERM tty_tgetflag_nif(ErlNifEnv* env, int argc, const ERL_NIF_TER static ERL_NIF_TERM tty_tgetstr_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_tgoto_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); +#ifdef __WIN32__ +static HANDLE tty_windows_select(ErlNifEnv *env, TTYResource *tty, ERL_NIF_TERM *error); +#endif + static ErlNifFunc nif_funcs[] = { {"isatty", 1, isatty_nif}, {"tty_create", 0, tty_create_nif}, - {"tty_init", 3, tty_init_nif}, - {"tty_set", 1, tty_set_nif}, + {"tty_init", 2, tty_init_nif}, {"setlocale", 1, setlocale_nif}, {"tty_select", 2, tty_select_nif}, {"tty_window_size", 1, tty_window_size_nif}, @@ -186,6 +194,7 @@ ERL_NIF_INIT(prim_tty, nif_funcs, load, NULL, upgrade, unload) ATOM_DECL(stdout); \ ATOM_DECL(stderr); \ ATOM_DECL(select); \ + ATOM_DECL(raw); \ ATOM_DECL(sig); @@ -249,7 +258,7 @@ static ERL_NIF_TERM tty_encoding_nif(ErlNifEnv* env, int argc, const ERL_NIF_TER TTYResource *tty; if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); - if (tty->tty) + if (tty->tty == enabled) return enif_make_tuple2(env, enif_make_atom(env, "utf16"), enif_make_atom(env, "little")); #endif @@ -437,14 +446,14 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar * **/ if (GetFileType(tty->ifd) == FILE_TYPE_CHAR) { - if (tty->ifdOverlapped == INVALID_HANDLE_VALUE) { + if (tty->ifdOverlapped == INVALID_HANDLE_VALUE && tty->tty == enabled) { /* Input is a terminal and we are in "new shell" mode */ ssize_t inputs_read, num_characters = 0; wchar_t *characters = NULL; INPUT_RECORD inputs[128]; - ASSERT(tty->tty); + ASSERT(tty->tty == enabled); if (!ReadConsoleInputW(tty->ifd, inputs, sizeof(inputs)/sizeof(*inputs), &inputs_read)) { @@ -558,12 +567,13 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar } } res *= sizeof(wchar_t); - } else { - /* Input is a terminal and we are in "noshell" or "oldshell" mode */ + } else if (tty->ifdOverlapped != INVALID_HANDLE_VALUE) { + /* Input is a terminal and we are in "{noshell, cooked}" or "oldshell" mode. + We just triggered in a select from a overlapped ReadFile. */ DWORD bytesRead = 0; debug("GetOverlapped on %d\r\n", tty->ifdOverlapped); if (!GetOverlappedResult(tty->ifdOverlapped, &tty->overlapped, &bytesRead, TRUE)) { - if (GetLastError() == ERROR_OPERATION_ABORTED && tty->tty) { + if (GetLastError() == ERROR_OPERATION_ABORTED && tty->tty == enabled) { /* The overlapped operation was cancels by CancelIo because we are upgrading to "newshell". So we close the handles involved with the overlapped io and select on the stdin @@ -595,6 +605,18 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar return make_errno_error(env, "ReadFile"); } select_event = tty->overlapped.hEvent; + } else { + /* Input is a terminal, we are in "{noshell, cooked}" or "oldshell" mode, + but we don't have a overlapped ReadFile, so we create one. + */ + ERL_NIF_TERM error; + select_event = tty_windows_select(env, tty, &error); + if (select_event == INVALID_HANDLE_VALUE) { + return error; + } + enif_select(env, select_event, ERL_NIF_SELECT_READ, tty, NULL, argv[1]); + /* Return {error,aborted} to signal that the encoding has changed . */ + return make_error(env, enif_make_atom(env, "aborted")); } } else { /* Input is not a terminal */ @@ -782,13 +804,25 @@ static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM TTYResource *tty = enif_alloc_resource(tty_rt, sizeof(TTYResource)); ERL_NIF_TERM tty_term; memset(tty, 0, sizeof(*tty)); + +#ifdef HARD_DEBUG + logFile = fopen("tty.log","w+"); +#endif + + tty->tty = unavailable; + #ifndef __WIN32__ tty->ifd = 0; tty->ofd = 1; -#else -#ifdef HARD_DEBUG - logFile = fopen("tty.log","w+"); + +#ifdef HAVE_TERMCAP + if (tcgetattr(tty->ofd, &tty->tty_rmode) >= 0) { + tty->tty = disabled; + } #endif + +#else + tty->ifd = GetStdHandle(STD_INPUT_HANDLE); if (tty->ifd == INVALID_HANDLE_VALUE || tty->ifd == NULL) { tty->ifd = CreateFile("nul", GENERIC_READ, 0, @@ -806,6 +840,7 @@ static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM /* Failed to set any VT mode, can't do anything here. */ return make_errno_error(env, "SetConsoleMode"); } + tty->tty = disabled; } if (GetConsoleMode(tty->ifd, &tty->dwOriginalInMode)) { @@ -830,50 +865,41 @@ static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM static ERL_NIF_TERM tty_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { #if defined(HAVE_TERMCAP) || defined(__WIN32__) - ERL_NIF_TERM canon, echo, sig; + ERL_NIF_TERM input; TTYResource *tty; - int fd; - debug("tty_init_nif(%T,%T,%T)\r\n", argv[0], argv[1], argv[2]); + debug("tty_init_nif(%T,%T)\r\n", argv[0], argv[1]); - if (argc != 3 || - !tty_get_fd(env, argv[1], &fd) || - !enif_is_map(env, argv[2])) { + if (argc != 2 || !enif_is_map(env, argv[1])) { return enif_make_badarg(env); } if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); - if (!enif_get_map_value(env, argv[2], enif_make_atom(env,"canon"), &canon)) - canon = enif_make_atom(env, "undefined"); - if (!enif_get_map_value(env, argv[2], enif_make_atom(env,"echo"), &echo)) - echo = enif_make_atom(env, "undefined"); - if (!enif_get_map_value(env, argv[2], enif_make_atom(env,"sig"), &sig)) - sig = enif_make_atom(env, "undefined"); + if (!enif_get_map_value(env, argv[1], enif_make_atom(env, "input"), &input)) + return enif_make_badarg(env); -#ifndef __WIN32__ - if (tcgetattr(fd, &tty->tty_rmode) < 0) { - return make_errno_error(env, "tcgetattr"); + if (tty->tty == unavailable) { + if (enif_is_identical(input, atom_raw)) + return make_enotsup(env); + return atom_ok; } + tty->tty = enif_is_identical(input, atom_raw) ? enabled : disabled; + +#ifndef __WIN32__ + + /* Restore the original mode, that is canonical echo mode */ tty->tty_smode = tty->tty_rmode; - /* Default characteristics for all usage including termcap output. */ - tty->tty_smode.c_iflag &= ~ISTRIP; + if (tty->tty == enabled) { - /* erts_fprintf(stderr,"canon %T\r\n", canon); */ - /* Turn canonical (line mode) on off. */ - if (enif_is_identical(canon, atom_true)) { - tty->tty_smode.c_iflag |= ICRNL; - tty->tty_smode.c_lflag |= ICANON; - tty->tty_smode.c_oflag |= OPOST; - tty->tty_smode.c_cc[VEOF] = tty->tty_rmode.c_cc[VEOF]; -#ifdef VDSUSP - tty->tty_smode.c_cc[VDSUSP] = tty->tty_rmode.c_cc[VDSUSP]; -#endif - } - if (enif_is_identical(canon, atom_false)) { + /* Default characteristics for all usage including termcap output. */ + tty->tty_smode.c_iflag &= ~ISTRIP; + + /* erts_fprintf(stderr,"canon %T\r\n", canon); */ + /* Turn canonical (line mode) off. */ tty->tty_smode.c_iflag &= ~ICRNL; tty->tty_smode.c_lflag &= ~ICANON; tty->tty_smode.c_oflag &= ~OPOST; @@ -883,52 +909,41 @@ static ERL_NIF_TERM tty_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar #ifdef VDSUSP tty->tty_smode.c_cc[VDSUSP] = 0; #endif - } - /* Turn echo on or off. */ - /* erts_fprintf(stderr,"echo %T\r\n", echo); */ - if (enif_is_identical(echo, atom_true)) - tty->tty_smode.c_lflag |= ECHO; - if (enif_is_identical(echo, atom_false)) + /* Turn echo off. */ + /* erts_fprintf(stderr,"echo %T\r\n", echo); */ tty->tty_smode.c_lflag &= ~ECHO; - /* erts_fprintf(stderr,"sig %T\r\n", sig); */ - /* Set extra characteristics for "RAW" mode, no signals. */ - if (enif_is_identical(sig, atom_true)) { - /* Ignore IMAXBEL as not POSIX. */ -#ifndef QNX - tty->tty_smode.c_iflag |= (BRKINT|IGNPAR|ICRNL|IXON|IXANY); -#else - tty->tty_smode.c_iflag |= (BRKINT|IGNPAR|ICRNL|IXON); -#endif - tty->tty_smode.c_lflag |= (ISIG|IEXTEN); } - if (enif_is_identical(sig, atom_false)) { - /* Ignore IMAXBEL as not POSIX. */ -#ifndef QNX - tty->tty_smode.c_iflag &= ~(BRKINT|IGNPAR|ICRNL|IXON|IXANY); -#else - tty->tty_smode.c_iflag &= ~(BRKINT|IGNPAR|ICRNL|IXON); -#endif - tty->tty_smode.c_lflag &= ~(ISIG|IEXTEN); + + if (tcsetattr(tty->ofd, TCSANOW, &tty->tty_smode) < 0) { + return make_errno_error(env, "tcsetattr"); } #else + DWORD dwOutMode = tty->dwOutMode; + DWORD dwInMode = tty->dwInMode; + debug("origOutMode: %x origInMode: %x\r\n", tty->dwOriginalOutMode, tty->dwOriginalInMode); - /* If we cannot disable NEWLINE_AUTO_RETURN we continue anyway as things work */ - if (SetConsoleMode(tty->ofd, tty->dwOutMode | DISABLE_NEWLINE_AUTO_RETURN)) { - tty->dwOutMode |= DISABLE_NEWLINE_AUTO_RETURN; + if (tty->tty == enabled) { + dwOutMode |= DISABLE_NEWLINE_AUTO_RETURN; + dwInMode &= ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT); } - tty->dwInMode &= ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT); - if (!SetConsoleMode(tty->ifd, tty->dwInMode)) + if (!SetConsoleMode(tty->ifd, dwInMode)) { /* Failed to set disable echo or line input mode */ return make_errno_error(env, "SetConsoleMode"); } + + if (!SetConsoleMode(tty->ofd, dwOutMode)) { + /* If we cannot disable NEWLINE_AUTO_RETURN we continue anyway as things work */ + ; + } + /* If we are changing from "-noshell" to a shell we need to cancel any outstanding async io. This will cause the enif_select to trigger which allows @@ -940,26 +955,9 @@ static ERL_NIF_TERM tty_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar #endif /* __WIN32__ */ - tty->tty = 1; - - return atom_ok; -#else - return make_enotsup(env); -#endif -} - -static ERL_NIF_TERM tty_set_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { -#if defined(HAVE_TERMCAP) || defined(__WIN32__) - TTYResource *tty; - if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) - return enif_make_badarg(env); -#ifdef HAVE_TERMCAP - if (tty->tty && tcsetattr(tty->ifd, TCSANOW, &tty->tty_smode) < 0) { - return make_errno_error(env, "tcsetattr"); - } -#endif enif_self(env, &tty->self); enif_monitor_process(env, tty, &tty->self, NULL); + return atom_ok; #else return make_enotsup(env); @@ -1008,39 +1006,52 @@ static ERL_NIF_TERM tty_window_size_nif(ErlNifEnv* env, int argc, const ERL_NIF_ )); } +#ifdef __WIN32__ +static HANDLE tty_windows_select(ErlNifEnv *env, TTYResource *tty, ERL_NIF_TERM *error) { + if (tty->tty == enabled || GetFileType(tty->ifd) != FILE_TYPE_CHAR) { + return tty->ifd; + } + + tty->ifdOverlapped = CreateFile("CONIN$", GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); + enif_alloc_binary(1024, &tty->overlappedBuffer); + tty->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + debug("Calling ReadFile on %d\r\n", tty->ifdOverlapped); + if (!ReadFile(tty->ifdOverlapped, tty->overlappedBuffer.data, tty->overlappedBuffer.size, + NULL, &tty->overlapped)) { + if (GetLastError() != ERROR_IO_PENDING) { + *error = make_errno_error(env, "ReadFile"); + return INVALID_HANDLE_VALUE; + } + } + debug("Select on %d\r\n", tty->overlapped.hEvent); + return tty->overlapped.hEvent; +} +#endif + static ERL_NIF_TERM tty_select_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { TTYResource *tty; #ifndef __WIN32__ + int select_event; extern int using_oldshell; /* set this to let the rest of erts know */ #else - struct tty_reader *tty_reader; + HANDLE select_event; #endif if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); #ifndef __WIN32__ using_oldshell = 0; - - enif_select(env, tty->ifd, ERL_NIF_SELECT_READ, tty, NULL, argv[1]); + select_event = tty->ifd; #else - if (tty->tty || GetFileType(tty->ifd) != FILE_TYPE_CHAR) { - debug("Select on %d\r\n", tty->ifd); - enif_select(env, tty->ifd, ERL_NIF_SELECT_READ, tty, NULL, argv[1]); - } else { - tty->ifdOverlapped = CreateFile("CONIN$", GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); - enif_alloc_binary(1024, &tty->overlappedBuffer); - tty->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - debug("Calling ReadFile on %d\r\n", tty->ifdOverlapped); - if (!ReadFile(tty->ifdOverlapped, tty->overlappedBuffer.data, tty->overlappedBuffer.size, NULL, &tty->overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) { - return make_errno_error(env, "ReadFile"); - } - } - debug("Select on %d\r\n", tty->overlapped.hEvent); - enif_select(env, tty->overlapped.hEvent, ERL_NIF_SELECT_READ, tty, NULL, argv[1]); + ERL_NIF_TERM error; + select_event = tty_windows_select(env, tty, &error); + if (select_event == INVALID_HANDLE_VALUE) { + return error; } #endif + debug("Select on %d\r\n", select_event); + enif_select(env, select_event, ERL_NIF_SELECT_READ, tty, NULL, argv[2]); enif_self(env, &tty->reader); enif_monitor_process(env, tty, &tty->reader, NULL); diff --git a/lib/kernel/src/group.erl b/lib/kernel/src/group.erl index 043761c43d98..ef83d9b4cdbc 100644 --- a/lib/kernel/src/group.erl +++ b/lib/kernel/src/group.erl @@ -67,12 +67,15 @@ }). -record(state, - { read_mode :: list | binary, + { read_type :: list | binary, driver :: pid(), echo :: boolean(), dumb :: boolean(), shell = noshell :: noshell | pid(), + %% Only used by dumb + terminal_mode = cooked :: raw | cooked | disabled, + %% Only used by xterm line_history :: [string()] | undefined, save_history :: boolean(), %% Whether get_line and get_until should save history @@ -129,7 +132,7 @@ init([Drv, Shell, Options]) -> State = #state{ driver = Drv, - read_mode = list, + read_type = list, dumb = Dumb, save_history = not Dumb, @@ -230,9 +233,7 @@ server(info, {io_request,From,ReplyAs,Req}, Data) when is_pid(From), ?IS_INPUT_R {next_state, if Data#state.dumb orelse not Data#state.echo -> dumb; true -> xterm end, Data#state{ input = #input_state{ from = From, reply_as = ReplyAs } }, - {next_event, internal, Req}}; -server(info, {Drv, echo, Bool}, Data = #state{ driver = Drv }) -> - {keep_state, Data#state{ echo = Bool }}; + {next_event, internal, Req} }; server(info, {Drv, _}, #state{ driver = Drv }) -> %% We postpone any Drv event sent to us as they are handled in xterm or dumb states {keep_state_and_data, postpone}; @@ -240,16 +241,29 @@ server(info, Msg, Data) -> handle_info(server, Msg, Data). %% This is the dumb terminal state, also used for noshell and xterm get_password + +%% When terminal_mode == raw, the terminal is in '{noshell,raw}' mode, which means that +%% for get_until and get_chars we change the behaviour a bit so that characters are +%% delivered as they are typed instead of at new-lines. +dumb(internal, {get_chars, Encoding, Prompt, N}, Data = #state{ terminal_mode = raw }) -> + dumb(input_request, {collect_chars_eager, N, Prompt, Encoding, fun get_chars_dumb/5}, Data); +dumb(internal, {get_line, Encoding, Prompt}, Data = #state{ terminal_mode = raw }) -> + dumb(input_request, {collect_line, [], Prompt, Encoding, fun get_line_dumb/5}, Data); +dumb(internal, {get_until, Encoding, Prompt, M, F, As}, Data = #state{ terminal_mode = raw }) -> + dumb(input_request, {get_until, {M, F, As}, Prompt, Encoding, fun get_chars_dumb/5}, Data); + dumb(internal, {get_chars, Encoding, Prompt, N}, Data) -> dumb(input_request, {collect_chars, N, Prompt, Encoding, fun get_chars_dumb/5}, Data); dumb(internal, {get_line, Encoding, Prompt}, Data) -> dumb(input_request, {collect_line, [], Prompt, Encoding, fun get_line_dumb/5}, Data); dumb(internal, {get_until, Encoding, Prompt, M, F, As}, Data) -> dumb(input_request, {get_until, {M, F, As}, Prompt, Encoding, fun get_line_dumb/5}, Data); + dumb(internal, {get_password, _Encoding}, Data) -> %% TODO: Implement for noshell by disabling characters echo if isatty(stdin) io_reply(Data, {error, enotsup}), pop_state(Data); + dumb(input_request, {CollectF, CollectAs, Prompt, Encoding, GetFun}, Data = #state{ input = OrigInputState }) -> @@ -278,7 +292,7 @@ dumb(data, Buf, Data = #state{ input = #input_state{ prompt_bytes = Pbs, encodin io_reply(Data, {error,{no_translation, unicode, latin1}}), pop_state(Data#state{ buf = [] }); {done, NewLine, RemainBuf} -> - EncodedLine = cast(NewLine, Data#state.read_mode, Encoding), + EncodedLine = cast(NewLine, Data#state.read_type, Encoding), case io_lib:CollectF(State, EncodedLine, Encoding, CollectAs) of {stop, eof, _} -> io_reply(Data, eof), @@ -361,7 +375,7 @@ xterm(data, Buf, Data = #state{ input = #input_state{ %% Get a single line using edlin case get_line_edlin(Buf, Pbs, Cont, Lines, Encoding, Data) of {done, NewLines, RemainBuf} -> - CurrentLine = cast(edlin:current_line(NewLines), Data#state.read_mode, Encoding), + CurrentLine = cast(edlin:current_line(NewLines), Data#state.read_type, Encoding), case io_lib:CollectF(start, CurrentLine, Encoding, CollectAs) of {stop, eof, _} -> io_reply(Data, eof), @@ -427,6 +441,12 @@ handle_info(State, {Drv, {data, Buf}}, Data = #state{ driver = Drv }) -> ?MODULE:State(data, Buf, Data); handle_info(State, {Drv, eof}, Data = #state{ driver = Drv }) -> ?MODULE:State(data, eof, Data); +handle_info(_State, {Drv, echo, Bool}, Data = #state{ driver = Drv }) -> + {keep_state, Data#state{ echo = Bool } }; +handle_info(_State, {Drv, terminal_mode, Mode}, Data = #state{ driver = Drv }) -> + noshell = Data#state.shell, + true = lists:member(Mode, [raw, cooked, disabled]), + {keep_state, Data#state{ terminal_mode = Mode }}; handle_info(_State, {io_request, From, ReplyAs, {setopts, Opts}}, Data) -> {Reply, NewData} = setopts(Opts, Data), @@ -717,9 +737,9 @@ do_setopts(Opts, Data) -> undefined -> ok end, - ReadMode = + ReadType = case proplists:get_value(binary, Opts, - case Data#state.read_mode of + case Data#state.read_type of binary -> true; _ -> false end) of @@ -729,7 +749,7 @@ do_setopts(Opts, Data) -> list end, LineHistory = proplists:get_value(line_history, Opts, true), - {ok, Data#state{ expand_fun = ExpandFun, echo = Echo, read_mode = ReadMode, + {ok, Data#state{ expand_fun = ExpandFun, echo = Echo, read_type = ReadType, save_history = LineHistory }}. normalize_expand_fun(Options, Default) -> @@ -758,7 +778,7 @@ getopts(Data) -> _ -> false end}, - Bin = {binary, case Data#state.read_mode of + Bin = {binary, case Data#state.read_type of binary -> true; _ -> @@ -1087,7 +1107,8 @@ get_line_dumb(Buf, _Pbs, Cont, ToEnc, Data = #state{ driver = Drv }) -> EditLineRes = if - Data#state.shell =:= noshell -> edit_line_noshell(cast(Buf, list), Cont, []); + Data#state.shell =:= noshell -> + edit_line_noshell(cast(Buf, list), Cont, [], Data#state.terminal_mode); true -> edit_line_dumb(cast(Buf, list), Cont, []) end, @@ -1160,16 +1181,18 @@ edit_line_dumb([Char|Cs],Chars, Rs) -> edit_line_dumb(Cs,[Char|Chars], [{put_chars, unicode, [Char]}|Rs]). %% This is used by noshell to get just get everything until the next \n -edit_line_noshell(eof, [], _) -> +edit_line_noshell(eof, [], _, _) -> eof; -edit_line_noshell(eof, Chars, Rs) -> +edit_line_noshell(eof, Chars, Rs, _) -> {done, Chars, eof, lists:reverse(Rs)}; -edit_line_noshell([],Chars, Rs) -> +edit_line_noshell([],Chars, Rs, _) -> {more, Chars, lists:reverse(Rs)}; -edit_line_noshell([NL|Cs],Chars, Rs) when NL =:= $\n -> +edit_line_noshell([NL|Cs],Chars, Rs, raw) when NL =:= $\r -> + {done, [$\n | Chars], Cs, lists:reverse([{put_chars, unicode, "\r\n"}|Rs])}; +edit_line_noshell([NL|Cs],Chars, Rs, _) when NL =:= $\n -> {done, [$\n | Chars], Cs, lists:reverse([{put_chars, unicode, "\n"}|Rs])}; -edit_line_noshell([Char|Cs],Chars, Rs) -> - edit_line_noshell(Cs, [Char|Chars], [{put_chars, unicode, [Char]}|Rs]). +edit_line_noshell([Char|Cs],Chars, Rs, TerminalMode) -> + edit_line_noshell(Cs, [Char|Chars], [{put_chars, unicode, [Char]}|Rs], TerminalMode). %% Handling of the line history stack new_stack(Ls) -> {stack,Ls,{},[]}. diff --git a/lib/kernel/src/prim_tty.erl b/lib/kernel/src/prim_tty.erl index 1eba84ab53e9..7fd34f9ceb12 100644 --- a/lib/kernel/src/prim_tty.erl +++ b/lib/kernel/src/prim_tty.erl @@ -111,7 +111,7 @@ ansi_regexp/0, ansi_color/2]). -export([reader_stop/1, disable_reader/1, enable_reader/1, is_reader/2, is_writer/2]). --nifs([isatty/1, tty_create/0, tty_init/3, tty_set/1, setlocale/1, +-nifs([isatty/1, tty_create/0, tty_init/2, setlocale/1, tty_select/2, tty_window_size/1, tty_encoding/1, write_nif/2, read_nif/2, isprint/1, wcwidth/1, wcswidth/1, sizeof_wchar/0, tgetent_nif/1, tgetnum_nif/1, tgetflag_nif/1, tgetstr_nif/1, @@ -138,7 +138,7 @@ -record(state, {tty :: tty() | undefined, reader :: {pid(), reference()} | undefined, writer :: {pid(), reference()} | undefined, - options, + options = #{ input => cooked, output => cooked } :: options(), unicode = true :: boolean(), lines_before = [], %% All lines before the current line in reverse order lines_after = [], %% All lines after the current line. @@ -166,12 +166,8 @@ ansi_regexp }). --type options() :: #{ tty => boolean(), - input => boolean(), - canon => boolean(), - echo => boolean(), - sig => boolean() - }. +-type options() :: #{ input := cooked | raw | disabled, + output := raw | cooked }. -type request() :: {putc_raw, binary()} | {putc, unicode:unicode_binary()} | @@ -241,7 +237,7 @@ on_load(Extra) -> -spec window_size(state()) -> {ok, {non_neg_integer(), non_neg_integer()}} | {error, term()}. window_size(State = #state{ tty = TTY }) -> case tty_window_size(TTY) of - {error, enotsup} when map_get(tty, State#state.options) -> + {error, enotsup} when map_get(input, State#state.options) =:= raw -> %% When the TTY is enabled, we should return a "dummy" row and column %% when we cannot find the proper size. {ok, {State#state.cols, State#state.rows}}; @@ -275,28 +271,25 @@ init(UserOptions) when is_map(UserOptions) -> init_term(#state{ tty = TTY, unicode = UnicodeMode, options = Options, ansi_regexp = ANSI_RE_MP }). init_term(State = #state{ tty = TTY, options = Options }) -> TTYState = - case maps:get(tty, Options) of - true -> - %% If a reader has been started already, we disable it to avoid race conditions when - %% upgrading the terminal - [disable_reader(State) || State#state.reader =/= undefined], - - try - case tty_init(TTY, stdout, Options) of - ok -> ok; - {error, enotsup} -> error(enotsup) - end, - NewState = init(State, os:type()), - ok = tty_set(TTY), - - NewState - after - [enable_reader(State) || State#state.reader =/= undefined] - end; - false -> + case maps:get(input, Options) of + raw -> + init(State, os:type()); + Else when Else =:= cooked; Else =:= disabled -> State end, + try + [disable_reader(State) || State#state.reader =/= undefined], + + case tty_init(TTY, Options) of + ok -> ok; + {error, enotsup} -> error(enotsup) + end + + after + [enable_reader(State) || State#state.reader =/= undefined] + end, + WriterState = if TTYState#state.writer =:= undefined -> {ok, Writer} = proc_lib:start_link(?MODULE, writer, [State#state.tty]), @@ -305,7 +298,7 @@ init_term(State = #state{ tty = TTY, options = Options }) -> TTYState end, ReaderState = - case {maps:get(input, Options), TTYState#state.reader} of + case {maps:get(input, Options) =/= disabled, TTYState#state.reader} of {true, undefined} -> DefaultReaderEncoding = if State#state.unicode -> utf8; not State#state.unicode -> latin1 @@ -352,18 +345,18 @@ init_ssh(UserOptions, {Cols, Rows}, IOEncoding) -> -spec reinit(state(), options()) -> state(). -reinit(State, UserOptions) -> - init_term(State#state{ options = options(UserOptions) }). +reinit(State = #state{ options = OldOptions }, UserOptions) -> + case options(UserOptions) of + OldOptions -> State; + _ -> + init_term(State#state{ options = options(UserOptions) }) + end. options(UserOptions) -> - maps:merge( - #{ input => true, - tty => true, - canon => false, - echo => false }, UserOptions). + maps:merge(#{ input => raw, output => cooked }, UserOptions). + init(State, ssh) -> State#state{ xn = true }; - init(State, {unix,_}) -> case os:getenv("TERM") of @@ -506,7 +499,7 @@ handle_signal(State, sigwinch) -> handle_signal(State, resize) -> update_geometry(State); handle_signal(State, sigcont) -> - tty_set(State#state.tty), + tty_init(State#state.tty, State#state.options), State. -spec disable_reader(state()) -> ok. @@ -562,10 +555,10 @@ reader_loop(TTY, Parent, ReaderRef, FromEnc, Acc) -> Parent ! {ReaderRef, eof}, ok; {error, aborted} -> - %% The read operation was aborted. This only happens on - %% Windows when we change from "noshell" to "newshell". - %% When it happens we need to re-read the tty_encoding as - %% it has changed. + %% The read operation was aborted. This happens on + %% Windows when we change from "{noshell, cooked}" to "{noshell, raw}" + %% or "newshell". + %% When it happens we need to re-read the tty_encoding as it has changed. reader_loop(TTY, Parent, ReaderRef, tty_encoding(TTY), Acc); {ok, <<>>} -> %% EAGAIN or EINTR @@ -646,7 +639,7 @@ writer_loop(TTY, WriterRef) -> end. -spec handle_request(state(), request()) -> {erlang:iovec(), state()}. -handle_request(State = #state{ options = #{ tty := false } }, Request) -> +handle_request(State = #state{ options = #{ output := raw } }, Request) -> case Request of {putc_raw, Binary} -> {Binary, State}; @@ -1428,9 +1421,7 @@ isatty(_Fd) -> -spec tty_create() -> {ok, tty()}. tty_create() -> erlang:nif_error(undef). -tty_init(_TTY, _Fd, _Options) -> - erlang:nif_error(undef). -tty_set(_TTY) -> +tty_init(_TTY, _Options) -> erlang:nif_error(undef). setlocale(_TTY) -> erlang:nif_error(undef). diff --git a/lib/kernel/src/user_drv.erl b/lib/kernel/src/user_drv.erl index d90bb8cb6921..09026a096688 100644 --- a/lib/kernel/src/user_drv.erl +++ b/lib/kernel/src/user_drv.erl @@ -104,6 +104,7 @@ -record(state, { tty :: prim_tty:state() | undefined, write :: reference() | undefined, read :: reference() | undefined, + terminal_mode :: raw | cooked | disabled, shell_started = new :: new | old | false, editor :: #editor{} | undefined, user :: pid(), @@ -111,9 +112,10 @@ groups, queue }). -type shell() :: {module(), atom(), [term()]} | {node(), module(), atom(), [term()]}. --type arguments() :: #{ initial_shell => noshell | shell() | - {remote, unicode:charlist()} | {remote, unicode:charlist(), {module(), atom(), [term()]}}, - input => boolean() }. +-type arguments() :: + #{ initial_shell => noshell | shell() | + {remote, unicode:charlist()} | {remote, unicode:charlist(), {module(), atom(), [term()]}}, + input => cooked | raw | disabled }. %% Default line editing shell -spec start() -> pid(). @@ -162,20 +164,22 @@ init(Args) -> IsTTY = prim_tty:isatty(stdin) =:= true andalso prim_tty:isatty(stdout) =:= true, StartShell = maps:get(initial_shell, Args, undefined) =/= noshell, OldShell = maps:get(initial_shell, Args, undefined) =:= oldshell, + try if not IsTTY andalso StartShell; OldShell -> error(enotsup); IsTTY, StartShell -> - TTYState = prim_tty:init(#{}), + TTYState = prim_tty:init(#{ input => raw, + output => cooked }), init_standard_error(TTYState, true), - {ok, init, {Args, #state{ user = start_user() } }, + {ok, init, {Args, #state{ terminal_mode = raw, user = start_user() } }, {next_event, internal, TTYState}}; - true -> - TTYState = prim_tty:init(#{input => maps:get(input, Args, true), - tty => false}), + true -> + TTYState = prim_tty:init( + #{ input => maps:get(input, Args), output => raw }), init_standard_error(TTYState, false), - {ok, init, {Args,#state{ user = start_user() } }, + {ok, init, {Args,#state{ terminal_mode = maps:get(input, Args), user = start_user() } }, {next_event, internal, TTYState}} end catch error:enotsup -> @@ -186,9 +190,9 @@ init(Args) -> %% The oldshell mode is important as it is %% the mode used when running erlang in an %% emacs buffer. - CatchTTYState = prim_tty:init(#{tty => false}), + CatchTTYState = prim_tty:init(#{ input => cooked, output => raw }), init_standard_error(CatchTTYState, false), - {ok, init, {Args,#state{ shell_started = old, user = start_user() } }, + {ok, init, {Args,#state{ terminal_mode = cooked, shell_started = old, user = start_user() } }, {next_event, internal, CatchTTYState}} end. @@ -245,6 +249,7 @@ exit_on_remote_shell_error(_, _, Result) -> %% We have been started with -noshell. In this mode the current_group is %% the `user` group process. init_noshell(State) -> + State#state.user ! {self(), terminal_mode, State#state.terminal_mode}, init_shell(State#state{ shell_started = false }, ""). init_remote_shell(State, Node, {M, F, A}) -> @@ -336,7 +341,7 @@ init_local_shell(State, InitialShell) -> init_shell(State, Slogan) -> - init_standard_error(State#state.tty, State#state.shell_started =:= new), + init_standard_error(State#state.tty, State#state.terminal_mode =:= raw), Curr = gr_cur_pid(State#state.groups), put(current_group, Curr), {next_state, server, State#state{ current_group = gr_cur_pid(State#state.groups) }, @@ -367,16 +372,28 @@ server({call, From}, {start_shell, Args}, not IsTTY andalso StartShell; OldShell -> error(enotsup); IsTTY, StartShell -> - NewTTY = prim_tty:reinit(TTY, #{ }), - State#state{ tty = NewTTY, - shell_started = new }; - true -> - NewTTY = prim_tty:reinit(TTY, #{ tty => false }), - State#state{ tty = NewTTY, shell_started = false } + NewTTY = prim_tty:reinit(TTY, #{ input => raw, output => cooked }), + State#state{ tty = NewTTY, terminal_mode = raw, shell_started = new }; + not StartShell -> + Input = maps:get(input, Args), + if not IsTTY andalso Input =:= raw -> + error(enotsup); + true -> + State#state{ + terminal_mode = Input, + tty = prim_tty:reinit(TTY, #{ input => Input, + output => raw }), + shell_started = false } + end end catch error:enotsup -> - NewTTYState = prim_tty:reinit(TTY, #{ tty => false }), - State#state{ tty = NewTTYState, shell_started = old } + NewTTYState = prim_tty:reinit(TTY, #{ input => cooked, output => raw }), + Shell = if StartShell -> + old; + true -> + false + end, + State#state{ terminal_mode = cooked, tty = NewTTYState, shell_started = Shell } end, #{ read := ReadHandle, write := WriteHandle } = prim_tty:handles(NewState#state.tty), NewHandleState = NewState#state { @@ -386,7 +403,12 @@ server({call, From}, {start_shell, Args}, {Result, Reply} = case maps:get(initial_shell, Args, undefined) of noshell -> - {init_noshell(NewHandleState), ok}; + case maps:get(input, Args) =:= NewHandleState#state.terminal_mode of + true -> + {init_noshell(NewHandleState), ok}; + false -> + {init_noshell(NewHandleState), {error, enotsup}} + end; {remote, Node} -> case init_remote_shell(NewHandleState, Node, {shell, start, []}) of {error, _} = Error -> diff --git a/lib/kernel/src/user_sup.erl b/lib/kernel/src/user_sup.erl index 96ee518ab5e5..7525077d450c 100644 --- a/lib/kernel/src/user_sup.erl +++ b/lib/kernel/src/user_sup.erl @@ -124,13 +124,13 @@ check_flags([{nouser, []} |T], Attached, _) -> check_flags(T, Attached, nouser); check_flags([{user, [User]} | T], Attached, _) -> check_flags(T, Attached, {list_to_atom(User), start, []}); check_flags([{noshell, []} | T], Attached, _) -> - check_flags(T, Attached, {user_drv, start, [#{ initial_shell => noshell }]}); + check_flags(T, Attached, {user_drv, start, [#{ initial_shell => noshell, input => cooked }]}); check_flags([{oldshell, []} | T], false, _) -> %% When running in detached mode, we ignore any -oldshell flags as we do not %% want input => true to be set as they may halt the node (on bsd) check_flags(T, false, {user_drv, start, [#{ initial_shell => oldshell }]}); check_flags([{noinput, []} | T], Attached, _) -> - check_flags(T, Attached, {user_drv, start, [#{ initial_shell => noshell, input => false }]}); + check_flags(T, Attached, {user_drv, start, [#{ initial_shell => noshell, input => disabled }]}); check_flags([{master, [Node]} | T], Attached, _) -> check_flags(T, Attached, {master, list_to_atom(Node)}); check_flags([_H | T], Attached, User) -> check_flags(T, Attached, User); diff --git a/lib/kernel/test/interactive_shell_SUITE.erl b/lib/kernel/test/interactive_shell_SUITE.erl index 05f1a61e178d..d4c34022302d 100644 --- a/lib/kernel/test/interactive_shell_SUITE.erl +++ b/lib/kernel/test/interactive_shell_SUITE.erl @@ -40,6 +40,7 @@ init_per_testcase/2, end_per_testcase/2, get_columns_and_rows/1, exit_initial/1, job_control_local/1, job_control_remote/1,stop_during_init/1,wrap/1, + noshell_raw/1, shell_history/1, shell_history_resize/1, shell_history_eaccess/1, shell_history_repair/1, shell_history_repair_corrupt/1, shell_history_corrupt/1, @@ -67,6 +68,8 @@ external_editor/1, external_editor_visual/1, external_editor_unicode/1, shell_ignore_pager_commands/1]). +-export([get_until/2]). + -export([test_invalid_keymap/1, test_valid_keymap/1]). %% Exports for custom shell history module -export([load/0, add/1]). @@ -91,6 +94,7 @@ groups() -> ctrl_keys, stop_during_init, wrap, shell_invalid_ansi, shell_get_password, + noshell_raw, {group, shell_history}, {group, remsh}]}, {shell_history, [], @@ -2186,6 +2190,142 @@ wrap(Config) when is_list(Config) -> end, ok. +noshell_raw(Config) -> + + case proplists:get_value(default_shell, Config) of + new -> + + TCGl = group_leader(), + TC = self(), + + TestcaseFun = fun() -> + link(TC), + group_leader(whereis(user), self()), + + try + %% Make sure we are in unicode encoding + unicode = proplists:get_value(encoding, io:getopts()), + + "\fhello\n" = io:get_line("1> "), + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + ok = shell:start_interactive({noshell, raw}), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that we can receive 1 char when N is 100 + [$\^p] = io:get_chars("2> ", 100), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that we only receive 1 char when N is 1 + "a" = io:get_chars("3> ", 1), + "bc" = io:get_chars("", 2), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that get_chars counts characters not bytes + ok = io:setopts([binary]), + ~b"å" = io:get_chars("4> ", 1), + ~b"äö" = io:get_chars("", 2), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that echo works + ok = io:setopts([{echo, true}]), + ~b"åäö" = io:get_chars("5> ", 100), + ok = io:setopts([{echo, false}]), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that get_line works + ~b"a\n" = io:get_line("6> "), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that get_until works + ok = io:setopts([{echo, true}]), + ~b"a,b,c" = io:request({get_until, unicode, "7> ", ?MODULE, get_until, []}), + ok = io:setopts([{echo, false}]), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that we can go back to cooked mode + ok = shell:start_interactive({noshell, cooked}), + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + ~b"abc" = io:get_chars(user, "8> ", 3), + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + ~b"\n" = io:get_chars(user, "", 1), + + io:format("exit") + catch E:R:ST -> + io:format(TCGl, "~p", [{E, R, ST}]) + end + end, + + rtnode:run( + [ + {eval, fun() -> spawn(TestcaseFun), ok end}, + + %% Test io:get_line in cookec mode + {expect, "1> $"}, + {putline, "hello"}, + + %% Test io:get_chars 100 in raw mode + {expect, "2> $"}, + {putdata, [$\^p]}, + + %% Test io:get_chars 1 in raw mode + {expect, "3> $"}, + {putdata, "abc"}, + + %% Test io:get_chars unicode + {expect, "4> $"}, + {putdata, ~b"åäö"}, + + %% Test that raw + echo works + {expect, "5> $"}, + {putdata, ~b"åäö"}, + {expect, "åäö$"}, + + %% Test io:get_line in raw mode + {expect, "6> $"}, + {putdata, "a\r"}, %% When in raw mode, \r is newline. + + %% Test io:get_until in raw mode + {expect, "7> $"}, + {putline, "a"}, + {expect, "a\n7> $"}, + {putline, "b"}, + {expect, "b\n7> $"}, + {putdata, "c."}, + {expect, "c.$"}, + + %% Test io:get_line in cooked mode + {expect, "8> $"}, + {putdata, "a"}, + {expect, "a"}, + {putdata, "b"}, + {expect, "b"}, + {putline, "c"}, + {expect, "c\r\n$"}, + + {expect, "exit$"} + ], [], [], + ["-noshell","-pz",filename:dirname(code:which(?MODULE))]); + _ -> ok + end, + ok. + +get_until(start, NewChars) -> + get_until([], NewChars); +get_until(State, NewChars) -> + Chars = State ++ NewChars, + case string:split(Chars, ".") of + [Chars] -> {more, Chars ++ ","}; + [Before, After] -> {done, [C || C <- Before, C =/= $\n], After} + end. + + %% This testcase tests that shell_history works as it should. %% We use Ctrl + P = Cp=[$\^p] in order to navigate up %% We use Ctrl + N = Cp=[$\^n] in order to navigate down diff --git a/lib/stdlib/doc/assets/tic-tac-toe.es b/lib/stdlib/doc/assets/tic-tac-toe.es new file mode 100755 index 000000000000..0fb694905ce2 --- /dev/null +++ b/lib/stdlib/doc/assets/tic-tac-toe.es @@ -0,0 +1,106 @@ +#!/usr/bin/env escript +main(_Args) -> + ok = shell:start_interactive({noshell, raw}), + + io:put_chars("\e[?1049h"), %% Enable alternate screen buffer + io:put_chars("\e[?25l"), %% Hide the cursor + draw_board(), + loop({0, "X", list_to_tuple(lists:duplicate(9, ""))}), + io:put_chars("\e[?25h"), %% Show the cursor + io:put_chars("\e[?1049l"), %% Disable alternate screen buffer + ok. + +draw_board() -> + io:put_chars("\e[5;0H"), %% Move cursor to top left + io:put_chars( + [" ╔═══════╤═══════╤═══════╗\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║ Place an X by pressing Enter\r\n", + " ║ │ │ ║\r\n", + " ╟───────┼───────┼───────╢\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ╟───────┼───────┼───────╢\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ╚═══════╧═══════╧═══════╝\r\n"]), + ok. + +loop(State) -> + io:put_chars(draw_state(State)), + case handle_input(io:get_chars("", 30), State) of + stop -> stop; + NewState -> + io:put_chars(clear_selection(State)), + loop(NewState) + end. + +%% Clear/draw the selection markers, making sure +%% not to overwrite if a X or O exists. +%% \b = Move cursor left +%% \e[C = Move cursor right +%% \n = Move cursor down +clear_selection({Pos, _, _}) -> + [set_position(Pos), + " ","\b\b\b\b\b\b\b\n", + " \e[C\e[C\e[C\e[C\e[C ", + "\b\b\b\b\b\b\b\n"," "]. + +draw_selection({Pos, _, _}) -> + [set_position(Pos), + "┌─────┐","\b\b\b\b\b\b\b\n", + "│\e[C\e[C\e[C\e[C\e[C│", + "\b\b\b\b\b\b\b\n","└─────┘"]. + +%% Set the cursor position to be at the top +%% left of the field of the given position +set_position(Pos) -> + Row = 6 + (Pos div 3) * 4, + Col = 7 + (Pos rem 3) * 8, + io_lib:format("\e[~p;~pH",[Row, Col]). + +%% Update selection and whos turn it is +draw_state({_, Turn, _} = State) -> + [draw_selection(State), + io_lib:format("\e[7;45H~s",[Turn])]. + +%% Draw X or O +draw_marker(Pos, Turn) -> + [set_position(Pos), "\e[C\e[C\e[C\n", Turn]. + +handle_input({ok, Chars}, State) -> + handle_input({ok, Chars}, State); +handle_input(eof, _State) -> + stop; +handle_input("\e[A" ++ Rest, {Pos, Turn, State}) -> + %% Up key + handle_input(Rest, {max(0, Pos - 3), Turn, State}); +handle_input("\e[B" ++ Rest, {Pos, Turn, State}) -> + %% Down key + handle_input(Rest, {min(8, Pos + 3), Turn, State}); +handle_input("\e[C" ++ Rest, {Pos, Turn, State}) -> + %% right key + handle_input(Rest, {min(8, Pos + 1), Turn, State}); +handle_input("\e[D" ++ Rest, {Pos, Turn, State}) -> + %% left key + handle_input(Rest, {max(0, Pos - 1), Turn, State}); +handle_input("\r" ++ Rest, {Pos, Turn, State} = OldState) -> + NewState = + case element(Pos+1, State) of + "" when Turn =:= "X" -> + io:put_chars(draw_marker(Pos, Turn)), + {Pos, "O", setelement(Pos+1, State, Turn)}; + "" when Turn =:= "O" -> + io:put_chars(draw_marker(Pos, Turn)), + {Pos, "X", setelement(Pos+1, State, Turn)}; + _ -> io:put_chars("\^G"), OldState + end, + handle_input(Rest, NewState); +handle_input("q" ++ _, _State) -> + stop; +handle_input([_ | T], State) -> + handle_input(T, State); +handle_input([], State) -> + State. \ No newline at end of file diff --git a/lib/stdlib/doc/guides/terminal_interface.md b/lib/stdlib/doc/guides/terminal_interface.md index 54eec5e6140e..9cfb9e236657 100644 --- a/lib/stdlib/doc/guides/terminal_interface.md +++ b/lib/stdlib/doc/guides/terminal_interface.md @@ -19,3 +19,157 @@ limitations under the License. --> # Creating a terminal application +This guide will show how to create a very simple tic-tac-toe game in +the shell. We will go through how to read key-strokes and how to update +the screen to show the tic-tac-toe board. The game will be implemented as an +`m:escript`, but it can just as well be implemented in a regular system. + +Let us start by drawing the board which will look like this: + +```txt +╔═══════╤═══════╤═══════╗ +║┌─────┐│ │ ║ +║│ ││ │ ║ Place an X by pressing Enter +║└─────┘│ │ ║ +╟───────┼───────┼───────╢ +║ │ │ ║ +║ │ │ ║ +║ │ │ ║ +╟───────┼───────┼───────╢ +║ │ │ ║ +║ │ │ ║ +║ │ │ ║ +╚═══════╧═══════╧═══════╝ +``` +{: .monospace-font } + + +We will use the alternate screen buffer for our game so first we need to set that up: + +``` +#!/usr/bin/env escript +main(_Args) -> + + io:put_chars("\e[?1049h"), %% Enable alternate screen buffer + io:put_chars("\e[?25l"), %% Hide the cursor + draw_board(), + timer:sleep(5000), + io:put_chars("\e[?25h"), %% Show the cursor + io:put_chars("\e[?1049l"), %% Disable alternate screen buffer + ok. +``` + +We then use the box drawing parts of Unicode to draw our board: + +``` +draw_board() -> + io:put_chars("\e[5;0H"), %% Move cursor to top left + io:put_chars( + [" ╔═══════╤═══════╤═══════╗\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║ Place an X by pressing Enter\r\n", + " ║ │ │ ║\r\n", + " ╟───────┼───────┼───────╢\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ╟───────┼───────┼───────╢\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ╚═══════╧═══════╧═══════╝\r\n"]), + ok. +``` +{: .monospace-font } + +Let us add some interactivity to our game! To do that we need to change the +shell from running in `cooked` to `raw` mode. This is done by calling +[`shell:start_interactive({noshell, raw})`](`shell:start_interactive/1`). +We can then use `io:get_chars/2` to read key strokes from the user. The key +strokes will be returned as [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code), +so we will have need to handle the codes for up, down, left, right and enter. + +It could look something like this: + +``` +main(_Args) -> + ok = shell:start_interactive({noshell, raw}), + + io:put_chars("\e[?1049h"), %% Enable alternate screen buffer + io:put_chars("\e[?25l"), %% Hide the cursor + draw_board(), + loop(0), + io:put_chars("\e[?25h"), %% Show the cursor + io:put_chars("\e[?1049l"), %% Disable alternate screen buffer + ok. + +loop(Pos) -> + io:put_chars(draw_selection(Pos)), + %% Read at most 1024 characters from stdin. + {ok, Chars} = io:get_chars("", 1024), + case handle_input(Chars, Pos) of + stop -> stop; + NewPos -> + io:put_chars(clear_selection(Pos)), + loop(NewPos) + end. + +handle_input("\e[A" ++ Rest, Pos) -> + %% Up key + handle_input(Rest, max(0, Pos - 3)); +handle_input("\e[B" ++ Rest, Pos) -> + %% Down key + handle_input(Rest, min(8, Pos + 3)); +handle_input("\e[C" ++ Rest, Pos) -> + %% right key + handle_input(Rest, min(8, Pos + 1)); +handle_input("\e[D" ++ Rest, Pos) -> + %% left key + handle_input(Rest, max(0, Pos - 1)); +handle_input("q" ++ _, _State) -> + stop; +handle_input([_ | T], State) -> + handle_input(T, State); +handle_input([], State) -> + State. +``` + +Note that when using `io:get_chars/2` with the shell set in `{noshell, raw}` mode +it will return as soon as any data is available. The number of characters +is the maximum number that will be returned. We use 1024 here to make sure that +we always get all the data in one read. + +We also need to draw the selection marker, we do this using some simple drawing +routines. + +``` +%% Clear/draw the selection markers, making sure +%% not to overwrite if a X or O exists. +%% \b = Move cursor left +%% \e[C = Move cursor right +%% \n = Move cursor down +clear_selection(Pos) -> + [set_position(Pos), + " ","\b\b\b\b\b\b\b\n", + " \e[C\e[C\e[C\e[C\e[C ", + "\b\b\b\b\b\b\b\n"," "]. + +draw_selection(Pos) -> + [set_position(Pos), + "┌─────┐","\b\b\b\b\b\b\b\n", + "│\e[C\e[C\e[C\e[C\e[C│", + "\b\b\b\b\b\b\b\n","└─────┘"]. + +%% Set the cursor position to be at the top +%% left of the field of the given position +set_position(Pos) -> + Row = 6 + (Pos div 3) * 4, + Col = 7 + (Pos rem 3) * 8, + io_lib:format("\e[~p;~pH",[Row, Col]). +``` +{: #monospace-font } + +Now we have a program where we can move the marker around the board. +To complete the game we need to add some state so that we know which +squares are marked and whos turn it is. You can find the final solution +in [tic-tac-toe.es](assets/tic-tac-toe.es). \ No newline at end of file diff --git a/lib/stdlib/src/io_lib.erl b/lib/stdlib/src/io_lib.erl index 543496c34ca2..967c4d1afdcd 100644 --- a/lib/stdlib/src/io_lib.erl +++ b/lib/stdlib/src/io_lib.erl @@ -86,7 +86,7 @@ used for flattening deep lists. printable_list/1, printable_latin1_list/1, printable_unicode_list/1]). %% Utilities for collecting characters mostly used by group --export([collect_chars/3, collect_chars/4, +-export([collect_chars/3, collect_chars/4, collect_chars_eager/4, collect_line/3, collect_line/4, collect_line_no_eol/4, get_until/3, get_until/4]). @@ -1135,6 +1135,20 @@ collect_chars_list(Stack, N, []) -> collect_chars_list(Stack,N, [H|T]) -> collect_chars_list([H|Stack], N-1, T). +%% A special collect_chars that never returns more_chars, +%% instead it eagerly stops collecting if it has received +%% any characters at all. +-doc false. +collect_chars_eager(State, Chars, Encoding, N) -> + case collect_chars(State, Chars, Encoding, N) of + {list, Stack, _} when Stack =/= [] -> + {stop, lists:reverse(Stack), []}; + {binary, Stack, _} when Stack =/= [<<>>] -> + {stop, binrev(Stack), []}; + Else -> + Else + end. + %% collect_line(State, Data, _). New in R9C. %% Returns: %% {stop,Result,RestData} diff --git a/lib/stdlib/src/shell.erl b/lib/stdlib/src/shell.erl index 3135c95c2461..aeefaf647d62 100644 --- a/lib/stdlib/src/shell.erl +++ b/lib/stdlib/src/shell.erl @@ -115,7 +115,7 @@ On error this function will return: description of the error reasons. """. -doc(#{since => <<"OTP 26.0">>}). --spec start_interactive(noshell | {module(), atom(), [term()]}) -> +-spec start_interactive(noshell | {noshell, raw | cooked} | {module(), atom(), [term()]}) -> ok | {error, already_started}; ({remote, string()}) -> ok | {error, already_started | noconnection}; @@ -123,6 +123,10 @@ On error this function will return: ok | {error, already_started | noconnection | badfile | nofile | on_load_failure}. start_interactive({Node, {M, F, A}}) -> user_drv:start_shell(#{ initial_shell => {Node, M, F ,A} }); +start_interactive(noshell) -> + start_interactive({noshell, cooked}); +start_interactive({noshell, Type}) when Type =:= raw; Type =:= cooked -> + user_drv:start_shell(#{ initial_shell => noshell, input => Type }); start_interactive(InitialShell) -> user_drv:start_shell(#{ initial_shell => InitialShell }). diff --git a/make/ex_doc.exs b/make/ex_doc.exs index 9e2d71572ea4..bb19a1c7b8df 100644 --- a/make/ex_doc.exs +++ b/make/ex_doc.exs @@ -228,6 +228,9 @@ config = [ :epub -> """ <style type="text/css"> + #monospace-font > code { + font-family: monospace; + } .content-inner pre code.mermaid { display: none; } @@ -235,7 +238,14 @@ config = [ """ _ -> - "" + """ + <style type="text/css"> + .monospace-font > code { + font-family: monospace; + } + </style> + + """ end ] From 61003ace248714f6141c627ac849b8bb48aea373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Backstr=C3=B6m?= <lukas@erlang.org> Date: Wed, 11 Sep 2024 20:27:34 +0200 Subject: [PATCH 3/7] shell: Implement lazy-read for noshell When running in `-noshell` mode, it is "normal" for programs to not eagerly read from stdin. This commit changes so that we only issue read requests to stdin when `user` has received a read request from the application. This change also makes it so that on Windows we don't have to abort an ongoing read request, which means that we can use ReadFile in non-overlapped mode and thus Unicode will work when reading from stdin in noshell mode on windows. --- bootstrap/lib/kernel/ebin/group.beam | Bin 20976 -> 21172 bytes bootstrap/lib/kernel/ebin/prim_tty.beam | Bin 23732 -> 24176 bytes bootstrap/lib/kernel/ebin/user_drv.beam | Bin 18772 -> 18940 bytes bootstrap/lib/stdlib/ebin/io_lib.beam | Bin 14760 -> 14860 bytes erts/emulator/nifs/common/prim_tty_nif.c | 476 ++++++++++---------- lib/kernel/src/group.erl | 7 +- lib/kernel/src/prim_tty.erl | 140 +++--- lib/kernel/src/user_drv.erl | 15 + lib/kernel/test/interactive_shell_SUITE.erl | 12 +- lib/stdlib/src/io_lib.erl | 25 +- lib/stdlib/src/shell.erl | 23 +- 11 files changed, 391 insertions(+), 307 deletions(-) diff --git a/bootstrap/lib/kernel/ebin/group.beam b/bootstrap/lib/kernel/ebin/group.beam index d286e8c78648f38f6418868adf2cec9553067ce2..26ba0ebe5942812ba80ff7cede35352b89c34d8e 100644 GIT binary patch literal 21172 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 H?%)3dT&_)V literal 20976 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 P=NbFMGbfRU%K!a82B--^ diff --git a/bootstrap/lib/kernel/ebin/prim_tty.beam b/bootstrap/lib/kernel/ebin/prim_tty.beam index 5135bdfdbba1acd9e498c9fc18a9158d7daa331f..9804b8f549790b7f8e3150bad2aba83e525934f5 100644 GIT binary patch literal 24176 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	Y1)c5132X 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 SCeO|pIu*)}9obQGJpTtsF4MmN literal 23732 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ⅆ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 diff --git a/bootstrap/lib/kernel/ebin/user_drv.beam b/bootstrap/lib/kernel/ebin/user_drv.beam index 599f7d5f2909a22dba0093ff42f0262727667feb..d8ad75b57e0c7c59a17a61b42119c3165df0b89f 100644 GIT binary patch delta 10607 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 delta 10693 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 diff --git a/bootstrap/lib/stdlib/ebin/io_lib.beam b/bootstrap/lib/stdlib/ebin/io_lib.beam index 74b8894b67edf6f3ef6a41f4f1f59d17775879ab..e03a42d6f1c9479359a6fbb96a3ca90a30c17236 100644 GIT binary patch delta 3180 zcmZ`*3v?9K8J^iYA-ChwGh`MPS}b$UY~Yf~O$K(8?1tA(HX(=-7J@EPDyRVgL7}{g z5O#Tr1tc&CUIckYw8x&)o}9z!8|}-!w9wYRTWhr~*xHBoVQVY>?(7QD+ML|IcmDf7 zzW=}9e`g+Fy=M)bI&=0oO=~tjO`oY8`kJO`7KZver)m0G%!~V9t}Mp&dBLJl8}<3Y zi=$@aH{~qA??I<ipWpwI^G2kw+R|Bdh9^ifhTlpYV(V<Qq@RgYnVW^q#zZwC>1PeW zwPs$UG&H-FSnh<peSz1+g}H{0HP>>cGgixM+=y_Aq@Sy_==GMc&XBlot|yTy4Nk{m zKku&WphH8Q&l?t>XWjWOrJ7LHlk^LSU+{HSE8L_ohr5FWAEz@e=@+q41hBfOC7z61 zhNNEtxN*mMJwYr$13bs5<@L6?PS^l*J~)|(73!-jVDKe<N;!u8IFF}@xuJoNw^fLU z3uOe!=xlrwPuh4A5qprs+jW+Ns`A!BhpFnM8hAr!L$290H1S6J2~sv_O!Fpkiex?R z!>)lhWxc3oN&0k{^VO8ibz!zmB{gUuqNHCA7E}+tF)is=fOH#>W<Fs~6@;AQg2a2x zmZD|0ib&DQo+Vwm3HdB#d`euL<P$IQW}P*k;}b}HWvDhgQamB)SA+A_<2zdN+1^|} zNyiqo<Y3DYf*9?|4jMxusL|I9htKabY|9c(`OxgJU=toEUFY}|5_in3Ch6CM^yraJ zYd+a4@`TnDHDU?Bow%gEgAOOEI1?p(1_4JE6lgoUo@dK}tBYDT%_q4nuHEJF$u<ly z0a5jksI?GqP+p+v0-A69KQxn4e6rg|NX`<u63ncMIT;D%R6^NEDV=W`PT{@tnNm7p zVL5)g?JDCINxwA>bE~A^R&!R;@2I&=(r0l1+Z~;?r};F}f-F7W;hs$MsdkI)f)rET ziy+}u=t)3-uF|2NVt%1SeIu;m)F>*B48bXtq@>?{TWz3LhXUo=We!bC@iqbrK)FHE z3yQU9)#*Z4k{czx2+0mK$W7N8q*G@zB>kS+5CxreW_TWLJ%c!C+H8i;Na7*sM{_xm zHAFHd+=Q@Gg0wa8obB<MuDL=XG<VwQtCXbQ2S`4N&(hgUCBUAfKR{>Kg|eJT5uMFK zuB|c0Zf&#Nc4Cuum$<DljkE?m%*;Gr>C^fQpGzj@iO=W8g~M<0`D~rdE?px|o5$zc z=0<dF%Hwkkb5s+bgH>1X6dP9fA*}sL{AQhXA=Z;|-$($}kAPrYD4i1`xcS;W(^i#3 zZEjJ%L%*9W--2rbsyGG-H}f9qVQ#Q|VOG%bcDO|%AO&hSSJLOFBd1#>{jn<dUetTu z+g<q+bz;<_Nlj-Tmh`7k*b8dRk7|yjKO3<55lMfpP5{QYl@4oxq`!b<AJi9ezQAUD zLEg4TT)7hU9bp@S#FixZ?UMcywBNckA!4M;M;?XSmnA%YN1j|TdokPQeqq?ytZ;ZY z&i#(%E|l(+^ac3d58vG$Uj)CpFb^n-EK2hwinQSAVu*);c_Wm3aa0K5hUaf51VKfA zWmtnRd;Bh9jzUGN1eETQ^u?g1CO)IPr^2GKe9RhR3z859+2vS(d5`5-?FJzsyO$j0 zO9^hu^*UQx%a@amg&BS~dSzKT><3iXWs?3n=&PwVx+Q%nc&=vHiq&Nw*g#!VsMp<F zU=2q_oh^sS3Q1o^ZU>RuJt=;#@^Y`oR}M^OWty)FJ5$o%^i=pjicFKy@Ol$=OyC}O z3Gj9Yv%Fz*-+_9Sq`&Q{a7res=el+FQAvM?h!3H>tHF;rSeqQf*W{BTZ|6irAz0(_ zwR!hiIoC>hDLC)d=-t69-t~B$4k*kzNiW0QAtbO~-2gUTR<D4*4XUWa^M)#FBq<EH zLhud9|6`K=9{Puc&Ng`bKIEbcb*cQJ)1r+!yALO)-gsAASJGGEZDfXTM4N9?@8${z zA^sTbuKi$PvqC~*Ns(|x%Erm5An?4=gR0pKB1!ru6uuF%P4J|c-y`Xt0YD=E&6575 zR8b`BM$s^(`^&XeInh|<rc!U!f~2p(><IEK;&F?luSd)(^AS96_4u}+o)0Z-OY@y& zI&Ke7(A<yYU19bD$6q^r+N87XQU4k>CH-58mpc?MO}o?-J0$&kPlbk4OQ`CBkCvm_ zM$&(j#356WtiyLB{LZ8Ne#NMRxDM~H<qw41+(pV~i`REj46)Juy*k^q1=~<Prn3iB zI3)6MN#8(T$KYspitoYI7>f6JeDD9H@Xt~Td(-^EG9mvpkdTG&H8FsZK>X%=A%0NO zf4_s4TXnWi(*FR*qe5rBWBC5OOTD~JN0;I3_xOQ)5{w*J(YH!)4oG_Cx(YfhA3R;h zjIEMs!K-ynV=p`flId`I9LXIllaoahIdRLNdWXQrha|(dn|T5%hdh2*o#TkZQO5~M zXvZWoO7wde^pnA=`VrX*!{?7kHt5}%sTO$H<5Ce%9i@ZnO4uvX9g(aOQBHz%Fr~q> z^&<*E`o5Bnut~y8Z!3HpmCS_hDJ+kb(|=U5>mWJ}yvL)C1)462@e`6ofi1l>7KS>p zEC#AbHW+-*!1konVA7}Q?3Ab?=q`LXoi54X=8T9FTge?dL1%rEy&uYFVfI-6Cja$F z;Zyjy&S3Om==eWVUaQAb_&HscAIH28BLewC%sViY{%z&8fpuqjO|ZTR>q1#)dU>sM z@R_d_G1R(F(>@d`DT7)FH<vfYU|x-(_g_kSk-?8)8U9tyc<ar;X^f3j3rKFo0H6@O knl&Zw&o$nlTbUz$BQuTX>b8CI(##DnoWI=vMAH@hzg5SC8UO$Q delta 3019 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 diff --git a/erts/emulator/nifs/common/prim_tty_nif.c b/erts/emulator/nifs/common/prim_tty_nif.c index 73fd7569abf2..cc299bd337ae 100644 --- a/erts/emulator/nifs/common/prim_tty_nif.c +++ b/erts/emulator/nifs/common/prim_tty_nif.c @@ -60,6 +60,9 @@ #ifdef HAVE_SYS_UIO_H #include <sys/uio.h> #endif +#ifdef HAVE_POLL_H +#include <poll.h> +#endif #if defined IOV_MAX #define MAXIOV IOV_MAX @@ -92,15 +95,11 @@ typedef struct { #ifdef __WIN32__ HANDLE ofd; HANDLE ifd; - HANDLE ifdOverlapped; DWORD dwOriginalOutMode; DWORD dwOriginalInMode; DWORD dwOutMode; DWORD dwInMode; - /* Fields to handle the threaded reader */ - OVERLAPPED overlapped; - ErlNifBinary overlappedBuffer; #else int ofd; /* stdout */ int ifd; /* stdin */ @@ -129,6 +128,7 @@ static ErlNifResourceType *tty_rt; static ERL_NIF_TERM isatty_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); +static ERL_NIF_TERM tty_is_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM setlocale_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_select_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_write_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); @@ -145,20 +145,17 @@ static ERL_NIF_TERM tty_tgetflag_nif(ErlNifEnv* env, int argc, const ERL_NIF_TER static ERL_NIF_TERM tty_tgetstr_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_tgoto_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); -#ifdef __WIN32__ -static HANDLE tty_windows_select(ErlNifEnv *env, TTYResource *tty, ERL_NIF_TERM *error); -#endif - static ErlNifFunc nif_funcs[] = { {"isatty", 1, isatty_nif}, {"tty_create", 0, tty_create_nif}, {"tty_init", 2, tty_init_nif}, {"setlocale", 1, setlocale_nif}, + {"tty_is_open", 2, tty_is_open}, {"tty_select", 2, tty_select_nif}, {"tty_window_size", 1, tty_window_size_nif}, {"write_nif", 2, tty_write_nif, ERL_NIF_DIRTY_JOB_IO_BOUND}, {"tty_encoding", 1, tty_encoding_nif}, - {"read_nif", 2, tty_read_nif, ERL_NIF_DIRTY_JOB_IO_BOUND}, + {"read_nif", 3, tty_read_nif, ERL_NIF_DIRTY_JOB_IO_BOUND}, {"isprint", 1, isprint_nif}, {"wcwidth", 1, wcwidth_nif}, {"wcswidth", 1, wcswidth_nif}, @@ -258,7 +255,7 @@ static ERL_NIF_TERM tty_encoding_nif(ErlNifEnv* env, int argc, const ERL_NIF_TER TTYResource *tty; if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); - if (tty->tty == enabled) + if (GetFileType(tty->ifd) == FILE_TYPE_CHAR) return enif_make_tuple2(env, enif_make_atom(env, "utf16"), enif_make_atom(env, "little")); #endif @@ -399,6 +396,7 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar TTYResource *tty; ErlNifBinary bin; ERL_NIF_TERM res_term; + Uint64 n; ssize_t res = 0; #ifdef __WIN32__ HANDLE select_event; @@ -406,37 +404,38 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar int select_event; #endif + ASSERT(argc == 3); + if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); + if (!enif_get_uint64(env, argv[2], &n)) + return enif_make_badarg(env); + + n = n > 1024 ? 1024 : n; + select_event = tty->ifd; -#ifdef __WIN32__ debug("tty_read_nif(%T, %T, %T)\r\n",argv[0],argv[1],argv[2]); + +#ifdef __WIN32__ /** * We have three different read scenarios we need to deal with * using different approaches. * - * ### New Shell + * ### New Shell / Raw NoShell * * Here characters need to be delivered as they are typed and we * also need to handle terminal resize events. So we use ReadConsoleInputW * to read. * - * ### Input is a terminal, but there is no shell, or old shell + * ### Input is a terminal, but there is noshell, or old shell * * Here we should operate in "line mode", that is characters should only - * be delivered when the user hits enter. Therefore we cannot use - * ReadConsoleInputW, and we also cannot use ReadFile in synchronous mode - * as it will block until a complete line is done. So we use the - * OVERLAPPED support of ReadFile to read data. - * - * From this mode it is important to be able to upgrade to a "New Shell" - * terminal. - * - * Unfortunately it does not seem like unicode works at all when in this - * mode. At least when I try it, all unicode characters are translated to - * "?". Maybe it could be solved by using ReadConsoleW? + * be delivered when the user hits enter. Here we used to use OVERLAPPED ReadFile, + * but that caused unicode to not work, so instead we use ReadFile. + * + * This call will block a single dirty io schedulers until the user hits Enter. * * ### Input is an anonymous pipe * @@ -445,185 +444,157 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar * call will not block until a full line is complete, so this is safe to do. * **/ - if (GetFileType(tty->ifd) == FILE_TYPE_CHAR) { - if (tty->ifdOverlapped == INVALID_HANDLE_VALUE && tty->tty == enabled) { - /* Input is a terminal and we are in "new shell" mode */ + if (GetFileType(tty->ifd) == FILE_TYPE_CHAR && tty->tty == enabled) { + /* Input is a terminal and we are in "new shell"/"raw" mode */ - ssize_t inputs_read, num_characters = 0; - wchar_t *characters = NULL; - INPUT_RECORD inputs[128]; + ssize_t inputs_read, num_characters = 0; + wchar_t *characters = NULL; + INPUT_RECORD inputs[128]; - ASSERT(tty->tty == enabled); + n = MIN(n, sizeof(inputs) / sizeof(inputs[0])); - if (!ReadConsoleInputW(tty->ifd, inputs, sizeof(inputs)/sizeof(*inputs), - &inputs_read)) { - return make_errno_error(env, "ReadConsoleInput"); - } + ASSERT(tty->tty == enabled); + + if (!ReadConsoleInputW(tty->ifd, inputs, n, &inputs_read)) { + return make_errno_error(env, "ReadConsoleInput"); + } - /** - * Reading keyevents using ReadConsoleInput is a bit fragile as - * different consoles and different input modes cause events to - * be triggered in different ways. I've so far identified four - * different input methods that work slightly differently and - * two classes of consoles that also work slightly differently. - * - * The input methods are: - * - Normal key presses - * - Microsoft IME - * - Pasting into console - * - Using Alt+ modifiers - * - * ### Normal key presses - * - * When typing normally both key down and up events are sent with - * the typed character. If typing a Unicode character (for instance if - * you are using a keyboard with Cyrillic layout), that character also - * is sent as both key up and key down. This behavior is the same on all - * consoles. - * - * ### Microsoft IME - * - * When typing Japanese, Chinese and many other languages it is common to - * use a "Input Method Editor". Basically what it does is that if you type - * "sushi" using the Japanese IME it convert that to "すし". All characters - * typed using IME end up as only keydown events on cmd.exe and powershell, - * while in Windows Terminal and Alacritty both keydown and keyup events - * are sent. - * - * ### Pasting into console - * - * When text pasting into the console, any ascii text pasted ends up as both - * keydown and keyup events. Any non-ascii text pasted seem to be sent using - * a keydown event with UnicodeChar set to 0 and then immediately followed by a - * keyup event with the non-ascii text. - * - * ### Using Alt+ modifiers - * - * A very old way of inputting Unicode characters on Windows is to press - * the left alt key and then some numbers on the number pad. For instance - * you can type Alt+1 to write a ☺. When doing this first a keydown - * with 0 is sent and then some events later a keyup with the character - * is sent. This behavior seems to only work on cmd.exe and powershell. - * - * - * So to summarize: - * - Normal presses -- Always keydown and keyup events - * - IME -- Always keydown, sometimes keyup - * - Pasting -- Always keydown=0 directly followed by keyup=value - * - Alt+ -- Sometimes keydown=0 followed eventually by keyup=value - * - * So in order to read characters we should always read the keydown event, - * except when it is 0, then we should read the adjacent keyup event. - * This covers all modes and consoles except Alt+. If we want Alt+ to work - * we probably have to use PeekConsoleInput to make sure the correct events - * are available and inspect the state of the key event somehow. - **/ - - for (int i = 0; i < inputs_read; i++) { - if (inputs[i].EventType == KEY_EVENT) { - if (inputs[i].Event.KeyEvent.bKeyDown) { - if (inputs[i].Event.KeyEvent.uChar.UnicodeChar != 0) { - num_characters++; - } else if (i + 1 < inputs_read && !inputs[i+1].Event.KeyEvent.bKeyDown) { - num_characters++; - } + /** + * Reading keyevents using ReadConsoleInput is a bit fragile as + * different consoles and different input modes cause events to + * be triggered in different ways. I've so far identified four + * different input methods that work slightly differently and + * two classes of consoles that also work slightly differently. + * + * The input methods are: + * - Normal key presses + * - Microsoft IME + * - Pasting into console + * - Using Alt+ modifiers + * + * ### Normal key presses + * + * When typing normally both key down and up events are sent with + * the typed character. If typing a Unicode character (for instance if + * you are using a keyboard with Cyrillic layout), that character also + * is sent as both key up and key down. This behavior is the same on all + * consoles. + * + * ### Microsoft IME + * + * When typing Japanese, Chinese and many other languages it is common to + * use a "Input Method Editor". Basically what it does is that if you type + * "sushi" using the Japanese IME it convert that to "すし". All characters + * typed using IME end up as only keydown events on cmd.exe and powershell, + * while in Windows Terminal and Alacritty both keydown and keyup events + * are sent. + * + * ### Pasting into console + * + * When text pasting into the console, any ascii text pasted ends up as both + * keydown and keyup events. Any non-ascii text pasted seem to be sent using + * a keydown event with UnicodeChar set to 0 and then immediately followed by a + * keyup event with the non-ascii text. + * + * ### Using Alt+ modifiers + * + * A very old way of inputting Unicode characters on Windows is to press + * the left alt key and then some numbers on the number pad. For instance + * you can type Alt+1 to write a ☺. When doing this first a keydown + * with 0 is sent and then some events later a keyup with the character + * is sent. This behavior seems to only work on cmd.exe and powershell. + * + * + * So to summarize: + * - Normal presses -- Always keydown and keyup events + * - IME -- Always keydown, sometimes keyup + * - Pasting -- Always keydown=0 directly followed by keyup=value + * - Alt+ -- Sometimes keydown=0 followed eventually by keyup=value + * + * So in order to read characters we should always read the keydown event, + * except when it is 0, then we should read the adjacent keyup event. + * This covers all modes and consoles except Alt+. If we want Alt+ to work + * we probably have to use PeekConsoleInput to make sure the correct events + * are available and inspect the state of the key event somehow. + **/ + + for (int i = 0; i < inputs_read; i++) { + if (inputs[i].EventType == KEY_EVENT) { + if (inputs[i].Event.KeyEvent.bKeyDown) { + if (inputs[i].Event.KeyEvent.uChar.UnicodeChar != 0) { + num_characters++; + } else if (i + 1 < inputs_read && !inputs[i+1].Event.KeyEvent.bKeyDown) { + num_characters++; } } } - enif_alloc_binary(num_characters * sizeof(wchar_t), &bin); - characters = (wchar_t*)bin.data; - for (int i = 0; i < inputs_read; i++) { - switch (inputs[i].EventType) - { - case KEY_EVENT: - if (inputs[i].Event.KeyEvent.bKeyDown) { - if (inputs[i].Event.KeyEvent.uChar.UnicodeChar != 0) { - debug("Read %u\r\n",inputs[i].Event.KeyEvent.uChar.UnicodeChar); - characters[res++] = inputs[i].Event.KeyEvent.uChar.UnicodeChar; - } else if (i + 1 < inputs_read && !inputs[i+1].Event.KeyEvent.bKeyDown) { - debug("Read %u\r\n",inputs[i+1].Event.KeyEvent.uChar.UnicodeChar); - characters[res++] = inputs[i+1].Event.KeyEvent.uChar.UnicodeChar; - } + } + enif_alloc_binary(num_characters * sizeof(wchar_t), &bin); + characters = (wchar_t*)bin.data; + for (int i = 0; i < inputs_read; i++) { + switch (inputs[i].EventType) + { + case KEY_EVENT: + if (inputs[i].Event.KeyEvent.bKeyDown) { + if (inputs[i].Event.KeyEvent.uChar.UnicodeChar != 0) { + debug("Read %u\r\n",inputs[i].Event.KeyEvent.uChar.UnicodeChar); + characters[res++] = inputs[i].Event.KeyEvent.uChar.UnicodeChar; + } else if (i + 1 < inputs_read && !inputs[i+1].Event.KeyEvent.bKeyDown) { + debug("Read %u\r\n",inputs[i+1].Event.KeyEvent.uChar.UnicodeChar); + characters[res++] = inputs[i+1].Event.KeyEvent.uChar.UnicodeChar; } - break; - case WINDOW_BUFFER_SIZE_EVENT: - enif_send(env, &tty->self, NULL, - enif_make_tuple2(env, argv[1], - enif_make_tuple2( - env, enif_make_atom(env, "signal"), - enif_make_atom(env, "resize")))); - break; - case MOUSE_EVENT: - /* We don't do anything with the mouse event */ - break; - case MENU_EVENT: - case FOCUS_EVENT: - /* Should be ignored according to - https://docs.microsoft.com/en-us/windows/console/input-record-str */ - break; - default: - fprintf(stderr,"Unknown event: %d\r\n", inputs[i].EventType); - break; } + break; + case WINDOW_BUFFER_SIZE_EVENT: + enif_send(env, &tty->self, NULL, + enif_make_tuple2(env, argv[1], + enif_make_tuple2(env, + enif_make_atom(env, "signal"), + enif_make_atom(env, "resize")))); + break; + case MOUSE_EVENT: + /* We don't do anything with the mouse event */ + break; + case MENU_EVENT: + case FOCUS_EVENT: + /* Should be ignored according to + https://docs.microsoft.com/en-us/windows/console/input-record-str */ + break; + default: + fprintf(stderr,"Unknown event: %d\r\n", inputs[i].EventType); + break; } - res *= sizeof(wchar_t); - } else if (tty->ifdOverlapped != INVALID_HANDLE_VALUE) { - /* Input is a terminal and we are in "{noshell, cooked}" or "oldshell" mode. - We just triggered in a select from a overlapped ReadFile. */ - DWORD bytesRead = 0; - debug("GetOverlapped on %d\r\n", tty->ifdOverlapped); - if (!GetOverlappedResult(tty->ifdOverlapped, &tty->overlapped, &bytesRead, TRUE)) { - if (GetLastError() == ERROR_OPERATION_ABORTED && tty->tty == enabled) { - /* The overlapped operation was cancels by CancelIo because - we are upgrading to "newshell". So we close the handles - involved with the overlapped io and select on the stdin - handle. From now on we use ReadConsoleInputW to get - input. */ - CloseHandle(tty->ifdOverlapped); - CloseHandle(tty->overlapped.hEvent); - tty->ifdOverlapped = INVALID_HANDLE_VALUE; - enif_select(env, tty->ifd, ERL_NIF_SELECT_READ, tty, NULL, argv[1]); - /* Return {error,aborted} to signal that the encoding has changed . */ - return make_error(env, enif_make_atom(env, "aborted")); - } - return make_errno_error(env, "GetOverlappedResult"); - } - if (bytesRead == 0) { - return make_error(env, enif_make_atom(env, "closed")); - } - debug("Read %d bytes\r\n", bytesRead); -#ifdef HARD_DEBUG - for (int i = 0; i < bytesRead; i++) - debug("Read %u\r\n", tty->overlappedBuffer.data[i]); -#endif - bin = tty->overlappedBuffer; - res = bytesRead; - enif_alloc_binary(1024, &tty->overlappedBuffer); - if (!ReadFile(tty->ifdOverlapped, tty->overlappedBuffer.data, - tty->overlappedBuffer.size, NULL, &tty->overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) - return make_errno_error(env, "ReadFile"); - } - select_event = tty->overlapped.hEvent; - } else { - /* Input is a terminal, we are in "{noshell, cooked}" or "oldshell" mode, - but we don't have a overlapped ReadFile, so we create one. - */ - ERL_NIF_TERM error; - select_event = tty_windows_select(env, tty, &error); - if (select_event == INVALID_HANDLE_VALUE) { - return error; - } - enif_select(env, select_event, ERL_NIF_SELECT_READ, tty, NULL, argv[1]); - /* Return {error,aborted} to signal that the encoding has changed . */ - return make_error(env, enif_make_atom(env, "aborted")); } + res *= sizeof(wchar_t); } else { - /* Input is not a terminal */ + /* Input is not a terminal or we are in "cooked" mode */ DWORD bytesTransferred; - enif_alloc_binary(1024, &bin); - if (ReadFile(tty->ifd, bin.data, bin.size, - &bytesTransferred, NULL)) { + BOOL readRes; + const char *errorFunction; + if (GetFileType(tty->ifd) == FILE_TYPE_CHAR) { + /* This ReadConsoleW call may hang until Enter is pressed. + * This will block one dirty io schedulers, but that should be ok as it will + * only happen if the application wants to read data, i.e. it is reasonable to + * expect and enter to be hit "soon". + * + * NOTE: I've tried various things to try to figure out if ReadFile/ReadConsole + * will block or not, but one of the crazy thing with ReadFile/ReadConsole is + * that you need to call it before the characters on the terminal are echoed, + * so we need this call to be blocking. What we could do is move the read to another + * thread so that we don't consume a dirty io scheduler, but I've opted to keep + * it simple and not do that. + */ + enif_alloc_binary(n * sizeof(wchar_t), &bin); + readRes = ReadConsoleW(tty->ifd, bin.data, n, &bytesTransferred, NULL); + bytesTransferred *= sizeof(wchar_t); + errorFunction = "ReadConsoleW"; + } + else { + enif_alloc_binary(n, &bin); + readRes = ReadFile(tty->ifd, bin.data, bin.size, &bytesTransferred, NULL); + errorFunction = "ReadFile"; + } + if (readRes) { res = bytesTransferred; if (res == 0) { enif_release_binary(&bin); @@ -634,11 +605,11 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar enif_release_binary(&bin); if (error == ERROR_BROKEN_PIPE) return make_error(env, enif_make_atom(env, "closed")); - return make_errno_error(env, "ReadFile"); + return make_errno_error(env, errorFunction); } } #else - enif_alloc_binary(1024, &bin); + enif_alloc_binary(n, &bin); res = read(tty->ifd, bin.data, bin.size); if (res < 0) { if (errno != EAGAIN && errno != EINTR) { @@ -669,6 +640,77 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar return enif_make_tuple2(env, atom_ok, res_term); } +/* Poll if stdin/stdout/stderr are still open. */ +static ERL_NIF_TERM tty_is_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { + TTYResource *tty; + int fd; + + if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) + return enif_make_badarg(env); + + if (tty_get_fd(env, argv[1], &fd)) { + +#ifdef WIN32 + HANDLE handle; + DWORD bytesAvailable = 0; + + switch (fd) { + case 0: handle = GetStdHandle(STD_INPUT_HANDLE); break; + case 1: handle = GetStdHandle(STD_OUTPUT_HANDLE); break; + case 2: handle = GetStdHandle(STD_ERROR_HANDLE); break; + } + + switch (GetFileType(handle)) { + case FILE_TYPE_CHAR: { + DWORD eventsAvailable; + if (!GetNumberOfConsoleInputEvents(handle, &eventsAvailable)) { + return atom_false; + } + return atom_true; + } + case FILE_TYPE_DISK: { + return atom_true; + } + default: { + DWORD bytesAvailable = 0; + // Check the state of the pipe + if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytesAvailable, NULL)) { + DWORD err = GetLastError(); + + // If the error is ERROR_BROKEN_PIPE, it means stdin has been closed + if (err == ERROR_BROKEN_PIPE) { + return atom_false; + } + else { + return make_errno_error(env, "PeekNamedPipe"); + } + } + return atom_true; + } + } + +#else + + struct pollfd fds[1]; + int ret; + + fds[0].fd = fd; + fds[0].events = POLLHUP; + fds[0].revents = 0; + ret = poll(fds, 1, 0); + + if (ret < 0) { + return make_errno_error(env, __FUNCTION__); + } else if (ret == 0) { + return atom_true; + } else if (ret == 1 && fds[0].revents & POLLHUP) { + return atom_false; + } +#endif + } + return enif_make_badarg(env); +} + static ERL_NIF_TERM setlocale_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { #ifdef __WIN32__ TTYResource *tty; @@ -850,7 +892,7 @@ static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM return make_errno_error(env, "SetConsoleMode"); } } - tty->ifdOverlapped = INVALID_HANDLE_VALUE; + #endif tty_term = enif_make_resource(env, tty); @@ -944,15 +986,6 @@ static ERL_NIF_TERM tty_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar ; } - /* If we are changing from "-noshell" to a shell we - need to cancel any outstanding async io. This - will cause the enif_select to trigger which allows - us to do more cleanup in tty_read_nif. */ - if (tty->ifdOverlapped != INVALID_HANDLE_VALUE) { - debug("CancelIo on %d\r\n", tty->ifdOverlapped); - CancelIoEx(tty->ifdOverlapped, &tty->overlapped); - } - #endif /* __WIN32__ */ enif_self(env, &tty->self); @@ -1006,52 +1039,21 @@ static ERL_NIF_TERM tty_window_size_nif(ErlNifEnv* env, int argc, const ERL_NIF_ )); } -#ifdef __WIN32__ -static HANDLE tty_windows_select(ErlNifEnv *env, TTYResource *tty, ERL_NIF_TERM *error) { - if (tty->tty == enabled || GetFileType(tty->ifd) != FILE_TYPE_CHAR) { - return tty->ifd; - } - - tty->ifdOverlapped = CreateFile("CONIN$", GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); - enif_alloc_binary(1024, &tty->overlappedBuffer); - tty->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - debug("Calling ReadFile on %d\r\n", tty->ifdOverlapped); - if (!ReadFile(tty->ifdOverlapped, tty->overlappedBuffer.data, tty->overlappedBuffer.size, - NULL, &tty->overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) { - *error = make_errno_error(env, "ReadFile"); - return INVALID_HANDLE_VALUE; - } - } - debug("Select on %d\r\n", tty->overlapped.hEvent); - return tty->overlapped.hEvent; -} -#endif - static ERL_NIF_TERM tty_select_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { TTYResource *tty; + #ifndef __WIN32__ - int select_event; extern int using_oldshell; /* set this to let the rest of erts know */ -#else - HANDLE select_event; #endif + if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); #ifndef __WIN32__ using_oldshell = 0; - select_event = tty->ifd; -#else - ERL_NIF_TERM error; - select_event = tty_windows_select(env, tty, &error); - if (select_event == INVALID_HANDLE_VALUE) { - return error; - } #endif - debug("Select on %d\r\n", select_event); - enif_select(env, select_event, ERL_NIF_SELECT_READ, tty, NULL, argv[2]); + debug("Select on %d\r\n", tty->ifd); + enif_select(env, tty->ifd, ERL_NIF_SELECT_READ, tty, NULL, argv[1]); enif_self(env, &tty->reader); enif_monitor_process(env, tty, &tty->reader, NULL); diff --git a/lib/kernel/src/group.erl b/lib/kernel/src/group.erl index ef83d9b4cdbc..17b4562ff6bd 100644 --- a/lib/kernel/src/group.erl +++ b/lib/kernel/src/group.erl @@ -307,9 +307,11 @@ dumb(data, Buf, Data = #state{ input = #input_state{ prompt_bytes = Pbs, encodin io_reply(Data, {error,err_func(io_lib, CollectF, CollectAs)}), pop_state(Data#state{ buf = [] }); NewState -> + [Data#state.driver ! {self(), read, io_lib:CollectF(NewState)} || Data#state.shell =:= noshell], dumb(data, RemainBuf, Data#state{ input = InputState#input_state{ cont = undefined, io_lib_state = NewState } }) end; {more_chars, NewCont} -> + [Data#state.driver ! {self(), read, 0} || Data#state.shell =:= noshell], {keep_state, Data#state{ input = InputState#input_state{ cont = NewCont } } } end; @@ -409,7 +411,7 @@ xterm(data, Buf, Data = #state{ input = #input_state{ {'EXIT',_} -> io_reply(Data, {error,err_func(io_lib, CollectF, CollectAs)}), pop_state(Data#state{ buf = [] }); - _M -> + _NewState -> xterm(data, RemainBuf, Data#state{ input = InputState#input_state{ cont = undefined, lines = NewLines} }) end; {blink, NewCont} -> @@ -443,6 +445,9 @@ handle_info(State, {Drv, eof}, Data = #state{ driver = Drv }) -> ?MODULE:State(data, eof, Data); handle_info(_State, {Drv, echo, Bool}, Data = #state{ driver = Drv }) -> {keep_state, Data#state{ echo = Bool } }; +handle_info(_State, {Drv, {error, _} = Error}, Data = #state{ driver = Drv }) -> + io_reply(Data, Error), + pop_state(Data#state{ buf = [] }); handle_info(_State, {Drv, terminal_mode, Mode}, Data = #state{ driver = Drv }) -> noshell = Data#state.shell, true = lists:member(Mode, [raw, cooked, disabled]), diff --git a/lib/kernel/src/prim_tty.erl b/lib/kernel/src/prim_tty.erl index 7fd34f9ceb12..45600663f7ef 100644 --- a/lib/kernel/src/prim_tty.erl +++ b/lib/kernel/src/prim_tty.erl @@ -106,21 +106,24 @@ %% to previous line automatically. -export([init/1, init_ssh/3, reinit/2, isatty/1, handles/1, unicode/1, unicode/2, - handle_signal/2, window_size/1, update_geometry/3, handle_request/2, write/2, write/3, + handle_signal/2, window_size/1, update_geometry/3, handle_request/2, + write/2, write/3, npwcwidth/1, npwcwidth/2, ansi_regexp/0, ansi_color/2]). --export([reader_stop/1, disable_reader/1, enable_reader/1, is_reader/2, is_writer/2]). +-export([reader_stop/1, disable_reader/1, enable_reader/1, read/1, read/2, + is_reader/2, is_writer/2]). -nifs([isatty/1, tty_create/0, tty_init/2, setlocale/1, - tty_select/2, tty_window_size/1, tty_encoding/1, write_nif/2, read_nif/2, isprint/1, + tty_select/2, tty_window_size/1, + tty_encoding/1, tty_is_open/2, write_nif/2, read_nif/3, isprint/1, wcwidth/1, wcswidth/1, sizeof_wchar/0, tgetent_nif/1, tgetnum_nif/1, tgetflag_nif/1, tgetstr_nif/1, tgoto_nif/1, tgoto_nif/2, tgoto_nif/3]). --export([reader_loop/5, writer_loop/2]). +-export([reader_loop/2, writer_loop/2]). %% Exported in order to remove "unused function" warning --export([sizeof_wchar/0, wcswidth/1, tgoto/1, tgoto/2, tgoto/3]). +-export([sizeof_wchar/0, wcswidth/1, tgoto/1, tgoto/2, tgoto/3, tty_is_open/2]). %% proc_lib exports -export([reader/1, writer/1]). @@ -510,6 +513,18 @@ disable_reader(#state{ reader = {ReaderPid, _} }) -> enable_reader(#state{ reader = {ReaderPid, _} }) -> ok = call(ReaderPid, enable). +-spec read(state()) -> ok. +read(#state{ reader = {ReaderPid, _} }) -> + ReaderPid ! {read, infinity}, + ok. + +-spec read(state(), pos_integer()) -> ok. +read(State, 0) -> + read(State, 1024); +read(#state{ reader = {ReaderPid, _} }, N) -> + ReaderPid ! {read, N}, + ok. + call(Pid, Msg) -> Alias = erlang:monitor(process, Pid, [{alias, reply_demonitor}]), Pid ! {Alias, Msg}, @@ -530,69 +545,84 @@ reader([TTY, Encoding, Parent]) -> utf8 -> Encoding; Else -> Else end, - reader_loop(TTY, Parent, ReaderRef, FromEnc, <<>>). + reader_loop(#{ tty => TTY, parent => Parent, + reader => ReaderRef, enc => FromEnc, read => 0, + ready_input => false}, <<>>). -reader_loop(TTY, Parent, ReaderRef, FromEnc, Acc) -> +reader_loop(State = #{ tty := TTY, reader := ReaderRef, enc := FromEnc, read := Read, + ready_input := ReadyInput }, Acc) -> receive {DisableAlias, disable} -> DisableAlias ! {DisableAlias, ok}, receive {EnableAlias, enable} -> EnableAlias ! {EnableAlias, ok}, - ?MODULE:reader_loop(TTY, Parent, ReaderRef, FromEnc, Acc) + ?MODULE:reader_loop(State, Acc) end; {set_unicode_state, _} when FromEnc =:= {utf16, little} -> - ?MODULE:reader_loop(TTY, Parent, ReaderRef, FromEnc, Acc); + ?MODULE:reader_loop(State, Acc); {set_unicode_state, Bool} -> NewFromEnc = if Bool -> utf8; not Bool -> latin1 end, - ?MODULE:reader_loop(TTY, Parent, ReaderRef, NewFromEnc, Acc); + ?MODULE:reader_loop(State#{ enc := NewFromEnc }, Acc); {_Alias, stop} -> ok; - {select, TTY, ReaderRef, ready_input} -> - %% This call may block until data is available - case read_nif(TTY, ReaderRef) of - {error, closed} -> - Parent ! {ReaderRef, eof}, - ok; - {error, aborted} -> - %% The read operation was aborted. This happens on - %% Windows when we change from "{noshell, cooked}" to "{noshell, raw}" - %% or "newshell". - %% When it happens we need to re-read the tty_encoding as it has changed. - reader_loop(TTY, Parent, ReaderRef, tty_encoding(TTY), Acc); - {ok, <<>>} -> - %% EAGAIN or EINTR - ?MODULE:reader_loop(TTY, Parent, ReaderRef, FromEnc, Acc); - {ok, UtfXBytes} -> - - %% read_nif may have blocked for a long time, so we check if - %% there have been any changes to the unicode state before - %% decoding the data. - UpdatedFromEnc = flush_unicode_state(FromEnc), - - {Bytes, NewAcc, NewFromEnc} = - case unicode:characters_to_binary([Acc, UtfXBytes], UpdatedFromEnc, utf8) of - {error, B, Error} -> - %% We should only be able to get incorrect encoded data when - %% using utf8 - UpdatedFromEnc = utf8, - Parent ! {self(), set_unicode_state, false}, + {read, N} when ReadyInput -> + reader_read(State#{ read := N }, Acc); + {read, N} when not ReadyInput -> + ?MODULE:reader_loop(State#{ read := N }, Acc); + {select, TTY, ReaderRef, ready_input} when Read > 0; Read =:= infinity -> + reader_read(State, Acc); + {select, TTY, ReaderRef, ready_input} when Read =:= 0 -> + ?MODULE:reader_loop(State#{ ready_input := true }, Acc); + _M -> + % erlang:display(_M), + ?MODULE:reader_loop(State, Acc) + end. + +reader_read(State = #{ tty := TTY, parent := Parent, reader := ReaderRef, + enc := FromEnc, read := Read }, Acc) -> + %% This call may block until data is available + case read_nif(TTY, ReaderRef, if Read =:= infinity -> 1024; true -> Read end) of + {error, closed} -> + Parent ! {ReaderRef, eof}, + ok; + {ok, <<>>} -> + %% EAGAIN or EINTR + ?MODULE:reader_loop(State#{ ready_input := false }, Acc); + {ok, UtfXBytes} -> + + %% read_nif may have blocked for a long time, so we check if + %% there have been any changes to the unicode state before + %% decoding the data. + UpdatedFromEnc = flush_unicode_state(FromEnc), + + {Bytes, NewAcc, NewFromEnc} = + case unicode:characters_to_binary([Acc, UtfXBytes], UpdatedFromEnc, utf8) of + {error, B, Error} -> + %% We should only be able to get incorrect encoded data when + %% using utf8 + UpdatedFromEnc = utf8, + Parent ! {self(), set_unicode_state, false}, + receive + {set_unicode_state, false} -> receive - {set_unicode_state, false} -> - receive - {Parent, set_unicode_state, _} -> ok - end - end, - Latin1Chars = unicode:characters_to_binary(Error, latin1, utf8), - {<<B/binary,Latin1Chars/binary>>, <<>>, latin1}; - {incomplete, B, Inc} -> - {B, Inc, UpdatedFromEnc}; - B when is_binary(B) -> - {B, <<>>, UpdatedFromEnc} + {Parent, set_unicode_state, _} -> ok + end end, - Parent ! {ReaderRef, {data, Bytes}}, - ?MODULE:reader_loop(TTY, Parent, ReaderRef, NewFromEnc, NewAcc) - end + Latin1Chars = unicode:characters_to_binary(Error, latin1, utf8), + {<<B/binary,Latin1Chars/binary>>, <<>>, latin1}; + {incomplete, B, Inc} -> + {B, Inc, UpdatedFromEnc}; + B when is_binary(B) -> + {B, <<>>, UpdatedFromEnc} + end, + Parent ! {ReaderRef, {data, Bytes}}, + ResetRead = if + Read =:= infinity -> infinity; + true -> 0 + end, + ?MODULE:reader_loop(State#{ read := ResetRead, ready_input := false, + enc := NewFromEnc }, NewAcc) end. flush_unicode_state(FromEnc) -> @@ -1429,9 +1459,11 @@ tty_select(_TTY, _ReadRef) -> erlang:nif_error(undef). tty_encoding(_TTY) -> erlang:nif_error(undef). +tty_is_open(_TTY, _Fd) -> + erlang:nif_error(undef). write_nif(_TTY, _IOVec) -> erlang:nif_error(undef). -read_nif(_TTY, _Ref) -> +read_nif(_TTY, _Ref, _N) -> erlang:nif_error(undef). tty_window_size(_TTY) -> erlang:nif_error(undef). diff --git a/lib/kernel/src/user_drv.erl b/lib/kernel/src/user_drv.erl index 09026a096688..dabfc91ab78a 100644 --- a/lib/kernel/src/user_drv.erl +++ b/lib/kernel/src/user_drv.erl @@ -342,6 +342,10 @@ init_local_shell(State, InitialShell) -> init_shell(State, Slogan) -> init_standard_error(State#state.tty, State#state.terminal_mode =:= raw), + + %% Tell the reader to read greedily if there is a shell + [prim_tty:read(State#state.tty) || State#state.shell_started =/= false], + Curr = gr_cur_pid(State#state.groups), put(current_group, Curr), {next_state, server, State#state{ current_group = gr_cur_pid(State#state.groups) }, @@ -466,6 +470,17 @@ server(info, {ReadHandle,eof}, State = #state{ read = ReadHandle }) -> server(info,{ReadHandle,{signal,Signal}}, State = #state{ tty = TTYState, read = ReadHandle }) -> {keep_state, State#state{ tty = prim_tty:handle_signal(TTYState, Signal) }}; +server(info, {Requester, read, N}, State = #state{ tty = TTYState }) + when Requester =:= State#state.current_group -> + %% Only allowed when current_group == user + true = State#state.current_group =:= State#state.user, + ok = prim_tty:read(TTYState, N), + keep_state_and_data; + +server(info, {Requester, read, _N}, _State) -> + Requester ! {self(), {error, enotsup}}, + keep_state_and_data; + server(info, {Requester, tty_geometry}, #state{ tty = TTYState }) -> case prim_tty:window_size(TTYState) of {ok, Geometry} -> diff --git a/lib/kernel/test/interactive_shell_SUITE.erl b/lib/kernel/test/interactive_shell_SUITE.erl index d4c34022302d..55bf25e347c3 100644 --- a/lib/kernel/test/interactive_shell_SUITE.erl +++ b/lib/kernel/test/interactive_shell_SUITE.erl @@ -76,7 +76,7 @@ %% For custom prompt testing -export([prompt/1]). -export([output_to_stdout_slowly/1]). --record(tmux, {peer, node, name, orig_location }). +-record(tmux, {peer, node, name, ssh_server_name, orig_location }). suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,3}}]. @@ -1921,11 +1921,11 @@ setup_tty(Config) -> check_content(Tmux,"Enter password for \"foo\""), "" = tmux("send -t " ++ ClientName ++ " bar Enter"), timer:sleep(1000), - check_content(Tmux,"\\d+>"); + check_content(Tmux,"\\d+\n?>"), + Tmux#tmux{ ssh_server_name = Name }; true -> - ok - end, - Tmux. + Tmux + end. get_top_parent_test_group(Config) -> maybe @@ -1983,6 +1983,8 @@ prompt(L) -> stop_tty(Term) -> catch peer:stop(Term#tmux.peer), ct:log("~ts",[get_content(Term, "-e")]), + [ct:log("~ts",[get_content(Term#tmux{ name = Term#tmux.ssh_server_name }, "-e")]) + || Term#tmux.ssh_server_name =/= undefined], % "" = tmux("kill-window -t " ++ Term#tmux.name), ok. diff --git a/lib/stdlib/src/io_lib.erl b/lib/stdlib/src/io_lib.erl index 967c4d1afdcd..90e426ca0b79 100644 --- a/lib/stdlib/src/io_lib.erl +++ b/lib/stdlib/src/io_lib.erl @@ -86,9 +86,9 @@ used for flattening deep lists. printable_list/1, printable_latin1_list/1, printable_unicode_list/1]). %% Utilities for collecting characters mostly used by group --export([collect_chars/3, collect_chars/4, collect_chars_eager/4, - collect_line/3, collect_line/4, collect_line_no_eol/4, - get_until/3, get_until/4]). +-export([collect_chars/1, collect_chars/3, collect_chars/4, collect_chars_eager/4, + collect_line/1, collect_line/3, collect_line/4, collect_line_no_eol/4, + get_until/1, get_until/3, get_until/4]). %% The following functions were used by Yecc's include-file. -export([write_unicode_string/1, write_unicode_char/1, @@ -1135,15 +1135,20 @@ collect_chars_list(Stack, N, []) -> collect_chars_list(Stack,N, [H|T]) -> collect_chars_list([H|Stack], N-1, T). +%% Fetch the number of remaining bytes +-doc false. +collect_chars({_, _, N}) -> + N. + %% A special collect_chars that never returns more_chars, %% instead it eagerly stops collecting if it has received %% any characters at all. -doc false. collect_chars_eager(State, Chars, Encoding, N) -> case collect_chars(State, Chars, Encoding, N) of - {list, Stack, _} when Stack =/= [] -> + {list, Stack, _N} when Stack =/= [] -> {stop, lists:reverse(Stack), []}; - {binary, Stack, _} when Stack =/= [<<>>] -> + {binary, Stack, _N} when Stack =/= [<<>>] -> {stop, binrev(Stack), []}; Else -> Else @@ -1220,6 +1225,11 @@ collect_line_list([H|T], Stack) -> collect_line_list([], Stack) -> Stack. +%% Return the number of remaing bytes, 0 for unknown. +-doc false. +collect_line(_State) -> + 0. + %% Translator function to emulate a new (R9C and later) %% I/O client when you have an old one. %% @@ -1276,6 +1286,11 @@ binrev(L) -> binrev(L, T) -> list_to_binary(lists:reverse(L, T)). +%% Return the number of remaing bytes, 0 for unknown. +-doc false. +get_until(_State) -> + 0. + -doc false. -spec limit_term(term(), depth()) -> term(). diff --git a/lib/stdlib/src/shell.erl b/lib/stdlib/src/shell.erl index aeefaf647d62..838cf56e0fe4 100644 --- a/lib/stdlib/src/shell.erl +++ b/lib/stdlib/src/shell.erl @@ -65,6 +65,9 @@ non_local_allowed(_,_,State) -> Starts the interactive shell if it has not already been started. It can be used to programatically start the shell from an escript or when erl is started with the -noinput or -noshell flags. + +Calling this function will start a remote shell if `-remsh` is given on the +command line or a local shell if not. """. -doc(#{since => <<"OTP 26.0">>}). -spec start_interactive() -> ok | {error, already_started}. @@ -78,11 +81,21 @@ or when [`erl`](`e:erts:erl_cmd.md`) is started with the [`-noshell`](`e:erts:erl_cmd.md#noshell`) flags. The following options are allowed: -- **noshell** - Starts the interactive shell as if - [`-noshell`](`e:erts:erl_cmd.md#noshell`) was given to - [`erl`](`e:erts:erl_cmd.md`). This is only useful when erl is started with - [`-noinput`](`e:erts:erl_cmd.md#noinput`) and the system want to read input - data. +- **noshell | {noshell, Mode}** - Starts the interactive shell + as if [`-noshell`](`e:erts:erl_cmd.md#noshell`) was given to + [`erl`](`e:erts:erl_cmd.md`). + + It is possible to give a `Mode` indicating if the input should be set + in `cooked` or `raw` mode. `Mode` only has en effect if `t:io:user/0` is a tty. + If no `Mode` is given, it defaults is `cooked`. + + When in `raw` mode all key presses are passed to `t:io:user/0` as they are + typed when they are typed and the characters are not echoed to the terminal. + It is possible to set the `echo` to `true` using `io:setopts/2` to enabling + echoing again. + + When in `cooked` mode the OS will handle the line editing and all data is + passed to `t:io:user/0` when a newline is entered. - **[mfa()](`t:erlang:mfa/0`)** - Starts the interactive shell using [`mfa()`](`t:erlang:mfa/0`) as the default shell. The `t:mfa/0` should From a539e32b37879738c032d98694f065364c768288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Backstr=C3=B6m?= <lukas@erlang.org> Date: Tue, 17 Sep 2024 10:37:37 +0200 Subject: [PATCH 4/7] kernel: Fix bug where shell getting eof would not halt node When an Erlang shell gets EOF it should halt the node, however very often stderr is also closed at the same time which caused the error printing to crash preventing halt to be called. --- lib/stdlib/src/shell.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/stdlib/src/shell.erl b/lib/stdlib/src/shell.erl index 838cf56e0fe4..8e5b5d1c40c3 100644 --- a/lib/stdlib/src/shell.erl +++ b/lib/stdlib/src/shell.erl @@ -374,7 +374,7 @@ server_loop(N0, Eval_0, Bs00, RT, FT, Ds00, History0, Results0) -> [N]), server_loop(N0, Eval0, Bs0, RT, FT, Ds0, History0, Results0); eof -> - fwrite_severity(fatal, <<"Terminating erlang (~w)">>, [node()]), + catch fwrite_severity(fatal, <<"Terminating erlang (~w)">>, [node()]), halt() end. From b088d526369c0cae8e325468e4af64fb738df0c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Backstr=C3=B6m?= <lukas@erlang.org> Date: Wed, 18 Sep 2024 09:12:31 +0200 Subject: [PATCH 5/7] erts: Fix isatty on windows --- erts/emulator/nifs/common/prim_tty_nif.c | 57 ++++++++++++++++++------ lib/stdlib/test/io_proto_SUITE.erl | 38 +++++++++++++--- 2 files changed, 75 insertions(+), 20 deletions(-) diff --git a/erts/emulator/nifs/common/prim_tty_nif.c b/erts/emulator/nifs/common/prim_tty_nif.c index cc299bd337ae..b3a3b8b0fb27 100644 --- a/erts/emulator/nifs/common/prim_tty_nif.c +++ b/erts/emulator/nifs/common/prim_tty_nif.c @@ -234,18 +234,48 @@ static int tty_get_fd(ErlNifEnv *env, ERL_NIF_TERM atom, int *fd) { return 1; } -static ERL_NIF_TERM isatty_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { +#ifdef __WIN32__ +static HANDLE tty_get_handle(ErlNifEnv *env, ERL_NIF_TERM atom) { + HANDLE handle = INVALID_HANDLE_VALUE; int fd; + if (tty_get_fd(env, atom, &fd)) { + + switch (fd) { + case 0: handle = GetStdHandle(STD_INPUT_HANDLE); break; + case 1: handle = GetStdHandle(STD_OUTPUT_HANDLE); break; + case 2: handle = GetStdHandle(STD_ERROR_HANDLE); break; + } + } + return handle; +} +#endif +static ERL_NIF_TERM isatty_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { +#ifdef __WIN32__ + HANDLE handle = tty_get_handle(env, argv[0]); + + if (handle == INVALID_HANDLE_VALUE) + return atom_ebadf; + + switch (GetFileType(handle)) { + case FILE_TYPE_CHAR: return atom_true; + case FILE_TYPE_PIPE: + case FILE_TYPE_DISK: return atom_false; + default: return atom_ebadf; + } +#else + int fd; if (tty_get_fd(env, argv[0], &fd)) { if (isatty(fd)) { return atom_true; } else if (errno == EINVAL || errno == ENOTTY) { return atom_false; - } else { + } + else { return atom_ebadf; } } +#endif return enif_make_badarg(env); } @@ -643,22 +673,21 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar /* Poll if stdin/stdout/stderr are still open. */ static ERL_NIF_TERM tty_is_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { TTYResource *tty; +#ifdef __WIN32__ + HANDLE handle; +#else int fd; +#endif if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); - if (tty_get_fd(env, argv[1], &fd)) { +#ifdef __WIN32__ -#ifdef WIN32 - HANDLE handle; - DWORD bytesAvailable = 0; + handle = tty_get_handle(env, argv[1]); - switch (fd) { - case 0: handle = GetStdHandle(STD_INPUT_HANDLE); break; - case 1: handle = GetStdHandle(STD_OUTPUT_HANDLE); break; - case 2: handle = GetStdHandle(STD_ERROR_HANDLE); break; - } + if (handle != INVALID_HANDLE_VALUE) { + DWORD bytesAvailable = 0; switch (GetFileType(handle)) { case FILE_TYPE_CHAR: { @@ -688,9 +717,9 @@ static ERL_NIF_TERM tty_is_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg return atom_true; } } - + } #else - + if (tty_get_fd(env, argv[1], &fd)) { struct pollfd fds[1]; int ret; @@ -706,8 +735,8 @@ static ERL_NIF_TERM tty_is_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg } else if (ret == 1 && fds[0].revents & POLLHUP) { return atom_false; } -#endif } +#endif return enif_make_badarg(env); } diff --git a/lib/stdlib/test/io_proto_SUITE.erl b/lib/stdlib/test/io_proto_SUITE.erl index 7c4b7d867ba5..a838f082ec41 100644 --- a/lib/stdlib/test/io_proto_SUITE.erl +++ b/lib/stdlib/test/io_proto_SUITE.erl @@ -316,19 +316,45 @@ setopts_getopts(Config) when is_list(Config) -> {expect, "true"} ],[],"",["-oldshell"]), - %% Test that terminal options when used in non-terminal - %% are returned as they should + %% Test that terminal options when used in non-terminal are returned as they should + %% both when run as an os:cmd and when run directly as a port. Erl = ct:get_progname(), - Str = os:cmd(Erl ++ " -noshell -eval \"io:format(~s'~p.',[io:getopts()])\" -s init stop"), + CmdStr = os:cmd(Erl ++ " -noshell -eval \"io:format(~s'~p.',[io:getopts()])\" -s init stop"), maybe - {ok, T, _} ?= erl_scan:string(Str), + {ok, T, _} ?= erl_scan:string(CmdStr), {ok, Opts} ?= erl_parse:parse_term(T), ?assertEqual(false, proplists:get_value(terminal,Opts)), - ?assertEqual(false, proplists:get_value(stdin,Opts)), + case os:type() of + {win32, nt} -> + %% On Windows stdin will be a tty + ?assertEqual(true, proplists:get_value(stdin,Opts)); + _ -> + ?assertEqual(false, proplists:get_value(stdin,Opts)) + end, ?assertEqual(false, proplists:get_value(stdout,Opts)), ?assertEqual(false, proplists:get_value(stderr,Opts)) else - _ -> ct:fail({failed_to_parse, Str}) + _ -> ct:fail({failed_to_parse, CmdStr}) + end, + + Port = erlang:open_port({spawn, Erl ++ " -noshell -eval \"io:format(~s'~p.',[io:getopts()])\" -s init stop"}, + [exit_status]), + PortStr = (fun F() -> + receive + {Port,{data,D}} -> D ++ F(); + {Port,{exit_status,0}} -> [] + end + end)(), + + maybe + {ok, PortT, _} ?= erl_scan:string(PortStr), + {ok, PortOpts} ?= erl_parse:parse_term(PortT), + ?assertEqual(false, proplists:get_value(terminal,PortOpts)), + ?assertEqual(false, proplists:get_value(stdin,PortOpts)), + ?assertEqual(false, proplists:get_value(stdout,PortOpts)), + ?assertEqual(proplists:get_value(stderr, io:getopts()), proplists:get_value(stderr,PortOpts)) + else + _ -> ct:fail({failed_to_parse, PortStr}) end, ok. From 42aa7609728e2711ce0a2a1d3356e4df3912f0e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Backstr=C3=B6m?= <lukas@erlang.org> Date: Tue, 29 Oct 2024 10:30:40 +0100 Subject: [PATCH 6/7] kernel: Print token that could not be parsed in tty test --- lib/kernel/test/interactive_shell_SUITE.erl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/kernel/test/interactive_shell_SUITE.erl b/lib/kernel/test/interactive_shell_SUITE.erl index 55bf25e347c3..04832cb6ebbf 100644 --- a/lib/kernel/test/interactive_shell_SUITE.erl +++ b/lib/kernel/test/interactive_shell_SUITE.erl @@ -297,10 +297,15 @@ end_per_testcase(_Case, Config) -> -endif. string_to_term(Str) -> - {ok,Tokens,_EndLine} = erl_scan:string(Str ++ "."), - {ok,AbsForm} = erl_parse:parse_exprs(Tokens), - {value,Value,_Bs} = erl_eval:exprs(AbsForm, erl_eval:new_bindings()), - Value. + try + {ok,Tokens,_EndLine} = erl_scan:string(Str ++ "."), + {ok,AbsForm} = erl_parse:parse_exprs(Tokens), + {value,Value,_Bs} = erl_eval:exprs(AbsForm, erl_eval:new_bindings()), + Value + catch E:R:ST -> + ct:log("Could not parse: ~ts~n", [Str]), + erlang:raise(E,R,ST) + end. run_unbuffer_escript(Rows, Columns, EScript, NoTermStdIn, NoTermStdOut) -> DataDir = filename:join(filename:dirname(code:which(?MODULE)), "interactive_shell_SUITE_data"), From bd2ba031d06bd19c0aab4868b1ed2edc816d74b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Backstr=C3=B6m?= <lukas@erlang.org> Date: Wed, 30 Oct 2024 12:34:03 +0100 Subject: [PATCH 7/7] kernel: Use send_tty to send data to stdin in tests --- lib/kernel/test/interactive_shell_SUITE.erl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/kernel/test/interactive_shell_SUITE.erl b/lib/kernel/test/interactive_shell_SUITE.erl index 04832cb6ebbf..7bb085043c1d 100644 --- a/lib/kernel/test/interactive_shell_SUITE.erl +++ b/lib/kernel/test/interactive_shell_SUITE.erl @@ -534,9 +534,9 @@ shell_format(Config) -> send_tty(Term1, "Down"), tmux(["resize-window -t ",tty_name(Term1)," -x ",200]), timer:sleep(1000), - send_stdin(Term1, "shell:format_shell_func(\"emacs -batch \${file} -l \"\n"), - send_stdin(Term1, EmacsFormat), - send_stdin(Term1, "\" -f emacs-format-function\").\n"), + send_tty(Term1, "shell:format_shell_func(\"emacs -batch \${file} -l \"\n"), + send_tty(Term1, EmacsFormat), + send_tty(Term1, "\" -f emacs-format-function\").\n"), check_content(Term1, "{shell,erl_pp_format_func}"), send_tty(Term1, "Up"), send_tty(Term1, "Up"), @@ -547,7 +547,7 @@ shell_format(Config) -> check_content(Term1, "fun\\(X\\) ->\\s*.. X\\s*.. end."), send_tty(Term1, "Down"), check_content(Term1, ">$"), - send_stdin(Term1, "shell:format_shell_func({bad,format}).\n"), + send_tty(Term1, "shell:format_shell_func({bad,format}).\n"), send_tty(Term1, "Up"), send_tty(Term1, "Up"), send_tty(Term1, "\n"),