diff options
author | salad <fmoenne-@student.le-101.fr> | 2020-04-29 11:47:02 +0200 |
---|---|---|
committer | salad <fmoenne-@student.le-101.fr> | 2020-04-29 11:47:02 +0200 |
commit | 961bda4f42562bf8ceb70a888730362d021c5552 (patch) | |
tree | 820577dc790c3a8884c44b329d04a8d42ed1ca44 /src/ft_b_cd.c | |
parent | simple really (diff) | |
parent | Trying vars (diff) | |
download | 42-minishell-961bda4f42562bf8ceb70a888730362d021c5552.tar.gz 42-minishell-961bda4f42562bf8ceb70a888730362d021c5552.tar.bz2 42-minishell-961bda4f42562bf8ceb70a888730362d021c5552.tar.xz 42-minishell-961bda4f42562bf8ceb70a888730362d021c5552.tar.zst 42-minishell-961bda4f42562bf8ceb70a888730362d021c5552.zip |
merge master into fmoenne_indahouse
Diffstat (limited to '')
-rw-r--r-- | src/ft_b_cd.c | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/src/ft_b_cd.c b/src/ft_b_cd.c index cbb392a..fbd0282 100644 --- a/src/ft_b_cd.c +++ b/src/ft_b_cd.c @@ -14,27 +14,32 @@ #include <stdint.h> #include <unistd.h> +#include "ft_f_fail.h" +#include "ft_s_destroy.h" #include "ft_s_struct.h" #include "ft_u_utils.h" +#include "ft_u_vars.h" -/* static void */ -/* ft_switch_env_var(char **envp) */ -/* { */ -/* char **ptr; */ -/* char *path; */ - -/* ptr = envp; */ -/* while (*ptr) */ -/* { */ -/* if (ft_strncmp("HOME", *ptr, 4) == 0) */ -/* { */ -/* path = ft_substr(*ptr, 5, ft_strlen(*ptr + 5)); */ -/* return (path); */ -/* } */ -/* ptr++; */ -/* } */ -/* return (NULL); */ -/* } */ +static void + ft_set_path(char **path, + char *args[], + t_msh *msh) +{ + if (!(*path = ft_strdup(*args))) + { + ft_s_destroy(msh); + ft_fail_alloc(msh); + } + if (!ft_strncmp("~/", *path, 2) || !ft_strncmp("~", *path, 2)) + { + if (!(*path = ft_strsubst(*path, + "~", ft_subst_var_value("$HOME", msh)))) + { + ft_s_destroy(msh); + ft_fail_alloc(msh); + } + } +} uint8_t ft_b_cd(char *args[], @@ -43,18 +48,26 @@ uint8_t const uint64_t argc = ft_get_argc((const char**)args); char *path; - if (argc == 0) + if (argc >= 2) + { + ft_fail_too_many_args("cd", msh); + return (1); + } + else if (argc == 0) { - path = ft_get_home_dir(msh->envp); + if (!(path = ft_subst_var_value("$HOME", msh))) + return (1); } + else + ft_set_path(&path, args, msh); if (chdir(path) != 0) { - /* TODO: handle cd failed */ + ft_fail_chd("cd", path, msh); + ft_memdel((void*)&path); + return (1); } - /* TODO: ft_switch_env_var() */ ft_memdel((void*)&msh->cwd); msh->cwd = getcwd(NULL, 0); ft_memdel((void*)&path); - /* TODO: finish cd */ return (0); } |