From 7750a399cced5cd50625ee19a91f7e3f468e3934 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Fri, 18 Apr 2014 22:58:04 +0200 Subject: [PATCH] libc: Add 'rmdir' to plugin interface --- libports/include/libc-plugin/plugin.h | 2 ++ libports/include/libc-plugin/plugin_registry.h | 1 + libports/src/lib/libc/file_operations.cc | 12 ++++++++++++ libports/src/lib/libc/plugin.cc | 7 +++++++ libports/src/lib/libc/plugin_registry.cc | 2 ++ 5 files changed, 24 insertions(+) diff --git a/libports/include/libc-plugin/plugin.h b/libports/include/libc-plugin/plugin.h index cc8f81069..100568590 100644 --- a/libports/include/libc-plugin/plugin.h +++ b/libports/include/libc-plugin/plugin.h @@ -55,6 +55,7 @@ namespace Libc { virtual bool supports_pipe(); virtual bool supports_readlink(const char *path, char *buf, size_t bufsiz); virtual bool supports_rename(const char *oldpath, const char *newpath); + virtual bool supports_rmdir(const char *path); virtual bool supports_select(int nfds, fd_set *readfds, fd_set *writefds, @@ -116,6 +117,7 @@ namespace Libc { struct sockaddr *src_addr, socklen_t *addrlen); virtual ssize_t recvmsg(File_descriptor *, struct msghdr *msg, int flags); virtual int rename(const char *oldpath, const char *newpath); + virtual int rmdir(const char *pathname); virtual int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); virtual ssize_t send(File_descriptor *, const void *buf, ::size_t len, int flags); diff --git a/libports/include/libc-plugin/plugin_registry.h b/libports/include/libc-plugin/plugin_registry.h index 884cfe581..909463f6c 100644 --- a/libports/include/libc-plugin/plugin_registry.h +++ b/libports/include/libc-plugin/plugin_registry.h @@ -36,6 +36,7 @@ namespace Libc { Plugin *get_plugin_for_pipe(); Plugin *get_plugin_for_readlink(const char *path, char *buf, size_t bufsiz); Plugin *get_plugin_for_rename(const char *oldpath, const char *newpath); + Plugin *get_plugin_for_rmdir(const char *path); Plugin *get_plugin_for_socket(int domain, int type, int protocol); Plugin *get_plugin_for_stat(const char *path, struct stat *); Plugin *get_plugin_for_symlink(const char *oldpath, const char *newpath); diff --git a/libports/src/lib/libc/file_operations.cc b/libports/src/lib/libc/file_operations.cc index e4383c5cb..46c9baf9c 100644 --- a/libports/src/lib/libc/file_operations.cc +++ b/libports/src/lib/libc/file_operations.cc @@ -731,6 +731,18 @@ extern "C" int rename(const char *oldpath, const char *newpath) } +extern "C" int rmdir(const char *path) +{ + try { + Absolute_path resolved_path; + resolve_symlinks_except_last_element(path, resolved_path); + FNAME_FUNC_WRAPPER(rmdir, resolved_path.base()); + } catch(Symlink_resolve_error) { + return -1; + } +} + + extern "C" ssize_t send(int libc_fd, const void *buf, ::size_t len, int flags) { FD_FUNC_WRAPPER(send, libc_fd, buf, len, flags); } diff --git a/libports/src/lib/libc/plugin.cc b/libports/src/lib/libc/plugin.cc index 311525d98..3d8ce9368 100644 --- a/libports/src/lib/libc/plugin.cc +++ b/libports/src/lib/libc/plugin.cc @@ -93,6 +93,12 @@ bool Plugin::supports_rename(const char *, const char *) } +bool Plugin::supports_rmdir(const char*) +{ + return false; +} + + bool Plugin::supports_select(int, fd_set *, fd_set *, fd_set *, struct timeval *) { @@ -193,6 +199,7 @@ DUMMY(int, -1, munmap, (void *, ::size_t)); DUMMY(int, -1, pipe, (File_descriptor*[2])); DUMMY(ssize_t, -1, readlink, (const char *, char *, size_t)); DUMMY(int, -1, rename, (const char *, const char *)); +DUMMY(int, -1, rmdir, (const char*)); DUMMY(int, -1, select, (int, fd_set *, fd_set *, fd_set *, struct timeval *)); DUMMY(int, -1, stat, (const char*, struct stat*)); DUMMY(int, -1, symlink, (const char*, const char*)); diff --git a/libports/src/lib/libc/plugin_registry.cc b/libports/src/lib/libc/plugin_registry.cc index 1f1bd3ae8..295d1ca2d 100644 --- a/libports/src/lib/libc/plugin_registry.cc +++ b/libports/src/lib/libc/plugin_registry.cc @@ -71,6 +71,8 @@ Plugin *Plugin_registry::get_plugin_for_readlink(const char *path, char *buf, si Plugin *Plugin_registry::get_plugin_for_rename(const char *oldpath, const char *newpath) { GET_PLUGIN_FOR(rename, oldpath, newpath) } +Plugin *Plugin_registry::get_plugin_for_rmdir(const char *path) { + GET_PLUGIN_FOR(rmdir, path) } Plugin *Plugin_registry::get_plugin_for_socket(int domain, int type, int protocol) { GET_PLUGIN_FOR(socket, domain, type, protocol) }