aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2020-10-10 13:49:58 +0200
committerCharles Cabergs <me@cacharle.xyz>2020-10-10 13:49:58 +0200
commitcfd5d10a4f9f816ecaea6ab7bc99559c9dc758fa (patch)
treee9ae50d947c1ff8b10c5d707b07ce4b2864a487c /src
parentf5579768b8e27dbba16101dc3295927c15b36a1a (diff)
downloadminishell-cfd5d10a4f9f816ecaea6ab7bc99559c9dc758fa.tar.gz
minishell-cfd5d10a4f9f816ecaea6ab7bc99559c9dc758fa.tar.bz2
minishell-cfd5d10a4f9f816ecaea6ab7bc99559c9dc758fa.zip
Fixing SHLVL increment
Diffstat (limited to 'src')
-rw-r--r--src/setup.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/setup.c b/src/setup.c
index 7affe7f..ec00339 100644
--- a/src/setup.c
+++ b/src/setup.c
@@ -6,7 +6,7 @@
/* By: charles <me@cacharle.xyz> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/09/16 15:46:09 by charles #+# #+# */
-/* Updated: 2020/10/10 11:19:44 by cacharle ### ########.fr */
+/* Updated: 2020/10/10 13:49:11 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -40,7 +40,6 @@ bool setup_env(t_env env)
if (!(getcwd(buf, PATH_MAX)))
return (false);
if (!st_export_default(env, "PWD", buf) ||
- !st_export_default(env, "SHLVL", "1") ||
!st_export_default(env, "PATH", "/sbin:"))
return (false);
if (path_search(env, "env", buf, false) != 0)
@@ -58,12 +57,28 @@ bool setup_env(t_env env)
bool setup_shlvl(t_env env)
{
char shlvl_str[64];
- char *shlvl_value;
+ char *shlvl_old;
+ int value;
+ char *end;
- shlvl_value = env_search(env, "SHLVL", NULL);
- if (shlvl_value == NULL)
- return (false);
- ft_itoa_cpy(shlvl_str, ft_atoi(shlvl_str));
+ shlvl_old = env_search(env, "SHLVL", NULL);
+ if (shlvl_old == NULL)
+ shlvl_old = "0";
+ errno = 0;
+ value = (int)ft_strtol(shlvl_old, &end, 10);
+ if (errno != 0 || *end != '\0')
+ value = 0;
+ value++;
+ if (value < 0)
+ value = 0;
+ if (value > 1000)
+ {
+ errorf("warning: shell level (");
+ ft_putnbr_fd(value, STDERR_FILENO);
+ ft_putstr_fd(") too high, resetting to 1\n", STDERR_FILENO);
+ value = 1;
+ }
+ ft_itoa_cpy(shlvl_str, value);
return (env_export(env, "SHLVL", shlvl_str) != NULL);
}
@@ -99,5 +114,5 @@ bool setup(char *first_arg, t_env env)
signal(SIGQUIT, signal_sigquit);
signal(SIGTERM, signal_sigterm);
setup_progname(first_arg);
- return (setup_env(env) || setup_shlvl(env));
+ return (setup_env(env) && setup_shlvl(env));
}