summaryrefslogtreecommitdiff
path: root/libvyosconfig
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2026-06-23 13:39:35 -0500
committerJohn Estabrook <jestabro@vyos.io>2026-06-24 10:40:29 -0500
commit9e9a3729fe671ca7aaf8b82473217ead8121a4cf (patch)
tree100541fb9aeb8af1fc56fb9b75e961b18c822839 /libvyosconfig
parentd3826867554eb9dbd30d5c8c781516a8afcfd96b (diff)
downloadvyos-1x-9e9a3729fe671ca7aaf8b82473217ead8121a4cf.tar.gz
vyos-1x-9e9a3729fe671ca7aaf8b82473217ead8121a4cf.zip
T8993: initialize ReferenceTree module from string not file
Avoid initialization error in threaded applications, for example when calling libvyosconfig functions from FastAPI background tasks. The read_internal function from file relies on the inherently non thread-safe Unix module; read string first and pass to lib read_string.
Diffstat (limited to 'libvyosconfig')
-rw-r--r--libvyosconfig/lib/bindings.ml12
1 files changed, 12 insertions, 0 deletions
diff --git a/libvyosconfig/lib/bindings.ml b/libvyosconfig/lib/bindings.ml
index d35df0e0b..3c20912fc 100644
--- a/libvyosconfig/lib/bindings.ml
+++ b/libvyosconfig/lib/bindings.ml
@@ -135,6 +135,17 @@ let write_internal_reference_tree c_ptr file =
with Internal.Write_error msg ->
error_message := msg
+let read_internal_string_reference_tree s =
+ (* alert exn Internal.read_string:
+ [Internal.Read_error] caught
+ *)
+ try
+ error_message := "";
+ let rt = (IR.read_string[@alert "-exn"]) s in
+ Ctypes.Root.create rt
+ with Internal.Read_error msg ->
+ error_message := msg; Ctypes.null
+
let create_node c_ptr path =
(* alert exn CT.create_node:
[Vytree.Empty_path] caught
@@ -546,6 +557,7 @@ struct
let () = I.internal "to_json_reference_tree" ((ptr void) @-> returning string) render_json_reference_tree
let () = I.internal "read_internal_reference_tree" (string @-> returning (ptr void)) read_internal_reference_tree
let () = I.internal "write_internal_reference_tree" ((ptr void) @-> string @-> returning void) write_internal_reference_tree
+ let () = I.internal "read_internal_string_reference_tree" (string @-> returning (ptr void)) read_internal_string_reference_tree
let () = I.internal "create_node" ((ptr void) @-> string @-> returning int) create_node
let () = I.internal "set_add_value" ((ptr void) @-> string @-> string @-> returning int) set_add_value
let () = I.internal "set_replace_value" ((ptr void) @-> string @-> string @-> returning int) set_replace_value