Browse Source

Add prevent-bad-behaviour option, and make it work once again

tags/1.9.8
falkTX 8 years ago
parent
commit
97bd032ebd
9 changed files with 80 additions and 52 deletions
  1. +13
    -6
      resources/ui/carla_settings.ui
  2. +1
    -1
      source/backend/engine/CarlaEngine.cpp
  3. +3
    -9
      source/backend/plugin/CarlaPluginBridge.cpp
  4. +1
    -1
      source/carla_backend.py
  5. +2
    -2
      source/carla_database.py
  6. +3
    -5
      source/carla_host.py
  7. +27
    -23
      source/carla_settings.py
  8. +28
    -4
      source/interposer/interposer-safe.cpp
  9. +2
    -1
      source/utils/CarlaPipeUtils.cpp

+ 13
- 6
resources/ui/carla_settings.ui View File

@@ -955,7 +955,7 @@
<item row="1" column="0" colspan="3"> <item row="1" column="0" colspan="3">
<widget class="QCheckBox" name="ch_engine_uis_always_on_top"> <widget class="QCheckBox" name="ch_engine_uis_always_on_top">
<property name="text"> <property name="text">
<string>Make UIs always-on-top</string>
<string>Make plugin UIs always-on-top</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -1482,20 +1482,20 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="group_advanced_main">
<widget class="QGroupBox" name="group_experimental_main">
<property name="title"> <property name="title">
<string>Main</string> <string>Main</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_17"> <layout class="QVBoxLayout" name="verticalLayout_17">
<item> <item>
<widget class="QCheckBox" name="cb_advanced_plugin_bridges">
<widget class="QCheckBox" name="cb_exp_plugin_bridges">
<property name="text"> <property name="text">
<string>Enable plugin bridges</string> <string>Enable plugin bridges</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="ch_advanced_load_lib_global">
<widget class="QCheckBox" name="ch_exp_load_lib_global">
<property name="text"> <property name="text">
<string>Load Carla backend in global namespace (NOT RECOMMENDED)</string> <string>Load Carla backend in global namespace (NOT RECOMMENDED)</string>
</property> </property>
@@ -1505,7 +1505,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="group_advanced_canvas">
<widget class="QGroupBox" name="group_experimental_canvas">
<property name="title"> <property name="title">
<string>Canvas</string> <string>Canvas</string>
</property> </property>
@@ -1538,7 +1538,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="group_avanced_engine">
<widget class="QGroupBox" name="group_experimental_engine">
<property name="title"> <property name="title">
<string>Engine</string> <string>Engine</string>
</property> </property>
@@ -1554,6 +1554,13 @@ This mode is not available for VST plugins.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="ch_exp_prevent_bad_behaviour">
<property name="text">
<string>Prevent plugins from doing bad stuff (needs restart)</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="ch_engine_prefer_plugin_bridges"> <widget class="QCheckBox" name="ch_engine_prefer_plugin_bridges">
<property name="toolTip"> <property name="toolTip">


+ 1
- 1
source/backend/engine/CarlaEngine.cpp View File

@@ -1587,7 +1587,7 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch
#ifdef CARLA_OS_LINUX #ifdef CARLA_OS_LINUX
if (value != 0) if (value != 0)
{ {
CarlaString interposerPath(CarlaString(pData->options.binaryDir) + CARLA_OS_SEP_STR "libcarla_interposer.so");
CarlaString interposerPath(CarlaString(pData->options.binaryDir) + "/libcarla_interposer-safe.so");
::setenv("LD_PRELOAD", interposerPath.buffer(), 1); ::setenv("LD_PRELOAD", interposerPath.buffer(), 1);
} }
else else


+ 3
- 9
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -26,6 +26,7 @@
#include "CarlaBridgeUtils.hpp" #include "CarlaBridgeUtils.hpp"
#include "CarlaEngineUtils.hpp" #include "CarlaEngineUtils.hpp"
#include "CarlaMathUtils.hpp" #include "CarlaMathUtils.hpp"
#include "CarlaPipeUtils.hpp"
#include "CarlaShmUtils.hpp" #include "CarlaShmUtils.hpp"
#include "CarlaThread.hpp" #include "CarlaThread.hpp"


@@ -156,10 +157,8 @@ protected:
const ScopedEngineEnvironmentLocker _seel(kEngine); const ScopedEngineEnvironmentLocker _seel(kEngine);


#ifdef CARLA_OS_LINUX #ifdef CARLA_OS_LINUX
const char* const oldPreload(std::getenv("LD_PRELOAD"));

