summaryrefslogtreecommitdiff
path: root/src/tmpfiles.c
diff options
context:
space:
mode:
authorMichal Schmidt <mschmidt@redhat.com>2011-12-15 23:45:26 +0100
committerMichal Schmidt <mschmidt@redhat.com>2011-12-15 23:58:55 +0100
commit99e68c0b2d6ca9d491036920fcbca4c8d54404a8 (patch)
tree11a4b3965dedae79020be4b9111fa9a88d150ba1 /src/tmpfiles.c
parentf05bc3f7f1d85ce4d31fa9c9b2780797ef3953cd (diff)
tmpfiles: separate a generic item glob processing function
Item glob processing will be useful for more than just removing.
Diffstat (limited to 'src/tmpfiles.c')
-rw-r--r--src/tmpfiles.c60
1 files changed, 33 insertions, 27 deletions
diff --git a/src/tmpfiles.c b/src/tmpfiles.c
index 9d07a2a554..d655bc3594 100644
--- a/src/tmpfiles.c
+++ b/src/tmpfiles.c
@@ -405,6 +405,33 @@ finish:
return r;
}
+static int glob_item(Item *i, int (*action)(Item *, const char *)) {
+ int r = 0, k;
+ glob_t g;
+ char **fn;
+
+ zero(g);
+
+ errno = 0;
+ if ((k = glob(i->path, GLOB_NOSORT|GLOB_BRACE, NULL, &g)) != 0) {
+
+ if (k != GLOB_NOMATCH) {
+ if (errno != 0)
+ errno = EIO;
+
+ log_error("glob(%s) failed: %m", i->path);
+ return -errno;
+ }
+ }
+
+ STRV_FOREACH(fn, g.gl_pathv)
+ if ((k = action(i, *fn)) < 0)
+ r = k;
+
+ globfree(&g);
+ return r;
+}
+
static int item_set_perms(Item *i) {
if (i->mode_set)
if (chmod(i->path, i->mode) < 0) {
@@ -570,6 +597,8 @@ static int remove_item_instance(Item *i, const char *instance) {
}
static int remove_item(Item *i) {
+ int r = 0;
+
assert(i);
switch (i->type) {
@@ -583,35 +612,12 @@ static int remove_item(Item *i) {
case REMOVE_PATH:
case TRUNCATE_DIRECTORY:
- case RECURSIVE_REMOVE_PATH: {
- int r = 0, k;
- glob_t g;
- char **fn;
-
- zero(g);
-
- errno = 0;
- if ((k = glob(i->path, GLOB_NOSORT|GLOB_BRACE, NULL, &g)) != 0) {
-
- if (k != GLOB_NOMATCH) {
- if (errno != 0)
- errno = EIO;
-
- log_error("glob(%s) failed: %m", i->path);
- return -errno;
- }
- }
-
- STRV_FOREACH(fn, g.gl_pathv)
- if ((k = remove_item_instance(i, *fn)) < 0)
- r = k;
-
- globfree(&g);
- return r;
- }
+ case RECURSIVE_REMOVE_PATH:
+ r = glob_item(i, remove_item_instance);
+ break;
}
- return 0;
+ return r;
}
static int process_item(Item *i) {