]> Sergey Matveev's repositories - nnn.git/commitdiff
Detach process with F_NOWAIT (#450)
authorKlzXS <azszwymmvqdi@yahoo.com>
Fri, 24 Jan 2020 13:28:43 +0000 (14:28 +0100)
committerMischievous Meerkat <engineerarun@gmail.com>
Fri, 24 Jan 2020 13:28:43 +0000 (18:58 +0530)
* 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 <engineerarun@gmail.com>
src/nnn.c

index bcda5cc45fe5e08c738833be1105ea75867d2c4f..500523196648ecdd8b4c45c97120be5678b6bc23 100644 (file)
--- 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)