]> git.ipfire.org Git - people/ms/systemd.git/blame - load-dropin.c
implement proper logging for services
[people/ms/systemd.git] / load-dropin.c
CommitLineData
5cb5a6ff
LP
1/*-*- Mode: C; c-basic-offset: 8 -*-*/
2
0301abf4
LP
3#include <dirent.h>
4#include <errno.h>
5
6#include "unit.h"
5cb5a6ff 7#include "load-dropin.h"
b952f2e1 8#include "log.h"
5cb5a6ff 9
87f0e418 10int unit_load_dropin(Unit *u) {
0301abf4
LP
11 Iterator i;
12 int r;
13 char *t;
14
87f0e418 15 assert(u);
5cb5a6ff
LP
16
17 /* Load dependencies from supplementary drop-in directories */
18
0301abf4
LP
19 SET_FOREACH(t, u->meta.names, i) {
20 char *path;
21 DIR *d;
22 struct dirent *de;
23
24 if (asprintf(&path, "%s/%s.wants", unit_path(), t) < 0)
25 return -ENOMEM;
26
27 if (!(d = opendir(path))) {
28 r = -errno;
29 free(path);
30
31 if (r == -ENOENT)
32 continue;
33
34 return r;
35 }
36
37 free(path);
38
39 while ((de = readdir(d))) {
40 Unit *other;
41
42 if (de->d_name[0] == '.')
43 continue;
44
45 assert(de->d_name[0]);
46
47 if (de->d_name[strlen(de->d_name)-1] == '~')
48 continue;
49
50 if (asprintf(&path, "%s/%s.wants/%s", unit_path(), t, de->d_name) < 0) {
51 closedir(d);
52 return -ENOMEM;
53 }
54
b952f2e1
LP
55 if (!unit_name_is_valid(de->d_name)) {
56 log_info("Name of %s is not a valid unit name. Ignoring.", path);
57 free(path);
58 continue;
59 }
60
0301abf4
LP
61 r = manager_load_unit(u->meta.manager, path, &other);
62 free(path);
63
64 if (r < 0) {
65 closedir(d);
66 return r;
67 }
68
69 if ((r = unit_add_dependency(u, UNIT_WANTS, other)) < 0) {
70 closedir(d);
71 return r;
72 }
73 }
74
75 closedir(d);
76 }
77
5cb5a6ff
LP
78 return 0;
79}