@@ -21,15 +21,32 @@ 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. `EFI_FILE_INFO` is the
39+ /// structure returned as the directory entry.
2840 ///
2941 /// # Arguments
3042 /// * `buffer` The target buffer of the read operation
3143 ///
32- /// # Errors
44+ /// # Return Value
45+ /// This method returns a UEFI [`Result`]. In the success case, this method returns the number
46+ /// of read bytes (0 is EOF) or, in the error case, with the required buffer size, if the
47+ /// provided buffer was too small.
48+ ///
49+ /// ## Status Error Codes
3350 /// * `uefi::Status::NO_MEDIA` The device has no media
3451 /// * `uefi::Status::DEVICE_ERROR` The device reported an error, the file was deleted,
3552 /// or the end of the file was reached before the `read()`.
@@ -38,10 +55,16 @@ impl RegularFile {
3855 /// and the required buffer size is provided as output.
3956 pub fn read ( & mut self , buffer : & mut [ u8 ] ) -> Result < usize , Option < usize > > {
4057 let mut buffer_size = buffer. len ( ) ;
41- unsafe { ( self . imp ( ) . read ) ( self . imp ( ) , & mut buffer_size, buffer. as_mut_ptr ( ) ) } . into_with (
58+ let status =
59+ unsafe { ( self . imp ( ) . read ) ( self . imp ( ) , & mut buffer_size, buffer. as_mut_ptr ( ) ) } ;
60+
61+ // Now, buffer_size is updated. It either contains the number of read bytes or the number
62+ // of required bytes to read the whole entry.
63+ status. into_with (
4264 || buffer_size,
43- |s| {
65+ |s : Status | {
4466 if s == Status :: BUFFER_TOO_SMALL {
67+ // This was updated to the required buffer size.
4568 Some ( buffer_size)
4669 } else {
4770 None
0 commit comments