From 36d7fc342d5c84635b4535d15626d636722e1d50 Mon Sep 17 00:00:00 2001 From: Tanguy MAZE Date: Sun, 13 Jan 2019 19:03:08 +0100 Subject: [PATCH] added basic env & setenv commands --- Makefile | 4 +- includes/minishell.h | 19 ++++++--- libft | 2 +- srcs/cmd_cd.c | 45 ++++++++++++++++++++ srcs/cmd_echo.c | 4 +- srcs/cmd_env.c | 30 ++++++++++++++ srcs/cmd_setenv.c | 22 ++++++++++ srcs/exec.c | 23 +++++----- srcs/main.c | 4 +- srcs/ms_env.c | 99 ++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 228 insertions(+), 24 deletions(-) create mode 100644 srcs/cmd_cd.c create mode 100644 srcs/cmd_env.c create mode 100644 srcs/cmd_setenv.c create mode 100644 srcs/ms_env.c diff --git a/Makefile b/Makefile index 054d55f..d8a4d72 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: tmaze +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/11/22 14:43:33 by tmaze #+# #+# # -# Updated: 2019/01/12 15:37:35 by tmaze ### ########.fr # +# Updated: 2019/01/13 17:03:41 by tmaze ### ########.fr # # # #******************************************************************************# @@ -16,7 +16,7 @@ CCSTD := NAME := minishell -SRCS := main.c exec.c cmd_echo.c cmd_cd.c +SRCS := main.c exec.c cmd_echo.c cmd_cd.c cmd_env.c cmd_setenv.c ms_env.c OBJS_DIR := objs OBJS := $(addprefix $(OBJS_DIR)/, $(SRCS:.c=.o)) INCLS := -Iincludes -Ilibft diff --git a/includes/minishell.h b/includes/minishell.h index b7f2bca..940a318 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/11/18 13:12:34 by tmaze #+# #+# */ -/* Updated: 2019/01/10 13:52:54 by tmaze ### ########.fr */ +/* Updated: 2019/01/13 17:03:08 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ typedef struct s_builtin { char *cmd; - int (*f)(char **argv, t_list *env); + int (*f)(char **argv, t_list **env); } t_builtin; typedef struct s_envelem @@ -29,8 +29,17 @@ typedef struct s_envelem char *val; } t_envelem; -int exec_cmd(char **argv, t_list *env); -int cmd_echo(char **argv, t_list *env); -int cmd_cd(char **argv, t_list *env); +t_envelem *elem_new(char *key, char *val); +t_envelem *env_getelemfromkey(char *key, t_list *env); +t_envelem *env_addupdate(char *key, char *val, t_list **env); +void env_delelem(char *key, t_list **env); + +void ft_lstdelenvelem(void *content, size_t size); + +int exec_cmd(char **argv, t_list **env); +int cmd_echo(char **argv, t_list **env); +int cmd_cd(char **argv, t_list **env); +int cmd_env(char **argv, t_list **env); +int cmd_setenv(char **argv, t_list **env); #endif diff --git a/libft b/libft index 2e35007..19d3e23 160000 --- a/libft +++ b/libft @@ -1 +1 @@ -Subproject commit 2e3500751ebc7b13fe478fd1d16ba3bde1000a08 +Subproject commit 19d3e23b743dc95d0301579d1c5a0b97b36695aa diff --git a/srcs/cmd_cd.c b/srcs/cmd_cd.c new file mode 100644 index 0000000..b971e47 --- /dev/null +++ b/srcs/cmd_cd.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cmd_cd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/01/07 16:44:40 by tmaze #+# #+# */ +/* Updated: 2019/01/13 17:00:19 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int cmd_cd(char **argv, t_list **env) +{ + int i; + int ret; + char *path; + t_list *tmp; + + ret = 0; + i = 0; + tmp = *env; + path = NULL; + if (!argv[1]) + { + while (tmp ) + { + if (ft_strcmp(((t_envelem*)(tmp->content))->key, "HOME") == 0) + { + path = ((t_envelem*)(tmp->content))->val; + break ; + } + tmp = tmp->next; + } + if (path == NULL) + return (1); + } + else + path = argv[1]; + ft_putendl(path); + ret = chdir(path); + return (ret); +} diff --git a/srcs/cmd_echo.c b/srcs/cmd_echo.c index 02e5e0c..0fb155d 100644 --- a/srcs/cmd_echo.c +++ b/srcs/cmd_echo.c @@ -6,13 +6,13 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/11/27 16:14:07 by tmaze #+# #+# */ -/* Updated: 2019/01/09 15:13:21 by tmaze ### ########.fr */ +/* Updated: 2019/01/13 16:58:14 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int cmd_echo(char **argv, t_list *env) +int cmd_echo(char **argv, t_list **env) { size_t i; diff --git a/srcs/cmd_env.c b/srcs/cmd_env.c new file mode 100644 index 0000000..2702c90 --- /dev/null +++ b/srcs/cmd_env.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cmd_env.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/12/14 15:54:45 by tmaze #+# #+# */ +/* Updated: 2019/01/13 17:48:51 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int cmd_env(char **argv, t_list **env) +{ + t_list *tmp; + + if (argv[1] != NULL) + return (0); + tmp = *env; + while (tmp) + { + ft_putstr(((t_envelem*)(tmp->content))->key); + ft_putchar('='); + ft_putendl(((t_envelem*)(tmp->content))->val); + tmp = tmp->next; + } + return (0); +} diff --git a/srcs/cmd_setenv.c b/srcs/cmd_setenv.c new file mode 100644 index 0000000..c75c703 --- /dev/null +++ b/srcs/cmd_setenv.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cmd_setenv.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/01/13 16:20:20 by tmaze #+# #+# */ +/* Updated: 2019/01/13 17:05:05 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int cmd_setenv(char **argv, t_list **env) +{ + if (argv[1] == NULL) + return (-1); + if (env_addupdate(argv[1], argv[2], env) == NULL) + return (-1); + return (0); +} diff --git a/srcs/exec.c b/srcs/exec.c index 4024d8a..93d9e1f 100644 --- a/srcs/exec.c +++ b/srcs/exec.c @@ -6,13 +6,13 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/11/27 15:32:29 by tmaze #+# #+# */ -/* Updated: 2019/01/12 17:54:54 by tmaze ### ########.fr */ +/* Updated: 2019/01/13 17:02:33 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -#define S_BIN 2 +#define S_BIN 4 char **envlsttotab(t_list *env) { @@ -47,22 +47,22 @@ char **envlsttotab(t_list *env) ** , {"setenv", &cmd_senv}, {"unsetenv", &cmd_senv}, {"env", &cmd_env}}; */ -int exec_cmd(char **argv, t_list *env) +int exec_cmd(char **argv, t_list **env) { int ret; char **env_tab; size_t i; static t_builtin builtins[S_BIN] = {{"echo", &cmd_echo}, - {"cd", &cmd_cd}}; + {"cd", &cmd_cd}, {"env", &cmd_env}, + {"setenv", &cmd_setenv}}; i = 0; while (i < S_BIN) - { - if (ft_strcmp(argv[0], builtins[i].cmd) == 0) - return ((*(builtins[i].f))(argv, env)); - i++; - } - if ((env_tab = envlsttotab(env)) == NULL) + if (ft_strcmp(argv[0], builtins[i++].cmd) == 0) + return ((*(builtins[i - 1].f))(argv, env)); + if ((ret = access(argv[0], X_OK)) == -1) + ft_putendl("minishell: file not found or not executable"); + if (ret == -1 || (env_tab = envlsttotab(*env)) == NULL) return (-1); if ((ret = fork()) == 0) { @@ -72,10 +72,9 @@ int exec_cmd(char **argv, t_list *env) exit(-1); } else if (ret == -1) - { ft_putendl_fd("minishell: error", 2); + if (ret == -1) return (-1); - } waitpid(ret, NULL, 0); ft_del_words_tables(&env_tab); return (0); diff --git a/srcs/main.c b/srcs/main.c index c564eef..26738d5 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/11/18 13:09:55 by tmaze #+# #+# */ -/* Updated: 2019/01/12 17:26:33 by tmaze ### ########.fr */ +/* Updated: 2019/01/13 16:59:24 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -126,7 +126,7 @@ int main(void) return (2); } ft_strdel(&cmd); - exec_cmd(tab_cmd, lst_env); + exec_cmd(tab_cmd, &lst_env); ft_del_words_tables(&tab_cmd); } ft_lstdel(&lst_env, &ft_lstdelenvelem); diff --git a/srcs/ms_env.c b/srcs/ms_env.c new file mode 100644 index 0000000..c90fac8 --- /dev/null +++ b/srcs/ms_env.c @@ -0,0 +1,99 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ms_env.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/01/13 14:44:20 by tmaze #+# #+# */ +/* Updated: 2019/01/13 19:02:04 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_envelem *elem_new(char *key, char *val) +{ + t_envelem *elem; + + if ((elem = (t_envelem*)ft_memalloc(sizeof(t_envelem))) == NULL) + return (NULL); + if ((elem->key = ft_strdup(key)) == NULL) + { + ft_memdel((void**)&elem); + return (NULL); + } + if (val != NULL && (elem->val = ft_strdup(val)) == NULL) + { + ft_strdel(&(elem->key)); + ft_memdel((void**)&elem); + return (NULL); + } + elem->val = (val == NULL) ? NULL : elem->val; + return (elem); +} + +t_envelem *env_getelemfromkey(char *key, t_list *env) +{ + t_list *tmp; + + tmp = env; + while (tmp) + { + if (ft_strcmp(((t_envelem*)(tmp->content))->key, key) == 0) + return ((t_envelem*)(tmp->content)); + tmp = tmp->next; + } + return (NULL); +} + +t_envelem *env_addupdate(char *key, char *val, t_list **env) +{ + t_list *new; + t_envelem *elem; + char *tmp; + + if ((elem = env_getelemfromkey(key, *env)) != NULL) + { + if (val == NULL) + tmp = val; + else if ((tmp = ft_strdup(val)) == NULL) + return (NULL); + ft_strdel(&(elem->val)); + elem->val = tmp; + return (elem); + } + if ((elem = elem_new(key, val)) == NULL + || (new = ft_lstnew(elem, sizeof(t_envelem))) == NULL) + return (NULL); + ft_lstaddend(env, new); + ft_memdel((void**)&elem); + return ((t_envelem*)(new->content)); +} + +void env_delelem(char *key, t_list **env) +{ + t_list *tmp; + t_list *prec; + + if (ft_strcmp(((t_envelem*)((*env)->content))->key, key) == 0) + { + tmp = *env; + *env = (*env)->next; + ft_lstdelone(&tmp, &ft_lstdelenvelem); + return ; + } + tmp = (*env)->next; + prec = (*env); + while (tmp) + { + if (ft_strcmp(((t_envelem*)(tmp->content))->key, key) == 0) + { + prec->next = tmp->next; + ft_lstdelone(&tmp, &ft_lstdelenvelem); + return ; + } + prec = tmp; + tmp = tmp->next; + } +}