diff options
Diffstat (limited to '')
-rw-r--r-- | src/ft_e_externs.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/ft_e_externs.c b/src/ft_e_externs.c index dbbaceb..aa67d9a 100644 --- a/src/ft_e_externs.c +++ b/src/ft_e_externs.c @@ -10,10 +10,93 @@ /* */ /* ************************************************************************** */ +#include <sys/wait.h> #include <libft.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include "ft_f_file.h" #include "ft_e_externs_next.h" +#include "ft_s_lcom.h" #include "ft_s_struct.h" +#include "ft_s_destroy.h" + +static void + ft_dup_redirs(const t_lcom *ptr, + t_msh *msh) +{ + int32_t fd; + + if (ptr->redir == -1) + { + if ((fd = open(ptr->rdrpath, O_RDONLY)) == -1) + ft_f_file(ptr->rdrpath, msh); + /* TODO: handle < redir */ + } + if (ptr->redir == 1) + { + if ((fd = open(ptr->rdrpath, + O_CREAT | O_TRUNC | O_WRONLY, 0644)) == -1) + ft_f_file(ptr->rdrpath, msh); + dup2(fd, STDOUT_FILENO); + close(fd); + } + if (ptr->redir == 2) + { + if ((fd = open(ptr->rdrpath, + O_CREAT | O_APPEND | O_WRONLY, 0644)) == -1) + ft_f_file(ptr->rdrpath, msh); + dup2(fd, STDOUT_FILENO); + close(fd); + } +} + +static void +ft_e_extern_child(const char *fullpath, + t_lcom *ptr, + t_msh *msh) +{ + int32_t ret; + char arg[2][256]; + + ft_strlcpy(arg[0], "/bin/ls -l", ft_strlen("/bin/ls -l")); + arg[0][2] = '\0'; + arg[1][0] = 0; + (void)fullpath; + (void)ptr; + ft_dup_redirs(ptr, msh); + ret = execve("/bin/ls", (char *const*)arg, msh->envp); + /* TODO: handle execve failed */ + ft_lcom_clear(&msh->curr); + ft_s_destroy(msh); + exit(ret); +} + +static void + ft_exec_path(const char fullpath[], + t_lcom *ptr, + t_msh *msh) +{ + pid_t pid; + int32_t status; + + if ((pid = fork()) == 0) + { + ft_e_extern_child(fullpath, ptr, msh); + } + else if (pid < 0) + { + /* TODO: handle fork failed */ + } + else + { + while (wait(&status) != pid) + ; + msh->ret = WEXITSTATUS(status); + } +} void ft_e_extern(t_lcom *ptr, @@ -32,4 +115,7 @@ void /* TODO: exec $PATH stuff */ ft_delwords(envpath); } + /* TODO: deal if not found etc */ + ft_exec_path(fullpath, ptr, msh); + ft_memdel((void*)&fullpath); } |