diff --git a/Makefile b/Makefile index b62ab00..c915c5a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: tmaze +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/11/22 14:43:33 by tmaze #+# #+# # -# Updated: 2019/01/30 15:50:42 by tmaze ### ########.fr # +# Updated: 2019/02/01 10:20:18 by tmaze ### ########.fr # # # #******************************************************************************# @@ -16,7 +16,7 @@ CCSTD := NAME := minishell -SRCS := main.c exec.c cmd_echo.c cmd_cd.c cmd_env.c cmd_setenv.c cmd_unsetenv.c ms_env.c +SRCS := main.c exec.c cmd_echo.c cmd_cd.c cmd_env.c cmd_setenv.c cmd_unsetenv.c ms_env.c ms_env2.c OBJS_DIR := objs OBJS := $(SRCS:.c=.o) INCLS := -Iincludes -Ilibft diff --git a/includes/minishell.h b/includes/minishell.h index faa075f..a22817d 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/31 17:36:17 by tmaze ### ########.fr */ +/* Updated: 2019/02/01 10:19:53 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,7 +34,10 @@ 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); +t_envelem *ft_envtoenvelem(char *env); void ft_lstdelenvelem(void *content, size_t size); +void ft_envelemdel(t_envelem **env); +t_list *ft_envtolst(char **env); int exec_cmd(char **argv, t_list **env); int cmd_echo(char **argv, t_list **env); @@ -47,8 +50,4 @@ int ft_isin(char *str, char c); char *check_path_slash(char *exec); char *check_path_dot(char *exec, t_list *env); -void ft_lstdelenvelem(void *content, size_t size); - -t_envelem *ft_envtoenvelem(char *env); - #endif diff --git a/srcs/cmd_env.c b/srcs/cmd_env.c index 9f5037f..2917c76 100644 --- a/srcs/cmd_env.c +++ b/srcs/cmd_env.c @@ -6,12 +6,21 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/12/14 15:54:45 by tmaze #+# #+# */ -/* Updated: 2019/01/31 17:57:27 by tmaze ### ########.fr */ +/* Updated: 2019/02/01 16:26:42 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +void put_error(char *exec, char *file, char *msg) +{ + ft_putstr(exec); + ft_putstr(": "); + ft_putstr(file); + ft_putstr(": "); + ft_putendl(msg); +} + void put_env(t_list *env) { t_list *tmp; @@ -33,52 +42,81 @@ t_envelem *envelemdup(t_envelem *elem) if ((ret = (t_envelem*)ft_memalloc(sizeof(t_envelem))) == NULL) return (NULL); if ((ret->key = ft_strdup(elem->key)) == NULL) - ft_memdel(&ret); + ft_envelemdel(&ret); if (ret == NULL) return (0); if ((ret->val = ft_strdup(elem->val)) == NULL) { ft_strdel(&(ret->key)); - ft_memdel(&ret); + ft_envelemdel(&ret); return (NULL); } return (ret); } -t_list *env_cpy(t_list *env) +t_list *env_cpy(t_list *env) { t_list *ret; t_list *ind; t_list *tmp; - t_envelem elem; + t_envelem *envelem; ret = NULL; ind = env; while (ind) { - if ((envelem = envelemdup((t_envelem*)ind->val)) == NULL) - ft_lstdel(&ret, &lstdelenvelem); - if (envelem = NULL) + if ((envelem = envelemdup((t_envelem*)(ind->content))) == NULL) + ft_lstdel(&ret, &ft_lstdelenvelem); + if (envelem == NULL) break ; if ((tmp = ft_lstnew((void*)envelem, sizeof(t_envelem))) == NULL || ft_lstaddend(&ret, tmp) == NULL) { - ft_memdel(&envelem); - ft_lstdel(&ret, &lstdelenvelem); + ft_envelemdel(&envelem); + ft_lstdel(&ret, &ft_lstdelenvelem); break ; } - ft_memdel(&envelem); + ft_envelemdel(&envelem); ind = ind->next; } return (ret); } -int cmd_env(char **argv, t_list **env) +int exec_env(char **argv, t_list **env) { + int ret; + char **env_tab; + char *path; + + if ((env_tab = envlsttotab(*env)) == NULL) + return (1); + if ((path = check_path(argv[0], *env)) == NULL) + ft_del_words_tables(&env_tab); + if (path == NULL) + return (1); + if ((ret = fork()) == 0) + { + execve(path, argv, env_tab); + if (ft_strcmp(path, argv[0]) != 0) + ft_strdel(&path); + ft_del_words_tables(&env_tab); + exit(1); + } + else if (ret == -1) + return (1); + waitpid(ret, NULL, 0); + ft_del_words_tables(&env_tab); + if (ft_strcmp(path, argv[0]) != 0) + ft_strdel(&path); + return (0); +} + +int cmd_env(char **argv, t_list **env) +{ + t_envelem *elem; t_list *env_cp; t_list *new; - t_envelem *envelem; - char tmp; + char *tmp; size_t i; if (argv[1] == NULL) @@ -88,7 +126,23 @@ int cmd_env(char **argv, t_list **env) return (2); while (argv[++i] && (tmp = ft_strchr(argv[i], '='))) { - // add each env arg to a char ** and pass it ti ft_envtolst + if ((elem = ft_envtoenvelem(argv[i])) == NULL) + ft_lstdel(&env_cp, &ft_lstdelenvelem); + if (elem == NULL) + return (1); + if ((new = ft_lstnew((void*)elem, sizeof(t_envelem))) == NULL) + { + ft_envelemdel(&elem); + ft_lstdel(&env_cp, &ft_lstdelenvelem); + return (1); + } + ft_memdel((void**)&elem); + if (ft_lstaddend(&env_cp, new) == NULL) + { + ft_lstdel(&env_cp, &ft_lstdelenvelem); + return (1); + } } + ft_lstdel(&env_cp, &ft_lstdelenvelem); return (0); } diff --git a/srcs/exec.c b/srcs/exec.c index 57fea91..0fae5a5 100644 --- a/srcs/exec.c +++ b/srcs/exec.c @@ -1,4 +1,4 @@ -/* ************************************************************************** */ +'/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* exec.c :+: :+: :+: */ @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/11/27 15:32:29 by tmaze #+# #+# */ -/* Updated: 2019/01/24 13:41:09 by tmaze ### ########.fr */ +/* Updated: 2019/02/01 16:49:31 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/main.c b/srcs/main.c index 7146f58..3756f71 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,87 +6,12 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/11/18 13:09:55 by tmaze #+# #+# */ -/* Updated: 2019/01/31 17:57:41 by tmaze ### ########.fr */ +/* Updated: 2019/02/01 10:18:41 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_envelem *ft_envtoenvelem(char *env) -{ - size_t i; - t_envelem *ret; - - i = 0; - if ((ret = (t_envelem*)ft_memalloc(sizeof(t_envelem))) == NULL) - return (NULL); - while (env[i] && env[i] != '=') - i++; - if ((ret->key = ft_strnew(i)) == NULL) - { - ft_memdel((void**)&ret); - return (NULL); - } - if ((ret->val = ft_strnew(ft_strlen(env) - i - 1)) == NULL) - { - ft_memdel((void**)&ret); - return (NULL); - } - ft_strlcpy(ret->key, env, i + 1); - ft_strlcpy(ret->val, &env[i + 1], ft_strlen(env) - i); - return (ret); -} - -void ft_lstdelenvelem(void *content, size_t size) -{ - size = 0; - ft_strdel(&(((t_envelem*)(content))->key)); - ft_strdel(&(((t_envelem*)(content))->val)); - if ((((t_envelem*)(content))->key) != NULL - || (((t_envelem*)(content))->val) != NULL) - ft_putstr("plup\n"); - ft_memdel(&content); -} - -void ft_envelemdel(t_envelem **env) -{ - ft_strdel(&((*env)->key)); - ft_strdel(&((*env)->val)); - ft_memdel((void**)env); -} - -t_list *ft_envtolst(char **env) -{ - size_t i; - t_list *ret; - t_list *new; - t_envelem *elem; - - ret = NULL; - i = 0; - while (env[i]) - { - if ((elem = ft_envtoenvelem(env[i])) == NULL) - ft_lstdel(&ret, &ft_lstdelenvelem); - if (elem == NULL) - return (NULL); - if ((new = ft_lstnew((void*)elem, sizeof(t_envelem))) == NULL) - { - ft_envelemdel(&elem); - ft_lstdel(&ret, &ft_lstdelenvelem); - return (NULL); - } - ft_memdel((void**)&elem); - if (ft_lstaddend(&ret, new) == NULL) - { - ft_lstdel(&ret, &ft_lstdelenvelem); - return (NULL); - } - i++; - } - return (ret); -} - int main(void) { int ret; diff --git a/srcs/ms_env2.c b/srcs/ms_env2.c new file mode 100644 index 0000000..3eb9289 --- /dev/null +++ b/srcs/ms_env2.c @@ -0,0 +1,85 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ms_env2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/01 10:18:01 by tmaze #+# #+# */ +/* Updated: 2019/02/01 11:16:28 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_envelem *ft_envtoenvelem(char *env) +{ + size_t i; + t_envelem *ret; + + i = 0; + if ((ret = (t_envelem*)ft_memalloc(sizeof(t_envelem))) == NULL) + return (NULL); + while (env[i] && env[i] != '=') + i++; + if ((ret->key = ft_strnew(i)) == NULL) + { + ft_memdel((void**)&ret); + return (NULL); + } + if ((ret->val = ft_strnew(ft_strlen(env) - i - 1)) == NULL) + { + ft_memdel((void**)&ret); + return (NULL); + } + ft_strlcpy(ret->key, env, i + 1); + ft_strlcpy(ret->val, &env[i + 1], ft_strlen(env) - i); + return (ret); +} + +void ft_lstdelenvelem(void *content, size_t size) +{ + size = 0; + ft_strdel(&(((t_envelem*)(content))->key)); + ft_strdel(&(((t_envelem*)(content))->val)); + ft_memdel(&content); +} + +void ft_envelemdel(t_envelem **env) +{ + ft_strdel(&((*env)->key)); + ft_strdel(&((*env)->val)); + ft_memdel((void**)env); +} + +t_list *ft_envtolst(char **env) +{ + size_t i; + t_list *ret; + t_list *new; + t_envelem *elem; + + ret = NULL; + i = 0; + while (env[i]) + { + if ((elem = ft_envtoenvelem(env[i])) == NULL) + ft_lstdel(&ret, &ft_lstdelenvelem); + if (elem == NULL) + return (NULL); + if ((new = ft_lstnew((void*)elem, sizeof(t_envelem))) == NULL) + { + ft_envelemdel(&elem); + ft_lstdel(&ret, &ft_lstdelenvelem); + return (NULL); + } + ft_envelemdel(&elem); + if (ft_lstaddend(&ret, new) == NULL) + { + ft_lstdel(&ret, &ft_lstdelenvelem); + return (NULL); + } + i++; + } + return (ret); +}