Module Name: src Committed By: pooka Date: Mon Jul 26 14:53:52 UTC 2010
Modified Files: src/tests/fs/common: puffs.c Log Message: catch "child died" To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/tests/fs/common/puffs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/fs/common/puffs.c diff -u src/tests/fs/common/puffs.c:1.3 src/tests/fs/common/puffs.c:1.4 --- src/tests/fs/common/puffs.c:1.3 Mon Jul 19 16:09:08 2010 +++ src/tests/fs/common/puffs.c Mon Jul 26 14:53:52 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs.c,v 1.3 2010/07/19 16:09:08 pooka Exp $ */ +/* $NetBSD: puffs.c,v 1.4 2010/07/26 14:53:52 pooka Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -39,6 +39,7 @@ #include <pthread.h> #include <puffs.h> #include <puffsdump.h> +#include <signal.h> #include <stdio.h> #include <unistd.h> #include <string.h> @@ -215,6 +216,13 @@ pthread_detach(pt); } +static void +childfail(int sign) +{ + + atf_tc_fail("child died"); /* almost signal-safe */ +} + /* XXX: we don't support size */ int puffs_fstest_newfs(const atf_tc_t *tc, void **argp, @@ -222,7 +230,7 @@ { struct puffstestargs *args; char dtfs_path[MAXPATHLEN]; - char *dtfsargv[5]; + char *dtfsargv[6]; pid_t childpid; int *pflags; char comfd[16]; @@ -244,14 +252,17 @@ atf_tc_get_config_var(tc, "srcdir")); dtfsargv[0] = dtfs_path; dtfsargv[1] = __UNCONST("-i"); - dtfsargv[2] = __UNCONST("dtfs"); - dtfsargv[3] = __UNCONST("fictional"); - dtfsargv[4] = NULL; + dtfsargv[2] = __UNCONST("-s"); + dtfsargv[3] = __UNCONST("dtfs"); + dtfsargv[4] = __UNCONST("fictional"); + dtfsargv[5] = NULL; /* Create sucketpair for communication with the real file server */ if (socketpair(PF_LOCAL, SOCK_STREAM, 0, sv) == -1) return errno; + signal(SIGCHLD, childfail); + switch ((childpid = fork())) { case 0: close(sv[1]); @@ -324,7 +335,8 @@ if (rump_sys_mount(MOUNT_PUFFS, path, flags, pargs->pta_pargs, pargs->pta_pargslen) == -1) { - printf("%d\n", errno); + /* apply "to kill a child" to avoid atf hang (kludge) */ + kill(pargs->pta_childpid, SIGKILL); return -1; } @@ -357,6 +369,9 @@ { int rv; + /* ok, child might exit here */ + signal(SIGCHLD, SIG_IGN); + rv = rump_sys_unmount(path, flags); if (rv) return rv;