Reformat spawn()

This commit is contained in:
Arun Prakash Jana 2019-03-10 12:57:41 +05:30
parent 616443ffa3
commit 8b1ef2d9d5
No known key found for this signature in database
GPG Key ID: A75979F35C080412
1 changed files with 27 additions and 36 deletions

View File

@ -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