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