summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c81
1 files changed, 47 insertions, 34 deletions
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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/29 13:35:21 by dkaiser #+# #+# */
-/* Updated: 2024/05/07 16:36:39 by dkaiser ### ########.fr */
+/* Updated: 2024/05/08 11:53:26 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
+#include "libft.h"
#include "pipex.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/_types/_pid_t.h>
#include <unistd.h>
-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));
}