if (oldPreload != nullptr)
::unsetenv("LD_PRELOAD");
const ScopedEnvVar sev1("LD_LIBRARY_PATH", nullptr);
const ScopedEnvVar sev2("LD_PRELOAD", nullptr);
#endif #endif


carla_setenv("ENGINE_OPTION_FORCE_STEREO", bool2str(options.forceStereo)); carla_setenv("ENGINE_OPTION_FORCE_STEREO", bool2str(options.forceStereo));
@@ -235,11 +234,6 @@ protected:
fBinary.toRawUTF8(), getPluginTypeAsString(kPlugin->getType()), filename.toRawUTF8(), fLabel.toRawUTF8(), kPlugin->getUniqueId()); fBinary.toRawUTF8(), getPluginTypeAsString(kPlugin->getType()), filename.toRawUTF8(), fLabel.toRawUTF8(), kPlugin->getUniqueId());


started = fProcess->start(arguments); started = fProcess->start(arguments);

#ifdef CARLA_OS_LINUX
if (oldPreload != nullptr)
::setenv("LD_PRELOAD", oldPreload, 1);
#endif
} }


if (! started) if (! started)


+ 1
- 1
source/carla_backend.py View File

@@ -1233,9 +1233,9 @@ class CarlaHostMeta(object):


# settings # settings
self.experimental = False self.experimental = False
self.forceStereo = False
self.manageUIs = False self.manageUIs = False
self.maxParameters = 0 self.maxParameters = 0
self.forceStereo = False
self.preferPluginBridges = False self.preferPluginBridges = False
self.preferUIBridges = False self.preferUIBridges = False
self.preventBadBehaviour = False self.preventBadBehaviour = False


+ 2
- 2
source/carla_database.py View File

@@ -1044,9 +1044,9 @@ class PluginRefreshW(QDialog):
self.loadSettings() self.loadSettings()


# ---------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------
# Disable bridges (experimental for now)
# Hide bridges if disabled


if not host.experimental:
if not host.showPluginBridges:
self.ui.ch_native.setChecked(True) self.ui.ch_native.setChecked(True)
self.ui.ch_native.setEnabled(False) self.ui.ch_native.setEnabled(False)
self.ui.ch_native.setVisible(False) self.ui.ch_native.setVisible(False)


+ 3
- 5
source/carla_host.py View File

@@ -2586,16 +2586,14 @@ def setHostSettings(host):
# kdevelop likes this :) # kdevelop likes this :)
if False: host = CarlaHostNull() if False: host = CarlaHostNull()


# TEST
#host.preventBadBehaviour = True
host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, host.forceStereo, "") host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, host.forceStereo, "")
host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, host.maxParameters, "")
host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, host.preferPluginBridges, "") host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, host.preferPluginBridges, "")
host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, host.preferUIBridges, "") host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, host.preferUIBridges, "")
host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, host.uisAlwaysOnTop, "")
host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, host.maxParameters, "")
host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, host.uiBridgesTimeout, "")
host.set_engine_option(ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, host.preventBadBehaviour, "") host.set_engine_option(ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, host.preventBadBehaviour, "")
host.set_engine_option(ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT, host.showLogs, "") host.set_engine_option(ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT, host.showLogs, "")
host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, host.uiBridgesTimeout, "")
host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, host.uisAlwaysOnTop, "")


if host.isPlugin: if host.isPlugin:
return return


+ 27
- 23
source/carla_settings.py View File

@@ -274,7 +274,7 @@ class CarlaSettingsW(QDialog):
self.ui.ch_engine_force_stereo.setEnabled(False) self.ui.ch_engine_force_stereo.setEnabled(False)


if host.isControl or host.isPlugin: if host.isControl or host.isPlugin:
self.ui.ch_advanced_load_lib_global.hide()
self.ui.ch_exp_load_lib_global.hide()


# FIXME, pipes on win32 not working # FIXME, pipes on win32 not working
if WINDOWS: if WINDOWS:
@@ -471,13 +471,17 @@ class CarlaSettingsW(QDialog):
# ---------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------
# Experimental # Experimental


self.ui.cb_advanced_plugin_bridges.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES,
CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES,
type=bool))
self.ui.cb_exp_plugin_bridges.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES,
CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES,
type=bool))


self.ui.ch_advanced_load_lib_global.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL,
CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL,
type=bool))
self.ui.ch_exp_load_lib_global.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL,
CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL,
type=bool))

self.ui.ch_exp_prevent_bad_behaviour.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR,
CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR,
type=bool))


# -------------------------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------------------------


@@ -493,18 +497,12 @@ class CarlaSettingsW(QDialog):
# ---------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------
# Main # Main


self.host.showLogs = self.ui.ch_main_show_logs.isChecked()
self.host.uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.isChecked()

