diff --git a/bonus/pipex_bonus.c b/bonus/pipex_bonus.c index 4b968be..29c0f37 100644 --- a/bonus/pipex_bonus.c +++ b/bonus/pipex_bonus.c @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/20 09:48:45 by erey-bet #+# #+# */ -/* Updated: 2023/03/20 09:48:53 by erey-bet ### ########.fr */ +/* Updated: 2023/03/21 15:29:21 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,7 +31,7 @@ void make_cmd(t_data data, int i, int fl1, int fl2) execve(data.cmds[i], data.flgs[i], data.env); } -void choice_cmd(t_data data, int i) +void choice_cmd(t_data data, int i, int **forks) { if (i == 0) make_cmd(data, 0, data.fd1, data.fd[0][1]); @@ -40,6 +40,7 @@ void choice_cmd(t_data data, int i) else make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd2); write(2, "Error execve\n", 13); + free(*forks); free_all(&data); exit(1); } @@ -59,7 +60,7 @@ int pipex_loop(int argc, int **forks, t_data data) if ((*forks)[i] < 0) return (1); if ((*forks)[i] == 0) - choice_cmd(data, i); + choice_cmd(data, i, forks); } if (i > 0) if (open_close_pipe(&data, 1, (i + 1) % 2)) @@ -77,7 +78,10 @@ int pipex(int argc, t_data data) if (!forks) return (1); if (pipex_loop(argc, &forks, data)) + { + free(forks); return (1); + } i = -1; while (++i < argc - 3) waitpid(forks[i], NULL, 0); @@ -98,13 +102,13 @@ int main(int argc, char *argv[], char **env) { argc = argc - 1; if (here_doc(argc, argv, env, &data)) - return (2); + return (free_all(&data)); } else if (parsing(argc, argv, env, &data)) - return (3); + return (free_all(&data)); data.argc = argc; if (verification_command(argv, data)) - return (4); + return (free_all(&data)); if (pipex(argc, data)) return (free_all(&data)); free_all(&data); diff --git a/bonus/pipex_bonus.h b/bonus/pipex_bonus.h index c642494..13f2244 100644 --- a/bonus/pipex_bonus.h +++ b/bonus/pipex_bonus.h @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/20 09:59:23 by erey-bet #+# #+# */ -/* Updated: 2023/03/20 09:59:42 by erey-bet ### ########.fr */ +/* Updated: 2023/03/21 15:23:03 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,18 +31,15 @@ typedef struct s_data int argc; } t_data; -int get_next(char *cmd, char c); int print_error(int type, char *error); char **get_flags(char *cmd); char *get_command(char *cmd); -char **add_cmd(char **flg, char *cmd); int parsing(int argc, char *argv[], char **env, t_data *data); char *test_acces(char **s, char **cmd, char **path, int *y); char *cmd_exist(char **env, char **cmd, int y, char **s); char *find_command(char **env, char *cmd); int here_doc(int argc, char *argv[], char **env, t_data *data); int pipex_loop(int argc, int **fk, t_data data); -void choice_cmd(t_data data, int i); int verification_command(char *argv[], t_data data); int free_all(t_data *data); int open_close_pipe(t_data *data, int boolean, int file); diff --git a/bonus/pipex_parsing_bonus.c b/bonus/pipex_parsing_bonus.c index bb04970..fb280cb 100644 --- a/bonus/pipex_parsing_bonus.c +++ b/bonus/pipex_parsing_bonus.c @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/19 17:03:01 by erey-bet #+# #+# */ -/* Updated: 2023/03/20 09:49:22 by erey-bet ### ########.fr */ +/* Updated: 2023/03/21 15:16:49 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,7 +23,11 @@ int parsing(int argc, char *argv[], char **env, t_data *data) if (data->fd1 < 0) print_error(0, argv[1]); data->cmds = ft_calloc(argc - 2, sizeof(char *)); + if (!data->cmds) + return (1); data->flgs = ft_calloc(argc - 2, sizeof(char *)); + if (!data->flgs) + return (1); i = -1; while (++i < argc - 3) { diff --git a/bonus/pipex_utils2_bonus.c b/bonus/pipex_utils2_bonus.c index 7d75510..e26c2f5 100644 --- a/bonus/pipex_utils2_bonus.c +++ b/bonus/pipex_utils2_bonus.c @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/14 15:46:08 by erey-bet #+# #+# */ -/* Updated: 2023/03/20 09:49:35 by erey-bet ### ########.fr */ +/* Updated: 2023/03/21 16:09:11 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,25 +42,25 @@ int verification_command(char *argv[], t_data data) i = -1; while (++i < data.argc - 3) { - data.cmds[i] = find_command(data.env, data.cmds[i]); - if (data.cmds[i] == NULL) + if (data.cmds[i]) { - print_error(1, argv[2 + i]); - if (i == data.argc - 4) - return (free_all(&data)); + data.cmds[i] = find_command(data.env, data.cmds[i]); + if (data.cmds[i] == NULL) + { + print_error(1, argv[2 + i]); + if (i == data.argc - 4) + return (free_all(&data)); + } } } return (0); } -int free_all(t_data *data) +void free_flgs(t_data *data) { - int i; int y; + int i; - if (data->fd1 > 0) - close(data->fd1); - close(data->fd2); y = -1; while (++y < data->argc - 3) { @@ -70,9 +70,24 @@ int free_all(t_data *data) free(data->flgs[y]); } free(data->flgs); - i = -1; - while (++i < data->argc - 3) - free(data->cmds[i]); - free(data->cmds); +} + +int free_all(t_data *data) +{ + int i; + + if (data->fd1 > 0) + close(data->fd1); + if (data->fd2 > 0) + close(data->fd2); + if (data->flgs) + free_flgs(data); + if (data->cmds) + { + i = -1; + while (++i < data->argc - 3) + free(data->cmds[i]); + free(data->cmds); + } return (1); } diff --git a/bonus/pipex_utils_bonus.c b/bonus/pipex_utils_bonus.c index b881f0f..6eacf01 100644 --- a/bonus/pipex_utils_bonus.c +++ b/bonus/pipex_utils_bonus.c @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/19 17:02:51 by erey-bet #+# #+# */ -/* Updated: 2023/03/20 09:49:45 by erey-bet ### ########.fr */ +/* Updated: 2023/03/21 16:06:16 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,32 +42,6 @@ int print_error(int type, char *error) return (1); } -char **get_flags(char *cmd) -{ - int i; - int y; - char *new_str; - char **flags; - - i = get_next(cmd, ' ') + 1; - if (i == 0) - { - flags = ft_calloc(2, sizeof(char *)); - return (flags); - } - new_str = ft_calloc(ft_strlen(cmd) - i + 1, 1); - if (new_str == NULL) - return (NULL); - y = 0; - while (cmd[i]) - new_str[y++] = cmd[i++]; - new_str[y] = '\0'; - flags = ft_split(new_str, ' '); - i = 0; - free(new_str); - return (flags); -} - char *get_command(char *cmd) { int i; @@ -84,30 +58,10 @@ char *get_command(char *cmd) while (cmd[++i] != ' ' && cmd[i]) new_str[i] = cmd[i]; new_str[i] = '\0'; + if (ft_strlen(new_str) == 0) + { + free(new_str); + return (NULL); + } return (new_str); } - -char **add_cmd(char **flg, char *cmd) -{ - char *tmp; - int i; - int check; - - tmp = NULL; - i = 0; - check = 0; - while (check == 0) - { - if (flg[i] == NULL) - check = 1; - if (tmp != NULL) - flg[i] = tmp; - tmp = flg[i]; - i++; - } - flg[0] = ft_strdup(cmd); - if (flg[0] == NULL) - return (NULL); - flg[i] = NULL; - return (flg); -} diff --git a/mandatory/pipex.c b/mandatory/pipex.c index e8eb6df..d0c43ab 100644 --- a/mandatory/pipex.c +++ b/mandatory/pipex.c @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */ -/* Updated: 2023/03/07 17:06:38 by erey-bet ### ########.fr */ +/* Updated: 2023/03/21 15:59:11 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,16 +20,24 @@ int free_all(t_data *data) close(data->fd1); if (data->fd2 > 0) close(data->fd2); - i = 0; - while (data->flg1[i]) - free(data->flg1[i++]); - free(data->flg1); - i = 0; - while (data->flg2[i]) - free(data->flg2[i++]); - free(data->flg2); - free(data->cmd1); - free(data->cmd2); + if (data->flg1) + { + i = 0; + while (data->flg1[i]) + free(data->flg1[i++]); + free(data->flg1); + } + if (data->flg2) + { + i = 0; + while (data->flg2[i]) + free(data->flg2[i++]); + free(data->flg2); + } + if (data->cmd1) + free(data->cmd1); + if (data->cmd2) + free(data->cmd2); return (1); } @@ -102,16 +110,9 @@ int main(int argc, char *argv[], char **env) return (1); } if (parsing(argv, &data)) - return (2); - data.cmd1 = find_command(env, data.cmd1); - if (data.cmd1 == NULL) - print_error(1, argv[2]); - data.cmd2 = find_command(env, data.cmd2); - if (data.cmd2 == NULL) - { - print_error(1, argv[3]); + return (1); + if (finds_commands(argv, env, &data.cmd1, &data.cmd2)) return (free_all(&data)); - } data.env = env; if (pipex(data)) return (free_all(&data)); diff --git a/mandatory/pipex.h b/mandatory/pipex.h index 441b047..162b944 100644 --- a/mandatory/pipex.h +++ b/mandatory/pipex.h @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/11 15:33:34 by erey-bet #+# #+# */ -/* Updated: 2023/03/08 11:33:24 by erey-bet ### ########.fr */ +/* Updated: 2023/03/21 15:56:50 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,12 +33,11 @@ typedef struct s_data int get_next(char *cmd, char c); int print_error(int type, char *error); -char **get_flags(char *cmd); char *get_command(char *cmd); -char **add_cmd(char **flg, char *cmd); int parsing(char *argv[], t_data *data); char *test_acces(char **s, char **cmd, char **path, int *y); char *cmd_exist(char **env, char **cmd, int y, char **s); char *find_command(char **env, char *cmd); +int finds_commands(char *argv[], char **env, char **cmd1, char **cmd2); #endif diff --git a/mandatory/pipex_parsing.c b/mandatory/pipex_parsing.c index 4c67c6d..4aa3658 100644 --- a/mandatory/pipex_parsing.c +++ b/mandatory/pipex_parsing.c @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/19 17:03:01 by erey-bet #+# #+# */ -/* Updated: 2023/03/12 17:39:22 by erey-bet ### ########.fr */ +/* Updated: 2023/03/21 15:58:19 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,11 +21,16 @@ int parsing(char *argv[], t_data *data) if (data->fd1 < 0) print_error(0, argv[1]); data->cmd1 = get_command(argv[2]); - if (ft_strlen(data->cmd1) < 1) + if (!data->cmd1) print_error(2, argv[2]); data->cmd2 = get_command(argv[3]); - if (ft_strlen(data->cmd2) < 1) + if (!data->cmd2) { + if (data->fd1 > 0) + close(data->fd1); + close(data->fd2); + if (data->cmd1) + free(data->cmd1); print_error(2, argv[3]); return (1); } @@ -87,9 +92,28 @@ char *find_command(char **env, char *cmd) break ; env++; } + if (ft_strlen(*env) == 0) + env--; y = 0; s = ft_calloc(ft_strlen(*env) + 1, 1); if (s == NULL) return (NULL); return (cmd_exist(env, &cmd, y, &s)); } + +int finds_commands(char *argv[], char **env, char **cmd1, char **cmd2) +{ + if (*cmd1) + { + *cmd1 = find_command(env, *cmd1); + if (*cmd1 == NULL) + print_error(1, argv[2]); + } + *cmd2 = find_command(env, *cmd2); + if (*cmd2 == NULL) + { + print_error(1, argv[3]); + return (1); + } + return (0); +} diff --git a/mandatory/pipex_utils.c b/mandatory/pipex_utils.c index e3aca89..63b6422 100644 --- a/mandatory/pipex_utils.c +++ b/mandatory/pipex_utils.c @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/19 17:02:51 by erey-bet #+# #+# */ -/* Updated: 2023/03/02 13:39:41 by erey-bet ### ########.fr */ +/* Updated: 2023/03/21 15:43:42 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,32 +42,6 @@ int print_error(int type, char *error) return (1); } -char **get_flags(char *cmd) -{ - int i; - int y; - char *new_str; - char **flags; - - i = get_next(cmd, ' ') + 1; - if (i == 0) - { - flags = ft_calloc(2, sizeof(char *)); - return (flags); - } - new_str = ft_calloc(ft_strlen(cmd) - i + 1, 1); - if (new_str == NULL) - return (NULL); - y = 0; - while (cmd[i]) - new_str[y++] = cmd[i++]; - new_str[y] = '\0'; - flags = ft_split(new_str, ' '); - i = 0; - free(new_str); - return (flags); -} - char *get_command(char *cmd) { int i; @@ -84,30 +58,10 @@ char *get_command(char *cmd) while (cmd[++i] != ' ' && cmd[i]) new_str[i] = cmd[i]; new_str[i] = '\0'; + if (ft_strlen(new_str) == 0) + { + free(new_str); + return (NULL); + } return (new_str); } - -char **add_cmd(char **flg, char *cmd) -{ - char *tmp; - int i; - int check; - - tmp = NULL; - i = 0; - check = 0; - while (check == 0) - { - if (flg[i] == NULL) - check = 1; - if (tmp != NULL) - flg[i] = tmp; - tmp = flg[i]; - i++; - } - flg[0] = ft_strdup(cmd); - if (flg[0] == NULL) - return (NULL); - flg[i] = NULL; - return (flg); -}