diff --git a/legacy/ecore/src/lib/ecore/Ecore.h b/legacy/ecore/src/lib/ecore/Ecore.h index 411adcc45c..a9097b0d35 100644 --- a/legacy/ecore/src/lib/ecore/Ecore.h +++ b/legacy/ecore/src/lib/ecore/Ecore.h @@ -92,7 +92,8 @@ extern "C" { ECORE_EXE_PIPE_READ_LINE_BUFFERED = 8, /**< Reads are buffered until a newline and delivered 1 event per line */ ECORE_EXE_PIPE_ERROR_LINE_BUFFERED = 16, /**< Errors are buffered until a newline and delivered 1 event per line */ ECORE_EXE_PIPE_AUTO = 32, /**< stdout and stderr are buffered automatically */ - ECORE_EXE_RESPAWN = 64 /**< FIXME: Exe is restarted if it dies */ + ECORE_EXE_RESPAWN = 64, /**< FIXME: Exe is restarted if it dies */ + ECORE_EXE_USE_SH = 128 /**< Use /bin/sh to run the command. */ }; typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags; diff --git a/legacy/ecore/src/lib/ecore/ecore_exe.c b/legacy/ecore/src/lib/ecore/ecore_exe.c index 7a5979dbb9..5e80d16525 100644 --- a/legacy/ecore/src/lib/ecore/ecore_exe.c +++ b/legacy/ecore/src/lib/ecore/ecore_exe.c @@ -11,7 +11,7 @@ struct _ecore_exe_dead_exe char *cmd; }; -static inline void _ecore_exe_exec_it(const char *exe_cmd); +static inline void _ecore_exe_exec_it(const char *exe_cmd, Ecore_Exe_Flags flags); static int _ecore_exe_data_generic_handler(void *data, Ecore_Fd_Handler * @@ -228,7 +228,7 @@ ecore_exe_run(const char *exe_cmd, const void *data) exes = _ecore_list2_append(exes, exe); return exe; } - _ecore_exe_exec_it(exe_cmd); + _ecore_exe_exec_it(exe_cmd, 0); exit(127); return NULL; #else @@ -355,7 +355,7 @@ ecore_exe_pipe_run(const char *exe_cmd, Ecore_Exe_Flags flags, const void *data) E_IF_NO_ERRNO(result, fcntl(statusPipe[1], F_SETFD, FD_CLOEXEC), ok) /* close on exec shows sucess */ { /* Run the actual command. */ - _ecore_exe_exec_it(exe_cmd); /* Should not return from this. */ + _ecore_exe_exec_it(exe_cmd, flags); /* Should not return from this. */ } } @@ -1147,7 +1147,7 @@ _ecore_exe_find(pid_t pid) } static inline void -_ecore_exe_exec_it(const char *exe_cmd) +_ecore_exe_exec_it(const char *exe_cmd, Ecore_Exe_Flags flags) { char use_sh = 1; char *buf = NULL; @@ -1213,7 +1213,12 @@ _ecore_exe_exec_it(const char *exe_cmd) } setsid(); - if (use_sh) + if ((flags & ECORE_EXE_USE_SH)) + { + errno = 0; + execl("/bin/sh", "/bin/sh", "-c", exe_cmd, (char *)NULL); + } + else if (use_sh) { /* We have to use a shell to run this. */ if (shell == NULL) { /* Find users preferred shell. */ diff --git a/legacy/ecore/src/lib/ecore/ecore_private.h b/legacy/ecore/src/lib/ecore/ecore_private.h index 135ceca218..7f84ca2570 100644 --- a/legacy/ecore/src/lib/ecore/ecore_private.h +++ b/legacy/ecore/src/lib/ecore/ecore_private.h @@ -157,7 +157,8 @@ enum _Ecore_Exe_Flags ECORE_EXE_PIPE_READ_LINE_BUFFERED = 8, ECORE_EXE_PIPE_ERROR_LINE_BUFFERED = 16, ECORE_EXE_PIPE_AUTO = 32, - ECORE_EXE_RESPAWN = 64 + ECORE_EXE_RESPAWN = 64, + ECORE_EXE_USE_SH = 128 /* FIXME: Getting respawn to work * * There is no way that we can do anything about the internal state info of