]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/portable/portabled-image.c
tree-wide: use ASSERT_PTR more
[thirdparty/systemd.git] / src / portable / portabled-image.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
61d0578b
LP
2
3#include "portable.h"
4#include "portabled-image.h"
5#include "portabled.h"
6
7Image *manager_image_cache_get(Manager *m, const char *name_or_path) {
8 assert(m);
9
10 return hashmap_get(m->image_cache, name_or_path);
11}
12
13static int image_cache_flush(sd_event_source *s, void *userdata) {
99534007 14 Manager *m = ASSERT_PTR(userdata);
61d0578b
LP
15
16 assert(s);
61d0578b 17
b07ec5a1 18 hashmap_clear(m->image_cache);
61d0578b
LP
19 return 0;
20}
21
22static int manager_image_cache_initialize(Manager *m) {
23 int r;
24
25 assert(m);
26
b07ec5a1 27 r = hashmap_ensure_allocated(&m->image_cache, &image_hash_ops);
61d0578b
LP
28 if (r < 0)
29 return r;
30
31 /* We flush the cache as soon as we are idle again */
32 if (!m->image_cache_defer_event) {
33 r = sd_event_add_defer(m->event, &m->image_cache_defer_event, image_cache_flush, m);
34 if (r < 0)
35 return r;
36
37 r = sd_event_source_set_priority(m->image_cache_defer_event, SD_EVENT_PRIORITY_IDLE);
38 if (r < 0)
39 return r;
40 }
41
42 r = sd_event_source_set_enabled(m->image_cache_defer_event, SD_EVENT_ONESHOT);
43 if (r < 0)
44 return r;
45
46 return 0;
47}
48
49int manager_image_cache_add(Manager *m, Image *image) {
50 int r;
51
52 assert(m);
53
54 /* We add the specified image to the cache under two keys.
55 *
56 * 1. Always under its path
57 *
58 * 2. If the image was discovered in the search path (i.e. its discoverable boolean set) we'll also add it
59 * under its short name.
61d0578b
LP
60 */
61
62 r = manager_image_cache_initialize(m);
63 if (r < 0)
64 return r;
65
66 image->userdata = m;
67
68 r = hashmap_put(m->image_cache, image->path, image);
69 if (r < 0)
70 return r;
71
72 image_ref(image);
73
74 if (image->discoverable) {
75 r = hashmap_put(m->image_cache, image->name, image);
76 if (r < 0)
77 return r;
78
79 image_ref(image);
80 }
81
82 return 0;
83}
84
85int manager_image_cache_discover(Manager *m, Hashmap *images, sd_bus_error *error) {
86 Image *image;
61d0578b
LP
87 int r;
88
89 assert(m);
90
91 /* A wrapper around image_discover() (for finding images in search path) and portable_discover_attached() (for
92 * finding attached images). */
93
d577d4a4 94 r = image_discover(IMAGE_PORTABLE, NULL, images);
61d0578b
LP
95 if (r < 0)
96 return r;
97
90e74a66 98 HASHMAP_FOREACH(image, images)
61d0578b
LP
99 (void) manager_image_cache_add(m, image);
100
101 return 0;
102}