1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-08 11:27:32 +03:00

binfmt, modules-load, sysctl, tmpfiles: read /usr/local/lib and where appropriate /lib directories

This commit is contained in:
Kay Sievers 2011-04-30 20:31:33 +02:00
parent db91c52703
commit 223a355816
5 changed files with 38 additions and 8 deletions

View File

@ -138,6 +138,7 @@ int main(int argc, char *argv[]) {
r = conf_files_list(&files, ".conf", r = conf_files_list(&files, ".conf",
"/run/binfmt.d", "/run/binfmt.d",
"/etc/binfmt.d", "/etc/binfmt.d",
"/usr/local/lib/binfmt.d",
"/usr/lib/binfmt.d", "/usr/lib/binfmt.d",
NULL); NULL);

View File

@ -56,7 +56,9 @@ int main(int argc, char *argv[]) {
if (conf_files_list(&files, ".conf", if (conf_files_list(&files, ".conf",
"/run/modules-load.d", "/run/modules-load.d",
"/etc/modules-load.d", "/etc/modules-load.d",
"/usr/local/lib/modules-load.d",
"/usr/lib/modules-load.d", "/usr/lib/modules-load.d",
"/lib/modules-load.d",
NULL) < 0) { NULL) < 0) {
log_error("Failed to enumerate modules-load.d files: %s", strerror(-r)); log_error("Failed to enumerate modules-load.d files: %s", strerror(-r));
goto finish; goto finish;

View File

@ -143,7 +143,9 @@ int main(int argc, char *argv[]) {
r = conf_files_list(&files, ".conf", r = conf_files_list(&files, ".conf",
"/run/sysctl.d", "/run/sysctl.d",
"/etc/sysctl.d", "/etc/sysctl.d",
"/usr/local/sysctl.d",
"/usr/lib/sysctl.d", "/usr/lib/sysctl.d",
"/lib/sysctl.d",
NULL); NULL);
if (r < 0) { if (r < 0) {
log_error("Failed to enumerate sysctl.d files: %s", strerror(-r)); log_error("Failed to enumerate sysctl.d files: %s", strerror(-r));

View File

@ -966,6 +966,7 @@ int main(int argc, char *argv[]) {
r = conf_files_list(&files, ".conf", r = conf_files_list(&files, ".conf",
"/run/tmpfiles.d", "/run/tmpfiles.d",
"/etc/tmpfiles.d", "/etc/tmpfiles.d",
"/usr/local/lib/tmpfiles.d",
"/usr/lib/tmpfiles.d", "/usr/lib/tmpfiles.d",
NULL); NULL);
if (r < 0) { if (r < 0) {

View File

@ -4576,17 +4576,25 @@ static int files_add(Hashmap *h, const char *path, const char *suffix) {
} }
for (de = readdir(dir); de; de = readdir(dir)) { for (de = readdir(dir); de; de = readdir(dir)) {
char *f; char *p, *f;
const char *base; const char *base;
if (!file_is_conf(de, suffix)) if (!file_is_conf(de, suffix))
continue; continue;
if (asprintf(&f, "%s/%s", path, de->d_name) < 0) { if (asprintf(&p, "%s/%s", path, de->d_name) < 0) {
r = -ENOMEM; r = -ENOMEM;
goto finish; goto finish;
} }
f = canonicalize_file_name(p);
if (!f) {
log_error("Failed to canonicalize file name '%s': %m", p);
free(p);
continue;
}
free(p);
log_debug("found: %s\n", f); log_debug("found: %s\n", f);
base = f + strlen(path) + 1; base = f + strlen(path) + 1;
if (hashmap_put(h, base, f) <= 0) if (hashmap_put(h, base, f) <= 0)
@ -4607,27 +4615,42 @@ static int base_cmp(const void *a, const void *b) {
} }
int conf_files_list(char ***strv, const char *suffix, const char *dir, ...) { int conf_files_list(char ***strv, const char *suffix, const char *dir, ...) {
Hashmap *fh; Hashmap *fh = NULL;
char **dirs = NULL;
char **files = NULL; char **files = NULL;
char **p;
va_list ap; va_list ap;
int r = 0; int r = 0;
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;
}
if (!strv_uniq(dirs)) {
r = -ENOMEM;
goto finish;
}
fh = hashmap_new(string_hash_func, string_compare_func); fh = hashmap_new(string_hash_func, string_compare_func);
if (!fh) { if (!fh) {
r = -ENOMEM; r = -ENOMEM;
goto finish; goto finish;
} }
va_start(ap, dir); STRV_FOREACH(p, dirs) {
while (dir) { if (files_add(fh, *p, suffix) < 0) {
if (files_add(fh, dir, suffix) < 0) {
log_error("Failed to search for files."); log_error("Failed to search for files.");
r = -EINVAL; r = -EINVAL;
goto finish; goto finish;
} }
dir = va_arg(ap, const char *);
} }
va_end(ap);
files = hashmap_get_strv(fh); files = hashmap_get_strv(fh);
if (files == NULL) { if (files == NULL) {
@ -4638,6 +4661,7 @@ int conf_files_list(char ***strv, const char *suffix, const char *dir, ...) {
qsort(files, hashmap_size(fh), sizeof(char *), base_cmp); qsort(files, hashmap_size(fh), sizeof(char *), base_cmp);
finish: finish:
strv_free(dirs);
hashmap_free(fh); hashmap_free(fh);
*strv = files; *strv = files;
return r; return r;