X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fgenerator.ml;h=4f569ba5feb883dc9ec6535a79a0cab11c774c52;hb=5442f45aea522a728fa5b06396d4f08d8506d7de;hp=7db58eb0ba06770227ce1de3ddbdc4cf772fcd62;hpb=48a9ff73319d0d065bff2b9374c84bcf6438cb20;p=libguestfs.git diff --git a/src/generator.ml b/src/generator.ml index 7db58eb..4f569ba 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -19,17 +19,17 @@ (* This script generates a large amount of code and documentation for * all the daemon actions. - * + * * To add a new action there are only two files you need to change, * this one to describe the interface (see the big table of * 'daemon_functions' below), and daemon/.c to write the * implementation. - * + * * After editing this file, run it (./src/generator.ml) to regenerate * all the output files. 'make' will rerun this automatically when * necessary. Note that if you are using a separate build directory * you must run generator.ml from the _source_ directory. - * + * * IMPORTANT: This script should NOT print any warnings. If it prints * warnings, you should treat them as errors. * @@ -489,9 +489,15 @@ image). This is equivalent to the qemu parameter C<-drive file=filename,cache=off,if=...>. + C is omitted in cases where it is not supported by the underlying filesystem. +C is set at compile time by the configuration option +C<./configure --with-drive-if=...>. In the rare case where you +might need to change this at run time, use C +or C. + Note that this call checks for the existence of C. This stops you from specifying other types of drive which are supported by qemu such as C and C URLs. To specify those, use @@ -540,6 +546,11 @@ changes to be committed, although qemu can support this. This is equivalent to the qemu parameter C<-drive file=filename,snapshot=on,if=...>. +C is set at compile time by the configuration option +C<./configure --with-drive-if=...>. In the rare case where you +might need to change this at run time, use C +or C. + Note that this call checks for the existence of C. This stops you from specifying other types of drive which are supported by qemu such as C and C URLs. To specify those, use @@ -570,7 +581,15 @@ configure script. You can also override this by setting the C environment variable. -Setting C to C restores the default qemu binary."); +Setting C to C restores the default qemu binary. + +Note that you should call this function as early as possible +after creating the handle. This is because some pre-launch +operations depend on testing qemu features (by running C). +If the qemu binary changes, we don't retest features, and +so you might see inconsistent results. Using the environment +variable C is safest of all since that picks +the qemu binary at the same time as the handle is created."); ("get_qemu", (RConstString "qemu", []), -1, [], [InitNone, Always, TestRun ( @@ -887,6 +906,20 @@ qemu, which is not very helpful."); "\ Return the recovery process enabled flag."); + ("add_drive_with_if", (RErr, [String "filename"; String "iface"]), -1, [], + [], + "add a drive specifying the QEMU block emulation to use", + "\ +This is the same as C but it allows you +to specify the QEMU interface emulation to use at run time."); + + ("add_drive_ro_with_if", (RErr, [String "filename"; String "iface"]), -1, [], + [], + "add a drive read-only specifying the QEMU block emulation to use", + "\ +This is the same as C but it allows you +to specify the QEMU interface emulation to use at run time."); + ] (* daemon_functions are any functions which cause some action @@ -4238,7 +4271,7 @@ Rename a logical volume C with the new name C."); "\ Rename a volume group C with the new name C."); - ("initrd_cat", (RBufferOut "content", [Pathname "initrdpath"; String "filename"]), 221, [], + ("initrd_cat", (RBufferOut "content", [Pathname "initrdpath"; String "filename"]), 221, [ProtocolLimitWarning], [InitISOFS, Always, TestOutputBuffer ( [["initrd_cat"; "/initrd"; "known-4"]], "abc\ndef\nghi")], "list the contents of a single file in an initrd", @@ -4679,8 +4712,7 @@ let seq_of_test = function (* Handling for function flags. *) let protocol_limit_warning = "Because of the message protocol, there is a transfer limit -of somewhere between 2MB and 4MB. To transfer large files you should use -FTP." +of somewhere between 2MB and 4MB. See L." let danger_will_robinson = "B () | StringList n, "" | DeviceList n, "" -> - pr " const char *const %s[1] = { NULL };\n" n + pr " const char *const %s[1] = { NULL };\n" n | StringList n, arg | DeviceList n, arg -> let strs = string_split " " arg in iteri ( @@ -7198,7 +7229,7 @@ and generate_fish_cmds () = and comment = "The Int type in the generator is a signed 31 bit int." in Some (min, max, comment) in - parse_integer "xstrtol" "long" "int" range name i + parse_integer "xstrtoll" "long long" "int" range name i | Int64 name -> parse_integer "xstrtoll" "long long" "int64_t" None name i ) (snd style); @@ -8124,7 +8155,7 @@ DESTROY (g) pr ";\n"; do_cleanups (); pr " if (r == -1)\n"; - pr " croak (\"%s: %%s\", guestfs_last_error (g));\n" name; + pr " croak (\"%%s\", guestfs_last_error (g));\n"; | RInt n | RBool n -> pr "PREINIT:\n"; @@ -8135,7 +8166,7 @@ DESTROY (g) pr ";\n"; do_cleanups (); pr " if (%s == -1)\n" n; - pr " croak (\"%s: %%s\", guestfs_last_error (g));\n" name; + pr " croak (\"%%s\", guestfs_last_error (g));\n"; pr " RETVAL = newSViv (%s);\n" n; pr " OUTPUT:\n"; pr " RETVAL\n" @@ -8148,7 +8179,7 @@ DESTROY (g) pr ";\n"; do_cleanups (); pr " if (%s == -1)\n" n; - pr " croak (\"%s: %%s\", guestfs_last_error (g));\n" name; + pr " croak (\"%%s\", guestfs_last_error (g));\n"; pr " RETVAL = my_newSVll (%s);\n" n; pr " OUTPUT:\n"; pr " RETVAL\n" @@ -8161,7 +8192,7 @@ DESTROY (g) pr ";\n"; do_cleanups (); pr " if (%s == NULL)\n" n; - pr " croak (\"%s: %%s\", guestfs_last_error (g));\n" name; + pr " croak (\"%%s\", guestfs_last_error (g));\n"; pr " RETVAL = newSVpv (%s, 0);\n" n; pr " OUTPUT:\n"; pr " RETVAL\n" @@ -8188,7 +8219,7 @@ DESTROY (g) pr ";\n"; do_cleanups (); pr " if (%s == NULL)\n" n; - pr " croak (\"%s: %%s\", guestfs_last_error (g));\n" name; + pr " croak (\"%%s\", guestfs_last_error (g));\n"; pr " RETVAL = newSVpv (%s, 0);\n" n; pr " free (%s);\n" n; pr " OUTPUT:\n"; @@ -8203,7 +8234,7 @@ DESTROY (g) pr ";\n"; do_cleanups (); pr " if (%s == NULL)\n" n; - pr " croak (\"%s: %%s\", guestfs_last_error (g));\n" name; + pr " croak (\"%%s\", guestfs_last_error (g));\n"; pr " for (n = 0; %s[n] != NULL; ++n) /**/;\n" n; pr " EXTEND (SP, n);\n"; pr " for (i = 0; i < n; ++i) {\n"; @@ -8227,7 +8258,7 @@ DESTROY (g) pr ";\n"; do_cleanups (); pr " if (%s == NULL)\n" n; - pr " croak (\"%s: %%s\", guestfs_last_error (g));\n" name; + pr " croak (\"%%s\", guestfs_last_error (g));\n"; pr " RETVAL = newSVpv (%s, size);\n" n; pr " free (%s);\n" n; pr " OUTPUT:\n"; @@ -8248,7 +8279,7 @@ and generate_perl_struct_list_code typ cols name style n do_cleanups = pr ";\n"; do_cleanups (); pr " if (%s == NULL)\n" n; - pr " croak (\"%s: %%s\", guestfs_last_error (g));\n" name; + pr " croak (\"%%s\", guestfs_last_error (g));\n"; pr " EXTEND (SP, %s->len);\n" n; pr " for (i = 0; i < %s->len; ++i) {\n" n; pr " hv = newHV ();\n"; @@ -8292,7 +8323,7 @@ and generate_perl_struct_code typ cols name style n do_cleanups = pr ";\n"; do_cleanups (); pr " if (%s == NULL)\n" n; - pr " croak (\"%s: %%s\", guestfs_last_error (g));\n" name; + pr " croak (\"%%s\", guestfs_last_error (g));\n"; pr " EXTEND (SP, 2 * %d);\n" (List.length cols); List.iter ( fun ((name, _) as col) -> @@ -8368,7 +8399,8 @@ schemes, qcow, qcow2, vmdk. Libguestfs provides ways to enumerate guest storage (eg. partitions, LVs, what filesystem is in each LV, etc.). It can also run commands -in the context of the guest. Also you can access filesystems over FTP. +in the context of the guest. Also you can access filesystems over +FUSE. See also L for a set of useful library functions for using libguestfs from Perl, including integration @@ -8905,7 +8937,8 @@ schemes, qcow, qcow2, vmdk. Libguestfs provides ways to enumerate guest storage (eg. partitions, LVs, what filesystem is in each LV, etc.). It can also run commands -in the context of the guest. Also you can access filesystems over FTP. +in the context of the guest. Also you can access filesystems over +FUSE. Errors which happen while using the API are turned into Python RuntimeError exceptions. @@ -10198,96 +10231,96 @@ namespace Guestfs List.iter ( fun (name, style, _, _, _, shortdesc, _) -> let rec csharp_return_type () = - match fst style with - | RErr -> "void" - | RBool n -> "bool" - | RInt n -> "int" - | RInt64 n -> "long" - | RConstString n - | RConstOptString n - | RString n - | RBufferOut n -> "string" - | RStruct (_,n) -> "_" ^ n - | RHashtable n -> "Hashtable" - | RStringList n -> "string[]" - | RStructList (_,n) -> sprintf "_%s[]" n + match fst style with + | RErr -> "void" + | RBool n -> "bool" + | RInt n -> "int" + | RInt64 n -> "long" + | RConstString n + | RConstOptString n + | RString n + | RBufferOut n -> "string" + | RStruct (_,n) -> "_" ^ n + | RHashtable n -> "Hashtable" + | RStringList n -> "string[]" + | RStructList (_,n) -> sprintf "_%s[]" n and c_return_type () = - match fst style with - | RErr - | RBool _ - | RInt _ -> "int" - | RInt64 _ -> "long" - | RConstString _ - | RConstOptString _ - | RString _ - | RBufferOut _ -> "string" - | RStruct (_,n) -> "_" ^ n - | RHashtable _ - | RStringList _ -> "string[]" - | RStructList (_,n) -> sprintf "_%s[]" n - + match fst style with + | RErr + | RBool _ + | RInt _ -> "int" + | RInt64 _ -> "long" + | RConstString _ + | RConstOptString _ + | RString _ + | RBufferOut _ -> "string" + | RStruct (_,n) -> "_" ^ n + | RHashtable _ + | RStringList _ -> "string[]" + | RStructList (_,n) -> sprintf "_%s[]" n + and c_error_comparison () = - match fst style with - | RErr - | RBool _ - | RInt _ - | RInt64 _ -> "== -1" - | RConstString _ - | RConstOptString _ - | RString _ - | RBufferOut _ - | RStruct (_,_) - | RHashtable _ - | RStringList _ - | RStructList (_,_) -> "== null" - + match fst style with + | RErr + | RBool _ + | RInt _ + | RInt64 _ -> "== -1" + | RConstString _ + | RConstOptString _ + | RString _ + | RBufferOut _ + | RStruct (_,_) + | RHashtable _ + | RStringList _ + | RStructList (_,_) -> "== null" + and generate_extern_prototype () = - pr " static extern %s guestfs_%s (IntPtr h" - (c_return_type ()) name; - List.iter ( - function - | Pathname n | Device n | Dev_or_Path n | String n | OptString n - | FileIn n | FileOut n -> + pr " static extern %s guestfs_%s (IntPtr h" + (c_return_type ()) name; + List.iter ( + function + | Pathname n | Device n | Dev_or_Path n | String n | OptString n + | FileIn n | FileOut n -> pr ", [In] string %s" n - | StringList n | DeviceList n -> + | StringList n | DeviceList n -> pr ", [In] string[] %s" n - | Bool n -> - pr ", bool %s" n - | Int n -> - pr ", int %s" n - | Int64 n -> - pr ", long %s" n - ) (snd style); - pr ");\n" + | Bool n -> + pr ", bool %s" n + | Int n -> + pr ", int %s" n + | Int64 n -> + pr ", long %s" n + ) (snd style); + pr ");\n" and generate_public_prototype () = - pr " public %s %s (" (csharp_return_type ()) name; - let comma = ref false in - let next () = - if !comma then pr ", "; - comma := true - in - List.iter ( - function - | Pathname n | Device n | Dev_or_Path n | String n | OptString n - | FileIn n | FileOut n -> + pr " public %s %s (" (csharp_return_type ()) name; + let comma = ref false in + let next () = + if !comma then pr ", "; + comma := true + in + List.iter ( + function + | Pathname n | Device n | Dev_or_Path n | String n | OptString n + | FileIn n | FileOut n -> next (); pr "string %s" n - | StringList n | DeviceList n -> + | StringList n | DeviceList n -> next (); pr "string[] %s" n - | Bool n -> - next (); pr "bool %s" n - | Int n -> - next (); pr "int %s" n - | Int64 n -> - next (); pr "long %s" n - ) (snd style); - pr ")\n" + | Bool n -> + next (); pr "bool %s" n + | Int n -> + next (); pr "int %s" n + | Int64 n -> + next (); pr "long %s" n + ) (snd style); + pr ")\n" and generate_call () = - pr "guestfs_%s (_handle" name; - List.iter (fun arg -> pr ", %s" (name_of_argt arg)) (snd style); - pr ");\n"; + pr "guestfs_%s (_handle" name; + List.iter (fun arg -> pr ", %s" (name_of_argt arg)) (snd style); + pr ");\n"; in pr " [DllImport (\"%s\")]\n" library; @@ -10302,8 +10335,7 @@ namespace Guestfs pr " r = "; generate_call (); pr " if (r %s)\n" (c_error_comparison ()); - pr " throw new Error (\"%s: \" + guestfs_last_error (_handle));\n" - name; + pr " throw new Error (guestfs_last_error (_handle));\n"; (match fst style with | RErr -> () | RBool _ ->