]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/machine/machined-core.c
Make support for nscd flushing optional
[thirdparty/systemd.git] / src / machine / machined-core.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
9fdcbae5
LP
2
3#include "machined.h"
4#include "nscd-flush.h"
5#include "strv.h"
74d1b7d2 6#include "user-util.h"
9fdcbae5 7
7e0079f9 8#if ENABLE_NSCD
9fdcbae5
LP
9static int on_nscd_cache_flush_event(sd_event_source *s, void *userdata) {
10 /* Let's ask glibc's nscd daemon to flush its caches. We request this for the three database machines may show
11 * up in: the hosts database (for resolvable machine names) and the user and group databases (for the user ns
12 * ranges). */
13
14 (void) nscd_flush_cache(STRV_MAKE("passwd", "group", "hosts"));
15 return 0;
16}
17
18int manager_enqueue_nscd_cache_flush(Manager *m) {
19 int r;
20
21 assert(m);
22
23 if (!m->nscd_cache_flush_event) {
24 r = sd_event_add_defer(m->event, &m->nscd_cache_flush_event, on_nscd_cache_flush_event, m);
25 if (r < 0)
26 return log_error_errno(r, "Failed to allocate NSCD cache flush event: %m");
27
28 sd_event_source_set_description(m->nscd_cache_flush_event, "nscd-cache-flush");
29 }
30
31 r = sd_event_source_set_enabled(m->nscd_cache_flush_event, SD_EVENT_ONESHOT);
32 if (r < 0) {
33 m->nscd_cache_flush_event = sd_event_source_unref(m->nscd_cache_flush_event);
34 return log_error_errno(r, "Failed to enable NSCD cache flush event: %m");
35 }
36
37 return 0;
38}
7e0079f9 39#endif
74d1b7d2
LP
40
41int manager_find_machine_for_uid(Manager *m, uid_t uid, Machine **ret_machine, uid_t *ret_internal_uid) {
42 Machine *machine;
74d1b7d2
LP
43 int r;
44
45 assert(m);
46 assert(uid_is_valid(uid));
47
48 /* Finds the machine for the specified host UID and returns it along with the UID translated into the
49 * internal UID inside the machine */
50
90e74a66 51 HASHMAP_FOREACH(machine, m->machines) {
74d1b7d2
LP
52 uid_t converted;
53
54 r = machine_owns_uid(machine, uid, &converted);
55 if (r < 0)
56 return r;
57 if (r) {
58 if (ret_machine)
59 *ret_machine = machine;
60
61 if (ret_internal_uid)
62 *ret_internal_uid = converted;
63
64 return true;
65 }
66 }
67
68 if (ret_machine)
69 *ret_machine = NULL;
70 if (ret_internal_uid)
71 *ret_internal_uid = UID_INVALID;
72
73 return false;
74}
75
76int manager_find_machine_for_gid(Manager *m, gid_t gid, Machine **ret_machine, gid_t *ret_internal_gid) {
77 Machine *machine;
74d1b7d2
LP
78 int r;
79
80 assert(m);
81 assert(gid_is_valid(gid));
82
90e74a66 83 HASHMAP_FOREACH(machine, m->machines) {
74d1b7d2
LP
84 gid_t converted;
85
86 r = machine_owns_gid(machine, gid, &converted);
87 if (r < 0)
88 return r;
89 if (r) {
90 if (ret_machine)
91 *ret_machine = machine;
92
93 if (ret_internal_gid)
94 *ret_internal_gid = converted;
95
96 return true;
97 }
98 }
99
100 if (ret_machine)
101 *ret_machine = NULL;
102 if (ret_internal_gid)
103 *ret_internal_gid = GID_INVALID;
104
105 return false;
106}