2
2
#![ feature( const_str_as_bytes) ]
3
3
4
4
use core:: sync:: atomic:: { AtomicBool , Ordering } ;
5
+ use core:: convert:: TryInto ;
5
6
6
7
use serde:: Serialize ;
7
8
use serde_json_core;
8
9
9
- use linux_kernel_module:: sysctl:: Sysctl ;
10
+ use linux_kernel_module:: sysctl:: { Sysctl , SysctlStorage } ;
10
11
use linux_kernel_module:: Mode ;
12
+ use linux_kernel_module:: error;
11
13
use linux_kernel_module:: println;
14
+ use linux_kernel_module:: user_ptr:: UserSlicePtrWriter ;
15
+
16
+ struct Reference ( & ' static AtomicBool ) ;
17
+
18
+ impl SysctlStorage for Reference {
19
+ fn store_value ( & self , data : & [ u8 ] ) -> ( usize , error:: KernelResult < ( ) > ) {
20
+ self . 0 . store_value ( & * data)
21
+ }
22
+ fn read_value ( & self , data : & mut UserSlicePtrWriter ) -> ( usize , error:: KernelResult < ( ) > ) {
23
+ self . 0 . read_value ( & mut * data)
24
+ }
25
+ }
26
+
27
+ static A : AtomicBool = AtomicBool :: new ( false ) ;
28
+ static B : AtomicBool = AtomicBool :: new ( false ) ;
29
+ static C : AtomicBool = AtomicBool :: new ( false ) ;
30
+
31
+ struct JsonChrdev ;
32
+
33
+ impl linux_kernel_module:: chrdev:: FileOperations for JsonChrdev {
34
+ const VTABLE : linux_kernel_module:: chrdev:: FileOperationsVtable =
35
+ linux_kernel_module:: chrdev:: FileOperationsVtable :: new :: < Self > ( ) ;
36
+
37
+ fn open ( ) -> linux_kernel_module:: KernelResult < Self > {
38
+ Ok ( JsonChrdev )
39
+ }
40
+
41
+ fn read (
42
+ & self ,
43
+ buf : & mut linux_kernel_module:: user_ptr:: UserSlicePtrWriter ,
44
+ offset : i64 ,
45
+ ) -> linux_kernel_module:: KernelResult < ( ) > {
46
+ let o = Output {
47
+ a : A . load ( Ordering :: Relaxed ) ,
48
+ b : B . load ( Ordering :: Relaxed ) ,
49
+ c : C . load ( Ordering :: Relaxed ) ,
50
+ } ;
51
+ let mut s = serde_json_core:: to_string :: < typenum:: U32 , _ > ( & o) . map_err ( |_| error:: Error :: ENOMEM ) ?;
52
+ s. push_str ( "\n " ) . map_err ( |_| error:: Error :: ENOMEM ) ?;
53
+ buf. write ( & s. into_bytes ( ) [ offset. try_into ( ) ?..] ) ?;
54
+ Ok ( ( ) )
55
+ }
56
+ }
12
57
13
58
struct JsonSysctlModule {
14
- a : Sysctl < AtomicBool > ,
15
- b : Sysctl < AtomicBool > ,
16
- c : Sysctl < AtomicBool > ,
59
+ _a : Sysctl < Reference > ,
60
+ _b : Sysctl < Reference > ,
61
+ _c : Sysctl < Reference > ,
62
+ _chrdev_registration : linux_kernel_module:: chrdev:: Registration ,
17
63
}
18
64
19
65
#[ derive( Serialize ) ]
@@ -25,40 +71,33 @@ struct Output {
25
71
26
72
impl linux_kernel_module:: KernelModule for JsonSysctlModule {
27
73
fn init ( ) -> linux_kernel_module:: KernelResult < Self > {
74
+ let chrdev_registration = linux_kernel_module:: chrdev:: builder ( "json\x00 " , 0 ..1 ) ?
75
+ . register_device :: < JsonChrdev > ( )
76
+ . build ( ) ?;
28
77
Ok ( JsonSysctlModule {
29
- a : Sysctl :: register (
78
+ _a : Sysctl :: register (
30
79
"json-sysctl\x00 " ,
31
80
"a\x00 " ,
32
- AtomicBool :: new ( false ) ,
81
+ Reference ( & A ) ,
33
82
Mode :: from_int ( 0o666 ) ,
34
83
) ?,
35
- b : Sysctl :: register (
84
+ _b : Sysctl :: register (
36
85
"json-sysctl\x00 " ,
37
86
"b\x00 " ,
38
- AtomicBool :: new ( false ) ,
87
+ Reference ( & B ) ,
39
88
Mode :: from_int ( 0o666 ) ,
40
89
) ?,
41
- c : Sysctl :: register (
90
+ _c : Sysctl :: register (
42
91
"json-sysctl\x00 " ,
43
92
"c\x00 " ,
44
- AtomicBool :: new ( false ) ,
93
+ Reference ( & C ) ,
45
94
Mode :: from_int ( 0o666 ) ,
46
95
) ?,
96
+ _chrdev_registration : chrdev_registration,
47
97
} )
48
98
}
49
99
}
50
100
51
- impl Drop for JsonSysctlModule {
52
- fn drop ( & mut self ) {
53
- let o = Output {
54
- a : self . a . get ( ) . load ( Ordering :: Relaxed ) ,
55
- b : self . b . get ( ) . load ( Ordering :: Relaxed ) ,
56
- c : self . c . get ( ) . load ( Ordering :: Relaxed ) ,
57
- } ;
58
- println ! ( "{}" , serde_json_core:: to_string:: <typenum:: U32 , _>( & o) . unwrap( ) ) ;
59
- }
60
- }
61
-
62
101
linux_kernel_module:: kernel_module!(
63
102
JsonSysctlModule ,
64
103
author: "Alex Gaynor and Geoffrey Thomas" ,
0 commit comments