diff options
author | Kay Sievers <kay@vrfy.org> | 2012-05-07 18:55:45 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2012-05-07 19:01:24 +0200 |
commit | 2c21044f05e32ec483b6ab13e175278779e9ebe3 (patch) | |
tree | 1464655a87ca946c5ffd26417886721fdbbd3ece /src/shared | |
parent | 7fdd367e6d675d4546074c5dd35bf168d7c17339 (diff) |
util: split-out conf-file.[ch]
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/conf-files.c | 151 | ||||
-rw-r--r-- | src/shared/conf-files.h | 31 | ||||
-rw-r--r-- | src/shared/install.c | 1 | ||||
-rw-r--r-- | src/shared/util.c | 114 | ||||
-rw-r--r-- | src/shared/util.h | 3 |
5 files changed, 183 insertions, 117 deletions
diff --git a/src/shared/conf-files.c b/src/shared/conf-files.c new file mode 100644 index 0000000000..019fadcf5e --- /dev/null +++ b/src/shared/conf-files.c @@ -0,0 +1,151 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2010 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +#include <assert.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/stat.h> +#include <dirent.h> + +#include "macro.h" +#include "util.h" +#include "missing.h" +#include "log.h" +#include "strv.h" +#include "hashmap.h" +#include "conf-files.h" + +static int files_add(Hashmap *h, const char *path, const char *suffix) { + DIR *dir; + struct dirent buffer, *de; + int r = 0; + + dir = opendir(path); + if (!dir) { + if (errno == ENOENT) + return 0; + return -errno; + } + + for (;;) { + int k; + char *p; + + k = readdir_r(dir, &buffer, &de); + if (k != 0) { + r = -k; + goto finish; + } + + if (!de) + break; + + if (!dirent_is_file_with_suffix(de, suffix)) + continue; + + if (asprintf(&p, "%s/%s", path, de->d_name) < 0) { + r = -ENOMEM; + goto finish; + } + + if (hashmap_put(h, file_name_from_path(p), p) <= 0) { + log_debug("Skip overridden file: %s.", p); + free(p); + } + } + +finish: + closedir(dir); + return r; +} + +static int base_cmp(const void *a, const void *b) { + const char *s1, *s2; + + s1 = *(char * const *)a; + s2 = *(char * const *)b; + return strcmp(file_name_from_path(s1), file_name_from_path(s2)); +} + +int conf_files_list_strv(char ***strv, const char *suffix, const char **dirs) { + Hashmap *fh = NULL; + char **files = NULL; + const char **p; + int r = 0; + + assert(dirs); + + fh = hashmap_new(string_hash_func, string_compare_func); + if (!fh) { + r = -ENOMEM; + goto finish; + } + + STRV_FOREACH(p, dirs) { + if (files_add(fh, *p, suffix) < 0) { + log_error("Failed to search for files."); + r = -EINVAL; + goto finish; + } + } + + files = hashmap_get_strv(fh); + if (files == NULL) { + log_error("Failed to compose list of files."); + r = -ENOMEM; + goto finish; + } + qsort(files, hashmap_size(fh), sizeof(char *), base_cmp); + +finish: + hashmap_free(fh); + *strv = files; + return r; +} + +int conf_files_list(char ***strv, const char *suffix, const char *dir, ...) { + char **dirs = NULL; + va_list ap; + int r; + + va_start(ap, dir); + dirs = strv_new_ap(dir, ap); + va_end(ap); + if (!dirs) { + r = -ENOMEM; + goto finish; + } + + if (!strv_path_canonicalize(dirs)) { + r = -ENOMEM; + goto finish; + } + strv_uniq(dirs); + + r = conf_files_list_strv(strv, suffix, (const char **)dirs); + +finish: + strv_free(dirs); + return r; +} diff --git a/src/shared/conf-files.h b/src/shared/conf-files.h new file mode 100644 index 0000000000..f37ee1f3db --- /dev/null +++ b/src/shared/conf-files.h @@ -0,0 +1,31 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#ifndef fooconffileshfoo +#define fooconffileshfoo + +/*** + This file is part of systemd. + + Copyright 2010-2012 Lennart Poettering + Copyright 2010-2012 Kay Sievers + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +#include "macro.h" + +int conf_files_list(char ***strv, const char *suffix, const char *dir, ...); +int conf_files_list_strv(char ***strv, const char *suffix, const char **dirs); + +#endif diff --git a/src/shared/install.c b/src/shared/install.c index a982c54142..a77dfc77e4 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -34,6 +34,7 @@ #include "unit-name.h" #include "install.h" #include "conf-parser.h" +#include "conf-files.h" typedef struct { char *name; diff --git a/src/shared/util.c b/src/shared/util.c index 2bfa2cb4e6..d6f5661c24 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -4863,120 +4863,6 @@ int vt_disallocate(const char *name) { return 0; } -static int files_add(Hashmap *h, const char *path, const char *suffix) { - DIR *dir; - struct dirent buffer, *de; - int r = 0; - - dir = opendir(path); - if (!dir) { - if (errno == ENOENT) - return 0; - return -errno; - } - - for (;;) { - int k; - char *p; - - k = readdir_r(dir, &buffer, &de); - if (k != 0) { - r = -k; - goto finish; - } - - if (!de) - break; - - if (!dirent_is_file_with_suffix(de, suffix)) - continue; - - if (asprintf(&p, "%s/%s", path, de->d_name) < 0) { - r = -ENOMEM; - goto finish; - } - - if (hashmap_put(h, file_name_from_path(p), p) <= 0) { - log_debug("Skip overridden file: %s.", p); - free(p); - } - } - -finish: - closedir(dir); - return r; -} - -static int base_cmp(const void *a, const void *b) { - const char *s1, *s2; - - s1 = *(char * const *)a; - s2 = *(char * const *)b; - return strcmp(file_name_from_path(s1), file_name_from_path(s2)); -} - -int conf_files_list_strv(char ***strv, const char *suffix, const char **dirs) { - Hashmap *fh = NULL; - char **files = NULL; - const char **p; - int r = 0; - - assert(dirs); - - fh = hashmap_new(string_hash_func, string_compare_func); - if (!fh) { - r = -ENOMEM; - goto finish; - } - - STRV_FOREACH(p, dirs) { - if (files_add(fh, *p, suffix) < 0) { - log_error("Failed to search for files."); - r = -EINVAL; - goto finish; - } - } - - files = hashmap_get_strv(fh); - if (files == NULL) { - log_error("Failed to compose list of files."); - r = -ENOMEM; - goto finish; - } - qsort(files, hashmap_size(fh), sizeof(char *), base_cmp); - -finish: - hashmap_free(fh); - *strv = files; - return r; -} - -int conf_files_list(char ***strv, const char *suffix, const char *dir, ...) { - char **dirs = NULL; - va_list ap; - int r; - - va_start(ap, dir); - dirs = strv_new_ap(dir, ap); - va_end(ap); - if (!dirs) { - r = -ENOMEM; - goto finish; - } - - if (!strv_path_canonicalize(dirs)) { - r = -ENOMEM; - goto finish; - } - strv_uniq(dirs); - - r = conf_files_list_strv(strv, suffix, (const char **)dirs); - -finish: - strv_free(dirs); - return r; -} - int hwclock_is_localtime(void) { FILE *f; bool local = false; diff --git a/src/shared/util.h b/src/shared/util.h index 7a2661a04f..b246996fcc 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -460,9 +460,6 @@ int symlink_or_copy_atomic(const char *from, const char *to); int fchmod_umask(int fd, mode_t mode); -int conf_files_list(char ***strv, const char *suffix, const char *dir, ...); -int conf_files_list_strv(char ***strv, const char *suffix, const char **dirs); - int hwclock_is_localtime(void); int hwclock_apply_localtime_delta(int *min); int hwclock_reset_localtime_delta(void); |