@@ -950,21 +950,10 @@ impl LineEventHandle {
950
950
/// kernel for the line which matches the subscription criteria
951
951
/// specified in the `event_flags` when the handle was created.
952
952
pub fn get_event ( & self ) -> Result < LineEvent > {
953
- let mut data: ffi:: gpioevent_data = unsafe { mem:: zeroed ( ) } ;
954
- let mut data_as_buf = unsafe {
955
- slice:: from_raw_parts_mut (
956
- & mut data as * mut ffi:: gpioevent_data as * mut u8 ,
957
- mem:: size_of :: < ffi:: gpioevent_data > ( ) ,
958
- )
959
- } ;
960
- let bytes_read =
961
- nix:: unistd:: read ( self . file . as_raw_fd ( ) , & mut data_as_buf) . map_err ( event_err) ?;
962
-
963
- if bytes_read != mem:: size_of :: < ffi:: gpioevent_data > ( ) {
964
- let e = nix:: Error :: Sys ( nix:: errno:: Errno :: EIO ) ;
965
- Err ( event_err ( e) )
966
- } else {
967
- Ok ( LineEvent ( data) )
953
+ match self . read_event ( ) {
954
+ Ok ( Some ( event) ) => Ok ( event) ,
955
+ Ok ( None ) => Err ( event_err ( nix:: Error :: Sys ( nix:: errno:: Errno :: EIO ) ) ) ,
956
+ Err ( e) => Err ( event_err ( e) ) ,
968
957
}
969
958
}
970
959
@@ -984,6 +973,28 @@ impl LineEventHandle {
984
973
pub fn line ( & self ) -> & Line {
985
974
& self . line
986
975
}
976
+
977
+ /// Helper function which returns the line event if a complete event was read, Ok(None) if not
978
+ /// enough data was read or the error returned by `read()`.
979
+ ///
980
+ /// This function allows access to the raw `nix::Error` as required, for example, to theck
981
+ /// whether read() returned -EAGAIN.
982
+ pub ( crate ) fn read_event ( & self ) -> std:: result:: Result < Option < LineEvent > , nix:: Error > {
983
+ let mut data: ffi:: gpioevent_data = unsafe { mem:: zeroed ( ) } ;
984
+ let mut data_as_buf = unsafe {
985
+ slice:: from_raw_parts_mut (
986
+ & mut data as * mut ffi:: gpioevent_data as * mut u8 ,
987
+ mem:: size_of :: < ffi:: gpioevent_data > ( ) ,
988
+ )
989
+ } ;
990
+ let bytes_read = nix:: unistd:: read ( self . file . as_raw_fd ( ) , & mut data_as_buf) ?;
991
+
992
+ if bytes_read != mem:: size_of :: < ffi:: gpioevent_data > ( ) {
993
+ Ok ( None )
994
+ } else {
995
+ Ok ( Some ( LineEvent ( data) ) )
996
+ }
997
+ }
987
998
}
988
999
989
1000
impl AsRawFd for LineEventHandle {
@@ -997,21 +1008,9 @@ impl Iterator for LineEventHandle {
997
1008
type Item = Result < LineEvent > ;
998
1009
999
1010
fn next ( & mut self ) -> Option < Result < LineEvent > > {
1000
- let mut data: ffi:: gpioevent_data = unsafe { mem:: zeroed ( ) } ;
1001
- let mut data_as_buf = unsafe {
1002
- slice:: from_raw_parts_mut (
1003
- & mut data as * mut ffi:: gpioevent_data as * mut u8 ,
1004
- mem:: size_of :: < ffi:: gpioevent_data > ( ) ,
1005
- )
1006
- } ;
1007
- match nix:: unistd:: read ( self . file . as_raw_fd ( ) , & mut data_as_buf) {
1008
- Ok ( bytes_read) => {
1009
- if bytes_read != mem:: size_of :: < ffi:: gpioevent_data > ( ) {
1010
- None
1011
- } else {
1012
- Some ( Ok ( LineEvent ( data) ) )
1013
- }
1014
- }
1011
+ match self . read_event ( ) {
1012
+ Ok ( None ) => None ,
1013
+ Ok ( Some ( event) ) => Some ( Ok ( event) ) ,
1015
1014
Err ( e) => Some ( Err ( event_err ( e) ) ) ,
1016
1015
}
1017
1016
}
0 commit comments