ajout des builtins pwd cd et export

This commit is contained in:
hugogogo
2021-11-11 17:44:42 +01:00
parent d65a701186
commit 47ae67ed14
12 changed files with 127 additions and 147 deletions

10
srcs/builtins/cd.c Normal file
View File

@@ -0,0 +1,10 @@
#include "minishell.h"
int builtin_cd(int argc, char *argv[], t_all *c)
{
(void)argc;
(void)c;
chdir(argv[1]);
return (0);
}

47
srcs/builtins/export.c Normal file
View File

@@ -0,0 +1,47 @@
#include "minishell.h"
int getenv_position(char **envp, char *name)
{
int i;
i = 0;
while (envp[i] && ft_strncmp(envp[i], name, ft_strlen(name)))
i++;
if (!envp[i])
return (-1);
return (i);
}
int builtin_export(int argc, char *argv[], t_all *c)
{
char **var;
int position;
(void)argc;
var = ft_split(argv[1], '=');
position = getenv_position(c->envp, var[0]);
if (position == -1 || !ft_strchr(argv[1], '='))
return (0);
c->envp[position] = ft_strjoin(var[0], "=");
if (var[1]) // parce que ft_strjoin return NULL si var[1] est null, pourquoi ?
c->envp[position] = ft_strjoin(c->envp[position], var[1]);
return (0);
}
/*
** comportement de bash :
** 1. modifier une variable dans bash :
** > ca ne la modifie pas dans zsh
** > ca ne la garde pas apres exit de bash
** 2. ajouter une variable dans bash :
** > ca ne la modifie pas dans zsh
** > ca ne la garde pas apres exit de bash
** 3. ajouter une variable avec erreur :
** > 'export VARIABLE' n'exporte rien
** > 'export VARIABLE=' exporte une variable vide
** 4. ordre d'insertion d'une nouvelle variable :
**
**
*/

15
srcs/builtins/pwd.c Normal file
View File

@@ -0,0 +1,15 @@
#include "minishell.h"
int builtin_pwd(int argc, char *argv[], t_all *c)
{
char *pwd;
(void)argc;
(void)argv;
(void)c;
pwd = getcwd(NULL, 0);
write(1, pwd, ft_strlen(pwd));
write(1, "\n", 1);
return (0);
}

10
srcs/builtins/unset.c Normal file
View File

@@ -0,0 +1,10 @@
#include "minishell.h"
int builtin_unset(int argc, char *argv[], t_all *c)
{
(void)argc;
(void)argv;
(void)c;
return (0);
}

View File

@@ -1,110 +0,0 @@
#include "minishell.h"
void close_fd(t_cmd *cmd)
{
if (cmd->fd_in != 0)
close(cmd->fd_in);
if (cmd->fd_out != 1)
close(cmd->fd_out);
}
void exec_cmd(char **envp, t_list *cmd_list)
{
t_cmd *cmd;
pid_t pid;
pid_t wpid;
int status;
while(cmd_list)
{
cmd = cmd_list->content;
pid = fork();
if (pid == 0)
{
if (cmd->fd_in != 0)
dup2(cmd->fd_in, STDIN_FILENO);
if (cmd->fd_out != 1)
dup2(cmd->fd_out, STDOUT_FILENO);
close_fd(cmd);
execve(cmd->argv[0], cmd->argv, envp);
}
else
close_fd(cmd);
cmd_list = cmd_list->next;
}
// waitpid pour la derniere commande (pour '$?')
while ((wpid = wait(&status)) > 0);
}
int nbr_pipes(char *input)
{
int i;
int count;
i = -1;
count = 0;
while (input[++i])
if (input[i] == '|')
count++;
return (count);
}
int handle_fdd(char *input, int fdin, t_cmd *cmd)
{
int *pipes_fd;
int next_in;
char *tmp;
cmd->fd_in = fdin;
cmd->fd_out = 1;
next_in = 0;
if (input + 1)
{
pipes_fd = calloc(2, sizeof(int));
pipe(pipes_fd);
cmd->fd_out = pipes_fd[1];
next_in = pipes_fd[0];
}
tmp = ft_strchr(input, '>');
if (tmp)
{
tmp[0] = '\0';
tmp = ft_strtrim(tmp + 2, " "); // +2 for "> "
if (cmd->fd_out != 1)
close(cmd->fd_out);
cmd->fd_out = open(tmp, O_RDWR | O_TRUNC);
}
tmp = ft_strchr(input, '<');
if (tmp)
{
tmp[0] = '\0';
tmp = ft_strtrim(tmp + 2, " "); // +2 for "> "
if (cmd->fd_in != 0)
close(cmd->fd_in);
cmd->fd_in = open(tmp, O_RDONLY);
}
printf(" handle_fd: %s\n", input);
return (next_in);
}
t_cmd *fill_cmd(char *input, char **envp)
{
t_cmd *cmd;
char **input_split;
int i;
int tmp_fd;
cmd = calloc(nbr_pipes(input), sizeof(t_cmd));
input_split = ft_split(input, '|');
tmp_fd = 0;
i = 0;
while (input_split[i])
{
tmp_fd = handle_fdd(input_split[i], tmp_fd, &cmd[i]);
cmd[i].argv = ft_split(input_split[i], ' ');
cmd[i].builtin = cmd_path(cmd[i].argv, envp);
i++;
}
return (cmd);
}

