Fix reading from pipe when running plugin

This commit is contained in:
Arun Prakash Jana 2020-05-10 00:47:02 +05:30
parent 151bbf000d
commit 1f51417c63
No known key found for this signature in database
GPG key ID: A75979F35C080412

115
src/nnn.c
View file

@ -1710,17 +1710,18 @@ static int spawn(char *file, char *arg1, char *arg2, const char *dir, uchar flag
retstatus = join(pid, flag);
DPRINTF_D(pid);
if (flag & F_NORMAL) {
if (flag & F_CONFIRM) {
printf("%s", messages[MSG_CONTINUE]);
if (flag & F_CONFIRM) {
printf("%s", messages[MSG_CONTINUE]);
#ifndef NORL
fflush(stdout);
fflush(stdout);
#endif
while (getchar() != '\n');
}
refresh();
while (getchar() != '\n');
}
if (flag & F_NORMAL)
refresh();
free(cmd);
}
@ -4175,26 +4176,10 @@ static void show_help(const char *path)
unlink(g_tmpfpath);
}
static bool run_cmd_as_plugin(const char *path, const char *file, char *runfile)
static bool run_cmd_as_plugin(const char *path, const char *file, char *runfile, uchar flags)
{
uchar flags = F_CLI | F_CONFIRM;
size_t len;
/* Get rid of preceding _ */
++file;
if (!*file)
return FALSE;
/* Check if GUI flags are to be used */
if (*file == '|') {
flags = F_NOTRACE | F_NOWAIT;
++file;
if (!*file)
return FALSE;
}
xstrsncpy(g_buf, file, PATH_MAX);
len = xstrlen(g_buf);
@ -4219,10 +4204,6 @@ static bool plctrl_init(void)
/* g_tmpfpath is used to generate tmp file names */
g_tmpfpath[tmpfplen - 1] = '\0';
mkpath(g_tmpfpath, g_buf, g_pipepath);
unlink(g_pipepath);
if (mkfifo(g_pipepath, 0600) != 0)
return _FAILURE;
setenv(env_cfg[NNN_PIPE], g_pipepath, TRUE);
return _SUCCESS;
@ -4302,44 +4283,73 @@ static void readpipe(int fd, char **path, char **lastname, char **lastdir)
static bool run_selected_plugin(char **path, const char *file, char *runfile, char **lastname, char **lastdir)
{
bool cmd_as_plugin = FALSE;
uchar flags = 0;
if (!(g_states & STATE_PLUGIN_INIT)) {
plctrl_init();
g_states |= STATE_PLUGIN_INIT;
}
int fd = open(g_pipepath, O_RDONLY | O_NONBLOCK);
if (*file == '_') {
flags = F_MULTI | F_CONFIRM;
if (fd == -1)
return FALSE;
/* Get rid of preceding _ */
++file;
if (!*file)
return FALSE;
#ifdef __linux__
DPRINTF_D(fcntl(fd, F_GETPIPE_SZ));
/* Increase the pipe buffer size to 1 MB */
if (fcntl(fd, F_SETPIPE_SZ, 1024*1024) == -1) {
DPRINTF_S(strerror(errno));
/* Check if GUI flags are to be used */
if (*file == '|') {
flags = F_NOTRACE | F_NOWAIT;
++file;
if (!*file)
return FALSE;
run_cmd_as_plugin(*path, file, runfile, flags);
return TRUE;
}
cmd_as_plugin = TRUE;
}
DPRINTF_D(fcntl(fd, F_GETPIPE_SZ));
#endif
/* Run plugin from command */
if (*file == '_')
run_cmd_as_plugin(*path, file, runfile);
if (mkfifo(g_pipepath, 0600) != 0)
return _FAILURE;
/* Run command from plugin */
else {
/* Generate absolute path to plugin */
mkpath(plugindir, file, g_buf);
exitcurses();
if (runfile && runfile[0]) {
xstrsncpy(*lastname, runfile, NAME_MAX);
spawn(g_buf, *lastname, *path, *path, F_NORMAL);
if (fork() == 0) { // In child
int wfd = open(g_pipepath, O_WRONLY | O_NONBLOCK);
if (wfd == -1)
return FALSE;
if (!cmd_as_plugin) {
/* Generate absolute path to plugin */
mkpath(plugindir, file, g_buf);
if (runfile && runfile[0]) {
xstrsncpy(*lastname, runfile, NAME_MAX);
spawn(g_buf, *lastname, *path, *path, 0);
} else
spawn(g_buf, NULL, *path, *path, 0);
} else
spawn(g_buf, NULL, *path, *path, F_NORMAL);
run_cmd_as_plugin(*path, file, runfile, flags);
close(wfd);
_exit(0);
}
readpipe(fd, path, lastname, lastdir);
int rfd = open(g_pipepath, O_RDONLY);
readpipe(rfd, path, lastname, lastdir);
close(rfd);
refresh();
unlink(g_pipepath);
close(fd);
return TRUE;
}
@ -6822,9 +6832,6 @@ static void cleanup(void)
free(ihashbmp);
free(bookmark);
free(plug);
unlink(g_pipepath);
#ifdef DBGMODE
disabledbg();
#endif