1pub mod capability;
7pub mod handle;
8pub mod introspection;
9
10use crate::fs::FileObject;
11use crate::ipc::StreamIpcOps;
12use crate::ipc::counter::{Counter, CounterObject};
13use crate::ipc::event::{EventChannelObject, EventSubscriptionObject};
14use crate::ipc::pipe::PipeObject;
15use crate::ipc::shared_memory::SharedMemoryObject;
16use alloc::sync::Arc;
17use capability::{CloneOps, ControlOps, MemoryMappingOps, Selectable, StreamOps};
18
19#[cfg(feature = "network")]
20use crate::network::SocketObject;
21
22pub enum KernelObject {
27 File(Arc<dyn FileObject>),
28 Pipe(Arc<dyn PipeObject>),
29 Counter(Arc<dyn CounterObject>),
30 EventChannel(Arc<EventChannelObject>),
31 EventSubscription(Arc<EventSubscriptionObject>),
32 #[cfg(feature = "network")]
33 Socket(Arc<dyn SocketObject>),
34 SharedMemory(Arc<dyn SharedMemoryObject>),
35 }
39
40impl KernelObject {
41 pub fn from_file_object(file_object: Arc<dyn FileObject>) -> Self {
43 KernelObject::File(file_object)
44 }
45
46 pub fn from_pipe_object(pipe_object: Arc<dyn PipeObject>) -> Self {
48 KernelObject::Pipe(pipe_object)
49 }
50
51 pub fn from_event_channel_object(event_channel: Arc<EventChannelObject>) -> Self {
53 KernelObject::EventChannel(event_channel)
54 }
55
56 pub fn from_event_subscription(event_subscription: Arc<EventSubscriptionObject>) -> Self {
58 KernelObject::EventSubscription(event_subscription)
59 }
60
61 #[cfg(feature = "network")]
63 pub fn from_socket_object(socket: Arc<dyn SocketObject>) -> Self {
64 KernelObject::Socket(socket)
65 }
66
67 pub fn from_shared_memory_object(shared_memory: Arc<dyn SharedMemoryObject>) -> Self {
69 KernelObject::SharedMemory(shared_memory)
70 }
71
72 pub fn from_counter(counter: Arc<Counter>) -> Self {
74 KernelObject::Counter(counter as Arc<dyn CounterObject>)
75 }
76
77 pub fn as_stream(&self) -> Option<&dyn StreamOps> {
79 match self {
80 KernelObject::File(file_object) => {
81 let stream_ops: &dyn StreamOps = file_object.as_ref();
83 Some(stream_ops)
84 }
85 KernelObject::Pipe(pipe_object) => {
86 let stream_ops: &dyn StreamOps = pipe_object.as_ref();
88 Some(stream_ops)
89 }
90 KernelObject::Counter(counter) => {
91 let stream_ops: &dyn StreamOps = counter.as_ref();
93 Some(stream_ops)
94 }
95 #[cfg(feature = "network")]
96 KernelObject::Socket(socket) => {
97 let stream_ops: &dyn StreamOps = socket.as_ref();
99 Some(stream_ops)
100 }
101 KernelObject::EventChannel(_) => {
102 None
104 }
105 KernelObject::EventSubscription(_) => {
106 None
108 }
109 KernelObject::SharedMemory(_) => {
110 None
112 }
113 }
114 }
115
116 pub fn as_stream_ipc(&self) -> Option<&dyn StreamIpcOps> {
118 match self {
119 KernelObject::File(_) => {
120 None
122 }
123 KernelObject::Pipe(pipe_object) => {
124 let stream_ipc_ops: &dyn StreamIpcOps = pipe_object.as_ref();
126 Some(stream_ipc_ops)
127 }
128 KernelObject::Counter(_) => {
129 None
131 }
132 #[cfg(feature = "network")]
133 KernelObject::Socket(socket) => {
134 let stream_ipc_ops: &dyn StreamIpcOps = socket.as_ref();
136 Some(stream_ipc_ops)
137 }
138 KernelObject::EventChannel(_) => {
139 None
141 }
142 KernelObject::EventSubscription(_) => {
143 None
145 }
146 KernelObject::SharedMemory(_) => {
147 None
149 }
150 }
151 }
152
153 pub fn as_file(&self) -> Option<&dyn FileObject> {
155 match self {
156 KernelObject::File(file_object) => {
157 let file_ops: &dyn FileObject = file_object.as_ref();
159 Some(file_ops)
160 }
161 KernelObject::Pipe(_) => {
162 None
164 }
165 KernelObject::Counter(_) => {
166 None
168 }
169 #[cfg(feature = "network")]
170 KernelObject::Socket(_) => {
171 None
173 }
174 KernelObject::EventChannel(_) => {
175 None
177 }
178 KernelObject::EventSubscription(_) => {
179 None
181 }
182 KernelObject::SharedMemory(_) => {
183 None
185 }
186 }
187 }
188
189 pub fn as_pipe(&self) -> Option<&dyn PipeObject> {
191 match self {
192 KernelObject::File(_) => {
193 None
195 }
196 KernelObject::Pipe(pipe_object) => {
197 let pipe_ops: &dyn PipeObject = pipe_object.as_ref();
198 Some(pipe_ops)
199 }
200 KernelObject::Counter(_) => {
201 None
203 }
204 #[cfg(feature = "network")]
205 KernelObject::Socket(_) => {
206 None
208 }
209 KernelObject::EventChannel(_) => {
210 None
212 }
213 KernelObject::EventSubscription(_) => {
214 None
216 }
217 KernelObject::SharedMemory(_) => {
218 None
220 }
221 }
222 }
223
224 #[cfg(feature = "network")]
226 pub fn as_socket(&self) -> Option<&dyn SocketObject> {
227 match self {
228 KernelObject::Socket(socket) => {
229 let socket_ops: &dyn SocketObject = socket.as_ref();
230 Some(socket_ops)
231 }
232 _ => None,
233 }
234 }
235
236 pub fn as_shared_memory(&self) -> Option<&dyn SharedMemoryObject> {
238 match self {
239 KernelObject::SharedMemory(shared_memory) => {
240 let shmem_ops: &dyn SharedMemoryObject = shared_memory.as_ref();
241 Some(shmem_ops)
242 }
243 _ => None,
244 }
245 }
246
247 pub fn as_cloneable(&self) -> Option<&dyn CloneOps> {
249 match self {
250 KernelObject::File(_) => {
251 None }
253 KernelObject::Pipe(pipe_object) => {
254 let cloneable: &dyn CloneOps = pipe_object.as_ref();
256 Some(cloneable)
257 }
258 KernelObject::Counter(counter) => {
259 let cloneable: &dyn CloneOps = counter.as_ref();
261 Some(cloneable)
262 }
263 #[cfg(feature = "network")]
264 KernelObject::Socket(_) => {
265 None
267 }
268 KernelObject::EventChannel(event_channel) => {
269 let cloneable: &dyn CloneOps = event_channel.as_ref();
271 Some(cloneable)
272 }
273 KernelObject::EventSubscription(event_subscription) => {
274 let cloneable: &dyn CloneOps = event_subscription.as_ref();
276 Some(cloneable)
277 }
278 KernelObject::SharedMemory(_) => {
279 None
281 }
282 }
283 }
284
285 pub fn as_control(&self) -> Option<&dyn ControlOps> {
287 match self {
288 KernelObject::File(file_object) => {
289 let control_ops: &dyn ControlOps = file_object.as_ref();
291 Some(control_ops)
292 }
293 KernelObject::Pipe(_) => {
294 None
296 }
297 KernelObject::Counter(_) => {
298 None
300 }
301 #[cfg(feature = "network")]
302 KernelObject::Socket(socket) => {
303 socket.as_control_ops()
305 }
306 KernelObject::EventChannel(_) => {
307 None
309 }
310 KernelObject::EventSubscription(_) => {
311 None
313 }
314 KernelObject::SharedMemory(_) => {
315 None
317 }
318 }
319 }
320
321 pub fn as_memory_mappable(&self) -> Option<&dyn MemoryMappingOps> {
323 match self {
324 KernelObject::File(file_object) => {
325 let memory_mapping_ops: &dyn MemoryMappingOps = file_object.as_ref();
327 Some(memory_mapping_ops)
328 }
329 KernelObject::Pipe(_) => {
330 None
332 }
333 KernelObject::Counter(_) => {
334 None
336 }
337 #[cfg(feature = "network")]
338 KernelObject::Socket(_) => {
339 None
341 }
342 KernelObject::EventChannel(_) => {
343 None
345 }
346 KernelObject::EventSubscription(_) => {
347 None
349 }
350 KernelObject::SharedMemory(shared_memory) => {
351 let memory_mapping_ops: &dyn MemoryMappingOps = shared_memory.as_ref();
353 Some(memory_mapping_ops)
354 }
355 }
356 }
357
358 pub fn as_memory_mappable_weak(&self) -> Option<alloc::sync::Weak<dyn MemoryMappingOps>> {
360 match self {
361 KernelObject::File(file_object) => {
362 let weak_file = Arc::downgrade(file_object);
365 Some(weak_file)
366 }
367 KernelObject::Pipe(_) => {
368 None
370 }
371 KernelObject::Counter(_) => {
372 None
374 }
375 #[cfg(feature = "network")]
376 KernelObject::Socket(_) => {
377 None
379 }
380 KernelObject::EventChannel(_) => {
381 None
383 }
384 KernelObject::EventSubscription(_) => {
385 None
387 }
388 KernelObject::SharedMemory(shared_memory) => {
389 let weak_shmem = Arc::downgrade(shared_memory);
392 Some(weak_shmem)
393 }
394 }
395 }
396
397 pub fn as_event_channel(&self) -> Option<&EventChannelObject> {
399 match self {
400 KernelObject::EventChannel(event_channel) => {
401 let event_channel_obj: &EventChannelObject = event_channel.as_ref();
402 Some(event_channel_obj)
403 }
404 _ => None,
405 }
406 }
407
408 pub fn as_event_subscription(&self) -> Option<&EventSubscriptionObject> {
410 match self {
411 KernelObject::EventSubscription(event_subscription) => {
412 let event_subscription_obj: &EventSubscriptionObject = event_subscription.as_ref();
413 Some(event_subscription_obj)
414 }
415 _ => None,
416 }
417 }
418
419 pub fn as_counter(&self) -> Option<&dyn CounterObject> {
421 match self {
422 KernelObject::Counter(counter) => {
423 let counter_obj: &dyn CounterObject = counter.as_ref();
424 Some(counter_obj)
425 }
426 _ => None,
427 }
428 }
429
430 pub fn as_selectable(&self) -> Option<&dyn Selectable> {
432 match self {
433 KernelObject::File(file_object) => {
434 let sel: &dyn Selectable = file_object.as_ref();
436 Some(sel)
437 }
438 KernelObject::Pipe(pipe_object) => pipe_object.as_selectable(),
439 KernelObject::Counter(counter) => {
440 let sel: &dyn Selectable = counter.as_ref();
442 Some(sel)
443 }
444 #[cfg(feature = "network")]
445 KernelObject::Socket(socket) => socket.as_selectable(),
446 KernelObject::EventChannel(_) => None,
447 KernelObject::EventSubscription(_) => None,
448 KernelObject::SharedMemory(_) => None,
449 }
450 }
451
452 pub fn arc_clone(&self) -> Self {
462 match self {
463 KernelObject::File(file_object) => KernelObject::File(Arc::clone(file_object)),
464 KernelObject::Pipe(pipe_object) => KernelObject::Pipe(Arc::clone(pipe_object)),
465 KernelObject::Counter(counter) => KernelObject::Counter(Arc::clone(counter)),
466 #[cfg(feature = "network")]
467 KernelObject::Socket(socket) => KernelObject::Socket(Arc::clone(socket)),
468 KernelObject::EventChannel(event_channel) => {
469 KernelObject::EventChannel(Arc::clone(event_channel))
470 }
471 KernelObject::EventSubscription(event_subscription) => {
472 KernelObject::EventSubscription(Arc::clone(event_subscription))
473 }
474 KernelObject::SharedMemory(shared_memory) => {
475 KernelObject::SharedMemory(Arc::clone(shared_memory))
476 }
477 }
478 }
479}
480
481impl Clone for KernelObject {
482 fn clone(&self) -> Self {
483 if let Some(cloneable) = self.as_cloneable() {
485 cloneable.custom_clone()
486 } else {
487 match self {
489 KernelObject::File(file_object) => KernelObject::File(Arc::clone(file_object)),
490 KernelObject::Pipe(pipe_object) => KernelObject::Pipe(Arc::clone(pipe_object)),
491 KernelObject::Counter(counter) => KernelObject::Counter(Arc::clone(counter)),
492 #[cfg(feature = "network")]
493 KernelObject::Socket(socket) => KernelObject::Socket(Arc::clone(socket)),
494 KernelObject::EventChannel(event_channel) => {
495 KernelObject::EventChannel(Arc::clone(event_channel))
496 }
497 KernelObject::EventSubscription(event_subscription) => {
498 KernelObject::EventSubscription(Arc::clone(event_subscription))
499 }
500 KernelObject::SharedMemory(shared_memory) => {
501 KernelObject::SharedMemory(Arc::clone(shared_memory))
502 }
503 }
504 }
505 }
506}
507
508#[cfg(test)]
509mod tests;