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