From 808fcf4daeb8fa7eeef276c72e34c441c09e3214 Mon Sep 17 00:00:00 2001 From: Ivan Furs Date: Tue, 7 Feb 2017 14:50:32 -0800 Subject: [PATCH] eina_file: add eina_file_unlink Test Plan: split D4423 - unlink Reviewers: raster, vtorri, an.kroitor, jpeg, reutskiy.v.v, NikaWhite, cedric Reviewed By: cedric Subscribers: artem.popov, cedric, vtorri, jpeg Tags: #windows, #efl Differential Revision: https://phab.enlightenment.org/D4485 Signed-off-by: Cedric BAIL --- src/bindings/luajit/eina/file.lua | 6 +++++ src/lib/eina/eina_file.c | 10 ++++++++ src/lib/eina/eina_file_win32.c | 24 ++++++++++++++++++ src/tests/eina/eina_test_file.c | 41 +++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) diff --git a/src/bindings/luajit/eina/file.lua b/src/bindings/luajit/eina/file.lua index d776047159..675b810a17 100644 --- a/src/bindings/luajit/eina/file.lua +++ b/src/bindings/luajit/eina/file.lua @@ -97,6 +97,7 @@ ffi.cdef [[ Eina_File_Copy_Flags flags, Eina_File_Copy_Progress cb, const void *cb_data); Eina_File *eina_file_open(const char *name, Eina_Bool shared); + Eina_Bool eina_file_unlink(const char *pathname); Eina_File *eina_file_virtualize(const char *virtual_name, const void *data, unsigned long long length, Eina_Bool copy); Eina_Bool eina_file_virtual(Eina_File *file); @@ -315,6 +316,11 @@ M.File = ffi.metatype("Eina_File", { open = function(name, shared) return eina.eina_file_open(name, shared) end, + + unlink = function(self) + return eina.eina_file_unlink(pathname) + end, + virtualize = function(vname, data, length, copy) return eina.eina_file_virtualize(vname, data, length, copy or false) diff --git a/src/lib/eina/eina_file.c b/src/lib/eina/eina_file.c index cb29f287f5..c378ea57fe 100644 --- a/src/lib/eina/eina_file.c +++ b/src/lib/eina/eina_file.c @@ -898,6 +898,16 @@ eina_file_refresh(Eina_File *file) return r; } +EAPI Eina_Bool +eina_file_unlink(const char *pathname) +{ + if ( unlink(pathname) < 0) + { + return EINA_FALSE; + } + return EINA_TRUE; +} + EAPI void * eina_file_map_all(Eina_File *file, Eina_File_Populate rule) { diff --git a/src/lib/eina/eina_file_win32.c b/src/lib/eina/eina_file_win32.c index 54b5d900db..fe83c6710c 100644 --- a/src/lib/eina/eina_file_win32.c +++ b/src/lib/eina/eina_file_win32.c @@ -821,6 +821,30 @@ eina_file_open(const char *path, Eina_Bool shared) return NULL; } +EAPI Eina_Bool +eina_file_unlink(const char *pathname) +{ + char *unlink_path = eina_file_path_sanitize(pathname); + Eina_File *file = eina_hash_find(_eina_file_cache, unlink_path); + + if (file) + { + if (file->handle != INVALID_HANDLE_VALUE) + { + CloseHandle(file->handle); + file->handle = INVALID_HANDLE_VALUE; + } + } + + if ( unlink(unlink_path) < 0) + { + return EINA_FALSE; + } + + return EINA_TRUE; +} + + EAPI Eina_Iterator *eina_file_xattr_get(Eina_File *file EINA_UNUSED) { return NULL; diff --git a/src/tests/eina/eina_test_file.c b/src/tests/eina/eina_test_file.c index c82f60031b..e3c60b6a6e 100644 --- a/src/tests/eina/eina_test_file.c +++ b/src/tests/eina/eina_test_file.c @@ -824,6 +824,45 @@ START_TEST(eina_test_file_mktemp) } END_TEST +int create_file_not_empty(const char *file_name, Eina_Tmpstr **test_file_path, Eina_Bool close_file) +{ + const char *data = "abcdefghijklmnopqrstuvwxyz"; + int data_size = strlen(data); + int wr_size; + int fd = eina_file_mkstemp(file_name, test_file_path); + fail_if(fd <= 0); + wr_size = write(fd, data, data_size); + if(close_file == EINA_TRUE) + { + close(fd); + fd = 0; + } + fail_if(wr_size != data_size); + return fd; +} + +START_TEST(eina_test_file_unlink) +{ + int fd; + Eina_File *file; + Eina_Tmpstr *test_file_path; + const char *tmpfile = "eina_file_test_XXXXXX"; + + eina_init(); + + /*If file was not opened as 'eina'*/ + fd = create_file_not_empty(tmpfile, &test_file_path, EINA_TRUE); + fail_if( !eina_file_unlink(test_file_path) ); + + /*If file was opened as 'eina'*/ + fd = create_file_not_empty(tmpfile, &test_file_path, EINA_TRUE); + fail_if( !eina_file_open(test_file_path, EINA_FALSE) ); + fail_if( !eina_file_unlink(test_file_path) ); + + eina_shutdown(); +} +END_TEST + void eina_test_file(TCase *tc) { @@ -840,4 +879,6 @@ eina_test_file(TCase *tc) tcase_add_test(tc, eina_test_file_copy); tcase_add_test(tc, eina_test_file_statat); tcase_add_test(tc, eina_test_file_mktemp); + tcase_add_test(tc, eina_test_file_unlink); + }