summaryrefslogtreecommitdiffstats
path: root/src/e_pipes.c
diff options
context:
space:
mode:
authorJozanLeClerc <bousset.rudy@gmail.com>2020-09-30 19:13:56 +0200
committerJozanLeClerc <bousset.rudy@gmail.com>2020-09-30 19:13:56 +0200
commit2fef0c2c7a2c8b7b635c3a73279f979eb607146c (patch)
tree92b3495f02ee6684eec4b45b2febe214aad10459 /src/e_pipes.c
parentNormed e_externs (diff)
download42-minishell-2fef0c2c7a2c8b7b635c3a73279f979eb607146c.tar.gz
42-minishell-2fef0c2c7a2c8b7b635c3a73279f979eb607146c.tar.bz2
42-minishell-2fef0c2c7a2c8b7b635c3a73279f979eb607146c.tar.xz
42-minishell-2fef0c2c7a2c8b7b635c3a73279f979eb607146c.tar.zst
42-minishell-2fef0c2c7a2c8b7b635c3a73279f979eb607146c.zip
Pipes restructuration in progress
Diffstat (limited to '')
-rw-r--r--src/e_pipes.c178
1 files changed, 155 insertions, 23 deletions
diff --git a/src/e_pipes.c b/src/e_pipes.c
index a1807d1..7b07789 100644
--- a/src/e_pipes.c
+++ b/src/e_pipes.c
@@ -10,38 +10,170 @@
/* */
/* ************************************************************************** */
+#include <sys/wait.h>
#include <libft.h>
+#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include "e_builtins.h"
-#include "e_externs_pipes.h"
+#include "e_redirs.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"
-/* static uint8_t */
-/* get_builtin_id(const char com[], */
-/* t_msh *msh) */
-/* { */
-/* uint8_t i; */
-
-/* i = 0; */
-/* while (msh->bu_ref[i] && ft_strncmp(com, msh->bu_ref[i], */
-/* ft_strlen(msh->bu_ref[i]) + 1) != 0) */
-/* { */
-/* i++; */
-/* } */
-/* return (i); */
-/* } */
-
-void
- e_pipes(t_msh *msh)
+/*
+** TODO: handle execve failed
+*/
+
+static 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);
+}
+
+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)
+ {
+ rptr = rptr->next;
+ pipes++;
+ }
+ return (pipes);
+}
+
+/*
+** TODO: error mgmnt
+*/
+
+static void e_pipe_exec_path(char *fullpath[], struct s_lpipes *head, t_msh *msh)
+{
+ int fd[256][2];
+ size_t pipes;
+ size_t i;
+ size_t j;
+ int pid;
+ int status;
+
+ pipes = e_get_pipes_count(head);
+ i = 0;
+ while (i < pipes)
+ {
+ pipe(fd[i]);
+ i++;
+ }
+ 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)
+ {
+ close(fd[i][E_WRITE_END]);
+ close(fd[i][E_READ_END]);
+ i++;
+ }
+ waitpid(pid, &status, 0);
+ msh->ret = WEXITSTATUS(status);
+}
+
+
+
+
+
+
+
+
+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)
+ f_alloc_and_destroy_msh(msh);
+ fullpath[pipes + 1] = NULL;
+ 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);
+ }
+ }
+ i++;
+ rptr = rptr->next;
+ }
+ return (fullpath);
+}
+
+void e_pipes(t_msh *msh)
{
- /* uint8_t bu_id; */
+ char **fullpath;
- /* if ((bu_id = get_builtin_id(ptr->pipes->one->com, msh)) */
- /* < FT_BUILTINS_COUNT) */
- /* e_builtin(ptr->pipes->one, bu_id, msh); */
- e_externs_pipes(msh->pipes, msh);
+ fullpath = e_get_fullpath(e_get_pipes_count(msh->pipes), msh);
+ e_pipe_exec_path(fullpath, msh->pipes, msh);
+ ft_delwords(fullpath);
s_lpipes_clear(&msh->pipes);
}