From: Rob Hoes <rob.hoes@citrix.com>
To: xen-devel@lists.xen.org
Cc: Rob Hoes <rob.hoes@citrix.com>,
ian.jackson@eu.citrix.com, dave.scott@eu.citrix.com,
ian.campbell@citrix.com
Subject: [PATCH v6 07/11] libxl: ocaml: add console reader functions
Date: Mon, 9 Dec 2013 15:17:26 +0000 [thread overview]
Message-ID: <1386602250-29866-8-git-send-email-rob.hoes@citrix.com> (raw)
In-Reply-To: <1386602250-29866-1-git-send-email-rob.hoes@citrix.com>
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>
---
tools/ocaml/libs/xl/xenlight.ml.in | 10 ++++-
tools/ocaml/libs/xl/xenlight.mli.in | 7 ++++
tools/ocaml/libs/xl/xenlight_stubs.c | 68 ++++++++++++++++++++++++++++++++++
tools/ocaml/test/Makefile | 12 ++++--
tools/ocaml/test/dmesg.ml | 18 +++++++++
5 files changed, 111 insertions(+), 4 deletions(-)
create mode 100644 tools/ocaml/test/dmesg.ml
diff --git a/tools/ocaml/libs/xl/xenlight.ml.in b/tools/ocaml/libs/xl/xenlight.ml.in
index fc05112..47f3487 100644
--- a/tools/ocaml/libs/xl/xenlight.ml.in
+++ b/tools/ocaml/libs/xl/xenlight.ml.in
@@ -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)
diff --git a/tools/ocaml/libs/xl/xenlight.mli.in b/tools/ocaml/libs/xl/xenlight.mli.in
index ee4efd8..794dbf1 100644
--- a/tools/ocaml/libs/xl/xenlight.mli.in
+++ b/tools/ocaml/libs/xl/xenlight.mli.in
@@ -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
diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c b/tools/ocaml/libs/xl/xenlight_stubs.c
index b03fd93..d568393 100644
--- a/tools/ocaml/libs/xl/xenlight_stubs.c
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c
@@ -929,6 +929,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 */
diff --git a/tools/ocaml/test/Makefile b/tools/ocaml/test/Makefile
index dfa6437..827bd7c 100644
--- a/tools/ocaml/test/Makefile
+++ b/tools/ocaml/test/Makefile
@@ -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)
diff --git a/tools/ocaml/test/dmesg.ml b/tools/ocaml/test/dmesg.ml
new file mode 100644
index 0000000..864fac4
--- /dev/null
+++ b/tools/ocaml/test/dmesg.ml
@@ -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
+ ()
+
--
1.7.10.4
next prev parent reply other threads:[~2013-12-09 15:17 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-09 15:17 [PATCH v6 00/11] libxl: ocaml: improve the bindings Rob Hoes
2013-12-09 15:17 ` [PATCH v6 01/11] libxl: ocaml: add simple test case for xentoollog Rob Hoes
2013-12-09 15:17 ` [PATCH v6 02/11] libxl: ocaml: implement some simple tests Rob Hoes
2013-12-09 15:17 ` [PATCH v6 03/11] libxl: ocaml: event management Rob Hoes
2013-12-10 13:48 ` Ian Campbell
2013-12-10 15:48 ` Rob Hoes
2013-12-10 16:00 ` Ian Campbell
2013-12-10 16:46 ` Rob Hoes
2013-12-10 16:12 ` David Scott
2013-12-09 15:17 ` [PATCH v6 04/11] libxl: ocaml: allow device operations to be called asynchronously Rob Hoes
2013-12-10 13:25 ` Ian Campbell
2013-12-10 13:28 ` Ian Campbell
2013-12-10 14:47 ` Rob Hoes
2013-12-09 15:17 ` [PATCH v6 05/11] libxl: ocaml: add disk and cdrom helper functions Rob Hoes
2013-12-09 15:17 ` [PATCH v6 06/11] libxl: ocaml: add VM lifecycle operations Rob Hoes
2013-12-10 13:29 ` Ian Campbell
2013-12-10 16:13 ` David Scott
2013-12-09 15:17 ` Rob Hoes [this message]
2013-12-09 15:17 ` [PATCH v6 08/11] libxl: ocaml: drop the ocaml heap lock before calling into libxl Rob Hoes
2013-12-10 13:34 ` Ian Campbell
2013-12-10 14:51 ` Rob Hoes
2013-12-10 16:01 ` Ian Campbell
2013-12-10 16:13 ` Rob Hoes
2013-12-09 15:17 ` [PATCH v6 09/11] libxl: ocaml: add some missing CAML macros Rob Hoes
2013-12-09 15:17 ` [PATCH v6 10/11] libxl: ocaml: fix memory corruption when converting string and key/values lists Rob Hoes
2013-12-09 15:17 ` [PATCH v6 11/11] libxl: ocaml: remove dead code in xentoollog bindings Rob Hoes
2013-12-10 11:24 ` [PATCH v6 00/11] libxl: ocaml: improve the bindings Rob Hoes
2013-12-10 13:20 ` Ian Campbell
2013-12-10 13:25 ` Andrew Cooper
2013-12-10 13:42 ` Ian Campbell
2013-12-10 14:10 ` George Dunlap
2013-12-10 14:24 ` George Dunlap
2013-12-10 14:34 ` David Scott
2013-12-10 15:42 ` George Dunlap
2013-12-10 15:48 ` David Scott
2013-12-10 15:48 ` Ian Campbell
2013-12-10 15:53 ` Ian Jackson
2013-12-10 16:00 ` George Dunlap
2013-12-10 16:57 ` George Dunlap
2013-12-10 17:01 ` Rob Hoes
2013-12-10 15:50 ` Ian Jackson
2013-12-10 15:57 ` George Dunlap
2013-12-10 16:04 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1386602250-29866-8-git-send-email-rob.hoes@citrix.com \
--to=rob.hoes@citrix.com \
--cc=dave.scott@eu.citrix.com \
--cc=ian.campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).