Skip to content

Commit a1b46c3

Browse files
committed
Implement unlinkat - Update comments to unlink at and breakup tests
Changes made based on comments from pull request nix-rust#1058
1 parent c0b9a84 commit a1b46c3

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

src/unistd.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,8 +1154,10 @@ pub enum UnlinkatFlags {
11541154
/// Remove a directory entry
11551155
///
11561156
/// In the case of a relative path, the directory entry to be removed is determined relative to
1157-
/// the directory associated with the file descriptor dirfd. If flag is UnlinkatFlags::RemoveDir
1158-
/// then remove the directory entry specified by dirfd and path is performed.
1157+
/// the directory associated with the file descriptor `dirfd` or the current working directory
1158+
/// if `dirfd` is `None`. In the case of an absolute `path` `dirfd` is ignored. If `flag` is
1159+
/// `UnlinkatFlags::RemoveDir` then removal of the directory entry specified by `dirfd` and `path`
1160+
/// is performed.
11591161
///
11601162
/// # References
11611163
/// See also [unlinkat(2)](http://pubs.opengroup.org/onlinepubs/9699919799/functions/unlinkat.html)

test/test_unistd.rs

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -602,37 +602,58 @@ fn test_symlinkat() {
602602

603603

604604
#[test]
605-
fn test_unlinkat() {
605+
#[should_panic]
606+
fn test_unlinkat_dir_noremovedir() {
606607
let tempdir = tempfile::tempdir().unwrap();
607-
let filename = "foo.txt";
608608
let dirname = "foo_dir";
609-
let filepath = tempdir.path().join(filename);
610609
let dirpath = tempdir.path().join(dirname);
611610

612-
// Create file
613-
File::create(&filepath).unwrap();
614-
615611
// Create dir
616612
DirBuilder::new().recursive(true).create(&dirpath).unwrap();
617613

618614
// Get file descriptor for base directory
619615
let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap();
620616

621617
// Attempt unlink dir at relative path without proper flag
622-
panic::set_hook(Box::new(|_info| {}));
623-
let result = std::panic::catch_unwind(|| unlinkat(Some(dirfd), dirname, UnlinkatFlags::NoRemoveDir).unwrap());
624-
assert!(result.is_err());
618+
unlinkat(Some(dirfd), dirname, UnlinkatFlags::NoRemoveDir).unwrap();
625619
assert!(dirpath.exists());
620+
}
621+
622+
#[test]
623+
fn test_unlinkat_dir_removedir() {
624+
let tempdir = tempfile::tempdir().unwrap();
625+
let dirname = "foo_dir";
626+
let dirpath = tempdir.path().join(dirname);
627+
628+
// Create dir
629+
DirBuilder::new().recursive(true).create(&dirpath).unwrap();
630+
631+
// Get file descriptor for base directory
632+
let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap();
626633

627634
// Attempt unlink dir at relative path with proper flag
628635
unlinkat(Some(dirfd), dirname, UnlinkatFlags::RemoveDir).unwrap();
629636
assert!(!dirpath.exists());
637+
}
638+
639+
#[test]
640+
fn test_unlinkat_file() {
641+
let tempdir = tempfile::tempdir().unwrap();
642+
let filename = "foo.txt";
643+
let filepath = tempdir.path().join(filename);
644+
645+
// Create file
646+
File::create(&filepath).unwrap();
647+
648+
// Get file descriptor for base directory
649+
let dirfd = fcntl::open(tempdir.path(), fcntl::OFlag::empty(), stat::Mode::empty()).unwrap();
630650

631651
// Attempt unlink file at relative path
632652
unlinkat(Some(dirfd), filename, UnlinkatFlags::NoRemoveDir).unwrap();
633653
assert!(!filepath.exists());
634654
}
635655

656+
636657
#[test]
637658
fn test_access_not_existing() {
638659
let tempdir = tempfile::tempdir().unwrap();

0 commit comments

Comments
 (0)