From: Dominik Kaiser Date: Wed, 8 May 2024 10:03:16 +0000 (+0200) Subject: Add freeing and make norminette happy X-Git-Url: https://git.dkaiser.de/?a=commitdiff_plain;h=334aaa56cd3963f171afec6e852b9c07ad613828;p=42%2Fpipex.git Add freeing and make norminette happy --- diff --git a/Makefile b/Makefile index 69c304e..8277ef4 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ HEADERS = -Iinclude -Ilibft LIBS = -Llibft -lft VPATH := src -SRC = main.c env_utils.c input_handling.c +SRC = main.c env_utils.c get_cmd_path.c input_handling.c OBJ_DIR := obj OBJ := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o)) diff --git a/src/env_utils.c b/src/env_utils.c index 065ffb3..4b507a2 100644 --- a/src/env_utils.c +++ b/src/env_utils.c @@ -6,7 +6,7 @@ /* By: dkaiser in_fd = open(argv[1], O_RDONLY); result->out_fd = open(argv[--argc], O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWUSR); diff --git a/src/main.c b/src/main.c index 0a0dd61..68dbac5 100644 --- a/src/main.c +++ b/src/main.c @@ -6,54 +6,76 @@ /* By: dkaiser #include #include #include -int pipex(t_pxdata *data, char *envp[]) +static void pipex_child(t_pxdata *data, char *envp[], int p[2]) { - int p[2]; - pid_t pid; char **cmd; int status; - pipe(p); - pid = fork(); - if (pid < 0) - return (EXIT_FAILURE); - if (pid == 0) + close(p[0]); + dup2(data->in_fd, 0); + dup2(p[1], 1); + if (!data->cmds[0]) + exit(127); + cmd = ft_split(data->cmds[0], ' '); + if (cmd) { - close(p[0]); - dup2(data->in_fd, 0); - dup2(p[1], 1); - if (!data->cmds[0]) - exit(127); - cmd = ft_split(data->cmds[0], ' '); // TODO: Free on fail status = execve(cmd[0], cmd, envp); - free(cmd); + ft_free_split(cmd); exit(status); } - else +} + +static int pipex_parent(t_pxdata *data, char *envp[], int p[2]) +{ + char **cmd; + + close(p[1]); + dup2(p[0], 0); + dup2(data->out_fd, 1); + if (!data->cmds[1]) + return (EXIT_FAILURE); + cmd = ft_split(data->cmds[1], ' '); + if (cmd) { - close(p[1]); - dup2(p[0], 0); - dup2(data->out_fd, 1); - if (!data->cmds[1]) - return (EXIT_FAILURE); - cmd = ft_split(data->cmds[1], ' '); // TODO: Free on fail if (execve(cmd[0], cmd, envp)) return (EXIT_FAILURE); - free(cmd); + ft_free_split(cmd); + return (EXIT_SUCCESS); } + return (EXIT_FAILURE); +} + +static int pipex(t_pxdata *data, char *envp[]) +{ + int result; + int p[2]; + pid_t pid; + + pipe(p); + result = EXIT_SUCCESS; + pid = fork(); + if (pid < 0) + return (EXIT_FAILURE); + if (pid == 0) + pipex_child(data, envp, p); + else + result = pipex_parent(data, envp, p); close(data->in_fd); close(data->out_fd); - return (EXIT_SUCCESS); + ft_free_split(data->cmds); + free(data); + return (result); } int main(int argc, char *argv[], char *envp[]) @@ -63,14 +85,5 @@ int main(int argc, char *argv[], char *envp[]) if (argc != 5) return (1); data = get_pxdata(argc, argv, envp); - /* if (data->in_fd < 0 || data->out_fd < 0) */ - /* return (1); */ - /* ft_printf("IN: %d\nOUT: %d\n", data->in_fd, data->out_fd); */ - /* int i = 0; */ - /* while (data->cmds[i]) */ - /* { */ - /* ft_printf("CMD [%d]: %s\n", i, data->cmds[i]); */ - /* i++; */ - /* } */ return (pipex(data, envp)); }