Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (c) 2015 Dmitry V. Levin <ldv (at) altlinux.org>
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. The name of the author may not be used to endorse or promote products
     14  *    derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #ifdef HAVE_CONFIG_H
     29 # include "config.h"
     30 #endif
     31 
     32 #include <assert.h>
     33 #include <signal.h>
     34 #include <unistd.h>
     35 #include <sys/wait.h>
     36 #include <sys/resource.h>
     37 
     38 int
     39 main(void)
     40 {
     41 	int fds[2];
     42 	int s;
     43 	pid_t pid;
     44 	struct rusage rusage = {};
     45 	siginfo_t info = {};
     46 
     47 	(void) close(0);
     48 	(void) close(1);
     49 	assert(!pipe(fds) && fds[0] == 0 && fds[1] == 1);
     50 
     51 	pid = fork();
     52 	assert(pid >= 0);
     53 	if (!pid) {
     54 		char c;
     55 		(void) close(1);
     56 		assert(read(0, &c, sizeof(c)) == 1);
     57 		return 42;
     58 	}
     59 
     60 	(void) close(0);
     61 	assert(wait4(pid, &s, WNOHANG | __WALL, NULL) == 0);
     62 	assert(waitid(P_PID, pid, &info, WNOHANG | WEXITED) == 0);
     63 
     64 	assert(write(1, "", 1) == 1);
     65 	(void) close(1);
     66 	assert(wait4(pid, &s, 0, &rusage) == pid);
     67 	assert(WIFEXITED(s) && WEXITSTATUS(s) == 42);
     68 
     69 	pid = fork();
     70 	assert(pid >= 0);
     71 	if (!pid) {
     72 		(void) raise(SIGUSR1);
     73 		return 77;
     74 	}
     75 	assert(wait4(pid, &s, __WALL, NULL) == pid);
     76 	assert(WIFSIGNALED(s) && WTERMSIG(s) == SIGUSR1);
     77 
     78 	pid = fork();
     79 	assert(pid >= 0);
     80 	if (!pid) {
     81 		raise(SIGSTOP);
     82 		return 0;
     83 	}
     84 	assert(wait4(pid, &s, WUNTRACED, NULL) == pid);
     85 	assert(WIFSTOPPED(s) && WSTOPSIG(s) == SIGSTOP);
     86 
     87 	assert(kill(pid, SIGCONT) == 0);
     88 	assert(waitid(P_PID, pid, &info, WEXITED | WSTOPPED) == 0);
     89 	assert(info.si_code == CLD_EXITED && info.si_status == 0);
     90 
     91 	assert(wait4(-1, &s, WNOHANG | WUNTRACED | __WALL, &rusage) == -1);
     92 
     93 	return 0;
     94 }
     95