@@ -25,23 +25,49 @@ module! {
25
25
license: "GPL" ,
26
26
}
27
27
28
- struct RustProc { }
28
+ struct RustProc {
29
+ parent : * mut bindings:: proc_dir_entry ,
30
+ _entry : * mut bindings:: proc_dir_entry ,
31
+ }
29
32
30
33
impl RustProc {
31
34
unsafe extern "C" fn proc_open (
32
35
_inode : * mut bindings:: inode ,
33
36
_file : * mut bindings:: file ,
34
37
) -> i32 {
38
+ pr_info ! ( "proc_open is invoked\n " ) ;
39
+ pr_info ! ( "proc_open is invoked\n " ) ;
40
+ pr_info ! ( "proc_open is invoked\n " ) ;
41
+ pr_info ! ( "proc_open is invoked\n " ) ;
42
+ pr_info ! ( "proc_open is invoked\n " ) ;
43
+ pr_info ! ( "proc_open is invoked\n " ) ;
44
+ pr_info ! ( "proc_open is invoked\n " ) ;
45
+ pr_info ! ( "proc_open is invoked\n " ) ;
46
+ pr_info ! ( "proc_open is invoked\n " ) ;
47
+ pr_info ! ( "proc_open is invoked\n " ) ;
48
+ pr_info ! ( "proc_open is invoked\n " ) ;
49
+ pr_info ! ( "proc_open is invoked\n " ) ;
50
+ pr_info ! ( "proc_open is invoked\n " ) ;
51
+ pr_info ! ( "proc_open is invoked\n " ) ;
52
+ pr_info ! ( "proc_open is invoked\n " ) ;
53
+ pr_info ! ( "proc_open is invoked\n " ) ;
54
+ pr_info ! ( "proc_open is invoked\n " ) ;
55
+ pr_info ! ( "proc_open is invoked\n " ) ;
56
+ pr_info ! ( "proc_open is invoked\n " ) ;
57
+ pr_info ! ( "proc_open is invoked\n " ) ;
58
+ pr_info ! ( "proc_open is invoked\n " ) ;
59
+ pr_info ! ( "proc_open is invoked\n " ) ;
60
+ pr_info ! ( "proc_open is invoked\n " ) ;
61
+
62
+ unsafe {
63
+ let ret = bindings:: single_open ( _file, Some ( Self :: proc_show) , ptr:: null_mut ( ) ) ;
64
+ }
35
65
0 as i32
36
66
}
37
67
38
- unsafe extern "C" fn proc_read (
39
- _file : * mut bindings:: file ,
40
- _buf : * mut core:: ffi:: c_char ,
41
- _len : usize ,
42
- _off : * mut bindings:: loff_t ,
43
- ) -> isize {
44
- 0 as isize
68
+ unsafe extern "C" fn proc_show ( _m : * mut bindings:: seq_file , _v : * mut core:: ffi:: c_void ) -> i32 {
69
+ pr_info ! ( "proc_read is invoked\n " ) ;
70
+ 0 as i32
45
71
}
46
72
}
47
73
@@ -58,29 +84,43 @@ impl kernel::Module for RustProc {
58
84
proc_get_unmapped_area : None , // mandatory to prevent build error
59
85
proc_read_iter : None , // mandatory to prevent build error
60
86
proc_open : Some ( Self :: proc_open) ,
61
- proc_read : Some ( Self :: proc_read ) ,
87
+ proc_read : None ,
62
88
proc_write : None ,
63
89
proc_lseek : None ,
64
90
proc_release : None ,
65
91
proc_poll : None ,
66
92
proc_ioctl : None ,
67
93
proc_mmap : None ,
68
94
} ;
95
+ let entry_name = CString :: try_from_fmt ( fmt ! ( "{}" , PROC_FS_NAME ) ) ?;
96
+ let entry: * mut bindings:: proc_dir_entry =
97
+ bindings:: proc_create ( entry_name. as_char_ptr ( ) , 0o644 , parent, & proc_ops) ;
98
+ // How to check entry?
99
+ if entry. is_null ( ) {
100
+ pr_info ! ( "failed to create a proc entry\n " ) ;
101
+ } else {
102
+ pr_info ! ( "succeeded to create a proc entry: {:p}\n " , entry) ;
103
+ }
69
104
70
- bindings:: proc_create (
71
- CString :: try_from_fmt ( fmt ! ( "{}" , PROC_FS_NAME ) ) ?. as_char_ptr ( ) ,
72
- 0o644 ,
105
+ Ok ( RustProc {
73
106
parent,
74
- & proc_ops ,
75
- ) ;
107
+ _entry : entry ,
108
+ } )
76
109
}
77
-
78
- Ok ( RustProc { } )
79
110
}
80
111
}
81
112
82
113
impl Drop for RustProc {
83
114
fn drop ( & mut self ) {
115
+ unsafe {
116
+ let entry_name = CString :: try_from_fmt ( fmt ! ( "{}" , PROC_FS_NAME ) ) . unwrap ( ) ;
117
+ bindings:: remove_proc_entry ( entry_name. as_char_ptr ( ) , self . parent ) ;
118
+
119
+ let dir_name = CString :: try_from_fmt ( fmt ! ( "{}" , SUB_DIR_NAME ) ) . unwrap ( ) ;
120
+ bindings:: remove_proc_entry ( dir_name. as_char_ptr ( ) , ptr:: null_mut ( ) ) ;
121
+ }
84
122
pr_info ! ( "rust_proc is unloaded\n " ) ;
85
123
}
86
124
}
125
+
126
+ unsafe impl Sync for RustProc { }
0 commit comments