summaryrefslogtreecommitdiff
path: root/priv
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2016-01-06 13:37:25 -0500
committerFred Hebert <mononcqc@ferd.ca>2016-01-06 13:37:25 -0500
commit814d18a31fdd58bb796c068e7c927e35fd9322f6 (patch)
tree7dda2e2f16ca822aba5a931fc9494bb20d2ee7b4 /priv
parent72855b223bce28506282062670080a1919e814d6 (diff)
Support old-style shell for rebar3 shell
This is quite the hack. This requires to detect the current shell running; if it's the new shell, business as usual. However, if it's the old shell, we have to find a way to take over it and drive IO. This requires a few steps because: - the old shell does not let you be supervised intelligently (it uses supervisor_bridge, so killing the child is not a supported operation from the supervisor) - the old shell ignores all trappable exit signals except those coming from the Port in charge of stdio ({fd, 0, 1}) - the old shell shuts down on all exit signals from the stdio Port except for badsig, and replicates the shutdown reason otherwise - An escript does not tolerate the `user` process dying (old shell) for any non-normal reason without also taking the whole escript down - Booting in an escript has an implicit 'noshell' argument interpreted by the old shell as a way to boot the stdio Port with only stdout taken care of Because of all these points, we have to kill the old `user` process by sending it a message pretending to be the Stdio port dying of reason `normal`, which lets it die without triggering the ire of its supervision tree and keeping the escript alive. This, in turn, kills the old stdio port since its parent (user.erl) has died. Then we have to boot our copy of user.erl (rebar_user.erl) which conveniently ignores the possibility of running the stdio port on stdout only -- always using stdin *and* stdout, giving us a bona fide old-style shell. A known issue introduced is that running r3:do(ct) seems to then kill the shell, and r3:do(dialyzer) appears to have an odd failure, but otherwise most other commands appear to work fine.
Diffstat (limited to 'priv')
0 files changed, 0 insertions, 0 deletions