aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2019-02-08 20:31:37 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2019-02-08 20:39:09 +0530
commit2f32c32c7b1290e27fd0d51b35aaa93bcb129971 (patch)
treec0cd88ce6611fe61eca4383622a90e17507de846 /src
parentc07efcacc0f25391529a539138832948eccc8bf1 (diff)
downloadnnn-2f32c32c7b1290e27fd0d51b35aaa93bcb129971.tar.gz
Support du abort on Ctrl-C
Diffstat (limited to 'src')
-rw-r--r--src/nnn.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/nnn.c b/src/nnn.c
index 53e54ec..59709c7 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -330,6 +330,7 @@ static bm bookmark[BM_MAX];
static size_t g_tmpfplen; /* path to tmp files for copy without X, keybind help and file stats */
static uchar g_crc;
static uchar BLK_SHIFT = 9;
+static bool interrupted = FALSE;
/* For use in functions which are isolated and don't return the buffer */
static char g_buf[CMD_LEN_MAX] __attribute__ ((aligned));
@@ -538,6 +539,11 @@ static uchar crc8fast(uchar const message[], size_t n)
return remainder;
}
+static void signal_handler(int signum)
+{
+ interrupted = TRUE;
+}
+
/* Messages show up at the bottom */
static void printmsg(const char *msg)
{
@@ -2568,6 +2574,9 @@ static int dentfill(char *path, struct entry **dents)
: sb.st_blocks);
} else
dir_blocks += ent_blocks;
+
+ if (interrupted)
+ return n;
}
} else {
dir_blocks += (cfg.apparentsz ? sb.st_size : sb.st_blocks);
@@ -2646,6 +2655,9 @@ static int dentfill(char *path, struct entry **dents)
dir_blocks += dentp->blocks;
else
num_files = num_saved;
+
+ if (interrupted)
+ return n;
} else {
dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks);
dir_blocks += dentp->blocks;
@@ -2947,6 +2959,13 @@ begin:
}
populate(path, lastname);
+ if (interrupted) {
+ interrupted = FALSE;
+ signal(SIGINT, &signal_handler);
+ cfg.apparentsz = 0;
+ cfg.blkorder = 0;
+ BLK_SHIFT = 9;
+ }
#ifdef LINUX_INOTIFY
if (presel != FILTER && inotify_wd == -1) {
@@ -4212,7 +4231,7 @@ int main(int argc, char *argv[])
cfg.restrict0b = 1;
/* Ignore certain signals */
- signal(SIGINT, SIG_IGN);
+ signal(SIGINT, &signal_handler);
signal(SIGQUIT, SIG_IGN);
/* Test initial path */