libredirect: add support for unlink, unlinkat, rmdir

add coverage of these and mkdir functions in tests
This commit is contained in:
Robert Scott 2022-01-16 15:42:07 +00:00
parent 8fd298a93a
commit b3a7dc22d1
3 changed files with 44 additions and 2 deletions

View file

@ -57,7 +57,7 @@ else stdenv.mkDerivation rec {
''}
if [ -n "$doInstallCheck" ]; then
$CC -Wall -std=c99 -O3 test.c -o test
$CC -Wall -std=c99 -D_POSIX_C_SOURCE=200809L -O3 test.c -o test
fi
runHook postBuild
@ -91,7 +91,7 @@ else stdenv.mkDerivation rec {
installCheckPhase = ''
(
source "$hook/nix-support/setup-hook"
NIX_REDIRECTS="/foo/bar/test=${coreutils}/bin/true" ./test
NIX_REDIRECTS="/foo/bar/test=${coreutils}/bin/true:/bar/baz=$(mktemp -d)" ./test
)
'';

View file

@ -354,3 +354,27 @@ WRAPPER(int, mkdirat)(int dirfd, const char *path, mode_t mode)
return mkdirat_real(dirfd, rewrite(path, buf), mode);
}
WRAPPER_DEF(mkdirat)
WRAPPER(int, unlink)(const char *path)
{
int (*unlink_real) (const char *path) = LOOKUP_REAL(unlink);
char buf[PATH_MAX];
return unlink_real(rewrite(path, buf));
}
WRAPPER_DEF(unlink)
WRAPPER(int, unlinkat)(int dirfd, const char *path, int flags)
{
int (*unlinkat_real) (int dirfd, const char *path, int flags) = LOOKUP_REAL(unlinkat);
char buf[PATH_MAX];
return unlinkat_real(dirfd, rewrite(path, buf), flags);
}
WRAPPER_DEF(unlinkat)
WRAPPER(int, rmdir)(const char *path)
{
int (*rmdir_real) (const char *path) = LOOKUP_REAL(rmdir);
char buf[PATH_MAX];
return rmdir_real(rewrite(path, buf));
}
WRAPPER_DEF(rmdir)

View file

@ -1,4 +1,5 @@
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <spawn.h>
#include <stdio.h>
@ -9,6 +10,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#define TESTDIR "/bar/baz"
#define TESTPATH "/foo/bar/test"
#define SUBTEST "./test sub"
@ -59,6 +61,22 @@ int main(int argc, char *argv[])
assert(stat(TESTPATH, &testsb) != -1);
assert(mkdir(TESTDIR "/dir-mkdir", 0777) == 0);
assert(unlink(TESTDIR "/dir-mkdir") == -1); // it's a directory!
#ifndef __APPLE__
assert(errno == EISDIR);
#endif
assert(rmdir(TESTDIR "/dir-mkdir") == 0);
assert(unlink(TESTDIR "/dir-mkdir") == -1);
assert(errno == ENOENT);
assert(mkdirat(123, TESTDIR "/dir-mkdirat", 0777) == 0);
assert(unlinkat(123, TESTDIR "/dir-mkdirat", 0) == -1); // it's a directory!
#ifndef __APPLE__
assert(errno == EISDIR);
#endif
assert(unlinkat(123, TESTDIR "/dir-mkdirat", AT_REMOVEDIR) == 0);
test_spawn();
test_system();