106 lines
2.6 KiB
C
106 lines
2.6 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* pipex_parsing_bonus.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2023/01/19 17:03:01 by erey-bet #+# #+# */
|
|
/* Updated: 2023/03/23 17:14:59 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[i] || !data->flgs[i])
|
|
return (free_all(data));
|
|
}
|
|
data->env = env;
|
|
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));
|
|
}
|