diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-07-19 17:09:46 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-07-19 17:09:46 +0200 |
| commit | a478d95bed0f24f9783714600af48a6c1cde2aae (patch) | |
| tree | 795385ad007440663d6b8e2a2c0582eb4525e77c /src | |
| parent | e9a8977e3867a4a5d93e405c82acc1aac44a0678 (diff) | |
| download | minishell-a478d95bed0f24f9783714600af48a6c1cde2aae.tar.gz minishell-a478d95bed0f24f9783714600af48a6c1cde2aae.tar.bz2 minishell-a478d95bed0f24f9783714600af48a6c1cde2aae.zip | |
Fixing directory cmd and $?
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval/cmd.c | 29 | ||||
| -rw-r--r-- | src/main.c | 3 | ||||
| -rw-r--r-- | src/preprocess.c | 6 |
3 files changed, 28 insertions, 10 deletions
diff --git a/src/eval/cmd.c b/src/eval/cmd.c index 1e59347..a7a6f71 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/07/18 09:31:43 by charles ### ########.fr */ +/* Updated: 2020/07/19 16:53:54 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -65,15 +65,30 @@ int forked_cmd(void *void_param) return (param->builtin->func(param->argv, param->env)); else { + errno = 0; ret = execve(param->exec_path, param->argv, (char**)param->env->data); if (ret == -1) { - ft_putstr_fd(g_basename, STDERR_FILENO); - ft_putstr_fd(": ", STDERR_FILENO); - ft_putstr_fd(param->exec_path, STDERR_FILENO); - ft_putstr_fd(": ", STDERR_FILENO); - ft_putendl_fd(strerror(errno), STDERR_FILENO); - ret = 126; + if (errno == ENOEXEC) + return (0); + struct stat statbuf; + if (stat(param->exec_path, &statbuf) != -1 && S_ISDIR(statbuf.st_mode)) + { + ft_putstr_fd(g_basename, STDERR_FILENO); + ft_putstr_fd(": ", STDERR_FILENO); + ft_putstr_fd(param->exec_path, STDERR_FILENO); + ft_putendl_fd(": Is a directory", STDERR_FILENO); + ret = 126; + } + else + { + ft_putstr_fd(g_basename, STDERR_FILENO); + ft_putstr_fd(": ", STDERR_FILENO); + ft_putstr_fd(param->exec_path, STDERR_FILENO); + ft_putstr_fd(": ", STDERR_FILENO); + ft_putendl_fd(strerror(errno), STDERR_FILENO); + ret = 126; + } } return (ret); } @@ -6,7 +6,7 @@ /* By: cacharle <cacharle@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/07/19 15:48:02 by charles ### ########.fr */ +/* Updated: 2020/07/19 17:04:19 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,6 +37,7 @@ void ast_print(int level, t_ast *ast); ** signal on whole line instead of single command ** parsing error ** env local to current minishell process +** BETTER ERROR HANDLING IS BECOMING URGENT (spagetti code everywhere) */ char *g_basename = "minishell"; diff --git a/src/preprocess.c b/src/preprocess.c index 44558d4..f7e4538 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/07/17 11:20:26 by charles ### ########.fr */ +/* Updated: 2020/07/19 17:00:16 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,7 +36,9 @@ static char *st_iterpolate_env(char *str, enum e_token_tag tag, t_env env) while (++i < dstr->length) if (dstr->str[i] == '\\' && st_escapable(dstr->str[i + 1], tag)) ft_dstrerase(dstr, i, 1); - else if (dstr->str[i] == '$' && !ft_isalnum(dstr->str[i + 1]) && dstr->str[i + 1] != '_') // $ alone + else if (dstr->str[i] == '$' && !ft_isalnum(dstr->str[i + 1]) + && dstr->str[i + 1] != '_' + && dstr->str[i + 1] != '?') // $ alone continue; else if (dstr->str[i] == '$') { |
