[ABRT PATCH 1/2] problem API: add function getting list of inaccessible problem IDs
Jakub Filak
jfilak at redhat.com
Tue Jun 18 15:33:45 UTC 2013
Related to rhbz#973125
Signed-off-by: Jakub Filak <jfilak at redhat.com>
---
src/include/problem_api.h | 31 ++++++++++++++++++++++++++++++-
src/lib/problem_api.c | 31 ++++++++++++++++++++++++++++++-
2 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/src/include/problem_api.h b/src/include/problem_api.h
index 99d832c..60a76d0 100644
--- a/src/include/problem_api.h
+++ b/src/include/problem_api.h
@@ -20,9 +20,29 @@
#include <glib.h>
#include <libabrt.h>
+
+/*
+ * Function called for each problem directory in @for_each_problem_in_dir
+ *
+ * @param dd A dump directory
+ * @param arg User's arguments
+ * @returns 0 if everything is OK, a non zero value in order to break the iterator
+ */
+typedef int (* for_each_problem_in_dir_callback)(struct dump_dir *dd, void *arg);
+
+/*
+ * Iterates over all dump directories placed in @path and call @callback.
+ *
+ * @param path Dump directories location
+ * @param caller_uid UID for access check. -1 for disabling this check
+ * @param callback Called for each applicable dump directory. Non zero
+ * value returned from @callback will breaks the iteration.
+ * @param arg User's arguments passed to @callback
+ * @returns 0 or the first non zero value returned from @callback
+ */
int for_each_problem_in_dir(const char *path,
uid_t caller_uid,
- int (*callback)(struct dump_dir *dd, void *arg),
+ for_each_problem_in_dir_callback callback,
void *arg);
/* Retrieves the list of directories currently used as a problem storage
@@ -31,3 +51,12 @@ int for_each_problem_in_dir(const char *path,
*/
GList *get_problem_storages(void);
GList *get_problem_dirs_for_uid(uid_t uid, const char *dump_location);
+
+/*
+ * Gets list of problem directories not accessible by user
+ *
+ * @param uid User's uid
+ * @param dump_location Dump directories location
+ * @returns GList with mallocated absolute paths to dump directories
+ */
+GList *get_problem_dirs_not_accessible_by_uid(uid_t uid, const char *dump_location);
diff --git a/src/lib/problem_api.c b/src/lib/problem_api.c
index 3bb114f..7523efb 100644
--- a/src/lib/problem_api.c
+++ b/src/lib/problem_api.c
@@ -46,7 +46,7 @@ int for_each_problem_in_dir(const char *path,
continue; /* skip "." and ".." */
char *full_name = concat_path_file(path, dent->d_name);
- if (dump_dir_accessible_by_uid(full_name, caller_uid))
+ if (caller_uid == -1 || dump_dir_accessible_by_uid(full_name, caller_uid))
{
/* Silently ignore *any* errors, not only EACCES.
* We saw "lock file is locked by process PID" error
@@ -91,6 +91,35 @@ GList *get_problem_dirs_for_uid(uid_t uid, const char *dump_location)
return g_list_reverse(list);
}
+/* get_problem_dirs_not_accessible_by_uid and its helpers */
+struct add_dirname_to_GList_if_not_accessible_args
+{
+ uid_t uid;
+ GList *list;
+};
+
+static int add_dirname_to_GList_if_not_accessible(struct dump_dir *dd, void *args)
+{
+ struct add_dirname_to_GList_if_not_accessible_args *param = (struct add_dirname_to_GList_if_not_accessible_args *)args;
+ /* Append if not accessible */
+ if (!dump_dir_accessible_by_uid(dd->dd_dirname, param->uid))
+ param->list = g_list_prepend(param->list, xstrdup(dd->dd_dirname));
+
+ return 0;
+}
+
+GList *get_problem_dirs_not_accessible_by_uid(uid_t uid, const char *dump_location)
+{
+ struct add_dirname_to_GList_if_not_accessible_args args = {
+ .uid = uid,
+ .list = NULL,
+ };
+
+ for_each_problem_in_dir(dump_location, /*disable default uid check*/-1, add_dirname_to_GList_if_not_accessible, &args);
+ return g_list_reverse(args.list);
+}
+
+
/* get_problem_storages */
GList *get_problem_storages(void)
--
1.8.2.1
More information about the Crash-catcher
mailing list