1pub mod capability;
7pub mod introspection;
8pub mod handle;
9
10use alloc::{sync::Arc, vec::Vec};
11use crate::fs::FileObject;
12use crate::ipc::pipe::PipeObject;
13use capability::{StreamOps, CloneOps};
14
15pub enum KernelObject {
17 File(Arc<dyn FileObject>),
18 Pipe(Arc<dyn PipeObject>),
19 }
23
24impl KernelObject {
25 pub fn from_file_object(file_object: Arc<dyn FileObject>) -> Self {
27 KernelObject::File(file_object)
28 }
29
30 pub fn from_pipe_object(pipe_object: Arc<dyn PipeObject>) -> Self {
32 KernelObject::Pipe(pipe_object)
33 }
34
35 pub fn as_stream(&self) -> Option<&dyn StreamOps> {
37 match self {
38 KernelObject::File(file_object) => {
39 let stream_ops: &dyn StreamOps = file_object.as_ref();
41 Some(stream_ops)
42 }
43 KernelObject::Pipe(pipe_object) => {
44 let stream_ops: &dyn StreamOps = pipe_object.as_ref();
46 Some(stream_ops)
47 }
48 }
49 }
50
51 pub fn as_file(&self) -> Option<&dyn FileObject> {
53 match self {
54 KernelObject::File(file_object) => {
55 let file_ops: &dyn FileObject = file_object.as_ref();
57 Some(file_ops)
58 }
59 KernelObject::Pipe(_) => {
60 None
62 }
63 }
64 }
65
66 pub fn as_pipe(&self) -> Option<&dyn PipeObject> {
68 match self {
69 KernelObject::File(_) => {
70 None
72 }
73 KernelObject::Pipe(pipe_object) => {
74 let pipe_ops: &dyn PipeObject = pipe_object.as_ref();
75 Some(pipe_ops)
76 }
77 }
78 }
79
80 pub fn as_cloneable(&self) -> Option<&dyn CloneOps> {
82 match self {
83 KernelObject::File(_) => {
84 None }
86 KernelObject::Pipe(pipe_object) => {
87 let cloneable: &dyn CloneOps = pipe_object.as_ref();
89 Some(cloneable)
90 }
91 }
92 }
93}
94
95impl Clone for KernelObject {
96 fn clone(&self) -> Self {
97 if let Some(cloneable) = self.as_cloneable() {
99 cloneable.custom_clone()
100 } else {
101 match self {
103 KernelObject::File(file_object) => {
104 KernelObject::File(Arc::clone(file_object))
105 }
106 KernelObject::Pipe(pipe_object) => {
107 KernelObject::Pipe(Arc::clone(pipe_object))
108 }
109 }
110 }
111 }
112}
113
114#[cfg(test)]
115mod tests;