61 lines · cpp
1//===-- Unittests for execve ----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/sys/wait/waitpid.h"10#include "src/unistd/execve.h"11#include "src/unistd/fork.h"12 13#include "test/IntegrationTest/test.h"14 15#include <signal.h>16#include <sys/wait.h>17 18void fork_and_execv_normal_exit(char **envp) {19 pid_t pid = LIBC_NAMESPACE::fork();20 if (pid == 0) {21 const char *path = "libc_execv_test_normal_exit";22 char *const argv[] = {23 const_cast<char *>("execv_test_normal_exit"),24 nullptr,25 };26 LIBC_NAMESPACE::execve(path, argv, envp);27 }28 ASSERT_TRUE(pid > 0);29 int status;30 pid_t cpid = LIBC_NAMESPACE::waitpid(pid, &status, 0);31 ASSERT_TRUE(cpid > 0);32 ASSERT_EQ(cpid, pid);33 ASSERT_TRUE(WIFEXITED(status));34}35 36void fork_and_execv_signal_exit(char **envp) {37 pid_t pid = LIBC_NAMESPACE::fork();38 if (pid == 0) {39 const char *path = "libc_execv_test_signal_exit";40 char *const argv[] = {41 const_cast<char *>("execv_test_normal_exit"),42 nullptr,43 };44 LIBC_NAMESPACE::execve(path, argv, envp);45 }46 ASSERT_TRUE(pid > 0);47 int status;48 pid_t cpid = LIBC_NAMESPACE::waitpid(pid, &status, 0);49 ASSERT_TRUE(cpid > 0);50 ASSERT_EQ(cpid, pid);51 ASSERT_FALSE(WIFEXITED(status));52 ASSERT_TRUE(WTERMSIG(status) == SIGUSR1);53}54 55TEST_MAIN([[maybe_unused]] int argc, [[maybe_unused]] char **argv,56 char **envp) {57 fork_and_execv_normal_exit(envp);58 fork_and_execv_signal_exit(envp);59 return 0;60}61