chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sysv-generator: always use fstatat() if we can
[elogind.git]
/
src
/
sysv-generator
/
sysv-generator.c
diff --git
a/src/sysv-generator/sysv-generator.c
b/src/sysv-generator/sysv-generator.c
index 2f24ef2561ba1eb2a7cb5733037936051f6529f3..4774981016d85728ce2d3082b33befc3e54fba5e 100644
(file)
--- 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))) {
}
while ((de = readdir(d))) {
- SysvStub *service;
- struct stat st;
_cleanup_free_ char *fpath = NULL, *name = NULL;
_cleanup_free_ char *fpath = NULL, *name = NULL;
+ _cleanup_free_ SysvStub *service = NULL;
+ struct stat st;
int r;
if (hidden_file(de->d_name))
continue;
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;
continue;
+ }
if (!(st.st_mode & S_IXUSR))
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();
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;
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;
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;
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;
}
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)
HASHMAP_FOREACH(service, all_services, j) {
q = fix_order(service, all_services);
if (q < 0)