aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-06-15 11:01:03 +0200
committerCharles <sircharlesaze@gmail.com>2020-06-15 11:01:03 +0200
commitec9177a513d1fdd510abcb70a9640d1bd94023f5 (patch)
tree35df0683a34f1182780be57866b5519cb28efb85
parent91d91b0f54ec9795beaf673f20ff87b894a558c4 (diff)
downloadminishell-ec9177a513d1fdd510abcb70a9640d1bd94023f5.tar.gz
minishell-ec9177a513d1fdd510abcb70a9640d1bd94023f5.tar.bz2
minishell-ec9177a513d1fdd510abcb70a9640d1bd94023f5.zip
Fixing leaks (need refactoring)
-rw-r--r--.gitignore1
-rw-r--r--include/eval.h7
-rw-r--r--include/minishell.h6
m---------libft0
-rw-r--r--src/builtin/echo.c7
-rw-r--r--src/eval/cmd.c100
-rw-r--r--src/main.c45
-rw-r--r--src/preprocess.c17
8 files changed, 110 insertions, 73 deletions
diff --git a/.gitignore b/.gitignore
index 8fa34d8..b30589d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ doc/*
tmp/*
.DS_Store
a.out
+vgcore.*
diff --git a/include/eval.h b/include/eval.h
index 55f1540..3ba7527 100644
--- a/include/eval.h
+++ b/include/eval.h
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/01 17:05:30 by charles #+# #+# */
-/* Updated: 2020/06/14 20:47:28 by charles ### ########.fr */
+/* Updated: 2020/06/15 10:31:06 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -87,6 +87,11 @@ typedef struct
// char *basename;
} t_error;
+/*
+** error.c
+*/
+
+void error_eval_put(enum e_error id, char *unexpected);
/*
** cmd.c
diff --git a/include/minishell.h b/include/minishell.h
index ccb5068..97b12e4 100644
--- a/include/minishell.h
+++ b/include/minishell.h
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/26 15:33:51 by cacharle #+# #+# */
-/* Updated: 2020/06/14 16:22:08 by charles ### ########.fr */
+/* Updated: 2020/06/15 09:47:20 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -109,7 +109,7 @@ int builtin_exit(char **argv, t_env env);
** preprocess.c
*/
-char **preprocess(t_ftlst *tokens, t_env env);
-char *preprocess_filename(t_ftlst *tokens, t_env env);
+char **preprocess(t_ftlst **tokens, t_env env);
+char *preprocess_filename(t_ftlst **tokens, t_env env);
#endif
diff --git a/libft b/libft
-Subproject 984a683f93a1a061714544532192b88b355ca5d
+Subproject 6bedda03a7f4f3c6ea190c506800f3aa1a3ac83
diff --git a/src/builtin/echo.c b/src/builtin/echo.c
index 886c2ca..0c4ff8b 100644
--- a/src/builtin/echo.c
+++ b/src/builtin/echo.c
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/01 17:10:47 by charles #+# #+# */
-/* Updated: 2020/04/02 11:18:16 by charles ### ########.fr */
+/* Updated: 2020/06/15 10:12:53 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -22,6 +22,11 @@ int builtin_echo(char **argv, t_env env)
bool newline;
(void)env;
+ if (argv[1] == NULL)
+ {
+ ft_putchar('\n');
+ return (0);
+ }
newline = !ft_strcmp(argv[1], "-n") == 0;
if (!newline)
argv++;
diff --git a/src/eval/cmd.c b/src/eval/cmd.c
index 027c75b..958c7ae 100644
--- a/src/eval/cmd.c
+++ b/src/eval/cmd.c
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/06/14 10:41:31 by charles #+# #+# */
-/* Updated: 2020/06/14 21:23:20 by charles ### ########.fr */
+/* Updated: 2020/06/15 10:58:59 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -23,10 +23,10 @@
*/
int fork_wrap(
- int fd_in,
- int fd_out,
- void *passed,
- int (*wrapped)(void *param))
+ int fd_in,
+ int fd_out,
+ void *passed,
+ int (*wrapped)(void *param))
{
int status;
pid_t child_pid;
@@ -46,12 +46,6 @@ int fork_wrap(
return (WEXITSTATUS(child_pid));
}
-/*
-** \brief execve syscall wrapper passed it to fork_wrap
-** \param param function params
-** \return execve return value
-*/
-
int forked_cmd(void *void_param)
{
t_fork_param_cmd *param;
@@ -64,26 +58,6 @@ int forked_cmd(void *void_param)
return (execve(param->exec_path, param->argv, (char**)param->env->data));
}
-int open_redirection(t_ftlst *filename_tokens, t_env env, int oflag)
-{
- // check in and out (single string)
- // argv[0]: [string]: ambiguous redirect code 1
-
- // check in and out (exist)
- // argv[0]: [string]: No such file or directory (probably from errno)
-
- char *filename;
- int fd;
-
- if (filename_tokens == NULL)
- return (MS_NO_FD);
- if ((filename = preprocess_filename(filename_tokens, env)) == NULL)
- return (-1);
- if ((fd = open(filename, oflag)) == -1)
- return (-1); //file error;
- return (fd);
-}
-
bool redir_has_tag(t_ftlst *redir, enum e_token_tag tags)
{
return (((t_token*)redir->data)->tag & tags);
@@ -111,27 +85,59 @@ bool redir_extract(t_ftlst *redirs, t_env env, int *fd_in, int *fd_out)
}
curr = curr->next;
}
- filename = preprocess_filename(redirs->next, env);
+ if ((filename = preprocess_filename(&redirs->next, env)) == NULL)
+ {
+ ft_lstdestroy(&redirs, (void (*)(void*))token_destroy);
+ ft_lstdestroy(&after, (void (*)(void*))token_destroy);
+ return (false);
+ }
if (redir_has_tag(redirs, TAG_REDIR_IN))
{
if (*fd_in != STDIN_FILENO)
close(*fd_in);
if ((*fd_in = open(filename, O_RDONLY)) == -1)
+ {
+ error_eval_put(ERROR_OPEN, filename);
+ ft_lstdestroy(&redirs, (void (*)(void*))token_destroy);
+ ft_lstdestroy(&after, (void (*)(void*))token_destroy);
+ free(filename);
return (false);
+ }
}
- else if (redir_has_tag(redirs, TAG_REDIR_OUT | TAG_REDIR_APPEND))
+ else if (redir_has_tag(redirs, TAG_REDIR_OUT))
{
if (*fd_out != STDOUT_FILENO)
close(*fd_out);
if ((*fd_out = open(filename,
- (redir_has_tag(redirs, TAG_REDIR_APPEND) ? O_APPEND : O_WRONLY)
- | O_CREAT | O_TRUNC, 0644)) == -1)
+ O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1)
+ {
+ error_eval_put(ERROR_OPEN, filename);
+ ft_lstdestroy(&redirs, (void (*)(void*))token_destroy);
+ ft_lstdestroy(&after, (void (*)(void*))token_destroy);
+ free(filename);
return (false);
+ }
+ }
+ else if (redir_has_tag(redirs, TAG_REDIR_APPEND))
+ {
+ if (*fd_out != STDOUT_FILENO)
+ close(*fd_out);
+ if ((*fd_out = open(filename,
+ O_WRONLY | O_APPEND | O_CREAT, 0644)) == -1)
+ {
+ error_eval_put(ERROR_OPEN, filename);
+ ft_lstdestroy(&redirs, (void (*)(void*))token_destroy);
+ ft_lstdestroy(&after, (void (*)(void*))token_destroy);
+ free(filename);
+ return (false);
+ }
}
+ ft_lstdestroy(&redirs, (void (*)(void*))token_destroy);
+ free(filename);
return (redir_extract(after, env, fd_in, fd_out));
}
-int eval_cmd(t_env env, t_path path, t_ast *ast)
+int eval_cmd(t_env env, t_path path, t_ast *ast)
{
t_fork_param_cmd param;
int fd_in;
@@ -141,21 +147,33 @@ int eval_cmd(t_env env, t_path path, t_ast *ast)
fd_in = STDIN_FILENO;
fd_out = STDOUT_FILENO;
if (!redir_extract(ast->redirs, env, &fd_in, &fd_out))
+ {
+ ast->redirs = NULL;
return (-1);
+ }
+ ast->redirs = NULL;
- argv = preprocess(ast->cmd_argv, env);
+ if ((argv = preprocess(&ast->cmd_argv, env)) == NULL)
+ {
+ ast->cmd_argv = NULL;
+ return (-1);
+ }
param.builtin = builtin_search_func(argv[0]);
if (param.builtin == NULL)
{
param.exec_path = exec_search_path(path, env_search(env, "PATH"), argv[0]);
- /* // get cmd path */
- /* // argv[0]: [string]: command not found code 127 */
if (param.exec_path == NULL)
- return (-1); //not_found;
+ {
+ error_eval_put(ERROR_CMD_NOT_FOUND, argv[0]);
+ ft_split_destroy(argv);
+ return (-1); // return error status
+ }
}
param.argv = argv;
param.env = env;
- return (fork_wrap(fd_in, fd_out, &param, &forked_cmd));
+ int ret = fork_wrap(fd_in, fd_out, &param, &forked_cmd);
+ ft_split_destroy(argv);
+ return (ret);
}
diff --git a/src/main.c b/src/main.c
index e81c634..ec99f51 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */
-/* Updated: 2020/06/14 21:21:01 by charles ### ########.fr */
+/* Updated: 2020/06/15 11:00:03 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -81,34 +81,34 @@ int main(int argc, char **argv, char **envp)
/* free(j); */
t_ftlst *args = NULL;
- ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "echo")));
- ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "bonjour")));
- ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "je")));
+ /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "echo"))); */
+ /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "bonjour"))); */
+ /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "je"))); */
- /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "cat"))); */
- /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-e"))); */
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "cat")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-e")));
/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "ls"))); */
/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-a"))); */
/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-l"))); */
- /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); */
- /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "|)}>#*.c"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "src#<{(|.c include#<{(|.h"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "$A$B"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR, "\\\\"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */
- /* ft_lstpush_back(&l, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); */
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM.")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "*/*.c")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src/*.c include/*.h")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST")));
+ ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST")));
t_ftlst *redirs = NULL;
- /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_IN, NULL))); */
- /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); */
+ ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_IN, NULL)));
+ ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour")));
ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL)));
ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo")));
@@ -117,6 +117,7 @@ int main(int argc, char **argv, char **envp)
ast->redirs = redirs;
printf("eval %d\n", eval_cmd(env, path, ast));
+ ast_destroy(ast);
/* char **as = preprocess(l, env); */
diff --git a/src/preprocess.c b/src/preprocess.c
index 278e8ef..1c59e28 100644
--- a/src/preprocess.c
+++ b/src/preprocess.c
@@ -6,13 +6,14 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/04/03 08:58:49 by charles #+# #+# */
-/* Updated: 2020/06/14 21:25:05 by charles ### ########.fr */
+/* Updated: 2020/06/15 10:47:24 by charles ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
#include "ms_glob.h"
#include "lexer.h"
+#include "eval.h"
static bool st_escapable(char c, enum e_token_tag tag)
{
@@ -114,14 +115,18 @@ static void st_iter_func_unwrap_token(void **addr)
}
// need to free argv on error
-char **preprocess(t_ftlst *tokens, t_env env)
+char **preprocess(t_ftlst **tokens, t_env env)
{
size_t i;
t_token *token;
t_ftvec *argv;
- if ((argv = ft_vecfrom_lst(tokens)) == NULL)
+ if ((argv = ft_vecfrom_lst(*tokens)) == NULL)
+ {
+ ft_lstdestroy(tokens, NULL);
return (NULL);
+ }
+ ft_lstdestroy(tokens, NULL);
i = -1;
while (++i < argv->size)
{
@@ -160,7 +165,7 @@ char **preprocess(t_ftlst *tokens, t_env env)
}
// need to free tokens
-char *preprocess_filename(t_ftlst *tokens, t_env env)
+char *preprocess_filename(t_ftlst **tokens, t_env env)
{
char **strs;
char *ret;
@@ -170,7 +175,9 @@ char *preprocess_filename(t_ftlst *tokens, t_env env)
return (NULL);
if (strs[1] != NULL)
{
- // ambiguous
+ // save tokens
+ error_eval_put(ERROR_AMBIGUOUS_REDIR, strs[1]);
+ ft_split_destroy(strs);
return (NULL);
}
ret = strs[0];