summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/e_externs_pipes.c172
-rw-r--r--src/e_externs_pipes.h20
-rw-r--r--src/e_line.h9
-rw-r--r--src/e_pipes.c178
-rw-r--r--src/e_pipes.h6
5 files changed, 163 insertions, 222 deletions
diff --git a/src/e_externs_pipes.c b/src/e_externs_pipes.c
deleted file mode 100644
index 86c4f0d..0000000
--- a/src/e_externs_pipes.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/* ************************************************************************** */
-/* */
-/* ::: :::::::: */
-/* e_externs_pipes.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 <sys/wait.h>
-#include <libft.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <string.h>
-#include <limits.h>
-#include <errno.h>
-
-#include "d_define.h"
-#include "f_fail.h"
-#include "e_redirs.h"
-#include "s_destroy.h"
-#include "s_line.h"
-#include "s_lpipes.h"
-#include "s_struct.h"
-#include "u_path.h"
-#include "u_utils.h"
-
-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);
- /* TODO: handle execve failed */
-}
-
-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);
-}
-
-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;
-
- /* TODO: norm, error mgmnt */
- 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);
-}
-
-void
- e_externs_pipes(struct s_lpipes *ptr,
- t_msh *msh)
-{
- struct s_lpipes *head;
- struct s_lpipes *rptr;
- char **fullpath;
- char tmp[PATH_MAX];
- size_t i;
- size_t pipes;
- uint8_t bu_id;
-
- head = ptr;
- rptr = ptr;
- pipes = e_get_pipes_count(head);
- 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;
- }
- i = 0;
- e_pipe_exec_path(fullpath, head, msh);
- ft_delwords(fullpath);
-}
diff --git a/src/e_externs_pipes.h b/src/e_externs_pipes.h
deleted file mode 100644
index 6c242fb..0000000
--- a/src/e_externs_pipes.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* ************************************************************************** */
-/* */
-/* ::: :::::::: */
-/* e_externs_pipes.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 E_EXTERNS_PIPES_H
-#define E_EXTERNS_PIPES_H
-
-#include "s_struct.h"
-
-void e_externs_pipes(struct s_lpipes *ptr, t_msh *msh);
-
-#endif
diff --git a/src/e_line.h b/src/e_line.h
index 02b7714..66b601c 100644
--- a/src/e_line.h
+++ b/src/e_line.h
@@ -10,11 +10,12 @@
/* */
/* ************************************************************************** */
-#ifndef E_LCOM_H
-#define E_LCOM_H
+#ifndef FT_E_LCOM_H
+# define FT_E_LCOM_H
-#include <stdint.h>
-#include "s_struct.h"
+# include <stdint.h>
+
+# include "s_struct.h"
void e_line(t_msh *msh);
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);
}
diff --git a/src/e_pipes.h b/src/e_pipes.h
index 2f6c550..c523d4f 100644
--- a/src/e_pipes.h
+++ b/src/e_pipes.h
@@ -10,10 +10,10 @@
/* */
/* ************************************************************************** */
-#ifndef E_PIPES_H
-#define E_PIPES_H
+#ifndef FT_E_PIPES_H
+# define FT_E_PIPES_H
-#include "s_struct.h"
+# include "s_struct.h"
void e_pipes(t_msh *msh);