diff options
Diffstat (limited to '')
-rw-r--r-- | src/b_cd.c | 75 | ||||
-rw-r--r-- | src/s_destroy.c | 1 | ||||
-rw-r--r-- | src/s_init.c | 32 | ||||
-rw-r--r-- | src/s_struct.h | 1 |
4 files changed, 109 insertions, 0 deletions
@@ -13,7 +13,9 @@ #include <libft.h> #include <stdint.h> #include <unistd.h> +#include <limits.h> +#include "b_export_next.h" #include "f_fail.h" #include "s_destroy.h" #include "s_struct.h" @@ -43,9 +45,82 @@ static void } static void + b_set_oldpwd(t_msh *msh) +{ + char *pwd; + char *tmp; + char fmt[PATH_MAX]; + + if ((pwd = u_get_var_value("$PWD", msh)) == NULL) + { + if ((pwd = ft_strdup(msh->cwd)) == NULL) + f_fail_alloc_and_destroy(msh); + } + if ((tmp = u_get_var_value("$OLDPWD", msh)) == NULL) + { + ft_sprintf(fmt, "%s=%s", "OLDPWD", pwd); + b_export_with_equals(fmt, msh); + } + else + { + u_subst_var_value("$OLDPWD", pwd, msh); + ft_memdel((void*)&pwd); + ft_memdel((void*)&tmp); + } +} + +static void + b_fill_repath(char *repath[], + char *splited[]) +{ + size_t i; + size_t j; + + i = 0; + while (splited[i] != NULL) + { + if (ft_strncmp(splited[i], "..", 3) == 0) + { + j = ft_strlen(*repath); + while (*repath[j] != '/') + j--; + *repath[j] = '\0'; + } + i++; + } +} + +static void b_upgrade_pwd(const char path[], t_msh *msh) { char **splited; + char repath[262144]; + t_bool slash_first; + + b_set_oldpwd(msh); + slash_first = FALSE; + if (path[0] == '/') + slash_first = TRUE; + if (slash_first == TRUE) + ft_memcpy(repath, "/", 2); + else + { + /* msh->cwd; */ + } + if ((splited = ft_split(path, '/')) == NULL) + f_fail_alloc_and_destroy(msh); + b_fill_repath((char**)&repath, splited); + ft_delwords(splited); + u_subst_var_value("$PWD", repath, msh); + ft_printf("[%s]\n", repath); +} + +/* TODO: fix export OLDPWDQWE= */ + +static void + b_old_upgrade_pwd(const char path[], t_msh *msh) +{ + char **splited; char *rtmp; char repath[131072]; size_t i; diff --git a/src/s_destroy.c b/src/s_destroy.c index c96db09..a6f84e3 100644 --- a/src/s_destroy.c +++ b/src/s_destroy.c @@ -20,6 +20,7 @@ void { ft_memdel((void*)&msh->ps_one); ft_memdel((void*)&msh->shname); + ft_memdel((void*)&msh->cwd); ft_delwords(msh->bu_ref); ft_delwords(msh->envp); lvars_clear(&msh->vars); diff --git a/src/s_init.c b/src/s_init.c index 54be62f..1dbbbb7 100644 --- a/src/s_init.c +++ b/src/s_init.c @@ -14,7 +14,11 @@ #include <stdint.h> #include <stdlib.h> #include <unistd.h> +#include <limits.h> +#include <dirent.h> +#include <errno.h> +#include "b_export_next.h" #include "d_define.h" #include "m_funptr.h" #include "s_init.h" @@ -73,6 +77,33 @@ static void ft_memdel((void*)&str_two); } +static char + *set_cwd(t_msh *msh) +{ + char *cwd; + char fmt[PATH_MAX]; + DIR *dir; + + if ((cwd = u_get_var_value("$PWD", msh)) == NULL) + { + cwd = getcwd(NULL, 0); + ft_sprintf(fmt, "%s=%s", "PWD", cwd); + b_export_with_equals(fmt, msh); + return (cwd); + } + if ((dir = opendir(cwd)) != 0) + closedir(dir); + else if (errno == ENOENT) + { + ft_memdel((void*)&cwd); + cwd = getcwd(NULL, 0); + ft_sprintf(fmt, "%s=%s", "PWD", cwd); + b_export_with_equals(fmt, msh); + return (cwd); + } + return (cwd); +} + t_msh *init_msh(char *const argv[], char *const envp[]) @@ -93,6 +124,7 @@ t_msh init_buptr(msh); msh->curr = NULL; msh->vars = NULL; + msh->cwd = set_cwd(msh); inc_shlvl(msh); return (msh); } diff --git a/src/s_struct.h b/src/s_struct.h index f798ed7..0c5acf0 100644 --- a/src/s_struct.h +++ b/src/s_struct.h @@ -59,6 +59,7 @@ typedef struct s_msh uint8_t ret; char *shname; char **bu_ref; + char *cwd; uint8_t (*bu_ptr[FT_BUILTINS_COUNT])(char **, struct s_msh*); struct s_lcom *curr; struct s_lvars *vars; |