summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/ncdu.pod6
-rw-r--r--src/shell.c17
2 files changed, 23 insertions, 0 deletions
diff --git a/doc/ncdu.pod b/doc/ncdu.pod
index 7fc04f5..02ac48a 100644
--- a/doc/ncdu.pod
+++ b/doc/ncdu.pod
@@ -287,6 +287,12 @@ run ncdu as follows:
export NCDU_SHELL=vifm
ncdu
+Ncdu will set the C<NCDU_LEVEL> environment variable or increment it before
+spawning the shell. This variable allows you to detect when your shell is
+running from within ncdu, which can be useful to avoid nesting multiple
+instances of ncdu. Ncdu itself does not (currently) warn when attempting to run
+nested instances.
+
=item q
Quit
diff --git a/src/shell.c b/src/shell.c
index fd589e6..b881700 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -34,6 +34,22 @@
#include <unistd.h>
#include <sys/wait.h>
+static void set_level(void) {
+ static int done = 0;
+ char nlvl[2];
+ if(done)
+ return;
+ const char *lvl = getenv("NCDU_LEVEL");
+ // too lazy to count beyond 9
+ if(lvl && *lvl >= '1' && *lvl < '9' && lvl[1] == 0) {
+ nlvl[0] = 1 + *lvl;
+ nlvl[1] = 0;
+ setenv("NCDU_LEVEL", nlvl, 1);
+ } else
+ setenv("NCDU_LEVEL", "1", 1);
+ done++;
+}
+
void shell_draw() {
const char *full_path;
int res;
@@ -59,6 +75,7 @@ void shell_draw() {
shell = DEFAULT_SHELL;
}
+ set_level();
res = system(shell);
/* resume ncurses mode */