Compare commits
10 commits
1291269706
...
a2160605be
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a2160605be | ||
![]() |
0f4140fb0c | ||
![]() |
8e1c7369d4 | ||
![]() |
3b1ba673f7 | ||
![]() |
fc7e8401a3 | ||
![]() |
6f5907bf3b | ||
![]() |
676173a098 | ||
![]() |
2e90554ff2 | ||
![]() |
3f270563e9 | ||
![]() |
b3f4633d45 |
11
Makefile
11
Makefile
|
@ -1,6 +1,6 @@
|
||||||
GNL = get_next_line/get_next_line.c get_next_line/get_next_line_utils.c
|
GNL = get_next_line/get_next_line.c get_next_line/get_next_line_utils.c
|
||||||
SRCS = mandatory/pipex.c mandatory/pipex_utils.c mandatory/pipex_parsing.c ${GNL}
|
SRCS = mandatory/pipex.c mandatory/pipex_utils.c mandatory/pipex_parsing.c ${GNL}
|
||||||
SRCS_BONUS = bonus/pipex.c bonus/pipex_utils.c bonus/pipex_parsing.c bonus/pipex_heredoc.c bonus/pipex_utils2.c ${GNL}
|
SRCS_BONUS = bonus/pipex_bonus.c bonus/pipex_utils_bonus.c bonus/pipex_parsing_bonus.c bonus/pipex_heredoc_bonus.c bonus/pipex_utils2_bonus.c ${GNL}
|
||||||
OBJS = ${SRCS:.c=.o}
|
OBJS = ${SRCS:.c=.o}
|
||||||
OBJS_BONUS = ${SRCS_BONUS:.c=.o}
|
OBJS_BONUS = ${SRCS_BONUS:.c=.o}
|
||||||
LIBS = libft/libft.a
|
LIBS = libft/libft.a
|
||||||
|
@ -32,7 +32,7 @@ re: fclean all
|
||||||
|
|
||||||
rebonus: fclean bonus
|
rebonus: fclean bonus
|
||||||
|
|
||||||
.PHONY: all clean fclean re rebonus coffee
|
.PHONY: all clean fclean re rebonus coffee bozo
|
||||||
|
|
||||||
coffee:
|
coffee:
|
||||||
@clear
|
@clear
|
||||||
|
@ -135,3 +135,10 @@ coffee:
|
||||||
@echo ' ""--..,,_____ _____,,..--"""'''
|
@echo ' ""--..,,_____ _____,,..--"""'''
|
||||||
@echo ' """------"""'
|
@echo ' """------"""'
|
||||||
make coffee
|
make coffee
|
||||||
|
|
||||||
|
bozo :
|
||||||
|
@wget -q -O bozo.gif https://i.kym-cdn.com/photos/images/newsfeed/002/322/200/e51.gif
|
||||||
|
@xdg-open bozo.gif
|
||||||
|
@sleep 2.26
|
||||||
|
@pkill eog
|
||||||
|
@rm bozo.gif
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* pipex.c :+: :+: :+: */
|
/* pipex_bonus.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */
|
/* Created: 2023/03/20 09:48:45 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/08 19:16:14 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/26 21:52:53 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "pipex.h"
|
#include "pipex_bonus.h"
|
||||||
|
|
||||||
void make_cmd(t_data data, int i, int fl1, int fl2)
|
void make_cmd(t_data data, int i, int fl1, int fl2)
|
||||||
{
|
{
|
||||||
|
@ -31,7 +31,7 @@ void make_cmd(t_data data, int i, int fl1, int fl2)
|
||||||
execve(data.cmds[i], data.flgs[i], data.env);
|
execve(data.cmds[i], data.flgs[i], data.env);
|
||||||
}
|
}
|
||||||
|
|
||||||
void choice_cmd(t_data data, int i)
|
void choice_cmd(t_data data, int i, int **forks)
|
||||||
{
|
{
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
make_cmd(data, 0, data.fd1, data.fd[0][1]);
|
make_cmd(data, 0, data.fd1, data.fd[0][1]);
|
||||||
|
@ -40,6 +40,7 @@ void choice_cmd(t_data data, int i)
|
||||||
else
|
else
|
||||||
make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd2);
|
make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd2);
|
||||||
write(2, "Error execve\n", 13);
|
write(2, "Error execve\n", 13);
|
||||||
|
free(*forks);
|
||||||
free_all(&data);
|
free_all(&data);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -59,7 +60,7 @@ int pipex_loop(int argc, int **forks, t_data data)
|
||||||
if ((*forks)[i] < 0)
|
if ((*forks)[i] < 0)
|
||||||
return (1);
|
return (1);
|
||||||
if ((*forks)[i] == 0)
|
if ((*forks)[i] == 0)
|
||||||
choice_cmd(data, i);
|
choice_cmd(data, i, forks);
|
||||||
}
|
}
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
if (open_close_pipe(&data, 1, (i + 1) % 2))
|
if (open_close_pipe(&data, 1, (i + 1) % 2))
|
||||||
|
@ -77,7 +78,10 @@ int pipex(int argc, t_data data)
|
||||||
if (!forks)
|
if (!forks)
|
||||||
return (1);
|
return (1);
|
||||||
if (pipex_loop(argc, &forks, data))
|
if (pipex_loop(argc, &forks, data))
|
||||||
|
{
|
||||||
|
free(forks);
|
||||||
return (1);
|
return (1);
|
||||||
|
}
|
||||||
i = -1;
|
i = -1;
|
||||||
while (++i < argc - 3)
|
while (++i < argc - 3)
|
||||||
waitpid(forks[i], NULL, 0);
|
waitpid(forks[i], NULL, 0);
|
||||||
|
@ -98,13 +102,12 @@ int main(int argc, char *argv[], char **env)
|
||||||
{
|
{
|
||||||
argc = argc - 1;
|
argc = argc - 1;
|
||||||
if (here_doc(argc, argv, env, &data))
|
if (here_doc(argc, argv, env, &data))
|
||||||
return (2);
|
return (1);
|
||||||
}
|
}
|
||||||
else if (parsing(argc, argv, env, &data))
|
else if (parsing(argc, argv, env, &data))
|
||||||
return (3);
|
return (1);
|
||||||
data.argc = argc;
|
|
||||||
if (verification_command(argv, data))
|
if (verification_command(argv, data))
|
||||||
return (4);
|
return (free_all(&data));
|
||||||
if (pipex(argc, data))
|
if (pipex(argc, data))
|
||||||
return (free_all(&data));
|
return (free_all(&data));
|
||||||
free_all(&data);
|
free_all(&data);
|
|
@ -1,17 +1,17 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* pipex.h :+: :+: :+: */
|
/* pipex_bonus.h :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/01/11 15:33:34 by erey-bet #+# #+# */
|
/* Created: 2023/03/20 09:59:23 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/08 14:33:18 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/21 15:23:03 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#ifndef PIPEX_H
|
#ifndef PIPEX_BONUS_H
|
||||||
# define PIPEX_H
|
# define PIPEX_BONUS_H
|
||||||
|
|
||||||
# include "../libft/libft.h"
|
# include "../libft/libft.h"
|
||||||
# include "../get_next_line/get_next_line.h"
|
# include "../get_next_line/get_next_line.h"
|
||||||
|
@ -24,8 +24,6 @@ typedef struct s_data
|
||||||
{
|
{
|
||||||
char **cmds;
|
char **cmds;
|
||||||
char ***flgs;
|
char ***flgs;
|
||||||
char *fl1;
|
|
||||||
char *fl2;
|
|
||||||
int fd1;
|
int fd1;
|
||||||
int fd2;
|
int fd2;
|
||||||
int fd[2][2];
|
int fd[2][2];
|
||||||
|
@ -33,18 +31,15 @@ typedef struct s_data
|
||||||
int argc;
|
int argc;
|
||||||
} t_data;
|
} t_data;
|
||||||
|
|
||||||
int get_next(char *cmd, char c);
|
|
||||||
int print_error(int type, char *error);
|
int print_error(int type, char *error);
|
||||||
char **get_flags(char *cmd);
|
char **get_flags(char *cmd);
|
||||||
char *get_command(char *cmd);
|
char *get_command(char *cmd);
|
||||||
char **add_cmd(char **flg, char *cmd);
|
|
||||||
int parsing(int argc, char *argv[], char **env, t_data *data);
|
int parsing(int argc, char *argv[], char **env, t_data *data);
|
||||||
char *test_acces(char **s, char **cmd, char **path, int *y);
|
char *test_acces(char **s, char **cmd, char **path, int *y);
|
||||||
char *cmd_exist(char **env, char **cmd, int y, char **s);
|
char *cmd_exist(char **env, char **cmd, int y, char **s);
|
||||||
char *find_command(char **env, char *cmd);
|
char *find_command(char **env, char *cmd);
|
||||||
int here_doc(int argc, char *argv[], char **env, t_data *data);
|
int here_doc(int argc, char *argv[], char **env, t_data *data);
|
||||||
int pipex_loop(int argc, int **fk, t_data data);
|
int pipex_loop(int argc, int **fk, t_data data);
|
||||||
void choice_cmd(t_data data, int i);
|
|
||||||
int verification_command(char *argv[], t_data data);
|
int verification_command(char *argv[], t_data data);
|
||||||
int free_all(t_data *data);
|
int free_all(t_data *data);
|
||||||
int open_close_pipe(t_data *data, int boolean, int file);
|
int open_close_pipe(t_data *data, int boolean, int file);
|
|
@ -1,21 +1,22 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* pipex_heredoc.c :+: :+: :+: */
|
/* pipex_heredoc_bonus.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/02/14 11:22:13 by erey-bet #+# #+# */
|
/* Created: 2023/02/14 11:22:13 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/08 14:38:34 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/28 18:07:02 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "pipex.h"
|
#include "pipex_bonus.h"
|
||||||
|
|
||||||
int parsing_here_doc(int argc, char *argv[], t_data *data)
|
int parsing_here_doc(int argc, char *argv[], t_data *data)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
data->argc = argc;
|
||||||
data->fd2 = open(argv[argc], O_WRONLY | O_APPEND | O_CREAT, 0644);
|
data->fd2 = open(argv[argc], O_WRONLY | O_APPEND | O_CREAT, 0644);
|
||||||
if (data->fd2 < 0)
|
if (data->fd2 < 0)
|
||||||
{
|
{
|
||||||
|
@ -23,13 +24,19 @@ int parsing_here_doc(int argc, char *argv[], t_data *data)
|
||||||
return (print_error(0, argv[argc]));
|
return (print_error(0, argv[argc]));
|
||||||
}
|
}
|
||||||
data->cmds = ft_calloc(argc - 2, sizeof(char *));
|
data->cmds = ft_calloc(argc - 2, sizeof(char *));
|
||||||
|
if (!data->cmds)
|
||||||
|
return (1);
|
||||||
data->flgs = ft_calloc(argc - 2, sizeof(char *));
|
data->flgs = ft_calloc(argc - 2, sizeof(char *));
|
||||||
|
if (!data->cmds)
|
||||||
|
return (free_all(data));
|
||||||
i = -1;
|
i = -1;
|
||||||
while (++i < argc - 3)
|
while (++i < argc - 3)
|
||||||
{
|
{
|
||||||
data->cmds[i] = get_command(argv[3 + i]);
|
data->cmds[i] = get_command(argv[3 + i]);
|
||||||
data->flgs[i] = ft_split(argv[3 + i], ' ');
|
data->flgs[i] = ft_split(argv[3 + i], ' ');
|
||||||
}
|
}
|
||||||
|
if (!data->cmds[argc - 4] || !data->flgs[argc - 4])
|
||||||
|
return (free_all(data));
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,6 +64,8 @@ int here_doc(int argc, char *argv[], char **env, t_data *data)
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
cur = get_next_line(0);
|
cur = get_next_line(0);
|
||||||
|
if (!cur)
|
||||||
|
break ;
|
||||||
cur[ft_strlen(cur) - 1] = '\0';
|
cur[ft_strlen(cur) - 1] = '\0';
|
||||||
if (ft_strcmp(cur, argv[2]) == 0)
|
if (ft_strcmp(cur, argv[2]) == 0)
|
||||||
break ;
|
break ;
|
|
@ -1,21 +1,22 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* pipex_parsing.c :+: :+: :+: */
|
/* pipex_parsing_bonus.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/01/19 17:03:01 by erey-bet #+# #+# */
|
/* Created: 2023/01/19 17:03:01 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/07 19:26:23 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/28 21:13:13 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "pipex.h"
|
#include "pipex_bonus.h"
|
||||||
|
|
||||||
int parsing(int argc, char *argv[], char **env, t_data *data)
|
int parsing(int argc, char *argv[], char **env, t_data *data)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
data->argc = argc;
|
||||||
data->fd2 = open(argv[argc - 1], O_WRONLY | O_TRUNC | O_CREAT, 0644);
|
data->fd2 = open(argv[argc - 1], O_WRONLY | O_TRUNC | O_CREAT, 0644);
|
||||||
if (data->fd2 < 0)
|
if (data->fd2 < 0)
|
||||||
return (print_error(0, argv[argc - 1]));
|
return (print_error(0, argv[argc - 1]));
|
||||||
|
@ -23,20 +24,27 @@ int parsing(int argc, char *argv[], char **env, t_data *data)
|
||||||
if (data->fd1 < 0)
|
if (data->fd1 < 0)
|
||||||
print_error(0, argv[1]);
|
print_error(0, argv[1]);
|
||||||
data->cmds = ft_calloc(argc - 2, sizeof(char *));
|
data->cmds = ft_calloc(argc - 2, sizeof(char *));
|
||||||
|
if (!data->cmds)
|
||||||
|
return (1);
|
||||||
data->flgs = ft_calloc(argc - 2, sizeof(char *));
|
data->flgs = ft_calloc(argc - 2, sizeof(char *));
|
||||||
|
if (!data->flgs)
|
||||||
|
return (free_all(data));
|
||||||
i = -1;
|
i = -1;
|
||||||
while (++i < argc - 3)
|
while (++i < argc - 3)
|
||||||
{
|
{
|
||||||
data->cmds[i] = get_command(argv[2 + i]);
|
data->cmds[i] = get_command(argv[2 + i]);
|
||||||
data->flgs[i] = ft_split(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;
|
data->env = env;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *test_acces(char **s, char **cmd, char **path, int *y)
|
char *test_acces(char **s, char **cmd, char **path, int *y)
|
||||||
{
|
{
|
||||||
*s = ft_strjoin_free(*s, "/", 1);
|
if ((*cmd)[0] != '.' && (*cmd)[1] != '/')
|
||||||
|
*s = ft_strjoin_free(*s, "/", 1);
|
||||||
if (*s == NULL)
|
if (*s == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
*path = ft_strjoin_free(*s, *cmd, 1);
|
*path = ft_strjoin_free(*s, *cmd, 1);
|
||||||
|
@ -84,11 +92,12 @@ char *find_command(char **env, char *cmd)
|
||||||
|
|
||||||
while (*env != NULL)
|
while (*env != NULL)
|
||||||
{
|
{
|
||||||
if (ft_strnstr(*env, "PATH=/", ft_strlen(*env))
|
if (ft_strnstr(*env, "PATH=", 6))
|
||||||
&& ft_strchr(*env, ':') > 0)
|
|
||||||
break ;
|
break ;
|
||||||
env++;
|
env++;
|
||||||
}
|
}
|
||||||
|
if (ft_strlen(*env) == 0)
|
||||||
|
env--;
|
||||||
y = 0;
|
y = 0;
|
||||||
s = ft_calloc(ft_strlen(*env) + 1, 1);
|
s = ft_calloc(ft_strlen(*env) + 1, 1);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
|
@ -1,16 +1,16 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* pipex_utils2.c :+: :+: :+: */
|
/* pipex_utils2_bonus.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/02/14 15:46:08 by erey-bet #+# #+# */
|
/* Created: 2023/02/14 15:46:08 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/08 14:39:39 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/23 17:17:24 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "pipex.h"
|
#include "pipex_bonus.h"
|
||||||
|
|
||||||
int open_close_pipe(t_data *data, int boolean, int file)
|
int open_close_pipe(t_data *data, int boolean, int file)
|
||||||
{
|
{
|
||||||
|
@ -42,37 +42,56 @@ int verification_command(char *argv[], t_data data)
|
||||||
i = -1;
|
i = -1;
|
||||||
while (++i < data.argc - 3)
|
while (++i < data.argc - 3)
|
||||||
{
|
{
|
||||||
data.cmds[i] = find_command(data.env, data.cmds[i]);
|
if (data.cmds[i])
|
||||||
if (data.cmds[i] == NULL)
|
|
||||||
{
|
{
|
||||||
print_error(1, argv[2 + i]);
|
data.cmds[i] = find_command(data.env, data.cmds[i]);
|
||||||
if (i == data.argc - 4)
|
if (data.cmds[i] == NULL)
|
||||||
return (free_all(&data));
|
{
|
||||||
|
print_error(1, argv[2 + i]);
|
||||||
|
if (i == data.argc - 4)
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int free_all(t_data *data)
|
void free_flgs(t_data *data)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
int y;
|
int y;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (data->fd1 > 0)
|
|
||||||
close(data->fd1);
|
|
||||||
close(data->fd2);
|
|
||||||
y = -1;
|
y = -1;
|
||||||
while (++y < data->argc - 3)
|
while (++y < data->argc - 3)
|
||||||
{
|
{
|
||||||
i = -1;
|
if (data->flgs[y])
|
||||||
while (data->flgs[y][++i])
|
{
|
||||||
free(data->flgs[y][i]);
|
i = -1;
|
||||||
free(data->flgs[y]);
|
while (data->flgs[y][++i])
|
||||||
|
free(data->flgs[y][i]);
|
||||||
|
free(data->flgs[y]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
free(data->flgs);
|
free(data->flgs);
|
||||||
i = -1;
|
}
|
||||||
while (++i < data->argc - 3)
|
|
||||||
free(data->cmds[i]);
|
int free_all(t_data *data)
|
||||||
free(data->cmds);
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (data->fd1 > 0)
|
||||||
|
close(data->fd1);
|
||||||
|
if (data->fd2 > 0)
|
||||||
|
close(data->fd2);
|
||||||
|
if (data->flgs)
|
||||||
|
free_flgs(data);
|
||||||
|
if (data->cmds)
|
||||||
|
{
|
||||||
|
i = -1;
|
||||||
|
while (++i < data->argc - 3)
|
||||||
|
if (data->cmds[i])
|
||||||
|
free(data->cmds[i]);
|
||||||
|
free(data->cmds);
|
||||||
|
}
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
|
@ -1,16 +1,16 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* pipex_utils.c :+: :+: :+: */
|
/* pipex_utils_bonus.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/01/19 17:02:51 by erey-bet #+# #+# */
|
/* Created: 2023/01/19 17:02:51 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/06 13:24:53 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/21 16:06:16 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "pipex.h"
|
#include "pipex_bonus.h"
|
||||||
|
|
||||||
int get_next(char *cmd, char c)
|
int get_next(char *cmd, char c)
|
||||||
{
|
{
|
||||||
|
@ -42,32 +42,6 @@ int print_error(int type, char *error)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
char **get_flags(char *cmd)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int y;
|
|
||||||
char *new_str;
|
|
||||||
char **flags;
|
|
||||||
|
|
||||||
i = get_next(cmd, ' ') + 1;
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
flags = ft_calloc(2, sizeof(char *));
|
|
||||||
return (flags);
|
|
||||||
}
|
|
||||||
new_str = ft_calloc(ft_strlen(cmd) - i + 1, 1);
|
|
||||||
if (new_str == NULL)
|
|
||||||
return (NULL);
|
|
||||||
y = 0;
|
|
||||||
while (cmd[i])
|
|
||||||
new_str[y++] = cmd[i++];
|
|
||||||
new_str[y] = '\0';
|
|
||||||
flags = ft_split(new_str, ' ');
|
|
||||||
i = 0;
|
|
||||||
free(new_str);
|
|
||||||
return (flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *get_command(char *cmd)
|
char *get_command(char *cmd)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -84,30 +58,10 @@ char *get_command(char *cmd)
|
||||||
while (cmd[++i] != ' ' && cmd[i])
|
while (cmd[++i] != ' ' && cmd[i])
|
||||||
new_str[i] = cmd[i];
|
new_str[i] = cmd[i];
|
||||||
new_str[i] = '\0';
|
new_str[i] = '\0';
|
||||||
|
if (ft_strlen(new_str) == 0)
|
||||||
|
{
|
||||||
|
free(new_str);
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
return (new_str);
|
return (new_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
char **add_cmd(char **flg, char *cmd)
|
|
||||||
{
|
|
||||||
char *tmp;
|
|
||||||
int i;
|
|
||||||
int check;
|
|
||||||
|
|
||||||
tmp = NULL;
|
|
||||||
i = 0;
|
|
||||||
check = 0;
|
|
||||||
while (check == 0)
|
|
||||||
{
|
|
||||||
if (flg[i] == NULL)
|
|
||||||
check = 1;
|
|
||||||
if (tmp != NULL)
|
|
||||||
flg[i] = tmp;
|
|
||||||
tmp = flg[i];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
flg[0] = ft_strdup(cmd);
|
|
||||||
if (flg[0] == NULL)
|
|
||||||
return (NULL);
|
|
||||||
flg[i] = NULL;
|
|
||||||
return (flg);
|
|
||||||
}
|
|
0
bonus/pipex_utils_bonus2.c
Normal file
0
bonus/pipex_utils_bonus2.c
Normal file
|
@ -6,7 +6,7 @@
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */
|
/* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/07 17:06:38 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/21 15:59:11 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
@ -20,16 +20,24 @@ int free_all(t_data *data)
|
||||||
close(data->fd1);
|
close(data->fd1);
|
||||||
if (data->fd2 > 0)
|
if (data->fd2 > 0)
|
||||||
close(data->fd2);
|
close(data->fd2);
|
||||||
i = 0;
|
if (data->flg1)
|
||||||
while (data->flg1[i])
|
{
|
||||||
free(data->flg1[i++]);
|
i = 0;
|
||||||
free(data->flg1);
|
while (data->flg1[i])
|
||||||
i = 0;
|
free(data->flg1[i++]);
|
||||||
while (data->flg2[i])
|
free(data->flg1);
|
||||||
free(data->flg2[i++]);
|
}
|
||||||
free(data->flg2);
|
if (data->flg2)
|
||||||
free(data->cmd1);
|
{
|
||||||
free(data->cmd2);
|
i = 0;
|
||||||
|
while (data->flg2[i])
|
||||||
|
free(data->flg2[i++]);
|
||||||
|
free(data->flg2);
|
||||||
|
}
|
||||||
|
if (data->cmd1)
|
||||||
|
free(data->cmd1);
|
||||||
|
if (data->cmd2)
|
||||||
|
free(data->cmd2);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,16 +110,9 @@ int main(int argc, char *argv[], char **env)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
if (parsing(argv, &data))
|
if (parsing(argv, &data))
|
||||||
return (2);
|
return (1);
|
||||||
data.cmd1 = find_command(env, data.cmd1);
|
if (finds_commands(argv, env, &data.cmd1, &data.cmd2))
|
||||||
if (data.cmd1 == NULL)
|
|
||||||
print_error(1, argv[2]);
|
|
||||||
data.cmd2 = find_command(env, data.cmd2);
|
|
||||||
if (data.cmd2 == NULL)
|
|
||||||
{
|
|
||||||
print_error(1, argv[3]);
|
|
||||||
return (free_all(&data));
|
return (free_all(&data));
|
||||||
}
|
|
||||||
data.env = env;
|
data.env = env;
|
||||||
if (pipex(data))
|
if (pipex(data))
|
||||||
return (free_all(&data));
|
return (free_all(&data));
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/01/11 15:33:34 by erey-bet #+# #+# */
|
/* Created: 2023/01/11 15:33:34 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/08 11:33:24 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/21 15:56:50 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
@ -22,25 +22,22 @@
|
||||||
|
|
||||||
typedef struct s_data
|
typedef struct s_data
|
||||||
{
|
{
|
||||||
char *fl1;
|
|
||||||
char *cmd1;
|
char *cmd1;
|
||||||
char **flg1;
|
char **flg1;
|
||||||
char *fl2;
|
int fd1;
|
||||||
char *cmd2;
|
char *cmd2;
|
||||||
char **flg2;
|
char **flg2;
|
||||||
int fd1;
|
|
||||||
int fd2;
|
int fd2;
|
||||||
char **env;
|
char **env;
|
||||||
} t_data;
|
} t_data;
|
||||||
|
|
||||||
int get_next(char *cmd, char c);
|
int get_next(char *cmd, char c);
|
||||||
int print_error(int type, char *error);
|
int print_error(int type, char *error);
|
||||||
char **get_flags(char *cmd);
|
|
||||||
char *get_command(char *cmd);
|
char *get_command(char *cmd);
|
||||||
char **add_cmd(char **flg, char *cmd);
|
|
||||||
int parsing(char *argv[], t_data *data);
|
int parsing(char *argv[], t_data *data);
|
||||||
char *test_acces(char **s, char **cmd, char **path, int *y);
|
char *test_acces(char **s, char **cmd, char **path, int *y);
|
||||||
char *cmd_exist(char **env, char **cmd, int y, char **s);
|
char *cmd_exist(char **env, char **cmd, int y, char **s);
|
||||||
char *find_command(char **env, char *cmd);
|
char *find_command(char **env, char *cmd);
|
||||||
|
int finds_commands(char *argv[], char **env, char **cmd1, char **cmd2);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/01/19 17:03:01 by erey-bet #+# #+# */
|
/* Created: 2023/01/19 17:03:01 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/08 11:29:33 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/23 17:04:19 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
@ -21,18 +21,21 @@ int parsing(char *argv[], t_data *data)
|
||||||
if (data->fd1 < 0)
|
if (data->fd1 < 0)
|
||||||
print_error(0, argv[1]);
|
print_error(0, argv[1]);
|
||||||
data->cmd1 = get_command(argv[2]);
|
data->cmd1 = get_command(argv[2]);
|
||||||
if (ft_strlen(data->cmd1) < 1)
|
if (!data->cmd1)
|
||||||
print_error(2, argv[2]);
|
print_error(2, argv[2]);
|
||||||
data->cmd2 = get_command(argv[3]);
|
data->cmd2 = get_command(argv[3]);
|
||||||
if (ft_strlen(data->cmd2) < 1)
|
if (!data->cmd2)
|
||||||
{
|
{
|
||||||
|
if (data->fd1 > 0)
|
||||||
|
close(data->fd1);
|
||||||
|
close(data->fd2);
|
||||||
|
if (data->cmd1)
|
||||||
|
free(data->cmd1);
|
||||||
print_error(2, argv[3]);
|
print_error(2, argv[3]);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
data->flg1 = ft_split(argv[2], ' ');
|
data->flg1 = ft_split(argv[2], ' ');
|
||||||
data->flg2 = ft_split(argv[3], ' ');
|
data->flg2 = ft_split(argv[3], ' ');
|
||||||
data->fl1 = argv[1];
|
|
||||||
data->fl2 = argv[4];
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,9 +62,11 @@ char *cmd_exist(char **env, char **cmd, int y, char **s)
|
||||||
{
|
{
|
||||||
char *path;
|
char *path;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
i = 4;
|
i = 4;
|
||||||
while (i < ft_strlen(*env))
|
len = ft_strlen(*env);
|
||||||
|
while (i < len)
|
||||||
{
|
{
|
||||||
test_acces(s, cmd, &path, &y);
|
test_acces(s, cmd, &path, &y);
|
||||||
if (path)
|
if (path)
|
||||||
|
@ -69,7 +74,7 @@ char *cmd_exist(char **env, char **cmd, int y, char **s)
|
||||||
*s = ft_calloc(ft_strlen(*env) + 1, 1);
|
*s = ft_calloc(ft_strlen(*env) + 1, 1);
|
||||||
if (*s == NULL)
|
if (*s == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
while ((*env)[++i] != ':')
|
while ((*env)[++i] != ':' && i < len)
|
||||||
(*s)[y++] = (*env)[i];
|
(*s)[y++] = (*env)[i];
|
||||||
}
|
}
|
||||||
free(*s);
|
free(*s);
|
||||||
|
@ -84,14 +89,32 @@ char *find_command(char **env, char *cmd)
|
||||||
|
|
||||||
while (*env != NULL)
|
while (*env != NULL)
|
||||||
{
|
{
|
||||||
if (ft_strnstr(*env, "PATH=/", ft_strlen(*env))
|
if (ft_strnstr(*env, "PATH=", 6))
|
||||||
&& ft_strchr(*env, ':') > 0)
|
|
||||||
break ;
|
break ;
|
||||||
env++;
|
env++;
|
||||||
}
|
}
|
||||||
|
if (ft_strlen(*env) == 0)
|
||||||
|
env--;
|
||||||
y = 0;
|
y = 0;
|
||||||
s = ft_calloc(ft_strlen(*env) + 1, 1);
|
s = ft_calloc(ft_strlen(*env) + 1, 1);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
return (cmd_exist(env, &cmd, y, &s));
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/01/19 17:02:51 by erey-bet #+# #+# */
|
/* Created: 2023/01/19 17:02:51 by erey-bet #+# #+# */
|
||||||
/* Updated: 2023/03/02 13:39:41 by erey-bet ### ########.fr */
|
/* Updated: 2023/03/21 15:43:42 by erey-bet ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
@ -42,32 +42,6 @@ int print_error(int type, char *error)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
char **get_flags(char *cmd)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int y;
|
|
||||||
char *new_str;
|
|
||||||
char **flags;
|
|
||||||
|
|
||||||
i = get_next(cmd, ' ') + 1;
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
flags = ft_calloc(2, sizeof(char *));
|
|
||||||
return (flags);
|
|
||||||
}
|
|
||||||
new_str = ft_calloc(ft_strlen(cmd) - i + 1, 1);
|
|
||||||
if (new_str == NULL)
|
|
||||||
return (NULL);
|
|
||||||
y = 0;
|
|
||||||
while (cmd[i])
|
|
||||||
new_str[y++] = cmd[i++];
|
|
||||||
new_str[y] = '\0';
|
|
||||||
flags = ft_split(new_str, ' ');
|
|
||||||
i = 0;
|
|
||||||
free(new_str);
|
|
||||||
return (flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *get_command(char *cmd)
|
char *get_command(char *cmd)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -84,30 +58,10 @@ char *get_command(char *cmd)
|
||||||
while (cmd[++i] != ' ' && cmd[i])
|
while (cmd[++i] != ' ' && cmd[i])
|
||||||
new_str[i] = cmd[i];
|
new_str[i] = cmd[i];
|
||||||
new_str[i] = '\0';
|
new_str[i] = '\0';
|
||||||
|
if (ft_strlen(new_str) == 0)
|
||||||
|
{
|
||||||
|
free(new_str);
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
return (new_str);
|
return (new_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
char **add_cmd(char **flg, char *cmd)
|
|
||||||
{
|
|
||||||
char *tmp;
|
|
||||||
int i;
|
|
||||||
int check;
|
|
||||||
|
|
||||||
tmp = NULL;
|
|
||||||
i = 0;
|
|
||||||
check = 0;
|
|
||||||
while (check == 0)
|
|
||||||
{
|
|
||||||
if (flg[i] == NULL)
|
|
||||||
check = 1;
|
|
||||||
if (tmp != NULL)
|
|
||||||
flg[i] = tmp;
|
|
||||||
tmp = flg[i];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
flg[0] = ft_strdup(cmd);
|
|
||||||
if (flg[0] == NULL)
|
|
||||||
return (NULL);
|
|
||||||
flg[i] = NULL;
|
|
||||||
return (flg);
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue