summaryrefslogtreecommitdiffstats
path: root/src/ft_b_cd.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/ft_b_cd.c59
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);
}