xref: /openbmc/pldm/fw-update/watch.hpp (revision 4d8d57701e18e7eb209c6dad5d13b847c5e4d92e)
1*4d8d5770STom Joseph #pragma once
2*4d8d5770STom Joseph 
3*4d8d5770STom Joseph #include <systemd/sd-event.h>
4*4d8d5770STom Joseph 
5*4d8d5770STom Joseph #include <functional>
6*4d8d5770STom Joseph #include <string>
7*4d8d5770STom Joseph 
8*4d8d5770STom Joseph namespace pldm
9*4d8d5770STom Joseph {
10*4d8d5770STom Joseph 
11*4d8d5770STom Joseph namespace fw_update
12*4d8d5770STom Joseph {
13*4d8d5770STom Joseph 
14*4d8d5770STom Joseph /** @class Watch
15*4d8d5770STom Joseph  *
16*4d8d5770STom Joseph  *  @brief Adds inotify watch on software image upload directory
17*4d8d5770STom Joseph  *
18*4d8d5770STom Joseph  *  The inotify watch is hooked up with sd-event, so that on call back,
19*4d8d5770STom Joseph  *  appropriate actions related to a software image upload can be taken.
20*4d8d5770STom Joseph  */
21*4d8d5770STom Joseph class Watch
22*4d8d5770STom Joseph {
23*4d8d5770STom Joseph   public:
24*4d8d5770STom Joseph     /** @brief ctor - hook inotify watch with sd-event
25*4d8d5770STom Joseph      *
26*4d8d5770STom Joseph      *  @param[in] loop - sd-event object
27*4d8d5770STom Joseph      *  @param[in] imageCallback - The callback function for processing
28*4d8d5770STom Joseph      *                             the image
29*4d8d5770STom Joseph      */
30*4d8d5770STom Joseph     Watch(sd_event* loop, std::function<int(std::string&)> imageCallback);
31*4d8d5770STom Joseph 
32*4d8d5770STom Joseph     Watch(const Watch&) = delete;
33*4d8d5770STom Joseph     Watch& operator=(const Watch&) = delete;
34*4d8d5770STom Joseph     Watch(Watch&&) = delete;
35*4d8d5770STom Joseph     Watch& operator=(Watch&&) = delete;
36*4d8d5770STom Joseph 
37*4d8d5770STom Joseph     /** @brief dtor - remove inotify watch and close fd's
38*4d8d5770STom Joseph      */
39*4d8d5770STom Joseph     ~Watch();
40*4d8d5770STom Joseph 
41*4d8d5770STom Joseph   private:
42*4d8d5770STom Joseph     /** @brief sd-event callback
43*4d8d5770STom Joseph      *
44*4d8d5770STom Joseph      *  @param[in] s - event source, floating (unused) in our case
45*4d8d5770STom Joseph      *  @param[in] fd - inotify fd
46*4d8d5770STom Joseph      *  @param[in] revents - events that matched for fd
47*4d8d5770STom Joseph      *  @param[in] userdata - pointer to Watch object
48*4d8d5770STom Joseph      *  @returns 0 on success, -1 on fail
49*4d8d5770STom Joseph      */
50*4d8d5770STom Joseph     static int callback(sd_event_source* s, int fd, uint32_t revents,
51*4d8d5770STom Joseph                         void* userdata);
52*4d8d5770STom Joseph 
53*4d8d5770STom Joseph     /** @brief image upload directory watch descriptor */
54*4d8d5770STom Joseph     int wd = -1;
55*4d8d5770STom Joseph 
56*4d8d5770STom Joseph     /** @brief inotify file descriptor */
57*4d8d5770STom Joseph     int fd = -1;
58*4d8d5770STom Joseph 
59*4d8d5770STom Joseph     /** @brief The callback function for processing the image. */
60*4d8d5770STom Joseph     std::function<int(std::string&)> imageCallback;
61*4d8d5770STom Joseph };
62*4d8d5770STom Joseph 
63*4d8d5770STom Joseph } // namespace fw_update
64*4d8d5770STom Joseph } // namespace pldm
65