2023-03-10 06:32:39 -05:00
|
|
|
/* ************************************************************************** */
|
|
|
|
/* */
|
|
|
|
/* ::: :::::::: */
|
|
|
|
/* 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 */
|
2023-03-10 06:32:39 -05:00
|
|
|
/* */
|
|
|
|
/* ************************************************************************** */
|
|
|
|
|
|
|
|
#include "execution_private.h"
|
|
|
|
|
2023-03-29 13:07:57 -04:00
|
|
|
static int ft_execute_own_cmd(t_data *data, t_cmd *cmd)
|
2023-03-10 06:32:39 -05:00
|
|
|
{
|
|
|
|
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]);
|
2023-03-10 06:32:39 -05:00
|
|
|
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]));
|
2023-03-10 06:32:39 -05:00
|
|
|
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-03-10 06:32:39 -05:00
|
|
|
{
|
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-03-10 06:32:39 -05:00
|
|
|
{
|
2023-04-05 11:32:04 -04:00
|
|
|
*data->exit_code = return_code;
|
2023-04-05 06:32:34 -04:00
|
|
|
return (-2);
|
2023-03-10 06:32:39 -05:00
|
|
|
}
|
|
|
|
}
|
2023-04-05 11:32:04 -04:00
|
|
|
*data->exit_code = return_code;
|
2023-03-10 06:32:39 -05:00
|
|
|
return (return_code);
|
|
|
|
}
|
|
|
|
|
2023-03-31 10:36:15 -04:00
|
|
|
static bool ft_executor(t_data *data, t_cmd *cmd, char **env)
|
2023-03-10 06:32:39 -05:00
|
|
|
{
|
|
|
|
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);
|
2023-03-10 06:32:39 -05:00
|
|
|
execve(cmd->executable, cmd->args, env);
|
2023-03-13 07:45:29 -04:00
|
|
|
return (1);
|
2023-03-10 06:32:39 -05:00
|
|
|
}
|
2023-04-17 06:41:54 -04:00
|
|
|
signal(SIGQUIT, SIG_IGN);
|
|
|
|
signal(SIGINT, SIG_IGN);
|
2023-03-10 06:32:39 -05:00
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
2023-03-31 10:36:15 -04:00
|
|
|
static int ft_cmd_executor(t_data *data, t_cmd *cmd)
|
2023-03-10 06:32:39 -05:00
|
|
|
{
|
|
|
|
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)
|
2023-03-10 06:32:39 -05:00
|
|
|
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);
|
2023-03-10 06:32:39 -05:00
|
|
|
ft_freer_tab_ultimate(1, env);
|
2023-03-13 07:45:29 -04:00
|
|
|
if (exit_code == 1)
|
|
|
|
return (1);
|
2023-03-10 06:32:39 -05:00
|
|
|
}
|
|
|
|
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;
|
2023-03-10 06:32:39 -05:00
|
|
|
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-10 06:32:39 -05:00
|
|
|
}
|
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))
|
2023-03-10 06:32:39 -05:00
|
|
|
return (1);
|
|
|
|
current = current->next;
|
|
|
|
}
|
|
|
|
return (0);
|
|
|
|
}
|