38
38
#include " firmware_handler.h"
39
39
#include " modalias_handler.h"
40
40
#include " selinux.h"
41
+ #include " uevent_handler.h"
41
42
#include " uevent_listener.h"
42
43
#include " ueventd_parser.h"
43
44
#include " util.h"
@@ -107,11 +108,10 @@ namespace init {
107
108
108
109
class ColdBoot {
109
110
public:
110
- ColdBoot (UeventListener& uevent_listener, DeviceHandler& device_handler,
111
- ModaliasHandler& modalias_handler )
111
+ ColdBoot (UeventListener& uevent_listener,
112
+ std::vector<std::unique_ptr<UeventHandler>>& uevent_handlers )
112
113
: uevent_listener_(uevent_listener),
113
- device_handler_ (device_handler),
114
- modalias_handler_(modalias_handler),
114
+ uevent_handlers_ (uevent_handlers),
115
115
num_handler_subprocesses_(std::thread::hardware_concurrency() ?: 4) {}
116
116
117
117
void Run ();
@@ -124,8 +124,7 @@ class ColdBoot {
124
124
void WaitForSubProcesses ();
125
125
126
126
UeventListener& uevent_listener_;
127
- DeviceHandler& device_handler_;
128
- ModaliasHandler& modalias_handler_;
127
+ std::vector<std::unique_ptr<UeventHandler>>& uevent_handlers_;
129
128
130
129
unsigned int num_handler_subprocesses_;
131
130
std::vector<Uevent> uevent_queue_;
@@ -136,16 +135,16 @@ class ColdBoot {
136
135
void ColdBoot::UeventHandlerMain (unsigned int process_num, unsigned int total_processes) {
137
136
for (unsigned int i = process_num; i < uevent_queue_.size (); i += total_processes) {
138
137
auto & uevent = uevent_queue_[i];
139
- device_handler_.HandleDeviceEvent (uevent);
140
- modalias_handler_.HandleModaliasEvent (uevent);
138
+
139
+ for (auto & uevent_handler : uevent_handlers_) {
140
+ uevent_handler->HandleUevent (uevent);
141
+ }
141
142
}
142
143
_exit (EXIT_SUCCESS);
143
144
}
144
145
145
146
void ColdBoot::RegenerateUevents () {
146
147
uevent_listener_.RegenerateUevents ([this ](const Uevent& uevent) {
147
- HandleFirmwareEvent (uevent);
148
-
149
148
uevent_queue_.emplace_back (std::move (uevent));
150
149
return ListenerAction::kContinue ;
151
150
});
@@ -168,7 +167,6 @@ void ColdBoot::ForkSubProcesses() {
168
167
169
168
void ColdBoot::DoRestoreCon () {
170
169
selinux_android_restorecon (" /sys" , SELINUX_ANDROID_RESTORECON_RECURSE);
171
- device_handler_.set_skip_restorecon (false );
172
170
}
173
171
174
172
void ColdBoot::WaitForSubProcesses () {
@@ -234,8 +232,7 @@ int ueventd_main(int argc, char** argv) {
234
232
SelinuxSetupKernelLogging ();
235
233
SelabelInitialize ();
236
234
237
- DeviceHandler device_handler;
238
- ModaliasHandler modalias_handler;
235
+ std::vector<std::unique_ptr<UeventHandler>> uevent_handlers;
239
236
UeventListener uevent_listener;
240
237
241
238
{
@@ -248,30 +245,38 @@ int ueventd_main(int argc, char** argv) {
248
245
ParseConfig ({" /ueventd.rc" , " /vendor/ueventd.rc" , " /odm/ueventd.rc" ,
249
246
" /ueventd." + hardware + " .rc" });
250
247
251
- device_handler = DeviceHandler{std::move (ueventd_configuration.dev_permissions ),
252
- std::move (ueventd_configuration.sysfs_permissions ),
253
- std::move (ueventd_configuration.subsystems ),
254
- fs_mgr_get_boot_devices (), true };
248
+ uevent_handlers.emplace_back (std::make_unique<DeviceHandler>(
249
+ std::move (ueventd_configuration.dev_permissions ),
250
+ std::move (ueventd_configuration.sysfs_permissions ),
251
+ std::move (ueventd_configuration.subsystems ), fs_mgr_get_boot_devices (), true ));
252
+ uevent_handlers.emplace_back (std::make_unique<FirmwareHandler>(
253
+ std::move (ueventd_configuration.firmware_directories )));
255
254
256
- firmware_directories = ueventd_configuration.firmware_directories ;
255
+ if (ueventd_configuration.enable_modalias_handling ) {
256
+ uevent_handlers.emplace_back (std::make_unique<ModaliasHandler>());
257
+ }
257
258
}
258
259
259
260
if (access (COLDBOOT_DONE, F_OK) != 0 ) {
260
- ColdBoot cold_boot (uevent_listener, device_handler, modalias_handler );
261
+ ColdBoot cold_boot (uevent_listener, uevent_handlers );
261
262
cold_boot.Run ();
262
263
}
263
264
265
+ for (auto & uevent_handler : uevent_handlers) {
266
+ uevent_handler->ColdbootDone ();
267
+ }
268
+
264
269
// We use waitpid() in ColdBoot, so we can't ignore SIGCHLD until now.
265
270
signal (SIGCHLD, SIG_IGN);
266
271
// Reap and pending children that exited between the last call to waitpid() and setting SIG_IGN
267
272
// for SIGCHLD above.
268
273
while (waitpid (-1 , nullptr , WNOHANG) > 0 ) {
269
274
}
270
275
271
- uevent_listener.Poll ([&device_handler, &modalias_handler ](const Uevent& uevent) {
272
- HandleFirmwareEvent (uevent);
273
- modalias_handler. HandleModaliasEvent (uevent);
274
- device_handler. HandleDeviceEvent (uevent);
276
+ uevent_listener.Poll ([&uevent_handlers ](const Uevent& uevent) {
277
+ for ( auto & uevent_handler : uevent_handlers) {
278
+ uevent_handler-> HandleUevent (uevent);
279
+ }
275
280
return ListenerAction::kContinue ;
276
281
});
277
282
0 commit comments