Compare commits
70 Commits
Author | SHA1 | Date | |
---|---|---|---|
12dc548a4e | |||
bd18752fdc | |||
ded1b802b2 | |||
1731f820ee | |||
b8fade86a0 | |||
6d40826c51 | |||
f5532679bc | |||
2c8feb6c18 | |||
956aa0e1e7 | |||
d1681dafe3 | |||
e986d8692b | |||
01496f0587 | |||
e1831b18fa | |||
0af303d895 | |||
3d2adaf520 | |||
923da71a49 | |||
444b84c541 | |||
855ba3f6f2 | |||
60d6e50ab9 | |||
231f1a8002 | |||
398e4b5928 | |||
b65c07d430 | |||
ab5ef04911 | |||
6cfc2beff4 | |||
57ad83c2aa | |||
8513bd3bdd | |||
d3e5d459cb | |||
28efa75b39 | |||
43e4d054b5 | |||
b45a04e622 | |||
257e4829ba | |||
ef3915c640 | |||
fb0ebc2398 | |||
b7658d02ec | |||
bdfff1360a | |||
032bfb976e | |||
2d5449ed3d | |||
6e93081fcb | |||
2d11d1493a | |||
b1c3e53509 | |||
9e2f926ca8 | |||
e75099562e | |||
f661232c77 | |||
f67d334503 | |||
df6bef58dc | |||
992f02cded | |||
0bad8c3cdb | |||
245b7b2526 | |||
efd8838ee0 | |||
03e108b625 | |||
d05e304475 | |||
e9f9ede1f1 | |||
bb0a62342e | |||
97d5c24662 | |||
56ff115753 | |||
a7f8b264b7 | |||
6c58f1d26c | |||
ee49511eaf | |||
344c40df46 | |||
2290d638b6 | |||
6012037886 | |||
5eff48d14b | |||
8a6378aa9c | |||
1c8694e688 | |||
69467e0446 | |||
e7ab260a3b | |||
744ab7728d | |||
f3d01b28f0 | |||
517f94fe48 | |||
7b5df4fa3a |
62
.gitignore
vendored
62
.gitignore
vendored
@ -1,62 +0,0 @@
|
|||||||
# Prerequisites
|
|
||||||
*.d
|
|
||||||
.tonotdo
|
|
||||||
|
|
||||||
|
|
||||||
minishell
|
|
||||||
minishell_bonus
|
|
||||||
.minishellrc
|
|
||||||
objs/
|
|
||||||
.tmp*
|
|
||||||
out
|
|
||||||
minishell_tester/
|
|
||||||
|
|
||||||
# Object files
|
|
||||||
*.o
|
|
||||||
*.ko
|
|
||||||
*.obj
|
|
||||||
*.elf
|
|
||||||
|
|
||||||
# Linker output
|
|
||||||
*.ilk
|
|
||||||
*.map
|
|
||||||
*.exp
|
|
||||||
|
|
||||||
# Precompiled Headers
|
|
||||||
*.gch
|
|
||||||
*.pch
|
|
||||||
|
|
||||||
# Libraries
|
|
||||||
*.lib
|
|
||||||
*.a
|
|
||||||
*.la
|
|
||||||
*.lo
|
|
||||||
|
|
||||||
# Shared objects (inc. Windows DLLs)
|
|
||||||
*.dll
|
|
||||||
*.so
|
|
||||||
*.so.*
|
|
||||||
*.dylib
|
|
||||||
|
|
||||||
# Executables
|
|
||||||
*.exe
|
|
||||||
*.out
|
|
||||||
*.app
|
|
||||||
*.i*86
|
|
||||||
*.x86_64
|
|
||||||
*.hex
|
|
||||||
|
|
||||||
# Debug files
|
|
||||||
*.dSYM/
|
|
||||||
*.su
|
|
||||||
*.idb
|
|
||||||
*.pdb
|
|
||||||
|
|
||||||
# Kernel Module Compile Results
|
|
||||||
*.mod*
|
|
||||||
*.cmd
|
|
||||||
.tmp_versions/
|
|
||||||
modules.order
|
|
||||||
Module.symvers
|
|
||||||
Mkfile.old
|
|
||||||
dkms.conf
|
|
9
Makefile
9
Makefile
@ -6,7 +6,7 @@
|
|||||||
# By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ #
|
# By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ #
|
||||||
# +#+#+#+#+#+ +#+ #
|
# +#+#+#+#+#+ +#+ #
|
||||||
# Created: 2023/07/28 00:35:01 by tomoron #+# #+# #
|
# Created: 2023/07/28 00:35:01 by tomoron #+# #+# #
|
||||||
# Updated: 2024/04/26 10:52:53 by marde-vr ### ########.fr #
|
# Updated: 2024/05/22 13:50:22 by tomoron ### ########.fr #
|
||||||
# #
|
# #
|
||||||
# **************************************************************************** #
|
# **************************************************************************** #
|
||||||
|
|
||||||
@ -22,7 +22,6 @@ SRCS_RAW = main.c\
|
|||||||
pwd.c\
|
pwd.c\
|
||||||
env.c\
|
env.c\
|
||||||
parsing.c\
|
parsing.c\
|
||||||
debug.c\
|
|
||||||
env_utils.c\
|
env_utils.c\
|
||||||
parsing_var.c\
|
parsing_var.c\
|
||||||
path.c\
|
path.c\
|
||||||
@ -30,9 +29,11 @@ SRCS_RAW = main.c\
|
|||||||
here_doc_utils.c\
|
here_doc_utils.c\
|
||||||
export.c\
|
export.c\
|
||||||
input_redirections.c\
|
input_redirections.c\
|
||||||
|
redirection_utils.c\
|
||||||
sort_wildcard_list.c\
|
sort_wildcard_list.c\
|
||||||
output_redirections.c\
|
output_redirections.c\
|
||||||
builtins.c\
|
builtins.c\
|
||||||
|
variable_expantion.c\
|
||||||
wildcards.c\
|
wildcards.c\
|
||||||
commands.c\
|
commands.c\
|
||||||
pipe.c\
|
pipe.c\
|
||||||
@ -45,6 +46,7 @@ SRCS_RAW = main.c\
|
|||||||
get_len_bonus.c\
|
get_len_bonus.c\
|
||||||
check_syntax.c\
|
check_syntax.c\
|
||||||
check_syntax_utils.c\
|
check_syntax_utils.c\
|
||||||
|
parsing_utils.c\
|
||||||
unset.c\
|
unset.c\
|
||||||
free.c
|
free.c
|
||||||
|
|
||||||
@ -89,13 +91,14 @@ clean:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
bonus: all
|
bonus: all
|
||||||
|
@$(CC) $(FLAGS) $(OBJS) $(LIBFT) -lreadline -o $(NAME)_bonus
|
||||||
|
|
||||||
install: $(NAME)
|
install: $(NAME)
|
||||||
cp $(NAME) ~/.local/bin/msh
|
cp $(NAME) ~/.local/bin/msh
|
||||||
cp $(NAME) ~/.local/bin/minishell
|
cp $(NAME) ~/.local/bin/minishell
|
||||||
|
|
||||||
fclean: clean
|
fclean: clean
|
||||||
rm -f $(NAME)
|
rm -f $(NAME) $(NAME)_bonus
|
||||||
|
|
||||||
re: fclean all
|
re: fclean all
|
||||||
|
|
||||||
|
44
README.md
Normal file
44
README.md
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# 🐚 minishell – Custom UNIX Shell 💻
|
||||||
|
|
||||||
|
Welcome to **minishell**, a project that implements a **custom UNIX shell** from the ground up! 🌟 This shell allows for command execution, pipe management, and process handling. 🌐
|
||||||
|
|
||||||
|
## 📝 Project Overview
|
||||||
|
|
||||||
|
In this project, we create a fully functional **UNIX shell** that supports various commands, piping between processes, and robust error handling. The shell is designed to handle signals 📡 and fork processes efficiently 🍴, simulating the behavior of bash and other traditional UNIX shells. 🚀
|
||||||
|
|
||||||
|
### Features:
|
||||||
|
- 🔹 **Command execution**: Run shell commands with ease.
|
||||||
|
- 🔹 **Pipe management**: Link commands together for streamlined output processing.
|
||||||
|
- 🔹 **Signal handling**: Manage signals effectively within the shell environment.
|
||||||
|
- 🔹 **Process forking**: Create child processes to execute commands.
|
||||||
|
- 🔹 **Error handling**: Robust mechanisms to handle errors gracefully.
|
||||||
|
|
||||||
|
## 🛠️ Installation & Setup
|
||||||
|
|
||||||
|
To get started, follow these steps to set up and run the project:
|
||||||
|
|
||||||
|
1. **Clone the repository**:
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/mdev9/minishell.git
|
||||||
|
cd minishell
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Run the shell**:
|
||||||
|
```bash
|
||||||
|
./minishell
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 Technologies Used
|
||||||
|
|
||||||
|
- C 💻: Primary language used to implement the shell.
|
||||||
|
- System Calls 📞: Leveraging UNIX system calls for process management and execution.
|
||||||
|
- Pipes 🚰: Implementing inter-process communication through pipes.
|
||||||
|
- Signals ⚡: Handling OS signals for effective process management.
|
||||||
|
|
||||||
|
## 🎯 Goals of the Project
|
||||||
|
- Create a functional UNIX shell that mimics common shell behaviors.
|
||||||
|
- Understand key operating system concepts such as process management and system calls.
|
||||||
|
- Enhance programming skills in C through practical application.
|
||||||
|
|
||||||
|
Thank you for checking out minishell! 🌟 Happy coding! 💻
|
@ -6,7 +6,7 @@
|
|||||||
# By: tomoron <marvin@42.fr> +#+ +:+ +#+ #
|
# By: tomoron <marvin@42.fr> +#+ +:+ +#+ #
|
||||||
# +#+#+#+#+#+ +#+ #
|
# +#+#+#+#+#+ +#+ #
|
||||||
# Created: 2023/07/28 00:35:01 by tomoron #+# #+# #
|
# Created: 2023/07/28 00:35:01 by tomoron #+# #+# #
|
||||||
# Updated: 2024/04/02 16:02:33 by tomoron ### ########.fr #
|
# Updated: 2024/04/29 11:13:55 by marde-vr ### ########.fr #
|
||||||
# #
|
# #
|
||||||
# **************************************************************************** #
|
# **************************************************************************** #
|
||||||
|
|
||||||
@ -52,7 +52,8 @@ SRCS = ft_atoi.c\
|
|||||||
ft_split_set.c\
|
ft_split_set.c\
|
||||||
ft_free_str_arr.c\
|
ft_free_str_arr.c\
|
||||||
ft_set_color.c\
|
ft_set_color.c\
|
||||||
ft_isspace.c
|
ft_isspace.c\
|
||||||
|
ft_str_is_only_char.c\
|
||||||
|
|
||||||
SRCS_BONUS = ft_lstnew.c\
|
SRCS_BONUS = ft_lstnew.c\
|
||||||
ft_lstadd_front.c\
|
ft_lstadd_front.c\
|
||||||
|
20
libft/ft_str_is_only_char.c
Normal file
20
libft/ft_str_is_only_char.c
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* ft_str_is_only_char.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2024/04/29 11:11:31 by marde-vr #+# #+# */
|
||||||
|
/* Updated: 2024/04/29 11:11:57 by marde-vr ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
int ft_str_is_only_char(char *str, char c)
|
||||||
|
{
|
||||||
|
while (c && *str == c)
|
||||||
|
str++;
|
||||||
|
if (!*str && c)
|
||||||
|
return (1);
|
||||||
|
return (0);
|
||||||
|
}
|
@ -6,7 +6,7 @@
|
|||||||
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/10/30 16:55:48 by tomoron #+# #+# */
|
/* Created: 2023/10/30 16:55:48 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/02/11 17:41:32 by tomoron ### ########.fr */
|
/* Updated: 2024/04/29 11:12:16 by marde-vr ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -46,6 +46,7 @@ void ft_lstadd_front(t_list **lst, t_list *new);
|
|||||||
char **ft_split(char const *str, char charset);
|
char **ft_split(char const *str, char charset);
|
||||||
void ft_lstadd_back(t_list **lst, t_list *new);
|
void ft_lstadd_back(t_list **lst, t_list *new);
|
||||||
char **ft_split_set(char *str, char *charset);
|
char **ft_split_set(char *str, char *charset);
|
||||||
|
int ft_str_is_only_char(char *str, char c);
|
||||||
void *ft_memset(void *s, int c, size_t n);
|
void *ft_memset(void *s, int c, size_t n);
|
||||||
char *ft_get_color(int r, int g, int b);
|
char *ft_get_color(int r, int g, int b);
|
||||||
void *ft_calloc(size_t nb, size_t size);
|
void *ft_calloc(size_t nb, size_t size);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/03/05 18:20:21 by marde-vr #+# #+# */
|
/* Created: 2024/03/05 18:20:21 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/23 19:56:00 by tomoron ### ########.fr */
|
/* Updated: 2024/04/29 21:47:25 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -14,10 +14,10 @@
|
|||||||
|
|
||||||
int cmd_is_forkable_builtin(char *cmd_token)
|
int cmd_is_forkable_builtin(char *cmd_token)
|
||||||
{
|
{
|
||||||
if (!ft_strcmp(cmd_token, "echo") || !ft_strcmp(cmd_token, "ret")
|
if (!ft_strcmp(cmd_token, "echo") || !ft_strcmp(cmd_token, "env")
|
||||||
|| !ft_strcmp(cmd_token, "env") || !ft_strcmp(cmd_token, "exit")
|
|| !ft_strcmp(cmd_token, "exit") || !ft_strcmp(cmd_token, "pwd")
|
||||||
|| !ft_strcmp(cmd_token, "pwd") || !ft_strcmp(cmd_token, "cd")
|
|| !ft_strcmp(cmd_token, "cd") || !ft_strcmp(cmd_token, "export")
|
||||||
|| !ft_strcmp(cmd_token, "export") || !ft_strcmp(cmd_token, "unset"))
|
|| !ft_strcmp(cmd_token, "unset"))
|
||||||
return (1);
|
return (1);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -48,8 +48,6 @@ int exec_builtin(t_msh *msh)
|
|||||||
return (0);
|
return (0);
|
||||||
if (!ft_strcmp(msh->tokens->value, "echo"))
|
if (!ft_strcmp(msh->tokens->value, "echo"))
|
||||||
g_return_code = echo(msh->tokens->next);
|
g_return_code = echo(msh->tokens->next);
|
||||||
else if (!ft_strcmp(msh->tokens->value, "ret"))
|
|
||||||
g_return_code = ft_atoi(msh->tokens->next->value);
|
|
||||||
else if (!ft_strcmp(msh->tokens->value, "env"))
|
else if (!ft_strcmp(msh->tokens->value, "env"))
|
||||||
g_return_code = print_env(msh->env);
|
g_return_code = print_env(msh->env);
|
||||||
else if (!ft_strcmp(msh->tokens->value, "exit"))
|
else if (!ft_strcmp(msh->tokens->value, "exit"))
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/16 21:02:54 by marde-vr #+# #+# */
|
/* Created: 2024/02/16 21:02:54 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/24 10:43:52 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/03 08:39:33 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -23,13 +23,12 @@ void cd_update_pwd(t_msh *msh)
|
|||||||
pwd = ft_get_env(msh->env, "PWD");
|
pwd = ft_get_env(msh->env, "PWD");
|
||||||
pwd = ft_strdup(pwd);
|
pwd = ft_strdup(pwd);
|
||||||
if (!pwd)
|
if (!pwd)
|
||||||
ft_strdup("");
|
pwd = ft_strdup("");
|
||||||
if (!pwd)
|
if (!pwd)
|
||||||
free(new);
|
free(new);
|
||||||
if (!pwd)
|
if (!pwd)
|
||||||
return ;
|
return ;
|
||||||
msh->env = export_set_env(msh->env, ft_strdup("OLDPWD"), pwd, 0);
|
msh->env = export_set_env(msh->env, ft_strdup("OLDPWD"), pwd, 0);
|
||||||
if (ft_get_env(msh->env, "PWD"))
|
|
||||||
msh->env = export_set_env(msh->env, ft_strdup("PWD"), new, 0);
|
msh->env = export_set_env(msh->env, ft_strdup("PWD"), new, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/04/24 14:50:15 by tomoron #+# #+# */
|
/* Created: 2024/04/24 14:50:15 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/25 13:50:46 by tomoron ### ########.fr */
|
/* Updated: 2024/04/26 14:39:48 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ int check_parens_syntax(t_cmd *cmd, t_cmd *last, t_env *env)
|
|||||||
}
|
}
|
||||||
tmp = check_cmds_syntax(parsed_cmd, env);
|
tmp = check_cmds_syntax(parsed_cmd, env);
|
||||||
if (tmp)
|
if (tmp)
|
||||||
print_syntax_error_bonus(tmp);
|
print_syntax_error_bonus(tmp, 0);
|
||||||
free_cmd(parsed_cmd);
|
free_cmd(parsed_cmd);
|
||||||
return (tmp == 0);
|
return (tmp == 0);
|
||||||
}
|
}
|
||||||
|
@ -6,16 +6,19 @@
|
|||||||
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/04/24 14:54:53 by tomoron #+# #+# */
|
/* Created: 2024/04/24 14:54:53 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/25 13:51:03 by tomoron ### ########.fr */
|
/* Updated: 2024/05/03 08:13:45 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
|
|
||||||
void print_syntax_error_bonus(t_cmd *cmd)
|
void print_syntax_error_bonus(t_cmd *cmd, t_cmd *cmds)
|
||||||
{
|
{
|
||||||
if (cmd->cmd_type == CMD || cmd->cmd_type == PAREN)
|
if (cmd->cmd_type == CMD || cmd->cmd_type == PAREN)
|
||||||
|
{
|
||||||
|
free_cmd(cmds);
|
||||||
return ;
|
return ;
|
||||||
|
}
|
||||||
ft_printf_fd(2, "minishell : syntax error near unexpected token `");
|
ft_printf_fd(2, "minishell : syntax error near unexpected token `");
|
||||||
g_return_code = 2;
|
g_return_code = 2;
|
||||||
if (cmd->cmd_type == AND)
|
if (cmd->cmd_type == AND)
|
||||||
@ -27,6 +30,7 @@ void print_syntax_error_bonus(t_cmd *cmd)
|
|||||||
if (cmd->cmd_type == ERR)
|
if (cmd->cmd_type == ERR)
|
||||||
ft_printf_fd(2, "&");
|
ft_printf_fd(2, "&");
|
||||||
ft_printf_fd(2, "'\n");
|
ft_printf_fd(2, "'\n");
|
||||||
|
free_cmd(cmds);
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_tokens_syntax(t_cmd *cmd, t_cmd *last, t_env *env)
|
int check_tokens_syntax(t_cmd *cmd, t_cmd *last, t_env *env)
|
||||||
|
66
srcs/debug.c
66
srcs/debug.c
@ -1,66 +0,0 @@
|
|||||||
/* ************************************************************************** */
|
|
||||||
/* */
|
|
||||||
/* ::: :::::::: */
|
|
||||||
/* debug.c :+: :+: :+: */
|
|
||||||
/* +:+ +:+ +:+ */
|
|
||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
|
||||||
/* +#+#+#+#+#+ +#+ */
|
|
||||||
/* Created: 2024/02/18 15:46:50 by tomoron #+# #+# */
|
|
||||||
/* Updated: 2024/04/18 20:48:51 by marde-vr ### ########.fr */
|
|
||||||
/* */
|
|
||||||
/* ************************************************************************** */
|
|
||||||
|
|
||||||
#include "minishell.h"
|
|
||||||
|
|
||||||
void print_parsed_token(t_token *token)
|
|
||||||
{
|
|
||||||
while (token)
|
|
||||||
{
|
|
||||||
printf("[ARG : \"%s\"]", token->value);
|
|
||||||
token = token->next;
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_cmd_type(t_cmd_type type, char *value)
|
|
||||||
{
|
|
||||||
if (type == CMD)
|
|
||||||
printf("[CMD : %s] ", value);
|
|
||||||
if (type == PAREN)
|
|
||||||
printf("[PAREN : %s] ", value);
|
|
||||||
if (type == AND)
|
|
||||||
printf("[AND] ");
|
|
||||||
if (type == OR)
|
|
||||||
printf("[OR] ");
|
|
||||||
if (type == PIPE)
|
|
||||||
printf("[PIPE] ");
|
|
||||||
if (type == RED_O_APP)
|
|
||||||
printf("[RED_O_APP : %s] ", value);
|
|
||||||
if (type == RED_O)
|
|
||||||
printf("[RED_O : %s] ", value);
|
|
||||||
if (type == RED_I)
|
|
||||||
printf("[RED_I : %s] ", value);
|
|
||||||
if (type == HERE_DOC)
|
|
||||||
printf("[HERE_DOC : %s] ", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_parsed_cmd(t_cmd *cmd)
|
|
||||||
{
|
|
||||||
while (cmd)
|
|
||||||
{
|
|
||||||
print_cmd_type(cmd->cmd_type, cmd->value);
|
|
||||||
cmd = cmd->next;
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_msh_struct(t_msh *msh)
|
|
||||||
{
|
|
||||||
printf("in_fd : %d\n", msh->in_fd);
|
|
||||||
printf("out_fd : %d\n", msh->out_fd);
|
|
||||||
printf("in_type: ");
|
|
||||||
print_cmd_type(msh->in_type, 0);
|
|
||||||
printf("\nout_type: ");
|
|
||||||
print_cmd_type(msh->out_type, 0);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/07 15:30:37 by tomoron #+# #+# */
|
/* Created: 2024/02/07 15:30:37 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/24 14:52:21 by marde-vr ### ########.fr */
|
/* Updated: 2024/04/29 22:11:06 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -34,15 +34,15 @@ int echo(t_token *args)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
put_nl = 1;
|
put_nl = 1;
|
||||||
i = 1;
|
|
||||||
while (args && args->value && args->value[0] == '-')
|
while (args && args->value && args->value[0] == '-')
|
||||||
{
|
{
|
||||||
|
i = 1;
|
||||||
while (args->value[i] == 'n')
|
while (args->value[i] == 'n')
|
||||||
i++;
|
i++;
|
||||||
if (!args->value[i] && i > 1)
|
if (!args->value[i] && i > 1)
|
||||||
put_nl = 0;
|
put_nl = 0;
|
||||||
else
|
else
|
||||||
ft_printf("%s ", args->value);
|
break ;
|
||||||
args = args->next;
|
args = args->next;
|
||||||
}
|
}
|
||||||
put_args(args);
|
put_args(args);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/04/24 10:58:36 by marde-vr #+# #+# */
|
/* Created: 2024/04/24 10:58:36 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/26 10:26:03 by tomoron ### ########.fr */
|
/* Updated: 2024/05/03 14:25:03 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ t_env *dup_env(t_env *env)
|
|||||||
res = 0;
|
res = 0;
|
||||||
while (env)
|
while (env)
|
||||||
{
|
{
|
||||||
res = env_add_back(res, env->name, env->value);
|
res = env_add_back(res, env->name, env->value, 0);
|
||||||
env = env->next;
|
env = env->next;
|
||||||
}
|
}
|
||||||
return (res);
|
return (res);
|
||||||
@ -67,7 +67,7 @@ void print_env_declare(t_msh *msh, t_env *env_orig)
|
|||||||
{
|
{
|
||||||
if (strcmp(env->name, "_"))
|
if (strcmp(env->name, "_"))
|
||||||
{
|
{
|
||||||
if (env->value && *(env->value))
|
if (env->value)
|
||||||
ft_printf_fd(msh->out_fd, "declare -x %s=\"%s\"\n", env->name,
|
ft_printf_fd(msh->out_fd, "declare -x %s=\"%s\"\n", env->name,
|
||||||
env->value);
|
env->value);
|
||||||
else
|
else
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/16 13:30:18 by tomoron #+# #+# */
|
/* Created: 2024/02/16 13:30:18 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/18 20:48:52 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/16 13:18:46 by marde-vr ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ char **split_paths_from_env(t_env *env)
|
|||||||
|
|
||||||
path_in_envp = 0;
|
path_in_envp = 0;
|
||||||
cur_env_var = env;
|
cur_env_var = env;
|
||||||
while (cur_env_var && cur_env_var->next != 0)
|
while (cur_env_var)
|
||||||
{
|
{
|
||||||
if (!ft_strcmp(cur_env_var->name, "PATH"))
|
if (!ft_strcmp(cur_env_var->name, "PATH"))
|
||||||
{
|
{
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/03/28 13:50:14 by tomoron #+# #+# */
|
/* Created: 2024/03/28 13:50:14 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/26 11:08:13 by tomoron ### ########.fr */
|
/* Updated: 2024/05/07 17:26:49 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -20,11 +20,11 @@ void exec_command_bonus(t_msh *msh, char *cmd_str)
|
|||||||
if (!cmd_str)
|
if (!cmd_str)
|
||||||
return ;
|
return ;
|
||||||
cmds = parsing_bonus(cmd_str);
|
cmds = parsing_bonus(cmd_str);
|
||||||
|
free(cmd_str);
|
||||||
tmp = check_cmds_syntax(cmds, msh->env);
|
tmp = check_cmds_syntax(cmds, msh->env);
|
||||||
if (tmp)
|
if (tmp)
|
||||||
{
|
{
|
||||||
print_syntax_error_bonus(tmp);
|
print_syntax_error_bonus(tmp, cmds);
|
||||||
free_cmd(cmds);
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
msh->cmds_head = cmds;
|
msh->cmds_head = cmds;
|
||||||
@ -73,16 +73,26 @@ int exec(t_msh *msh, char **cmd_args, int i, int cmd_count)
|
|||||||
void exec_command(t_msh *msh, int i, int cmd_count)
|
void exec_command(t_msh *msh, int i, int cmd_count)
|
||||||
{
|
{
|
||||||
get_redirections(msh, msh->cmds);
|
get_redirections(msh, msh->cmds);
|
||||||
g_return_code = 0;
|
if (msh->in_fd != -2)
|
||||||
if (msh->out_fd != -1 && msh->in_fd != -1)
|
|
||||||
{
|
{
|
||||||
|
msh->last_return_code = g_return_code;
|
||||||
|
g_return_code = 0;
|
||||||
msh->fds[i] = ft_calloc(2, sizeof(int *));
|
msh->fds[i] = ft_calloc(2, sizeof(int *));
|
||||||
if (!msh->fds[i])
|
if (!msh->fds[i])
|
||||||
ft_exit(msh, 1);
|
ft_exit(msh, 1);
|
||||||
if (msh->tokens && !cmd_is_builtin(msh, msh->tokens->value))
|
if (msh->tokens && !cmd_is_builtin(msh, msh->tokens->value))
|
||||||
get_cmd_path(msh);
|
get_cmd_path(msh);
|
||||||
if ((msh->tokens && msh->tokens->value) || is_parenthesis(msh->cmds))
|
if (((msh->tokens && msh->tokens->value) || is_parenthesis(msh->cmds)))
|
||||||
exec(msh, get_cmd_args(msh), i, cmd_count);
|
exec(msh, get_cmd_args(msh), i, cmd_count);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (msh->in_fd > 2)
|
||||||
|
close(msh->in_fd);
|
||||||
|
if (msh->out_fd > 2)
|
||||||
|
close(msh->out_fd);
|
||||||
|
if (!g_return_code)
|
||||||
|
g_return_code = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
remove_command_from_msh(msh);
|
remove_command_from_msh(msh);
|
||||||
}
|
}
|
||||||
@ -96,6 +106,7 @@ void end_execution(t_msh *msh, int cmd_count)
|
|||||||
status = 0;
|
status = 0;
|
||||||
while (i < cmd_count)
|
while (i < cmd_count)
|
||||||
waitpid(msh->pids[i++], &status, 0);
|
waitpid(msh->pids[i++], &status, 0);
|
||||||
|
close_all_pipes(msh);
|
||||||
if (!g_return_code && WIFEXITED(status))
|
if (!g_return_code && WIFEXITED(status))
|
||||||
g_return_code = WEXITSTATUS(status);
|
g_return_code = WEXITSTATUS(status);
|
||||||
if (WIFSIGNALED(status))
|
if (WIFSIGNALED(status))
|
||||||
@ -121,8 +132,9 @@ void exec_commands(t_msh *msh)
|
|||||||
|
|
||||||
if (!msh->tokens && !is_parenthesis(msh->cmds))
|
if (!msh->tokens && !is_parenthesis(msh->cmds))
|
||||||
{
|
{
|
||||||
g_return_code = 0;
|
|
||||||
get_redirections(msh, msh->cmds);
|
get_redirections(msh, msh->cmds);
|
||||||
|
g_return_code = (msh->in_fd < 0 || msh->out_fd < 0);
|
||||||
|
remove_here_doc_file(msh);
|
||||||
if (msh->in_fd > 2)
|
if (msh->in_fd > 2)
|
||||||
close(msh->in_fd);
|
close(msh->in_fd);
|
||||||
if (msh->out_fd > 2)
|
if (msh->out_fd > 2)
|
||||||
@ -135,8 +147,9 @@ void exec_commands(t_msh *msh)
|
|||||||
if (!msh->pids || !msh->fds)
|
if (!msh->pids || !msh->fds)
|
||||||
ft_exit(msh, 1);
|
ft_exit(msh, 1);
|
||||||
i = -1;
|
i = -1;
|
||||||
while (++i < cmd_count && msh->in_fd >= 0 && msh->out_fd >= 0)
|
while (++i < cmd_count && msh->in_fd != -2)
|
||||||
exec_command(msh, i, cmd_count);
|
exec_command(msh, i, cmd_count);
|
||||||
free_token(msh->tokens);
|
free_token(msh->tokens);
|
||||||
|
msh->tokens = 0;
|
||||||
end_execution(msh, cmd_count);
|
end_execution(msh, cmd_count);
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/04/24 10:46:28 by marde-vr #+# #+# */
|
/* Created: 2024/04/24 10:46:28 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/24 14:05:18 by tomoron ### ########.fr */
|
/* Updated: 2024/05/06 10:56:52 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -16,6 +16,8 @@ void get_redirections(t_msh *msh, t_cmd *cmds)
|
|||||||
{
|
{
|
||||||
msh->in_type = 0;
|
msh->in_type = 0;
|
||||||
msh->out_type = 0;
|
msh->out_type = 0;
|
||||||
|
msh->in_fd = 0;
|
||||||
|
msh->out_fd = 0;
|
||||||
if (first_is_in_type(cmds))
|
if (first_is_in_type(cmds))
|
||||||
{
|
{
|
||||||
if (!get_in_type(msh, cmds, cmds, 1))
|
if (!get_in_type(msh, cmds, cmds, 1))
|
||||||
@ -48,17 +50,13 @@ int get_cmd_count(t_cmd *cmds)
|
|||||||
{
|
{
|
||||||
int nb;
|
int nb;
|
||||||
|
|
||||||
nb = 0;
|
nb = 1;
|
||||||
while (cmds && !is_operand_type(cmds))
|
while (cmds && !is_operand_type(cmds))
|
||||||
{
|
{
|
||||||
while (cmds && (is_output_type(cmds) || is_input_type(cmds)))
|
|
||||||
cmds = cmds->next;
|
|
||||||
if (is_cmd_type(cmds))
|
|
||||||
nb++;
|
|
||||||
while (cmds && (is_output_type(cmds) || is_input_type(cmds)
|
|
||||||
|| is_cmd_type(cmds)))
|
|
||||||
cmds = cmds->next;
|
|
||||||
if (cmds && cmds->cmd_type == PIPE)
|
if (cmds && cmds->cmd_type == PIPE)
|
||||||
|
{
|
||||||
|
nb++;
|
||||||
|
}
|
||||||
cmds = cmds->next;
|
cmds = cmds->next;
|
||||||
}
|
}
|
||||||
return (nb);
|
return (nb);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/07 16:04:11 by tomoron #+# #+# */
|
/* Created: 2024/02/07 16:04:11 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/26 10:49:17 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/16 12:49:41 by marde-vr ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ int is_too_big(char *num_str)
|
|||||||
{
|
{
|
||||||
if ((strlen(num_str) == 19 && strcmp(num_str, "9223372036854775807") > 0)
|
if ((strlen(num_str) == 19 && strcmp(num_str, "9223372036854775807") > 0)
|
||||||
|| (strlen(num_str) == 20 && num_str[0] == '-' && strcmp(num_str,
|
|| (strlen(num_str) == 20 && num_str[0] == '-' && strcmp(num_str,
|
||||||
"-9223372036854775808") > 0) || strlen(num_str) > 20)
|
"-9223372036854775808") > 0) || strlen(num_str) >= 20)
|
||||||
return (1);
|
return (1);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -39,7 +39,7 @@ void get_exit_bt_return_code(t_msh *msh, int *exit_code)
|
|||||||
else if (cur_cmd)
|
else if (cur_cmd)
|
||||||
*exit_code = (unsigned char)ft_atoi(cur_cmd->value);
|
*exit_code = (unsigned char)ft_atoi(cur_cmd->value);
|
||||||
else
|
else
|
||||||
*exit_code = g_return_code;
|
*exit_code = msh->last_return_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int exit_bt(t_msh *msh)
|
int exit_bt(t_msh *msh)
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/18 18:29:20 by marde-vr #+# #+# */
|
/* Created: 2024/02/18 18:29:20 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/26 10:52:17 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/03 14:50:57 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ int export_invalid_identifier(char *arg, char *name)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
t_env *set_env(t_env *env, char *name, char *value, int append)
|
t_env *set_env(t_env *env, char *name, char *value, int flags)
|
||||||
{
|
{
|
||||||
t_env *tmp;
|
t_env *tmp;
|
||||||
|
|
||||||
@ -31,12 +31,12 @@ t_env *set_env(t_env *env, char *name, char *value, int append)
|
|||||||
if (!ft_strcmp(name, tmp->name))
|
if (!ft_strcmp(name, tmp->name))
|
||||||
{
|
{
|
||||||
free(name);
|
free(name);
|
||||||
if (!*value)
|
if (!*value && !(flags & 0b10))
|
||||||
{
|
{
|
||||||
free(value);
|
free(value);
|
||||||
return (env);
|
return (env);
|
||||||
}
|
}
|
||||||
if (append)
|
if ((flags & 0b1) && tmp->value)
|
||||||
value = ft_strjoin_free(tmp->value, value, 2);
|
value = ft_strjoin_free(tmp->value, value, 2);
|
||||||
if (!value)
|
if (!value)
|
||||||
return (env);
|
return (env);
|
||||||
@ -46,10 +46,10 @@ t_env *set_env(t_env *env, char *name, char *value, int append)
|
|||||||
}
|
}
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
return (env_add_back(env, name, value));
|
return (env_add_back(env, name, value, !(flags & 0b10)));
|
||||||
}
|
}
|
||||||
|
|
||||||
t_env *export_set_env(t_env *env, char *name, char *value, int append)
|
t_env *export_set_env(t_env *env, char *name, char *value, int flags)
|
||||||
{
|
{
|
||||||
if (!value || !name)
|
if (!value || !name)
|
||||||
{
|
{
|
||||||
@ -58,29 +58,34 @@ t_env *export_set_env(t_env *env, char *name, char *value, int append)
|
|||||||
ft_printf_fd(2, "minishell: malloc failed");
|
ft_printf_fd(2, "minishell: malloc failed");
|
||||||
return (env);
|
return (env);
|
||||||
}
|
}
|
||||||
return (set_env(env, name, value, append));
|
return (set_env(env, name, value, flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
int export_var(t_token *cmd, t_env *env)
|
int export_var(t_token *cmd, t_env **env)
|
||||||
{
|
{
|
||||||
char *arg;
|
char *arg;
|
||||||
char *name;
|
char *name;
|
||||||
char *value;
|
char *value;
|
||||||
int len;
|
int len;
|
||||||
int append;
|
int flags;
|
||||||
|
|
||||||
len = 0;
|
len = 0;
|
||||||
arg = cmd->value;
|
arg = cmd->value;
|
||||||
while (arg[len] && arg[len] != '=' && arg[len] != '+')
|
while (arg[len] && arg[len] != '=' && arg[len] != '+')
|
||||||
len++;
|
len++;
|
||||||
name = ft_substr(arg, 0, len);
|
name = ft_substr(arg, 0, len);
|
||||||
append = arg[len] == '+';
|
flags = arg[len] == '+';
|
||||||
if (arg[len] == '=' || (arg[len] == '+' && arg[len + 1] == '='))
|
if (arg[len] == '+' && arg[len + 1] == '=')
|
||||||
len += 1 + (arg[len] == '+');
|
len++;
|
||||||
|
if (arg[len] == '=')
|
||||||
|
{
|
||||||
|
flags += 0b10;
|
||||||
|
len++;
|
||||||
|
}
|
||||||
if (!name || !check_var_name(name) || arg[len] == '+')
|
if (!name || !check_var_name(name) || arg[len] == '+')
|
||||||
return (export_invalid_identifier(arg, name));
|
return (export_invalid_identifier(arg, name));
|
||||||
value = ft_strdup(arg + len);
|
value = ft_strdup(arg + len);
|
||||||
env = export_set_env(env, name, value, append);
|
*env = export_set_env(*env, name, value, flags);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,11 +102,12 @@ int ft_export(t_msh *msh, t_token *cmd, t_env *env)
|
|||||||
cmd = cmd->next;
|
cmd = cmd->next;
|
||||||
while (cmd->next)
|
while (cmd->next)
|
||||||
{
|
{
|
||||||
if (export_var(cmd, env))
|
if (export_var(cmd, &env))
|
||||||
error = 1;
|
error = 1;
|
||||||
cmd = cmd->next;
|
cmd = cmd->next;
|
||||||
}
|
}
|
||||||
if (export_var(cmd, env))
|
if (export_var(cmd, &env))
|
||||||
error = 1;
|
error = 1;
|
||||||
|
msh->env = env;
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/04/24 14:51:00 by tomoron #+# #+# */
|
/* Created: 2024/04/24 14:51:00 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/24 14:59:47 by tomoron ### ########.fr */
|
/* Updated: 2024/05/06 11:14:51 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
@ -43,7 +43,8 @@ int get_next_arg_len(char *cmd)
|
|||||||
in_quote = 0;
|
in_quote = 0;
|
||||||
in_dquote = 0;
|
in_dquote = 0;
|
||||||
while (cmd[len] && ((!ft_isspace(cmd[len]) && cmd[len] != '&'
|
while (cmd[len] && ((!ft_isspace(cmd[len]) && cmd[len] != '&'
|
||||||
&& cmd[len] != '|' && cmd[len] != '<' && cmd[len] != '>')
|
&& cmd[len] != '|' && cmd[len] != '<' && cmd[len] != '>'
|
||||||
|
&& cmd[len] != '(' && cmd[len] != ')')
|
||||||
|| in_quote || in_dquote))
|
|| in_quote || in_dquote))
|
||||||
{
|
{
|
||||||
if (cmd[len] == '\'' && !in_dquote)
|
if (cmd[len] == '\'' && !in_dquote)
|
||||||
@ -73,7 +74,7 @@ int get_parenthesis_cmd_len(char *cmd)
|
|||||||
if (cmd[len] == '"' && !in_quote)
|
if (cmd[len] == '"' && !in_quote)
|
||||||
in_dquote = !in_dquote;
|
in_dquote = !in_dquote;
|
||||||
if ((cmd[len] == '(' || cmd[len] == ')') && !in_quote && !in_dquote)
|
if ((cmd[len] == '(' || cmd[len] == ')') && !in_quote && !in_dquote)
|
||||||
parenthesis += 1 * (-(cmd[len] == ')'));
|
parenthesis += 1 - ((cmd[len] == ')') * 2);
|
||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
return (len - 1);
|
return (len - 1);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/03/24 17:44:32 by marde-vr #+# #+# */
|
/* Created: 2024/03/24 17:44:32 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/26 11:06:25 by tomoron ### ########.fr */
|
/* Updated: 2024/05/22 13:48:39 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ void get_here_doc_input(t_msh *msh, char *eof)
|
|||||||
ft_printf_fd(2, " end-of-file, (wanted `%s')\n", eof);
|
ft_printf_fd(2, " end-of-file, (wanted `%s')\n", eof);
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
if (line && !ft_strncmp(line, eof, ft_strlen(eof)))
|
if (line && !ft_strcmp(line, eof))
|
||||||
break ;
|
break ;
|
||||||
parse_var(msh, line);
|
parse_var(msh, line);
|
||||||
write(msh->in_fd, "\n", 1);
|
write(msh->in_fd, "\n", 1);
|
||||||
@ -44,6 +44,7 @@ void here_doc_child(t_msh *msh, char *eof)
|
|||||||
signal(SIGQUIT, SIG_IGN);
|
signal(SIGQUIT, SIG_IGN);
|
||||||
get_here_doc_input(msh, eof);
|
get_here_doc_input(msh, eof);
|
||||||
close(msh->in_fd);
|
close(msh->in_fd);
|
||||||
|
close_all_pipes(msh);
|
||||||
ft_exit(msh, 0);
|
ft_exit(msh, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,11 +58,12 @@ void here_doc_signal(t_msh *msh, int child_pid, char *here_doc_file)
|
|||||||
set_echoctl(msh->echoctl);
|
set_echoctl(msh->echoctl);
|
||||||
signal(SIGINT, signal_handler_interactive);
|
signal(SIGINT, signal_handler_interactive);
|
||||||
signal(SIGQUIT, signal_handler_interactive);
|
signal(SIGQUIT, signal_handler_interactive);
|
||||||
|
if (msh->in_fd > 2)
|
||||||
close(msh->in_fd);
|
close(msh->in_fd);
|
||||||
if (WIFEXITED(status) && WEXITSTATUS(status))
|
if (WIFEXITED(status) && WEXITSTATUS(status))
|
||||||
{
|
{
|
||||||
unlink(here_doc_file);
|
unlink(here_doc_file);
|
||||||
msh->in_fd = -1;
|
msh->in_fd = -2;
|
||||||
g_return_code = 130;
|
g_return_code = 130;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
@ -78,6 +80,7 @@ void handle_here_doc(t_msh *msh, char *eof)
|
|||||||
here_doc_file = get_tmp_file_name(msh);
|
here_doc_file = get_tmp_file_name(msh);
|
||||||
if (msh->here_doc_filename)
|
if (msh->here_doc_filename)
|
||||||
{
|
{
|
||||||
|
if (msh->in_fd)
|
||||||
close(msh->in_fd);
|
close(msh->in_fd);
|
||||||
unlink(msh->here_doc_filename);
|
unlink(msh->here_doc_filename);
|
||||||
free(msh->here_doc_filename);
|
free(msh->here_doc_filename);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/03/26 09:06:51 by marde-vr #+# #+# */
|
/* Created: 2024/03/26 09:06:51 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/18 20:48:54 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/08 12:31:54 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -78,3 +78,13 @@ void parse_var(t_msh *msh, char *line)
|
|||||||
line++;
|
line++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void remove_here_doc_file(t_msh *msh)
|
||||||
|
{
|
||||||
|
if (msh->here_doc_filename)
|
||||||
|
{
|
||||||
|
unlink(msh->here_doc_filename);
|
||||||
|
free(msh->here_doc_filename);
|
||||||
|
msh->here_doc_filename = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/03/05 18:15:27 by marde-vr #+# #+# */
|
/* Created: 2024/03/05 18:15:27 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/25 18:39:48 by tomoron ### ########.fr */
|
/* Updated: 2024/05/06 14:43:48 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -19,6 +19,7 @@ void redirect_input(t_msh *msh, int i, char **cmd_args)
|
|||||||
if (dup2(msh->in_fd, 0) < 0)
|
if (dup2(msh->in_fd, 0) < 0)
|
||||||
{
|
{
|
||||||
free(cmd_args);
|
free(cmd_args);
|
||||||
|
close_pipe_fds(msh, i);
|
||||||
ft_exit(msh, 1);
|
ft_exit(msh, 1);
|
||||||
}
|
}
|
||||||
close(msh->in_fd);
|
close(msh->in_fd);
|
||||||
@ -28,28 +29,23 @@ void redirect_input(t_msh *msh, int i, char **cmd_args)
|
|||||||
if (dup2(msh->fds[i - 1][0], 0) < 0)
|
if (dup2(msh->fds[i - 1][0], 0) < 0)
|
||||||
{
|
{
|
||||||
free(cmd_args);
|
free(cmd_args);
|
||||||
|
close_pipe_fds(msh, i);
|
||||||
ft_exit(msh, 1);
|
ft_exit(msh, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ambiguous_redirect(char *str, t_msh *msh)
|
int open_input_redirection_file(t_msh *msh, t_cmd **cur_token)
|
||||||
{
|
|
||||||
ft_printf_fd(2, "minishell: %s: ambiguous redirect\n", str);
|
|
||||||
msh->in_fd = -1;
|
|
||||||
g_return_code = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int open_input_file(t_msh *msh, t_cmd **cur_token)
|
|
||||||
{
|
{
|
||||||
t_token *filename;
|
t_token *filename;
|
||||||
|
|
||||||
if ((*cur_token)->cmd_type == HERE_DOC)
|
if (msh->in_fd != 0 && msh->in_type != PIPE)
|
||||||
handle_here_doc(msh, (*cur_token)->value);
|
|
||||||
if ((*cur_token)->cmd_type == RED_I)
|
|
||||||
{
|
|
||||||
if (msh->in_fd != 0)
|
|
||||||
close(msh->in_fd);
|
close(msh->in_fd);
|
||||||
|
if (ft_strchr((*cur_token)->value, '$'))
|
||||||
|
{
|
||||||
|
ambiguous_redirect((*cur_token)->value, msh);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
filename = parse_tokens((*cur_token)->value, msh->env);
|
filename = parse_tokens((*cur_token)->value, msh->env);
|
||||||
if (!filename)
|
if (!filename)
|
||||||
ft_exit(msh, 1);
|
ft_exit(msh, 1);
|
||||||
@ -57,7 +53,7 @@ int open_input_file(t_msh *msh, t_cmd **cur_token)
|
|||||||
ambiguous_redirect((*cur_token)->value, msh);
|
ambiguous_redirect((*cur_token)->value, msh);
|
||||||
if (!filename->next)
|
if (!filename->next)
|
||||||
msh->in_fd = open(filename->value, O_RDONLY);
|
msh->in_fd = open(filename->value, O_RDONLY);
|
||||||
if (msh->in_fd == -1)
|
if (msh->in_fd == -1 && !filename->next)
|
||||||
{
|
{
|
||||||
ft_printf_fd(2, "minishell: %s: ", filename->value);
|
ft_printf_fd(2, "minishell: %s: ", filename->value);
|
||||||
perror("");
|
perror("");
|
||||||
@ -65,8 +61,16 @@ int open_input_file(t_msh *msh, t_cmd **cur_token)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
free_token(filename);
|
free_token(filename);
|
||||||
}
|
return (msh->in_fd == -2);
|
||||||
return (msh->in_fd == -1);
|
}
|
||||||
|
|
||||||
|
int open_input_file(t_msh *msh, t_cmd **cur_token)
|
||||||
|
{
|
||||||
|
if ((*cur_token)->cmd_type == HERE_DOC)
|
||||||
|
handle_here_doc(msh, (*cur_token)->value);
|
||||||
|
if ((*cur_token)->cmd_type == RED_I)
|
||||||
|
return (open_input_redirection_file(msh, cur_token));
|
||||||
|
return (msh->in_fd == -2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_in_type(t_msh *msh, t_cmd *t_strt, t_cmd *tokens, int here_doc)
|
int get_in_type(t_msh *msh, t_cmd *t_strt, t_cmd *tokens, int here_doc)
|
||||||
@ -89,22 +93,11 @@ int get_in_type(t_msh *msh, t_cmd *t_strt, t_cmd *tokens, int here_doc)
|
|||||||
if (open_input_file(msh, &cur_token))
|
if (open_input_file(msh, &cur_token))
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
if (cur_token && cur_token->next && !is_operand_type(cur_token->next)
|
if (cur_token && cur_token->next
|
||||||
|
&& !is_operand_type(cur_token) && !is_operand_type(cur_token->next)
|
||||||
&& cur_token->cmd_type != PIPE && cur_token->next->cmd_type != PIPE)
|
&& cur_token->cmd_type != PIPE && cur_token->next->cmd_type != PIPE)
|
||||||
return (get_in_type(msh, t_strt, cur_token->next, here_doc));
|
return (get_in_type(msh, t_strt, cur_token->next, here_doc));
|
||||||
if (here_doc)
|
if (here_doc)
|
||||||
return (get_in_type(msh, t_strt, t_strt, 0));
|
return (get_in_type(msh, t_strt, t_strt, 0));
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int first_is_in_type(t_cmd *cmd)
|
|
||||||
{
|
|
||||||
t_cmd *cur_token;
|
|
||||||
|
|
||||||
cur_token = cmd;
|
|
||||||
while (cur_token && cur_token->cmd_type == CMD && cur_token->next)
|
|
||||||
cur_token = cur_token->next;
|
|
||||||
if (is_input_type(cur_token) || cur_token->cmd_type == PIPE)
|
|
||||||
return (1);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/06 20:46:19 by tomoron #+# #+# */
|
/* Created: 2024/02/06 20:46:19 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/18 20:48:55 by marde-vr ### ########.fr */
|
/* Updated: 2024/04/26 13:45:08 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ t_cmd *cmd_add_back(t_cmd *cmd, char *value, t_cmd_type type)
|
|||||||
t_cmd *res;
|
t_cmd *res;
|
||||||
t_cmd *current;
|
t_cmd *current;
|
||||||
|
|
||||||
if (value && !*value)
|
if (value && !*value && type != PAREN)
|
||||||
{
|
{
|
||||||
free(value);
|
free(value);
|
||||||
return (cmd);
|
return (cmd);
|
||||||
|
@ -6,21 +6,24 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/06 20:46:19 by tomoron #+# #+# */
|
/* Created: 2024/02/06 20:46:19 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/25 18:53:51 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/06 10:56:39 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
|
|
||||||
t_env *env_add_back(t_env *env, char *name, char *value)
|
t_env *env_add_back(t_env *env, char *name, char *value, int empty)
|
||||||
{
|
{
|
||||||
t_env *res;
|
t_env *res;
|
||||||
t_env *current;
|
t_env *current;
|
||||||
|
|
||||||
|
if (empty)
|
||||||
|
free(value);
|
||||||
res = ft_calloc(1, sizeof(t_env));
|
res = ft_calloc(1, sizeof(t_env));
|
||||||
if (!res)
|
if (!res)
|
||||||
return (env);
|
return (env);
|
||||||
res->name = name;
|
res->name = name;
|
||||||
|
if (!empty)
|
||||||
res->value = value;
|
res->value = value;
|
||||||
if (!env)
|
if (!env)
|
||||||
return (res);
|
return (res);
|
||||||
@ -35,6 +38,7 @@ int print_env(t_env *env)
|
|||||||
{
|
{
|
||||||
while (env)
|
while (env)
|
||||||
{
|
{
|
||||||
|
if (env->value)
|
||||||
ft_printf("%s=%s\n", env->name, env->value);
|
ft_printf("%s=%s\n", env->name, env->value);
|
||||||
env = env->next;
|
env = env->next;
|
||||||
}
|
}
|
||||||
|
10
srcs/main.c
10
srcs/main.c
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/02 21:59:20 by tomoron #+# #+# */
|
/* Created: 2024/02/02 21:59:20 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/26 11:08:22 by tomoron ### ########.fr */
|
/* Updated: 2024/05/06 14:25:27 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -31,12 +31,13 @@ char *get_prompt(t_env *env)
|
|||||||
res = ft_strjoin_free(res, ft_get_color(80, 80, 255), 3);
|
res = ft_strjoin_free(res, ft_get_color(80, 80, 255), 3);
|
||||||
res = ft_strjoin_free(res, "\033[1m\002", 1);
|
res = ft_strjoin_free(res, "\033[1m\002", 1);
|
||||||
cwd = getcwd(cwd_buffer, 99);
|
cwd = getcwd(cwd_buffer, 99);
|
||||||
if (ft_get_env(env, "HOME") && !ft_strncmp(cwd_buffer, ft_get_env(env,
|
if (cwd && ft_get_env(env, "HOME") && !ft_strncmp(cwd_buffer,
|
||||||
"HOME"), ft_strlen(ft_get_env(env, "HOME"))))
|
ft_get_env(env, "HOME"), ft_strlen(ft_get_env(env, "HOME"))))
|
||||||
{
|
{
|
||||||
cwd += ft_strlen(getenv("HOME")) - 1;
|
cwd += ft_strlen(getenv("HOME")) - 1;
|
||||||
cwd[0] = '~';
|
cwd[0] = '~';
|
||||||
}
|
}
|
||||||
|
if (cwd)
|
||||||
res = ft_strjoin_free(res, cwd, 1);
|
res = ft_strjoin_free(res, cwd, 1);
|
||||||
res = ft_strjoin_free(res, "\001\033[0m\002$ ", 1);
|
res = ft_strjoin_free(res, "\001\033[0m\002$ ", 1);
|
||||||
return (res);
|
return (res);
|
||||||
@ -61,7 +62,7 @@ t_env *get_env(char **envp)
|
|||||||
j++;
|
j++;
|
||||||
name = ft_substr(*envp, 0, i);
|
name = ft_substr(*envp, 0, i);
|
||||||
value = ft_substr(*envp, i + 1, j);
|
value = ft_substr(*envp, i + 1, j);
|
||||||
env = env_add_back(env, name, value);
|
env = env_add_back(env, name, value, 0);
|
||||||
if (!name || !value)
|
if (!name || !value)
|
||||||
free_env(env);
|
free_env(env);
|
||||||
if (!name || !value)
|
if (!name || !value)
|
||||||
@ -128,7 +129,6 @@ int main(int argc, char **argv, char **envp)
|
|||||||
free(prompt);
|
free(prompt);
|
||||||
add_history(commands);
|
add_history(commands);
|
||||||
exec_command_bonus(msh, commands);
|
exec_command_bonus(msh, commands);
|
||||||
free(commands);
|
|
||||||
}
|
}
|
||||||
printf("exit\n");
|
printf("exit\n");
|
||||||
ft_exit(msh, g_return_code);
|
ft_exit(msh, g_return_code);
|
||||||
|
123
srcs/minishell.h
123
srcs/minishell.h
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/04 17:31:38 by tomoron #+# #+# */
|
/* Created: 2024/02/04 17:31:38 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/25 18:54:09 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/22 13:49:58 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -71,108 +71,115 @@ typedef struct s_msh
|
|||||||
t_cmd_type in_type;
|
t_cmd_type in_type;
|
||||||
t_cmd_type out_type;
|
t_cmd_type out_type;
|
||||||
int in_fd;
|
int in_fd;
|
||||||
int echoctl;
|
|
||||||
int out_fd;
|
int out_fd;
|
||||||
|
int echoctl;
|
||||||
|
int last_return_code;
|
||||||
int locked_return_code;
|
int locked_return_code;
|
||||||
char *here_doc_filename;
|
char *here_doc_filename;
|
||||||
} t_msh;
|
} t_msh;
|
||||||
|
|
||||||
extern int g_return_code;
|
extern int g_return_code;
|
||||||
|
|
||||||
t_cmd *cmd_add_back(t_cmd *res, char *cmd, t_cmd_type type);
|
|
||||||
t_env *export_set_env(t_env *env, char *name, char *value, int append);
|
|
||||||
void *here_doc_variables(int write, void *data);
|
|
||||||
int set_echoctl(int value);
|
|
||||||
int add_var_to_str(char *res, char **command, t_env *env, int *is_var);
|
|
||||||
void find_cmd_path(t_msh *msh, char **paths, int *found);
|
|
||||||
t_env *env_add_back(t_env *env, char *name, char *value);
|
|
||||||
t_token *parse_cmds_to_token(t_cmd *command, t_env *env);
|
|
||||||
void exec_command_bonus(t_msh *msh, char *cmd_str);
|
|
||||||
t_token *add_token_back(t_token *res, t_token *next);
|
|
||||||
t_token *expand_wildcards(t_token *res, char *value, int is_var);
|
|
||||||
int cmd_is_builtin(t_msh *msh, char *cmd_token);
|
|
||||||
t_token *token_add_back(t_token *res, char *token, int is_var);
|
|
||||||
void child(t_msh *msh, char **cmd_args, int i);
|
|
||||||
t_token *parse_tokens(char *command, t_env *env);
|
|
||||||
void parent(t_msh *msh, int i, int cmd_count, char **cmd_args);
|
|
||||||
char *ft_get_env(t_env *env, char *var_name);
|
|
||||||
int is_fd_open(int fd);
|
|
||||||
int get_out_type(t_msh *msh, t_cmd *cmds);
|
|
||||||
void exec_commands(t_msh *msh);
|
|
||||||
void handle_here_doc(t_msh *msh, char *eof);
|
|
||||||
int get_in_type(t_msh *msh, t_cmd *t_strt, t_cmd *tokens, int here_doc);
|
int get_in_type(t_msh *msh, t_cmd *t_strt, t_cmd *tokens, int here_doc);
|
||||||
|
t_env *export_set_env(t_env *env, char *name, char *value, int append);
|
||||||
|
t_env *env_add_back(t_env *env, char *name, char *value, int empty);
|
||||||
|
int add_var_to_str(char *res, char **cmd, t_env *env, int quote);
|
||||||
|
void parent(t_msh *msh, int i, int cmd_count, char **cmd_args);
|
||||||
|
char *expand_variables(char *command, t_env *env, int *is_var);
|
||||||
|
t_token *expand_wildcards(t_token *res, char *value, int is_var);
|
||||||
|
int check_tokens_syntax(t_cmd *cmd, t_cmd *last, t_env *env);
|
||||||
|
t_token *token_add_back(t_token *res, char *token, int is_var);
|
||||||
|
int recursive_filename_check(char *wildcard, char **value);
|
||||||
|
int get_variable_expantion_len(char *command, t_env *env);
|
||||||
|
t_cmd *cmd_add_back(t_cmd *res, char *cmd, t_cmd_type type);
|
||||||
|
int get_var_len(char **command, t_env *env, int dquote);
|
||||||
|
void find_cmd_path(t_msh *msh, char **paths, int *found);
|
||||||
|
void redirect_output(t_msh *msh, int i, char **cmd_args);
|
||||||
|
void redirect_input(t_msh *msh, int i, char **cmd_args);
|
||||||
|
void print_syntax_error_bonus(t_cmd *cmd, t_cmd *cmds);
|
||||||
|
int filename_corresponds(char *wildcard, char *value);
|
||||||
|
t_token *parse_cmds_to_token(t_cmd *command, t_env *env);
|
||||||
|
int ft_export(t_msh *msh, t_token *cmd, t_env *env);
|
||||||
|
void print_env_declare(t_msh *msh, t_env *env_orig);
|
||||||
|
void exec_command_bonus(t_msh *msh, char *cmd_str);
|
||||||
|
void print_cmd_type(t_cmd_type type, char *value);
|
||||||
|
t_token *add_token_back(t_token *res, t_token *next);
|
||||||
|
t_cmd *check_cmds_syntax(t_cmd *cmds, t_env *env);
|
||||||
|
int cmd_is_builtin(t_msh *msh, char *cmd_token);
|
||||||
|
void *here_doc_variables(int write, void *data);
|
||||||
|
void get_redirections(t_msh *msh, t_cmd *cmds);
|
||||||
|
void ambiguous_redirect(char *str, t_msh *msh);
|
||||||
|
void child(t_msh *msh, char **cmd_args, int i);
|
||||||
|
int cmd_is_forkable_builtin(char *cmd_token);
|
||||||
|
t_token *parse_tokens(char *command, t_env *env);
|
||||||
|
void delete_from_env(t_msh *msh, char *name);
|
||||||
|
char *ft_get_env(t_env *env, char *var_name);
|
||||||
|
void handle_here_doc(t_msh *msh, char *eof);
|
||||||
void signal_handler_interactive(int signum);
|
void signal_handler_interactive(int signum);
|
||||||
int get_token_len(char *cmd, t_env *env);
|
int get_out_type(t_msh *msh, t_cmd *cmds);
|
||||||
void print_syntax_error_bonus(t_cmd *cmd);
|
|
||||||
void signal_handler_here_doc(int signum);
|
void signal_handler_here_doc(int signum);
|
||||||
t_token *parsing_syntax_error(t_token *res);
|
t_token *parsing_syntax_error(t_token *res);
|
||||||
int file_access(t_msh *msh, int *found);
|
int file_access(t_msh *msh, int *found);
|
||||||
void free_env_cpy(t_env *env);
|
|
||||||
void remove_command_from_msh(t_msh *msh);
|
void remove_command_from_msh(t_msh *msh);
|
||||||
void get_redirections(t_msh *msh, t_cmd *cmds);
|
|
||||||
t_cmd *get_next_command(t_cmd *cmd);
|
|
||||||
int get_cmd_count(t_cmd *cmds);
|
|
||||||
int is_parenthesis(t_cmd *cmd);
|
|
||||||
void print_signaled(int status);
|
|
||||||
void ft_exit(t_msh *msh, int error_code);
|
void ft_exit(t_msh *msh, int error_code);
|
||||||
void sort_wildcards_token(t_token *list);
|
void sort_wildcards_token(t_token *list);
|
||||||
void redirect_input(t_msh *msh, int i, char **cmd_args);
|
|
||||||
void redirect_output(t_msh *msh, int i, char **cmd_args);
|
|
||||||
void print_cmd_type(t_cmd_type type, char *value);
|
|
||||||
int cmd_is_forkable_builtin(char *cmd_token);
|
|
||||||
void signal_handler_command(int signum);
|
void signal_handler_command(int signum);
|
||||||
void ft_exit(t_msh *msh, int exit_code);
|
void ft_exit(t_msh *msh, int exit_code);
|
||||||
|
int get_parenthesis_cmd_len(char *cmd);
|
||||||
char **split_paths_from_env(t_env *env);
|
char **split_paths_from_env(t_env *env);
|
||||||
int add_return_code_to_str(char *res);
|
int add_return_code_to_str(char *res);
|
||||||
|
void close_pipe_fds(t_msh *msh, int i);
|
||||||
void parse_var(t_msh *msh, char *line);
|
void parse_var(t_msh *msh, char *line);
|
||||||
void print_parsed_token(t_token *cmd);//debug
|
void remove_here_doc_file(t_msh *msh);
|
||||||
int get_var_name_len(char *command);
|
int get_var_name_len(char *command);
|
||||||
void handle_minishellrc(t_msh *msh);
|
void handle_minishellrc(t_msh *msh);
|
||||||
t_cmd *check_cmds_syntax(t_cmd *cmds, t_env *env);
|
|
||||||
char *get_tmp_file_name(t_msh *msh);
|
char *get_tmp_file_name(t_msh *msh);
|
||||||
|
int cd(t_token *args, t_msh *msh);
|
||||||
|
int get_normal_cmd_len(char *cmd);
|
||||||
|
t_cmd *get_next_command(t_cmd *cmd);
|
||||||
int get_args_count(t_token *cmds);
|
int get_args_count(t_token *cmds);
|
||||||
char **env_to_char_tab(t_env *env);
|
char **env_to_char_tab(t_env *env);
|
||||||
void print_parsed_cmd(t_cmd *cmd);//debug
|
int get_token_len(char *command);
|
||||||
int first_is_in_type(t_cmd *cmd);
|
int first_is_in_type(t_cmd *cmd);
|
||||||
void print_msh_struct(t_msh *msh);
|
void print_msh_struct(t_msh *msh);
|
||||||
|
int get_next_arg_len(char *cmd);
|
||||||
|
int check_str_syntax(char *cmd);
|
||||||
|
void close_all_pipes(t_msh *msh);
|
||||||
|
int is_operand_type(t_cmd *cmd);
|
||||||
int contains_newline(char *str);
|
int contains_newline(char *str);
|
||||||
|
t_token *free_token(t_token *token);
|
||||||
int get_cmd_count(t_cmd *cmds);
|
int get_cmd_count(t_cmd *cmds);
|
||||||
int check_var_name(char *name);
|
int check_var_name(char *name);
|
||||||
char **get_cmd_args(t_msh *msh);
|
char **get_cmd_args(t_msh *msh);
|
||||||
char *remove_path(char *token);
|
int get_cmd_count(t_cmd *cmds);
|
||||||
t_env *dup_env(t_env *env);
|
int is_parenthesis(t_cmd *cmd);
|
||||||
void sort_env(t_env *env);
|
int is_output_type(t_cmd *cmd);
|
||||||
void print_env_declare(t_msh *msh, t_env *env_orig);
|
int is_parenthesis(t_cmd *cmd);
|
||||||
void delete_from_env(t_msh *msh, char *name);
|
void print_signaled(int status);
|
||||||
t_cmd *parsing_bonus(char *cmd);
|
|
||||||
t_token *free_token(t_token *cmd);
|
|
||||||
void exec_commands(t_msh *msh);
|
void exec_commands(t_msh *msh);
|
||||||
|
int is_input_type(t_cmd *cmd);
|
||||||
|
char *remove_path(char *token);
|
||||||
|
t_cmd *parsing_bonus(char *cmd);
|
||||||
|
void free_env_cpy(t_env *env);
|
||||||
char *get_var_name(char *str);
|
char *get_var_name(char *str);
|
||||||
int exec_builtin(t_msh *msh);
|
int exec_builtin(t_msh *msh);
|
||||||
void get_cmd_path(t_msh *msh);
|
void get_cmd_path(t_msh *msh);
|
||||||
int is_operand_type(t_cmd *cmd);
|
int is_cmd_type(t_cmd *cmd);
|
||||||
int is_output_type(t_cmd *cmd);
|
int get_home_var_len(void);
|
||||||
|
int set_echoctl(int value);
|
||||||
int print_env(t_env *env);
|
int print_env(t_env *env);
|
||||||
t_cmd *free_cmd(t_cmd *cmd);
|
t_cmd *free_cmd(t_cmd *cmd);
|
||||||
int ft_export(t_msh *msh, t_token *cmd, t_env *env);
|
|
||||||
int get_parenthesis_cmd_len(char *cmd);
|
|
||||||
int get_normal_cmd_len(char *cmd);
|
|
||||||
int get_next_arg_len(char *cmd);
|
|
||||||
int check_str_syntax(char *cmd);
|
|
||||||
int check_tokens_syntax(t_cmd *cmd, t_cmd *last, t_env *env);
|
|
||||||
int is_parenthesis(t_cmd *cmd);
|
|
||||||
int is_input_type(t_cmd *cmd);
|
|
||||||
void free_env(t_env *env);
|
void free_env(t_env *env);
|
||||||
int ft_unset(t_msh *msh);
|
int ft_unset(t_msh *msh);
|
||||||
void free_fds(t_msh *msh);
|
void free_fds(t_msh *msh);
|
||||||
|
t_env *dup_env(t_env *env);
|
||||||
|
void sort_env(t_env *env);
|
||||||
void free_msh(t_msh *msh);
|
void free_msh(t_msh *msh);
|
||||||
void free_msh(t_msh *msh);
|
void free_msh(t_msh *msh);
|
||||||
int echo(t_token *args);
|
int echo(t_token *args);
|
||||||
int exit_bt(t_msh *msh);
|
int exit_bt(t_msh *msh);
|
||||||
int is_cmd_type(t_cmd *cmd);
|
|
||||||
int is_cmd_char(char c);
|
int is_cmd_char(char c);
|
||||||
void ambiguous_redirect(char *str, t_msh *msh);
|
int is_fd_open(int fd);
|
||||||
int cd(t_token *args, t_msh *msh);
|
|
||||||
int pwd(void);
|
int pwd(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/04/19 14:09:44 by tomoron #+# #+# */
|
/* Created: 2024/04/19 14:09:44 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/25 18:39:52 by tomoron ### ########.fr */
|
/* Updated: 2024/05/06 14:43:45 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -65,12 +65,33 @@ void go_to_next_out_type(t_cmd **cur_cmd)
|
|||||||
*cur_cmd = (*cur_cmd)->next;
|
*cur_cmd = (*cur_cmd)->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_out_type(t_msh *msh, t_cmd *cur_cmd)
|
void get_out_file(t_msh *msh, t_cmd *cur_cmd, int *ret)
|
||||||
{
|
{
|
||||||
t_token *filename;
|
t_token *filename;
|
||||||
|
|
||||||
|
msh->out_type = cur_cmd->cmd_type;
|
||||||
|
if (ft_strchr(cur_cmd->value, '$'))
|
||||||
|
{
|
||||||
|
ambiguous_redirect(cur_cmd->value, msh);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
filename = parse_tokens(cur_cmd->value, msh->env);
|
||||||
|
if (!filename)
|
||||||
|
ft_exit(msh, 1);
|
||||||
|
if (filename->next)
|
||||||
|
ambiguous_redirect(cur_cmd->value, msh);
|
||||||
|
if (!filename->next)
|
||||||
|
*ret = open_out_file(msh, &cur_cmd, filename->value);
|
||||||
|
free_token(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_out_type(t_msh *msh, t_cmd *cur_cmd)
|
||||||
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
msh->out_type = CMD;
|
msh->out_type = CMD;
|
||||||
|
if (msh->out_fd > 2)
|
||||||
|
close(msh->out_fd);
|
||||||
msh->out_fd = 0;
|
msh->out_fd = 0;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
go_to_next_out_type(&cur_cmd);
|
go_to_next_out_type(&cur_cmd);
|
||||||
@ -78,18 +99,8 @@ int get_out_type(t_msh *msh, t_cmd *cur_cmd)
|
|||||||
msh->out_type = 0;
|
msh->out_type = 0;
|
||||||
else if (cur_cmd && is_output_type(cur_cmd) && !is_operand_type(cur_cmd)
|
else if (cur_cmd && is_output_type(cur_cmd) && !is_operand_type(cur_cmd)
|
||||||
&& cur_cmd->cmd_type != PIPE)
|
&& cur_cmd->cmd_type != PIPE)
|
||||||
{
|
get_out_file(msh, cur_cmd, &ret);
|
||||||
msh->out_type = cur_cmd->cmd_type;
|
|
||||||
filename = parse_tokens(cur_cmd->value, msh->env);
|
|
||||||
if (!filename)
|
|
||||||
ft_exit(msh, 1);
|
|
||||||
if (filename->next)
|
|
||||||
ambiguous_redirect(cur_cmd->value, msh);
|
|
||||||
if (!filename->next)
|
|
||||||
ret = open_out_file(msh, &cur_cmd, filename->value);
|
|
||||||
free_token(filename);
|
|
||||||
}
|
|
||||||
else if (cur_cmd && cur_cmd->cmd_type == PIPE)
|
else if (cur_cmd && cur_cmd->cmd_type == PIPE)
|
||||||
msh->out_type = PIPE;
|
msh->out_type = PIPE;
|
||||||
return (ret || msh->in_fd == -1);
|
return (ret || msh->in_fd == -2);
|
||||||
}
|
}
|
||||||
|
@ -6,16 +6,11 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/09 15:26:01 by tomoron #+# #+# */
|
/* Created: 2024/02/09 15:26:01 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/24 20:39:35 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/22 13:52:40 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
|
|
||||||
int is_cmd_char(char c)
|
|
||||||
{
|
|
||||||
return (!ft_isspace(c) && c != '|' && c != '&' && c != '<' && c != '>');
|
|
||||||
}
|
|
||||||
|
|
||||||
int add_home_to_str(char *res)
|
int add_home_to_str(char *res)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -23,15 +18,20 @@ int add_home_to_str(char *res)
|
|||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
str = getenv("HOME");
|
str = getenv("HOME");
|
||||||
while (str[i])
|
while (str && str[i])
|
||||||
{
|
{
|
||||||
res[i] = str[i];
|
res[i] = str[i];
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
if (!str)
|
||||||
|
{
|
||||||
|
res[i] = '~';
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
return (i);
|
return (i);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *get_token(char **cmd, int *quotes[2], t_env *env, int *is_var)
|
char *get_token(char **cmd, int quotes[2])
|
||||||
{
|
{
|
||||||
char *res;
|
char *res;
|
||||||
int i;
|
int i;
|
||||||
@ -39,19 +39,16 @@ char *get_token(char **cmd, int *quotes[2], t_env *env, int *is_var)
|
|||||||
i = 0;
|
i = 0;
|
||||||
while (ft_isspace(**cmd))
|
while (ft_isspace(**cmd))
|
||||||
(*cmd)++;
|
(*cmd)++;
|
||||||
res = ft_calloc(get_token_len(*cmd, env) + 1, 1);
|
res = ft_calloc(get_token_len(*cmd) + 1, 1);
|
||||||
while (res && **cmd && (is_cmd_char(**cmd) || *(quotes[0]) || *(quotes[1])))
|
while (res && **cmd && (!ft_isspace(**cmd) || quotes[0] || quotes[1]))
|
||||||
{
|
{
|
||||||
if (**cmd == '"' && !*(quotes[0]))
|
if (**cmd == '"' && !quotes[0])
|
||||||
*(quotes[1]) = !*(quotes[1]);
|
quotes[1] = !quotes[1];
|
||||||
if (**cmd == '\'' && !*(quotes[1]))
|
if (**cmd == '\'' && !quotes[1])
|
||||||
*(quotes[0]) = !*(quotes[0]);
|
quotes[0] = !quotes[0];
|
||||||
if (**cmd == '$' && !*(quotes[0]))
|
else if (**cmd == '~' && !quotes[0] && !quotes[1])
|
||||||
i += add_var_to_str(res + i, cmd, env, is_var);
|
|
||||||
else if (**cmd == '~' && !*(quotes[0]) && !*(quotes[1]))
|
|
||||||
i += add_home_to_str(res + i);
|
i += add_home_to_str(res + i);
|
||||||
else if (((**cmd == '\'' && *(quotes[1]))
|
else if (((**cmd == '\'' && quotes[1]) || (**cmd == '"' && quotes[0]))
|
||||||
|| (**cmd == '"' && *(quotes[0])))
|
|
||||||
|| (**cmd != '\'' && **cmd != '"'))
|
|| (**cmd != '\'' && **cmd != '"'))
|
||||||
res[i++] = **cmd;
|
res[i++] = **cmd;
|
||||||
(*cmd)++;
|
(*cmd)++;
|
||||||
@ -61,27 +58,29 @@ char *get_token(char **cmd, int *quotes[2], t_env *env, int *is_var)
|
|||||||
|
|
||||||
t_token *parse_tokens(char *command, t_env *env)
|
t_token *parse_tokens(char *command, t_env *env)
|
||||||
{
|
{
|
||||||
int in_quote;
|
int quotes[2];
|
||||||
int in_dquote;
|
char *tmp;
|
||||||
t_token *res;
|
t_token *res;
|
||||||
char *value;
|
char *value;
|
||||||
int is_var;
|
int is_var;
|
||||||
|
|
||||||
in_quote = 0;
|
quotes[0] = 0;
|
||||||
in_dquote = 0;
|
quotes[1] = 0;
|
||||||
res = 0;
|
res = 0;
|
||||||
is_var = 0;
|
is_var = 0;
|
||||||
|
command = expand_variables(command, env, &is_var);
|
||||||
|
tmp = command;
|
||||||
while (command && *command)
|
while (command && *command)
|
||||||
{
|
{
|
||||||
value = get_token(&command, (int *[2]){&in_quote, &in_dquote},
|
value = get_token(&command, quotes);
|
||||||
env, &is_var);
|
|
||||||
if (!value)
|
if (!value)
|
||||||
return (free_token(res));
|
return (free_token(res));
|
||||||
res = expand_wildcards(res, value, is_var);
|
res = expand_wildcards(res, value, is_var);
|
||||||
while (ft_isspace(*command))
|
while (ft_isspace(*command))
|
||||||
command++;
|
command++;
|
||||||
}
|
}
|
||||||
if (command && (in_quote || in_dquote))
|
free(tmp);
|
||||||
|
if (tmp && (quotes[0] || quotes[1]))
|
||||||
return (parsing_syntax_error(res));
|
return (parsing_syntax_error(res));
|
||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/03/27 14:40:44 by tomoron #+# #+# */
|
/* Created: 2024/03/27 14:40:44 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/24 14:53:19 by tomoron ### ########.fr */
|
/* Updated: 2024/04/26 14:32:51 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
24
srcs/parsing_utils.c
Normal file
24
srcs/parsing_utils.c
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* parsing_utils.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2024/05/22 13:49:17 by tomoron #+# #+# */
|
||||||
|
/* Updated: 2024/05/22 13:50:31 by tomoron ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
int get_home_var_len(void)
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
|
||||||
|
str = getenv("HOME");
|
||||||
|
if (!str)
|
||||||
|
return (1);
|
||||||
|
else
|
||||||
|
return (ft_strlen("HOME"));
|
||||||
|
}
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/09 15:24:36 by tomoron #+# #+# */
|
/* Created: 2024/02/09 15:24:36 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/24 17:59:47 by tomoron ### ########.fr */
|
/* Updated: 2024/05/22 13:52:29 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -22,14 +22,22 @@ char *get_var_name(char *command)
|
|||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_var_len(char **command, t_env *env)
|
int get_var_len(char **command, t_env *env, int in_dquote)
|
||||||
{
|
{
|
||||||
char *var_name;
|
char *var_name;
|
||||||
char *env_var;
|
char *env_var;
|
||||||
|
|
||||||
(*command)++;
|
(*command)++;
|
||||||
if (**command == '\'' || **command == '"' || !**command)
|
if ((**command == '\'' || **command == '"') && !in_dquote)
|
||||||
|
{
|
||||||
|
(*command)--;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (!**command || (**command == '"' && in_dquote))
|
||||||
|
{
|
||||||
|
(*command)--;
|
||||||
return (1);
|
return (1);
|
||||||
|
}
|
||||||
if (!ft_isalnum(**command) && **command != '_' && **command != '?')
|
if (!ft_isalnum(**command) && **command != '_' && **command != '?')
|
||||||
return (2);
|
return (2);
|
||||||
if (**command == '?')
|
if (**command == '?')
|
||||||
@ -43,7 +51,7 @@ int get_var_len(char **command, t_env *env)
|
|||||||
return (ft_strlen(env_var));
|
return (ft_strlen(env_var));
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_token_len(char *command, t_env *env)
|
int get_token_len(char *command)
|
||||||
{
|
{
|
||||||
int in_quote;
|
int in_quote;
|
||||||
int in_dquote;
|
int in_dquote;
|
||||||
@ -52,16 +60,14 @@ int get_token_len(char *command, t_env *env)
|
|||||||
in_quote = 0;
|
in_quote = 0;
|
||||||
in_dquote = 0;
|
in_dquote = 0;
|
||||||
res = 0;
|
res = 0;
|
||||||
while (*command && (is_cmd_char(*command) || in_quote || in_dquote))
|
while (*command && (!ft_isspace(*command) || in_quote || in_dquote))
|
||||||
{
|
{
|
||||||
if (*command == '"' && !in_quote)
|
if (*command == '"' && !in_quote)
|
||||||
in_dquote = !in_dquote;
|
in_dquote = !in_dquote;
|
||||||
if (*command == '\'' && !in_dquote)
|
if (*command == '\'' && !in_dquote)
|
||||||
in_quote = !in_quote;
|
in_quote = !in_quote;
|
||||||
if (*command == '$' && !in_quote)
|
|
||||||
res += get_var_len(&command, env);
|
|
||||||
else if (*command == '~' && !in_quote && !in_dquote)
|
else if (*command == '~' && !in_quote && !in_dquote)
|
||||||
res += ft_strlen(getenv("HOME"));
|
res += get_home_var_len();
|
||||||
else if (*command != '\'' && *command != '"')
|
else if (*command != '\'' && *command != '"')
|
||||||
res++;
|
res++;
|
||||||
else if ((*command == '\'' && in_dquote) || (*command == '"'
|
else if ((*command == '\'' && in_dquote) || (*command == '"'
|
||||||
@ -79,7 +85,7 @@ int invalid_variable_char(char *res, char c)
|
|||||||
return (2);
|
return (2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int add_var_to_str(char *res, char **command, t_env *env, int *is_var)
|
int add_var_to_str(char *res, char **command, t_env *env, int dquote)
|
||||||
{
|
{
|
||||||
char *var_name;
|
char *var_name;
|
||||||
char *var;
|
char *var;
|
||||||
@ -87,12 +93,12 @@ int add_var_to_str(char *res, char **command, t_env *env, int *is_var)
|
|||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
(*command)++;
|
(*command)++;
|
||||||
*is_var = 1;
|
|
||||||
if (**command == '\'' || **command == '"' || !**command)
|
if (**command == '\'' || **command == '"' || !**command)
|
||||||
{
|
{
|
||||||
|
if ((**command != '\'' && **command != '"') || dquote)
|
||||||
*res = '$';
|
*res = '$';
|
||||||
(*command)--;
|
(*command)--;
|
||||||
return (1);
|
return ((*(*command + 1) != '\'' && *(*command + 1) != '"') || dquote);
|
||||||
}
|
}
|
||||||
if (!ft_isalnum(**command) && **command != '_' && **command != '?')
|
if (!ft_isalnum(**command) && **command != '_' && **command != '?')
|
||||||
return (invalid_variable_char(res, **command));
|
return (invalid_variable_char(res, **command));
|
||||||
@ -104,5 +110,5 @@ int add_var_to_str(char *res, char **command, t_env *env, int *is_var)
|
|||||||
while (var && var[i++])
|
while (var && var[i++])
|
||||||
res[i - 1] = var[i - 1];
|
res[i - 1] = var[i - 1];
|
||||||
*command += get_var_name_len(*command) - 1;
|
*command += get_var_name_len(*command) - 1;
|
||||||
return (i - 1);
|
return (i - (1 - (i == 0)));
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/02/21 21:47:15 by marde-vr #+# #+# */
|
/* Created: 2024/02/21 21:47:15 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/24 20:37:41 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/07 16:08:17 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -60,7 +60,8 @@ void get_path(t_msh *msh, int *found)
|
|||||||
char **paths;
|
char **paths;
|
||||||
|
|
||||||
paths = split_paths_from_env(msh->env);
|
paths = split_paths_from_env(msh->env);
|
||||||
if (!paths || !*(msh->tokens->value))
|
if (!paths || !*(msh->tokens->value)
|
||||||
|
|| ft_str_is_only_char(msh->tokens->value, '.'))
|
||||||
{
|
{
|
||||||
free_paths(paths);
|
free_paths(paths);
|
||||||
return ;
|
return ;
|
||||||
@ -98,8 +99,7 @@ void get_cmd_path(t_msh *msh)
|
|||||||
ft_printf_fd(2, "'': command not found\n");
|
ft_printf_fd(2, "'': command not found\n");
|
||||||
else
|
else
|
||||||
ft_printf_fd(2, "%s: command not found\n", msh->tokens->value);
|
ft_printf_fd(2, "%s: command not found\n", msh->tokens->value);
|
||||||
free(msh->tokens->value);
|
close_all_pipes(msh);
|
||||||
msh->tokens->value = 0;
|
|
||||||
g_return_code = 127;
|
g_return_code = 127;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
23
srcs/pipe.c
23
srcs/pipe.c
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/03/05 18:17:25 by marde-vr #+# #+# */
|
/* Created: 2024/03/05 18:17:25 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/26 10:49:45 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/06 14:06:33 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -14,17 +14,20 @@
|
|||||||
|
|
||||||
void close_pipe_fds(t_msh *msh, int i)
|
void close_pipe_fds(t_msh *msh, int i)
|
||||||
{
|
{
|
||||||
|
if (msh->fds)
|
||||||
|
{
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
{
|
{
|
||||||
if (msh->fds[i - 1][0] > 2)
|
if (msh->fds[i - 1] && msh->fds[i - 1][0] > 2)
|
||||||
close(msh->fds[i - 1][0]);
|
close(msh->fds[i - 1][0]);
|
||||||
if (msh->fds[i - 1][1] > 2)
|
if (msh->fds[i - 1] && msh->fds[i - 1][1] > 2)
|
||||||
close(msh->fds[i - 1][1]);
|
close(msh->fds[i - 1][1]);
|
||||||
}
|
}
|
||||||
if (msh->fds[i][0] > 2)
|
if (msh->fds[i] && msh->fds[i][0] > 2)
|
||||||
close(msh->fds[i][0]);
|
close(msh->fds[i][0]);
|
||||||
if (msh->fds[i][1] > 2)
|
if (msh->fds[i] && msh->fds[i][1] > 2)
|
||||||
close(msh->fds[i][1]);
|
close(msh->fds[i][1]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_parenthesis(t_msh *msh)
|
void handle_parenthesis(t_msh *msh)
|
||||||
@ -50,7 +53,6 @@ void handle_parenthesis(t_msh *msh)
|
|||||||
msh->out_fd = 0;
|
msh->out_fd = 0;
|
||||||
msh->locked_return_code = 0;
|
msh->locked_return_code = 0;
|
||||||
exec_command_bonus(msh, command);
|
exec_command_bonus(msh, command);
|
||||||
free(command);
|
|
||||||
ft_exit(msh, g_return_code);
|
ft_exit(msh, g_return_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,10 +74,7 @@ void execute_command(t_msh *msh, char **cmd_args)
|
|||||||
{
|
{
|
||||||
env = env_to_char_tab(msh->env);
|
env = env_to_char_tab(msh->env);
|
||||||
if (env)
|
if (env)
|
||||||
{
|
execve(msh->tokens->value, cmd_args, env);
|
||||||
if (execve(msh->tokens->value, cmd_args, env))
|
|
||||||
perror("execve");
|
|
||||||
}
|
|
||||||
ft_free_str_arr(env);
|
ft_free_str_arr(env);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,6 +89,10 @@ void child(t_msh *msh, char **cmd_args, int i)
|
|||||||
|| msh->out_type == RED_O_APP)
|
|| msh->out_type == RED_O_APP)
|
||||||
redirect_output(msh, i, cmd_args);
|
redirect_output(msh, i, cmd_args);
|
||||||
close_pipe_fds(msh, i);
|
close_pipe_fds(msh, i);
|
||||||
|
if (msh->in_fd > 2)
|
||||||
|
close(msh->in_fd);
|
||||||
|
if (msh->out_fd > 2)
|
||||||
|
close(msh->out_fd);
|
||||||
execute_command(msh, cmd_args);
|
execute_command(msh, cmd_args);
|
||||||
close(0);
|
close(0);
|
||||||
close(1);
|
close(1);
|
||||||
|
32
srcs/redirection_utils.c
Normal file
32
srcs/redirection_utils.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* redirection_utils.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2024/05/03 14:11:22 by marde-vr #+# #+# */
|
||||||
|
/* Updated: 2024/05/03 14:11:50 by marde-vr ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
void ambiguous_redirect(char *str, t_msh *msh)
|
||||||
|
{
|
||||||
|
ft_printf_fd(2, "minishell: %s: ambiguous redirect\n", str);
|
||||||
|
msh->in_fd = -2;
|
||||||
|
g_return_code = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int first_is_in_type(t_cmd *cmd)
|
||||||
|
{
|
||||||
|
t_cmd *cur_token;
|
||||||
|
|
||||||
|
cur_token = cmd;
|
||||||
|
while (cur_token && cur_token->cmd_type == CMD && cur_token->next)
|
||||||
|
cur_token = cur_token->next;
|
||||||
|
if (is_input_type(cur_token) || cur_token->cmd_type == PIPE)
|
||||||
|
return (1);
|
||||||
|
return (0);
|
||||||
|
}
|
15
srcs/utils.c
15
srcs/utils.c
@ -6,7 +6,7 @@
|
|||||||
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/03/05 18:19:26 by marde-vr #+# #+# */
|
/* Created: 2024/03/05 18:19:26 by marde-vr #+# #+# */
|
||||||
/* Updated: 2024/04/26 10:53:29 by marde-vr ### ########.fr */
|
/* Updated: 2024/05/07 17:07:16 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -15,6 +15,7 @@
|
|||||||
void ft_exit(t_msh *msh, int exit_code)
|
void ft_exit(t_msh *msh, int exit_code)
|
||||||
{
|
{
|
||||||
free_msh(msh);
|
free_msh(msh);
|
||||||
|
rl_clear_history();
|
||||||
exit(exit_code);
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,3 +73,15 @@ int file_access(t_msh *msh, int *found)
|
|||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void close_all_pipes(t_msh *msh)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (msh->fds && msh->fds[i])
|
||||||
|
{
|
||||||
|
close_pipe_fds(msh, i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
64
srcs/variable_expantion.c
Normal file
64
srcs/variable_expantion.c
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* variable_expantion.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2024/05/06 10:57:33 by tomoron #+# #+# */
|
||||||
|
/* Updated: 2024/05/08 12:29:17 by tomoron ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
int get_variable_expantion_len(char *command, t_env *env)
|
||||||
|
{
|
||||||
|
int in_quote;
|
||||||
|
int in_dquote;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
in_dquote = 0;
|
||||||
|
in_quote = 0;
|
||||||
|
while (*command)
|
||||||
|
{
|
||||||
|
if (*command == '\'' && !in_dquote)
|
||||||
|
in_quote = !in_quote;
|
||||||
|
if (*command == '"' && !in_quote)
|
||||||
|
in_dquote = !in_dquote;
|
||||||
|
if (*command == '$' && !in_quote)
|
||||||
|
i += get_var_len(&command, env, in_dquote);
|
||||||
|
else
|
||||||
|
i++;
|
||||||
|
command++;
|
||||||
|
}
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *expand_variables(char *command, t_env *env, int *is_var)
|
||||||
|
{
|
||||||
|
char *res;
|
||||||
|
int i;
|
||||||
|
int in_dquote;
|
||||||
|
int in_quote;
|
||||||
|
|
||||||
|
if (!command)
|
||||||
|
return (0);
|
||||||
|
res = ft_calloc(get_variable_expantion_len(command, env) + 1, 1);
|
||||||
|
in_quote = 0;
|
||||||
|
in_dquote = 0;
|
||||||
|
i = 0;
|
||||||
|
while (res && *command)
|
||||||
|
{
|
||||||
|
if (*command == '\'' && !in_dquote)
|
||||||
|
in_quote = !in_quote;
|
||||||
|
if (*command == '"' && !in_quote)
|
||||||
|
in_dquote = !in_dquote;
|
||||||
|
if (*command == '$' && !in_quote && ++(*is_var))
|
||||||
|
i += add_var_to_str(res + i, &command, env, in_dquote);
|
||||||
|
else
|
||||||
|
res[i++] = *command;
|
||||||
|
command++;
|
||||||
|
}
|
||||||
|
return (res);
|
||||||
|
}
|
@ -6,11 +6,22 @@
|
|||||||
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/04/15 12:53:29 by tomoron #+# #+# */
|
/* Created: 2024/04/15 12:53:29 by tomoron #+# #+# */
|
||||||
/* Updated: 2024/04/26 10:49:36 by marde-vr ### ########.fr */
|
/* Updated: 2024/04/29 11:12:40 by marde-vr ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
|
|
||||||
|
int recursive_filename_check(char *wildcard, char **value)
|
||||||
|
{
|
||||||
|
while (**value)
|
||||||
|
{
|
||||||
|
if (filename_corresponds(wildcard + 1, *value))
|
||||||
|
return (1);
|
||||||
|
(*value)++;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
int filename_corresponds(char *wildcard, char *value)
|
int filename_corresponds(char *wildcard, char *value)
|
||||||
{
|
{
|
||||||
if (*value == '.' && *wildcard != '.')
|
if (*value == '.' && *wildcard != '.')
|
||||||
@ -23,8 +34,7 @@ int filename_corresponds(char *wildcard, char *value)
|
|||||||
wildcard++;
|
wildcard++;
|
||||||
if (!wildcard[1])
|
if (!wildcard[1])
|
||||||
return (1);
|
return (1);
|
||||||
while (*value)
|
if (recursive_filename_check(wildcard, &value))
|
||||||
if (filename_corresponds(wildcard + 1, value++))
|
|
||||||
return (1);
|
return (1);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -32,6 +42,8 @@ int filename_corresponds(char *wildcard, char *value)
|
|||||||
{
|
{
|
||||||
wildcard++;
|
wildcard++;
|
||||||
value++;
|
value++;
|
||||||
|
if (ft_str_is_only_char(wildcard, '*') && !*value)
|
||||||
|
return (1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return (0);
|
return (0);
|
||||||
|
16
todo_list
16
todo_list
@ -1,16 +0,0 @@
|
|||||||
|
|
||||||
Cat makefile | (echo yes && rev) leaks
|
|
||||||
echo yes && echo yes && cat dhdgdgjsk || echo a leaks
|
|
||||||
echo abc && echo def | cat | rev && echo yes
|
|
||||||
(), ((())), (())
|
|
||||||
export leaks AAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
To test:
|
|
||||||
Open file descriptor with cat << eof | ls open fd and infinte loop
|
|
||||||
|
|
||||||
test signals
|
|
||||||
test and verify all malocs
|
|
||||||
verify forbidden functions
|
|
||||||
check for any hidden or useless files
|
|
Reference in New Issue
Block a user