Commit dcd64e9d authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Cyrill Gorcunov

zdtm: Test for UTS namespace

Plus a small infrastructure change to fork a test task
in a desired namespace.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 98f4c2e4
......@@ -28,6 +28,9 @@ $ZP/static/zombie00
$ZP/static/cmdlinenv00
$ZP/static/socket_listen"
NS_TEST_LIST="\
$ZP/static/utsname"
CRTOOLS=`pwd`/`dirname $0`/../crtools
run_test()
......@@ -43,13 +46,13 @@ run_test()
dump_path=`pwd`"/"$ddump
mkdir -p $ddump
ls -l /proc/$pid/fd/
setsid $CRTOOLS dump -D $ddump -o dump.log -t $pid || return 1
setsid $CRTOOLS dump -D $ddump -o dump.log -t $pid $2 || return 1
while :; do
killall -9 $tname &> /dev/null || break;
echo Waiting...
sleep 1
done
setsid $CRTOOLS restore -D $ddump -o restore.log -d -t $pid || return 2
setsid $CRTOOLS restore -D $ddump -o restore.log -d -t $pid $2 || return 2
ls -l /proc/$pid/fd/
make -C $tdir $tname.out
for i in `seq 50`; do
......@@ -65,12 +68,20 @@ cd `dirname $0` || exit 1
if [ $# -eq 0 ]; then
for t in $TEST_LIST; do
run_test $t || exit 1
run_test $t "" || exit 1
done
for t in $NS_TEST_LIST; do
run_test $t "-n" || exit 1
done
elif [ "$1" == "-l" ]; then
echo $TEST_LIST | sed -e "s#$ZP/##g" -e 's/ /\n/g'
echo $NS_TEST_LIST | sed -e "s#$ZP/##g" -e 's/ /\n/g'
else
run_test $ZP/$1 && exit 0
if echo "$NS_TEST_LIST" | fgrep -q "$1" ; then
run_test "$ZP/$1" "-n" && exit 0
else
run_test "$ZP/$1" && exit 0
fi
result=$?
echo "====================== ERROR ======================"
if [ $result == 1 ]; then
......
......@@ -7,6 +7,7 @@
#include <time.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "zdtmtst.h"
......@@ -153,6 +154,113 @@ void test_init(int argc, char **argv)
srand48(time(NULL)); /* just in case we need it */
}
#define STACK_SIZE (8 * 4096)
struct zdtm_clone_arg {
int pidf;
void (*fn)(void);
};
static int do_test_fn(void *_arg)
{
struct zdtm_clone_arg *ca = _arg;
struct sigaction sa;
/* record the test pid to remember the ownership of the pidfile */
master_pid = getpid();
fclose(ca->pidf);
sigemptyset(&sa.sa_mask);
sa.sa_handler = SIG_DFL;
if (sigaction(SIGCHLD, &sa, NULL)) {
err("Can't reset SIGCHLD handler: %m\n");
exit(1);
}
if (setsid() < 0) {
err("Can't become session group leader: %m\n");
exit(1);
}
srand48(time(NULL)); /* just in case we need it */
ca->fn();
exit(0);
}
void test_init_ns(int argc, char **argv, unsigned long clone_flags, void (*fn)(void))
{
extern void parseargs(int, char **);
pid_t pid;
static FILE *pidf;
struct sigaction sa = {
.sa_handler = sig_hand,
};
struct zdtm_clone_arg ca;
void *stack;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGTERM, &sa, NULL)) {
fprintf(stderr, "Can't set SIGTERM handler: %m\n");
exit(1);
}
if (sigaction(SIGCHLD, &sa, NULL)) {
fprintf(stderr, "Can't set SIGCHLD handler: %m\n");
exit(1);
}
parseargs(argc, argv);
setup_outfile();
redir_stdfds();
pidf = fopen(pidfile, "wx");
if (!pidf) {
err("Can't create pid file %s: %m\n", pidfile);
exit(1);
}
stack = mmap(NULL, STACK_SIZE, PROT_WRITE | PROT_READ,
MAP_PRIVATE | MAP_GROWSDOWN | MAP_ANONYMOUS, -1, 0);
if (stack == MAP_FAILED) {
err("Can't map stack\n");
exit(1);
}
ca.pidf = pidf;
ca.fn = fn;
pid = clone(do_test_fn, stack + STACK_SIZE, clone_flags | SIGCHLD, &ca);
if (pid < 0) {
err("Daemonizing failed: %m\n");
exit(1);
}
/* parent will exit when the child is ready */
test_waitsig();
if (sig_received == SIGCHLD) {
int ret;
waitpid(pid, &ret, 0);
if (WIFEXITED(ret)) {
err("Test exited with unexpectedly with code %d\n", WEXITSTATUS(ret));
exit(0);
}
if (WIFSIGNALED(ret)) {
err("Test exited on unexpected signal %d\n", WTERMSIG(ret));
exit(0);
}
}
fprintf(pidf, "%d\n", pid);
fclose(pidf);
_exit(0);
}
void test_daemon()
{
pid_t ppid;
......
......@@ -5,6 +5,12 @@
/* set up test */
extern void test_init(int argc, char **argv);
extern void test_init_ns(int argc, char **argv, unsigned long clone_flags, void (*fn)(void));
#ifndef CLONE_NEWUTS
#define CLONE_NEWUTS 0x04000000
#endif
/*wrapper for fork: init log offset*/
extern int test_fork();
/* finish setting up the test, write out pid file, and go to background */
......
......@@ -28,6 +28,7 @@ TST_NOFILE = \
pthread00 \
vdso00 \
cmdlinenv00 \
utsname \
# jobctl00 \
TST_FILE = \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment