]> Sergey Matveev's repositories - nnn.git/commitdiff
Reformat spawn()
authorArun Prakash Jana <engineerarun@gmail.com>
Sun, 10 Mar 2019 07:27:41 +0000 (12:57 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sun, 10 Mar 2019 07:27:41 +0000 (12:57 +0530)
src/nnn.c

index 90146b6b205573b774a0f8742b0289e12b5800a5..883a2508395259e4636ed80e352fb2d76efa4df3 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -194,13 +194,16 @@ disabledbg()
 
 /* Macros to define process spawn behaviour as flags */
 #define F_NONE     0x00  /* no flag set */
-#define F_MARKER   0x01  /* draw marker to indicate nnn spawned (e.g. shell) */
+#define F_MULTI    0x01  /* first arg can be combination of args; to be used with F_NORMAL */
 #define F_NOWAIT   0x02  /* don't wait for child process (e.g. file manager) */
 #define F_NOTRACE  0x04  /* suppress stdout and strerr (no traces) */
 #define F_SIGINT   0x08  /* restore default SIGINT handler */
-#define F_EDITOR   0x10  /* spawn the editor */
-#define F_MULTI    0x20  /* first arg can be combination of args */
-#define F_NORMAL   0x80  /* spawn child process in non-curses regular CLI mode */
+#define F_EDIT     0x10  /* spawn the editor */
+#define F_NORMAL   0x20  /* spawn child process in non-curses regular CLI mode */
+
+#define F_PAGER    (F_NORMAL | F_MULTI)
+#define F_SHELL    (F_NORMAL | F_MULTI | F_SIGINT)
+#define F_EDITOR   (F_NORMAL | F_MULTI | F_EDIT)
 
 /* CRC8 macros */
 #define WIDTH  (sizeof(unsigned char) << 3)
@@ -327,8 +330,8 @@ static uint idletimeout, copybufpos, copybuflen;
 static char *opener;
 static char *copier;
 static char *editor;
-static char *pager, *pager_arg;
-static char *shell, *shell_arg;
+static char *pager;
+static char *shell;
 static char *home;
 static blkcnt_t ent_blocks;
 static blkcnt_t dir_blocks;
@@ -894,7 +897,7 @@ static bool showcplist(void)
 
        close(fd);
        if (pos && pos == copybufpos)
-               spawn(pager, pager_arg, g_tmpfpath, NULL, F_NORMAL);
+               spawn(pager, g_tmpfpath, NULL, NULL, F_PAGER);
        unlink(g_tmpfpath);
        return TRUE;
 }
@@ -1026,15 +1029,15 @@ static void spawn(char *file, char *arg1, char *arg2, const char *dir, uchar fla
                }
 
                xstrlcpy(cmd, file, len);
-               argv[0] = file;
                status = parseargs(cmd, argv);
-               if (status == -1 || status > (EXEC_ARGS_MAX - 2)) { /* arg1 and last NULL */
+               if (status == -1 || status > (EXEC_ARGS_MAX - 3)) { /* arg1, arg2 and last NULL */
                        free(cmd);
                        DPRINTF_S("spawn: NULL or too many args");
                        return;
                }
 
-               argv[status] = arg1;
+               argv[status++] = arg1;
+               argv[status] = arg2;
        } else {
                argv[0] = file;
                argv[1] = arg1;
@@ -1079,7 +1082,7 @@ static void spawn(char *file, char *arg1, char *arg2, const char *dir, uchar fla
                DPRINTF_D(pid);
                if (flag & F_NORMAL) {
                        refresh();
-                       if (flag & F_EDITOR) {
+                       if (flag & F_EDIT) {
                                exitcurses();
                                fflush(stdout);
                                initcurses();
@@ -2233,7 +2236,7 @@ static char *get_output(char *buf, const size_t bytes, const char *file,
                /* Show in pager in child */
                dup2(pipefd[0], STDIN_FILENO);
                close(pipefd[0]);
-               execlp(pager, pager, NULL);
+               spawn(pager, NULL, NULL, NULL, F_PAGER);
                _exit(1);
        }
 
@@ -2304,7 +2307,7 @@ static bool show_stats(const char *fpath, const char *fname, const struct stat *
        dprintf(fd, "\n\n");
        close(fd);
 
-       spawn(pager, pager_arg, g_tmpfpath, NULL, F_NORMAL);
+       spawn(pager, g_tmpfpath, NULL, NULL, F_PAGER);
        unlink(g_tmpfpath);
        return TRUE;
 }
@@ -2447,7 +2450,7 @@ static bool show_help(const char *path)
        dprintf(fd, "\nv%s\n%s\n", VERSION, GENERAL_INFO);
        close(fd);
 
-       spawn(pager, pager_arg, g_tmpfpath, NULL, F_NORMAL);
+       spawn(pager, g_tmpfpath, NULL, NULL, F_PAGER);
        unlink(g_tmpfpath);
        return TRUE;
 }
@@ -3006,12 +3009,10 @@ nochange:
                                        xstrlcpy(path, rundir, PATH_MAX);
                                        if (runfile[0]) {
                                                xstrlcpy(lastname, runfile, NAME_MAX);
-                                               spawn(shell, newpath, lastname, path,
-                                                     F_NORMAL | F_SIGINT);
+                                               spawn(shell, newpath, lastname, path, F_SHELL);
                                                runfile[0] = '\0';
                                        } else
-                                               spawn(shell, newpath, NULL, path,
-                                                     F_NORMAL | F_SIGINT);
+                                               spawn(shell, newpath, NULL, path, F_SHELL);
                                        rundir[0] = '\0';
                                        cfg.runscript = 0;
                                        setdirwatch();
@@ -3023,8 +3024,7 @@ nochange:
                                    get_output(g_buf, CMD_LEN_MAX, "file", FILE_OPTS, newpath, FALSE)
                                    && g_buf[0] == 't' && g_buf[1] == 'e' && g_buf[2] == 'x'
                                    && g_buf[3] == g_buf[0] && g_buf[4] == '/') {
-                                       spawn(editor, newpath, NULL, path,
-                                             F_NORMAL | F_EDITOR | F_MULTI);
+                                       spawn(editor, newpath, NULL, path, F_EDITOR);
                                        continue;
                                }
 
@@ -3370,11 +3370,10 @@ nochange:
                                r = show_help(path);
                                break;
                        case SEL_RUNEDIT:
-                               spawn(editor, dents[cur].name, NULL, path,
-                                     F_NORMAL | F_EDITOR |F_MULTI);
+                               spawn(editor, dents[cur].name, NULL, path, F_EDITOR);
                                break;
                        case SEL_RUNPAGE:
-                               spawn(pager, pager_arg, dents[cur].name, path, F_NORMAL);
+                               spawn(pager, dents[cur].name, NULL, path, F_PAGER);
                                break;
                        case SEL_NOTE:
                        {
@@ -3386,7 +3385,7 @@ nochange:
                                        goto nochange;
                                }
 
-                               spawn(editor, notepath, NULL, path, F_NORMAL | F_EDITOR |F_MULTI);
+                               spawn(editor, notepath, NULL, path, F_EDITOR);
                                break;
                        }
                        default: /* SEL_LOCK */
@@ -3757,7 +3756,7 @@ nochange:
                                spawn(newpath, NULL, NULL, path, F_NORMAL | F_SIGINT);
                                break;
                        case SEL_SHELL:
-                               spawn(shell, shell_arg, NULL, path, F_NORMAL | F_MARKER);
+                               spawn(shell, NULL, NULL, path, F_SHELL);
                                break;
                        case SEL_SCRIPT:
                                if (!scriptpath) {
@@ -3773,7 +3772,7 @@ nochange:
                                /* Regular script file */
                                if (S_ISREG(sb.st_mode)) {
                                        tmp = ndents ? dents[cur].name : NULL;
-                                       spawn(shell, scriptpath, tmp, path, F_NORMAL | F_SIGINT);
+                                       spawn(shell, scriptpath, tmp, path, F_SHELL);
                                        break;
                                }
 
@@ -3813,11 +3812,10 @@ nochange:
                        default: /* SEL_RUNCMD */
 #ifndef NORL
                                if (cfg.picker) {
-                                       /* readline prompt breaks the interface, use stock */
 #endif
                                        tmp = xreadline(NULL, "> ");
                                        if (tmp[0])
-                                               spawn(shell, "-c", tmp, path, F_NORMAL | F_SIGINT);
+                                               spawn(shell, "-c", tmp, path, F_SHELL);
 #ifndef NORL
                                } else {
                                        exitcurses();
@@ -3838,7 +3836,7 @@ nochange:
                                        refresh();
 
                                        if (tmp && tmp[0]) {
-                                               spawn(shell, "-c", tmp, path, F_NORMAL | F_SIGINT);
+                                               spawn(shell, "-c", tmp, path, F_SHELL);
                                                /* readline finishing touches */
                                                add_history(tmp);
                                                free(tmp);
@@ -4069,13 +4067,6 @@ int main(int argc, char *argv[])
        shell = xgetenv(envs[SHELL], "sh");
        DPRINTF_S(shell);
 
-       if (!getprogarg(pager, &pager_arg) || !getprogarg(shell, &shell_arg)) {
-               fprintf(stderr, "%s\n", messages[STR_ARGLIMIT]);
-               return 1;
-       }
-       DPRINTF_S(pager_arg);
-       DPRINTF_S(shell_arg);
-
        DPRINTF_S(getenv("PWD"));
 
 #ifdef LINUX_INOTIFY