merge de luke

This commit is contained in:
hugogogo
2021-12-18 12:34:26 +01:00
10 changed files with 233 additions and 83 deletions

62
srcs/init/handle_argv.c Normal file
View File

@@ -0,0 +1,62 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* handle_argv.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */
/* Updated: 2021/12/18 04:46:05 by lperrey ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
int remap_stdin_to_script_file(char *script_file);
char *init_prompt_base(void);
int handle_argv(t_all *c, char *argv[])
{
int ret;
if (argv[1])
{
ret = remap_stdin_to_script_file(argv[1]);
if (ret)
exit_free(c, ret);
}
else if (isatty(STDIN_FILENO))
{
c->prompt_base = init_prompt_base();
if (!c->prompt_base)
return (ft_reti_perror(0, "init_prompt_base()"));
c->prompt = init_prompt(c->prompt_base);
if (!c->prompt)
return (ft_reti_perror(0, "init_prompt()"));
}
return (1);
}
int remap_stdin_to_script_file(char *script_file)
{
int fd;
int ret;
int tmp;
fd = open(script_file, O_RDONLY);
if (fd == -1)
{
shell_perror(script_file, ": ", "", 0);
return (EXIT_CMD_NOT_FOUND);
}
ret = dup2(fd, STDIN_FILENO);
tmp = errno;
if (close(fd) == -1)
perror("close()");
if (ret == -1)
{
errno = tmp;
return (ft_reti_perror(EXIT_FAILURE, "dup2()"));
}
return (0);
}

33
srcs/init/init.c Normal file
View File

@@ -0,0 +1,33 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* init.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */
/* Updated: 2021/12/18 04:53:11 by lperrey ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
void init_readline(void);
int init_shlvl(void);
int handle_argv(t_all *c, char *argv[]);
int init(t_all *c, char *argv[])
{
ft_bzero(c, sizeof (*c));
init_readline();
environ = ft_dup_2d_arr(environ, (t_dup_f)ft_strdup);
if (!environ)
return (ft_reti_perror(0, "ft_dup_2d_arr(environ)"));
c->path = retrieve_path();
if (!init_shlvl())
return (ft_reti_perror(0, "init_shlvl()"));
if (!handle_argv(c, argv))
return (0);
set_signals_behaviour();
return (1);
}

View File

@@ -1,71 +1,18 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* init.c :+: :+: :+: */
/* init_prompt.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */
/* Updated: 2021/12/10 10:28:16 by hulamy ### ########.fr */
/* Updated: 2021/12/18 12:33:50 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
static char *init_prompt_base(void);
static int init_readline_hook(void);
static int shlvl_init(void);
int init(t_all *c)
{
ft_bzero(c, sizeof (*c));
// rl_instream = stdin;
rl_outstream = stderr;
// rl_outstream = stdout;
rl_startup_hook = init_readline_hook;
readline(NULL);
rl_startup_hook = NULL;
environ = ft_dup_2d_arr(environ, (t_dup_f)ft_strdup);
if (!environ)
return (ft_reti_perror(0, "ft_dup_2d_arr(environ)"));
c->path = retrieve_path();
if (!shlvl_init())
return (ft_reti_perror(0, "shlvl_init()"));
c->prompt_base = init_prompt_base();
if (!c->prompt_base)
return (ft_reti_perror(0, "init_prompt_base()"));
c->prompt = init_prompt(c->prompt_base);
if (!c->prompt)
return (ft_reti_perror(0, "init_prompt()"));
set_signals_behaviour();
return (1);
}
static int shlvl_init(void)
{
char *tmp;
int ret;
tmp = getenv("SHLVL");
if (tmp && ft_isdigit_str(tmp))
{
tmp = ft_itoa(ft_atoi(tmp) + 1);
if (!tmp)
return (0);
tmp = ft_strjoinfree_s2("SHLVL=", tmp);
if (!tmp)
return (0);
ret = export_var(tmp);
free(tmp);
}
else
ret = export_var("SHLVL=1");
if (ret == -1)
return (0);
return (1);
}
static char *init_prompt_base(void)
char *init_prompt_base(void)
{
char *prompt_base;
char *tmp;
@@ -105,13 +52,3 @@ char *init_prompt(char *prompt_base)
return (NULL);
return (prompt);
}
/*
** set rl_startup_hook with this, for init COLUMNS and LINES variables
** and prevent leak/double_free with **environ
*/
static int init_readline_hook(void)
{
rl_done = 1;
return (0);
}

