int ft_change_pwd(char *path, t_cmd *cmd) { struct stat infos; int error; int ret; error = 0; ret = 0; ret = stat(path, &infos); if (access(path, F_OK) != 0) error = NOTEXIST; else if (!(S_IFDIR == (infos.st_mode & S_IFMT))) error = NOTDIR; else if (access(path, X_OK) != 0) error = NOTACCESS; if (ret == -1 && !error) error = UNDEF; if (error) ft_put_error(error, cmd->args[1]); else { ft_update_env(cmd->envp, "OLDPWD", ft_getenv(*cmd->envp, "PWD")); ft_update_env(cmd->envp, "PWD", path); error = chdir(path); } free(path); return (error != 0); }
int ft_change_directory(t_sh *sh, t_cmd *cmd) { struct stat stats; if (cmd->args[1] != NULL && ft_strcmp(cmd->args[1], "~") && ft_strcmp(cmd->args[1], "-")) { if (stat(cmd->args[1], &stats) != -1) { if (stats.st_mode & S_IFDIR) { if (stats.st_mode & S_IRUSR) { chdir(cmd->args[1]); return (ft_update_env(sh, cmd->args[1])); } else return (ft_puterror_nopermission(cmd->args[1])); } else return (ft_puterror_notdir(cmd->args[1])); } else return (ft_puterror_nofile(cmd->args[1])); } else return (ft_special_cd(sh, cmd->args[1])); }
static void cd_path(char ***env, char *tmp) { if (chdir(tmp) == -1) { ft_putstr("42sh : no such file or directory: "); ft_putendl(tmp); } else ft_update_env(env); }
int ft_special_cd(t_sh *sh, char *spec) { int i; int j; i = ft_getenv_id(sh->env, "HOME", 4); j = ft_getenv_id(sh->env, "OLDPWD", 6); i = check_if_nullvar2(sh, i, j); if (spec == NULL || !ft_strcmp(spec, "~")) { chdir(sh->env[i] + 5); ft_update_env(sh, sh->env[i] + 5); } else { chdir(sh->env[j] + 7); ft_update_env(sh, sh->env[j] + 7); } return (0); }
static void cd_minus(char ***env, char *tmp) { if ((tmp = search_line(env, "OLDPWD=")) != NULL) { tmp = ft_strsub(tmp, 7, ft_strlen(tmp) - 7); chdir(tmp); ft_update_env(env); tmp = NULL; ft_putendl(getcwd(tmp, 0)); } }
static void cd_home(char ***env, char *tmp) { int i; i = 0; if ((tmp = search_line(env, "HOME=")) != NULL) { tmp = ft_strsub(tmp, 5, ft_strlen(tmp) - 5); chdir(tmp); ft_update_env(env); } }