]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-event/event-util.c
sd-boot+bootctl: invert order of entries w/o sort-key
[thirdparty/systemd.git] / src / libsystemd / sd-event / event-util.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include <errno.h>
4
5 #include "event-source.h"
6 #include "event-util.h"
7 #include "log.h"
8 #include "string-util.h"
9
10 int event_reset_time(
11 sd_event *e,
12 sd_event_source **s,
13 clockid_t clock,
14 uint64_t usec,
15 uint64_t accuracy,
16 sd_event_time_handler_t callback,
17 void *userdata,
18 int64_t priority,
19 const char *description,
20 bool force_reset) {
21
22 bool created = false;
23 int enabled, r;
24 clockid_t c;
25
26 assert(e);
27 assert(s);
28
29 if (*s) {
30 if (!force_reset) {
31 r = sd_event_source_get_enabled(*s, &enabled);
32 if (r < 0)
33 return log_debug_errno(r, "sd-event: Failed to query whether event source \"%s\" is enabled or not: %m",
34 strna((*s)->description ?: description));
35
36 if (enabled != SD_EVENT_OFF)
37 return 0;
38 }
39
40 r = sd_event_source_get_time_clock(*s, &c);
41 if (r < 0)
42 return log_debug_errno(r, "sd-event: Failed to get clock id of event source \"%s\": %m", strna((*s)->description ?: description));
43
44 if (c != clock)
45 return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
46 "sd-event: Current clock id %i of event source \"%s\" is different from specified one %i.",
47 (int)c,
48 strna((*s)->description ? : description),
49 (int)clock);
50
51 r = sd_event_source_set_time(*s, usec);
52 if (r < 0)
53 return log_debug_errno(r, "sd-event: Failed to set time for event source \"%s\": %m", strna((*s)->description ?: description));
54
55 r = sd_event_source_set_time_accuracy(*s, accuracy);
56 if (r < 0)
57 return log_debug_errno(r, "sd-event: Failed to set accuracy for event source \"%s\": %m", strna((*s)->description ?: description));
58
59 /* callback function is not updated, as we do not have sd_event_source_set_time_callback(). */
60
61 (void) sd_event_source_set_userdata(*s, userdata);
62
63 r = sd_event_source_set_enabled(*s, SD_EVENT_ONESHOT);
64 if (r < 0)
65 return log_debug_errno(r, "sd-event: Failed to enable event source \"%s\": %m", strna((*s)->description ?: description));
66 } else {
67 r = sd_event_add_time(e, s, clock, usec, accuracy, callback, userdata);
68 if (r < 0)
69 return log_debug_errno(r, "sd-event: Failed to create timer event \"%s\": %m", strna(description));
70
71 created = true;
72 }
73
74 r = sd_event_source_set_priority(*s, priority);
75 if (r < 0)
76 return log_debug_errno(r, "sd-event: Failed to set priority for event source \"%s\": %m", strna((*s)->description ?: description));
77
78 if (description) {
79 r = sd_event_source_set_description(*s, description);
80 if (r < 0)
81 return log_debug_errno(r, "sd-event: Failed to set description for event source \"%s\": %m", description);
82 }
83
84 return created;
85 }
86
87 int event_reset_time_relative(
88 sd_event *e,
89 sd_event_source **s,
90 clockid_t clock,
91 uint64_t usec,
92 uint64_t accuracy,
93 sd_event_time_handler_t callback,
94 void *userdata,
95 int64_t priority,
96 const char *description,
97 bool force_reset) {
98
99 usec_t usec_now;
100 int r;
101
102 assert(e);
103
104 r = sd_event_now(e, clock, &usec_now);
105 if (r < 0)
106 return log_debug_errno(r, "sd-event: Failed to get the current time: %m");
107
108 return event_reset_time(e, s, clock, usec_add(usec_now, usec), accuracy, callback, userdata, priority, description, force_reset);
109 }
110
111 int event_source_disable(sd_event_source *s) {
112 if (!s)
113 return 0;
114
115 return sd_event_source_set_enabled(s, SD_EVENT_OFF);
116 }
117
118 int event_source_is_enabled(sd_event_source *s) {
119 if (!s)
120 return false;
121
122 return sd_event_source_get_enabled(s, NULL);
123 }