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
10
use linux_kernel_module:: sysctl:: Sysctl ;
10
11
use linux_kernel_module:: Mode ;
11
- use linux_kernel_module:: println;
12
+ use linux_kernel_module:: error;
13
+
14
+ static A : AtomicBool = AtomicBool :: new ( false ) ;
15
+ static B : AtomicBool = AtomicBool :: new ( false ) ;
16
+ static C : AtomicBool = AtomicBool :: new ( false ) ;
17
+
18
+ struct JsonChrdev ;
19
+
20
+ impl linux_kernel_module:: chrdev:: FileOperations for JsonChrdev {
21
+ const VTABLE : linux_kernel_module:: chrdev:: FileOperationsVtable =
22
+ linux_kernel_module:: chrdev:: FileOperationsVtable :: new :: < Self > ( ) ;
23
+
24
+ fn open ( ) -> linux_kernel_module:: KernelResult < Self > {
25
+ Ok ( JsonChrdev )
26
+ }
27
+
28
+ fn read (
29
+ & self ,
30
+ buf : & mut linux_kernel_module:: user_ptr:: UserSlicePtrWriter ,
31
+ offset : i64 ,
32
+ ) -> linux_kernel_module:: KernelResult < ( ) > {
33
+ let o = Output {
34
+ a : A . load ( Ordering :: Relaxed ) ,
35
+ b : B . load ( Ordering :: Relaxed ) ,
36
+ c : C . load ( Ordering :: Relaxed ) ,
37
+ } ;
38
+ let mut s = serde_json_core:: to_string :: < typenum:: U32 , _ > ( & o) . map_err ( |_| error:: Error :: ENOMEM ) ?;
39
+ s. push_str ( "\n " ) . map_err ( |_| error:: Error :: ENOMEM ) ?;
40
+ buf. write ( & s. into_bytes ( ) [ offset. try_into ( ) ?..] ) ?;
41
+ Ok ( ( ) )
42
+ }
43
+ }
12
44
13
45
struct JsonSysctlModule {
14
- a : Sysctl < AtomicBool > ,
15
- b : Sysctl < AtomicBool > ,
16
- c : Sysctl < AtomicBool > ,
46
+ _a : Sysctl < & ' static AtomicBool > ,
47
+ _b : Sysctl < & ' static AtomicBool > ,
48
+ _c : Sysctl < & ' static AtomicBool > ,
49
+ _chrdev_registration : linux_kernel_module:: chrdev:: Registration ,
17
50
}
18
51
19
52
#[ derive( Serialize ) ]
@@ -25,40 +58,33 @@ struct Output {
25
58
26
59
impl linux_kernel_module:: KernelModule for JsonSysctlModule {
27
60
fn init ( ) -> linux_kernel_module:: KernelResult < Self > {
61
+ let chrdev_registration = linux_kernel_module:: chrdev:: builder ( "json\x00 " , 0 ..1 ) ?
62
+ . register_device :: < JsonChrdev > ( )
63
+ . build ( ) ?;
28
64
Ok ( JsonSysctlModule {
29
- a : Sysctl :: register (
65
+ _a : Sysctl :: register (
30
66
"json-sysctl\x00 " ,
31
67
"a\x00 " ,
32
- AtomicBool :: new ( false ) ,
68
+ & A ,
33
69
Mode :: from_int ( 0o666 ) ,
34
70
) ?,
35
- b : Sysctl :: register (
71
+ _b : Sysctl :: register (
36
72
"json-sysctl\x00 " ,
37
73
"b\x00 " ,
38
- AtomicBool :: new ( false ) ,
74
+ & B ,
39
75
Mode :: from_int ( 0o666 ) ,
40
76
) ?,
41
- c : Sysctl :: register (
77
+ _c : Sysctl :: register (
42
78
"json-sysctl\x00 " ,
43
79
"c\x00 " ,
44
- AtomicBool :: new ( false ) ,
80
+ & C ,
45
81
Mode :: from_int ( 0o666 ) ,
46
82
) ?,
83
+ _chrdev_registration : chrdev_registration,
47
84
} )
48
85
}
49
86
}
50
87
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
88
linux_kernel_module:: kernel_module!(
63
89
JsonSysctlModule ,
64
90
author: "Alex Gaynor and Geoffrey Thomas" ,
0 commit comments