120 lines
3.3 KiB
C
120 lines
3.3 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* execution.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2023/02/21 12:45:16 by cchauvet #+# #+# */
|
|
/* Updated: 2023/02/28 14:56:05 by erey-bet ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "execution_private.h"
|
|
#include <unistd.h>
|
|
|
|
static int ft_own_cmd(t_data *data, t_cmd *cmd)
|
|
{
|
|
int return_code;
|
|
|
|
return_code = -1;
|
|
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)
|
|
return_code = (ft_export(data->env,cmd->args + 1, cmd->fd_out[0]));
|
|
else if (ft_strcmp(cmd->executable, "cd") == 0)
|
|
return_code = (move_folder(cmd->args + 1, 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));
|
|
else if (ft_strcmp(cmd->executable, "exit") == 0)
|
|
{
|
|
return_code = ft_exit(cmd->args + 1);
|
|
if (return_code >= 0)
|
|
{
|
|
data->exit_code = return_code;
|
|
return (-1);
|
|
}
|
|
}
|
|
return (return_code);
|
|
}
|
|
|
|
static bool ft_executor(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)
|
|
{
|
|
if (cmd->fd_in[1] != -1)
|
|
dup2(cmd->fd_in[1], 0);
|
|
if (cmd->fd_out[1] != -1)
|
|
dup2(cmd->fd_out[1], 1);
|
|
dup2(cmd->fd_in[0], 0);
|
|
dup2(cmd->fd_out[0], 1);
|
|
ft_closer(cmd->fd_in);
|
|
ft_closer(cmd->fd_out);
|
|
execve(cmd->executable, cmd->args, env);
|
|
ft_eprintf("minishell: permission denied: %s\n", cmd->executable);
|
|
return (1);
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
static int ft_cmd_executor(t_data *data, t_cmd *cmd)
|
|
{
|
|
int exit_code;
|
|
char **env;
|
|
|
|
if (cmd->own_cmd == 1)
|
|
{
|
|
exit_code = ft_own_cmd(data, cmd);
|
|
if (exit_code == -1)
|
|
return (1);
|
|
}
|
|
else
|
|
{
|
|
env = env_to_strs(data->env);
|
|
if (env == NULL)
|
|
return (1);
|
|
exit_code = ft_executor(cmd, env);
|
|
ft_freer_tab_ultimate(1, env);
|
|
if (exit_code == 1)
|
|
return (1);
|
|
}
|
|
if (ft_gen_exit_code(data))
|
|
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;
|
|
if (current->next != NULL)
|
|
{
|
|
if (pipe(fds) == -1)
|
|
return (1);
|
|
ft_add_fd(content->fd_out, fds[1]);
|
|
ft_add_fd(((t_cmd *) (current->next->content))->fd_in, fds[0]);
|
|
}
|
|
if (ft_cmd_executor(data, content))
|
|
return (1);
|
|
ft_closer(content->fd_in);
|
|
ft_closer(content->fd_out);
|
|
current = current->next;
|
|
}
|
|
return (0);
|
|
}
|