pdp10_stdio: be more careful not to create duplicate Modes for file:open/2

This commit is contained in:
Mikael Pettersson
2020-03-07 13:55:17 +01:00
parent 4b627eaf78
commit aaca744f1c

View File

@@ -231,15 +231,27 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}.
handle_fopen(Path, Modes) ->
case iodir(Modes) of
{ok, {Read, Write}} ->
%% prevent crashing file:open/2 due to duplicate modes
HardModes = [raw, delayed_write, read_ahead],
case file_open(Path, HardModes ++ (Modes -- HardModes)) of
case file_open(Path, fopen_modes(Modes)) of
{ok, IoDev} -> {ok, {IoDev, Read, Write}};
{error, _Reason} = Error -> Error
end;
{error, _Reason} = Error -> Error
end.
%% add [raw, delayed_write, read_ahead] but only if they are absent
fopen_modes(Modes0) ->
lists:foldl(fun({IsPresent, Mode}, Modes) ->
case IsPresent(Mode, Modes) of
true -> Modes;
false -> [Mode | Modes]
end
end,
Modes0,
[ {fun lists:member/2, raw}
, {fun proplists:is_defined/2, delayed_write}
, {fun proplists:is_defined/2, read_ahead}
]).
iodir(Modes) -> iodir(Modes, false, false).
iodir([], false, false) -> mkerror(no_io_direction);