X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsysv-generator%2Fsysv-generator.c;h=4774981016d85728ce2d3082b33befc3e54fba5e;hb=805e5dda0a01c99d231824e1a9c4a208418bf342;hp=2f24ef2561ba1eb2a7cb5733037936051f6529f3;hpb=1ed0c19f81fd13cdf283c6def0168ce122a853a9;p=elogind.git diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c index 2f24ef256..477498101 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c @@ -722,28 +722,33 @@ static int enumerate_sysv(LookupPaths lp, Hashmap *all_services) { } while ((de = readdir(d))) { - SysvStub *service; - struct stat st; _cleanup_free_ char *fpath = NULL, *name = NULL; + _cleanup_free_ SysvStub *service = NULL; + struct stat st; int r; if (hidden_file(de->d_name)) continue; - fpath = strjoin(*path, "/", de->d_name, NULL); - if (!fpath) - return log_oom(); - - if (stat(fpath, &st) < 0) + if (fstatat(dirfd(d), de->d_name, &st, 0) < 0) { + log_warning_errno(errno, "stat() failed on %s/%s: %m", *path, de->d_name); continue; + } if (!(st.st_mode & S_IXUSR)) continue; + if (!S_ISREG(st.st_mode)) + continue; + name = sysv_translate_name(de->d_name); if (!name) return log_oom(); + fpath = strjoin(*path, "/", de->d_name, NULL); + if (!fpath) + return log_oom(); + if (hashmap_contains(all_services, name)) continue; @@ -755,15 +760,12 @@ static int enumerate_sysv(LookupPaths lp, Hashmap *all_services) { service->name = name; service->path = fpath; - r = load_sysv(service); - if (r < 0) - continue; - r = hashmap_put(all_services, service->name, service); if (r < 0) return log_oom(); name = fpath = NULL; + service = NULL; } } @@ -942,6 +944,12 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } + HASHMAP_FOREACH(service, all_services, j) { + q = load_sysv(service); + if (q < 0) + continue; + } + HASHMAP_FOREACH(service, all_services, j) { q = fix_order(service, all_services); if (q < 0)