builtin cd and exit WIP 42/52
This commit is contained in:
parent
e824b59969
commit
04ac2df8a5
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2025/02/04 16:26:35 by whaffman #+# #+# */
|
/* Created: 2025/02/04 16:26:35 by whaffman #+# #+# */
|
||||||
/* Updated: 2025/02/26 15:44:49 by whaffman ######## odam.nl */
|
/* Updated: 2025/03/03 21:32:49 by whaffman ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -24,5 +24,6 @@ int environment_parse(t_minishell *msh, char **envp);
|
|||||||
char **environment_get_arr(t_minishell *msh);
|
char **environment_get_arr(t_minishell *msh);
|
||||||
void environment_del(t_minishell *msh, char *name);
|
void environment_del(t_minishell *msh, char *name);
|
||||||
void environment_free(t_minishell *msh, void *content);
|
void environment_free(t_minishell *msh, void *content);
|
||||||
|
void environment_update(t_minishell *msh, char *name, char *value);
|
||||||
|
|
||||||
#endif // ENVIRONMENT_H
|
#endif // ENVIRONMENT_H
|
||||||
|
|||||||
54
sources.mk
54
sources.mk
@ -1,27 +1,27 @@
|
|||||||
VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/signal:src/debug:src/expander:src/builtin:src/redirect:
|
VPATH = src:src/parser:src/environment:src/lexer:src/redirect:src/debug:src/token:src/signal:src/prompt:src/utils:src/expander:src/executor:src/builtin:
|
||||||
SOURCES = history_write.c history_load.c prompt.c check_malloc.c \
|
SOURCES = parser_validate_command.c parser_get_arguments.c \
|
||||||
free_command_list.c free_freelist.c free_lexer.c free_safe.c \
|
parser_alloc_command.c parser_create_command.c parser_get_commands.c \
|
||||||
free_token.c free_token_list.c ft_lstclear_safe.c ft_lstnew_safe.c \
|
environment_get.c environment_get_arr.c environment_free_list.c \
|
||||||
ft_strdup_safe.c ft_strjoin_safe.c malloc_safe.c \
|
environment_update.c environment_add.c environment_print.c \
|
||||||
free_minishell_line.c ft_substr_safe.c error_msg.c ft_split_safe.c \
|
environment_del.c environment_free.c environment_parse.c lexer_new.c \
|
||||||
init_minishell.c print_banner.c ft_free_arr_safe.c free_minishell.c \
|
lexer_read_word.c lexer_read_char.c lexer_parse_input.c \
|
||||||
lexer_read_char.c lexer_new.c lexer_parse_input.c \
|
lexer_parse_quotes.c lexer_token_next.c redirect_get_inputs.c \
|
||||||
lexer_parse_quotes.c lexer_read_word.c lexer_token_next.c token_new.c \
|
redirect_get_outputs.c redirect_new.c redirect_valid_type.c \
|
||||||
token_char_convert.c token_parse.c token_type_convert.c \
|
redirect_new_error.c redirect_process_heredoc.c print_freelist.c \
|
||||||
environment_del.c environment_free.c environment_get.c \
|
print_commands.c main.c token_new.c token_char_convert.c \
|
||||||
environment_get_arr.c environment_free_list.c environment_parse.c \
|
token_parse.c token_type_convert.c signal_init.c.c signal.c \
|
||||||
environment_print.c environment_add.c executor_close_fds.c \
|
history_write.c prompt.c history_load.c free_command_list.c \
|
||||||
executor_open_fds.c executor_count_fds.c executor_create_pipes.c \
|
free_minishell.c ft_lstnew_safe.c free_safe.c free_lexer.c \
|
||||||
executor_create_redirects.c executor_execute_pipeline.c \
|
ft_free_arr_safe.c print_banner.c check_malloc.c free_freelist.c \
|
||||||
executor_fork.c executor_absolute_path.c executor_child.c \
|
ft_lstclear_safe.c ft_split_safe.c error_msg.c free_token_list.c \
|
||||||
parser_alloc_command.c parser_create_command.c parser_get_arguments.c \
|
malloc_safe.c free_minishell_line.c ft_strdup_safe.c free_token.c \
|
||||||
parser_get_commands.c parser_validate_command.c signal.c \
|
ft_substr_safe.c init_minishell.c ft_strjoin_safe.c \
|
||||||
signal_init.c.c print_commands.c print_freelist.c \
|
expander_allocate_memory.c expander_parse_string.c \
|
||||||
expander_expand_dollar.c expander_is_character.c \
|
expander_parse_variables.c expander_expand_dollar.c \
|
||||||
expander_parse_variables.c expander_get_variable.c \
|
expander_is_character.c expander_get_variable.c executor_open_fds.c \
|
||||||
expander_allocate_memory.c expander_parse_string.c is_builtin.c \
|
executor_count_fds.c executor_fork.c executor_absolute_path.c \
|
||||||
builtin_echo.c builtin_env.c builtin_router.c builtin_unset.c \
|
executor_execute_pipeline.c executor_child.c executor_close_fds.c \
|
||||||
simple_builtins.c builtin_cd.c builtin_exit.c builtin_export.c \
|
executor_create_redirects.c executor_create_pipes.c builtin_export.c \
|
||||||
builtin_pwd.c redirect_process_heredoc.c redirect_get_inputs.c \
|
simple_builtins.c builtin_router.c is_builtin.c builtin_unset.c \
|
||||||
redirect_get_outputs.c redirect_new.c redirect_new_error.c \
|
builtin_env.c builtin_cd.c builtin_pwd.c builtin_exit.c \
|
||||||
redirect_valid_type.c main.c \
|
builtin_echo.c \
|
||||||
|
|||||||
@ -6,33 +6,51 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2025/02/20 11:33:07 by whaffman #+# #+# */
|
/* Created: 2025/02/20 11:33:07 by whaffman #+# #+# */
|
||||||
/* Updated: 2025/03/03 14:43:09 by whaffman ######## odam.nl */
|
/* Updated: 2025/03/03 21:42:47 by whaffman ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
|
|
||||||
|
static int builtin_cd_change_directory(t_minishell *msh, char *path)
|
||||||
|
{
|
||||||
|
char *oldpwd;
|
||||||
|
|
||||||
|
oldpwd = getcwd(NULL, 0);
|
||||||
|
if (oldpwd == NULL)
|
||||||
|
return (error_msg("cd", "getcwd failed"), EXIT_FAILURE);
|
||||||
|
if (chdir(path) == -1)
|
||||||
|
return (error_msg("cd", path), free(oldpwd), EXIT_FAILURE);
|
||||||
|
environment_update(msh, "OLDPWD", oldpwd);
|
||||||
|
free(oldpwd);
|
||||||
|
path = getcwd(NULL, 0);
|
||||||
|
environment_update(msh, "PWD", path);
|
||||||
|
free(path);
|
||||||
|
return (EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
int builtin_cd(t_minishell *msh, t_command *cmd)
|
int builtin_cd(t_minishell *msh, t_command *cmd)
|
||||||
{
|
{
|
||||||
t_environment *env;
|
t_environment *env;
|
||||||
char *path;
|
char *path;
|
||||||
|
|
||||||
|
if (cmd->args[1] != NULL && cmd->args[2] != NULL)
|
||||||
|
return (error_msg("cd", "too many arguments"), EXIT_FAILURE);
|
||||||
if (cmd->args[1] == NULL)
|
if (cmd->args[1] == NULL)
|
||||||
{
|
{
|
||||||
env = environment_get(msh, "HOME");
|
env = environment_get(msh, "HOME");
|
||||||
if (env == NULL || env->value == NULL)
|
if (env == NULL || env->value == NULL)
|
||||||
{
|
return (error_msg("cd", "HOME not set"), EXIT_FAILURE);
|
||||||
error_msg(NULL, NULL);
|
path = env->value;
|
||||||
return (EXIT_FAILURE);
|
}
|
||||||
}
|
else if (ft_strcmp(cmd->args[1], "-") == 0)
|
||||||
|
{
|
||||||
|
env = environment_get(msh, "OLDPWD");
|
||||||
|
if (env == NULL || env->value == NULL)
|
||||||
|
return (error_msg("cd", "OLDPWD not set"), EXIT_FAILURE);
|
||||||
path = env->value;
|
path = env->value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
path = cmd->args[1];
|
path = cmd->args[1];
|
||||||
if (chdir(path) == -1)
|
return (builtin_cd_change_directory(msh, path));
|
||||||
{
|
|
||||||
error_msg("cd", path);
|
|
||||||
return (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
return (EXIT_SUCCESS);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: qmennen <qmennen@student.codam.nl> +#+ */
|
/* By: qmennen <qmennen@student.codam.nl> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */
|
/* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */
|
||||||
/* Updated: 2025/03/03 14:44:01 by whaffman ######## odam.nl */
|
/* Updated: 2025/03/03 21:46:10 by whaffman ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ int builtin_exit(t_minishell *msh, t_command *cmd)
|
|||||||
exit_status = 0;
|
exit_status = 0;
|
||||||
if (ft_count_arr(cmd->args) > 2)
|
if (ft_count_arr(cmd->args) > 2)
|
||||||
{
|
{
|
||||||
ft_putstr_fd("exit\n", STDERR_FILENO);
|
ft_putstr_fd("exit\n", STDOUT_FILENO);
|
||||||
ft_putstr_fd("minishell: exit: too many arguments\n", STDERR_FILENO);
|
ft_putstr_fd("minishell: exit: too many arguments\n", STDERR_FILENO);
|
||||||
return (EXIT_FAILURE);
|
return (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@ -28,16 +28,16 @@ int builtin_exit(t_minishell *msh, t_command *cmd)
|
|||||||
{
|
{
|
||||||
if (ft_isdigit_str(cmd->args[1]) == FALSE)
|
if (ft_isdigit_str(cmd->args[1]) == FALSE)
|
||||||
{
|
{
|
||||||
ft_putstr_fd("exit\n", STDERR_FILENO);
|
ft_putstr_fd("exit\n", STDOUT_FILENO);
|
||||||
ft_putstr_fd("minishell: exit: ", STDERR_FILENO);
|
ft_putstr_fd("minishell: exit: ", STDERR_FILENO);
|
||||||
ft_putstr_fd(cmd->args[1], STDERR_FILENO);
|
ft_putstr_fd(cmd->args[1], STDERR_FILENO);
|
||||||
ft_putstr_fd(": numeric argument required\n", STDERR_FILENO);
|
ft_putstr_fd(": numeric argument required\n", STDERR_FILENO);
|
||||||
return (EXIT_FAILURE);
|
return (2);
|
||||||
}
|
}
|
||||||
exit_status = ft_atoi(cmd->args[1]);
|
exit_status = ft_atoi(cmd->args[1]);
|
||||||
}
|
}
|
||||||
free_minishell(&msh);
|
free_minishell(&msh);
|
||||||
ft_putendl_fd("exit", STDERR_FILENO);
|
ft_putendl_fd("exit", STDOUT_FILENO);
|
||||||
rl_clear_history();
|
rl_clear_history();
|
||||||
exit(exit_status);
|
exit(exit_status);
|
||||||
return (FAILURE);
|
return (FAILURE);
|
||||||
|
|||||||
@ -6,15 +6,30 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */
|
/* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */
|
||||||
/* Updated: 2025/03/03 14:37:13 by whaffman ######## odam.nl */
|
/* Updated: 2025/03/03 22:30:52 by whaffman ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
|
|
||||||
|
|
||||||
|
//TO LIBFT
|
||||||
|
static int ft_isvalid_identifier(char *str)
|
||||||
|
{
|
||||||
|
if (ft_isalpha(*str) == FALSE && *str != '_')
|
||||||
|
return (FALSE);
|
||||||
|
while (*str != '\0')
|
||||||
|
{
|
||||||
|
if (ft_isalnum(*str) == FALSE && *str != '_')
|
||||||
|
return (FALSE);
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
int builtin_export(t_minishell *msh, t_command *cmd)
|
int builtin_export(t_minishell *msh, t_command *cmd)
|
||||||
{
|
{
|
||||||
t_environment *env;
|
char *err;
|
||||||
char **arr;
|
char **arr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -23,18 +38,17 @@ int builtin_export(t_minishell *msh, t_command *cmd)
|
|||||||
while (cmd->args[++i] != NULL)
|
while (cmd->args[++i] != NULL)
|
||||||
{
|
{
|
||||||
arr = ft_split_safe(msh, cmd->args[i], '=');
|
arr = ft_split_safe(msh, cmd->args[i], '=');
|
||||||
if (arr[1] == NULL)
|
if (arr == NULL || arr[0] == NULL)
|
||||||
return (FAILURE) ;
|
return (ft_free_arr_safe(msh, arr), EXIT_FAILURE);
|
||||||
env = environment_get(msh, arr[0]);
|
else if (ft_isvalid_identifier(arr[0]) == TRUE)
|
||||||
if (env != NULL)
|
environment_update(msh, arr[0], arr[1]);
|
||||||
{
|
|
||||||
free_safe(msh, (void **)&(env->value));
|
|
||||||
env->value = ft_strdup_safe(msh, arr[1]);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
environment_add(msh, arr[0], arr[1]);
|
{
|
||||||
|
err = ft_strjoin_safe(msh, arr[0], ": not a valid identifier");
|
||||||
|
error_msg("export", err);
|
||||||
|
return(ft_free_arr_safe(msh, arr), EXIT_FAILURE);
|
||||||
|
}
|
||||||
ft_free_arr_safe(msh, arr);
|
ft_free_arr_safe(msh, arr);
|
||||||
}
|
}
|
||||||
ft_free_arr_safe(msh, arr);
|
return (EXIT_SUCCESS);
|
||||||
return (SUCCESS);
|
|
||||||
}
|
}
|
||||||
|
|||||||
29
src/environment/environment_update.c
Normal file
29
src/environment/environment_update.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* :::::::: */
|
||||||
|
/* environment_update.c :+: :+: */
|
||||||
|
/* +:+ */
|
||||||
|
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
||||||
|
/* +#+ */
|
||||||
|
/* Created: 2025/03/03 21:28:53 by whaffman #+# #+# */
|
||||||
|
/* Updated: 2025/03/03 21:33:16 by whaffman ######## odam.nl */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
void environment_update(t_minishell *msh, char *name, char *value)
|
||||||
|
{
|
||||||
|
t_environment *env;
|
||||||
|
|
||||||
|
if (environment_get(msh, name) == NULL)
|
||||||
|
{
|
||||||
|
environment_add(msh, name, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
env = environment_get(msh, name);
|
||||||
|
free_safe(msh, (void **)&(env->value));
|
||||||
|
env->value = ft_strdup_safe(msh, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user