diff options
| author | Dominik Kaiser | 2024-05-08 12:03:16 +0200 |
|---|---|---|
| committer | Dominik Kaiser | 2024-05-08 12:03:16 +0200 |
| commit | 334aaa56cd3963f171afec6e852b9c07ad613828 (patch) | |
| tree | 1fa796501488d746f2d22c7bee80e5212dc830cc /src | |
| parent | e682f9bfb95b28c29665f24d15464cb26abf1127 (diff) | |
| download | pipex-334aaa56cd3963f171afec6e852b9c07ad613828.tar.gz pipex-334aaa56cd3963f171afec6e852b9c07ad613828.zip | |
Add freeing and make norminette happy
Diffstat (limited to 'src')
| -rw-r--r-- | src/env_utils.c | 36 | ||||
| -rw-r--r-- | src/get_cmd_path.c | 72 | ||||
| -rw-r--r-- | src/input_handling.c | 12 | ||||
| -rw-r--r-- | src/main.c | 81 |
4 files changed, 125 insertions, 76 deletions
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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/02 16:19:31 by dkaiser #+# #+# */ -/* Updated: 2024/05/07 16:36:32 by dkaiser ### ########.fr */ +/* Updated: 2024/05/08 11:40:01 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,37 +57,3 @@ char *find_in_path(char *cmd, char **path) } return (NULL); } - -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 (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 (ft_strchr(cmd, ' ')) - { - 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 - { - return (find_in_path(cmd, path)); - } -} diff --git a/src/get_cmd_path.c b/src/get_cmd_path.c new file mode 100644 index 0000000..749be18 --- /dev/null +++ b/src/get_cmd_path.c @@ -0,0 +1,72 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_cmd_path.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/08 11:35:47 by dkaiser #+# #+# */ +/* Updated: 2024/05/08 11:39:44 by dkaiser ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "pipex.h" + +static char *get_absolute_cmd_path(char *cmd, char *pwd) +{ + char *cur_dir; + char *result; + + cur_dir = ft_strjoin(pwd, "/"); + if (!cur_dir) + return (NULL); + result = ft_strjoin(cur_dir, cmd); + free(cur_dir); + if (!result) + return (NULL); + if (access(result, X_OK) == -1) + { + free(result); + return (NULL); + } + return (result); +} + +static char *get_cmd_path_with_args(char *cmd, char **path) +{ + int len; + char *lone_cmd; + char *cmd_path; + char *result; + + len = ft_strchr(cmd, ' ') - cmd + 1; + lone_cmd = malloc(len * sizeof(char)); + if (!lone_cmd) + return (NULL); + ft_strlcpy(lone_cmd, cmd, len); + cmd_path = find_in_path(lone_cmd, path); + free(lone_cmd); + if (!cmd_path) + return (NULL); + result = ft_strjoin(cmd_path, ft_strchr(cmd, ' ')); + free(cmd_path); + return (result); +} + +char *get_cmd_path(char *cmd, char **path, char *pwd) +{ + if (cmd[0] == '/') + return (ft_strdup(cmd)); + else if (ft_strchr(cmd, '/')) + { + return (get_absolute_cmd_path(cmd, pwd)); + } + else if (ft_strchr(cmd, ' ')) + { + return (get_cmd_path_with_args(cmd, path)); + } + else + { + return (find_in_path(cmd, path)); + } +} diff --git a/src/input_handling.c b/src/input_handling.c index aef1ec9..62095b9 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 16:36:36 by dkaiser ### ########.fr */ +/* Updated: 2024/05/08 11:54:37 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,8 @@ static char **get_cmds(int argc, char *argv[], char *envp[]) if (!cmds) return (NULL); path = get_split_path(envp); - // TODO: Free on fail + if (!path) + return (NULL); pwd = get_pwd(envp); i = 2; while (i < argc) @@ -37,10 +38,7 @@ static char **get_cmds(int argc, char *argv[], char *envp[]) i++; } cmds[i - 2] = 0; - i = 0; - while (path[i]) - free(path[i++]); - free(path); + ft_free_split(path); return (cmds); } @@ -50,7 +48,7 @@ t_pxdata *get_pxdata(int argc, char *argv[], char *envp[]) result = malloc(sizeof(t_pxdata)); if (!result) - return (NULL); // TODO: Check if an error message needs to be sent + return (NULL); result->in_fd = open(argv[1], O_RDONLY); result->out_fd = open(argv[--argc], O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWUSR); @@ -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)); } |
