X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=libvirt%2Flibvirt_c_prologue.c;h=c41e48d12c12ea71bf73e4464a965f907f3b71ef;hb=cb3b0cd8c48cf7315ad64c05425f9dca7ac6068c;hp=7d9c0f542dd53f2580db9ad78c8310a30e92d5bd;hpb=d7e0e6112db9411b0d7aaa8cbf5ce85c27e7d52d;p=ocaml-libvirt.git diff --git a/libvirt/libvirt_c_prologue.c b/libvirt/libvirt_c_prologue.c index 7d9c0f5..c41e48d 100644 --- a/libvirt/libvirt_c_prologue.c +++ b/libvirt/libvirt_c_prologue.c @@ -23,10 +23,13 @@ static char *Optstring_val (value strv); typedef value (*Val_ptr_t) (void *); static value Val_opt (void *ptr, Val_ptr_t Val_ptr); +typedef value (*Val_const_ptr_t) (const void *); +static value Val_opt_const (const void *ptr, Val_const_ptr_t Val_ptr); /*static value option_default (value option, value deflt);*/ -static void _raise_virterror (virConnectPtr conn, const char *fn) Noreturn; -static void not_supported (const char *fn) Noreturn; +static void _raise_virterror (const char *fn) Noreturn; static value Val_virterror (virErrorPtr err); +static int _list_length (value listv); +static value Val_virconnectcredential (const virConnectCredentialPtr cred); /* Use this around synchronous libvirt API calls to release the OCaml * lock, allowing other threads to run simultaneously. 'code' must not @@ -40,11 +43,18 @@ static value Val_virterror (virErrorPtr err); caml_leave_blocking_section (); \ } while (0) +/* Empty macro to use as empty parameter for other macros, since + * a null token as parameter when calling a macro is not allowed + * before C99. + */ +#define EMPTY /* Check error condition from a libvirt function, and automatically raise * an exception if one is found. */ -#define CHECK_ERROR(cond, conn, fn) \ - do { if (cond) _raise_virterror (conn, fn); } while (0) +#define CHECK_ERROR_CLEANUP(cond, cleanup, fn) \ + do { if (cond) { cleanup; _raise_virterror (fn); } } while (0) +#define CHECK_ERROR(cond, fn) \ + CHECK_ERROR_CLEANUP(cond, EMPTY, fn) /*----------------------------------------------------------------------*/