/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* pipex_parsing.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/19 17:03:01 by erey-bet #+# #+# */ /* Updated: 2023/03/23 17:04:19 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ #include "pipex.h" int parsing(char *argv[], t_data *data) { data->fd2 = open(argv[4], O_WRONLY | O_TRUNC | O_CREAT, 0644); if (data->fd2 < 0) return (print_error(0, argv[4])); data->fd1 = open(argv[1], O_RDONLY); if (data->fd1 < 0) print_error(0, argv[1]); data->cmd1 = get_command(argv[2]); if (!data->cmd1) print_error(2, argv[2]); data->cmd2 = get_command(argv[3]); if (!data->cmd2) { if (data->fd1 > 0) close(data->fd1); close(data->fd2); if (data->cmd1) free(data->cmd1); print_error(2, argv[3]); return (1); } data->flg1 = ft_split(argv[2], ' '); data->flg2 = ft_split(argv[3], ' '); return (0); } char *test_acces(char **s, char **cmd, char **path, int *y) { *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)); } int finds_commands(char *argv[], char **env, char **cmd1, char **cmd2) { if (*cmd1) { *cmd1 = find_command(env, *cmd1); if (*cmd1 == NULL) print_error(1, argv[2]); } *cmd2 = find_command(env, *cmd2); if (*cmd2 == NULL) { print_error(1, argv[3]); return (1); } return (0); }