chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
util: introduce FOREACH_LINE for iterating through files
[elogind.git]
/
src
/
shared
/
conf-files.c
diff --git
a/src/shared/conf-files.c
b/src/shared/conf-files.c
index 34b86293d3a246b9703a36eab41f8f020de4ff38..5bbd2388d3d03084663b118becac7d7d77094958 100644
(file)
--- a/
src/shared/conf-files.c
+++ b/
src/shared/conf-files.c
@@
-37,11
+37,14
@@
#include "hashmap.h"
#include "conf-files.h"
#include "hashmap.h"
#include "conf-files.h"
-static int files_add(Hashmap *h, const char *path, const char *suffix) {
- DIR *dir;
-
int r = 0
;
+static int files_add(Hashmap *h, const char *
root, const char *
path, const char *suffix) {
+
_cleanup_closedir_
DIR *dir;
+
_cleanup_free_ char *dirpath = NULL
;
- dir = opendir(path);
+ if (asprintf(&dirpath, "%s%s", root ? root : "", path) < 0)
+ return -ENOMEM;
+
+ dir = opendir(dirpath);
if (!dir) {
if (errno == ENOENT)
return 0;
if (!dir) {
if (errno == ENOENT)
return 0;
@@
-51,14
+54,12
@@
static int files_add(Hashmap *h, const char *path, const char *suffix) {
for (;;) {
struct dirent *de;
union dirent_storage buf;
for (;;) {
struct dirent *de;
union dirent_storage buf;
- int k;
char *p;
char *p;
+ int err;
- k = readdir_r(dir, &buf.de, &de);
- if (k != 0) {
- r = -k;
- goto finish;
- }
+ err = readdir_r(dir, &buf.de, &de);
+ if (err != 0)
+ return err;
if (!de)
break;
if (!de)
break;
@@
-66,10
+67,8
@@
static int files_add(Hashmap *h, const char *path, const char *suffix) {
if (!dirent_is_file_with_suffix(de, suffix))
continue;
if (!dirent_is_file_with_suffix(de, suffix))
continue;
- if (asprintf(&p, "%s/%s", path, de->d_name) < 0) {
- r = -ENOMEM;
- goto finish;
- }
+ if (asprintf(&p, "%s/%s", dirpath, de->d_name) < 0)
+ return -ENOMEM;
if (hashmap_put(h, path_get_file_name(p), p) <= 0) {
log_debug("Skip overridden file: %s.", p);
if (hashmap_put(h, path_get_file_name(p), p) <= 0) {
log_debug("Skip overridden file: %s.", p);
@@
-77,9
+76,7
@@
static int files_add(Hashmap *h, const char *path, const char *suffix) {
}
}
}
}
-finish:
- closedir(dir);
- return r;
+ return 0;
}
static int base_cmp(const void *a, const void *b) {
}
static int base_cmp(const void *a, const void *b) {
@@
-90,7
+87,7
@@
static int base_cmp(const void *a, const void *b) {
return strcmp(path_get_file_name(s1), path_get_file_name(s2));
}
return strcmp(path_get_file_name(s1), path_get_file_name(s2));
}
-int conf_files_list_strv(char ***strv, const char *suffix, const char **dirs) {
+int conf_files_list_strv(char ***strv, const char *suffix, const char *
root, const char *
*dirs) {
Hashmap *fh = NULL;
char **files = NULL;
const char **p;
Hashmap *fh = NULL;
char **files = NULL;
const char **p;
@@
-105,7
+102,7
@@
int conf_files_list_strv(char ***strv, const char *suffix, const char **dirs) {
}
STRV_FOREACH(p, dirs) {
}
STRV_FOREACH(p, dirs) {
- r = files_add(fh, *p, suffix);
+ r = files_add(fh,
root,
*p, suffix);
if (r < 0)
log_warning("Failed to search for files in %s: %s",
*p, strerror(-r));
if (r < 0)
log_warning("Failed to search for files in %s: %s",
*p, strerror(-r));
@@
-126,7
+123,7
@@
finish:
return r;
}
return r;
}
-int conf_files_list(char ***strv, const char *suffix, const char *dir, ...) {
+int conf_files_list(char ***strv, const char *suffix, const char *
root, const char *
dir, ...) {
char **dirs = NULL;
va_list ap;
int r;
char **dirs = NULL;
va_list ap;
int r;
@@
-145,7
+142,7
@@
int conf_files_list(char ***strv, const char *suffix, const char *dir, ...) {
}
strv_uniq(dirs);
}
strv_uniq(dirs);
- r = conf_files_list_strv(strv, suffix, (const char **)dirs);
+ r = conf_files_list_strv(strv, suffix,
root,
(const char **)dirs);
finish:
strv_free(dirs);
finish:
strv_free(dirs);