diff --git a/repos/ports/include/noux_session/connection.h b/repos/ports/include/noux_session/connection.h index ca3a9afb7..d8b73a031 100644 --- a/repos/ports/include/noux_session/connection.h +++ b/repos/ports/include/noux_session/connection.h @@ -31,16 +31,6 @@ struct Noux::Connection : Genode::Connection, Session_client Session_client(cap()) { } - /** - * Constructor - * - * \noapi - * \deprecated Use the constructor with 'Env &' as first - * argument instead - */ - Connection() __attribute__((deprecated)) - : Genode::Connection(session("")), Session_client(cap()) { } - /** * Remove session ID of the noux session from the ID space. * diff --git a/repos/ports/src/lib/libc_noux/plugin.cc b/repos/ports/src/lib/libc_noux/plugin.cc index effaa599f..55b220f46 100644 --- a/repos/ports/src/lib/libc_noux/plugin.cc +++ b/repos/ports/src/lib/libc_noux/plugin.cc @@ -564,7 +564,7 @@ static void * in_stack_area; static jmp_buf fork_jmp_buf; static Genode::Capability::Raw new_parent; -extern "C" void stdout_reconnect(); /* provided by 'log_console.cc' */ +extern "C" void stdout_reconnect(Genode::Parent &); /* provided by 'default_log.cc' */ /* @@ -577,7 +577,7 @@ extern "C" void fork_trampoline() _env_ptr->reinit(new_parent); /* reinitialize standard-output connection */ - stdout_reconnect(); + stdout_reconnect(_env_ptr->parent()); /* reinitialize noux connection */ noux_connection()->reconnect(); diff --git a/repos/ports/src/noux/child_env.h b/repos/ports/src/noux/child_env.h index 749dfc52b..fc44663fe 100644 --- a/repos/ports/src/noux/child_env.h +++ b/repos/ports/src/noux/child_env.h @@ -90,7 +90,7 @@ class Noux::Child_env char const *args, Vfs::File_system &root_dir, Vfs_io_waiter_registry &vfs_io_waiter_registry, - Ram_session &ram, + Ram_allocator &ram, Region_map &rm, Allocator &alloc) { @@ -212,7 +212,7 @@ class Noux::Child_env char const *args, Sysio::Env env, Vfs::File_system &root_dir, Vfs_io_waiter_registry &vfs_io_waiter_registry, - Ram_session &ram, + Ram_allocator &ram, Region_map &rm, Allocator &alloc) { diff --git a/repos/ports/src/noux/child_policy.h b/repos/ports/src/noux/child_policy.h index 6c65e1fd4..82dde8356 100644 --- a/repos/ports/src/noux/child_policy.h +++ b/repos/ports/src/noux/child_policy.h @@ -78,6 +78,45 @@ class Noux::Child_policy : public Genode::Child_policy return service; } + /** + * Find suitable service for a given session request + * + * \throw Service_denied + */ + Service &_matching_service(Service::Name const &service_name, + Session_label const &label) + { + /* + * Route initial ROM requests (binary and linker) of a forked child + * to the empty ROM service, since the ROMs are already attached in + * the replayed region map. + */ + if (_forked && (service_name == Genode::Rom_session::service_name())) { + if (label.last_element() == name()) return _empty_rom_service; + if (label.last_element() == linker_name()) return _empty_rom_service; + } + + Genode::Service *service = nullptr; + + /* check for local ROM requests */ + if ((service = _args_policy .resolve_session_request_with_label(service_name, label)) + || (service = _env_policy .resolve_session_request_with_label(service_name, label)) + || (service = _config_policy.resolve_session_request_with_label(service_name, label))) + return *service; + + /* check for local services */ + if (service_name == Genode::Cpu_session::service_name()) return _cpu_service; + if (service_name == Genode::Rom_session::service_name()) return _rom_service; + if (service_name == Genode::Pd_session::service_name()) return _pd_service; + if (service_name == Noux::Session::service_name()) return _noux_service; + + /* check for parent services */ + if ((service = _find_service(_parent_services, service_name))) + return *service; + + throw Service_denied(); + } + public: Child_policy(Name const &name, @@ -135,40 +174,12 @@ class Noux::Child_policy : public Genode::Child_policy session.ref_account(_ref_pd_cap); } - Service &resolve_session_request(Service::Name const &service_name, - Session_state::Args const &args) override + Route resolve_session_request(Service::Name const &service_name, + Session_label const &label) override { - Session_label const label(Genode::label_from_args(args.string())); - - /* - * Route initial ROM requests (binary and linker) of a forked child - * to the empty ROM service, since the ROMs are already attached in - * the replayed region map. - */ - if (_forked && (service_name == Genode::Rom_session::service_name())) { - if (label.last_element() == name()) return _empty_rom_service; - if (label.last_element() == linker_name()) return _empty_rom_service; - } - - Genode::Service *service = nullptr; - - /* check for local ROM requests */ - if ((service = _args_policy .resolve_session_request(service_name.string(), args.string())) - || (service = _env_policy .resolve_session_request(service_name.string(), args.string())) - || (service = _config_policy.resolve_session_request(service_name.string(), args.string()))) - return *service; - - /* check for local services */ - if (service_name == Genode::Cpu_session::service_name()) return _cpu_service; - if (service_name == Genode::Rom_session::service_name()) return _rom_service; - if (service_name == Genode::Pd_session::service_name()) return _pd_service; - if (service_name == Noux::Session::service_name()) return _noux_service; - - /* check for parent services */ - if ((service = _find_service(_parent_services, service_name))) - return *service; - - throw Service_denied(); + return Route { .service = _matching_service(service_name, label), + .label = label, + .diag = Session::Diag() }; } void exit(int exit_value) override diff --git a/repos/ports/src/noux/main.cc b/repos/ports/src/noux/main.cc index 6837f4bfb..92f6bdcfc 100644 --- a/repos/ports/src/noux/main.cc +++ b/repos/ports/src/noux/main.cc @@ -59,23 +59,24 @@ static Noux::Sysio::Env &env_string_of_init_process(Genode::Xml_node config) /* read environment variables for init process from config */ Genode::Xml_node start_node = config.sub_node("start"); try { - Genode::Xml_node arg_node = start_node.sub_node("env"); - for (; ; arg_node = arg_node.next("env")) { - static char name_buf[256], value_buf[256]; + Genode::Xml_node node = start_node.sub_node("env"); + for (; ; node = node.next("env")) { - arg_node.attribute("name").value(name_buf, sizeof(name_buf)); - arg_node.attribute("value").value(value_buf, sizeof(value_buf)); + typedef Genode::String<256> Var; + Var const var(node.attribute_value("name", Var()), "=", + node.attribute_value("value", Var())); - Genode::size_t env_var_size = Genode::strlen(name_buf) + - Genode::strlen("=") + - Genode::strlen(value_buf) + 1; - if (index + env_var_size < sizeof(env)) { - Genode::snprintf(&env[index], env_var_size, "%s=%s", name_buf, value_buf); - index += env_var_size; - } else { + bool const env_exeeded = index + var.length() >= sizeof(env); + bool const var_exeeded = (var.length() == var.capacity()); + + if (env_exeeded || var_exeeded) { + warning("truncated environment variable: ", node); env[index] = 0; break; } + + Genode::strncpy(&env[index], var.string(), var.length()); + index += var.length(); } } catch (Genode::Xml_node::Nonexistent_sub_node) { } @@ -171,8 +172,8 @@ struct Noux::Main /* whitelist of service requests to be routed to the parent */ Noux::Parent_services _parent_services { }; - Noux::Parent_service _log_parent_service { _parent_services, "LOG" }; - Noux::Parent_service _timer_parent_service { _parent_services, "Timer" }; + Noux::Parent_service _log_parent_service { _parent_services, _env, "LOG" }; + Noux::Parent_service _timer_parent_service { _parent_services, _env, "Timer" }; Attached_rom_dataspace _config { _env, "config" }; diff --git a/repos/ports/src/noux/pd_session_component.h b/repos/ports/src/noux/pd_session_component.h index c2e935bd8..5b16dfef2 100644 --- a/repos/ports/src/noux/pd_session_component.h +++ b/repos/ports/src/noux/pd_session_component.h @@ -124,7 +124,7 @@ class Noux::Pd_session_component : public Rpc_object enum { NUM_ATTEMPTS = 3 }; return retry( [&] () { return func(); }, - [&] () { _ref_pd.transfer_quota(_pd, upgrade); }, + [&] () { _ref_pd.transfer_quota(_pd.rpc_cap(), upgrade); }, NUM_ATTEMPTS); } @@ -151,7 +151,7 @@ class Noux::Pd_session_component : public Rpc_object * via '_with_automatic_cap_upgrade'. */ _pd.ref_account(env.pd_session_cap()); - _ref_pd.transfer_quota(_pd, Cap_quota{10}); + _ref_pd.transfer_quota(_pd.rpc_cap(), Cap_quota{10}); } ~Pd_session_component() diff --git a/repos/ports/src/noux/rom_session_component.h b/repos/ports/src/noux/rom_session_component.h index 12f3d9422..ddb76ceca 100644 --- a/repos/ports/src/noux/rom_session_component.h +++ b/repos/ports/src/noux/rom_session_component.h @@ -35,14 +35,13 @@ namespace Noux { struct Noux::Vfs_dataspace { typedef Child_policy::Name Name; + Name const name; Vfs::File_system &root_dir; Vfs_io_waiter_registry &vfs_io_waiter_registry; - - Name const name; - Genode::Ram_session &ram; - Genode::Region_map &rm; - Genode::Allocator &alloc; + Genode::Ram_allocator &ram; + Genode::Region_map &rm; + Genode::Allocator &alloc; Dataspace_capability ds { }; bool got_ds_from_vfs { true }; @@ -50,11 +49,12 @@ struct Noux::Vfs_dataspace Vfs_dataspace(Vfs::File_system &root_dir, Vfs_io_waiter_registry &vfs_io_waiter_registry, Name const &name, - Genode::Ram_session &ram, Genode::Region_map &rm, - Genode::Allocator &alloc) + Genode::Ram_allocator &ram, Genode::Region_map &rm, + Genode::Allocator &alloc) : + name(name), root_dir(root_dir), vfs_io_waiter_registry(vfs_io_waiter_registry), - name(name), ram(ram), rm(rm), alloc(alloc) + ram(ram), rm(rm), alloc(alloc) { ds = root_dir.dataspace(name.string());