From fa3b38e72d633fd179dd03f9665f6d84f742cf0f Mon Sep 17 00:00:00 2001 From: Waldemar Kozaczuk Date: Wed, 29 Jun 2022 17:33:38 -0400 Subject: [PATCH] add another C-wrapper: osv_run_app() In preparation to support building and running ZFS images on the kernel built with most symbols hidden, this patch adds new C function - osv_run_app() - that wraps code to run an arbitrary app. This will allow an application like mkfs.so to be changed to not have to depend on C++ symbols like osv::run() from OSv kernel. Refs #1186 Signed-off-by: Waldemar Kozaczuk --- core/osv_c_wrappers.cc | 9 +++++++++ exported_symbols/osv_module_api.symbols | 1 + include/osv/osv_c_wrappers.h | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/core/osv_c_wrappers.cc b/core/osv_c_wrappers.cc index ef2dc1970a..6b03d17da4 100644 --- a/core/osv_c_wrappers.cc +++ b/core/osv_c_wrappers.cc @@ -143,6 +143,15 @@ void osv_current_app_on_termination_request(void (*handler)()) { osv::this_application::on_termination_request(handler); } +extern "C" OSV_MODULE_API +int osv_run_app(const char *app_path, const char *args[], int args_len) { + int ret; + std::vector _args(args, args + args_len); + auto ok = run(app_path, _args, &ret); + assert(ok); + return ret; +} + extern bool verbose; extern "C" OSV_MODULE_API bool osv_debug_enabled() { diff --git a/exported_symbols/osv_module_api.symbols b/exported_symbols/osv_module_api.symbols index 2ba5050c55..d0e5e52fea 100644 --- a/exported_symbols/osv_module_api.symbols +++ b/exported_symbols/osv_module_api.symbols @@ -7,4 +7,5 @@ osv_get_all_app_threads osv_get_all_threads osv_hypervisor_name osv_processor_features +osv_run_app osv_version diff --git a/include/osv/osv_c_wrappers.h b/include/osv/osv_c_wrappers.h index f891c8e977..0f66e5d2ff 100644 --- a/include/osv/osv_c_wrappers.h +++ b/include/osv/osv_c_wrappers.h @@ -127,6 +127,11 @@ bool osv_debug_enabled(); */ void osv_current_app_on_termination_request(void (*handler)()); +/* + * Start an app and wait until it terminates + */ +int osv_run_app(const char *app_path, const char *args[], int args_len); + #ifdef __cplusplus } #endif