-ccopt -L -ccopt $(TOPLEVEL)/libs/base64 $(TOPLEVEL)/libs/base64/base64.cmxa \
-ccopt -L -ccopt $(TOPLEVEL)/xenops $(TOPLEVEL)/xenops/xenops.cmxa
-xenvm-cmd_LIBS = unix.cmxa threads.cmxa \
+xenvm-cmd_LIBS = unix.cmxa dBus.cmxa threads.cmxa \
-ccopt -L -ccopt $(TOPLEVEL)/libs/json $(TOPLEVEL)/libs/json/json.cmxa \
-ccopt -L -ccopt $(TOPLEVEL)/libs/jsonrpc $(TOPLEVEL)/libs/jsonrpc/jsonrpc.cmxa \
-ccopt -L -ccopt $(TOPLEVEL)/libs/stdext $(TOPLEVEL)/libs/stdext/stdext.cmxa
*)
open Pervasiveext
-(*open Stringext*)
+open Stringext
type query = (string * ((string * string) list))
type answer = Ok | Error of string | Msg of string | Unknown of string | Timeout
exception Read_timeout
exception Connect_refused of string
+module Socket = struct
+
let path_of_socket id =
let dir = try Sys.getenv "XENVM_SOCKET_DIR" with Not_found -> "/var/lib/xenvm" in
Printf.sprintf "%s/vm-%s" dir id
send_query ?timeout fd query;
recv_resp ?timeout fd
) (fun () -> Unix.close fd)
+end
+
+module Bus = struct
+
+let request ?timeout id query =
+ let using_session = try bool_of_string (Sys.getenv "XENVMLIB_DBUS_SESSION") with _ -> false in
+ let bus = DBus.Bus.get (if using_session then DBus.Bus.Session else DBus.Bus.System) in
+ let timeout = match timeout with None -> 0 | Some t -> int_of_float (t *. 1000.) in
+
+ let dest = "org.xen.vm" in
+ let intf = Printf.sprintf "org.xen.vm.%s" (String.replace "-" "_" id) in
+
+ let method_name, params = query in
+ let msg = DBus.Message.new_method_call dest "/" intf method_name in
+ DBus.Message.append msg [];
+ let reply = DBus.Connection.send_with_reply_and_block bus msg timeout in
+ let args = DBus.Message.get reply in
+ match DBus.Message.get_type reply, args with
+ | DBus.Message.Error, [ DBus.String s ] -> Error s
+ | DBus.Message.Error, _ -> Error "error with unexpected arguments"
+ | DBus.Message.Method_return, [] -> Ok
+ | DBus.Message.Method_return, [ DBus.String s ] -> Msg s
+ | _ -> assert false
+
+end
+
+let request ?(using_socket=false) ?timeout id query =
+ if using_socket
+ then Socket.request ?timeout id query
+ else Bus.request ?timeout id query
let code_ping = 0x0000
let code_hup = 0x0001