13f965818SSiva Chandra Reddy //===-- Unittests for execve ----------------------------------------------===//
23f965818SSiva Chandra Reddy //
33f965818SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43f965818SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
53f965818SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63f965818SSiva Chandra Reddy //
73f965818SSiva Chandra Reddy //===----------------------------------------------------------------------===//
83f965818SSiva Chandra Reddy
93f965818SSiva Chandra Reddy #include "src/sys/wait/waitpid.h"
103f965818SSiva Chandra Reddy #include "src/unistd/execve.h"
113f965818SSiva Chandra Reddy #include "src/unistd/fork.h"
123f965818SSiva Chandra Reddy
13af1315c2SSiva Chandra Reddy #include "test/IntegrationTest/test.h"
143f965818SSiva Chandra Reddy
153f965818SSiva Chandra Reddy #include <signal.h>
163f965818SSiva Chandra Reddy #include <sys/wait.h>
173f965818SSiva Chandra Reddy
fork_and_execv_normal_exit(char ** envp)183f965818SSiva Chandra Reddy void fork_and_execv_normal_exit(char **envp) {
19*b6bc9d72SGuillaume Chatelet pid_t pid = LIBC_NAMESPACE::fork();
203f965818SSiva Chandra Reddy if (pid == 0) {
213f965818SSiva Chandra Reddy const char *path = "libc_execv_test_normal_exit";
223f965818SSiva Chandra Reddy char *const argv[] = {
233f965818SSiva Chandra Reddy const_cast<char *>("execv_test_normal_exit"),
243f965818SSiva Chandra Reddy nullptr,
253f965818SSiva Chandra Reddy };
26*b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::execve(path, argv, envp);
273f965818SSiva Chandra Reddy }
283f965818SSiva Chandra Reddy ASSERT_TRUE(pid > 0);
293f965818SSiva Chandra Reddy int status;
30*b6bc9d72SGuillaume Chatelet pid_t cpid = LIBC_NAMESPACE::waitpid(pid, &status, 0);
313f965818SSiva Chandra Reddy ASSERT_TRUE(cpid > 0);
323f965818SSiva Chandra Reddy ASSERT_EQ(cpid, pid);
333f965818SSiva Chandra Reddy ASSERT_TRUE(WIFEXITED(status));
343f965818SSiva Chandra Reddy }
353f965818SSiva Chandra Reddy
fork_and_execv_signal_exit(char ** envp)363f965818SSiva Chandra Reddy void fork_and_execv_signal_exit(char **envp) {
37*b6bc9d72SGuillaume Chatelet pid_t pid = LIBC_NAMESPACE::fork();
383f965818SSiva Chandra Reddy if (pid == 0) {
393f965818SSiva Chandra Reddy const char *path = "libc_execv_test_signal_exit";
403f965818SSiva Chandra Reddy char *const argv[] = {
413f965818SSiva Chandra Reddy const_cast<char *>("execv_test_normal_exit"),
423f965818SSiva Chandra Reddy nullptr,
433f965818SSiva Chandra Reddy };
44*b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::execve(path, argv, envp);
453f965818SSiva Chandra Reddy }
463f965818SSiva Chandra Reddy ASSERT_TRUE(pid > 0);
473f965818SSiva Chandra Reddy int status;
48*b6bc9d72SGuillaume Chatelet pid_t cpid = LIBC_NAMESPACE::waitpid(pid, &status, 0);
493f965818SSiva Chandra Reddy ASSERT_TRUE(cpid > 0);
503f965818SSiva Chandra Reddy ASSERT_EQ(cpid, pid);
513f965818SSiva Chandra Reddy ASSERT_FALSE(WIFEXITED(status));
523f965818SSiva Chandra Reddy ASSERT_TRUE(WTERMSIG(status) == SIGUSR1);
533f965818SSiva Chandra Reddy }
543f965818SSiva Chandra Reddy
TEST_MAIN(int argc,char ** argv,char ** envp)553f965818SSiva Chandra Reddy TEST_MAIN(int argc, char **argv, char **envp) {
563f965818SSiva Chandra Reddy fork_and_execv_normal_exit(envp);
573f965818SSiva Chandra Reddy fork_and_execv_signal_exit(envp);
583f965818SSiva Chandra Reddy return 0;
593f965818SSiva Chandra Reddy }
60