settings.setValue(CARLA_KEY_MAIN_PROJECT_FOLDER, self.ui.le_main_proj_folder.text()) settings.setValue(CARLA_KEY_MAIN_PROJECT_FOLDER, self.ui.le_main_proj_folder.text())
settings.setValue(CARLA_KEY_MAIN_USE_PRO_THEME, self.ui.ch_main_theme_pro.isChecked()) settings.setValue(CARLA_KEY_MAIN_USE_PRO_THEME, self.ui.ch_main_theme_pro.isChecked())
settings.setValue(CARLA_KEY_MAIN_PRO_THEME_COLOR, self.ui.cb_main_theme_color.currentText()) settings.setValue(CARLA_KEY_MAIN_PRO_THEME_COLOR, self.ui.cb_main_theme_color.currentText())
settings.setValue(CARLA_KEY_MAIN_REFRESH_INTERVAL, self.ui.sb_main_refresh_interval.value()) settings.setValue(CARLA_KEY_MAIN_REFRESH_INTERVAL, self.ui.sb_main_refresh_interval.value())
settings.setValue(CARLA_KEY_MAIN_USE_CUSTOM_SKINS, self.ui.ch_main_use_custom_skins.isChecked()) settings.setValue(CARLA_KEY_MAIN_USE_CUSTOM_SKINS, self.ui.ch_main_use_custom_skins.isChecked())


settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, self.host.showLogs)
settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop)

# ---------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------
# Canvas # Canvas


@@ -545,29 +543,33 @@ class CarlaSettingsW(QDialog):
settings.setValue(CARLA_KEY_ENGINE_PROCESS_MODE, self.host.nextProcessMode) settings.setValue(CARLA_KEY_ENGINE_PROCESS_MODE, self.host.nextProcessMode)


self.host.forceStereo = self.ui.ch_engine_force_stereo.isChecked() self.host.forceStereo = self.ui.ch_engine_force_stereo.isChecked()
self.host.maxParameters = self.ui.sb_engine_max_params.value()
self.host.manageUIs = self.ui.ch_engine_manage_uis.isChecked()
self.host.preferPluginBridges = self.ui.ch_engine_prefer_plugin_bridges.isChecked() self.host.preferPluginBridges = self.ui.ch_engine_prefer_plugin_bridges.isChecked()
self.host.preferUIBridges = self.ui.ch_engine_prefer_ui_bridges.isChecked() self.host.preferUIBridges = self.ui.ch_engine_prefer_ui_bridges.isChecked()
self.host.maxParameters = self.ui.sb_engine_max_params.value()
self.host.showLogs = self.ui.ch_main_show_logs.isChecked()
self.host.uiBridgesTimeout = self.ui.sb_engine_ui_bridges_timeout.value() self.host.uiBridgesTimeout = self.ui.sb_engine_ui_bridges_timeout.value()
self.host.manageUIs = self.ui.ch_engine_manage_uis.isChecked()
self.host.uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.isChecked()


if self.ui.ch_engine_force_stereo.isEnabled(): if self.ui.ch_engine_force_stereo.isEnabled():
self.host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, self.host.forceStereo, "") self.host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, self.host.forceStereo, "")


self.host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, self.host.maxParameters, "")
self.host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges, "") self.host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges, "")
self.host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, self.host.preferUIBridges, "") self.host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, self.host.preferUIBridges, "")
self.host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop, "")
self.host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, self.host.maxParameters, "")
self.host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout, "") self.host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout, "")
self.host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop, "")


if self.ui.ch_engine_force_stereo.isEnabled(): if self.ui.ch_engine_force_stereo.isEnabled():
settings.setValue(CARLA_KEY_ENGINE_FORCE_STEREO, self.host.forceStereo) settings.setValue(CARLA_KEY_ENGINE_FORCE_STEREO, self.host.forceStereo)


settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, self.host.showLogs)
settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, self.host.maxParameters)
settings.setValue(CARLA_KEY_ENGINE_MANAGE_UIS, self.host.manageUIs)
settings.setValue(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges) settings.setValue(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges)
settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, self.host.preferUIBridges) settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, self.host.preferUIBridges)
settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, self.host.maxParameters)
settings.setValue(CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout) settings.setValue(CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout)
settings.setValue(CARLA_KEY_ENGINE_MANAGE_UIS, self.host.manageUIs)
settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop)


# ---------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------
# Paths # Paths
@@ -626,8 +628,9 @@ class CarlaSettingsW(QDialog):
# ---------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------
# Experimental # Experimental


