From 9dc3644fc1eff4c1768cd2432179dc3292bca5b5 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sat, 30 May 2026 10:19:33 +0100 Subject: [PATCH] herdd: update kernel and fx usage --- services/herdd/CMakeLists.txt | 2 +- services/herdd/main.c | 6 +-- services/herdd/runlevel.c | 65 +++++++++++++++++++----------- services/herdd/service.c | 74 +++++++++++++++++++++++------------ services/herdd/service.h | 1 + 5 files changed, 97 insertions(+), 51 deletions(-) diff --git a/services/herdd/CMakeLists.txt b/services/herdd/CMakeLists.txt index 69783b9..e9f0f11 100644 --- a/services/herdd/CMakeLists.txt +++ b/services/herdd/CMakeLists.txt @@ -3,7 +3,7 @@ add_executable(herdd ${sources}) target_link_libraries(herdd libc libc-runtime libmagenta libpthread liblaunch librosetta - fx-core fx-ds fx-serial) + fx.runtime fx.collections fx.serial) sysroot_add_program( NAME herdd diff --git a/services/herdd/main.c b/services/herdd/main.c index cc4fd0b..1b271b7 100644 --- a/services/herdd/main.c +++ b/services/herdd/main.c @@ -6,9 +6,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/services/herdd/runlevel.c b/services/herdd/runlevel.c index c0c5db6..a519690 100644 --- a/services/herdd/runlevel.c +++ b/services/herdd/runlevel.c @@ -4,11 +4,12 @@ #include "service.h" #include -#include -#include -#include +#include +#include #include -#include +#include +#include +#include #include #include #include @@ -22,36 +23,48 @@ struct queue *global_runlevels(void) static int parse_runlevel_data(fx_object *in, struct runlevel *out) { - if (!fx_object_is_type(in, FX_TYPE_DICT)) { + if (!fx_object_is_type(in, FX_TYPE_HASHTABLE)) { return -1; } - fx_dict *in_runlevel = fx_dict_at(in, "runlevel"); - if (!in_runlevel || !fx_object_is_type(in_runlevel, FX_TYPE_DICT)) { + const fx_value *runlevel_v = fx_hashtable_get(in, &FX_CSTR("runlevel")); + if (!runlevel_v || !fx_value_is_type(runlevel_v, FX_TYPE_HASHTABLE)) { return -1; } + fx_hashtable *in_runlevel = NULL; + fx_value_get_object(runlevel_v, &in_runlevel); - fx_string *name = fx_dict_at(in_runlevel, "name"); - if (!name || !fx_object_is_type(name, FX_TYPE_STRING)) { + const fx_value *name_v + = fx_hashtable_get(in_runlevel, &FX_CSTR("name")); + if (!name_v || !fx_value_is_type(name_v, FX_TYPE_STRING)) { return -1; } + fx_string *name = NULL; + fx_value_get_object(name_v, &name); - fx_string *description = fx_dict_at(in_runlevel, "description"); - if (!description || !fx_object_is_type(description, FX_TYPE_STRING)) { + const fx_value *description_v + = fx_hashtable_get(in_runlevel, &FX_CSTR("description")); + if (!description_v + || !fx_value_is_type(description_v, FX_TYPE_STRING)) { return -1; } + fx_string *description = NULL; + fx_value_get_object(description_v, &description); - fx_array *deps = fx_dict_at(in_runlevel, "requires"); - if (deps && !fx_object_is_type(deps, FX_TYPE_ARRAY)) { + const fx_value *deps_v + = fx_hashtable_get(in_runlevel, &FX_CSTR("requires")); + if (deps_v && !fx_value_is_type(deps_v, FX_TYPE_ARRAY)) { return -1; } + fx_array *deps = NULL; + fx_value_get_object(deps_v, &deps); int ret = 0; - size_t dep_count = fx_array_size(deps); - fx_iterator *it = fx_iterator_begin(deps); - fx_foreach_ptr(fx_string, dep, it) + size_t dep_count = fx_array_get_size(deps); + const fx_iterator *it = fx_iterator_begin(deps); + fx_foreach(dep, it) { - if (!fx_object_is_type(dep, FX_TYPE_STRING)) { + if (!fx_value_is_type(dep, FX_TYPE_STRING)) { ret = -1; break; } @@ -66,9 +79,11 @@ static int parse_runlevel_data(fx_object *in, struct runlevel *out) out->rl_requires = calloc(dep_count, sizeof(char *)); it = fx_iterator_begin(deps); size_t i = 0; - fx_foreach_ptr(fx_string, dep, it) + fx_foreach(dep, it) { - out->rl_requires[i++] = fx_string_steal(dep); + fx_string *str = NULL; + fx_value_get_object(dep, &str); + out->rl_requires[i++] = fx_string_steal(str); } fx_iterator_unref(it); @@ -94,7 +109,7 @@ int runlevel_load(const char *path, struct runlevel **out) fx_stream *in = fx_stream_open_fp(fp); fx_serial_ctx *ctx = fx_toml_serial_ctx_create(); - fx_object *data; + fx_value data; fx_result result = fx_serial_ctx_deserialise(ctx, in, &data, 0); if (fx_result_is_error(result)) { fx_throw(result); @@ -103,14 +118,20 @@ int runlevel_load(const char *path, struct runlevel **out) return -1; } - if (parse_runlevel_data(data, rl) != 0) { + if (!fx_value_is_type(&data, FX_TYPE_HASHTABLE)) { + free(rl); + errno = EFTYPE; + return -1; + } + + if (parse_runlevel_data(data.v_object, rl) != 0) { free(rl); errno = EFTYPE; return -1; } fx_stream_unref(in); - fx_object_unref(data); + fx_value_unset(&data); fclose(fp); diff --git a/services/herdd/service.c b/services/herdd/service.c index 55ff349..aa700a6 100644 --- a/services/herdd/service.c +++ b/services/herdd/service.c @@ -3,12 +3,13 @@ #include "log.h" #include -#include -#include -#include +#include +#include #include +#include +#include #include -#include +#include #include #include #include @@ -23,45 +24,60 @@ struct queue *global_services(void) static int parse_service_data(fx_object *in, struct service *out) { - if (!fx_object_is_type(in, FX_TYPE_DICT)) { + if (!fx_object_is_type(in, FX_TYPE_HASHTABLE)) { return -1; } - fx_dict *in_service = fx_dict_at(in, "service"); - if (!in_service || !fx_object_is_type(in_service, FX_TYPE_DICT)) { + const fx_value *service_v = fx_hashtable_get(in, &FX_CSTR("service")); + if (!service_v || !fx_value_is_type(service_v, FX_TYPE_HASHTABLE)) { return -1; } + fx_hashtable *in_service = NULL; + fx_value_get_object(service_v, &in_service); - fx_dict *in_unit = fx_dict_at(in, "unit"); - if (!in_unit || !fx_object_is_type(in_unit, FX_TYPE_DICT)) { + const fx_value *unit_v = fx_hashtable_get(in, &FX_CSTR("unit")); + if (!unit_v || !fx_value_is_type(unit_v, FX_TYPE_HASHTABLE)) { return -1; } + fx_hashtable *in_unit = NULL; + fx_value_get_object(unit_v, &in_unit); - fx_string *name = fx_dict_at(in_unit, "name"); - if (!name || !fx_object_is_type(name, FX_TYPE_STRING)) { + const fx_value *name_v = fx_hashtable_get(in_unit, &FX_CSTR("name")); + if (!name_v || !fx_value_is_type(name_v, FX_TYPE_STRING)) { return -1; } + fx_string *name = NULL; + fx_value_get_object(name_v, &name); - fx_string *description = fx_dict_at(in_unit, "description"); - if (!description || !fx_object_is_type(description, FX_TYPE_STRING)) { + const fx_value *description_v + = fx_hashtable_get(in_unit, &FX_CSTR("description")); + if (!description_v + || !fx_value_is_type(description_v, FX_TYPE_STRING)) { return -1; } + fx_string *description = NULL; + fx_value_get_object(description_v, &description); - fx_string *exec = fx_dict_at(in_service, "exec"); - if (!description || !fx_object_is_type(description, FX_TYPE_STRING)) { + const fx_value *exec_v = fx_hashtable_get(in_service, &FX_CSTR("exec")); + if (!exec_v || !fx_value_is_type(exec_v, FX_TYPE_STRING)) { return -1; } + fx_string *exec = NULL; + fx_value_get_object(exec_v, &exec); - fx_array *roles = fx_dict_at(in_service, "roles"); - if (roles && !fx_object_is_type(roles, FX_TYPE_ARRAY)) { + const fx_value *roles_v + = fx_hashtable_get(in_service, &FX_CSTR("roles")); + if (roles_v && !fx_value_is_type(roles_v, FX_TYPE_ARRAY)) { return -1; } + fx_array *roles = NULL; + fx_value_get_object(roles_v, &roles); int ret = 0; - fx_iterator *it = fx_iterator_begin(roles); - fx_foreach_ptr(fx_string, role, it) + const fx_iterator *it = fx_iterator_begin(roles); + fx_foreach(v, it) { - if (!fx_object_is_type(role, FX_TYPE_STRING)) { + if (!fx_value_is_type(v, FX_TYPE_STRING)) { ret = -1; break; } @@ -74,9 +90,10 @@ static int parse_service_data(fx_object *in, struct service *out) it = fx_iterator_begin(roles); size_t i = 0; - fx_foreach_ptr(fx_string, role, it) + fx_foreach(role, it) { - const char *role_cstr = fx_string_get_cstr(role); + const char *role_cstr = NULL; + fx_value_get_cstr(role, &role_cstr); if (!strcmp(role_cstr, "NamespaceProvider")) { out->s_roles |= SVC_ROLE_NAMESPACE_PROVIDER; } @@ -106,7 +123,7 @@ int service_load(const char *path, struct service **out) fx_stream *in = fx_stream_open_fp(fp); fx_serial_ctx *ctx = fx_toml_serial_ctx_create(); - fx_object *data; + fx_value data; fx_result result = fx_serial_ctx_deserialise(ctx, in, &data, 0); if (fx_result_is_error(result)) { fx_throw(result); @@ -115,14 +132,21 @@ int service_load(const char *path, struct service **out) return -1; } - if (parse_service_data(data, rl) != 0) { + if (!fx_value_is_type(&data, FX_TYPE_HASHTABLE)) { + fx_value_unset(&data); + free(rl); + errno = EFTYPE; + return -1; + } + + if (parse_service_data(data.v_object, rl) != 0) { free(rl); errno = EFTYPE; return -1; } fx_stream_unref(in); - fx_object_unref(data); + fx_value_unset(&data); fclose(fp); diff --git a/services/herdd/service.h b/services/herdd/service.h index a021001..7231b6c 100644 --- a/services/herdd/service.h +++ b/services/herdd/service.h @@ -2,6 +2,7 @@ #define SERVICE_H_ #include "queue.h" + enum service_role { SVC_ROLE_NONE = 0x00u, SVC_ROLE_NAMESPACE_PROVIDER = 0x01u,