]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-event/event-util.c
Merge pull request #11827 from keszybz/pkgconfig-variables
[thirdparty/systemd.git] / src / libsystemd / sd-event / event-util.c
CommitLineData
764c08e6
YW
1/* SPDX-License-Identifier: LGPL-2.1+ */
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
10int 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)
886cf317
ZJS
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);
764c08e6
YW
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}
2701983c
YW
86
87int event_source_disable(sd_event_source *s) {
88 if (!s)
89 return 0;
90
91 return sd_event_source_set_enabled(s, SD_EVENT_OFF);
92}
d44325cb
YW
93
94int event_source_is_enabled(sd_event_source *s) {
95 if (!s)
96 return false;
97
98 return sd_event_source_get_enabled(s, NULL);
99}