settings.setValue(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, self.ui.cb_advanced_plugin_bridges.isChecked())
settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, self.ui.ch_advanced_load_lib_global.isChecked())
settings.setValue(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, self.ui.cb_exp_plugin_bridges.isChecked())
settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, self.ui.ch_exp_load_lib_global.isChecked())
settings.setValue(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, self.ui.ch_exp_prevent_bad_behaviour.isChecked())


# -------------------------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------------------------


@@ -763,8 +766,9 @@ class CarlaSettingsW(QDialog):


def resetExperimentalSettings(self): def resetExperimentalSettings(self):
# Forever experimental # Forever experimental
self.ui.cb_advanced_plugin_bridges.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES)
self.ui.ch_advanced_load_lib_global.setChecked(CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL)
self.ui.cb_exp_plugin_bridges.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES)
self.ui.ch_exp_load_lib_global.setChecked(CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL)
self.ui.ch_exp_prevent_bad_behaviour.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR)


# Temporary, until stable # Temporary, until stable
self.ui.cb_canvas_fancy_eyecandy.setChecked(CARLA_DEFAULT_CANVAS_FANCY_EYE_CANDY) self.ui.cb_canvas_fancy_eyecandy.setChecked(CARLA_DEFAULT_CANVAS_FANCY_EYE_CANDY)


+ 28
- 4
source/interposer/interposer-safe.cpp View File

@@ -22,13 +22,15 @@
#include <sched.h> #include <sched.h>
#include <spawn.h> #include <spawn.h>


#define PREVENTED_FUNC_MSG carla_stderr2("Carla prevented a plugin from calling '%s', bad plugin!", __FUNCTION__)

// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Our custom functions // Our custom functions


CARLA_EXPORT CARLA_EXPORT
pid_t fork() pid_t fork()
{ {
carla_stdout("------------------------------- fork called");
PREVENTED_FUNC_MSG;
errno = ENOSYS; errno = ENOSYS;
return -1; return -1;
} }
@@ -36,7 +38,7 @@ pid_t fork()
CARLA_EXPORT CARLA_EXPORT
int clone(int (*)(void*), void*, int, void*, ...) int clone(int (*)(void*), void*, int, void*, ...)
{ {
carla_stdout("------------------------------- clone called");
PREVENTED_FUNC_MSG;
errno = ENOSYS; errno = ENOSYS;
return -1; return -1;
} }
@@ -44,15 +46,37 @@ int clone(int (*)(void*), void*, int, void*, ...)
CARLA_EXPORT CARLA_EXPORT
int posix_spawn(pid_t*, const char*, const posix_spawn_file_actions_t*, const posix_spawnattr_t*, char* const[], char* const[]) int posix_spawn(pid_t*, const char*, const posix_spawn_file_actions_t*, const posix_spawnattr_t*, char* const[], char* const[])
{ {
carla_stdout("------------------------------- posix_spawn called");
PREVENTED_FUNC_MSG;
return ENOSYS; return ENOSYS;
} }


CARLA_EXPORT CARLA_EXPORT
int posix_spawnp(pid_t*, const char*, const posix_spawn_file_actions_t*, const posix_spawnattr_t*, char* const[], char* const[]) int posix_spawnp(pid_t*, const char*, const posix_spawn_file_actions_t*, const posix_spawnattr_t*, char* const[], char* const[])
{ {
carla_stdout("------------------------------- posix_spawnp called");
PREVENTED_FUNC_MSG;
return ENOSYS; return ENOSYS;
} }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------

CARLA_EXPORT
void gtk_init(int*, char***)
{
PREVENTED_FUNC_MSG;
}

CARLA_EXPORT
int gtk_init_check(int*, char***)
{
PREVENTED_FUNC_MSG;
return 0;
}

CARLA_EXPORT
int gtk_init_with_args(int*, char***, const char*, void*, const char*, void**)
{
PREVENTED_FUNC_MSG;
return 0;
}

// -----------------------------------------------------------------------

+ 2
- 1
source/utils/CarlaPipeUtils.cpp View File

@@ -197,7 +197,8 @@ bool waitForClientConnect(const HANDLE pipe, const uint32_t timeOutMilliseconds)
static inline static inline
bool startProcess(const char* const argv[], pid_t& pidinst) noexcept bool startProcess(const char* const argv[], pid_t& pidinst) noexcept
{ {
const ScopedEnvVar sev("LD_LIBRARY_PATH", nullptr);
const ScopedEnvVar sev1("LD_LIBRARY_PATH", nullptr);
const ScopedEnvVar sev2("LD_PRELOAD", nullptr);


const pid_t ret = pidinst = vfork(); const pid_t ret = pidinst = vfork();




Loading…
Cancel
Save