87 lines
2.8 KiB
C
87 lines
2.8 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* subshell.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: vvobis <marvin@42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2024/07/30 18:20:59 by vvobis #+# #+# */
|
|
/* Updated: 2024/08/24 13:27:15 by vvobis ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "../minishell.h"
|
|
#include <stdint.h>
|
|
|
|
static void subshell_child_execute( char *input, \
|
|
const char **environement, \
|
|
int32_t pipefd[2])
|
|
{
|
|
char *path_variable;
|
|
int32_t exit_status;
|
|
|
|
exit_status = 0;
|
|
path_variable = environment_variable_value_get("PATH", environement);
|
|
if (!path_variable)
|
|
return ;
|
|
ft_close(pipefd[0], "pipefd[0] in child parent");
|
|
ft_dup2(pipefd[1], STDOUT_FILENO, "execute_subshell stdout");
|
|
ft_close(pipefd[1], "close in execute_subshell");
|
|
m_tokenizer(input, (char **)environement, &exit_status, NULL);
|
|
lst_memory(NULL, NULL, END);
|
|
exit(exit_status);
|
|
}
|
|
|
|
void manage_buffer_size_subshel(char **input_subshell, uint32_t *buffer_size)
|
|
{
|
|
uint32_t buffer_strlen;
|
|
|
|
buffer_strlen = ft_strlen(*input_subshell);
|
|
if (buffer_strlen == *buffer_size - 101)
|
|
prompt_buffer_size_manage(input_subshell, *buffer_size, \
|
|
*buffer_size * 2, PROMPT_INPUT_BUFFER_SIZE);
|
|
*buffer_size *= 2;
|
|
}
|
|
|
|
static void subshell_parent_execute(char **input_subshell, int32_t pipefd[2])
|
|
{
|
|
int64_t bytes_read;
|
|
uint32_t string_size;
|
|
|
|
ft_close(pipefd[1], "close in execute_subshell");
|
|
string_size = 0;
|
|
while (1)
|
|
{
|
|
bytes_read = read(pipefd[0], *input_subshell + string_size, 100);
|
|
if (bytes_read == -1)
|
|
{
|
|
perror("read");
|
|
lst_memory(NULL, NULL, CLEAN);
|
|
}
|
|
else if (bytes_read == 0)
|
|
break ;
|
|
else
|
|
string_size += bytes_read;
|
|
}
|
|
ft_close(pipefd[0], "pipefd[0] in subshell parent");
|
|
}
|
|
|
|
char *execute_subshell(char *input, const char **environement)
|
|
{
|
|
char *input_subshell;
|
|
int32_t pipefd[2];
|
|
pid_t pid;
|
|
|
|
input_subshell = NULL;
|
|
input_subshell = ft_calloc(PROMPT_INPUT_BUFFER_SIZE, \
|
|
sizeof(*input_subshell));
|
|
lst_memory(input_subshell, free, ADD);
|
|
ft_pipe(pipefd, "in execute_subshell");
|
|
ft_fork(&pid, "execute_subshell");
|
|
if (pid == 0)
|
|
subshell_child_execute(input, environement, pipefd);
|
|
else
|
|
subshell_parent_execute(&input_subshell, pipefd);
|
|
return (input_subshell);
|
|
}
|