From 27617c0446455ed416c5348080a1a3dbde9338c6 Mon Sep 17 00:00:00 2001 From: KlzXS Date: Fri, 24 Jan 2020 14:28:43 +0100 Subject: [PATCH] Detach process with F_NOWAIT (#450) * Experimental PCRE library support To compile with PCRE install libpcre-dev(el) and run: cc -Wall -Wextra -O3 -DPCRE -D_GNU_SOURCE -D_DEFAULT_SOURCE -I/usr/include/ncursesw -I/usr/include -o nnn src/nnn.c -lreadline -lncursesw -ltinfo -lpcre * Detach process with F_NOWAIT Co-authored-by: Mischievous Meerkat --- src/nnn.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/nnn.c b/src/nnn.c index bcda5cc4..50052319 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -1279,6 +1279,7 @@ static int parseargs(char *line, char **argv) static pid_t xfork(uchar flag) { + int status; pid_t p = fork(); if (p > 0) { @@ -1286,16 +1287,37 @@ static pid_t xfork(uchar flag) oldsighup = signal(SIGHUP, SIG_IGN); oldsigtstp = signal(SIGTSTP, SIG_DFL); } else if (p == 0) { + /* We create a grandchild to detach */ + if (flag & F_NOWAIT) { + p = fork(); + + if (p > 0) + exit(0); + else if (p == 0) { + signal(SIGHUP, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + signal(SIGTSTP, SIG_DFL); + + setsid(); + return p; + } + + perror("fork"); + exit(0); + } + /* so they can be used to stop the child */ signal(SIGHUP, SIG_DFL); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); signal(SIGTSTP, SIG_DFL); - - if (flag & F_NOWAIT) - setsid(); } + /* This is the parent waiting for the child to create grandchild*/ + if (flag & F_NOWAIT) + waitpid(p, &status, 0); + if (p == -1) perror("fork"); return p; @@ -1854,7 +1876,6 @@ static char xchartohex(char c) static char * (*fnstrstr)(const char *haystack, const char *needle) = &strcasestr; #ifdef PCRE -static const unsigned char *tables; static int pcreflags = PCRE_NO_AUTO_CAPTURE | PCRE_EXTENDED | PCRE_CASELESS; #else static int regflags = REG_NOSUB | REG_EXTENDED | REG_ICASE; @@ -1863,12 +1884,8 @@ static int regflags = REG_NOSUB | REG_EXTENDED | REG_ICASE; #ifdef PCRE static int setfilter(pcre **pcrex, const char *filter) { - const char *errstr = NULL; - int erroffset = 0; - - *pcrex = pcre_compile(filter, pcreflags, &errstr, &erroffset, tables); - - return errstr ? -1 : 0; + *pcrex = pcre_compile(filter, pcreflags, NULL, NULL, NULL); + return *pcrex ? 0 : -1; } #else static int setfilter(regex_t *regex, const char *filter)