summaryrefslogtreecommitdiff
path: root/src/r3_hex_filename.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/r3_hex_filename.erl')
-rw-r--r--src/r3_hex_filename.erl60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/r3_hex_filename.erl b/src/r3_hex_filename.erl
new file mode 100644
index 0000000..f04c72f
--- /dev/null
+++ b/src/r3_hex_filename.erl
@@ -0,0 +1,60 @@
+%% Vendored from hex_core v0.5.0, do not edit manually
+
+% @private
+% Excerpt from https://github.com/erlang/otp/blob/OTP-20.0.1/lib/stdlib/src/filename.erl#L761-L788
+% with modifications for changing local function calls to remote function calls
+% to the `filename` module, for the functions `pathtype/1`, `split/1`, and `join/1`
+%
+% safe_relative_path/1 was not present in earlier OTP releases.
+
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2017. 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%
+%%
+
+-module(r3_hex_filename).
+-export([safe_relative_path/1]).
+
+safe_relative_path(Path) ->
+ case filename:pathtype(Path) of
+ relative ->
+ Cs0 = filename:split(Path),
+ safe_relative_path_1(Cs0, []);
+ _ ->
+ unsafe
+ end.
+
+safe_relative_path_1(["."|T], Acc) ->
+ safe_relative_path_1(T, Acc);
+safe_relative_path_1([<<".">>|T], Acc) ->
+ safe_relative_path_1(T, Acc);
+safe_relative_path_1([".."|T], Acc) ->
+ climb(T, Acc);
+safe_relative_path_1([<<"..">>|T], Acc) ->
+ climb(T, Acc);
+safe_relative_path_1([H|T], Acc) ->
+ safe_relative_path_1(T, [H|Acc]);
+safe_relative_path_1([], []) ->
+ [];
+safe_relative_path_1([], Acc) ->
+ filename:join(lists:reverse(Acc)).
+
+climb(_, []) ->
+ unsafe;
+climb(T, [_|Acc]) ->
+ safe_relative_path_1(T, Acc).