/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* b_cd.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ /* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include #include #include #include "f_fail.h" #include "s_destroy.h" #include "s_struct.h" #include "u_utils.h" #include "u_vars.h" #include "u_vars_next.h" static void set_path(char **path, char *args[], t_msh *msh) { if (!(*path = ft_strdup(*args))) { s_destroy(msh); f_fail_alloc(msh); } if (!ft_strncmp("~/", *path, 2) || !ft_strncmp("~", *path, 2)) { if (!(*path = ft_strsubst(*path, "~", u_get_var_value("$HOME", msh)))) { s_destroy(msh); f_fail_alloc(msh); } } } static void b_upgrade_pwd(const char path[], t_msh *msh) { char **splited; char *rtmp; char repath[131072]; size_t i; size_t j; if (path[0] == '/') { u_subst_var_value("$PWD", path, msh); /* TODO: /home///////////////////////////////////jozan////////////// */ return ; } rtmp = u_get_var_value("$PWD", msh); ft_memcpy(repath, rtmp, ft_strlen(rtmp) + 1); ft_memdel((void*)&rtmp); splited = ft_split(path, '/'); i = 0; while (splited[i] != '\0') { ft_printf("{%s}\n{%s}\n", path, path + i); if (splited[i][0] == '.' && splited[i][1] == '.') { j = ft_strlen(repath); ft_printf("[%s]\n", repath); while (repath[j] != '/') j--; repath[j] = '\0'; } else { j = ft_strlen(repath) + 1; repath[j - 1] = '/'; ft_strlcpy(repath + j, splited[i], ft_strlen(splited[i]) + 1); } i++; } ft_delwords(splited); u_subst_var_value("$PWD", repath, msh); } uint8_t b_cd(char *args[], t_msh *msh) { const uint64_t argc = u_builtins_get_argc((const char**)args); char *path; if (argc >= 2) { f_fail_too_many_args("cd", msh); return (1); } else if (argc == 0) { if (!(path = u_get_var_value("$HOME", msh))) return (1); } else set_path(&path, args, msh); if (chdir(path) != 0) { f_fail_chd("cd", path, msh); ft_memdel((void*)&path); return (1); } b_upgrade_pwd(path, msh); ft_memdel((void*)&path); return (0); }