-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.c
135 lines (126 loc) · 3.9 KB
/
main.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
129
130
131
132
133
134
135
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* main.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ldoppler <ldoppler@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/12 17:03:41 by ldoppler #+# #+# */
/* Updated: 2024/01/29 09:35:47 by ldoppler ### ########.fr */
/* */
/* ************************************************************************** */
#include "pipex.h"
int allocate_info_bis(t_execve **info_execve, char **argv)
{
(*info_execve)->args = ft_split(argv[2], ' ');
if (!(*info_execve)->args)
return (free_info_execve(*info_execve), 1);
(*info_execve)->args_bis = ft_split(argv[3], ' ');
if (!(*info_execve)->args_bis)
return (free_char_array((*info_execve)->args), 1);
return (0);
}
char *good_path(t_execve **info_execve, char *exec_file)
{
int i;
char *new_exec;
char *tmp;
char *ret;
i = 0;
if (access(exec_file, F_OK) == 0)
return (ret = ft_strdup(exec_file));
new_exec = ft_strjoin("/", exec_file);
while ((*info_execve)->envp[i] != NULL)
{
tmp = ft_strjoin((*info_execve)->envp[i], new_exec);
if (access(tmp, F_OK) == 0)
{
free(tmp);
free(new_exec);
ret = ft_strjoin((*info_execve)->envp[i], "/");
ret = ft_strjoin2(ret, exec_file);
return (ret);
}
free(tmp);
i++;
}
free(new_exec);
return (0);
}
int allocate_info_bis_2(t_execve **info_execve, char **argv, char *tmp)
{
(*info_execve)->exec_file_path = good_path(info_execve, \
(*info_execve)->exec_file);
if (!(*info_execve)->exec_file_path)
bis(info_execve);
tmp = ft_strchr_reverse(argv[3], ' ');
if (tmp != NULL)
{
(*info_execve)->exec_file_bis = ft_strdup(tmp);
if (!(*info_execve)->exec_file_bis)
return (free(tmp), free_info_execve(*info_execve), 5);
}
else
{
(*info_execve)->exec_file_bis = ft_strdup(argv[3]);
if (!(*info_execve)->exec_file_bis)
return (free_info_execve(*info_execve), 5);
}
(*info_execve)->file2 = ft_strdup(argv[4]);
if (!(*info_execve)->exec_file_path)
return (free_info_execve(*info_execve), 5);
(*info_execve)->exec_file_bis_path = good_path(info_execve,
(*info_execve)->exec_file_bis);
if (!(*info_execve)->exec_file_bis_path)
bis(info_execve);
return (free(tmp), 0);
}
int allocate_info(char **argv, t_execve **info_execve)
{
char *tmp;
(*info_execve)->file1 = ft_strdup(argv[1]);
if (!(*info_execve)->file1)
return (free_info_execve(*info_execve), 2);
tmp = ft_strchr_reverse(argv[2], ' ');
if (tmp != NULL)
{
(*info_execve)->exec_file = ft_strdup(tmp);
if (!(*info_execve)->exec_file)
return (free_info_execve(*info_execve), 2);
free(tmp);
}
else
{
(*info_execve)->exec_file = ft_strdup(argv[2]);
if (!(*info_execve)->exec_file)
return (free_info_execve(*info_execve), 3);
}
if (allocate_info_bis_2(info_execve, argv, tmp) != 0)
exit(EXIT_FAILURE);
return (allocate_info_bis(info_execve, argv));
}
int main(int argc, char **argv, char **envp)
{
t_execve *info_execve;
int pipefd[2];
if (argc != 5)
return (1);
info_execve = malloc(sizeof(t_execve));
if (!info_execve)
return (1);
init(info_execve, argv);
info_execve->envp = ft_split(search_path(envp), ':');
if (allocate_info(argv, &info_execve) != 0)
exit(EXIT_FAILURE);
info_execve->fd = open(info_execve->file1, O_RDONLY);
if (info_execve->fd < 0)
{
perror("open");
free_everything(info_execve);
exit(EXIT_FAILURE);
}
start_fork_pipe(pipefd, info_execve, envp);
close(info_execve->fd);
free_everything(info_execve);
return (0);
}