From f04da8b91fc86e164af8e4ebced1cdb10b9dd082 Mon Sep 17 00:00:00 2001 From: Tanguy MAZE Date: Wed, 30 Jan 2019 17:04:15 +0100 Subject: [PATCH] WIP cd options Nearly there ^^ added cd options need to iron out bug with pwd that only shows physical path --- Makefile | 4 ++-- srcs/cmd_cd.c | 65 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/Makefile b/Makefile index 1b73377..b62ab00 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: tmaze +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/11/22 14:43:33 by tmaze #+# #+# # -# Updated: 2019/01/28 13:20:28 by tmaze ### ########.fr # +# Updated: 2019/01/30 15:50:42 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 ft_realpath.c +SRCS := main.c exec.c cmd_echo.c cmd_cd.c cmd_env.c cmd_setenv.c cmd_unsetenv.c ms_env.c OBJS_DIR := objs OBJS := $(SRCS:.c=.o) INCLS := -Iincludes -Ilibft diff --git a/srcs/cmd_cd.c b/srcs/cmd_cd.c index e6c700b..01269e7 100644 --- a/srcs/cmd_cd.c +++ b/srcs/cmd_cd.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/07 16:44:40 by tmaze #+# #+# */ -/* Updated: 2019/01/29 16:12:21 by tmaze ### ########.fr */ +/* Updated: 2019/01/30 17:02:05 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -49,12 +49,50 @@ char *check_path_slash_cd(char *exec) return (NULL); } -int cmd_cd_core(char *path, t_list **env, char opt) +int cmd_cd_update_env(char *path, t_list **env, char opt) { t_envelem *pwd; char *oldpwd; char *c_path; - char *tmp; + char p_path[4096]; + + ft_bzero(p_path, 4096); + if (getcwd(p_path, 4096) == NULL) + { + put_error_cd(path, "error"); + return (1); + } + if ((pwd = env_getelemfromkey("PWD", *env)) == NULL) + { + put_error_cd(path, "error"); + return (1); + } + if ((oldpwd = ft_strdup(pwd->val)) == NULL) + { + put_error_cd(path, "error"); + return (1); + } + if (ft_realpath(path, &c_path) == NULL) + { + put_error_cd(path, "error"); + return (1); + } + if (env_addupdate("PWD", ((opt == 'P') ? p_path : c_path), env) == NULL + || env_addupdate("OLDPWD", oldpwd, env) == NULL) + { + put_error_cd(path, "error"); + ft_strdel(&oldpwd); + ft_strdel(&c_path); + return (1); + } + ft_strdel(&oldpwd); + ft_strdel(&c_path); + return (0); +} + +int cmd_cd_core(char *path, t_list **env, char opt) +{ + t_envelem *pwd; if (check_path_slash_cd(path) == NULL) { @@ -67,20 +105,7 @@ int cmd_cd_core(char *path, t_list **env, char opt) put_error_cd(path, "error"); return (1); } - if ((oldpwd = ft_strdup(pwd->val)) == NULL) - { - put_error_cd(path, "error"); - return (1); - } - if (env_addupdate("PWD", path, env) == NULL - || env_addupdate("OLDPWD", oldpwd, env) == NULL) - { - put_error_cd(path, "error"); - ft_strdel(&oldpwd); - return (1); - } - ft_strdel(&oldpwd); - return (0); + return (cmd_cd_update_env(path, env, opt)); } char cd_getparams(char **argv, size_t *i) @@ -90,6 +115,7 @@ char cd_getparams(char **argv, size_t *i) ret[1] = '\0'; ret[0] = 'L'; + *i = 0; while (argv[++(*i)] && argv[*i][0] == '-' && ft_strlen(argv[*i]) > 1) { j = 1; @@ -97,6 +123,7 @@ char cd_getparams(char **argv, size_t *i) ret[0] = argv[*i][j++]; if (argv[*i][j] && argv[*i][j] != 'L' && argv[*i][j] != 'P') { + ret[0] = argv[*i][j]; put_error_cd(ret, "invalid option"); put_error_cd("usage", "cd [-L|-P] [dir]"); ret[0] = '\0'; @@ -119,8 +146,8 @@ int cmd_cd(char **argv, t_list **env) return (1); if (!argv[i] && (elem = env_getelemfromkey("HOME", *env)) != NULL && elem->val != NULL) return (cmd_cd_core(elem->val, env, opt)); - else if (argv[i] && argv[1][0] == '/') - return (cmd_cd_core(argv[1], env, opt)); + else if (argv[i] && argv[i][0] == '/') + return (cmd_cd_core(argv[i], env, opt)); else if (argv[i] && argv[i][0] == '-' && (elem = env_getelemfromkey("OLDPWD", *env)) != NULL) return (cmd_cd_core(elem->val, env, opt)); else if (argv[i] && argv[i][0] != '/' && (elem = env_getelemfromkey("PWD", *env)) != NULL && elem->val != NULL)