@@ -21,15 +21,31 @@ impl RegularFile {
2121 Self ( handle)
2222 }
2323
24- /// Read data from file
24+ /// Read data from a file, hence, a regular file or a directory.
2525 ///
26- /// Try to read as much as possible into `buffer`. Returns the number of bytes that were
27- /// actually read.
26+ /// # Read from Regular Files
27+ /// If `self` is not a directory, the function reads the requested number of bytes from the file
28+ /// at the file’s current position and returns them in `buffer`. If the read goes beyond the end
29+ /// of the file, the read length is truncated to the end of the file. The file’s current
30+ /// position is increased by the number of bytes returned.
31+ ///
32+ /// # Read from Directory
33+ /// If `self` is a directory, the function reads the directory entry at the file’s current
34+ /// position and returns the entry in `buffer`. If the `buffer` is not large enough to hold the
35+ /// current directory entry, then `EFI_BUFFER_TOO_SMALL` is returned and the current file
36+ /// position is not updated. `buffer_size` is set to be the size of the buffer needed to read
37+ /// the entry. On success, the current position is updated to the next directory entry. If there
38+ /// are no more directory entries, the read returns a zero-length buffer.
2839 ///
2940 /// # Arguments
3041 /// * `buffer` The target buffer of the read operation
3142 ///
32- /// # Errors
43+ /// # Return Value
44+ /// This method returns a UEFI [`Result`]. In the success case, this method returns the number
45+ /// of read bytes (0 is EOF) or, in the error case, with the required buffer size, if the
46+ /// provided buffer was too small.
47+ ///
48+ /// ## Status Error Codes
3349 /// * `uefi::Status::NO_MEDIA` The device has no media
3450 /// * `uefi::Status::DEVICE_ERROR` The device reported an error, the file was deleted,
3551 /// or the end of the file was reached before the `read()`.
@@ -38,10 +54,16 @@ impl RegularFile {
3854 /// and the required buffer size is provided as output.
3955 pub fn read ( & mut self , buffer : & mut [ u8 ] ) -> Result < usize , Option < usize > > {
4056 let mut buffer_size = buffer. len ( ) ;
41- unsafe { ( self . imp ( ) . read ) ( self . imp ( ) , & mut buffer_size, buffer. as_mut_ptr ( ) ) } . into_with (
57+ let status =
58+ unsafe { ( self . imp ( ) . read ) ( self . imp ( ) , & mut buffer_size, buffer. as_mut_ptr ( ) ) } ;
59+
60+ // Now, buffer_size is updated. It either contains the number of read bytes or the number
61+ // of required bytes to read the whole entry.
62+ status. into_with (
4263 || buffer_size,
43- |s| {
64+ |s : Status | {
4465 if s == Status :: BUFFER_TOO_SMALL {
66+ // This was updated to the required buffer size.
4567 Some ( buffer_size)
4668 } else {
4769 None
0 commit comments