diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binfmt/binfmt.c | 1 | ||||
-rw-r--r-- | src/modules-load/modules-load.c | 1 | ||||
-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 | ||||
-rw-r--r-- | src/sysctl/sysctl.c | 1 | ||||
-rw-r--r-- | src/tmpfiles/tmpfiles.c | 1 | ||||
-rw-r--r-- | src/udev/udev-rules.c | 1 |
10 files changed, 188 insertions, 117 deletions
diff --git a/src/binfmt/binfmt.c b/src/binfmt/binfmt.c index 5bd763339e..0399ab75e0 100644 --- a/src/binfmt/binfmt.c +++ b/src/binfmt/binfmt.c @@ -31,6 +31,7 @@ #include "hashmap.h" #include "strv.h" #include "util.h" +#include "conf-files.h" static int delete_rule(const char *rule) { char *x, *fn = NULL, *e; diff --git a/src/modules-load/modules-load.c b/src/modules-load/modules-load.c index 0f2144c2ed..c78f7d8aa8 100644 --- a/src/modules-load/modules-load.c +++ b/src/modules-load/modules-load.c @@ -31,6 +31,7 @@ #include "log.h" #include "util.h" #include "strv.h" +#include "conf-files.h" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-nonliteral" 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); diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c index 57fba25605..575095f812 100644 --- a/src/sysctl/sysctl.c +++ b/src/sysctl/sysctl.c @@ -31,6 +31,7 @@ #include "strv.h" #include "util.h" #include "strv.h" +#include "conf-files.h" #define PROC_SYS_PREFIX "/proc/sys/" diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index d8fcb40155..16666ce5a6 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -45,6 +45,7 @@ #include "strv.h" #include "label.h" #include "set.h" +#include "conf-files.h" /* This reads all files listed in /etc/tmpfiles.d/?*.conf and creates * them in the file system. This is intended to be used to create diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index 22b91c6797..45a611474d 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -31,6 +31,7 @@ #include <time.h> #include "udev.h" +#include "conf-files.h" #define PREALLOC_TOKEN 2048 #define PREALLOC_STRBUF 32 * 1024 |