diff options
| author | John Estabrook <jestabro@vyos.io> | 2026-06-23 13:39:35 -0500 |
|---|---|---|
| committer | John Estabrook <jestabro@vyos.io> | 2026-06-24 10:40:29 -0500 |
| commit | 9e9a3729fe671ca7aaf8b82473217ead8121a4cf (patch) | |
| tree | 100541fb9aeb8af1fc56fb9b75e961b18c822839 /libvyosconfig | |
| parent | d3826867554eb9dbd30d5c8c781516a8afcfd96b (diff) | |
| download | vyos-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.ml | 12 |
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 |
