summaryrefslogtreecommitdiffstats
path: root/src/e_pipes_next.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/e_pipes_next.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/e_pipes_next.c b/src/e_pipes_next.c
new file mode 100644
index 0000000..b3482c3
--- /dev/null
+++ b/src/e_pipes_next.c
@@ -0,0 +1,77 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* e_pipes_next.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */
+/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include <libft.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#include "e_redirs.h"
+#include "s_destroy.h"
+#include "s_line.h"
+#include "s_lpipes.h"
+#include "s_struct.h"
+#include "u_utils.h"
+#include "u_utils.h"
+
+/*
+** TODO: handle execve failed
+*/
+
+void e_pipe_child(char *fullpath[], uint8_t pipe_id, t_com *ptr, t_msh *msh)
+{
+ uint8_t bu_id;
+ uint8_t ret;
+
+ e_dup_redirs(ptr, msh);
+ if (ft_strncmp(fullpath[pipe_id], "builtin", 8) == 0)
+ {
+ bu_id = u_get_builtin_id(ptr->bin);
+ ret = msh->bu_ptr[bu_id](ptr->argv + 1, msh);
+ u_eof_fd(msh->fd);
+ s_lpipes_clear(&msh->pipes);
+ s_line_clear(&msh->curr);
+ s_destroy(msh);
+ ft_delwords(fullpath);
+ exit(ret);
+ }
+ else
+ execve(fullpath[pipe_id], ptr->argv, msh->envp);
+}
+
+size_t e_get_pipes_count(struct s_lpipes *ptr)
+{
+ struct s_lpipes *rptr;
+ size_t pipes;
+
+ rptr = ptr;
+ pipes = 0;
+ while (rptr->next != NULL)
+ {
+ rptr = rptr->next;
+ pipes++;
+ }
+ return (pipes);
+}
+
+void e_close_unused_fds(int32_t fd[256][2], size_t pipes)
+{
+ size_t i;
+
+ i = 0;
+ while (i < pipes && i < 255)
+ {
+ close(fd[i][E_WRITE_END]);
+ close(fd[i][E_READ_END]);
+ i++;
+ }
+}