diff options
author | Arun Prakash Jana <engineerarun@gmail.com> | 2019-02-08 20:31:37 +0530 |
---|---|---|
committer | Arun Prakash Jana <engineerarun@gmail.com> | 2019-02-08 20:39:09 +0530 |
commit | 2f32c32c7b1290e27fd0d51b35aaa93bcb129971 (patch) | |
tree | c0cd88ce6611fe61eca4383622a90e17507de846 /src | |
parent | c07efcacc0f25391529a539138832948eccc8bf1 (diff) | |
download | nnn-2f32c32c7b1290e27fd0d51b35aaa93bcb129971.tar.gz |
Support du abort on Ctrl-C
Diffstat (limited to 'src')
-rw-r--r-- | src/nnn.c | 21 |
1 files changed, 20 insertions, 1 deletions
@@ -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 */ |