first commit
This commit is contained in:
parent
8fea9b6b57
commit
cc3f6e37d3
12 changed files with 292 additions and 1 deletions
13
42sh/.tags
Normal file
13
42sh/.tags
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
Mmain src/main.c /^int main(void)$/
|
||||||
|
builtin_cd src/builtin.c /^int builtin_cd(char **av, char **env)$/
|
||||||
|
builtin_echo src/builtin.c /^int builtin_echo(char **av, char **env)$/
|
||||||
|
builtin_env src/lib_builtin_env.c /^int builtin_env(char **av, char **env)$/
|
||||||
|
builtin_exit src/builtin.c /^int builtin_exit(char **av, char **env)$/
|
||||||
|
builtin_setenv src/lib_builtin_env.c /^int builtin_setenv(char **av, char **env)$/
|
||||||
|
builtin_unsetenv src/lib_builtin_env.c /^int builtin_unsetenv(char **av, char **env)$/
|
||||||
|
ft_builtin_exec src/builtin.c /^int ft_builtin_exec(char **av, char **env)$/
|
||||||
|
ft_cmd_exec src/ft_cmd.c /^int ft_cmd_exec(char *cmd)$/
|
||||||
|
ft_cmd_getav src/ft_cmd.c /^char **ft_cmd_getav(char *cmd)$/
|
||||||
|
ft_env_getval src/lib_env.c /^char *ft_env_getval(char **env, char *key)$/
|
||||||
|
ft_format_vars src/lib_format.c /^void ft_format_vars(char **av, char **env)$/
|
||||||
|
ft_path_findexec src/lib_path.c /^char *ft_path_findexec(char **path, char *execname/
|
||||||
47
42sh/Makefile
Normal file
47
42sh/Makefile
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
NAME = minishell
|
||||||
|
CC = gcc
|
||||||
|
TAGFILE = .tags
|
||||||
|
|
||||||
|
D_SRC = src
|
||||||
|
F_SRC := $(shell ls -1 $(D_SRC) | grep "\.c$$")
|
||||||
|
DF_SRC := $(addprefix $(D_SRC)/, $(F_SRC))
|
||||||
|
|
||||||
|
D_OBJ = obj
|
||||||
|
F_OBJ = $(F_SRC:.c=.o)
|
||||||
|
DF_OBJ := $(addprefix $(D_OBJ)/, $(F_OBJ))
|
||||||
|
|
||||||
|
D_INC = includes libft/includes
|
||||||
|
O_INC = $(addprefix -I, $(D_INC))
|
||||||
|
|
||||||
|
W_FLAGS = -Wall -Wextra -Werror
|
||||||
|
D_FLAGS =
|
||||||
|
|
||||||
|
MKDIR = mkdir -p
|
||||||
|
RM = /bin/rm -rf
|
||||||
|
|
||||||
|
.PHONY: all clean fclean re tags test libft
|
||||||
|
|
||||||
|
all: libft $(NAME) $(TAGFILE)
|
||||||
|
|
||||||
|
$(TAGFILE): $(D_SRC)/*.c
|
||||||
|
@ctags -f $(TAGFILE) $(addprefix $(D_SRC)/, $(F_SRC))
|
||||||
|
@echo "Making tags..."
|
||||||
|
|
||||||
|
$(D_OBJ)/%.o: $(D_SRC)/%.c $(D_INC)
|
||||||
|
@$(MKDIR) $(D_OBJ)
|
||||||
|
@$(CC) $(O_INC) $(W_FLAGS) -c $< -o $@ $(D_FLAGS)
|
||||||
|
@echo "Compiling "$<"..."
|
||||||
|
|
||||||
|
libft:
|
||||||
|
@$(MAKE) -C libft/ 2>/dev/null
|
||||||
|
|
||||||
|
$(NAME): $(DF_OBJ) libft/libft.a
|
||||||
|
$(CC) $(O_INC) -Llibft -lft $(W_FLAGS) $(DF_OBJ) -o $@ $(D_FLAGS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(D_OBJ)
|
||||||
|
|
||||||
|
fclean: clean
|
||||||
|
$(RM) $(NAME)
|
||||||
|
|
||||||
|
re: fclean all
|
||||||
33
42sh/includes/minishell.h
Normal file
33
42sh/includes/minishell.h
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
#ifndef MINISHELL_H
|
||||||
|
# define MINISHELL_H
|
||||||
|
|
||||||
|
# include "libft.h"
|
||||||
|
# include <dirent.h>
|
||||||
|
# include <sys/stat.h>
|
||||||
|
# include <sys/types.h>
|
||||||
|
# define SHELL_PROMPT "$> "
|
||||||
|
|
||||||
|
typedef struct s_builtin
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
int (*f)();
|
||||||
|
} t_builtin;
|
||||||
|
|
||||||
|
extern t_builtin g_builtin[];
|
||||||
|
|
||||||
|
int ft_cmd_exec(char *cmd);
|
||||||
|
char **ft_cmd_getav(char *cmd);
|
||||||
|
|
||||||
|
int ft_builtin_exec(char **av, char **env);
|
||||||
|
int builtin_echo(char **av, char **env);
|
||||||
|
int builtin_cd(char **av, char **env);
|
||||||
|
int builtin_exit(char **av, char **env);
|
||||||
|
int builtin_setenv(char **av, char **env);
|
||||||
|
int builtin_unsetenv(char **av, char **env);
|
||||||
|
int builtin_env(char **av, char **env);
|
||||||
|
|
||||||
|
void ft_format_vars(char **av, char **env);
|
||||||
|
char *ft_env_getval(char **env, char *key);
|
||||||
|
char *ft_path_findexec(char **path, char *execname);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit aef08a51be352de39c7698d6a40f4512c9d11769
|
Subproject commit cac01336ab4f970ee4da9beb033fd2063dfc9367
|
||||||
BIN
42sh/minishell.fr.pdf
Normal file
BIN
42sh/minishell.fr.pdf
Normal file
Binary file not shown.
57
42sh/src/builtin.c
Normal file
57
42sh/src/builtin.c
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
t_builtin g_builtin[] = {
|
||||||
|
{"echo", &builtin_echo},
|
||||||
|
{"cd", &builtin_cd},
|
||||||
|
{"setenv", &builtin_setenv},
|
||||||
|
{"unsetenv", &builtin_unsetenv},
|
||||||
|
{"env", &builtin_env},
|
||||||
|
{"exit", &builtin_exit},
|
||||||
|
{NULL, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
|
int ft_builtin_exec(char **av, char **env)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (g_builtin[i].name)
|
||||||
|
{
|
||||||
|
if (ft_strcmp(g_builtin[i].name, *av) == 0)
|
||||||
|
{
|
||||||
|
(g_builtin[i].f)(av, env);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int builtin_echo(char **av, char **env)
|
||||||
|
{
|
||||||
|
(void)env;
|
||||||
|
av++;
|
||||||
|
while (*av)
|
||||||
|
{
|
||||||
|
ft_printf("%s", *av);
|
||||||
|
av++;
|
||||||
|
if (*av)
|
||||||
|
ft_putstr(" ");
|
||||||
|
}
|
||||||
|
ft_putendl("");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int builtin_cd(char **av, char **env)
|
||||||
|
{
|
||||||
|
(void)env;
|
||||||
|
ft_printf("builtin: %s\n", av[0]);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int builtin_exit(char **av, char **env)
|
||||||
|
{
|
||||||
|
(void)env;
|
||||||
|
ft_printf("builtin: %s\n", av[0]);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
37
42sh/src/ft_cmd.c
Normal file
37
42sh/src/ft_cmd.c
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
#include "minishell.h"
|
||||||
|
extern char **environ;
|
||||||
|
|
||||||
|
int ft_cmd_exec(char *cmd)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
int status;
|
||||||
|
char **path;
|
||||||
|
char *execpath;
|
||||||
|
char **argv;
|
||||||
|
|
||||||
|
path = ft_strsplit(ft_env_getval(environ, "PATH"), ':');
|
||||||
|
argv = ft_cmd_getav(cmd);
|
||||||
|
ft_format_vars(argv, environ);
|
||||||
|
if (ft_builtin_exec(argv, environ) == 0)
|
||||||
|
return (0);
|
||||||
|
else if (ft_strchr(argv[0], '/'))
|
||||||
|
execpath = cmd;
|
||||||
|
else if (!(execpath = ft_path_findexec(path, argv[0])))
|
||||||
|
return (-1);
|
||||||
|
/* ft_printf("%s @ %s\n", argv[0], execpath); */
|
||||||
|
if ((pid = fork()) == -1)
|
||||||
|
return (-1);
|
||||||
|
if (pid == 0)
|
||||||
|
execve(execpath, argv, environ);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wait(&status);
|
||||||
|
ft_printf("child process exited with %i\n", status);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char **ft_cmd_getav(char *cmd)
|
||||||
|
{
|
||||||
|
return (ft_split_whitespaces(cmd));
|
||||||
|
}
|
||||||
22
42sh/src/lib_builtin_env.c
Normal file
22
42sh/src/lib_builtin_env.c
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
int builtin_setenv(char **av, char **env)
|
||||||
|
{
|
||||||
|
(void)env;
|
||||||
|
ft_printf("builtin: %s\n", av[0]);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int builtin_unsetenv(char **av, char **env)
|
||||||
|
{
|
||||||
|
(void)env;
|
||||||
|
ft_printf("builtin: %s\n", av[0]);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int builtin_env(char **av, char **env)
|
||||||
|
{
|
||||||
|
(void)env;
|
||||||
|
ft_printf("builtin: %s\n", av[0]);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
13
42sh/src/lib_env.c
Normal file
13
42sh/src/lib_env.c
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
char *ft_env_getval(char **env, char *key)
|
||||||
|
{
|
||||||
|
while (*env)
|
||||||
|
{
|
||||||
|
/* ft_printf("%s\n", env[i]); */
|
||||||
|
if (ft_strcmp(*env, key) == '=')
|
||||||
|
return (*env + ft_strlen(key) + 1);
|
||||||
|
env++;
|
||||||
|
}
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
11
42sh/src/lib_format.c
Normal file
11
42sh/src/lib_format.c
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
void ft_format_vars(char **av, char **env)
|
||||||
|
{
|
||||||
|
while (*av)
|
||||||
|
{
|
||||||
|
if (**av == '$')
|
||||||
|
*av = ft_env_getval(env, *av + 1);
|
||||||
|
av++;
|
||||||
|
}
|
||||||
|
}
|
||||||
38
42sh/src/lib_path.c
Normal file
38
42sh/src/lib_path.c
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
char *ft_path_findexec(char **path, char *execname)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
DIR *dir;
|
||||||
|
char *execpath;
|
||||||
|
struct dirent *dirent;
|
||||||
|
struct stat statbuf;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (path[i])
|
||||||
|
{
|
||||||
|
if ((dir = opendir(path[i])))
|
||||||
|
{
|
||||||
|
while ((dirent = readdir(dir)))
|
||||||
|
{
|
||||||
|
if (ft_strcmp(dirent->d_name, execname) == 0)
|
||||||
|
{
|
||||||
|
if (path[i][ft_strlen(path[i])] != '/')
|
||||||
|
ft_strcat(path[i], "/");
|
||||||
|
execpath = ft_strjoin(path[i], dirent->d_name);
|
||||||
|
if (stat(execpath, &statbuf) == -1)
|
||||||
|
return (NULL);
|
||||||
|
if (access(execpath, statbuf.st_mode) == -1)
|
||||||
|
{
|
||||||
|
ft_printf("minishell: permission denied: %s\n", execname);
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
return (execpath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
ft_printf("minishell: command not found: %s\n", execname);
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
20
42sh/src/main.c
Normal file
20
42sh/src/main.c
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
char *line;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
ft_printf(SHELL_PROMPT);
|
||||||
|
/* if (get_next_line(0, &line) == 1) */
|
||||||
|
/* continue ; */
|
||||||
|
/* if (get_next_line(0, &line) == 0) */
|
||||||
|
/* ft_cmd_exec(line); */
|
||||||
|
if (get_next_line(0, &line) == -1)
|
||||||
|
return (1);
|
||||||
|
ft_cmd_exec(line);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in a new issue