|
1 | | -use nix::fcntl::{fcntl, FcntlArg, FdFlag, open, OFlag, readlink}; |
| 1 | +use nix::fcntl::{self, fcntl, FcntlArg, FdFlag, open, OFlag, readlink}; |
2 | 2 | use nix::unistd::*; |
3 | 3 | use nix::unistd::ForkResult::*; |
4 | 4 | use nix::sys::signal::{SaFlags, SigAction, SigHandler, SigSet, Signal, sigaction}; |
5 | 5 | use nix::sys::wait::*; |
6 | 6 | use nix::sys::stat::{self, Mode, SFlag}; |
7 | 7 | use nix::errno::Errno; |
| 8 | +use nix::Error; |
8 | 9 | use std::{env, iter}; |
9 | 10 | use std::ffi::CString; |
10 | | -use std::fs::{self, File}; |
| 11 | +use std::fs::{self, DirBuilder, File}; |
11 | 12 | use std::io::Write; |
12 | 13 | use std::os::unix::prelude::*; |
13 | 14 | use tempfile::{self, tempfile}; |
@@ -599,6 +600,58 @@ fn test_symlinkat() { |
599 | 600 | ); |
600 | 601 | } |
601 | 602 |
|
| 603 | + |
| 604 | +#[test] |
| 605 | +fn test_unlinkat_dir_noremovedir() { |
| 606 | + let tempdir = tempfile::tempdir().unwrap(); |
| 607 | + let dirname = "foo_dir"; |
| 608 | + let dirpath = tempdir.path().join(dirname); |
| 609 | + |
| 610 | + // Create dir |
| 611 | + DirBuilder::new().recursive(true).create(&dirpath).unwrap(); |
| 612 | + |
| 613 | + // Get file descriptor for base directory |
| 614 | + let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap(); |
| 615 | + |
| 616 | + // Attempt unlink dir at relative path without proper flag |
| 617 | + let err_result = unlinkat(Some(dirfd), dirname, UnlinkatFlags::NoRemoveDir).unwrap_err(); |
| 618 | + assert!(err_result == Error::Sys(Errno::EISDIR) || err_result == Error::Sys(Errno::EPERM)); |
| 619 | + } |
| 620 | + |
| 621 | +#[test] |
| 622 | +fn test_unlinkat_dir_removedir() { |
| 623 | + let tempdir = tempfile::tempdir().unwrap(); |
| 624 | + let dirname = "foo_dir"; |
| 625 | + let dirpath = tempdir.path().join(dirname); |
| 626 | + |
| 627 | + // Create dir |
| 628 | + DirBuilder::new().recursive(true).create(&dirpath).unwrap(); |
| 629 | + |
| 630 | + // Get file descriptor for base directory |
| 631 | + let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap(); |
| 632 | + |
| 633 | + // Attempt unlink dir at relative path with proper flag |
| 634 | + unlinkat(Some(dirfd), dirname, UnlinkatFlags::RemoveDir).unwrap(); |
| 635 | + assert!(!dirpath.exists()); |
| 636 | + } |
| 637 | + |
| 638 | +#[test] |
| 639 | +fn test_unlinkat_file() { |
| 640 | + let tempdir = tempfile::tempdir().unwrap(); |
| 641 | + let filename = "foo.txt"; |
| 642 | + let filepath = tempdir.path().join(filename); |
| 643 | + |
| 644 | + // Create file |
| 645 | + File::create(&filepath).unwrap(); |
| 646 | + |
| 647 | + // Get file descriptor for base directory |
| 648 | + let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap(); |
| 649 | + |
| 650 | + // Attempt unlink file at relative path |
| 651 | + unlinkat(Some(dirfd), filename, UnlinkatFlags::NoRemoveDir).unwrap(); |
| 652 | + assert!(!filepath.exists()); |
| 653 | + } |
| 654 | + |
602 | 655 | #[test] |
603 | 656 | fn test_access_not_existing() { |
604 | 657 | let tempdir = tempfile::tempdir().unwrap(); |
|
0 commit comments