diff --git a/Makefile b/Makefile index 2b9ffca..b6e9610 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ GNL = get_next_line/get_next_line.c get_next_line/get_next_line_utils.c SRCS = mandatory/pipex.c mandatory/pipex_utils.c mandatory/pipex_parsing.c ${GNL} -SRCS_BONUS = bonus/pipex.c bonus/pipex_utils.c bonus/pipex_parsing.c ${GNL} +SRCS_BONUS = bonus/pipex.c bonus/pipex_utils.c bonus/pipex_parsing.c bonus/pipex_heredoc.c bonus/pipex_utils2.c ${GNL} OBJS = ${SRCS:.c=.o} OBJS_BONUS = ${SRCS_BONUS:.c=.o} LIBS = libft/libft.a diff --git a/bonus/pipex.c b/bonus/pipex.c index e40f40e..2fbcc42 100644 --- a/bonus/pipex.c +++ b/bonus/pipex.c @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */ -/* Updated: 2023/01/30 14:24:01 by erey-bet ### ########.fr */ +/* Updated: 2023/02/14 14:08:49 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -69,22 +69,8 @@ int pipex(int argc, t_data data) if (pipe(data.fd[1]) < -1) return (1); fk = ft_calloc(argc - 3, sizeof(int)); - i = -1; - while (++i < argc - 3) - { - fk[i] = fork(); - if (fk[i] < 0) - return (1); - if (fk[i] == 0) - { - if (i == 0 && data.fd1 > 0 && data.cmds[0]) - cmd(data, i, 0); - else if (i + 1 < argc - 3) - cmd(data, i, 1); - else - cmd(data, i, 2); - } - } + if (pipex_loop(argc, &fk, data)) + return (1); close(data.fd[0][0]); close(data.fd[0][1]); close(data.fd[1][0]); @@ -92,7 +78,7 @@ int pipex(int argc, t_data data) if (data.fd1 > 0 && data.cmds[0]) waitpid(fk[0], NULL, 0); i = -1; - while (++i < argc - 3) + while (++i < argc - 3) waitpid(fk[i], NULL, 0); free(fk); return (0); @@ -101,25 +87,20 @@ int pipex(int argc, t_data data) int main(int argc, char *argv[], char **env) { t_data data; - int i; if (argc < 5) return (1); - if (parsing(argc, argv, &data)) - return (2); - data.argc = argc; - i = -1; - while (++i < argc - 3) + if (ft_strncmp(argv[1], "here_doc", 8) == 0) { - data.cmds[i] = find_command(env, data.cmds[i]); - if (data.cmds[i] == NULL) - { - print_error(1, argv[2 + i]); - if (i == argc - 4) - return (free_all(&data)); - } + argc = argc - 1; + if (here_doc(argc, argv, env, &data)) + return (2); } - data.env = env; + else if (parsing(argc, argv, env, &data)) + return (3); + data.argc = argc; + if (verification_command(argv, data)) + return (4); if (pipex(argc, data)) return (free_all(&data)); free_all(&data); diff --git a/bonus/pipex.h b/bonus/pipex.h index 02a6783..9319255 100644 --- a/bonus/pipex.h +++ b/bonus/pipex.h @@ -6,7 +6,7 @@ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/11 15:33:34 by erey-bet #+# #+# */ -/* Updated: 2023/01/30 14:03:26 by erey-bet ### ########.fr */ +/* Updated: 2023/02/14 14:02:35 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,7 +30,7 @@ typedef struct s_data int fd2; int fd[2][2]; char **env; - int argc; + int argc; } t_data; int get_next(char *cmd, char c); @@ -38,9 +38,14 @@ 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[], t_data *data); +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 cmd(t_data data, int i, int t); +int verification_command(char *argv[], t_data data); +int free_all(t_data *data); #endif diff --git a/bonus/pipex_heredoc.c b/bonus/pipex_heredoc.c new file mode 100644 index 0000000..0bdb07c --- /dev/null +++ b/bonus/pipex_heredoc.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pipex_heredoc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: erey-bet +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/14 11:22:13 by erey-bet #+# #+# */ +/* Updated: 2023/02/14 14:59:59 by erey-bet ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "pipex.h" + +int parsing_here_doc(int argc, char *argv[], t_data *data) +{ + int i; + + data->fd2 = open(argv[argc], O_WRONLY | O_TRUNC | O_CREAT); + if (data->fd2 < 0) + return (1); + data->cmds = ft_calloc(argc - 2, sizeof(char *)); + data->flgs = ft_calloc(argc - 2, sizeof(char *)); + i = -1; + while (++i < argc - 3) + { + data->cmds[i] = get_command(argv[3 + i]); + data->flgs[i] = ft_split(argv[3 + i], ' '); + } + return (0); +} + +int here_doc(int argc, char *argv[], char **env, t_data *data) +{ + char *cur; + int fd[2]; + + if (pipe(fd) < -1) + return (1); + while (1) + { + cur = get_next_line(0); + if (ft_strncmp(cur, argv[2], ft_strlen(argv[2])) == 0) + break ; + ft_putstr_fd(cur, fd[1]); + free(cur); + } + free(cur); + data->fd1 = fd[0]; + close(fd[1]); + if (parsing_here_doc(argc, argv, data) > 0) + return (1); + data->env = env; + return (0); +} diff --git a/bonus/pipex_parsing.c b/bonus/pipex_parsing.c index a84d4d3..e368920 100644 --- a/bonus/pipex_parsing.c +++ b/bonus/pipex_parsing.c @@ -12,7 +12,7 @@ #include "pipex.h" -int parsing(int argc, char *argv[], t_data *data) +int parsing(int argc, char *argv[], char **env, t_data *data) { int i; @@ -21,7 +21,7 @@ int parsing(int argc, char *argv[], t_data *data) return (1); data->fd1 = open(argv[1], O_RDONLY); if (data->fd1 < 0) - print_error(0, argv[1]); + return (print_error(0, argv[1])); data->cmds = ft_calloc(argc - 2, sizeof(char *)); data->flgs = ft_calloc(argc - 2, sizeof(char *)); i = -1; @@ -30,8 +30,7 @@ int parsing(int argc, char *argv[], t_data *data) data->cmds[i] = get_command(argv[2 + i]); data->flgs[i] = ft_split(argv[2 + i], ' '); } - data->fl1 = argv[1]; - data->fl2 = argv[argc - 1]; + data->env = env; return (0); } diff --git a/bonus/pipex_utils2.c b/bonus/pipex_utils2.c new file mode 100644 index 0000000..a704d7a --- /dev/null +++ b/bonus/pipex_utils2.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pipex_utils2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: erey-bet +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/14 15:46:08 by erey-bet #+# #+# */ +/* Updated: 2023/02/14 15:48:06 by erey-bet ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "pipex.h" + +int pipex_loop(int argc, int **fk, t_data data) +{ + int i; + + i = -1; + while (++i < argc - 3) + { + (*fk)[i] = fork(); + if ((*fk)[i] < 0) + return (1); + if ((*fk)[i] == 0) + { + if (i == 0 && data.fd1 > 0 && data.cmds[0]) + cmd(data, i, 0); + else if (i + 1 < argc - 3) + cmd(data, i, 1); + else + cmd(data, i, 2); + } + } + return (0); +} + +int verification_command(char *argv[], t_data data) +{ + int i; + + i = -1; + while (++i < data.argc - 3) + { + 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); +} diff --git a/input b/input index e69de29..ae481d0 100644 --- a/input +++ b/input @@ -0,0 +1,10 @@ +QEQFEQFEfefafaa +f + + + +fse + + +wwaqqqf +qqea diff --git a/mandatory/pipex_parsing.c b/mandatory/pipex_parsing.c index ccc5e42..cbb400e 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/01/20 14:54:05 by erey-bet ### ########.fr */ +/* Updated: 2023/02/14 16:49:31 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ int parsing(char *argv[], t_data *data) return (1); data->fd1 = open(argv[1], O_RDONLY); if (data->fd1 < 0) - print_error(0, argv[1]); + return (print_error(0, argv[1])); data->cmd1 = get_command(argv[2]); data->cmd2 = get_command(argv[3]); data->flg1 = ft_split(argv[2], ' '); diff --git a/output b/output new file mode 100644 index 0000000..e68b298 --- /dev/null +++ b/output @@ -0,0 +1,3 @@ +get_next_line +Makefile +pipex