From e47ba2f8f816052afff6ddd69de2681f22637e03 Mon Sep 17 00:00:00 2001 From: Loic Deridder Date: Tue, 14 Jan 2025 14:02:16 +0100 Subject: [PATCH] pwd/exit --- includes/builtins.h | 7 ++++++ includes/minishell.h | 2 +- srcs/builtins/cd.c | 27 +++++++++++++++++++++++ srcs/builtins/echo.c | 8 +++++++ srcs/builtins/env.c | 1 + srcs/builtins/exit.c | 50 ++++++++++++++++++++++++++++++++++++++++++ srcs/builtins/export.c | 1 + srcs/builtins/pwd.c | 20 +++++++++++++++++ srcs/builtins/test.c | 9 ++++++++ srcs/builtins/unset.c | 1 + srcs/main.c | 6 +++-- 11 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 srcs/builtins/cd.c create mode 100644 srcs/builtins/echo.c create mode 100644 srcs/builtins/env.c create mode 100644 srcs/builtins/exit.c create mode 100644 srcs/builtins/export.c create mode 100644 srcs/builtins/pwd.c create mode 100644 srcs/builtins/test.c create mode 100644 srcs/builtins/unset.c diff --git a/includes/builtins.h b/includes/builtins.h index bcec082..f02cbfe 100644 --- a/includes/builtins.h +++ b/includes/builtins.h @@ -3,8 +3,15 @@ # include "../lib/libft/libft.h" # include +# include +# include +# include # include +# include // void echo(char *msg, int flag); +void builtin_exit(char *arg, bool depth); +void builtin_pwd(char *arg); + #endif diff --git a/includes/minishell.h b/includes/minishell.h index 0b897f9..cddcee8 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -6,7 +6,7 @@ # include # include -# include "lib/libft/libft.h" +# include "../lib/libft/libft.h" # include "builtins.h" # define POW1 "\033[1;38;2;21;22;26;48;2;92;106;178m" diff --git a/srcs/builtins/cd.c b/srcs/builtins/cd.c new file mode 100644 index 0000000..1478060 --- /dev/null +++ b/srcs/builtins/cd.c @@ -0,0 +1,27 @@ +#include "../../includes/builtins.h" + +// static char *find_home(char **envp) +// { +// int i; +// char *str; +// +// i = 0; +// if (!envp) +// return (NULL); +// while (ft_strnstr(envp[i], "HOME=", 5) == 0) +// i++; +// str = envp[i + 5]; +// return (str); +// } +// +// int cd(char *path, char **envp) +// { +// char *str; +// +// if (path == NULL) +// { +// //cd $HOME +// str = find_home(envp); +// chdir(str); +// } +// } diff --git a/srcs/builtins/echo.c b/srcs/builtins/echo.c new file mode 100644 index 0000000..1bda5f9 --- /dev/null +++ b/srcs/builtins/echo.c @@ -0,0 +1,8 @@ +#include "../../includes/builtins.h" + +// void echo(char *msg, int flag) +// { +// printf("%s", msg); +// if (flag == 0) +// printf("\n"); +// } diff --git a/srcs/builtins/env.c b/srcs/builtins/env.c new file mode 100644 index 0000000..6d3f2ef --- /dev/null +++ b/srcs/builtins/env.c @@ -0,0 +1 @@ +#include "../../includes/builtins.h" diff --git a/srcs/builtins/exit.c b/srcs/builtins/exit.c new file mode 100644 index 0000000..761108a --- /dev/null +++ b/srcs/builtins/exit.c @@ -0,0 +1,50 @@ +#include "../../includes/builtins.h" + +int ft_isnumeric(char *str) +{ + int i; + + i = 0; + while (str[i]) + { + if (ft_isdigit(str[i])) + i++; + else + return (0); + } + return (1); +} + +void bash_exit(int code) +{ + ft_putendl_fd("exit", 2); + exit(code); +} + +void bash_exit_error(char *arg) +{ + ft_putendl_fd("exit", 2); + ft_put_s_fd("minishell: exit: ", 2); + write(2, arg, ft_strlen(arg)); + ft_putendl_fd(": numeric argument required", 2); + exit(2); +} + +void builtin_exit(char *arg, bool depth) +{ + if (depth == true) + { + if (!ft_isnumeric(arg)) + { + ft_put_s_fd("minishell: exit: ", 2); + write(2, arg, ft_strlen(arg)); + ft_putendl_fd(": numeric argument required", 2); + exit(2); + } + exit(ft_atoi(arg)); + } + if (ft_isnumeric(arg)) + bash_exit(ft_atoi(arg)); + else + bash_exit_error(arg); +} diff --git a/srcs/builtins/export.c b/srcs/builtins/export.c new file mode 100644 index 0000000..6d3f2ef --- /dev/null +++ b/srcs/builtins/export.c @@ -0,0 +1 @@ +#include "../../includes/builtins.h" diff --git a/srcs/builtins/pwd.c b/srcs/builtins/pwd.c new file mode 100644 index 0000000..e6104fa --- /dev/null +++ b/srcs/builtins/pwd.c @@ -0,0 +1,20 @@ +#include "../../includes/builtins.h" + +void builtin_pwd(char *arg) +{ + char *cwd; + + if (ft_strlen(arg) > 3) + ft_putendl_fd("pwd: too many arguments", 2); + else + { + cwd = getcwd(NULL, 4096); + if (cwd != NULL) + { + printf("%s\n", cwd); + free(cwd); + } + if (!cwd) + perror("pwd"); + } +} diff --git a/srcs/builtins/test.c b/srcs/builtins/test.c new file mode 100644 index 0000000..070b172 --- /dev/null +++ b/srcs/builtins/test.c @@ -0,0 +1,9 @@ +#include "../../includes/builtins.h" +#include +#include +// +// int main(int ac, char **av, char **envp) +// { +// if (envp != NULL) +// printf("%s\n", envp[0]); +// } diff --git a/srcs/builtins/unset.c b/srcs/builtins/unset.c new file mode 100644 index 0000000..6d3f2ef --- /dev/null +++ b/srcs/builtins/unset.c @@ -0,0 +1 @@ +#include "../../includes/builtins.h" diff --git a/srcs/main.c b/srcs/main.c index 4ab82b2..21a0923 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -1,4 +1,4 @@ -#include "../minishell.h" +#include "../includes/minishell.h" char *powerline(void) { @@ -33,7 +33,9 @@ int main(int ac, char **av, char **envp) { input = powerline(); if (ft_strncmp(input, "exit", 4) == 0) - break ; + builtin_exit(&input[5], true); + if (ft_strncmp(input, "pwd", 3) == 0) + builtin_pwd(input); free(input); } return (0);