From dc517a87103f66262f6933bfb6970ec8ca0a498d Mon Sep 17 00:00:00 2001 From: Mikael Pettersson Date: Wed, 6 Sep 2023 20:28:31 +0200 Subject: [PATCH] pdp10_stdio:handle_fopen/2: handling writes after seeks may require reads, so try to get read access even if the user did not ask for it --- erlang/apps/lib/src/pdp10_stdio.erl | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/erlang/apps/lib/src/pdp10_stdio.erl b/erlang/apps/lib/src/pdp10_stdio.erl index 6c9fac4..b0fbe81 100644 --- a/erlang/apps/lib/src/pdp10_stdio.erl +++ b/erlang/apps/lib/src/pdp10_stdio.erl @@ -243,11 +243,21 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}. handle_fopen(Path, Modes) -> case iodir(Modes) of - {ok, {Read, Write}} -> - case file_open(Path, fopen_modes(Modes)) of - {ok, IoDev} -> {ok, {IoDev, Read, Write}}; - {error, _Reason} = Error -> Error + {ok, {Read = false, Write = true}} -> + %% A write after a seek to a non octet-aligned nonet needs to reload the + %% shiftreg, which requires a read. Therefore if the user did not request + %% read access try to get it anyway. + case file_open(Path, fopen_modes([read | Modes])) of + {ok, IoDev} -> {ok, {IoDev, _Read = true, Write}}; + {error, _Reason} -> handle_fopen(Path, Modes, Read, Write) end; + {ok, {Read, Write}} -> handle_fopen(Path, Modes, Read, Write); + {error, _Reason} = Error -> Error + end. + +handle_fopen(Path, Modes, Read, Write) -> + case file_open(Path, fopen_modes(Modes)) of + {ok, IoDev} -> {ok, {IoDev, Read, Write}}; {error, _Reason} = Error -> Error end.