116 lines
2.9 KiB
Diff
116 lines
2.9 KiB
Diff
From f7b95fc722d8ef438872b270039b24e8ddd9fc0d Mon Sep 17 00:00:00 2001
|
|
From: Roberto Sassu <roberto.sassu@huawei.com>
|
|
Date: Mon, 26 Oct 2020 12:10:31 +0800
|
|
Subject: [PATCH 05/13] call process_digest_list after files are added
|
|
|
|
Signed-off-by: Anakin Zhang <benjamin93@163.com>
|
|
---
|
|
plugins/digest_list.c | 78 ++++++++++++++++++++++++++++++++++++++-----
|
|
1 file changed, 69 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/plugins/digest_list.c b/plugins/digest_list.c
|
|
index 293593f..1f50394 100644
|
|
--- a/plugins/digest_list.c
|
|
+++ b/plugins/digest_list.c
|
|
@@ -472,28 +472,88 @@ out:
|
|
return ret;
|
|
}
|
|
|
|
+rpmte cur_te;
|
|
+int digest_list_counter;
|
|
+
|
|
static rpmRC digest_list_psm_pre(rpmPlugin plugin, rpmte te)
|
|
{
|
|
- process_digest_list(te, 0);
|
|
- if (!strcmp(rpmteN(te), "digest-list-tools"))
|
|
- process_digest_list(te, 1);
|
|
+ Header rpm = rpmteHeader(te);
|
|
+ rpmtd dirnames;
|
|
+ int i;
|
|
+
|
|
+ digest_list_counter = 0;
|
|
+
|
|
+ dirnames = rpmtdNew();
|
|
+ headerGet(rpm, RPMTAG_DIRNAMES, dirnames, 0);
|
|
+
|
|
+ while ((i = rpmtdNext(dirnames)) >= 0) {
|
|
+ char *dirname = (char *) rpmtdGetString(dirnames);
|
|
+ if (!strncmp(dirname, DIGEST_LIST_DEFAULT_PATH,
|
|
+ sizeof(DIGEST_LIST_DEFAULT_PATH) - 1))
|
|
+ digest_list_counter++;
|
|
+ }
|
|
|
|
+ rpmtdFree(dirnames);
|
|
+
|
|
+ cur_te = te;
|
|
return RPMRC_OK;
|
|
}
|
|
|
|
-static rpmRC digest_list_psm_post(rpmPlugin plugin, rpmte te, int res)
|
|
+static rpmRC digest_list_file_common(rpmPlugin plugin, rpmfi fi,
|
|
+ const char* path, mode_t file_mode,
|
|
+ rpmFsmOp op, int pre, int res)
|
|
{
|
|
- if (res != RPMRC_OK)
|
|
+ rpmFileAction action = XFO_ACTION(op);
|
|
+
|
|
+ if (!digest_list_counter)
|
|
+ return RPMRC_OK;
|
|
+
|
|
+ if (!cur_te)
|
|
+ return RPMRC_OK;
|
|
+
|
|
+ if (!pre && res != RPMRC_OK)
|
|
+ return res;
|
|
+
|
|
+ if ((pre && action != FA_ERASE) ||
|
|
+ (!pre && action != FA_CREATE))
|
|
return RPMRC_OK;
|
|
|
|
- process_digest_list(te, 0);
|
|
- if (!strcmp(rpmteN(te), "digest-list-tools"))
|
|
- process_digest_list(te, 1);
|
|
+ if (digest_list_counter) {
|
|
+ if (!pre) {
|
|
+ if (!strncmp(path, DIGEST_LIST_DEFAULT_PATH,
|
|
+ sizeof(DIGEST_LIST_DEFAULT_PATH) - 1))
|
|
+ digest_list_counter--;
|
|
+ } else {
|
|
+ digest_list_counter = 0;
|
|
+ }
|
|
+
|
|
+ if (digest_list_counter)
|
|
+ return RPMRC_OK;
|
|
+ }
|
|
+
|
|
+ process_digest_list(cur_te, 0);
|
|
+ if (!strcmp(rpmteN(cur_te), "digest-list-tools"))
|
|
+ process_digest_list(cur_te, 1);
|
|
|
|
return RPMRC_OK;
|
|
}
|
|
|
|
+static rpmRC digest_list_file_pre(rpmPlugin plugin, rpmfi fi,
|
|
+ const char* path, mode_t file_mode,
|
|
+ rpmFsmOp op)
|
|
+{
|
|
+ return digest_list_file_common(plugin, fi, path, file_mode, op, 1, 0);
|
|
+}
|
|
+
|
|
+static rpmRC digest_list_file_post(rpmPlugin plugin, rpmfi fi,
|
|
+ const char* path, mode_t file_mode,
|
|
+ rpmFsmOp op, int res)
|
|
+{
|
|
+ return digest_list_file_common(plugin, fi, path, file_mode, op, 0, res);
|
|
+}
|
|
+
|
|
struct rpmPluginHooks_s digest_list_hooks = {
|
|
.psm_pre = digest_list_psm_pre,
|
|
- .psm_post = digest_list_psm_post,
|
|
+ .fsm_file_pre = digest_list_file_pre,
|
|
+ .fsm_file_post = digest_list_file_post,
|
|
};
|
|
--
|
|
2.33.0
|
|
|