/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* pipex_parsing_bonus.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/19 17:03:01 by erey-bet #+# #+# */ /* Updated: 2023/03/28 21:13:13 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ #include "pipex_bonus.h" int parsing(int argc, char *argv[], char **env, t_data *data) { int i; data->argc = argc; data->fd2 = open(argv[argc - 1], O_WRONLY | O_TRUNC | O_CREAT, 0644); if (data->fd2 < 0) return (print_error(0, argv[argc - 1])); data->fd1 = open(argv[1], O_RDONLY); if (data->fd1 < 0) print_error(0, argv[1]); data->cmds = ft_calloc(argc - 2, sizeof(char *)); if (!data->cmds) return (1); data->flgs = ft_calloc(argc - 2, sizeof(char *)); if (!data->flgs) return (free_all(data)); i = -1; while (++i < argc - 3) { data->cmds[i] = get_command(argv[2 + i]); data->flgs[i] = ft_split(argv[2 + i], ' '); } if (!data->cmds[argc - 4] || !data->flgs[argc - 4]) return (free_all(data)); data->env = env; return (0); } char *test_acces(char **s, char **cmd, char **path, int *y) { if ((*cmd)[0] != '.' && (*cmd)[1] != '/') *s = ft_strjoin_free(*s, "/", 1); if (*s == NULL) return (NULL); *path = ft_strjoin_free(*s, *cmd, 1); if (*path == NULL) return (NULL); if (access(*path, X_OK) == 0) { free(*cmd); return (*path); } free(*path); *path = NULL; *y = 0; return (NULL); } char *cmd_exist(char **env, char **cmd, int y, char **s) { char *path; size_t i; size_t len; i = 4; len = ft_strlen(*env); while (i < len) { test_acces(s, cmd, &path, &y); if (path) return (path); *s = ft_calloc(ft_strlen(*env) + 1, 1); if (*s == NULL) return (NULL); while ((*env)[++i] != ':' && i < len) (*s)[y++] = (*env)[i]; } free(*s); free(*cmd); return (NULL); } char *find_command(char **env, char *cmd) { char *s; int y; while (*env != NULL) { if (ft_strnstr(*env, "PATH=", 6)) break ; env++; } if (ft_strlen(*env) == 0) env--; y = 0; s = ft_calloc(ft_strlen(*env) + 1, 1); if (s == NULL) return (NULL); return (cmd_exist(env, &cmd, y, &s)); }