/* By: lnikolov <lnikolov@student.42prague.com +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/07/21 08:57:54 by ljiriste #+# #+# */
-/* Updated: 2024/08/26 11:50:12 by ljiriste ### ########.fr */
+/* Updated: 2024/08/26 16:47:04 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
return (0);
}
+void close_pipes(const t_execution_env *env)
+{
+ close(env->stdin_fd);
+ close(env->stdout_fd);
+ return ;
+}
+
int dup_redirections(__attribute__((unused)) const t_vec *redirections)
{
size_t i;
return (0);
}
+void close_redirections(const t_vec *redirections)
+{
+ size_t i;
+ const t_redirection *redir;
+
+ i = 0;
+ while (i < redirections->size)
+ {
+ redir = ft_vec_caccess(redirections, i);
+ close(redir->from_to_fds[0]);
+ ++i;
+ }
+ return ;
+}
+
int add_exported(__attribute__((unused)) t_vec *assignments, __attribute__((unused)) const t_execution_env *env)
{
size_t i;
return (i);
}
+int save_std_filenos(int fds[3])
+{
+ fds[0] = dup(STDIN_FILENO);
+ if (fds[0] < 0)
+ return (1);
+ fds[1] = dup(STDIN_FILENO);
+ if (fds[1] < 0)
+ {
+ close(fds[0]);
+ return (1);
+ }
+ fds[2] = dup(STDIN_FILENO);
+ if (fds[2] < 0)
+ {
+ close(fds[0]);
+ close(fds[1]);
+ return (1);
+ }
+ return (0);
+}
+
+int restore_std_filenos(int fds[3])
+{
+ if (dup2(fds[0], STDIN_FILENO) == -1)
+ return (1);
+ if (dup2(fds[1], STDOUT_FILENO) == -1)
+ return (1);
+ if (dup2(fds[2], STDERR_FILENO) == -1)
+ return (1);
+ close(fds[0]);
+ close(fds[1]);
+ close(fds[2]);
+ return (0);
+}
+
int ex_builtin(char **fields, __attribute__((unused)) t_vec *assignments, __attribute__((unused)) const t_vec *redirections, t_execution_env *env)
{
+ int fds[3];
+
+ save_std_filenos(fds);
+ dup_pipes(env);
+ dup_redirections(redirections);
if (!ft_strcmp(fields[0], "cd"))
env->ret_val = cd(count_fields(fields), fields, env);
else if (!ft_strcmp(fields[0], "echo"))
else if (!ft_strcmp(fields[0], "unset"))
env->ret_val = unset(count_fields(fields), fields, env);
else
- return (-1);
+ return (1);
+ close_redirections(redirections);
+ close_pipes(env);
+ restore_std_filenos(fds);
return (0);
}