-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcd_canon_form.c
128 lines (117 loc) · 3.08 KB
/
cd_canon_form.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cd_canon_form.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cdomet-d <cdomet-d@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/13 16:26:02 by csweetin #+# #+# */
/* Updated: 2024/10/31 14:19:59 by cdomet-d ### ########.fr */
/* */
/* ************************************************************************** */
#include "exec.h"
static char *make_path(char *tab, char *path, char **temp)
{
char *tmp;
tmp = NULL;
free(*temp);
*temp = NULL;
*temp = ft_strdup(path);
if (!*temp)
return (free(path), print_error(errno, "minishell: exec"));
tmp = ft_strjoin(path, tab);
free(path);
if (!tmp)
return (free(*temp), print_error(errno, "minishell: exec"));
path = tmp;
tmp = ft_strjoin(path, "/");
free(path);
if (!tmp)
return (free(*temp), print_error(errno, "minishell: exec"));
path = tmp;
return (path);
}
static int rm_dots(char **path, char **temp, char *tab, char *var)
{
size_t len;
if (check_directory(var, *path))
return (free(*temp), free(*path), 1);
free(*path);
*path = NULL;
*path = ft_strdup(*temp);
if (!*path)
return (free(*temp), 1);
len = ft_strlen(tab) + 1;
free(*temp);
*temp = ft_substr(*path, 0, ft_strlen(*path) - len);
if (!*temp)
return (free(*path), 1);
return (0);
}
static char *canonical_form(char *var, char *path, char **tab, ssize_t j)
{
ssize_t i;
char *temp;
i = -1;
temp = NULL;
while (tab[++i])
{
if (!ft_strncmp(tab[i], "..", 3) && (i - j) >= 0
&& ft_strncmp(tab[i - j], ".", 2)
&& ft_strncmp(tab[i - j], "..", 3))
{
if ((i - (j + 1)) >= 0)
j++;
if (rm_dots(&path, &temp, tab[i - j], var))
return (NULL);
j++;
}
else if (ft_strncmp(tab[i], ".", 2))
{
path = make_path(tab[i], path, &temp);
if (!path)
return (NULL);
}
}
return (free(temp), path);
}
static int just_slash(char **path)
{
int i;
char *temp;
i = 0;
temp = *path;
while (temp[i] && temp[i] == '/')
i++;
if (temp[i] == '\0')
{
free(*path);
*path = NULL;
*path = ft_strdup("/");
if (!*path)
print_error(errno, "minishell: exec");
return (1);
}
return (0);
}
char *prep_path(char *var, char *path)
{
char **tab;
char *temp;
temp = NULL;
if (just_slash(&path))
return (path);
tab = ft_split(path, '/');
free(path);
path = NULL;
if (!tab)
return (print_error(errno, "minishell: exec"));
temp = ft_strdup("/");
if (!temp)
return (free_darr(tab), print_error(errno, "minishell: exec"));
path = canonical_form(var, temp, tab, 1);
free_darr(tab);
if (!path && errno != 2)
return (print_error(errno, "minishell: exec"));
return (path);
}