summaryrefslogtreecommitdiffstats
path: root/src/e_externs_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_externs_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 'src/e_externs_pipes.c')
-rw-r--r--src/e_externs_pipes.c172
1 files changed, 0 insertions, 172 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);
-}