mirror of
https://github.com/MidnightCommander/mc
synced 2025-01-03 01:54:24 +03:00
Ticket #3547: code cleanup before 4.8.16 release.
Move subshell stuff into subdir. Signed-off-by: Slava Zanko <slavazanko@gmail.com>
This commit is contained in:
parent
24d09babd8
commit
974ab368ec
@ -526,6 +526,7 @@ src/Makefile
|
|||||||
src/consaver/Makefile
|
src/consaver/Makefile
|
||||||
src/editor/Makefile
|
src/editor/Makefile
|
||||||
src/man2hlp/Makefile
|
src/man2hlp/Makefile
|
||||||
|
src/subshell/Makefile
|
||||||
src/viewer/Makefile
|
src/viewer/Makefile
|
||||||
src/diffviewer/Makefile
|
src/diffviewer/Makefile
|
||||||
src/filemanager/Makefile
|
src/filemanager/Makefile
|
||||||
|
@ -8,6 +8,10 @@ if USE_DIFF
|
|||||||
SUBDIRS += diffviewer
|
SUBDIRS += diffviewer
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if ENABLE_SUBSHELL
|
||||||
|
SUBDIRS += subshell
|
||||||
|
endif
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libinternal.la
|
noinst_LTLIBRARIES = libinternal.la
|
||||||
|
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
@ -37,11 +41,15 @@ if USE_DIFF
|
|||||||
DIFFLIB = diffviewer/libdiffviewer.la
|
DIFFLIB = diffviewer/libdiffviewer.la
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if ENABLE_SUBSHELL
|
||||||
|
SUBSHELLLIB = subshell/libsubshell.la
|
||||||
|
endif
|
||||||
|
|
||||||
libinternal_la_LIBADD = \
|
libinternal_la_LIBADD = \
|
||||||
filemanager/libmcfilemanager.la \
|
filemanager/libmcfilemanager.la \
|
||||||
vfs/libmc-vfs.la \
|
vfs/libmc-vfs.la \
|
||||||
viewer/libmcviewer.la \
|
viewer/libmcviewer.la \
|
||||||
$(DIFFLIB) $(EDITLIB)
|
$(DIFFLIB) $(EDITLIB) $(SUBSHELLLIB)
|
||||||
|
|
||||||
mc_LDADD = \
|
mc_LDADD = \
|
||||||
libinternal.la \
|
libinternal.la \
|
||||||
@ -76,9 +84,6 @@ if CHARSET
|
|||||||
libinternal_la_SOURCES += selcodepage.c selcodepage.h
|
libinternal_la_SOURCES += selcodepage.c selcodepage.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if ENABLE_SUBSHELL
|
|
||||||
libinternal_la_SOURCES += subshell.c subshell.h
|
|
||||||
endif
|
|
||||||
|
|
||||||
if ENABLE_BACKGROUND
|
if ENABLE_BACKGROUND
|
||||||
libinternal_la_SOURCES += background.c background.h
|
libinternal_la_SOURCES += background.c background.h
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
#include "filemanager/layout.h" /* use_dash() */
|
#include "filemanager/layout.h" /* use_dash() */
|
||||||
#include "consaver/cons.saver.h"
|
#include "consaver/cons.saver.h"
|
||||||
#ifdef ENABLE_SUBSHELL
|
#ifdef ENABLE_SUBSHELL
|
||||||
#include "subshell.h"
|
#include "subshell/subshell.h"
|
||||||
#endif
|
#endif
|
||||||
#include "setup.h" /* clear_before_exec */
|
#include "setup.h" /* clear_before_exec */
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
#include "src/setup.h" /* quit */
|
#include "src/setup.h" /* quit */
|
||||||
#ifdef ENABLE_SUBSHELL
|
#ifdef ENABLE_SUBSHELL
|
||||||
#include "src/subshell.h"
|
#include "src/subshell/subshell.h"
|
||||||
#endif
|
#endif
|
||||||
#include "src/execute.h" /* shell_execute */
|
#include "src/execute.h" /* shell_execute */
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
#include "src/viewer/mcviewer.h" /* The view widget */
|
#include "src/viewer/mcviewer.h" /* The view widget */
|
||||||
#include "src/setup.h"
|
#include "src/setup.h"
|
||||||
#ifdef ENABLE_SUBSHELL
|
#ifdef ENABLE_SUBSHELL
|
||||||
#include "src/subshell.h"
|
#include "src/subshell/subshell.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
#include "src/args.h"
|
#include "src/args.h"
|
||||||
#ifdef ENABLE_SUBSHELL
|
#ifdef ENABLE_SUBSHELL
|
||||||
#include "src/subshell.h"
|
#include "src/subshell/subshell.h"
|
||||||
#endif
|
#endif
|
||||||
#include "src/setup.h" /* variables */
|
#include "src/setup.h" /* variables */
|
||||||
#include "src/learn.h" /* learn_keys() */
|
#include "src/learn.h" /* learn_keys() */
|
||||||
|
@ -63,7 +63,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "src/keybind-defaults.h" /* global_keymap_t */
|
#include "src/keybind-defaults.h" /* global_keymap_t */
|
||||||
#ifdef ENABLE_SUBSHELL
|
#ifdef ENABLE_SUBSHELL
|
||||||
#include "src/subshell.h" /* do_subshell_chdir() */
|
#include "src/subshell/subshell.h" /* do_subshell_chdir() */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
|
@ -67,7 +67,7 @@
|
|||||||
#include "events_init.h"
|
#include "events_init.h"
|
||||||
#include "args.h"
|
#include "args.h"
|
||||||
#ifdef ENABLE_SUBSHELL
|
#ifdef ENABLE_SUBSHELL
|
||||||
#include "subshell.h"
|
#include "subshell/subshell.h"
|
||||||
#endif
|
#endif
|
||||||
#include "setup.h" /* load_setup() */
|
#include "setup.h" /* load_setup() */
|
||||||
|
|
||||||
|
8
src/subshell/Makefile.am
Normal file
8
src/subshell/Makefile.am
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
noinst_LTLIBRARIES = libsubshell.la
|
||||||
|
|
||||||
|
libsubshell_la_SOURCES = \
|
||||||
|
common.c \
|
||||||
|
internal.h \
|
||||||
|
proxyfunc.c
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -I$(top_srcdir) $(GLIB_CFLAGS) $(PCRE_CPPFLAGS)
|
@ -5,7 +5,31 @@
|
|||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
Written by:
|
Written by:
|
||||||
Slava Zanko <slavazanko@gmail.com>, 2013
|
Alexander Kriegisch <Alexander@Kriegisch.name>
|
||||||
|
Aliaksey Kandratsenka <alk@tut.by>
|
||||||
|
Andreas Mohr <and@gmx.li>
|
||||||
|
Andrew Borodin <aborodin@vmail.ru>
|
||||||
|
Andrew Borodin <borodin@borodin.zarya>
|
||||||
|
Andrew V. Samoilov <sav@bcs.zp.ua>
|
||||||
|
Chris Owen <chris@candu.co.uk>
|
||||||
|
Claes Nästén <me@pekdon.net>
|
||||||
|
Egmont Koblinger <egmont@gmail.com>
|
||||||
|
Enrico Weigelt, metux IT service <weigelt@metux.de>
|
||||||
|
Igor Urazov <z0rc3r@gmail.com>
|
||||||
|
Ilia Maslakov <il.smind@gmail.com>
|
||||||
|
Leonard den Ottolander <leonard@den.ottolander.nl>
|
||||||
|
Miguel de Icaza <miguel@novell.com>
|
||||||
|
Mikhail S. Pobolovets <styx.mp@gmail.com>
|
||||||
|
Norbert Warmuth <nwarmuth@privat.circular.de>
|
||||||
|
Patrick Winnertz <winnie@debian.org>
|
||||||
|
Pavel Machek <pavel@suse.cz>
|
||||||
|
Pavel Roskin <proski@gnu.org>
|
||||||
|
Pavel Tsekov <ptsekov@gmx.net>
|
||||||
|
Roland Illig <roland.illig@gmx.de>
|
||||||
|
Sergei Trofimovich <slyfox@inbox.ru>
|
||||||
|
Slava Zanko <slavazanko@gmail.com>, 2013,2015.
|
||||||
|
Timur Bakeyev <mc@bat.ru>
|
||||||
|
Vit Rosin <vit_r@list.ru>
|
||||||
|
|
||||||
This file is part of the Midnight Commander.
|
This file is part of the Midnight Commander.
|
||||||
|
|
||||||
@ -61,11 +85,8 @@
|
|||||||
#include "lib/util.h"
|
#include "lib/util.h"
|
||||||
#include "lib/widget.h"
|
#include "lib/widget.h"
|
||||||
|
|
||||||
#include "filemanager/midnight.h" /* current_panel */
|
|
||||||
|
|
||||||
#include "consaver/cons.saver.h" /* handle_console() */
|
|
||||||
#include "setup.h"
|
|
||||||
#include "subshell.h"
|
#include "subshell.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
/*** global variables ****************************************************************************/
|
/*** global variables ****************************************************************************/
|
||||||
|
|
||||||
@ -931,6 +952,83 @@ init_subshell_precmd (char *precmd, size_t buff_size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Carefully quote directory name to allow entering any directory safely,
|
||||||
|
* no matter what weird characters it may contain in its name.
|
||||||
|
* NOTE: Treat directory name an untrusted data, don't allow it to cause
|
||||||
|
* executing any commands in the shell. Escape all control characters.
|
||||||
|
* Use following technique:
|
||||||
|
*
|
||||||
|
* printf(1) with format string containing a single conversion specifier,
|
||||||
|
* "b", and an argument which contains a copy of the string passed to
|
||||||
|
* subshell_name_quote() with all characters, except digits and letters,
|
||||||
|
* replaced by the backslash-escape sequence \0nnn, where "nnn" is the
|
||||||
|
* numeric value of the character converted to octal number.
|
||||||
|
*
|
||||||
|
* cd "`printf "%b" 'ABC\0nnnDEF\0nnnXYZ'`"
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static GString *
|
||||||
|
subshell_name_quote (const char *s)
|
||||||
|
{
|
||||||
|
GString *ret;
|
||||||
|
const char *su, *n;
|
||||||
|
const char *quote_cmd_start, *quote_cmd_end;
|
||||||
|
|
||||||
|
if (subshell_type == FISH)
|
||||||
|
{
|
||||||
|
quote_cmd_start = "(printf \"%b\" '";
|
||||||
|
quote_cmd_end = "')";
|
||||||
|
}
|
||||||
|
/* TODO: When BusyBox printf is fixed, get rid of this "else if", see
|
||||||
|
http://lists.busybox.net/pipermail/busybox/2012-March/077460.html */
|
||||||
|
/* else if (subshell_type == ASH_BUSYBOX)
|
||||||
|
{
|
||||||
|
quote_cmd_start = "\"`echo -en '";
|
||||||
|
quote_cmd_end = "'`\"";
|
||||||
|
} */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
quote_cmd_start = "\"`printf \"%b\" '";
|
||||||
|
quote_cmd_end = "'`\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = g_string_sized_new (64);
|
||||||
|
|
||||||
|
/* Prevent interpreting leading '-' as a switch for 'cd' */
|
||||||
|
if (s[0] == '-')
|
||||||
|
g_string_append (ret, "./");
|
||||||
|
|
||||||
|
/* Copy the beginning of the command to the buffer */
|
||||||
|
g_string_append (ret, quote_cmd_start);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print every character except digits and letters as a backslash-escape
|
||||||
|
* sequence of the form \0nnn, where "nnn" is the numeric value of the
|
||||||
|
* character converted to octal number.
|
||||||
|
*/
|
||||||
|
for (su = s; su[0] != '\0'; su = n)
|
||||||
|
{
|
||||||
|
n = str_cget_next_char_safe (su);
|
||||||
|
|
||||||
|
if (str_isalnum (su))
|
||||||
|
g_string_append_len (ret, su, n - su);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (c = 0; c < n - su; c++)
|
||||||
|
g_string_append_printf (ret, "\\0%03o", (unsigned char) su[c]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_string_append (ret, quote_cmd_end);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/*** public functions ****************************************************************************/
|
/*** public functions ****************************************************************************/
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -1182,7 +1280,7 @@ invoke_subshell (const char *command, int how, vfs_path_t ** new_dir_vpath)
|
|||||||
|
|
||||||
/* Make the subshell change to MC's working directory */
|
/* Make the subshell change to MC's working directory */
|
||||||
if (new_dir_vpath != NULL)
|
if (new_dir_vpath != NULL)
|
||||||
do_subshell_chdir (current_panel->cwd_vpath, TRUE);
|
do_subshell_chdir (subshell_get_cwd_from_current_panel (), TRUE);
|
||||||
|
|
||||||
if (command == NULL) /* The user has done "C-o" from MC */
|
if (command == NULL) /* The user has done "C-o" from MC */
|
||||||
{
|
{
|
||||||
@ -1212,16 +1310,16 @@ invoke_subshell (const char *command, int how, vfs_path_t ** new_dir_vpath)
|
|||||||
{
|
{
|
||||||
const char *pcwd;
|
const char *pcwd;
|
||||||
|
|
||||||
pcwd = vfs_translate_path (vfs_path_as_str (current_panel->cwd_vpath));
|
pcwd = vfs_translate_path (vfs_path_as_str (subshell_get_cwd_from_current_panel ()));
|
||||||
if (strcmp (subshell_cwd, pcwd) != 0)
|
if (strcmp (subshell_cwd, pcwd) != 0)
|
||||||
*new_dir_vpath = vfs_path_from_str (subshell_cwd); /* Make MC change to the subshell's CWD */
|
*new_dir_vpath = vfs_path_from_str (subshell_cwd); /* Make MC change to the subshell's CWD */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restart the subshell if it has died by SIGHUP, SIGQUIT, etc. */
|
/* Restart the subshell if it has died by SIGHUP, SIGQUIT, etc. */
|
||||||
while (!subshell_alive && quit == 0 && mc_global.tty.use_subshell)
|
while (!subshell_alive && subshell_get_mainloop_quit () == 0 && mc_global.tty.use_subshell)
|
||||||
init_subshell ();
|
init_subshell ();
|
||||||
|
|
||||||
return quit;
|
return subshell_get_mainloop_quit ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1330,84 +1428,6 @@ exit_subshell (void)
|
|||||||
return subshell_quit;
|
return subshell_quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
|
||||||
/**
|
|
||||||
* Carefully quote directory name to allow entering any directory safely,
|
|
||||||
* no matter what weird characters it may contain in its name.
|
|
||||||
* NOTE: Treat directory name an untrusted data, don't allow it to cause
|
|
||||||
* executing any commands in the shell. Escape all control characters.
|
|
||||||
* Use following technique:
|
|
||||||
*
|
|
||||||
* printf(1) with format string containing a single conversion specifier,
|
|
||||||
* "b", and an argument which contains a copy of the string passed to
|
|
||||||
* subshell_name_quote() with all characters, except digits and letters,
|
|
||||||
* replaced by the backslash-escape sequence \0nnn, where "nnn" is the
|
|
||||||
* numeric value of the character converted to octal number.
|
|
||||||
*
|
|
||||||
* cd "`printf "%b" 'ABC\0nnnDEF\0nnnXYZ'`"
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
static GString *
|
|
||||||
subshell_name_quote (const char *s)
|
|
||||||
{
|
|
||||||
GString *ret;
|
|
||||||
const char *su, *n;
|
|
||||||
const char *quote_cmd_start, *quote_cmd_end;
|
|
||||||
|
|
||||||
if (subshell_type == FISH)
|
|
||||||
{
|
|
||||||
quote_cmd_start = "(printf \"%b\" '";
|
|
||||||
quote_cmd_end = "')";
|
|
||||||
}
|
|
||||||
/* TODO: When BusyBox printf is fixed, get rid of this "else if", see
|
|
||||||
http://lists.busybox.net/pipermail/busybox/2012-March/077460.html */
|
|
||||||
/* else if (subshell_type == ASH_BUSYBOX)
|
|
||||||
{
|
|
||||||
quote_cmd_start = "\"`echo -en '";
|
|
||||||
quote_cmd_end = "'`\"";
|
|
||||||
} */
|
|
||||||
else
|
|
||||||
{
|
|
||||||
quote_cmd_start = "\"`printf \"%b\" '";
|
|
||||||
quote_cmd_end = "'`\"";
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = g_string_sized_new (64);
|
|
||||||
|
|
||||||
/* Prevent interpreting leading '-' as a switch for 'cd' */
|
|
||||||
if (s[0] == '-')
|
|
||||||
g_string_append (ret, "./");
|
|
||||||
|
|
||||||
/* Copy the beginning of the command to the buffer */
|
|
||||||
g_string_append (ret, quote_cmd_start);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print every character except digits and letters as a backslash-escape
|
|
||||||
* sequence of the form \0nnn, where "nnn" is the numeric value of the
|
|
||||||
* character converted to octal number.
|
|
||||||
*/
|
|
||||||
for (su = s; su[0] != '\0'; su = n)
|
|
||||||
{
|
|
||||||
n = str_cget_next_char_safe (su);
|
|
||||||
|
|
||||||
if (str_isalnum (su))
|
|
||||||
g_string_append_len (ret, su, n - su);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
|
|
||||||
for (c = 0; c < n - su; c++)
|
|
||||||
g_string_append_printf (ret, "\\0%03o", (unsigned char) su[c]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g_string_append (ret, quote_cmd_end);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
/** If it actually changed the directory it returns true */
|
/** If it actually changed the directory it returns true */
|
||||||
@ -1416,7 +1436,7 @@ do_subshell_chdir (const vfs_path_t * vpath, gboolean update_prompt)
|
|||||||
{
|
{
|
||||||
char *pcwd;
|
char *pcwd;
|
||||||
|
|
||||||
pcwd = vfs_path_to_str_flags (current_panel->cwd_vpath, 0, VPF_RECODE);
|
pcwd = vfs_path_to_str_flags (subshell_get_cwd_from_current_panel (), 0, VPF_RECODE);
|
||||||
|
|
||||||
if (!(subshell_state == INACTIVE && strcmp (subshell_cwd, pcwd) != 0))
|
if (!(subshell_state == INACTIVE && strcmp (subshell_cwd, pcwd) != 0))
|
||||||
{
|
{
|
||||||
@ -1484,7 +1504,9 @@ do_subshell_chdir (const vfs_path_t * vpath, gboolean update_prompt)
|
|||||||
{
|
{
|
||||||
char *cwd;
|
char *cwd;
|
||||||
|
|
||||||
cwd = vfs_path_to_str_flags (current_panel->cwd_vpath, 0, VPF_STRIP_PASSWORD);
|
cwd =
|
||||||
|
vfs_path_to_str_flags (subshell_get_cwd_from_current_panel (), 0,
|
||||||
|
VPF_STRIP_PASSWORD);
|
||||||
vfs_print_message (_("Warning: Cannot change to %s.\n"), cwd);
|
vfs_print_message (_("Warning: Cannot change to %s.\n"), cwd);
|
||||||
g_free (cwd);
|
g_free (cwd);
|
||||||
}
|
}
|
||||||
@ -1560,27 +1582,14 @@ sigchld_handler (int sig)
|
|||||||
subshell_alive = FALSE;
|
subshell_alive = FALSE;
|
||||||
delete_select_channel (mc_global.tty.subshell_pty);
|
delete_select_channel (mc_global.tty.subshell_pty);
|
||||||
if (WIFEXITED (status) && WEXITSTATUS (status) != FORK_FAILURE)
|
if (WIFEXITED (status) && WEXITSTATUS (status) != FORK_FAILURE)
|
||||||
quit |= SUBSHELL_EXIT; /* Exited normally */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef __linux__
|
|
||||||
pid = waitpid (cons_saver_pid, &status, WUNTRACED | WNOHANG);
|
|
||||||
|
|
||||||
if (pid == cons_saver_pid)
|
|
||||||
{
|
{
|
||||||
|
int subshell_quit;
|
||||||
if (WIFSTOPPED (status))
|
subshell_quit = subshell_get_mainloop_quit () | SUBSHELL_EXIT; /* Exited normally */
|
||||||
/* Someone has stopped cons.saver - restart it */
|
subshell_set_mainloop_quit (subshell_quit);
|
||||||
kill (pid, SIGCONT);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* cons.saver has died - disable confole saving */
|
|
||||||
handle_console (CONSOLE_DONE);
|
|
||||||
mc_global.tty.console_flag = '\0';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif /* __linux__ */
|
}
|
||||||
|
subshell_handle_cons_saver ();
|
||||||
|
|
||||||
/* If we got here, some other child exited; ignore it */
|
/* If we got here, some other child exited; ignore it */
|
||||||
}
|
}
|
29
src/subshell/internal.h
Normal file
29
src/subshell/internal.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/** \file internal.h
|
||||||
|
* \brief Header: internal functions and variables
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MC__SUBSHELL_INTERNAL_H
|
||||||
|
#define MC__SUBSHELL_INTERNAL_H
|
||||||
|
|
||||||
|
/* TODO: merge content of layout.h here */
|
||||||
|
|
||||||
|
/*** typedefs(not structures) and defined constants **********************************************/
|
||||||
|
|
||||||
|
/*** enums ***************************************************************************************/
|
||||||
|
|
||||||
|
/*** structures declarations (and typedefs of structures)*****************************************/
|
||||||
|
|
||||||
|
/*** global variables defined in .c file *********************************************************/
|
||||||
|
|
||||||
|
/*** declarations of public functions ************************************************************/
|
||||||
|
|
||||||
|
const vfs_path_t *subshell_get_cwd_from_current_panel (void);
|
||||||
|
void subshell_handle_cons_saver (void);
|
||||||
|
|
||||||
|
int subshell_get_mainloop_quit (void);
|
||||||
|
void subshell_set_mainloop_quit (const int param_quit);
|
||||||
|
|
||||||
|
|
||||||
|
/*** inline functions ****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* MC__SUBSHELL_INTERNAL_H */
|
107
src/subshell/proxyfunc.c
Normal file
107
src/subshell/proxyfunc.c
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
Proxy functions for getting access to public variables into 'filemanager' module.
|
||||||
|
|
||||||
|
Copyright (C) 2015
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Written by:
|
||||||
|
Slava Zanko <slavazanko@gmail.com>, 2015.
|
||||||
|
|
||||||
|
This file is part of the Midnight Commander.
|
||||||
|
|
||||||
|
The Midnight Commander is free software: you can redistribute it
|
||||||
|
and/or modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
The Midnight Commander is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
#include "lib/global.h"
|
||||||
|
#include "lib/widget.h"
|
||||||
|
|
||||||
|
#include "src/setup.h" /* quit */
|
||||||
|
#include "src/filemanager/midnight.h" /* current_panel */
|
||||||
|
#include "src/consaver/cons.saver.h" /* handle_console() */
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
/*** global variables ****************************************************************************/
|
||||||
|
|
||||||
|
/* path to X clipboard utility */
|
||||||
|
|
||||||
|
/*** file scope macro definitions ****************************************************************/
|
||||||
|
|
||||||
|
/*** file scope type declarations ****************************************************************/
|
||||||
|
|
||||||
|
/*** file scope variables ************************************************************************/
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
/*** file scope functions ************************************************************************/
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
/*** public functions ****************************************************************************/
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
const vfs_path_t *
|
||||||
|
subshell_get_cwd_from_current_panel (void)
|
||||||
|
{
|
||||||
|
return current_panel->cwd_vpath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void
|
||||||
|
subshell_handle_cons_saver (void)
|
||||||
|
{
|
||||||
|
#ifdef __linux__
|
||||||
|
int status;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
pid = waitpid (cons_saver_pid, &status, WUNTRACED | WNOHANG);
|
||||||
|
waitpid (cons_saver_pid, &status, WUNTRACED | WNOHANG);
|
||||||
|
|
||||||
|
if (pid == cons_saver_pid)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (WIFSTOPPED (status))
|
||||||
|
/* Someone has stopped cons.saver - restart it */
|
||||||
|
kill (pid, SIGCONT);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* cons.saver has died - disable console saving */
|
||||||
|
handle_console (CONSOLE_DONE);
|
||||||
|
mc_global.tty.console_flag = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* __linux__ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int
|
||||||
|
subshell_get_mainloop_quit (void)
|
||||||
|
{
|
||||||
|
return quit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void
|
||||||
|
subshell_set_mainloop_quit (const int param_quit)
|
||||||
|
{
|
||||||
|
quit = param_quit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
Loading…
Reference in New Issue
Block a user