|
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 | 10 | use nix::fcntl;
|
10 |
| -use nix::sys::stat::{self, fchmod, fchmodat, futimens, stat, utimes, utimensat}; |
| 11 | +use nix::sys::stat::{self, fchmod, fchmodat, futimens, stat, utimes, utimensat, mkdirat}; |
11 | 12 | #[cfg(any(target_os = "linux",
|
12 | 13 | target_os = "haiku",
|
13 | 14 | target_os = "ios",
|
@@ -260,3 +261,36 @@ fn test_utimensat() {
|
260 | 261 | UtimensatFlags::FollowSymlink).unwrap();
|
261 | 262 | assert_times_eq(500, 800, &fs::metadata(&fullpath).unwrap());
|
262 | 263 | }
|
| 264 | + |
| 265 | +#[test] |
| 266 | +fn test_mkdirat_success_path() { |
| 267 | + let tempdir = tempfile::tempdir().unwrap(); |
| 268 | + let filename = "example_subdir"; |
| 269 | + let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap(); |
| 270 | + assert!((mkdirat(dirfd, filename, Mode::S_IRWXU)).is_ok()); |
| 271 | + assert!(Path::exists(&tempdir.path().join(filename))); |
| 272 | +} |
| 273 | + |
| 274 | +#[test] |
| 275 | +fn test_mkdirat_success_mode() { |
| 276 | + let expected_bits = stat::SFlag::S_IFDIR.bits() | stat::Mode::S_IRWXU.bits(); |
| 277 | + let tempdir = tempfile::tempdir().unwrap(); |
| 278 | + let filename = "example_subdir"; |
| 279 | + let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap(); |
| 280 | + assert!((mkdirat(dirfd, filename, Mode::S_IRWXU)).is_ok()); |
| 281 | + let permissions = fs::metadata(tempdir.path().join(filename)).unwrap().permissions(); |
| 282 | + let mode = permissions.mode(); |
| 283 | + assert_eq!(mode as mode_t, expected_bits) |
| 284 | +} |
| 285 | + |
| 286 | +#[test] |
| 287 | +#[should_panic="EACCES"] |
| 288 | +fn test_mkdirat_fail() { |
| 289 | + let tempdir = tempfile::tempdir().unwrap(); |
| 290 | + let filename = "example_subdir"; |
| 291 | + let mut perms = fs::metadata(tempdir.path()).unwrap().permissions(); |
| 292 | + perms.set_readonly(true); |
| 293 | + fs::set_permissions(tempdir.path(), perms).unwrap(); |
| 294 | + let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap(); |
| 295 | + let result = mkdirat(dirfd, filename, Mode::S_IRWXU).unwrap(); |
| 296 | +} |
0 commit comments