@voxgig/sdkgen 4.10.0 → 4.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/voxgig-sdkgen +1 -1
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +330 -0
- package/project/.sdk/model/target/c.aon +15 -2
- package/project/.sdk/model/target/cpp.aon +18 -0
- package/project/.sdk/model/target/lua.aon +17 -0
- package/project/.sdk/model/target/ocaml.aon +48 -5
- package/project/.sdk/model/target/zig.aon +30 -4
- package/project/.sdk/src/cmp/c/Config_c.ts +338 -1
- package/project/.sdk/src/cmp/c/Main_c.ts +57 -2
- package/project/.sdk/src/cmp/c/Package_c.ts +12 -2
- package/project/.sdk/src/cmp/cpp/Config_cpp.ts +324 -2
- package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +2 -0
- package/project/.sdk/src/cmp/cpp/Main_cpp.ts +62 -4
- package/project/.sdk/src/cmp/cpp/Package_cpp.ts +10 -0
- package/project/.sdk/src/cmp/lua/Config_lua.ts +88 -0
- package/project/.sdk/src/cmp/lua/Gitignore_lua.ts +4 -0
- package/project/.sdk/src/cmp/lua/Main_lua.ts +93 -3
- package/project/.sdk/src/cmp/lua/Package_lua.ts +60 -0
- package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +10 -0
- package/project/.sdk/src/cmp/ocaml/Config_ocaml.ts +183 -5
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +160 -3
- package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +25 -1
- package/project/.sdk/src/cmp/zig/Config_zig.ts +130 -9
- package/project/.sdk/src/cmp/zig/Main_zig.ts +208 -4
- package/project/.sdk/{tm/zig/build.zig → src/cmp/zig/fragment/Build.fragment.zig} +7 -0
- package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +25 -0
- package/project/.sdk/{tm/zig/root.zig → src/cmp/zig/fragment/Root.fragment.zig} +9 -0
- package/project/.sdk/tm/c/Makefile +58 -9
- package/project/.sdk/tm/c/core/sdk.h +10 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.c +133 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.h +39 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.c +83 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.h +48 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.c +413 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.h +24 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.c +264 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.h +29 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.c +220 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.c +97 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.c +237 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.h +17 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.c +1494 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.c +288 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.h +80 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.c +170 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.h +52 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.c +98 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.c +150 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.h +104 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.c +649 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.c +151 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.h +34 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/aws.c +281 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/azuresecrets.c +207 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/boru.c +164 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/clock.c +75 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/doppler.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/encode.c +144 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/gcpsecrets.c +177 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/hashicorp.c +239 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/httpjson.c +599 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/infisical.c +165 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/onepassword.c +194 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/proc.c +233 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/secretspec.c +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sekretoplugins.h +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sha256.c +270 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sigv4.c +382 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/support.h +153 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/tls.c +420 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/internal.h +86 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/json.c +721 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/providers.c +813 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.c +944 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.h +490 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/util.c +442 -0
- package/project/.sdk/tm/c/feature/secrets.c +797 -0
- package/project/.sdk/tm/c/feature/secrets.h +46 -0
- package/project/.sdk/tm/c/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/c/tests/feature/secrets/secrets_test.c +802 -0
- package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +38 -11
- package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +40 -6
- package/project/.sdk/tm/cpp/Makefile +48 -4
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.hpp +41 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.cpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.hpp +66 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.cpp +376 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.hpp +29 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.cpp +230 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.hpp +31 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.cpp +205 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.cpp +84 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.hpp +24 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.cpp +222 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.hpp +21 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.cpp +1200 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.hpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.cpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.hpp +22 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.cpp +110 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.hpp +79 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.cpp +136 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.hpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.cpp +82 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.cpp +90 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.hpp +65 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.cpp +491 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.hpp +120 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.cpp +143 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.hpp +36 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.cpp +248 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.hpp +30 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.cpp +149 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.cpp +117 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.cpp +180 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.hpp +52 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.cpp +87 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.cpp +153 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.cpp +666 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.hpp +160 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.cpp +123 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.cpp +125 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.cpp +223 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.cpp +104 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.cpp +242 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.hpp +58 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.cpp +260 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.cpp +476 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.hpp +89 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.cpp +312 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.hpp +263 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.cpp +354 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.hpp +111 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.cpp +613 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.hpp +227 -0
- package/project/.sdk/tm/cpp/feature/secrets.hpp +745 -0
- package/project/.sdk/tm/cpp/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/cpp/test/feature/secrets/secrets_test.cpp +808 -0
- package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +34 -8
- package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +85 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +17 -2
- package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +41 -0
- package/project/.sdk/tm/go/feature/secrets_feature.go +32 -10
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +116 -0
- package/project/.sdk/tm/java/feature/SecretsFeature.java +33 -8
- package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +64 -0
- package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +34 -11
- package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +73 -0
- package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +32 -7
- package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +69 -0
- package/project/.sdk/tm/lua/Makefile +15 -4
- package/project/.sdk/tm/lua/feature/secrets/native/sekretonet.c +806 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/capability.lua +135 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/catalog.lua +63 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/config.lua +361 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/depend.lua +232 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/env.lua +168 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/export.lua +66 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/graph.lua +194 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/host.lua +1190 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/json.lua +169 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/order.lua +207 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/point.lua +106 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/ref.lua +115 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/resolve.lua +78 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/types.lua +275 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/version.lua +131 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin.lua +76 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/addr.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/err.lua +47 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/name.lua +315 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/aws.lua +228 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/azuresecrets.lua +137 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/boru.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/crypto.lua +212 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/doppler.lua +89 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/gcpsecrets.lua +129 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/hashicorp.lua +154 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/httpjson.lua +248 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/infisical.lua +113 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/json.lua +449 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/net.lua +198 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/onepassword.lua +126 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/secretspec.lua +93 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/sigv4.lua +269 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/support.lua +146 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/providers.lua +346 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto.lua +479 -0
- package/project/.sdk/tm/lua/feature/secrets_feature.lua +690 -0
- package/project/.sdk/tm/lua/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/lua/test/extend_test.lua +105 -0
- package/project/.sdk/tm/lua/test/feature/secrets/secrets_feature_test.lua +862 -0
- package/project/.sdk/tm/ocaml/Makefile +52 -8
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/capability.ml +106 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/catalog.ml +43 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/config.ml +349 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/defs.ml +143 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/depend.ml +217 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/env.ml +197 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/export.ml +89 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/graph.ml +227 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/host.ml +1112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/order.ml +202 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/point.ml +138 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/ref.ml +126 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/resolve.ml +62 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/types.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/value.ml +387 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/version.ml +139 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/aws.ml +171 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/azuresecrets.ml +116 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/boru.ml +95 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/crypto.ml +149 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/doppler.ml +61 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/gcpsecrets.ml +93 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/hashicorp.ml +120 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/http.ml +421 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/httpjson.ml +66 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/infisical.ml +85 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/onepassword.ml +112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/runcmd.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/secretspec.ml +68 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/sigv4.ml +259 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls.ml +44 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls_stubs.c +358 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/json.ml +376 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/provider.ml +647 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/secret.ml +299 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/sekreto.ml +347 -0
- package/project/.sdk/tm/ocaml/feature/secrets_feature.ml +453 -0
- package/project/.sdk/tm/ocaml/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +670 -0
- package/project/.sdk/tm/perl/feature/secrets_feature.pm +33 -12
- package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +47 -0
- package/project/.sdk/tm/php/feature/SecretsFeature.php +30 -6
- package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +98 -0
- package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +28 -6
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +114 -0
- package/project/.sdk/tm/rb/feature/secrets_feature.rb +28 -6
- package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +93 -0
- package/project/.sdk/tm/rust/feature/secrets.rs +33 -10
- package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +96 -0
- package/project/.sdk/tm/scala/feature/SecretsFeature.scala +29 -7
- package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +71 -0
- package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +35 -12
- package/project/.sdk/tm/ts/test/feature/secrets/Secrets.test.ts +73 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/capability.zig +137 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/catalog.zig +90 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/config.zig +346 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/depend.zig +244 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/env.zig +201 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/export.zig +83 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/graph.zig +212 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/host.zig +1224 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/inst.zig +126 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/order.zig +228 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/plugin.zig +34 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/point.zig +166 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/ref.zig +147 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/resolve.zig +74 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/types.zig +140 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/value.zig +662 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/version.zig +139 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/aws.zig +294 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/azuresecrets.zig +222 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/boru.zig +188 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/doppler.zig +135 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/gcpsecrets.zig +170 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/hashicorp.zig +242 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/httpjson.zig +535 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/infisical.zig +167 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/onepassword.zig +202 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/secretspec.zig +160 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/sigv4.zig +336 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/addr.zig +148 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/builtins.zig +259 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/provider.zig +440 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/sekreto.zig +944 -0
- package/project/.sdk/tm/zig/feature/secrets.zig +854 -0
- package/project/.sdk/tm/zig/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/zig/test/feature/secrets/secrets_test.zig +891 -0
- package/project/sdkgen-package.json +1 -1
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (c/src/util.c)
|
|
2
|
+
// Source: https://github.com/voxgig/sekreto @ 1267ee2e5f49566bc92695bc9eb3a60ef4924998 [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* The arena, the buffer, and the two ordered containers everything else
|
|
5
|
+
* is built from.
|
|
6
|
+
*
|
|
7
|
+
* C has no garbage collector and this library hands strings back at every
|
|
8
|
+
* turn - a secret, a describe(), an error message - so ownership is the
|
|
9
|
+
* first thing to settle. It is settled by not having any: every
|
|
10
|
+
* allocation comes from one arena, and the arena is freed in one call.
|
|
11
|
+
* There is no free() anywhere else in this port, which means there is no
|
|
12
|
+
* double free, no use-after-free and no leak on an error path - the arm
|
|
13
|
+
* every C library gets wrong.
|
|
14
|
+
*
|
|
15
|
+
* The cost is that a long-lived Sekreto accumulates. That is the right
|
|
16
|
+
* trade for a library read on an application's startup path and for a CLI
|
|
17
|
+
* that exits: the alternative is refcounting every string that crosses
|
|
18
|
+
* the provider boundary, which is where the bugs live.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
#define _POSIX_C_SOURCE 200809L
|
|
22
|
+
|
|
23
|
+
#include <errno.h>
|
|
24
|
+
#include <stdarg.h>
|
|
25
|
+
#include <stdio.h>
|
|
26
|
+
#include <stdlib.h>
|
|
27
|
+
#include <string.h>
|
|
28
|
+
|
|
29
|
+
#include "internal.h"
|
|
30
|
+
|
|
31
|
+
/* One arena block. Blocks are chained, never moved: a pointer handed out
|
|
32
|
+
* stays valid for the life of the pool however much is allocated after
|
|
33
|
+
* it. */
|
|
34
|
+
typedef struct sek_block {
|
|
35
|
+
struct sek_block *next;
|
|
36
|
+
size_t used;
|
|
37
|
+
size_t size;
|
|
38
|
+
char *data;
|
|
39
|
+
} sek_block;
|
|
40
|
+
|
|
41
|
+
struct sek_pool {
|
|
42
|
+
sek_block *head;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
#define BLOCKSIZE (64 * 1024)
|
|
46
|
+
|
|
47
|
+
/* An allocation failure in a secrets library is not something to paper
|
|
48
|
+
* over: continuing with a half-filled buffer could put the wrong bytes in
|
|
49
|
+
* an Authorization header. */
|
|
50
|
+
static void nomemory(void) {
|
|
51
|
+
fputs("sekreto: out of memory\n", stderr);
|
|
52
|
+
abort();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
sek_pool *sek_pool_new(void) {
|
|
56
|
+
sek_pool *pool = (sek_pool *)calloc(1, sizeof(sek_pool));
|
|
57
|
+
if (NULL == pool) {
|
|
58
|
+
nomemory();
|
|
59
|
+
}
|
|
60
|
+
return pool;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
void sek_pool_free(sek_pool *pool) {
|
|
64
|
+
sek_block *block;
|
|
65
|
+
|
|
66
|
+
if (NULL == pool) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
block = pool->head;
|
|
71
|
+
while (NULL != block) {
|
|
72
|
+
sek_block *next = block->next;
|
|
73
|
+
free(block->data);
|
|
74
|
+
free(block);
|
|
75
|
+
block = next;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
free(pool);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
void *sek_alloc(sek_pool *pool, size_t size) {
|
|
82
|
+
sek_block *block;
|
|
83
|
+
void *out;
|
|
84
|
+
|
|
85
|
+
/* Every allocation is pointer-aligned, so a struct may be carved out of
|
|
86
|
+
* the arena as safely as a string. */
|
|
87
|
+
size = (size + 15u) & ~(size_t)15u;
|
|
88
|
+
if (0 == size) {
|
|
89
|
+
size = 16;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
block = pool->head;
|
|
93
|
+
if (NULL == block || block->size - block->used < size) {
|
|
94
|
+
size_t want = size > BLOCKSIZE ? size : BLOCKSIZE;
|
|
95
|
+
|
|
96
|
+
block = (sek_block *)calloc(1, sizeof(sek_block));
|
|
97
|
+
if (NULL == block) {
|
|
98
|
+
nomemory();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
block->data = (char *)calloc(1, want);
|
|
102
|
+
if (NULL == block->data) {
|
|
103
|
+
nomemory();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
block->size = want;
|
|
107
|
+
block->used = 0;
|
|
108
|
+
block->next = pool->head;
|
|
109
|
+
pool->head = block;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
out = block->data + block->used;
|
|
113
|
+
block->used += size;
|
|
114
|
+
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
char *sek_strndup(sek_pool *pool, const char *text, size_t len) {
|
|
119
|
+
char *out;
|
|
120
|
+
|
|
121
|
+
if (NULL == text) {
|
|
122
|
+
return NULL;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
out = (char *)sek_alloc(pool, len + 1);
|
|
126
|
+
memcpy(out, text, len);
|
|
127
|
+
out[len] = '\0';
|
|
128
|
+
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
char *sek_strdup(sek_pool *pool, const char *text) {
|
|
133
|
+
if (NULL == text) {
|
|
134
|
+
return NULL;
|
|
135
|
+
}
|
|
136
|
+
return sek_strndup(pool, text, strlen(text));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
char *sek_fmt(sek_pool *pool, const char *fmt, ...) {
|
|
140
|
+
va_list args;
|
|
141
|
+
va_list again;
|
|
142
|
+
int want;
|
|
143
|
+
char *out;
|
|
144
|
+
|
|
145
|
+
va_start(args, fmt);
|
|
146
|
+
va_copy(again, args);
|
|
147
|
+
want = vsnprintf(NULL, 0, fmt, args);
|
|
148
|
+
va_end(args);
|
|
149
|
+
|
|
150
|
+
if (0 > want) {
|
|
151
|
+
va_end(again);
|
|
152
|
+
return sek_strdup(pool, "");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
out = (char *)sek_alloc(pool, (size_t)want + 1);
|
|
156
|
+
vsnprintf(out, (size_t)want + 1, fmt, again);
|
|
157
|
+
va_end(again);
|
|
158
|
+
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* ---- buffer -------------------------------------------------------- */
|
|
163
|
+
|
|
164
|
+
void sek_buf_init(sek_buf *buf, sek_pool *pool) {
|
|
165
|
+
buf->pool = pool;
|
|
166
|
+
buf->cap = 64;
|
|
167
|
+
buf->data = (char *)sek_alloc(pool, buf->cap);
|
|
168
|
+
buf->data[0] = '\0';
|
|
169
|
+
buf->len = 0;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Grown by copying into a fresh arena slice: the old one is simply left
|
|
173
|
+
* behind, which is the arena's whole bargain. Doubling keeps the total
|
|
174
|
+
* abandoned below the live size. */
|
|
175
|
+
static void grow(sek_buf *buf, size_t want) {
|
|
176
|
+
size_t cap = buf->cap;
|
|
177
|
+
char *data;
|
|
178
|
+
|
|
179
|
+
if (want <= cap) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
while (cap < want) {
|
|
184
|
+
cap *= 2;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
data = (char *)sek_alloc(buf->pool, cap);
|
|
188
|
+
memcpy(data, buf->data, buf->len);
|
|
189
|
+
data[buf->len] = '\0';
|
|
190
|
+
|
|
191
|
+
buf->data = data;
|
|
192
|
+
buf->cap = cap;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
void sek_buf_addn(sek_buf *buf, const char *text, size_t len) {
|
|
196
|
+
if (NULL == text || 0 == len) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
grow(buf, buf->len + len + 1);
|
|
201
|
+
memcpy(buf->data + buf->len, text, len);
|
|
202
|
+
buf->len += len;
|
|
203
|
+
buf->data[buf->len] = '\0';
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
void sek_buf_add(sek_buf *buf, const char *text) {
|
|
207
|
+
if (NULL == text) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
sek_buf_addn(buf, text, strlen(text));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
void sek_buf_addch(sek_buf *buf, char ch) { sek_buf_addn(buf, &ch, 1); }
|
|
214
|
+
|
|
215
|
+
void sek_buf_addfmt(sek_buf *buf, const char *fmt, ...) {
|
|
216
|
+
va_list args;
|
|
217
|
+
va_list again;
|
|
218
|
+
int want;
|
|
219
|
+
|
|
220
|
+
va_start(args, fmt);
|
|
221
|
+
va_copy(again, args);
|
|
222
|
+
want = vsnprintf(NULL, 0, fmt, args);
|
|
223
|
+
va_end(args);
|
|
224
|
+
|
|
225
|
+
if (0 > want) {
|
|
226
|
+
va_end(again);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
grow(buf, buf->len + (size_t)want + 1);
|
|
231
|
+
vsnprintf(buf->data + buf->len, (size_t)want + 1, fmt, again);
|
|
232
|
+
va_end(again);
|
|
233
|
+
buf->len += (size_t)want;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/* ---- ordered string map -------------------------------------------- */
|
|
237
|
+
|
|
238
|
+
sek_map *sek_map_new(sek_pool *pool) {
|
|
239
|
+
sek_map *map = (sek_map *)sek_alloc(pool, sizeof(sek_map));
|
|
240
|
+
map->pool = pool;
|
|
241
|
+
map->cap = 8;
|
|
242
|
+
map->keys = (char **)sek_alloc(pool, map->cap * sizeof(char *));
|
|
243
|
+
map->vals = (char **)sek_alloc(pool, map->cap * sizeof(char *));
|
|
244
|
+
map->len = 0;
|
|
245
|
+
return map;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
void sek_map_set(sek_map *map, const char *key, const char *val) {
|
|
249
|
+
size_t index;
|
|
250
|
+
|
|
251
|
+
for (index = 0; index < map->len; index++) {
|
|
252
|
+
if (0 == strcmp(map->keys[index], key)) {
|
|
253
|
+
/* A later duplicate overwrites, keeping the original position: a
|
|
254
|
+
* .env file that sets a key twice means the last value, and the
|
|
255
|
+
* spec compares whole maps, so the order must not shuffle. */
|
|
256
|
+
map->vals[index] = sek_strdup(map->pool, val);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (map->len == map->cap) {
|
|
262
|
+
size_t cap = map->cap * 2;
|
|
263
|
+
char **keys = (char **)sek_alloc(map->pool, cap * sizeof(char *));
|
|
264
|
+
char **vals = (char **)sek_alloc(map->pool, cap * sizeof(char *));
|
|
265
|
+
memcpy(keys, map->keys, map->len * sizeof(char *));
|
|
266
|
+
memcpy(vals, map->vals, map->len * sizeof(char *));
|
|
267
|
+
map->keys = keys;
|
|
268
|
+
map->vals = vals;
|
|
269
|
+
map->cap = cap;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
map->keys[map->len] = sek_strdup(map->pool, key);
|
|
273
|
+
map->vals[map->len] = sek_strdup(map->pool, val);
|
|
274
|
+
map->len++;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const char *sek_map_get(const sek_map *map, const char *key) {
|
|
278
|
+
size_t index;
|
|
279
|
+
|
|
280
|
+
if (NULL == map || NULL == key) {
|
|
281
|
+
return NULL;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
for (index = 0; index < map->len; index++) {
|
|
285
|
+
if (0 == strcmp(map->keys[index], key)) {
|
|
286
|
+
return map->vals[index];
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return NULL;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/* ---- string list --------------------------------------------------- */
|
|
294
|
+
|
|
295
|
+
sek_list *sek_list_new(sek_pool *pool) {
|
|
296
|
+
sek_list *list = (sek_list *)sek_alloc(pool, sizeof(sek_list));
|
|
297
|
+
list->pool = pool;
|
|
298
|
+
list->cap = 8;
|
|
299
|
+
list->items = (char **)sek_alloc(pool, list->cap * sizeof(char *));
|
|
300
|
+
list->len = 0;
|
|
301
|
+
return list;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
void sek_list_add(sek_list *list, const char *text) {
|
|
305
|
+
if (list->len == list->cap) {
|
|
306
|
+
size_t cap = list->cap * 2;
|
|
307
|
+
char **items = (char **)sek_alloc(list->pool, cap * sizeof(char *));
|
|
308
|
+
memcpy(items, list->items, list->len * sizeof(char *));
|
|
309
|
+
list->items = items;
|
|
310
|
+
list->cap = cap;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
list->items[list->len] = sek_strdup(list->pool, text);
|
|
314
|
+
list->len++;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/* ---- small string helpers ------------------------------------------ */
|
|
318
|
+
|
|
319
|
+
int sek_empty(const char *text) { return NULL == text || '\0' == text[0]; }
|
|
320
|
+
|
|
321
|
+
const char *sek_first(const char *a, const char *b) {
|
|
322
|
+
if (!sek_empty(a)) {
|
|
323
|
+
return a;
|
|
324
|
+
}
|
|
325
|
+
if (!sek_empty(b)) {
|
|
326
|
+
return b;
|
|
327
|
+
}
|
|
328
|
+
return "";
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const char *sek_orempty(const char *text) { return NULL == text ? "" : text; }
|
|
332
|
+
|
|
333
|
+
int sek_has_prefix(const char *text, const char *prefix) {
|
|
334
|
+
size_t len = strlen(prefix);
|
|
335
|
+
return 0 == strncmp(text, prefix, len);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
int sek_contains(const char *hay, const char *needle) {
|
|
339
|
+
return NULL != hay && NULL != needle && NULL != strstr(hay, needle);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/* One trailing slash removed, and only one - `//` at the end of a
|
|
343
|
+
* configured address is a mistake this library does not try to correct. */
|
|
344
|
+
char *sek_trimslash(sek_pool *pool, const char *text) {
|
|
345
|
+
size_t len;
|
|
346
|
+
|
|
347
|
+
if (NULL == text) {
|
|
348
|
+
return sek_strdup(pool, "");
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
len = strlen(text);
|
|
352
|
+
if (0 < len && '/' == text[len - 1]) {
|
|
353
|
+
return sek_strndup(pool, text, len - 1);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
return sek_strdup(pool, text);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* A url without its query string, for a message that must not leak one.
|
|
360
|
+
* A query here carries the vault path, the secret name or a filter, none
|
|
361
|
+
* of which belongs in a log. */
|
|
362
|
+
char *sek_bareurl(sek_pool *pool, const char *url) {
|
|
363
|
+
const char *at = strchr(url, '?');
|
|
364
|
+
return NULL == at ? sek_strdup(pool, url) : sek_strndup(pool, url, (size_t)(at - url));
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/* ASCII uppercase, deliberately not toupper(): toupper() follows the
|
|
368
|
+
* machine's locale, and in a Turkish locale `i` uppercases to a dotted
|
|
369
|
+
* capital that is not `I` - which would silently give envkey a different
|
|
370
|
+
* answer on one machine than on every other. */
|
|
371
|
+
char sek_upper(char ch) {
|
|
372
|
+
if ('a' <= ch && 'z' >= ch) {
|
|
373
|
+
return (char)(ch - 'a' + 'A');
|
|
374
|
+
}
|
|
375
|
+
return ch;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
char sek_lower(char ch) {
|
|
379
|
+
if ('A' <= ch && 'Z' >= ch) {
|
|
380
|
+
return (char)(ch - 'A' + 'a');
|
|
381
|
+
}
|
|
382
|
+
return ch;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
char *sek_lowercase(sek_pool *pool, const char *text) {
|
|
386
|
+
char *out = sek_strdup(pool, text);
|
|
387
|
+
size_t index;
|
|
388
|
+
|
|
389
|
+
for (index = 0; '\0' != out[index]; index++) {
|
|
390
|
+
out[index] = sek_lower(out[index]);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return out;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/* ---- reading a local file ------------------------------------------ */
|
|
397
|
+
|
|
398
|
+
/* The one thing the CORE does with the platform beyond the environment,
|
|
399
|
+
* and the reason the line between core and plugin is "reads at most a
|
|
400
|
+
* local file": `dotenv` reads a `.env`, `file` reads a mounted secret
|
|
401
|
+
* directory, and a hashicorp login reads its service-account JWT off the
|
|
402
|
+
* same helper from the plugin side. */
|
|
403
|
+
char *sek_readfile(sek_pool *pool, const char *path, int *why) {
|
|
404
|
+
FILE *file = fopen(path, "rb");
|
|
405
|
+
sek_buf out;
|
|
406
|
+
char chunk[8192];
|
|
407
|
+
size_t got;
|
|
408
|
+
|
|
409
|
+
*why = 0;
|
|
410
|
+
|
|
411
|
+
if (NULL == file) {
|
|
412
|
+
*why = errno;
|
|
413
|
+
return NULL;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
sek_buf_init(&out, pool);
|
|
417
|
+
while (0 < (got = fread(chunk, 1, sizeof(chunk), file))) {
|
|
418
|
+
sek_buf_addn(&out, chunk, got);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
if (0 != ferror(file)) {
|
|
422
|
+
*why = errno;
|
|
423
|
+
fclose(file);
|
|
424
|
+
return NULL;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
fclose(file);
|
|
428
|
+
|
|
429
|
+
return out.data;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
int sek_absent(int why) { return ENOENT == why || ENOTDIR == why; }
|
|
433
|
+
|
|
434
|
+
const char *sek_first3(const char *a, const char *b, const char *c) {
|
|
435
|
+
if (!sek_empty(a)) {
|
|
436
|
+
return a;
|
|
437
|
+
}
|
|
438
|
+
if (!sek_empty(b)) {
|
|
439
|
+
return b;
|
|
440
|
+
}
|
|
441
|
+
return sek_orempty(c);
|
|
442
|
+
}
|