diff options
| author | Dominik Kaiser | 2024-05-07 16:05:24 +0200 |
|---|---|---|
| committer | Dominik Kaiser | 2024-05-07 16:05:24 +0200 |
| commit | d2fc33211204c4885f54c518fb5d6f1b31160136 (patch) | |
| tree | 219fa21550e6bb3fc0060336e75a25e091c9ee27 /src | |
| parent | ff846486ce845beab8b0fe31c227b5c5ad620bb9 (diff) | |
| download | pipex-d2fc33211204c4885f54c518fb5d6f1b31160136.tar.gz pipex-d2fc33211204c4885f54c518fb5d6f1b31160136.zip | |
Restore progress
I deleted almost my entire progress of today, but now everything should
be restored.
Diffstat (limited to 'src')
| -rw-r--r-- | src/env_utils.c | 22 | ||||
| -rw-r--r-- | src/input_handling.c | 5 | ||||
| -rw-r--r-- | src/main.c | 66 |
3 files changed, 78 insertions, 15 deletions
diff --git a/src/env_utils.c b/src/env_utils.c index 4e02032..5195c2f 100644 --- a/src/env_utils.c +++ b/src/env_utils.c @@ -6,10 +6,11 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/02 16:19:31 by dkaiser #+# #+# */ -/* Updated: 2024/05/07 15:16:32 by dkaiser ### ########.fr */ +/* Updated: 2024/05/07 16:02:38 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ +#include "libft.h" #include "pipex.h" char **get_split_path(char *envp[]) @@ -51,7 +52,7 @@ char *find_in_path(char *cmd, char **path) if (!cmd_path) return (NULL); if (access(cmd_path, X_OK) != -1) - return (cur_path); + return (cmd_path); path++; } return (NULL); @@ -60,20 +61,29 @@ char *find_in_path(char *cmd, char **path) char *get_cmd_path(char *cmd, char **path, char *pwd) { char *cur_dir; + char *lone_cmd; + int len; + char *res; if (cmd[0] == '/') return (cmd); // TODO: Maybe use duplicate instead, so there will be no problem on free() - else if (strchr(cmd, '/')) + else if (ft_strchr(cmd, '/')) { cur_dir = ft_strjoin(pwd, "/"); // TODO: Free on fail // TODO: Maybe check if executable, else there might be a problem... return (ft_strjoin(cur_dir, cmd)); } - else if (strchr(cmd, ' ')) + else if (ft_strchr(cmd, ' ')) { - //AAAAAAAAAAA - return (NULL); + len = ft_strchr(cmd, ' ') - cmd + 1; + lone_cmd = malloc(len * sizeof(char)); + // TODO: Free on fail + ft_strlcpy(lone_cmd, cmd, len); + res = find_in_path(lone_cmd, path); + if (!res) + return (NULL); + return(ft_strjoin(res, ft_strchr(cmd, ' '))); } else { diff --git a/src/input_handling.c b/src/input_handling.c index ef4cec8..2fbe564 100644 --- a/src/input_handling.c +++ b/src/input_handling.c @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/02 12:13:23 by dkaiser #+# #+# */ -/* Updated: 2024/05/07 15:26:08 by dkaiser ### ########.fr */ +/* Updated: 2024/05/07 16:04:22 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,11 +31,12 @@ static char **get_cmds(int argc, char *argv[], char *envp[]) // TODO: Free on fail pwd = get_pwd(envp); i = 2; - while (i < argc - 1) + while (i < argc) { cmds[i - 2] = get_cmd_path(argv[i], path, pwd); i++; } + cmds[i - 2] = 0; i = 0; while (path[i]) free(path[i++]); @@ -6,19 +6,71 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/29 13:35:21 by dkaiser #+# #+# */ -/* Updated: 2024/05/02 14:38:11 by dkaiser ### ########.fr */ +/* Updated: 2024/05/07 16:04:43 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "pipex.h" +#include <stdlib.h> +#include <sys/_types/_pid_t.h> +#include <unistd.h> +#include <stdio.h> + +int pipex(t_pxdata *data, char *envp[]) +{ + 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], ' '); // TODO: Free on fail + status = execve(cmd[0], cmd, envp); + free(cmd); + exit(status); + } + else + { + 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); + } + close(data->in_fd); + close(data->out_fd); + return (EXIT_SUCCESS); +} int main(int argc, char *argv[], char *envp[]) { - if (!argc || !argv || !envp) + t_pxdata *data; + + if (argc != 5) return (1); - // Read content of file1 (argv[1]) - // Execute cmd1 (argv[2]) with file1 on stdin - // pipe the output of cmd1 into cmd2 - // Execute cmd2 (argv[3]) with the piped input on stdin - // Write output of cmd2 into file2 (argv[4]) + 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); } |
