/// MentOS, The Mentoring Operating system project /// @file t_exec.c /// @brief /// @copyright (c) 2014-2021 This file is distributed under the MIT License. /// See LICENSE.md for details. #include #include #include #include #include static inline void __print_usage(int argc, char *argv[]) { if (argc > 0) { printf("%s: Usage: %s \n", argv[0], argv[0]); printf("exec_type: execl, execlp, execle, execlpe, execv, execvp, execve, execvpe\n"); } } int main(int argc, char *argv[]) { int status; if (argc != 2) { __print_usage(argc, argv); return 1; } if (setenv("ENV_VAR", "pwd0", 0) == -1) { printf("Failed to set env: `ENV_VAR`\n"); return 1; } char *file = "echo"; char *path = "/bin/echo"; char *exec_argv[] = { "echo", "ENV_VAR: ${ENV_VAR}", NULL }; char *exec_envp[] = { "PATH=/bin", "ENV_VAR=pwd1", NULL }; if (fork() == 0) { if (strcmp(argv[1], "execl") == 0) { execl(path, "echo", "ENV_VAR: ${ENV_VAR}", NULL); } else if (strcmp(argv[1], "execlp") == 0) { execlp(file, "echo", "ENV_VAR: ${ENV_VAR}", NULL); } else if (strcmp(argv[1], "execle") == 0) { execle(path, "echo", "ENV_VAR: ${ENV_VAR}", exec_envp, NULL); } else if (strcmp(argv[1], "execlpe") == 0) { execlpe(file, "echo", "ENV_VAR: ${ENV_VAR}", exec_envp, NULL); } else if (strcmp(argv[1], "execv") == 0) { execv(path, exec_argv); } else if (strcmp(argv[1], "execvp") == 0) { execvp(file, exec_argv); } else if (strcmp(argv[1], "execve") == 0) { execve(path, exec_argv, exec_envp); } else if (strcmp(argv[1], "execvpe") == 0) { execvpe(file, exec_argv, exec_envp); } else { __print_usage(argc, argv); return 1; } printf("Exec failed.\n"); return 1; } wait(&status); return 0; }