0001
0002
0003 #include <stdio.h>
0004 #include <unistd.h>
0005 #include <sys/types.h>
0006 #include <sys/wait.h>
0007
0008 #include "../kselftest.h"
0009
0010 #define FORK(exec) \
0011 do { \
0012 pid = fork(); \
0013 if (pid == 0) { \
0014 \
0015 exec; \
0016 perror("# " #exec); \
0017 return 1; \
0018 } \
0019 check_result(pid, #exec); \
0020 } while (0)
0021
0022 void check_result(pid_t pid, const char *msg)
0023 {
0024 int wstatus;
0025
0026 if (pid == (pid_t)-1) {
0027 perror("# fork");
0028 ksft_test_result_fail("fork failed: %s\n", msg);
0029 return;
0030 }
0031 if (waitpid(pid, &wstatus, 0) < 0) {
0032 perror("# waitpid");
0033 ksft_test_result_fail("waitpid failed: %s\n", msg);
0034 return;
0035 }
0036 if (!WIFEXITED(wstatus)) {
0037 ksft_test_result_fail("child did not exit: %s\n", msg);
0038 return;
0039 }
0040 if (WEXITSTATUS(wstatus) != 0) {
0041 ksft_test_result_fail("non-zero exit: %s\n", msg);
0042 return;
0043 }
0044 ksft_test_result_pass("%s\n", msg);
0045 }
0046
0047 int main(int argc, char *argv[], char *envp[])
0048 {
0049 pid_t pid;
0050 static char * const args[] = { NULL };
0051 static char * const str[] = { "", NULL };
0052
0053
0054 if (argc < 1) {
0055 fprintf(stderr, "# FAIL: saw argc == 0 (old kernel?)\n");
0056 return 1;
0057 }
0058 if (argc != 1) {
0059 fprintf(stderr, "# FAIL: unknown argc (%d)\n", argc);
0060 return 1;
0061 }
0062 if (argv[0][0] == '\0') {
0063
0064 return 0;
0065 }
0066
0067
0068 ksft_print_header();
0069 ksft_set_plan(5);
0070
0071 FORK(execve(argv[0], str, NULL));
0072 FORK(execve(argv[0], NULL, NULL));
0073 FORK(execve(argv[0], NULL, envp));
0074 FORK(execve(argv[0], args, NULL));
0075 FORK(execve(argv[0], args, envp));
0076
0077 ksft_exit(ksft_cnt.ksft_pass == ksft_plan);
0078 }