aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-07-19 17:09:46 +0200
committerCharles <sircharlesaze@gmail.com>2020-07-19 17:09:46 +0200
commita478d95bed0f24f9783714600af48a6c1cde2aae (patch)
tree795385ad007440663d6b8e2a2c0582eb4525e77c
parente9a8977e3867a4a5d93e405c82acc1aac44a0678 (diff)
downloadminishell-a478d95bed0f24f9783714600af48a6c1cde2aae.tar.gz
minishell-a478d95bed0f24f9783714600af48a6c1cde2aae.tar.bz2
minishell-a478d95bed0f24f9783714600af48a6c1cde2aae.zip
Fixing directory cmd and $?
-rw-r--r--src/eval/cmd.c29
-rw-r--r--src/main.c3
-rw-r--r--src/preprocess.c6
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);
}
diff --git a/src/main.c b/src/main.c
index 3d910f8..9091887 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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] == '$')
{