On 08/09/2016 01:53 PM, Petr Cech wrote:
On 08/05/2016 01:48 PM, Petr Cech wrote:
On 07/13/2016 01:47 PM, Pavel Březina wrote:
0001-utils-add-remove_subtree.patch
From 0aa39a46b707212e6487b6b537238e31bf7da1b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]>
Date: Wed, 13 Jul 2016 12:17:58 +0200
Subject: [PATCH 1/2] utils: add remove_subtree
Remove all entries in a directory but will
not remove the directory itself.
^--- [1]
...
+ if (!subtree) {
^---
Pavel, please, would you like to add the comment in meaning of [1] here.
I needed spent time to understand that the code do what is expected.
+ ret = unlinkat(parent_fd, dir_name, AT_REMOVEDIR);
+ if (ret == -1) {
+ ret = errno;
+ }
}
0002-sssctl-use-internal-API-to-remove-files.patch
From 6413cb17138d8b24d579109454ae5dd7049b552a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]>
Date: Wed, 13 Jul 2016 13:29:54 +0200
Subject: [PATCH 2/2] sssctl: use internal API to remove files
-----
CI passed:
http://sssd-ci.duckdns.org/logs/job/50/90/summary.html
ACK (and please add the comment)
bump
New patch is attached. I added a comment a renamed subtree to keep_root_dir.
From f94c68ef867327c42d873c508301bfcdc4c66801 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]>
Date: Wed, 13 Jul 2016 12:17:58 +0200
Subject: [PATCH 1/2] utils: add remove_subtree
Remove all entries in a directory but will
not remove the directory itself.
---
src/tests/files-tests.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++
src/tools/files.c | 35 +++++++++++++++++++++++++-------
src/tools/tools_util.h | 1 +
3 files changed, 82 insertions(+), 7 deletions(-)
diff --git a/src/tests/files-tests.c b/src/tests/files-tests.c
index 596069e2858e07953b3d48f6b8015ce66e2dd423..e96a60af1817b5f7a2e99d8b09ebc91c1a52667b 100644
--- a/src/tests/files-tests.c
+++ b/src/tests/files-tests.c
@@ -153,6 +153,58 @@ START_TEST(test_remove_tree)
}
END_TEST
+START_TEST(test_remove_subtree)
+{
+ int ret;
+ char origpath[PATH_MAX+1];
+
+ errno = 0;
+ fail_unless(getcwd(origpath, PATH_MAX) == origpath, "Cannot getcwd\n");
+ fail_unless(errno == 0, "Cannot getcwd\n");
+
+ DEBUG(SSSDBG_FUNC_DATA, "About to delete %s\n", dir_path);
+
+ /* create a file */
+ ret = chdir(dir_path);
+ fail_if(ret == -1, "Cannot chdir1\n");
+
+ ret = create_simple_file("bar", "bar");
+ fail_if(ret == -1, "Cannot create file1\n");
+
+ /* create a subdir and file inside it */
+ ret = mkdir("subdir", 0700);
+ fail_if(ret == -1, "Cannot create subdir\n");
+
+ ret = chdir("subdir");
+ fail_if(ret == -1, "Cannot chdir\n");
+
+ ret = create_simple_file("foo", "foo");
+ fail_if(ret == -1, "Cannot create file\n");
+
+ /* create another subdir, empty this time */
+ ret = mkdir("subdir2", 0700);
+ fail_if(ret == -1, "Cannot create subdir\n");
+
+ ret = chdir(origpath);
+ fail_if(ret == -1, "Cannot chdir2\n");
+
+ /* go back */
+ ret = chdir(origpath);
+ fail_if(ret == -1, "Cannot chdir\n");
+
+ /* and finally wipe it out.. */
+ ret = remove_subtree(dir_path);
+ fail_unless(ret == EOK, "remove_subtree failed\n");
+
+ /* check if really gone */
+ ret = access(dir_path, F_OK);
+ fail_unless(ret == 0, "directory was deleted\n");
+
+ ret = rmdir(dir_path);
+ fail_unless(ret == 0, "unable to delete root directory\n");
+}
+END_TEST
+
START_TEST(test_simple_copy)
{
int ret;
@@ -337,6 +389,7 @@ static Suite *files_suite(void)
teardown_files_test);
tcase_add_test(tc_files, test_remove_tree);
+ tcase_add_test(tc_files, test_remove_subtree);
tcase_add_test(tc_files, test_simple_copy);
tcase_add_test(tc_files, test_copy_file);
tcase_add_test(tc_files, test_copy_symlink);
diff --git a/src/tools/files.c b/src/tools/files.c
index 8f1aa68beeb2676b56733f49550de170b404c789..9f4e7caa7257144702c417c39bc1643f0be8661a 100644
--- a/src/tools/files.c
+++ b/src/tools/files.c
@@ -137,7 +137,8 @@ static int sss_futime_set(int fd, const struct stat *statp)
static int remove_tree_with_ctx(TALLOC_CTX *mem_ctx,
int parent_fd,
const char *dir_name,
- dev_t parent_dev);
+ dev_t parent_dev,
+ bool keep_root_dir);
int remove_tree(const char *root)
{
@@ -149,7 +150,22 @@ int remove_tree(const char *root)
return ENOMEM;
}
- ret = remove_tree_with_ctx(tmp_ctx, AT_FDCWD, root, 0);
+ ret = remove_tree_with_ctx(tmp_ctx, AT_FDCWD, root, 0, false);
+ talloc_free(tmp_ctx);
+ return ret;
+}
+
+int remove_subtree(const char *root)
+{
+ TALLOC_CTX *tmp_ctx = NULL;
+ int ret;
+
+ tmp_ctx = talloc_new(NULL);
+ if (!tmp_ctx) {
+ return ENOMEM;
+ }
+
+ ret = remove_tree_with_ctx(tmp_ctx, AT_FDCWD, root, 0, true);
talloc_free(tmp_ctx);
return ret;
}
@@ -162,7 +178,8 @@ int remove_tree(const char *root)
static int remove_tree_with_ctx(TALLOC_CTX *mem_ctx,
int parent_fd,
const char *dir_name,
- dev_t parent_dev)
+ dev_t parent_dev,
+ bool keep_root_dir)
{
struct dirent *result;
struct stat statres;
@@ -213,7 +230,8 @@ static int remove_tree_with_ctx(TALLOC_CTX *mem_ctx,
goto fail;
}
- ret = remove_tree_with_ctx(mem_ctx, dir_fd, result->d_name, statres.st_dev);
+ ret = remove_tree_with_ctx(mem_ctx, dir_fd, result->d_name,
+ statres.st_dev, false);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE,
"Removing subdirectory failed: [%d][%s]\n",
@@ -239,9 +257,12 @@ static int remove_tree_with_ctx(TALLOC_CTX *mem_ctx,
goto fail;
}
- ret = unlinkat(parent_fd, dir_name, AT_REMOVEDIR);
- if (ret == -1) {
- ret = errno;
+ if (!keep_root_dir) {
+ /* Remove also root directory. */
+ ret = unlinkat(parent_fd, dir_name, AT_REMOVEDIR);
+ if (ret == -1) {
+ ret = errno;
+ }
}
ret = EOK;
diff --git a/src/tools/tools_util.h b/src/tools/tools_util.h
index f31e843deb7122ee52664229b75eeb92878abe54..389c7b5c4563118ccb7fdc9448a0879638a35a0b 100644
--- a/src/tools/tools_util.h
+++ b/src/tools/tools_util.h
@@ -113,6 +113,7 @@ errno_t sss_mc_refresh_grouplist(struct tools_ctx *tctx,
/* from files.c */
int remove_tree(const char *root);
+int remove_subtree(const char *root);
int copy_tree(const char *src_root, const char *dst_root,
mode_t mode_root, uid_t uid, gid_t gid);
--
2.1.0
From c58d2f6507dda79133813f215c9a4a5feec06d1b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]>
Date: Wed, 13 Jul 2016 13:29:54 +0200
Subject: [PATCH 2/2] sssctl: use internal API to remove files
---
src/tools/sssctl/sssctl_data.c | 6 ++----
src/tools/sssctl/sssctl_logs.c | 3 ++-
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/src/tools/sssctl/sssctl_data.c b/src/tools/sssctl/sssctl_data.c
index 72823ab254344bba6f7679882a733b6ef2250525..29c5e676056ce4bd4abf579e14963680731e10a9 100644
--- a/src/tools/sssctl/sssctl_data.c
+++ b/src/tools/sssctl/sssctl_data.c
@@ -26,9 +26,7 @@
#include "tools/common/sss_tools.h"
#include "tools/common/sss_process.h"
#include "tools/sssctl/sssctl.h"
-
-#define CACHE_FILE(db) " " DB_PATH "/" db
-#define CACHE_FILES CACHE_FILE("*.ldb") CACHE_FILE("ccache_*")
+#include "tools/tools_util.h"
#define SSS_BACKUP_DIR SSS_STATEDIR "/backup"
#define SSS_BACKUP_USER_OVERRIDES SSS_BACKUP_DIR "/sssd_user_overrides.bak"
@@ -243,7 +241,7 @@ errno_t sssctl_cache_remove(struct sss_cmdline *cmdline,
}
printf(_("Removing cache files...\n"));
- ret = sssctl_run_command("rm -f " CACHE_FILES);
+ ret = remove_subtree(DB_PATH);
if (ret != EOK) {
fprintf(stderr, _("Unable to remove cache files\n"));
return ret;
diff --git a/src/tools/sssctl/sssctl_logs.c b/src/tools/sssctl/sssctl_logs.c
index 883f2ac2fa688b672cd8f388e4c571d1a12a32af..571207c1599a8264244a9a41ebf2e7afeedffbdc 100644
--- a/src/tools/sssctl/sssctl_logs.c
+++ b/src/tools/sssctl/sssctl_logs.c
@@ -25,6 +25,7 @@
#include "tools/common/sss_tools.h"
#include "tools/common/sss_process.h"
#include "tools/sssctl/sssctl.h"
+#include "tools/tools_util.h"
#define LOG_FILE(file) " " LOG_PATH "/" file
#define LOG_FILES LOG_FILE("*.log")
@@ -55,7 +56,7 @@ errno_t sssctl_logs_remove(struct sss_cmdline *cmdline,
if (opts.delete) {
printf(_("Deleting log files...\n"));
- ret = sssctl_run_command("rm -f " LOG_FILES);
+ ret = remove_subtree(LOG_PATH);
if (ret != EOK) {
fprintf(stderr, _("Unable to remove log files\n"));
return ret;
--
2.1.0
_______________________________________________
sssd-devel mailing list
[email protected]
https://lists.fedorahosted.org/admin/lists/[email protected]