maxishell
Implementation of a shell for Linux-like systems
Loading...
Searching...
No Matches
execute_child.c
Go to the documentation of this file.
1
2#include "builtins.h"
3#include "libft.h"
4#include <stdio.h>
5#include <sys/wait.h>
6#include "shell.h"
7#include "execute.h"
8#include "tokens.h"
9#include "pipe.h"
10#include "redirection.h"
11#include "exit_status.h"
12#include "signals.h"
13#include "exit_status.h"
14
15int execute(t_ms_data *data);
16static int new_process(t_ms_data *data);
17static void signal_handler(void);
18static void handle_exec_errors(char *exec_path, t_ms_data *data);
19
30{
31 size_t i;
32 char *builtin_commands[7];
33 int (*builtin_functions[7])(t_ms_data *);
34
35 builtin_commands[0] = "cd";
36 builtin_commands[1] = "echo";
37 builtin_commands[2] = "env";
38 builtin_commands[3] = "exit";
39 builtin_commands[4] = "export";
40 builtin_commands[5] = "pwd";
41 builtin_commands[6] = "unset";
42 builtin_functions[0] = &builtin_cd;
43 builtin_functions[1] = &builtin_echo;
44 builtin_functions[2] = &builtin_env;
45 builtin_functions[3] = &builtin_exit;
46 builtin_functions[4] = &builtin_export;
47 builtin_functions[5] = &builtin_pwd;
48 builtin_functions[6] = &builtin_unset;
49 if (data->args[0] == NULL)
50 ft_perror("minishel");
51 i = -1;
52 while (++i < sizeof(builtin_commands) / sizeof(char *))
53 if (ft_strcmp(data->args[0], builtin_commands[i]) == 0)
54 return ((*builtin_functions[i])(data));
55 return (new_process(data));
56}
57
67static void child_process(t_ms_data *data)
68{
69 char *exec_path;
70
71 handle_std_io(&data->std_in, STDIN_FILENO);
72 handle_std_io(&data->std_out, STDOUT_FILENO);
73 close_fds(data->std_in, data->std_out);
75 if (ft_strncmp(data->args[0], "/", 1) == 0)
76 exec_path = ft_strdup(data->args[0]);
77 else
78 exec_path = ft_find_path(data->args[0], data->envp);
79 handle_exec_errors(exec_path, data);
80}
81
82static int new_process(t_ms_data *data)
83{
84 pid_t pid;
85 int exit;
86
87 exit = 0;
88 handle_std_io(&data->std_in, STDIN_FILENO);
89 handle_std_io(&data->std_out, STDOUT_FILENO);
90 pid = fork();
91 if (pid == -1)
92 ft_perror("fork");
93 if (pid == 0)
94 child_process(data); // Call the separated child process function
95 close_fds(data->std_in, data->std_out);
96 waitpid(pid, &exit, 0);
97 data->exit_status = WEXITSTATUS(exit);
98 if (WIFSIGNALED(exit) && WTERMSIG(exit) == SIGQUIT)
99 ft_printf("\n");
101 return (EXIT_SUCCESS);
102}
103
104static void handle_exec_errors(char *exec_path, t_ms_data *data)
105{
106 if (exec_path == NULL)
107 {
108 ft_putstr_fd("maxishell: command not found\n", STDERR_FILENO);
109 exit(127);
110 }
111 if (!data->args || !data->args[0] || !data->envp)
112 {
113 ft_putstr_fd("maxishell: invalid \
114 arguments or environment\n", STDERR_FILENO);
115 exit(EXIT_FAILURE);
116 }
117 if (execve(exec_path, data->args, env_to_array(data->envp)) == -1)
118 {
119 ft_putstr_fd("minishell: fuck it\n", STDERR_FILENO);
120 exit(IS_DIRECTORY);
121 }
122}
123
124static void signal_handler(void)
125{
126 struct sigaction a;
127
128 ft_memset(&a, 0, sizeof(struct sigaction));
129 sigemptyset(&a.sa_mask);
130 a.sa_handler = SIG_DFL;
131 a.sa_flags = 0;
132 sigaction(SIGQUIT, &a, NULL);
133}
int builtin_exit(t_ms_data *data)
Definition exit.c:62
int builtin_pwd(t_ms_data *data)
Definition pwd.c:24
int builtin_unset(t_ms_data *data)
Definition unset.c:29
int builtin_cd(t_ms_data *data)
Definition cd.c:28
int builtin_echo(t_ms_data *data)
Definition echo.c:22
int builtin_env(t_ms_data *data)
Definition env.c:35
int builtin_export(t_ms_data *data)
Definition export.c:30
char ** env_to_array(t_env *envp)
Definition utils.c:23
char * ft_find_path(char *cmd, t_env *envp)
function find the full path of the executed command
Definition utils_1.c:32
void handle_std_io(int *std_io, int std_fileno)
Definition utils_0.c:50
void close_fds(int in, int out)
close two file descriptors
Definition utils_0.c:28
int ft_perror(char *str)
static void signal_handler(void)
static void handle_exec_errors(char *exec_path, t_ms_data *data)
static int new_process(t_ms_data *data)
static void child_process(t_ms_data *data)
executes a new process
int execute(t_ms_data *data)
execute distribution function
#define EXIT_SUCCESS
Definition exit_status.h:16
#define EXIT_FAILURE
Definition exit_status.h:17
void set_shell_var_handler(t_ms_data *data)
Definition exit_status.c:53
#define IS_DIRECTORY
Definition exit_status.h:20
int ft_printf(const char *format,...)
Definition ft_printf.c:37
int ft_strcmp(const char *s1, const char *s2)
Definition ft_strcmp.c:24
void * ft_memset(void *s, int c, size_t n)
Definition ft_memset.c:28
int ft_strncmp(const char *s1, const char *s2, size_t n)
Definition ft_strncmp.c:24
void ft_putstr_fd(char *s, int fd)
char * ft_strdup(const char *s)
Definition ft_strdup.c:23
int exit_status
Definition shell.h:30
t_env * envp
Definition shell.h:24
int std_out
Definition shell.h:27
char ** args
Definition shell.h:23
int std_in
Definition shell.h:26