1 #pragma once
2 
3 #include <systemd/sd-event.h>
4 
5 namespace sdeventplus
6 {
7 namespace internal
8 {
9 
10 /** @class SdEvent
11  *  @brief Overridable direct sd_event interface
12  */
13 class SdEvent
14 {
15   public:
16     virtual ~SdEvent() = default;
17 
18     virtual int sd_event_default(sd_event** event) const = 0;
19     virtual int sd_event_new(sd_event** event) const = 0;
20     virtual sd_event* sd_event_ref(sd_event* event) const = 0;
21     virtual sd_event* sd_event_unref(sd_event* event) const = 0;
22 
23     virtual int sd_event_add_io(sd_event* event, sd_event_source** source,
24                                 int fd, uint32_t events, sd_event_io_handler_t,
25                                 void* userdata) const = 0;
26     virtual int sd_event_add_time(sd_event* event, sd_event_source** source,
27                                   clockid_t clock, uint64_t usec,
28                                   uint64_t accuracy,
29                                   sd_event_time_handler_t callback,
30                                   void* userdata) const = 0;
31     virtual int sd_event_add_signal(sd_event* event, sd_event_source** source,
32                                     int sig, sd_event_signal_handler_t callback,
33                                     void* userdata) const = 0;
34     virtual int sd_event_add_child(sd_event* event, sd_event_source** source,
35                                    pid_t, int options,
36                                    sd_event_child_handler_t callback,
37                                    void* userdata) const = 0;
38     virtual int sd_event_add_defer(sd_event* event, sd_event_source** source,
39                                    sd_event_handler_t callback,
40                                    void* userdata) const = 0;
41     virtual int sd_event_add_post(sd_event* event, sd_event_source** source,
42                                   sd_event_handler_t callback,
43                                   void* userdata) const = 0;
44     virtual int sd_event_add_exit(sd_event* event, sd_event_source** source,
45                                   sd_event_handler_t callback,
46                                   void* userdata) const = 0;
47 
48     virtual int sd_event_prepare(sd_event* event) const = 0;
49     virtual int sd_event_wait(sd_event* event, uint64_t usec) const = 0;
50     virtual int sd_event_dispatch(sd_event* event) const = 0;
51     virtual int sd_event_run(sd_event* event, uint64_t usec) const = 0;
52     virtual int sd_event_loop(sd_event* event) const = 0;
53     virtual int sd_event_exit(sd_event* event, int code) const = 0;
54 
55     virtual int sd_event_now(sd_event* event, clockid_t clock,
56                              uint64_t* usec) const = 0;
57 
58     virtual int sd_event_get_exit_code(sd_event* event, int* code) const = 0;
59     virtual int sd_event_get_watchdog(sd_event* event) const = 0;
60     virtual int sd_event_set_watchdog(sd_event* event, int b) const = 0;
61 
62     virtual sd_event_source*
63         sd_event_source_ref(sd_event_source* source) const = 0;
64     virtual sd_event_source*
65         sd_event_source_unref(sd_event_source* source) const = 0;
66 
67     virtual void*
68         sd_event_source_get_userdata(sd_event_source* source) const = 0;
69     virtual void* sd_event_source_set_userdata(sd_event_source* source,
70                                                void* userdata) const = 0;
71 
72     virtual int
73         sd_event_source_get_description(sd_event_source* source,
74                                         const char** description) const = 0;
75     virtual int
76         sd_event_source_set_description(sd_event_source* source,
77                                         const char* description) const = 0;
78     virtual int
79         sd_event_source_set_prepare(sd_event_source* source,
80                                     sd_event_handler_t callback) const = 0;
81     virtual int sd_event_source_get_pending(sd_event_source* source) const = 0;
82     virtual int sd_event_source_get_priority(sd_event_source* source,
83                                              int64_t* priority) const = 0;
84     virtual int sd_event_source_set_priority(sd_event_source* source,
85                                              int64_t priority) const = 0;
86     virtual int sd_event_source_get_enabled(sd_event_source* source,
87                                             int* enabled) const = 0;
88     virtual int sd_event_source_set_enabled(sd_event_source* source,
89                                             int enabled) const = 0;
90     virtual int sd_event_source_get_io_fd(sd_event_source* source) const = 0;
91     virtual int sd_event_source_set_io_fd(sd_event_source* source,
92                                           int fd) const = 0;
93     virtual int sd_event_source_get_io_events(sd_event_source* source,
94                                               uint32_t* events) const = 0;
95     virtual int sd_event_source_set_io_events(sd_event_source* source,
96                                               uint32_t events) const = 0;
97     virtual int sd_event_source_get_io_revents(sd_event_source* source,
98                                                uint32_t* revents) const = 0;
99     virtual int sd_event_source_get_time(sd_event_source* source,
100                                          uint64_t* usec) const = 0;
101     virtual int sd_event_source_set_time(sd_event_source* source,
102                                          uint64_t usec) const = 0;
103     virtual int sd_event_source_get_time_accuracy(sd_event_source* source,
104                                                   uint64_t* usec) const = 0;
105     virtual int sd_event_source_set_time_accuracy(sd_event_source* source,
106                                                   uint64_t usec) const = 0;
107     virtual int sd_event_source_get_signal(sd_event_source* source) const = 0;
108     virtual int sd_event_source_get_child_pid(sd_event_source* source,
109                                               pid_t* pid) const = 0;
110     virtual int sd_event_source_set_destroy_callback(
111         sd_event_source* source, sd_event_destroy_t callback) const = 0;
112     virtual int sd_event_source_get_destroy_callback(
113         sd_event_source* source, sd_event_destroy_t* callback) const = 0;
114     virtual int sd_event_source_set_floating(sd_event_source* source,
115                                              int b) const = 0;
116     virtual int sd_event_source_get_floating(sd_event_source* source) const = 0;
117 };
118 
119 /** @class SdEventImpl
120  *  @brief sd_event concrete implementation
121  *  @details Uses libsystemd to handle all sd_event calls
122  */
123 class SdEventImpl : public SdEvent
124 {
125   public:
126     int sd_event_default(sd_event** event) const override;
127     int sd_event_new(sd_event** event) const override;
128     sd_event* sd_event_ref(sd_event* event) const override;
129     sd_event* sd_event_unref(sd_event* event) const override;
130 
131     int sd_event_add_io(sd_event* event, sd_event_source** source, int fd,
132                         uint32_t events, sd_event_io_handler_t callback,
133                         void* userdata) const override;
134     int sd_event_add_time(sd_event* event, sd_event_source** source,
135                           clockid_t clock, uint64_t usec, uint64_t accuracy,
136                           sd_event_time_handler_t callback,
137                           void* userdata) const override;
138 
sd_event_add_signal(sd_event * event,sd_event_source ** source,int sig,sd_event_signal_handler_t callback,void * userdata) const139     int sd_event_add_signal(sd_event* event, sd_event_source** source, int sig,
140                             sd_event_signal_handler_t callback,
141                             void* userdata) const override
142     {
143         return ::sd_event_add_signal(event, source, sig, callback, userdata);
144     }
145 
sd_event_add_child(sd_event * event,sd_event_source ** source,pid_t pid,int options,sd_event_child_handler_t callback,void * userdata) const146     int sd_event_add_child(sd_event* event, sd_event_source** source, pid_t pid,
147                            int options, sd_event_child_handler_t callback,
148                            void* userdata) const override
149     {
150         return ::sd_event_add_child(event, source, pid, options, callback,
151                                     userdata);
152     }
153 
154     int sd_event_add_defer(sd_event* event, sd_event_source** source,
155                            sd_event_handler_t callback,
156                            void* userdata) const override;
157     int sd_event_add_post(sd_event* event, sd_event_source** source,
158                           sd_event_handler_t callback,
159                           void* userdata) const override;
160     int sd_event_add_exit(sd_event* event, sd_event_source** source,
161                           sd_event_handler_t callback,
162                           void* userdata) const override;
163 
164     int sd_event_prepare(sd_event* event) const override;
165     int sd_event_wait(sd_event* event, uint64_t usec) const override;
166     int sd_event_dispatch(sd_event* event) const override;
167     int sd_event_run(sd_event* event, uint64_t usec) const override;
168     int sd_event_loop(sd_event* event) const override;
169     int sd_event_exit(sd_event* event, int code) const override;
170 
171     int sd_event_now(sd_event* event, clockid_t clock,
172                      uint64_t* usec) const override;
173 
174     int sd_event_get_exit_code(sd_event* event, int* code) const override;
175     int sd_event_get_watchdog(sd_event* event) const override;
176     int sd_event_set_watchdog(sd_event* event, int b) const override;
177 
178     sd_event_source*
179         sd_event_source_ref(sd_event_source* source) const override;
180     sd_event_source*
181         sd_event_source_unref(sd_event_source* source) const override;
182 
183     void* sd_event_source_get_userdata(sd_event_source* source) const override;
184     void* sd_event_source_set_userdata(sd_event_source* source,
185                                        void* userdata) const override;
186 
187     int sd_event_source_get_description(
188         sd_event_source* source, const char** description) const override;
189     int sd_event_source_set_description(sd_event_source* source,
190                                         const char* description) const override;
191     int sd_event_source_set_prepare(sd_event_source* source,
192                                     sd_event_handler_t callback) const override;
193     int sd_event_source_get_pending(sd_event_source* source) const override;
194     int sd_event_source_get_priority(sd_event_source* source,
195                                      int64_t* priority) const override;
196     int sd_event_source_set_priority(sd_event_source* source,
197                                      int64_t priority) const override;
198     int sd_event_source_get_enabled(sd_event_source* source,
199                                     int* enabled) const override;
200     int sd_event_source_set_enabled(sd_event_source* source,
201                                     int enabled) const override;
202     int sd_event_source_get_io_fd(sd_event_source* source) const override;
203     int sd_event_source_set_io_fd(sd_event_source* source,
204                                   int fd) const override;
205     int sd_event_source_get_io_events(sd_event_source* source,
206                                       uint32_t* events) const override;
207     int sd_event_source_set_io_events(sd_event_source* source,
208                                       uint32_t events) const override;
209     int sd_event_source_get_io_revents(sd_event_source* source,
210                                        uint32_t* revents) const override;
211     int sd_event_source_get_time(sd_event_source* source,
212                                  uint64_t* usec) const override;
213     int sd_event_source_set_time(sd_event_source* source,
214                                  uint64_t usec) const override;
215     int sd_event_source_get_time_accuracy(sd_event_source* source,
216                                           uint64_t* usec) const override;
217     int sd_event_source_set_time_accuracy(sd_event_source* source,
218                                           uint64_t usec) const override;
219     int sd_event_source_get_signal(sd_event_source* source) const override;
220     int sd_event_source_get_child_pid(sd_event_source* source,
221                                       pid_t* pid) const override;
222     int sd_event_source_set_destroy_callback(
223         sd_event_source* source, sd_event_destroy_t callback) const override;
224     int sd_event_source_get_destroy_callback(
225         sd_event_source* source, sd_event_destroy_t* callback) const override;
226     int sd_event_source_set_floating(sd_event_source* source,
227                                      int b) const override;
228     int sd_event_source_get_floating(sd_event_source* source) const override;
229 };
230 
231 /** @brief Default instantiation of sd_event
232  */
233 extern SdEventImpl sdevent_impl;
234 
235 } // namespace internal
236 } // namespace sdeventplus
237