22#![ feature( const_str_as_bytes) ]
33
44use core:: sync:: atomic:: { AtomicBool , Ordering } ;
5+ use core:: convert:: TryInto ;
56
67use serde:: Serialize ;
78use serde_json_core;
89
9- use linux_kernel_module:: sysctl:: Sysctl ;
10+ use linux_kernel_module:: sysctl:: { Sysctl , SysctlStorage } ;
1011use linux_kernel_module:: Mode ;
12+ use linux_kernel_module:: error;
1113use 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+ }
1257
1358struct 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 ,
1763}
1864
1965#[ derive( Serialize ) ]
@@ -25,40 +71,33 @@ struct Output {
2571
2672impl linux_kernel_module:: KernelModule for JsonSysctlModule {
2773 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 ( ) ?;
2877 Ok ( JsonSysctlModule {
29- a : Sysctl :: register (
78+ _a : Sysctl :: register (
3079 "json-sysctl\x00 " ,
3180 "a\x00 " ,
32- AtomicBool :: new ( false ) ,
81+ Reference ( & A ) ,
3382 Mode :: from_int ( 0o666 ) ,
3483 ) ?,
35- b : Sysctl :: register (
84+ _b : Sysctl :: register (
3685 "json-sysctl\x00 " ,
3786 "b\x00 " ,
38- AtomicBool :: new ( false ) ,
87+ Reference ( & B ) ,
3988 Mode :: from_int ( 0o666 ) ,
4089 ) ?,
41- c : Sysctl :: register (
90+ _c : Sysctl :: register (
4291 "json-sysctl\x00 " ,
4392 "c\x00 " ,
44- AtomicBool :: new ( false ) ,
93+ Reference ( & C ) ,
4594 Mode :: from_int ( 0o666 ) ,
4695 ) ?,
96+ _chrdev_registration : chrdev_registration,
4797 } )
4898 }
4999}
50100
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-
62101linux_kernel_module:: kernel_module!(
63102 JsonSysctlModule ,
64103 author: "Alex Gaynor and Geoffrey Thomas" ,
0 commit comments