@@ -8,6 +8,12 @@ use crate::c_types;
88use crate :: error:: { Error , KernelResult } ;
99use crate :: user_ptr:: { UserSlicePtr , UserSlicePtrReader , UserSlicePtrWriter } ;
1010
11+ bitflags:: bitflags! {
12+ pub struct FileFlags : c_types:: c_uint {
13+ const NONBLOCK = bindings:: O_NONBLOCK ;
14+ }
15+ }
16+
1117pub struct File {
1218 ptr : * const bindings:: file ,
1319}
@@ -20,6 +26,10 @@ impl File {
2026 pub fn pos ( & self ) -> u64 {
2127 unsafe { ( * self . ptr ) . f_pos as u64 }
2228 }
29+
30+ pub fn flags ( & self ) -> FileFlags {
31+ FileFlags :: from_bits_truncate ( unsafe { ( * self . ptr ) . f_flags } )
32+ }
2333}
2434
2535// Matches std::io::SeekFrom in the Rust stdlib
@@ -60,7 +70,7 @@ unsafe extern "C" fn read_callback<T: Read>(
6070 Ok ( v) => v,
6171 Err ( _) => return Error :: EINVAL . to_kernel_errno ( ) . try_into ( ) . unwrap ( ) ,
6272 } ;
63- match f. read ( & mut data, positive_offset) {
73+ match f. read ( & File :: from_ptr ( file ) , & mut data, positive_offset) {
6474 Ok ( ( ) ) => {
6575 let written = len - data. len ( ) ;
6676 ( * offset) += bindings:: loff_t:: try_from ( written) . unwrap ( ) ;
@@ -230,7 +240,7 @@ pub trait FileOperations: Sync + Sized {
230240pub trait Read {
231241 /// Reads data from this file to userspace. Corresponds to the `read`
232242 /// function pointer in `struct file_operations`.
233- fn read ( & self , buf : & mut UserSlicePtrWriter , offset : u64 ) -> KernelResult < ( ) > ;
243+ fn read ( & self , file : & File , buf : & mut UserSlicePtrWriter , offset : u64 ) -> KernelResult < ( ) > ;
234244}
235245
236246pub trait Write {
0 commit comments