Skip to content

Commit

Permalink
libredirect: Add a small test
Browse files Browse the repository at this point in the history
This is just a sanity check on whether the library correctly wraps the
syscalls and it's using the "true" executable for posix_spawn() and
execv().

The installCheckPhase is not executed if we are cross-compiling, so this
shouldn't break cross-compilation.

One thing I'm not actually sure is whether ${coreutils}/bin/true is
universally available on all the platforms, nor whether all the
functions we use in the test are available, but we can still fix that
after we've found out about that.

Signed-off-by: aszlig <aszlig@nix.build>
  • Loading branch information
aszlig committed Nov 12, 2018
1 parent ba1fddb commit 34dd1c6
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 2 deletions.
22 changes: 20 additions & 2 deletions pkgs/build-support/libredirect/default.nix
Original file line number Diff line number Diff line change
@@ -1,21 +1,39 @@
{ stdenv }:
{ stdenv, coreutils }:

stdenv.mkDerivation {
name = "libredirect-0";

unpackPhase = "cp ${./libredirect.c} libredirect.c";
unpackPhase = ''
cp ${./libredirect.c} libredirect.c
cp ${./test.c} test.c
'';

shlibext = stdenv.targetPlatform.extensions.sharedLibrary;

buildPhase = ''
$CC -Wall -std=c99 -O3 -shared libredirect.c \
-o "libredirect$shlibext" -fPIC -ldl
if [ -n "$doInstallCheck" ]; then
$CC -Wall -std=c99 -O3 test.c -o test
fi
'';

installPhase = ''
install -vD "libredirect$shlibext" "$out/lib/libredirect$shlibext"
'';

doInstallCheck = true;

installCheckPhase = if stdenv.isDarwin then ''
NIX_REDIRECTS="/foo/bar/test=${coreutils}/bin/true" \
DYLD_INSERT_LIBRARIES="$out/lib/libredirect$shlibext" \
DYLD_FORCE_FLAT_NAMESPACE=1 ./test
'' else ''
NIX_REDIRECTS="/foo/bar/test=${coreutils}/bin/true" \
LD_PRELOAD="$out/lib/libredirect$shlibext" ./test
'';

meta = {
platforms = stdenv.lib.platforms.unix;
description = "An LD_PRELOAD library to intercept and rewrite the paths in glibc calls";
Expand Down
59 changes: 59 additions & 0 deletions pkgs/build-support/libredirect/test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#include <assert.h>
#include <fcntl.h>
#include <spawn.h>
#include <stdio.h>
#include <unistd.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>

#define TESTPATH "/foo/bar/test"

extern char **environ;

void test_spawn(void) {
pid_t pid;
int ret;
posix_spawn_file_actions_t file_actions;
char *argv[] = {"true", NULL};

assert(posix_spawn_file_actions_init(&file_actions) == 0);

ret = posix_spawn(&pid, TESTPATH, &file_actions, NULL, argv, environ);

assert(ret == 0);
assert(waitpid(pid, NULL, 0) != -1);
}

void test_execv(void) {
char *argv[] = {"true", NULL};
assert(execv(TESTPATH, argv) == 0);
}

int main(void)
{
FILE *testfp;
int testfd;
struct stat testsb;

testfp = fopen(TESTPATH, "r");
assert(testfp != NULL);
fclose(testfp);

testfd = open(TESTPATH, O_RDONLY);
assert(testfd != -1);
close(testfd);

assert(access(TESTPATH, X_OK) == 0);

assert(stat(TESTPATH, &testsb) != -1);

test_spawn();
test_execv();

/* If all goes well, this is never reached because test_execv() replaces
* the current process.
*/
return 0;
}

0 comments on commit 34dd1c6

Please sign in to comment.