| RLenType ->
pr "\
Returns 0 on success.
-On error this returns NULL and sets errno.\n\n"
+On error this returns -1 and sets errno.\n\n"
| RLenTypeVal ->
pr "\
The value is returned as an array of bytes (of length C<len>).
Lesser General Public License for more details.
"
+(* Generate the linker script which controls the visibility of
+ * symbols in the public ABI and ensures no other symbols get
+ * exported accidentally.
+ *)
+and generate_linker_script () =
+ generate_header HashStyle GPLv2plus;
+
+ let globals = [
+ "hivex_visit";
+ "hivex_visit_node"
+ ] in
+
+ let functions =
+ List.map (fun (name, _, _, _) -> "hivex_" ^ name)
+ functions in
+ let globals = List.sort compare (globals @ functions) in
+
+ pr "{\n";
+ pr " global:\n";
+ List.iter (pr " %s;\n") globals;
+ pr "\n";
+
+ pr " local:\n";
+ pr " *;\n";
+ pr "};\n"
+
and generate_ocaml_interface () =
generate_header OCamlStyle LGPLv2plus;
=item open
- $h = Win::Hivex::open ($filename,";
+ $h = Win::Hivex->open ($filename,";
List.iter (
fun (_, flag, _) ->
pr " size_t len;\n";
pr " hive_type type;\n";
pr " PPCODE:\n";
- pr " r = hivex_%s (%s, &len, &type);\n"
+ pr " r = hivex_%s (%s, &type, &len);\n"
name (String.concat ", " c_params);
free_args ();
pr " if (r == -1)\n";
pr " size_t len;\n";
pr " hive_type type;\n";
pr " PPCODE:\n";
- pr " r = hivex_%s (%s, &len, &type);\n"
+ pr " r = hivex_%s (%s, &type, &len);\n"
name (String.concat ", " c_params);
free_args ();
pr " if (r == NULL)\n";
name;
pr " EXTEND (SP, 2);\n";
pr " PUSHs (sv_2mortal (newSViv (type)));\n";
- pr " PUSHs (sv_2mortal (newSVpv (r, len)));\n";
+ pr " PUSHs (sv_2mortal (newSVpvn (r, len)));\n";
pr " free (r);\n";
| RInt64 ->
output_to "lib/hivex.h" generate_c_header;
output_to "lib/hivex.pod" generate_c_pod;
+ output_to "lib/hivex.syms" generate_linker_script;
+
output_to "ocaml/hivex.mli" generate_ocaml_interface;
output_to "ocaml/hivex.ml" generate_ocaml_implementation;
output_to "ocaml/hivex_c.c" generate_ocaml_c;