View File

@@ -6,7 +6,7 @@
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/10 23:53:17 by lperrey #+# #+# */
/* Updated: 2021/10/30 14:18:09 by lperrey ### ########.fr */
/* Updated: 2021/11/10 17:15:44 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
@@ -18,8 +18,8 @@ int free_exit(t_all *c, int exit_status)
free(c->prompt);
ft_lstclear((t_list **)&c->token_list, free); // a voir avec Hugo, il y a un truc qui me semble superflu dans la fonction
ft_free_2d_arr(c->envp);
if (c->termios_changed)
tcsetattr(STDIN_FILENO, TCSANOW, &c->ori_termios);
// if (c->termios_changed)
// tcsetattr(STDIN_FILENO, TCSANOW, &c->ori_termios);
rl_clear_history();
exit(exit_status);
}

View File

@@ -6,7 +6,7 @@
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/24 10:52:40 by lperrey #+# #+# */
/* Updated: 2021/11/02 13:49:06 by hulamy ### ########.fr */
/* Updated: 2021/11/11 13:11:55 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
@@ -140,26 +140,26 @@ void handle_argv(t_token *token, t_cmd **cmd, size_t cmd_nbr)
int fill_builtin(t_cmd *cmd, int (*builtin)(int, char **, t_all *))
{
cmd->builtin_command = &builtin;
cmd->builtin_command = builtin;
return (1);
}
int handle_builtin(t_cmd *cmd)
{
if (!ft_strncmp(cmd->argv[0], "echo", 4))
return (fill_builtin(cmd, &builtin_echo));
// else if (!ft_strncmp(cmd->argv[0], "cd", 2))
// return (fill_builtin(cmd, &builtin_cd));
// else if (!ft_strncmp(cmd->argv[0], "pwd", 3))
// return (fill_builtin(cmd, &builtin_pwd));
// else if (!ft_strncmp(cmd->argv[0], "export", 6))
// return (fill_builtin(cmd, &builtin_export));
// else if (!ft_strncmp(cmd->argv[0], "unset", 5))
// return (fill_builtin(cmd, &builtin_unset));
return (fill_builtin(cmd, builtin_echo));
else if (!ft_strncmp(cmd->argv[0], "cd", 2))
return (fill_builtin(cmd, &builtin_cd));
else if (!ft_strncmp(cmd->argv[0], "pwd", 3))
return (fill_builtin(cmd, builtin_pwd));
else if (!ft_strncmp(cmd->argv[0], "export", 6))
return (fill_builtin(cmd, &builtin_export));
else if (!ft_strncmp(cmd->argv[0], "unset", 5))
return (fill_builtin(cmd, &builtin_unset));
else if (!ft_strncmp(cmd->argv[0], "env", 3))
return (fill_builtin(cmd, &builtin_env));
return (fill_builtin(cmd, builtin_env));
else if (!ft_strncmp(cmd->argv[0], "exit", 4))
return (fill_builtin(cmd, &builtin_exit));
return (fill_builtin(cmd, builtin_exit));
return (0);
}

View File

@@ -6,14 +6,14 @@
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/10/04 05:59:26 by lperrey #+# #+# */
/* Updated: 2021/11/10 13:43:10 by hulamy ### ########.fr */
/* Updated: 2021/11/11 09:54:40 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
void close_fd(t_cmd *cmd);
void execute_cmd(char **envp, t_cmd **cmd_arr);
void execute_cmd(char **envp, t_cmd **cmd_arr, t_all *c);
void shell_loop(t_all *c)
{
@@ -30,7 +30,7 @@ void shell_loop(t_all *c)
add_history(line_input);
c->token_list = input_to_tokens(line_input);
c->cmd_arr = parsing(c->token_list, c->envp);
execute_cmd(c->envp, c->cmd_arr);
execute_cmd(c->envp, c->cmd_arr, c);
ft_lstclear((t_list **)&c->token_list, free);
}
else if (!line_input)
@@ -49,12 +49,13 @@ void close_fd(t_cmd *cmd)
close(cmd->fd_out);
}
void execute_cmd(char **envp, t_cmd **cmd_arr)
void execute_cmd(char **envp, t_cmd **cmd_arr, t_all *c)
{
pid_t pid;
pid_t wpid;
int status;
int i;
int argc;
i = 0;
while(cmd_arr[i])
@@ -67,7 +68,15 @@ void execute_cmd(char **envp, t_cmd **cmd_arr)
if (cmd_arr[i]->fd_out != 1)
dup2(cmd_arr[i]->fd_out, STDOUT_FILENO);
close_fd(cmd_arr[i]);
execve(cmd_arr[i]->argv[0], cmd_arr[i]->argv, envp);
if (cmd_arr[i]->builtin_command)
{
argc = 0;
while (cmd_arr[i]->argv[argc])
argc++;
cmd_arr[i]->builtin_command(argc, cmd_arr[i]->argv, c);
}
else
execve(cmd_arr[i]->argv[0], cmd_arr[i]->argv, envp);
}
else
close_fd(cmd_arr[i]);