|
1 | 1 | use std::fs::{self, File};
|
2 |
| -use std::os::unix::fs::symlink; |
| 2 | +use std::os::unix::fs::{symlink, PermissionsExt}; |
3 | 3 | use std::os::unix::prelude::AsRawFd;
|
4 | 4 | use std::time::{Duration, UNIX_EPOCH};
|
| 5 | +use std::path::Path; |
5 | 6 |
|
6 | 7 | #[cfg(not(any(target_os = "netbsd")))]
|
7 |
| -use libc::{S_IFMT, S_IFLNK}; |
| 8 | +use libc::{S_IFMT, S_IFLNK, mode_t}; |
8 | 9 |
|
9 |
| -use nix::fcntl; |
10 |
| -use nix::sys::stat::{self, fchmod, fchmodat, futimens, stat, utimes, utimensat}; |
| 10 | +use nix::{fcntl, Error}; |
| 11 | +use nix::errno::{Errno}; |
| 12 | +use nix::sys::stat::{self, fchmod, fchmodat, futimens, stat, utimes, utimensat, mkdirat}; |
11 | 13 | #[cfg(any(target_os = "linux",
|
12 | 14 | target_os = "haiku",
|
13 | 15 | target_os = "ios",
|
@@ -260,3 +262,35 @@ fn test_utimensat() {
|
260 | 262 | UtimensatFlags::FollowSymlink).unwrap();
|
261 | 263 | assert_times_eq(500, 800, &fs::metadata(&fullpath).unwrap());
|
262 | 264 | }
|
| 265 | + |
| 266 | +#[test] |
| 267 | +fn test_mkdirat_success_path() { |
| 268 | + let tempdir = tempfile::tempdir().unwrap(); |
| 269 | + let filename = "example_subdir"; |
| 270 | + let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap(); |
| 271 | + assert!((mkdirat(dirfd, filename, Mode::S_IRWXU)).is_ok()); |
| 272 | + assert!(Path::exists(&tempdir.path().join(filename))); |
| 273 | +} |
| 274 | + |
| 275 | +#[test] |
| 276 | +fn test_mkdirat_success_mode() { |
| 277 | + let expected_bits = stat::SFlag::S_IFDIR.bits() | stat::Mode::S_IRWXU.bits(); |
| 278 | + let tempdir = tempfile::tempdir().unwrap(); |
| 279 | + let filename = "example_subdir"; |
| 280 | + let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap(); |
| 281 | + assert!((mkdirat(dirfd, filename, Mode::S_IRWXU)).is_ok()); |
| 282 | + let permissions = fs::metadata(tempdir.path().join(filename)).unwrap().permissions(); |
| 283 | + let mode = permissions.mode(); |
| 284 | + assert_eq!(mode as mode_t, expected_bits) |
| 285 | +} |
| 286 | + |
| 287 | +#[test] |
| 288 | +fn test_mkdirat_fail() { |
| 289 | + let tempdir = tempfile::tempdir().unwrap(); |
| 290 | + let not_dir_filename= "example_not_dir"; |
| 291 | + let filename = "example_subdir_dir"; |
| 292 | + let dirfd = fcntl::open(&tempdir.path().join(not_dir_filename), fcntl::OFlag::O_CREAT, |
| 293 | + stat::Mode::empty()).unwrap(); |
| 294 | + let result = mkdirat(dirfd, filename, Mode::S_IRWXU).unwrap_err(); |
| 295 | + assert_eq!(result, Error::Sys(Errno::ENOTDIR)); |
| 296 | +} |
0 commit comments