blob: 2e0ec17a31dffb761f071a7e66c75484a39d7a76 [file] [log] [blame]
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -05001#pragma once
2
3#include <systemd/sd-event.h>
4#include <unistd.h>
5
Gunnar Millsf6ed5892018-09-07 17:08:02 -05006#include <functional>
7#include <memory>
Andrew Geisslerab139ce2020-05-16 13:22:09 -05008#include <string>
Gunnar Millsf6ed5892018-09-07 17:08:02 -05009
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050010namespace openpower
11{
12namespace software
13{
14namespace updater
15{
16
17/* Need a custom deleter for freeing up sd_event_source */
18struct EventSourceDeleter
19{
20 void operator()(sd_event_source* eventSource) const
21 {
Lei YU1db9adf2019-03-05 16:02:31 +080022 sd_event_source_unref(eventSource);
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050023 }
24};
25using EventSourcePtr = std::unique_ptr<sd_event_source, EventSourceDeleter>;
26
27/** @struct CustomFd
28 *
29 * RAII wrapper for file descriptor.
30 */
31struct CustomFd
32{
Adriana Kobylak70dcb632018-02-27 15:46:52 -060033 public:
34 CustomFd() = delete;
35 CustomFd(const CustomFd&) = delete;
36 CustomFd& operator=(const CustomFd&) = delete;
37 CustomFd(CustomFd&&) = delete;
38 CustomFd& operator=(CustomFd&&) = delete;
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050039
Adriana Kobylak70dcb632018-02-27 15:46:52 -060040 /** @brief Saves File descriptor and uses it to do file operation
41 *
42 * @param[in] fd - File descriptor
43 */
Lei YU1db9adf2019-03-05 16:02:31 +080044 explicit CustomFd(int fd) : fd(fd)
Adriana Kobylak70dcb632018-02-27 15:46:52 -060045 {
46 }
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050047
Adriana Kobylak70dcb632018-02-27 15:46:52 -060048 ~CustomFd()
49 {
50 if (fd >= 0)
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050051 {
Adriana Kobylak70dcb632018-02-27 15:46:52 -060052 close(fd);
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050053 }
Adriana Kobylak70dcb632018-02-27 15:46:52 -060054 }
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050055
Adriana Kobylak70dcb632018-02-27 15:46:52 -060056 int operator()() const
57 {
58 return fd;
59 }
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050060
Adriana Kobylak70dcb632018-02-27 15:46:52 -060061 private:
62 /** @brief File descriptor */
63 int fd = -1;
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050064};
65
66/** @class Watch
67 *
68 * @brief Adds inotify watch on PNOR symlinks file to monitor for changes in
69 * "running" PNOR version
70 *
71 * The inotify watch is hooked up with sd-event, so that on call back,
72 * appropriate actions related to a change in the "running" PNOR version
73 * can be taken.
74 */
75class Watch
76{
Adriana Kobylak70dcb632018-02-27 15:46:52 -060077 public:
78 /** @brief ctor - hook inotify watch with sd-event
79 *
80 * @param[in] loop - sd-event object
81 * @param[in] functionalCallback - The callback function for updating
82 * the functional associations.
83 */
Lei YUf3ce4332019-02-21 14:09:49 +080084 Watch(sd_event* loop,
85 std::function<void(const std::string&)> functionalCallback);
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050086
Adriana Kobylak70dcb632018-02-27 15:46:52 -060087 Watch(const Watch&) = delete;
88 Watch& operator=(const Watch&) = delete;
89 Watch(Watch&&) = delete;
90 Watch& operator=(Watch&&) = delete;
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050091
Adriana Kobylak70dcb632018-02-27 15:46:52 -060092 /** @brief dtor - remove inotify watch
93 */
94 ~Watch();
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050095
Adriana Kobylak70dcb632018-02-27 15:46:52 -060096 private:
97 /** @brief sd-event callback
98 *
99 * @param[in] s - event source, floating (unused) in our case
100 * @param[in] fd - inotify fd
101 * @param[in] revents - events that matched for fd
102 * @param[in] userdata - pointer to Watch object
103 * @returns 0 on success, -1 on fail
104 */
105 static int callback(sd_event_source* s, int fd, uint32_t revents,
106 void* userdata);
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -0500107
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600108 /** initialize an inotify instance and returns file descriptor */
109 int inotifyInit();
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -0500110
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600111 /** @brief PNOR symlink file watch descriptor */
112 int wd = -1;
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -0500113
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600114 /** @brief event source */
115 EventSourcePtr eventSource;
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -0500116
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600117 /** @brief The callback function for updating the
118 functional associations. */
119 std::function<void(std::string&)> functionalCallback;
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -0500120
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600121 /** @brief inotify file descriptor */
122 CustomFd fd;
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -0500123};
124
125} // namespace updater
126} // namespace software
127} // namespace openpower