1ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry/* 2ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * Copyright (C) 2017 The Android Open Source Project 3ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * 4ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * Licensed under the Apache License, Version 2.0 (the "License"); 5ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * you may not use this file except in compliance with the License. 6ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * You may obtain a copy of the License at 7ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * 8ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * http://www.apache.org/licenses/LICENSE-2.0 9ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * 10ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * Unless required by applicable law or agreed to in writing, software 11ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * distributed under the License is distributed on an "AS IS" BASIS, 12ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * See the License for the specific language governing permissions and 14ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry * limitations under the License. 15ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry */ 16ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 17ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry#ifndef _INIT_UEVENT_LISTENER_H 18ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry#define _INIT_UEVENT_LISTENER_H 19ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 20ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry#include <dirent.h> 21ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 224cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patil#include <chrono> 23ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry#include <functional> 244cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patil#include <optional> 25ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 26ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry#include <android-base/unique_fd.h> 27ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 28ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry#include "uevent.h" 29ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 30ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry#define UEVENT_MSG_LEN 2048 31ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 3281f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherrynamespace android { 3381f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherrynamespace init { 3481f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherry 354cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patilenum class ListenerAction { 36ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry kStop = 0, // Stop regenerating uevents as we've handled the one(s) we're interested in. 37ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry kContinue, // Continue regenerating uevents as we haven't seen the one(s) we're interested in. 38ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry}; 39ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 404cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patilusing ListenerCallback = std::function<ListenerAction(const Uevent&)>; 41ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 42ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherryclass UeventListener { 43ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry public: 44ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry UeventListener(); 45ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 464cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patil void RegenerateUevents(const ListenerCallback& callback) const; 474cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patil ListenerAction RegenerateUeventsForPath(const std::string& path, 484cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patil const ListenerCallback& callback) const; 494cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patil void Poll(const ListenerCallback& callback, 504cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patil const std::optional<std::chrono::milliseconds> relative_timeout = {}) const; 51ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 52ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry private: 53ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry bool ReadUevent(Uevent* uevent) const; 544cbedee541d92b408c591e4fc16d88a0653c076cSandeep Patil ListenerAction RegenerateUeventsForDir(DIR* d, const ListenerCallback& callback) const; 55ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 56ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry android::base::unique_fd device_fd_; 57ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry}; 58ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry 5981f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherry} // namespace init 6081f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherry} // namespace android 6181f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherry 62ed506f7356346b74eabcf45e207f9afe54b63089Tom Cherry#endif 63