Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
yabtaour
GitHub Repository: yabtaour/Minishell-42
Path: blob/main/execution/execution.c
1407 views
1
/* ************************************************************************** */
2
/* */
3
/* ::: :::::::: */
4
/* execution.c :+: :+: :+: */
5
/* +:+ +:+ +:+ */
6
/* By: ssabbaji <[email protected]> +#+ +:+ +#+ */
7
/* +#+#+#+#+#+ +#+ */
8
/* Created: 2022/09/03 18:53:10 by ssabbaji #+# #+# */
9
/* Updated: 2022/10/07 13:18:48 by ssabbaji ### ########.fr */
10
/* */
11
/* ************************************************************************** */
12
13
#include "../minishell.h"
14
15
int dup_and_close(t_data *data, t_cmd *cmd)
16
{
17
dup2(cmd->fd_in, 0);
18
dup2(cmd->fd_out, 1);
19
if (cmd->fd_in != 0)
20
close(cmd->fd_in);
21
if (cmd->fd_out != 1)
22
close(cmd->fd_out);
23
close_fds(cmd);
24
close_pipes(data->pipes, data->general.count);
25
g_vars.g_exit_stat = check_builtins(data, cmd);
26
if (g_vars.g_exit_stat == NO_BUILT)
27
g_vars.g_exit_stat = execution_2(data, cmd);
28
return (g_vars.g_exit_stat);
29
}
30
31
int execution(t_data *data, t_cmd *cmd)
32
{
33
int pid;
34
int fork_c;
35
36
fork_c = 0;
37
pid = 1;
38
while (cmd)
39
{
40
g_vars.g_exit_stat = check_nonfork(data, cmd);
41
if (g_vars.g_heredoc == 0)
42
return (HEREDOC_EXE);
43
fork_c += check_fork(&pid, data);
44
signal(SIGINT, SIG_IGN);
45
if (pid == 0 && cmd->fd_in != -69)
46
{
47
signal(SIGINT, SIG_DFL);
48
g_vars.g_where_ami = 0;
49
g_vars.g_exit_stat = dup_and_close(data, cmd);
50
exit(g_vars.g_exit_stat);
51
}
52
cmd = cmd->next;
53
}
54
close_all(cmd, data->pipes, data->general.count);
55
if (fork_c)
56
g_vars.g_exit_stat = terminate_pid(pid);
57
return (g_vars.g_exit_stat);
58
}
59
60
int pre_execution(t_data *data)
61
{
62
t_cmd *cmd;
63
int pid;
64
65
pid = 0;
66
data->general.count = c_lstcmd(data);
67
if (data->lst_cmd)
68
{
69
cmd = data->lst_cmd;
70
data->pipes = initialize_pipes(data);
71
if (execution(data, cmd) == HEREDOC_EXE)
72
g_vars.g_exit_stat = 1;
73
}
74
return (0);
75
}
76
77