Skip to content

Commit 64b5d33

Browse files
bors[bot]SteveLauC
andauthored
Merge #1919
1919: feat: I/O safety for 'sys/statfs' r=asomers a=SteveLauC ### What this PR does: 1. Adds I/O safety for module `sys/statfs`. This PR is pretty small as all we need to do is to change the interface of `fstatfs(2)`: from: ```rust pub fn fstatfs<T: AsRawFd>(fd: &T) -> Result<Statfs> ``` to: ```rust pub fn fstatfs<Fd: AsFd>(fd: &Fd) -> Result<Statfs> ``` ------ ~Besides from the changes in module `sys/statfs`, there are two extra places where care needs to be taken:~ ```shell $ cd nix # Search for the usage of `fstatfs(2)` in `nix` $ rg "fstatfs\(" test/test_fcntl.rs 386: let statfs = nix::sys::statfs::fstatfs(&tmp).unwrap(); 424: let statfs = nix::sys::statfs::fstatfs(&tmp).unwrap(); CHANGELOG.md 849:- Now functions `statfs()` and `fstatfs()` return result with `Statfs` wrapper src/sys/statfs.rs 769: check_fstatfs("/tmp"); 770: check_fstatfs("/dev"); 771: check_fstatfs("/run"); 772: check_fstatfs("/"); 775: fn check_fstatfs(path: &str) { 781: let fs = fstatfs(&file).unwrap(); 830: let fs = fstatfs(&file); ``` ~As you can see, `fstatfs(2)` is used in the tests in `test/test_fcntl.rs`:~ ```rust // Test code that involves `fstatfs(2)` let tmp: NamedTempFile = NamedTempFile::new().unwrap(); let fd = tmp.as_raw_fd(); let statfs = nix::sys::statfs::fstatfs(&tmp).unwrap(); ``` ~`tmp` is of type [`NamedTempFile`](https://docs.rs/tempfile/latest/tempfile/struct.NamedTempFile.html), which does not implement `AsFd` in the current implementation of `tempfile`, but the implementation should be easy as it contains `std::fs::File` internally:~ ```rust pub struct NamedTempFile { path: TempPath, file: File, } ``` ~So I am thinking about making a PR to `tempfile` to make `NamedTempFile` `AsFd`, any thoughts on this?~ Co-authored-by: Steve Lau <[email protected]>
2 parents a989fd5 + 7058bce commit 64b5d33

File tree

2 files changed

+5
-5
lines changed

2 files changed

+5
-5
lines changed

src/sys/statfs.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use std::ffi::CStr;
66
use std::fmt::{self, Debug};
77
use std::mem;
8-
use std::os::unix::io::AsRawFd;
8+
use std::os::unix::io::{AsFd, AsRawFd};
99

1010
use cfg_if::cfg_if;
1111

@@ -740,10 +740,10 @@ pub fn statfs<P: ?Sized + NixPath>(path: &P) -> Result<Statfs> {
740740
/// # Arguments
741741
///
742742
/// `fd` - File descriptor of any open file within the file system to describe
743-
pub fn fstatfs<T: AsRawFd>(fd: &T) -> Result<Statfs> {
743+
pub fn fstatfs<Fd: AsFd>(fd: &Fd) -> Result<Statfs> {
744744
unsafe {
745745
let mut stat = mem::MaybeUninit::<type_of_statfs>::uninit();
746-
Errno::result(LIBC_FSTATFS(fd.as_raw_fd(), stat.as_mut_ptr()))
746+
Errno::result(LIBC_FSTATFS(fd.as_fd().as_raw_fd(), stat.as_mut_ptr()))
747747
.map(|_| Statfs(stat.assume_init()))
748748
}
749749
}

test/test_fcntl.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ mod linux_android {
383383
let tmp = NamedTempFile::new().unwrap();
384384

385385
let fd = tmp.as_raw_fd();
386-
let statfs = nix::sys::statfs::fstatfs(&tmp).unwrap();
386+
let statfs = nix::sys::statfs::fstatfs(tmp.as_file()).unwrap();
387387
if statfs.filesystem_type() == nix::sys::statfs::OVERLAYFS_SUPER_MAGIC {
388388
// OverlayFS is a union file system. It returns one inode value in
389389
// stat(2), but a different one shows up in /proc/locks. So we must
@@ -421,7 +421,7 @@ mod linux_android {
421421
let tmp = NamedTempFile::new().unwrap();
422422

423423
let fd = tmp.as_raw_fd();
424-
let statfs = nix::sys::statfs::fstatfs(&tmp).unwrap();
424+
let statfs = nix::sys::statfs::fstatfs(tmp.as_file()).unwrap();
425425
if statfs.filesystem_type() == nix::sys::statfs::OVERLAYFS_SUPER_MAGIC {
426426
// OverlayFS is a union file system. It returns one inode value in
427427
// stat(2), but a different one shows up in /proc/locks. So we must

0 commit comments

Comments
 (0)