33
srcs/init/init_readline.c Normal file
View File

@@ -0,0 +1,33 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* init_readline.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */
/* Updated: 2021/12/18 04:31:59 by lperrey ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
static int init_readline_hook(void);
void init_readline(void)
{
rl_outstream = stderr;
rl_startup_hook = init_readline_hook;
readline(NULL);
rl_startup_hook = NULL;
}
/*
** set rl_startup_hook with this, for init COLUMNS and LINES variables
** and prevent leak/double_free with **environ
*/
static int init_readline_hook(void)
{
rl_done = 1;
return (0);
}

37
srcs/init/init_shlvl.c Normal file
View File

@@ -0,0 +1,37 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* init_shlvl.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */
/* Updated: 2021/12/18 04:35:33 by lperrey ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
int init_shlvl(void)
{
char *tmp;
int ret;
tmp = getenv("SHLVL");
if (tmp && ft_isdigit_str(tmp))
{
tmp = ft_itoa(ft_atoi(tmp) + 1);
if (!tmp)
return (0);
tmp = ft_strjoinfree_s2("SHLVL=", tmp);
if (!tmp)
return (0);
ret = export_var(tmp);
free(tmp);
}
else
ret = export_var("SHLVL=1");
if (ret == -1)
return (0);
return (1);
}

View File

@@ -6,7 +6,7 @@
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/04 05:59:26 by lperrey #+# #+# */
/* Updated: 2021/11/29 12:43:34 by lperrey ### ########.fr */
/* Updated: 2021/12/18 05:08:48 by lperrey ### ########.fr */
/* */
/* ************************************************************************** */
@@ -17,13 +17,11 @@ int main(int argc, char *argv[])
t_all c;
(void)argc;
(void)argv;
if (!init(&c))
if (!init(&c, argv))
exit_free(&c, EXIT_FAILURE);
//putenv("VAR=W1 W2 W3"); // TEMP TEST
// if (argv[1] || !isatty(STDIN_FILENO))
// shell_script(&c);
// else
if (!isatty(STDIN_FILENO))
shell_script(&c);
else
shell_loop(&c);
return (0);
}

View File

@@ -6,7 +6,7 @@
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/04 05:59:26 by lperrey #+# #+# */
/* Updated: 2021/12/17 22:11:26 by hulamy ### ########.fr */
/* Updated: 2021/12/18 12:34:08 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
@@ -21,8 +21,7 @@ void shell_loop(t_all *c)
line_input = NULL;
while (1)
{
if (line_input)
free(line_input);
free(line_input);
line_input = read_input(c->prompt, c);
if (line_input && *line_input)
{

View File

@@ -6,14 +6,62 @@
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/26 23:47:44 by lperrey #+# #+# */
/* Updated: 2021/11/29 12:43:44 by lperrey ### ########.fr */
/* Updated: 2021/12/18 08:51:46 by lperrey ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
void shell_script(t_all *c) // WIP
static char *read_input_script(t_all *c);
static void exit_signal(t_all *c);
void shell_script(t_all *c)
{
ft_putstr_fd("Shell Script Placeholder\n", 1);
exit_free(c, EXIT_SUCCESS);
char *line_input;
line_input = NULL;
while (1)
{
free(line_input);
line_input = read_input_script(c);
if (line_input && *line_input)
{
c->token_list = lexing(line_input);
ft_free_null(&line_input);
if (!c->token_list)
break ;
c->pipeline = parsing(c->token_list);
ft_lstclear((t_list **)&c->token_list, free);
if (!c->pipeline)
break ;
exec_cmd_line(c);
if (get_last_exit_status() > EXIT_SIGNAL)
exit_signal(c);
}
}
free(line_input);
exit_free(c, get_last_exit_status());
}
static char *read_input_script(t_all *c)
{
char *line_input;
struct sigaction signal_behaviour;
ft_bzero(&signal_behaviour, sizeof signal_behaviour);
signal_behaviour.sa_handler = sigint_handler_interactive;
sigaction(SIGINT, &signal_behaviour, NULL);
rl_event_hook = NULL;
line_input = readline(NULL);
signal_behaviour.sa_handler = SIG_IGN;
sigaction(SIGINT, &signal_behaviour, NULL);
if (!line_input)
exit_free(c, get_last_exit_status());
return (line_input);
}
static void exit_signal(t_all *c)
{
write(STDOUT_FILENO, "\n", 1);
exit_free(c, get_last_exit_status());
}