summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Makefile2
-rw-r--r--src/e_pipes.c162
-rw-r--r--src/e_pipes_next.c77
-rw-r--r--src/e_pipes_next.h25
4 files changed, 168 insertions, 98 deletions
diff --git a/Makefile b/Makefile
index 60c2f2a..380520b 100644
--- a/Makefile
+++ b/Makefile
@@ -35,9 +35,9 @@ SRCS_NAME += b_type
SRCS_NAME += b_unset
SRCS_NAME += e_builtins
SRCS_NAME += e_externs
-# SRCS_NAME += e_externs_pipes
SRCS_NAME += e_line
SRCS_NAME += e_pipes
+SRCS_NAME += e_pipes_next
SRCS_NAME += e_redirs
SRCS_NAME += f_alloc
SRCS_NAME += f_chdir
diff --git a/src/e_pipes.c b/src/e_pipes.c
index 7b07789..f9c9f72 100644
--- a/src/e_pipes.c
+++ b/src/e_pipes.c
@@ -17,101 +17,67 @@
#include <unistd.h>
#include "e_builtins.h"
-#include "e_redirs.h"
+#include "e_pipes_next.h"
#include "f_fail.h"
-#include "s_destroy.h"
-#include "s_line.h"
#include "s_lpipes.h"
#include "s_struct.h"
#include "u_utils.h"
#include "u_path.h"
/*
-** TODO: handle execve failed
+** TODO: handle fork() failed, etc
*/
-static void e_pipe_child(char *fullpath[],
- uint8_t pipe_id,
- t_com *ptr,
- t_msh *msh)
+static int32_t e_unroll_pipes(int32_t fd[256][2],
+ char *fullpath[],
+ size_t pipes,
+ t_msh *msh)
{
- uint8_t bu_id;
- uint8_t ret;
+ struct s_lpipes *head;
+ int32_t pid;
+ uint16_t i;
- 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);
-}
-
-static 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)
+ head = msh->pipes;
+ i = 0;
+ while (i <= pipes && i < 255)
{
- rptr = rptr->next;
- pipes++;
+ if ((pid = fork()) == 0)
+ {
+ if (i != 0)
+ dup2(fd[i - 1][E_WRITE_END], STDIN_FILENO);
+ if (i != pipes)
+ dup2(fd[i][E_READ_END], STDOUT_FILENO);
+ e_close_unused_fds(fd, pipes);
+ e_pipe_child(fullpath, i, head->com, msh);
+ }
+ head = head->next;
+ i++;
}
- return (pipes);
+ return (pid);
}
/*
** TODO: error mgmnt
*/
-static void e_pipe_exec_path(char *fullpath[], struct s_lpipes *head, t_msh *msh)
+static void e_pipe_exec_path(char *fullpath[],
+ size_t pipes,
+ t_msh *msh)
{
- int fd[256][2];
- size_t pipes;
- size_t i;
- size_t j;
- int pid;
- int status;
+ int32_t fd[256][2];
+ int32_t pid;
+ int32_t status;
+ uint16_t i;
- pipes = e_get_pipes_count(head);
i = 0;
- while (i < pipes)
+ while (i < pipes && i < 255)
{
pipe(fd[i]);
i++;
}
+ pid = e_unroll_pipes(fd, fullpath, pipes, msh);
i = 0;
- while (i <= pipes)
- {
- if ((pid = fork()) == 0)
- {
- if (i != 0)
- dup2(fd[i - 1][E_WRITE_END], STDIN_FILENO);
- if (i != pipes)
- dup2(fd[i][E_READ_END], STDOUT_FILENO);
- j = 0;
- while (j < pipes)
- {
- close(fd[j][E_WRITE_END]);
- close(fd[j][E_READ_END]);
- j++;
- }
- e_pipe_child(fullpath, i, head->com, msh);
- }
- head = head->next;
- i++;
- }
- i = 0;
- while (i < pipes)
+ while (i < pipes && i < 255)
{
close(fd[i][E_WRITE_END]);
close(fd[i][E_READ_END]);
@@ -121,20 +87,39 @@ static void e_pipe_exec_path(char *fullpath[], struct s_lpipes *head, t_msh *ms
msh->ret = WEXITSTATUS(status);
}
+static char *e_get_current_path(struct s_lpipes *rptr, t_msh *msh)
+{
+ char tmp[PATH_MAX];
+ char *path;
-
-
-
-
-
+ path = NULL;
+ if (rptr->com->bin != NULL && ft_ischarset("/.", rptr->com->bin[0]) == TRUE)
+ {
+ if ((path = ft_strdup(rptr->com->bin)) == NULL)
+ f_alloc_and_destroy_msh(msh);
+ }
+ else
+ {
+ if (u_get_builtin_id(rptr->com->bin) < B_BUILTINS_COUNT)
+ {
+ if ((path = ft_strdup("builtin")) == NULL)
+ f_alloc_and_destroy_msh(msh);
+ }
+ else
+ {
+ u_search_in_path(tmp, rptr->com->bin, PATH_MAX, msh);
+ if ((path = ft_strdup(tmp)) == NULL)
+ f_alloc_and_destroy_msh(msh);
+ }
+ }
+ return (path);
+}
static char **e_get_fullpath(size_t pipes, t_msh *msh)
{
struct s_lpipes *rptr;
- char tmp[PATH_MAX];
char **fullpath;
size_t i;
- uint8_t bu_id;
rptr = msh->pipes;
if ((fullpath = (char **)malloc((pipes + 2) * sizeof(char *))) == NULL)
@@ -143,25 +128,7 @@ static char **e_get_fullpath(size_t pipes, t_msh *msh)
i = 0;
while (rptr != NULL)
{
- if (ft_ischarset("/.", rptr->com->bin[0]) == TRUE)
- {
- if ((fullpath[i] = ft_strdup(rptr->com->bin)) == NULL)
- f_alloc_and_destroy_msh(msh);
- }
- else
- {
- if ((bu_id = u_get_builtin_id(rptr->com->bin))
- < B_BUILTINS_COUNT)
- {
- if ((fullpath[i] = ft_strdup("builtin")) == NULL)
- f_alloc_and_destroy_msh(msh);
- }
- else
- {
- u_search_in_path(tmp, rptr->com->bin, PATH_MAX, msh);
- fullpath[i] = ft_strdup(tmp);
- }
- }
+ fullpath[i] = e_get_current_path(rptr, msh);
i++;
rptr = rptr->next;
}
@@ -170,10 +137,11 @@ static char **e_get_fullpath(size_t pipes, t_msh *msh)
void e_pipes(t_msh *msh)
{
- char **fullpath;
+ const size_t pipes = e_get_pipes_count(msh->pipes);
+ char **fullpath;
- fullpath = e_get_fullpath(e_get_pipes_count(msh->pipes), msh);
- e_pipe_exec_path(fullpath, msh->pipes, msh);
+ fullpath = e_get_fullpath(pipes, msh);
+ e_pipe_exec_path(fullpath, pipes, msh);
ft_delwords(fullpath);
s_lpipes_clear(&msh->pipes);
}
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++;
+ }
+}
diff --git a/src/e_pipes_next.h b/src/e_pipes_next.h
new file mode 100644
index 0000000..fe042d6
--- /dev/null
+++ b/src/e_pipes_next.h
@@ -0,0 +1,25 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* e_pipes_next.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* 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 */
+/* */
+/* ************************************************************************** */
+
+#ifndef FT_E_PIPES_NEXT_H
+# define FT_E_PIPES_NEXT_H
+
+# include <stddef.h>
+# include <stdint.h>
+
+# include "s_struct.h"
+
+void e_pipe_child(char *fullpath[], uint8_t pipe_id, t_com *ptr, t_msh *msh);
+size_t e_get_pipes_count(struct s_lpipes *ptr);
+void e_close_unused_fds(int32_t fd[256][2], size_t pipes);
+
+#endif