send_query ?timeout fd query;
recv_resp ?timeout fd
) (fun () -> Unix.close fd)
+
+let check ?timeout id =
+ try
+ let reply = request ?timeout id ("status", []) in
+ begin match reply with
+ | Msg _ -> ()
+ | _ -> ()
+ end;
+ true
+ with Connect_refused s ->
+ false
+
end
module Bus = struct
-let request ?timeout id query =
+let connect () =
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
+ DBus.Bus.get (if using_session then DBus.Bus.Session else DBus.Bus.System)
+
+let request ?timeout id query =
+ let bus = connect () in
let timeout = match timeout with None -> 0 | Some t -> int_of_float (t *. 1000.) in
let intf = Printf.sprintf "org.xen.vm.%s" (String.replace "-" "_" id) in
| DBus.Message.Method_return, [ DBus.String s ] -> Msg s
| _ -> assert false
+let check ?timeout id =
+ let bus = connect () in
+ let intf = Printf.sprintf "org.xen.vm.%s" (String.replace "-" "_" id) in
+ DBus.Bus.has_owner bus intf
end
let request ?(using_socket=false) ?timeout id query =
then Socket.request ?timeout id query
else Bus.request ?timeout id query
+let check ?(using_socket=false) ?timeout id =
+ if using_socket
+ then Socket.check ?timeout id
+ else Bus.check ?timeout id
+
let code_ping = 0x0000
let code_hup = 0x0001
let code_error = 0x0002