Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
yabtaour
GitHub Repository: yabtaour/Minishell-42
Path: blob/main/execution/check_fork.c
1407 views
1
/* ************************************************************************** */
2
/* */
3
/* ::: :::::::: */
4
/* check_fork.c :+: :+: :+: */
5
/* +:+ +:+ +:+ */
6
/* By: ssabbaji <[email protected]> +#+ +:+ +#+ */
7
/* +#+#+#+#+#+ +#+ */
8
/* Created: 2022/09/15 13:50:24 by ssabbaji #+# #+# */
9
/* Updated: 2022/10/05 11:04:38 by ssabbaji ### ########.fr */
10
/* */
11
/* ************************************************************************** */
12
13
#include "../minishell.h"
14
15
int check_builtins(t_data *data, t_cmd *cmd_lst)
16
{
17
char **cmd;
18
19
cmd = cmd_lst->cmd;
20
if (!ft_strcmp(cmd[0], "export"))
21
g_vars.g_exit_stat = export(data, cmd_lst);
22
else if (!ft_strcmp(cmd[0], "unset"))
23
g_vars.g_exit_stat = unset(data, cmd_lst);
24
else if (!ft_strcmp(cmd[0], "echo"))
25
g_vars.g_exit_stat = my_echo(cmd_lst);
26
else if (!ft_strcmp(cmd[0], "pwd"))
27
g_vars.g_exit_stat = my_pwd(data, data->lst_cmd);
28
else if (!ft_strcmp(cmd[0], "env"))
29
my_env(data, data->lst_cmd);
30
else if (!ft_strcmp(cmd[0], "exit"))
31
g_vars.g_exit_stat = my_exit(cmd_lst, data->general.old_error);
32
else
33
return (NO_BUILT);
34
return (g_vars.g_exit_stat);
35
}
36
37
int nofork_list(t_data *data, t_cmd *cmd)
38
{
39
data->fork_flag = 0;
40
if (!ft_strcmp(cmd->cmd[0], "cd") && !cmd->next)
41
g_vars.g_exit_stat = my_cd(data, cmd);
42
else if (!ft_strcmp(cmd->cmd[0], "export") && !cmd->next)
43
g_vars.g_exit_stat = export(data, cmd);
44
else if ((!ft_strcmp(cmd->cmd[0], "env")) && !cmd->next)
45
my_env(data, cmd);
46
else if (!ft_strcmp(cmd->cmd[0], "unset") && !cmd->next)
47
g_vars.g_exit_stat = unset(data, cmd);
48
else if (!ft_strcmp(cmd->cmd[0], "exit") && !cmd->next)
49
{
50
if (cmd->prev)
51
return (0);
52
g_vars.g_exit_stat = my_exit(cmd, data->general.old_error);
53
}
54
else
55
data->fork_flag = 1;
56
return (g_vars.g_exit_stat);
57
}
58
59
int check_nonfork(t_data *data, t_cmd *cmd)
60
{
61
int idx;
62
63
idx = check_delim_idx(data, cmd);
64
data->fork_flag = 0;
65
if (cmd->her_doc_num && heredoc_exec(data, cmd, idx))
66
{
67
if (cmd->her_in != 1)
68
close(cmd->her_in);
69
if (cmd->cmd[0])
70
data->fork_flag = 1;
71
}
72
if (cmd->cmd && cmd->cmd[0])
73
return (nofork_list(data, cmd));
74
return (g_vars.g_exit_stat);
75
}
76
77
int check_fork(int *pid, t_data *data)
78
{
79
int i;
80
81
i = 0;
82
if (*pid != 0 && data->fork_flag)
83
{
84
*pid = fork();
85
if (*pid < 0)
86
{
87
perror("fork() error");
88
exit(1);
89
}
90
i++;
91
}
92
return (i);
93
}
94
95