mirror of
https://github.com/jarun/nnn.git
synced 2024-11-24 03:41:27 +00:00
Fix reading from pipe when running plugin
This commit is contained in:
parent
151bbf000d
commit
1f51417c63
115
src/nnn.c
115
src/nnn.c
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue