Initial commit
This commit is contained in:
36
Makefile
Normal file
36
Makefile
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# **************************************************************************** #
|
||||||
|
# #
|
||||||
|
# ::: :::::::: #
|
||||||
|
# Makefile :+: :+: :+: #
|
||||||
|
# +:+ +:+ +:+ #
|
||||||
|
# By: lejulien <marvin@42.fr> +#+ +:+ +#+ #
|
||||||
|
# +#+#+#+#+#+ +#+ #
|
||||||
|
# Created: 2020/07/05 18:43:38 by lejulien #+# #+# #
|
||||||
|
# Updated: 2021/07/26 05:54:14 by lejulien ### ########.fr #
|
||||||
|
# #
|
||||||
|
# **************************************************************************** #
|
||||||
|
|
||||||
|
SRCS = ./main.c
|
||||||
|
|
||||||
|
SRCS_OBJS = ${SRCS:.c=.o}
|
||||||
|
|
||||||
|
FLAGS = -Wall -Wextra -Werror -lpthread
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
gcc -c $< -o $(<:.c=.o)
|
||||||
|
|
||||||
|
NAME = macroshell
|
||||||
|
|
||||||
|
$(NAME): $(SRCS_OBJS)
|
||||||
|
gcc -o $(NAME) $(SRCS_OBJS) $(FLAGS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(SRCS_OBJS)
|
||||||
|
|
||||||
|
fclean: clean
|
||||||
|
rm -f $(NAME)
|
||||||
|
|
||||||
|
re: fclean $(NAME)
|
||||||
|
|
||||||
|
.PHONY: clean fclean re
|
||||||
|
|
||||||
146
main.c
Normal file
146
main.c
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
//
|
||||||
|
// Made by lejulien
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
ft_strlen(char *str)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while (str[i])
|
||||||
|
i++;
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ft_put_error(char *str)
|
||||||
|
{
|
||||||
|
write(2, str, ft_strlen(str));
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
*get_next_sep(char **av)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while (av[i] && strcmp(av[i], "|") != 0 && strcmp(av[i], ";") != 0)
|
||||||
|
i++;
|
||||||
|
return (av[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
get_next_sep_pos(char **av)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while (av[i] && strcmp(av[i], "|") != 0 && strcmp(av[i], ";") != 0)
|
||||||
|
i++;
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
get_next_cmd(char **av)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while (av[i] && strcmp(av[i], "|") != 0 && strcmp(av[i], ";") != 0)
|
||||||
|
i++;
|
||||||
|
while (av[i] && (strcmp(av[i], "|") == 0 || strcmp(av[i], ";") == 0))
|
||||||
|
i++;
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
do_cd(char **av)
|
||||||
|
{
|
||||||
|
if (av[1] && strcmp(av[1], "|") != 0 && strcmp(av[1], ";") != 0)
|
||||||
|
{
|
||||||
|
if (av[2] == NULL || (av[2] && strcmp(av[2], ";") == 0))
|
||||||
|
{
|
||||||
|
if (chdir(av[1]) < 0)
|
||||||
|
{
|
||||||
|
ft_put_error("error: cd: canot chang directory to ");
|
||||||
|
ft_put_error(av[1]);
|
||||||
|
ft_put_error("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ft_put_error("error: cd: bad arguments");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ft_put_error("error: cd: bad arguments");
|
||||||
|
}
|
||||||
|
|
||||||
|
int pip[2];
|
||||||
|
int prev_pip[2];
|
||||||
|
void
|
||||||
|
exec(char **av, char **envp)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
int status;
|
||||||
|
int is_pipe = 0;
|
||||||
|
int ret;
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
|
if (get_next_sep(av) != NULL && strcmp(get_next_sep(av), "|") == 0)
|
||||||
|
{
|
||||||
|
if (pipe(pip))
|
||||||
|
exit(ft_put_error("error: fatal\n"));
|
||||||
|
is_pipe = 1;
|
||||||
|
}
|
||||||
|
if ((pid = fork()) < 0)
|
||||||
|
exit(ft_put_error("error: fatal\n"));
|
||||||
|
if (pid == 0)
|
||||||
|
{
|
||||||
|
if (is_pipe)
|
||||||
|
{
|
||||||
|
if (dup2(pip[1], 1) < 0)
|
||||||
|
exit(ft_put_error("error: fatali\n"));
|
||||||
|
}
|
||||||
|
if (strcmp(av[-1], "|") == 0)
|
||||||
|
{
|
||||||
|
if (dup2(prev_pip[0], 0) < 0)
|
||||||
|
exit(ft_put_error("error: fatal\n"));
|
||||||
|
}
|
||||||
|
tmp = get_next_sep(av);
|
||||||
|
av[get_next_sep_pos(av)] = NULL;
|
||||||
|
if ((ret = execve(*av, av, envp)) == -1)
|
||||||
|
{
|
||||||
|
ft_put_error("error: cannot execute ");
|
||||||
|
ft_put_error(*av);
|
||||||
|
exit(ft_put_error("\n"));
|
||||||
|
}
|
||||||
|
av[get_next_sep_pos(av)] = tmp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (is_pipe)
|
||||||
|
close(pip[1]);
|
||||||
|
if (strcmp(av[-1], "|") == 0)
|
||||||
|
close(prev_pip[0]);
|
||||||
|
waitpid(pid, &status, 0);
|
||||||
|
}
|
||||||
|
prev_pip[0] = pip[0];
|
||||||
|
prev_pip[1] = pip[1];
|
||||||
|
is_pipe = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int ac, char **av, char **envp)
|
||||||
|
{
|
||||||
|
av = &av[1];
|
||||||
|
|
||||||
|
while (*av)
|
||||||
|
{
|
||||||
|
if (strcmp(*av, "cd") == 0)
|
||||||
|
do_cd(av);
|
||||||
|
else
|
||||||
|
exec(av, envp);
|
||||||
|
av = &av[get_next_cmd(av)];
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Made by lejulien@42
|
||||||
Reference in New Issue
Block a user