void VfsCatalog::removeDir(const std::string& path) throw (DmException)
{
- wrapCall(rmdir(path.c_str()));
+ char *cwd = NULL, *rmd = NULL;
+
+ // check if we are not removing current working directory
+ cwd = get_current_dir_name();
+ try {
+ changeDir(path);
+ rmd = get_current_dir_name();
+ if (strcmp(cwd, rmd) == 0) {
+ vfsThrow(EINVAL, "removing current working directory");
+ }
+ ::chdir(cwd);
+ // OK, we can try to remove
+ wrapCall(rmdir(path.c_str()));
+ } catch (...) {
+ if (cwd) ::chdir(cwd);
+ free(cwd);
+ free(rmd);
+ throw;
+ }
+
+ free(cwd);
+ free(rmd);
}