From 2e04cc2d87faf451cb8cc8df6e656bc2d7eb5063 Mon Sep 17 00:00:00 2001 From: Sebastian Sumpf Date: Tue, 21 Jan 2014 13:40:49 +0100 Subject: [PATCH] libc_fs: Implemented and test 'unlink' call Issue #1048 --- libports/src/lib/libc_fs/plugin.cc | 23 ++++++++++++++++++++++- libports/src/test/libc_ffat/main.cc | 11 +++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/libports/src/lib/libc_fs/plugin.cc b/libports/src/lib/libc_fs/plugin.cc index 0efaf9f337..ec8ef06ad0 100644 --- a/libports/src/lib/libc_fs/plugin.cc +++ b/libports/src/lib/libc_fs/plugin.cc @@ -744,7 +744,28 @@ class Plugin : public Libc::Plugin int unlink(const char *path) { - return -1; + Canonical_path dir_path(path); + dir_path.strip_last_element(); + + Canonical_path basename(path); + basename.keep_only_last_element(); + + try { + /* + * Open directory that contains the file to be opened/created + */ + File_system::Dir_handle const dir_handle = + file_system()->dir(dir_path.base(), false); + + Node_handle_guard guard(dir_handle); + + file_system()->unlink(dir_handle, basename.base() + 1); + } catch (...) { + PERR("unlink(%s) failed", path); + return -1; + } + + return 0; } ssize_t write(Libc::File_descriptor *fd, const void *buf, ::size_t count) diff --git a/libports/src/test/libc_ffat/main.cc b/libports/src/test/libc_ffat/main.cc index 615f7747e2..bcdf460d6b 100644 --- a/libports/src/test/libc_ffat/main.cc +++ b/libports/src/test/libc_ffat/main.cc @@ -194,6 +194,13 @@ int main(int argc, char *argv[]) CALL_AND_CHECK(ret, close(fd), ret == 0, ""); CALL_AND_CHECK(ret, stat(file_name, &stat_buf), ret == 0, "file_name=%s", file_name); + /* test 'unlink()' */ + CALL_AND_CHECK(ret, unlink(file_name), (ret == 0), "file_name=%s", file_name); + CALL_AND_CHECK(ret, stat(file_name, &stat_buf), (ret == -1), "file_name=%s", file_name); + CALL_AND_CHECK(ret, stat(dir_name2, &stat_buf), (ret == 0), "dir_name=%s", dir_name2); + CALL_AND_CHECK(ret, unlink(dir_name2), (ret == 0), "dir_name=%s", dir_name2); + CALL_AND_CHECK(ret, stat(dir_name2, &stat_buf), (ret == -1), "dir_name=%s", dir_name2); + /* test symbolic links */ if ((symlink("/", "/symlinks_supported") == 0) || (errno != ENOSYS)) { CALL_AND_CHECK(ret, mkdir("/a", 0777), ((ret == 0) || (errno == EEXIST)), "dir_name=%s", "/a"); @@ -216,6 +223,10 @@ int main(int argc, char *argv[]) } else { printf("file content is correct\n"); } + + /* test unlink for symbolic links */ + CALL_AND_CHECK(ret, unlink("/c/d"), (ret == 0), "symlink=%s", "/c/d"); + CALL_AND_CHECK(ret, stat("/c/d", &stat_buf), (ret == -1), "symlink=%s", "/c/d"); } if (i < (iterations - 1))