Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:19
erlang
3011-kernel-Introduce-file-delete-2-supporting-...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 3011-kernel-Introduce-file-delete-2-supporting-raw-option.patch of Package erlang
From 33963ee94429de168fc62b485799450578ade84a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20de=20Bretagne?= <jerome.debretagne@gmail.com> Date: Sun, 17 May 2020 12:19:21 +0200 Subject: [PATCH] kernel: Introduce file:delete/2 supporting 'raw' option Some functions in the file module can pass a 'raw' option to run locally with direct file access, bypassing the registered file_server. There was no such possibility when deleting files so introduce a new file:delete/2 function supporting the same 'raw' option. Add its documentation and add a test in file_SUITE. https://bugs.erlang.org/browse/ERL-1244 --- lib/kernel/doc/src/file.xml | 6 ++++++ lib/kernel/src/file.erl | 27 ++++++++++++++++++++++++--- lib/kernel/test/file_SUITE.erl | 15 +++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/lib/kernel/doc/src/file.xml b/lib/kernel/doc/src/file.xml index 77d01925ec..9d962dc5c7 100644 --- a/lib/kernel/doc/src/file.xml +++ b/lib/kernel/doc/src/file.xml @@ -379,10 +379,16 @@ f.txt: {person, "kalle", 25}. </func> <func> <name name="delete" arity="1"/> + <name name="delete" arity="2"/> <fsummary>Delete a file.</fsummary> + <type name="delete_option"/> <desc> <p>Tries to delete file <c><anno>Filename</anno></c>. Returns <c>ok</c> if successful.</p> + <p>If the option <c>raw</c> is set, the file server is not called. + This can be useful in particular during the early boot stage when + the file server is not yet registered, to still be able to delete + local files.</p> <p>Typical error reasons:</p> <taglist> <tag><c>enoent</c></tag> diff --git a/lib/kernel/src/file.erl b/lib/kernel/src/file.erl index 8abfb3ef35..860b8ecc84 100644 --- a/lib/kernel/src/file.erl +++ b/lib/kernel/src/file.erl @@ -27,7 +27,7 @@ -export([format_error/1]). %% File system and metadata. --export([get_cwd/0, get_cwd/1, set_cwd/1, delete/1, rename/2, +-export([get_cwd/0, get_cwd/1, set_cwd/1, delete/1, delete/2, rename/2, make_dir/1, del_dir/1, list_dir/1, list_dir_all/1, read_file_info/1, read_file_info/2, write_file_info/2, write_file_info/3, @@ -112,10 +112,11 @@ -type date_time() :: calendar:datetime(). -type posix_file_advise() :: 'normal' | 'sequential' | 'random' | 'no_reuse' | 'will_need' | 'dont_need'. +-type delete_option() :: 'raw'. -type sendfile_option() :: {chunk_size, non_neg_integer()} | {use_threads, boolean()}. --type file_info_option() :: {'time', 'local'} | {'time', 'universal'} - | {'time', 'posix'} | raw. +-type file_info_option() :: {'time', 'local'} | {'time', 'universal'} + | {'time', 'posix'} | 'raw'. %%% BIFs -export([native_name_encoding/0]). @@ -206,6 +207,26 @@ set_cwd(Dirname) -> delete(Name) -> check_and_call(delete, [file_name(Name)]). +-spec delete(Filename, Opts) -> ok | {error, Reason} when + Filename :: name_all(), + Opts :: [delete_option()], + Reason :: posix() | badarg. + +delete(Name, Opts) when is_list(Opts) -> + Args = [file_name(Name), Opts], + case check_args(Args) of + ok -> + case lists:member(raw, Opts) of + true -> + [FileName|_] = Args, + ?PRIM_FILE:delete(FileName); + false -> + call(delete, Args) + end; + Error -> + Error + end. + -spec rename(Source, Destination) -> ok | {error, Reason} when Source :: name_all(), Destination :: name_all(), diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index 52ef711008..eafd4f38dd 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -2313,6 +2313,21 @@ delete(Config) when is_list(Config) -> {error, _} = ?FILE_MODULE:open(Name, read), %% Try deleting a nonexistent file {error, enoent} = ?FILE_MODULE:delete(Name), + Name2 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_delete_2.fil"), + {ok, Fd3} = ?FILE_MODULE:open(Name2, write), + io:format(Fd3,"ok.\n",[]), + ok = ?FILE_MODULE:close(Fd3), + %% Check that the file is readable + {ok, Fd4} = ?FILE_MODULE:open(Name2, read), + ok = ?FILE_MODULE:close(Fd4), + %% Try deleting with the raw option + ok = ?FILE_MODULE:delete(Name2, [raw]), + %% Check that the file is not readable anymore + {error, _} = ?FILE_MODULE:open(Name2, read), + %% Try deleting a nonexistent file with the raw option + {error, enoent} = ?FILE_MODULE:delete(Name2, [raw]), [] = flush(), ok. -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor