libxl: ocaml: add console reader functions

Signed-off-by: Rob Hoes <rob.hoes@citrix.com>
Acked-by: David Scott <dave.scott@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
Rob Hoes authored and Ian Campbell committed 2013-12-11 13:17:50 +00:00
1 parent 78e2e6b591
commit 6b5007806a
5 files changed
+111 -4

No files matched your search

+9 -1
View File
@@ -49,6 +49,13 @@ module Domain = struct
end
module Host = struct
type console_reader
exception End_of_file
external xen_console_read_start : ctx -> int -> console_reader = "stub_libxl_xen_console_read_start"
external xen_console_read_line : ctx -> console_reader -> string = "stub_libxl_xen_console_read_line"
external xen_console_read_finish : ctx -> console_reader -> unit = "stub_libxl_xen_console_read_finish"
external send_debug_keys : ctx -> string -> unit = "stub_xl_send_debug_keys"
end
@@ -82,5 +89,6 @@ module Async = struct
end
let register_exceptions () =
Callback.register_exception "Xenlight.Error" (Error(ERROR_FAIL, ""))
Callback.register_exception "Xenlight.Error" (Error(ERROR_FAIL, ""));
Callback.register_exception "Xenlight.Host.End_of_file" (Host.End_of_file)
+7
View File
@@ -51,6 +51,13 @@ module Domain : sig
end
module Host : sig
type console_reader
exception End_of_file
external xen_console_read_start : ctx -> int -> console_reader = "stub_libxl_xen_console_read_start"
external xen_console_read_line : ctx -> console_reader -> string = "stub_libxl_xen_console_read_line"
external xen_console_read_finish : ctx -> console_reader -> unit = "stub_libxl_xen_console_read_finish"
external send_debug_keys : ctx -> string -> unit = "stub_xl_send_debug_keys"
end
+68
View File
@@ -939,6 +939,74 @@ value stub_xl_send_debug_keys(value ctx, value keys)
CAMLreturn(Val_unit);
}
static struct custom_operations libxl_console_reader_custom_operations = {
"libxl_console_reader_custom_operations",
custom_finalize_default,
custom_compare_default,
custom_hash_default,
custom_serialize_default,
custom_deserialize_default
};
#define Console_reader_val(x)(*((libxl_xen_console_reader **) Data_custom_val(x)))
value stub_libxl_xen_console_read_start(value ctx, value clear)
{
CAMLparam2(ctx, clear);
CAMLlocal1(handle);
libxl_xen_console_reader *cr;
cr = libxl_xen_console_read_start(CTX, Int_val(clear));
handle = caml_alloc_custom(&libxl_console_reader_custom_operations, sizeof(cr), 0, 1);
Console_reader_val(handle) = cr;
CAMLreturn(handle);
}
static void raise_eof(void)
{
static value *exc = NULL;
/* First time around, lookup by name */
if (!exc)
exc = caml_named_value("Xenlight.Host.End_of_file");
if (!exc)
caml_invalid_argument("Exception Xenlight.Host.End_of_file not initialized, please link xenlight.cma");
caml_raise_constant(*exc);
}
value stub_libxl_xen_console_read_line(value ctx, value reader)
{
CAMLparam2(ctx, reader);
CAMLlocal1(line);
int ret;
char *c_line;
libxl_xen_console_reader *cr = (libxl_xen_console_reader *) Console_reader_val(reader);
ret = libxl_xen_console_read_line(CTX, cr, &c_line);
if (ret < 0)
failwith_xl(ret, "xen_console_read_line");
if (ret == 0)
raise_eof();
line = caml_copy_string(c_line);
CAMLreturn(line);
}
value stub_libxl_xen_console_read_finish(value ctx, value reader)
{
CAMLparam2(ctx, reader);
libxl_xen_console_reader *cr = (libxl_xen_console_reader *) Console_reader_val(reader);
libxl_xen_console_read_finish(CTX, cr);
CAMLreturn(Val_unit);
}
/* Event handling */
+9 -3
View File
@@ -9,9 +9,9 @@ OCAMLINCLUDE += \
-I $(OCAML_TOPLEVEL)/libs/xentoollog \
-I $(OCAML_TOPLEVEL)/libs/xl
OBJS = xtl send_debug_keys list_domains raise_exception
OBJS = xtl send_debug_keys list_domains raise_exception dmesg
PROGRAMS = xtl send_debug_keys list_domains raise_exception
PROGRAMS = xtl send_debug_keys list_domains raise_exception dmesg
xtl_LIBS = \
-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xentoollog $(OCAML_TOPLEVEL)/libs/xentoollog/xentoollog.cmxa \
@@ -37,7 +37,13 @@ raise_exception_LIBS = \
raise_exception_OBJS = raise_exception
OCAML_PROGRAM = xtl send_debug_keys list_domains raise_exception
dmesg_LIBS = \
-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xentoollog $(OCAML_TOPLEVEL)/libs/xentoollog/xentoollog.cmxa \
-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xl $(OCAML_TOPLEVEL)/libs/xl/xenlight.cmxa
dmesg_OBJS = xtl dmesg
OCAML_PROGRAM = xtl send_debug_keys list_domains raise_exception dmesg
all: $(PROGRAMS)
+18
View File
@@ -0,0 +1,18 @@
open Printf
let _ =
Xenlight.register_exceptions ();
let logger = Xtl.create_stdio_logger ~level:Xentoollog.Debug () in
let ctx = Xenlight.ctx_alloc logger in
let open Xenlight.Host in
let reader = xen_console_read_start ctx 0 in
(try
while true do
let line = xen_console_read_line ctx reader in
print_string line
done
with End_of_file -> ());
let _ = xen_console_read_finish ctx reader in
()
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.