pipex/mandatory/pipex_parsing.c
Etienne Rey-bethbeder 8e1c7369d4 Rien à dire :')
2023-03-23 17:21:32 +01:00

121 lines
2.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* pipex_parsing.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}