2004-08-04 Roland McGrath <roland@redhat.com>

* posix/tst-waitid.c (do_test): Kill the child process when bailing
	out early on some failure.
This commit is contained in:
Roland McGrath 2004-08-04 21:38:39 +00:00
parent 40962f02f9
commit 44219bd981
1 changed files with 39 additions and 33 deletions

View File

@ -58,6 +58,9 @@ do_test (int argc, char *argv[])
_exit (127); _exit (127);
} }
int status = EXIT_SUCCESS;
#define RETURN(ok) status = (ok); goto out;
/* Give the child a chance to stop. */ /* Give the child a chance to stop. */
sleep (2); sleep (2);
@ -69,10 +72,10 @@ do_test (int argc, char *argv[])
{ {
default: default:
error (0, 0, "waitid returned bogus value %d\n", fail); error (0, 0, "waitid returned bogus value %d\n", fail);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
case -1: case -1:
error (0, errno, "waitid WNOHANG on stopped"); error (0, errno, "waitid WNOHANG on stopped");
return errno == ENOTSUP ? EXIT_SUCCESS : EXIT_FAILURE; RETURN (errno == ENOTSUP ? EXIT_SUCCESS : EXIT_FAILURE);
case 0: case 0:
if (info.si_signo == 0) if (info.si_signo == 0)
break; break;
@ -80,7 +83,7 @@ do_test (int argc, char *argv[])
error (0, 0, "waitid WNOHANG on stopped status %d\n", info.si_status); error (0, 0, "waitid WNOHANG on stopped status %d\n", info.si_status);
else else
error (0, 0, "waitid WNOHANG on stopped signal %d\n", info.si_signo); error (0, 0, "waitid WNOHANG on stopped signal %d\n", info.si_signo);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
/* Next the wait that should succeed right away. */ /* Next the wait that should succeed right away. */
@ -92,47 +95,47 @@ do_test (int argc, char *argv[])
{ {
default: default:
error (0, 0, "waitid WSTOPPED|WNOHANG returned bogus value %d\n", fail); error (0, 0, "waitid WSTOPPED|WNOHANG returned bogus value %d\n", fail);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
case -1: case -1:
error (0, errno, "waitid WSTOPPED|WNOHANG on stopped"); error (0, errno, "waitid WSTOPPED|WNOHANG on stopped");
return errno == ENOTSUP ? EXIT_SUCCESS : EXIT_FAILURE; RETURN (errno == ENOTSUP ? EXIT_SUCCESS : EXIT_FAILURE);
case 0: case 0:
if (info.si_signo != SIGCHLD) if (info.si_signo != SIGCHLD)
{ {
error (0, 0, "waitid WSTOPPED|WNOHANG on stopped signal %d\n", error (0, 0, "waitid WSTOPPED|WNOHANG on stopped signal %d\n",
info.si_signo); info.si_signo);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_code != CLD_STOPPED) if (info.si_code != CLD_STOPPED)
{ {
error (0, 0, "waitid WSTOPPED|WNOHANG on stopped code %d\n", error (0, 0, "waitid WSTOPPED|WNOHANG on stopped code %d\n",
info.si_code); info.si_code);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_status != SIGSTOP) if (info.si_status != SIGSTOP)
{ {
error (0, 0, "waitid WSTOPPED|WNOHANG on stopped status %d\n", error (0, 0, "waitid WSTOPPED|WNOHANG on stopped status %d\n",
info.si_status); info.si_status);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_pid != pid) if (info.si_pid != pid)
{ {
error (0, 0, "waitid WSTOPPED|WNOHANG on stopped pid %d != %d\n", error (0, 0, "waitid WSTOPPED|WNOHANG on stopped pid %d != %d\n",
info.si_pid, pid); info.si_pid, pid);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
} }
if (kill (pid, SIGCONT) != 0) if (kill (pid, SIGCONT) != 0)
{ {
error (0, errno, "kill (%d, SIGCONT)", pid); error (0, errno, "kill (%d, SIGCONT)", pid);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
/* Wait for the child to have continued. */ /* Wait for the child to have continued. */
sleep (2); sleep (2);
#if 0 #if WCONTINUED != 0
info.si_signo = 0; /* A successful call sets it to SIGCHLD. */ info.si_signo = 0; /* A successful call sets it to SIGCHLD. */
info.si_pid = -1; info.si_pid = -1;
info.si_status = -1; info.si_status = -1;
@ -141,34 +144,34 @@ do_test (int argc, char *argv[])
{ {
default: default:
error (0, 0, "waitid WCONTINUED returned bogus value %d\n", fail); error (0, 0, "waitid WCONTINUED returned bogus value %d\n", fail);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
case -1: case -1:
error (0, errno, "waitid WCONTINUED on continued"); error (0, errno, "waitid WCONTINUED on continued");
return errno == ENOTSUP ? EXIT_SUCCESS : EXIT_FAILURE; RETURN (errno == ENOTSUP ? EXIT_SUCCESS : EXIT_FAILURE);
case 0: case 0:
if (info.si_signo != SIGCHLD) if (info.si_signo != SIGCHLD)
{ {
error (0, 0, "waitid WCONTINUED on continued signal %d\n", error (0, 0, "waitid WCONTINUED on continued signal %d\n",
info.si_signo); info.si_signo);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_code != CLD_CONTINUED) if (info.si_code != CLD_CONTINUED)
{ {
error (0, 0, "waitid WCONTINUED on continued code %d\n", error (0, 0, "waitid WCONTINUED on continued code %d\n",
info.si_code); info.si_code);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_status != SIGCONT) if (info.si_status != SIGCONT)
{ {
error (0, 0, "waitid WCONTINUED on continued status %d\n", error (0, 0, "waitid WCONTINUED on continued status %d\n",
info.si_status); info.si_status);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_pid != pid) if (info.si_pid != pid)
{ {
error (0, 0, "waitid WCONTINUED on continued pid %d != %d\n", error (0, 0, "waitid WCONTINUED on continued pid %d != %d\n",
info.si_pid, pid); info.si_pid, pid);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
} }
#endif #endif
@ -177,7 +180,7 @@ do_test (int argc, char *argv[])
if (kill (pid, SIGKILL) != 0) if (kill (pid, SIGKILL) != 0)
{ {
error (0, errno, "kill (%d, SIGKILL)", pid); error (0, errno, "kill (%d, SIGKILL)", pid);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
#ifdef WNOWAIT #ifdef WNOWAIT
@ -189,34 +192,34 @@ do_test (int argc, char *argv[])
{ {
default: default:
error (0, 0, "waitid WNOWAIT returned bogus value %d\n", fail); error (0, 0, "waitid WNOWAIT returned bogus value %d\n", fail);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
case -1: case -1:
error (0, errno, "waitid WNOWAIT on killed"); error (0, errno, "waitid WNOWAIT on killed");
return errno == ENOTSUP ? EXIT_SUCCESS : EXIT_FAILURE; RETURN (errno == ENOTSUP ? EXIT_SUCCESS : EXIT_FAILURE);
case 0: case 0:
if (info.si_signo != SIGCHLD) if (info.si_signo != SIGCHLD)
{ {
error (0, 0, "waitid WNOWAIT on killed signal %d\n", error (0, 0, "waitid WNOWAIT on killed signal %d\n",
info.si_signo); info.si_signo);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_code != CLD_KILLED) if (info.si_code != CLD_KILLED)
{ {
error (0, 0, "waitid WNOWAIT on killed code %d\n", error (0, 0, "waitid WNOWAIT on killed code %d\n",
info.si_code); info.si_code);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_status != SIGKILL) if (info.si_status != SIGKILL)
{ {
error (0, 0, "waitid WNOWAIT on killed status %d\n", error (0, 0, "waitid WNOWAIT on killed status %d\n",
info.si_status); info.si_status);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_pid != pid) if (info.si_pid != pid)
{ {
error (0, 0, "waitid WNOWAIT on killed pid %d != %d\n", error (0, 0, "waitid WNOWAIT on killed pid %d != %d\n",
info.si_pid, pid); info.si_pid, pid);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
} }
#else #else
@ -232,34 +235,34 @@ do_test (int argc, char *argv[])
{ {
default: default:
error (0, 0, "waitid WNOHANG returned bogus value %d\n", fail); error (0, 0, "waitid WNOHANG returned bogus value %d\n", fail);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
case -1: case -1:
error (0, errno, "waitid WNOHANG on killed"); error (0, errno, "waitid WNOHANG on killed");
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
case 0: case 0:
if (info.si_signo != SIGCHLD) if (info.si_signo != SIGCHLD)
{ {
error (0, 0, "waitid WNOHANG on killed signal %d\n", error (0, 0, "waitid WNOHANG on killed signal %d\n",
info.si_signo); info.si_signo);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_code != CLD_KILLED) if (info.si_code != CLD_KILLED)
{ {
error (0, 0, "waitid WNOHANG on killed code %d\n", error (0, 0, "waitid WNOHANG on killed code %d\n",
info.si_code); info.si_code);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_status != SIGKILL) if (info.si_status != SIGKILL)
{ {
error (0, 0, "waitid WNOHANG on killed status %d\n", error (0, 0, "waitid WNOHANG on killed status %d\n",
info.si_status); info.si_status);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
if (info.si_pid != pid) if (info.si_pid != pid)
{ {
error (0, 0, "waitid WNOHANG on killed pid %d != %d\n", error (0, 0, "waitid WNOHANG on killed pid %d != %d\n",
info.si_pid, pid); info.si_pid, pid);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
} }
@ -269,16 +272,19 @@ do_test (int argc, char *argv[])
if (errno != ECHILD) if (errno != ECHILD)
{ {
error (0, errno, "waitid WEXITED on killed"); error (0, errno, "waitid WEXITED on killed");
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
} }
else else
{ {
error (0, 0, "waitid WEXITED returned bogus value %d\n", fail); error (0, 0, "waitid WEXITED returned bogus value %d\n", fail);
return EXIT_FAILURE; RETURN (EXIT_FAILURE);
} }
return EXIT_SUCCESS; #undef RETURN
out:
kill (pid, SIGKILL); /* Make sure it's dead if we bailed early. */
return status;
} }
#include "../test-skeleton.c" #include "../test-skeleton.c"