42_minishell/execution/execution.c

120 lines
3.4 KiB
C
Raw Normal View History

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* execution.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/21 12:45:16 by cchauvet #+# #+# */
2023-04-18 07:30:17 -04:00
/* Updated: 2023/04/18 13:00:08 by erey-bet ### ########.fr */
/* */
/* ************************************************************************** */
#include "execution_private.h"
2023-03-29 13:07:57 -04:00
static int ft_execute_own_cmd(t_data *data, t_cmd *cmd)
{
int return_code;
if (ft_strcmp(cmd->executable, "pwd") == 0)
return_code = pwd(cmd->fd_out[0]);
else if (ft_strcmp(cmd->executable, "env") == 0)
return_code = print_env(data->env, cmd->fd_out[0]);
else if (ft_strcmp(cmd->executable, "export") == 0)
2023-03-28 09:55:08 -04:00
return_code = ft_export(data->env, cmd->args + 1, cmd->fd_out[0]);
else if (ft_strcmp(cmd->executable, "cd") == 0)
2023-04-18 07:30:17 -04:00
return_code = (move_folder(cmd->args + 1, data->env, cmd->fd_out[0]));
else if (ft_strcmp(cmd->executable, "unset") == 0)
return_code = (unset(data->env, cmd->args, cmd->fd_out[0]));
else if (ft_strcmp(cmd->executable, "echo") == 0)
return_code = (echo(cmd->fd_out[0], cmd->args + 1));
2023-03-29 13:07:57 -04:00
else
{
2023-04-05 11:32:04 -04:00
return_code = ft_exit(cmd->args + 1, *data->exit_code);
2023-03-10 07:34:23 -05:00
if (return_code >= 0)
{
2023-04-05 11:32:04 -04:00
*data->exit_code = return_code;
2023-04-05 06:32:34 -04:00
return (-2);
}
}
2023-04-05 11:32:04 -04:00
*data->exit_code = return_code;
return (return_code);
}
2023-03-31 10:36:15 -04:00
static bool ft_executor(t_data *data, t_cmd *cmd, char **env)
{
if (cmd->fd_in[0] == -1 || cmd->fd_out[0] == -1 || cmd->executable == NULL)
return (0);
cmd->pid = fork();
if (cmd->pid == -1)
return (1);
if (cmd->pid == 0)
{
2023-04-07 07:09:59 -04:00
signal(SIGQUIT, SIG_DFL);
2023-04-14 08:41:59 -04:00
signal(SIGINT, SIG_DFL);
2023-03-13 09:23:27 -04:00
dup2(cmd->fd_in[0], 0);
dup2(cmd->fd_out[0], 1);
2023-03-31 10:36:15 -04:00
ft_lstiter(*data->cmds, ft_cmdcloser);
execve(cmd->executable, cmd->args, env);
2023-03-13 07:45:29 -04:00
return (1);
}
2023-04-17 06:41:54 -04:00
signal(SIGQUIT, SIG_IGN);
signal(SIGINT, SIG_IGN);
return (0);
}
2023-03-31 10:36:15 -04:00
static int ft_cmd_executor(t_data *data, t_cmd *cmd)
{
int exit_code;
char **env;
if (cmd->own_cmd == 1)
{
2023-03-29 13:07:57 -04:00
exit_code = ft_execute_own_cmd(data, cmd);
2023-03-13 14:29:20 -04:00
ft_closer(cmd->fd_in);
ft_closer(cmd->fd_out);
2023-04-05 06:32:34 -04:00
if (exit_code == -2)
return (1);
}
else
{
env = env_to_strs(data->env);
if (env == NULL)
return (1);
2023-03-31 10:36:15 -04:00
exit_code = ft_executor(data, cmd, env);
2023-03-13 14:29:20 -04:00
ft_closer(cmd->fd_in);
ft_closer(cmd->fd_out);
ft_freer_tab_ultimate(1, env);
2023-03-13 07:45:29 -04:00
if (exit_code == 1)
return (1);
}
return (0);
}
int ft_cmds_executor(t_data *data)
{
int fds[2];
t_list *current;
t_cmd *content;
current = *data->cmds;
while (current != NULL)
{
content = current->content;
2023-03-13 14:29:20 -04:00
fds[0] = -1;
if (current->next != NULL)
{
if (pipe(fds) == -1)
return (1);
ft_add_fd(content->fd_out, fds[1]);
2023-03-28 09:55:08 -04:00
ft_add_fd(((t_cmd *)(current->next->content))->fd_in, fds[0]);
}
2023-03-29 13:07:57 -04:00
if (content->fd_in[0] == -2 || content->fd_out[0] == -2)
ft_mega_closer(content->fd_in, content->fd_out);
2023-03-31 10:36:15 -04:00
else if (ft_cmd_executor(data, content))
return (1);
current = current->next;
}
return (0);
}