Skip to content

Commit 5b04cab

Browse files
committed
add unix implementation for create_dir
1 parent 5fec5e5 commit 5b04cab

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

library/std/src/fs.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,6 +1613,33 @@ impl Dir {
16131613
self.inner.open_with(path, &opts.0).map(|f| File { inner: f })
16141614
}
16151615

1616+
/// Attempts to create a directory relative to this directory.
1617+
///
1618+
/// # Errors
1619+
///
1620+
/// This function will return an error in these (and other) situations:
1621+
/// * The path exists
1622+
/// * The process doesn't have permission to create the directory
1623+
///
1624+
/// # Examples
1625+
///
1626+
/// ```no_run
1627+
/// #![feature(dirfd)]
1628+
/// use std::{fs::{Dir, OpenOptions}, io::Read};
1629+
///
1630+
/// fn main() -> std::io::Result<()> {
1631+
/// let dir = Dir::new("foo")?;
1632+
/// let mut f = dir.open_with("bar.txt", OpenOptions::new().read(true))?;
1633+
/// let mut data = vec![];
1634+
/// f.read_to_end(&mut data)?;
1635+
/// Ok(())
1636+
/// }
1637+
/// ```
1638+
#[unstable(feature = "dirfd", issue = "120426")]
1639+
pub fn create_dir<P: AsRef<Path>>(&self, path: P) -> io::Result<()> {
1640+
self.inner.create_dir(path)
1641+
}
1642+
16161643
/// Attempts to remove a file relative to this directory.
16171644
///
16181645
/// # Errors

library/std/src/sys/fs/unix.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ use libc::{c_int, mode_t};
5454
#[cfg(target_os = "android")]
5555
use libc::{
5656
dirent as dirent64, fstat as fstat64, fstatat as fstatat64, ftruncate64, lseek64,
57-
lstat as lstat64, off64_t, open as open64, openat as openat64, renameat, stat as stat64,
58-
unlinkat,
57+
lstat as lstat64, mkdirat, off64_t, open as open64, openat as openat64, renameat,
58+
stat as stat64, unlinkat,
5959
};
6060
#[cfg(not(any(
6161
all(target_os = "linux", not(target_env = "musl")),
@@ -65,7 +65,7 @@ use libc::{
6565
)))]
6666
use libc::{
6767
dirent as dirent64, fstat as fstat64, ftruncate as ftruncate64, lseek as lseek64,
68-
lstat as lstat64, off_t as off64_t, open as open64, openat as openat64, renameat,
68+
lstat as lstat64, mkdirat, off_t as off64_t, open as open64, openat as openat64, renameat,
6969
stat as stat64, unlinkat,
7070
};
7171
#[cfg(any(
@@ -74,8 +74,8 @@ use libc::{
7474
target_os = "hurd"
7575
))]
7676
use libc::{
77-
dirent64, fstat64, ftruncate64, lseek64, lstat64, off64_t, open64, openat64, renameat, stat64,
78-
unlinkat,
77+
dirent64, fstat64, ftruncate64, lseek64, lstat64, mkdirat, off64_t, open64, openat64, renameat,
78+
stat64, unlinkat,
7979
};
8080

8181
use crate::ffi::{CStr, OsStr, OsString};
@@ -295,6 +295,10 @@ impl Dir {
295295
run_path_with_cstr(path.as_ref(), &|path| self.open_c(path, opts))
296296
}
297297

298+
pub fn create_dir<P: AsRef<Path>>(&self, path: P) -> io::Result<()> {
299+
run_path_with_cstr(path.as_ref(), &|path| self.create_dir_c(path))
300+
}
301+
298302
pub fn remove_file<P: AsRef<Path>>(&self, path: P) -> io::Result<()> {
299303
run_path_with_cstr(path.as_ref(), &|path| self.remove_c(path, false))
300304
}
@@ -335,6 +339,10 @@ impl Dir {
335339
Ok(Self(unsafe { OwnedFd::from_raw_fd(fd) }))
336340
}
337341

342+
pub fn create_dir_c(&self, path: &CStr) -> io::Result<()> {
343+
cvt(unsafe { mkdirat(self.0.as_raw_fd(), path.as_ptr(), 0o777) }).map(|_| ())
344+
}
345+
338346
pub fn remove_c(&self, path: &CStr, remove_dir: bool) -> io::Result<()> {
339347
cvt(unsafe {
340348
unlinkat(

library/std/src/sys/fs/windows.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -937,9 +937,9 @@ impl Dir {
937937
}
938938

939939
pub fn create_dir<P: AsRef<Path>>(&self, path: P) -> io::Result<()> {
940-
run_path_with_wcstr(path, &|path| {
941-
self.create_dir_native(path, &OpenOptions::new()).map(|_| ())
942-
})
940+
let mut opts = OpenOptions::new();
941+
opts.write(true);
942+
run_path_with_wcstr(path, &|path| self.create_dir_native(path, &opts).map(|_| ()))
943943
}
944944

945945
pub fn remove_file<P: AsRef<Path>>(&self, path: P) -> io::Result<()> {

0 commit comments

Comments
 (0)