-
Notifications
You must be signed in to change notification settings - Fork 2
/
builtin_cd.c
92 lines (83 loc) · 2.49 KB
/
builtin_cd.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* builtin_cd.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jkong <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/06/23 23:11:25 by jkong #+# #+# */
/* Updated: 2022/06/28 16:00:26 by jkong ### ########.fr */
/* */
/* ************************************************************************** */
#include "builtins.h"
#include "safe_io.h"
#include "libft.h"
#include "string_vector.h"
#include <errno.h>
#include <string.h>
#include <stdio.h>
static char *_get_env_path(t_list_var *env, char *name)
{
char *const value = get_var(env, name);
if (!value)
print_err("cd: %s not set\n", name);
return (value);
}
static char *_get_pwd(size_t argc, char **argv, t_list_var **envp, int *alert)
{
char *name;
char *path;
*alert = 0;
path = NULL;
if (argc <= 1)
name = _get_env_path(*envp, "HOME");
else if (ft_strcmp(argv[1], "-") == 0)
{
name = _get_env_path(*envp, "OLDPWD");
*alert = 1;
}
else if (is_absolute_path(argv[1], 2))
name = argv[1];
else
{
name = argv[1];
path = find_path(get_var(*envp, "CDPATH"), name, FS_PATHNAME, 0);
if (path)
*alert = 1;
}
if (!path && name)
path = resolve_path(NULL, name);
return (path);
}
static int _setenv(t_list_var **envp, int alert)
{
char *const cwd = getcwd(NULL, 0);
if (!cwd)
return (0);
put_var(envp, "OLDPWD", get_var(*envp, "PWD"), VFV_EXPORTED);
put_var(envp, "PWD", cwd, VFV_EXPORTED);
if (alert)
printf("%s\n", cwd);
free(cwd);
return (1);
}
t_builtin_res ft_cd(t_builtin_argv argv, t_builtin_envp envp)
{
const size_t argc = length_strvec(argv);
int alert;
char *const pwd = _get_pwd(argc, argv, envp, &alert);
int result;
if (!pwd)
return (EXIT_FAILURE);
result = EXIT_SUCCESS;
if ((ft_strlen(pwd) != 0 && chdir(pwd) < 0) || !_setenv(envp, alert))
{
if (argc > 1)
print_err("cd: %s: %s\n", argv[1], strerror(errno));
else
print_err("cd: %s\n", strerror(errno));
result = EXIT_FAILURE;
}
free(pwd);
return (result);
}