X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=src%2Fgenerator.ml;h=14cf462afcc2a144922925e9fca69adf08306f2a;hp=88698420ca8fe28038911ae41e9d58d71039f17e;hb=41ee105aabaf1e9a7efc437b87d9536d3dc14a75;hpb=61ab83d19009a8006dd73ebe16d22494b78be4d1 diff --git a/src/generator.ml b/src/generator.ml index 8869842..14cf462 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -2026,9 +2026,13 @@ Compute the SHA512 hash (using the C program). =back -The checksum is returned as a printable string."); +The checksum is returned as a printable string. - ("tar_in", (RErr, [FileIn "tarfile"; String "directory"]), 69, [], +To get the checksum for a device, use C. + +To get the checksums for many files, use C."); + + ("tar_in", (RErr, [FileIn "tarfile"; Pathname "directory"]), 69, [], [InitBasicFS, Always, TestOutput ( [["tar_in"; "../images/helloworld.tar"; "/"]; ["cat"; "/hello"]], "hello\n")], @@ -2050,7 +2054,7 @@ it to local file C. To download a compressed tarball, use C or C."); - ("tgz_in", (RErr, [FileIn "tarball"; String "directory"]), 71, [], + ("tgz_in", (RErr, [FileIn "tarball"; Pathname "directory"]), 71, [], [InitBasicFS, Always, TestOutput ( [["tgz_in"; "../images/helloworld.tar.gz"; "/"]; ["cat"; "/hello"]], "hello\n")], @@ -2989,6 +2993,14 @@ constants. C and C are the device major and minor numbers, only used when creating block and character special devices. +Note that, just like L, the mode must be bitwise +OR'd with S_IFBLK, S_IFCHR, S_IFIFO or S_IFSOCK (otherwise this call +just creates a regular file). These constants are +available in the standard Linux header files, or you can use +C, C or C +which are wrappers around this command which bitwise OR +in the appropriate constant for you. + The mode actually set is affected by the umask."); ("mkfifo", (RErr, [Int "mode"; Pathname "path"]), 134, [Optional "mknod"], @@ -4382,7 +4394,7 @@ This command writes zeroes over the entire C. Compare with C which just zeroes the first few blocks of a device."); - ("txz_in", (RErr, [FileIn "tarball"; String "directory"]), 229, [], + ("txz_in", (RErr, [FileIn "tarball"; Pathname "directory"]), 229, [], [InitBasicFS, Always, TestOutput ( [["txz_in"; "../images/helloworld.tar.xz"; "/"]; ["cat"; "/hello"]], "hello\n")], @@ -4509,6 +4521,49 @@ is the same as the L C command."); Return the current umask. By default the umask is C<022> unless it has been set by calling C."); + ("debug_upload", (RErr, [FileIn "filename"; String "tmpname"; Int "mode"]), 241, [], + [], + "upload a file to the appliance (internal use only)", + "\ +The C command uploads a file to +the libguestfs appliance. + +There is no comprehensive help for this command. You have +to look at the file C in the libguestfs source +to find out what it is for."); + + ("base64_in", (RErr, [FileIn "base64file"; Pathname "filename"]), 242, [], + [InitBasicFS, Always, TestOutput ( + [["base64_in"; "../images/hello.b64"; "/hello"]; + ["cat"; "/hello"]], "hello\n")], + "upload base64-encoded data to file", + "\ +This command uploads base64-encoded data from C +to C."); + + ("base64_out", (RErr, [Pathname "filename"; FileOut "base64file"]), 243, [], + [], + "download file and encode as base64", + "\ +This command downloads the contents of C, writing +it out to local file C encoded as base64."); + + ("checksums_out", (RErr, [String "csumtype"; Pathname "directory"; FileOut "sumsfile"]), 244, [], + [], + "compute MD5, SHAx or CRC checksum of files in a directory", + "\ +This command computes the checksums of all regular files in +C and then emits a list of those checksums to +the local output file C. + +This can be used for verifying the integrity of a virtual +machine. However to be properly secure you should pay +attention to the output of the checksum command (it uses +the ones from GNU coreutils). In particular when the +filename is not printable, coreutils uses a special +backslash syntax. For more information, see the GNU +coreutils info file."); + ] let all_functions = non_daemon_functions @ daemon_functions @@ -5074,7 +5129,7 @@ let check_functions () = failwithf "short description of %s should not end with . or \\n." name ) all_functions; - (* Check long dscriptions. *) + (* Check long descriptions. *) List.iter ( fun (name, _, _, _, _, _, longdesc) -> if longdesc.[String.length longdesc-1] = '\n' then @@ -5219,7 +5274,7 @@ let rec generate_actions_pod () = let name = "guestfs_" ^ shortname in pr "=head2 %s\n\n" name; pr " "; - generate_prototype ~extern:false ~handle:"handle" name style; + generate_prototype ~extern:false ~handle:"g" name style; pr "\n\n"; pr "%s\n\n" longdesc; (match fst style with @@ -5547,7 +5602,7 @@ and generate_actions_h () = List.iter ( fun (shortname, style, _, _, _, _, _) -> let name = "guestfs_" ^ shortname in - generate_prototype ~single_line:true ~newline:true ~handle:"handle" + generate_prototype ~single_line:true ~newline:true ~handle:"g" name style ) all_functions @@ -5557,7 +5612,7 @@ and generate_internal_actions_h () = List.iter ( fun (shortname, style, _, _, _, _, _) -> let name = "guestfs__" ^ shortname in - generate_prototype ~single_line:true ~newline:true ~handle:"handle" + generate_prototype ~single_line:true ~newline:true ~handle:"g" name style ) non_daemon_functions @@ -5742,7 +5797,8 @@ check_state (guestfs_h *g, const char *caller) pr " int r;\n"; pr "\n"; trace_call shortname style; - pr " if (check_state (g, \"%s\") == -1) return %s;\n" name error_code; + pr " if (check_state (g, \"%s\") == -1) return %s;\n" + shortname error_code; pr " guestfs___set_busy (g);\n"; pr "\n"; @@ -6032,14 +6088,19 @@ and generate_daemon_actions () = ); pr "\n"; + let is_filein = + List.exists (function FileIn _ -> true | _ -> false) (snd style) in + (match snd style with | [] -> () | args -> pr " memset (&args, 0, sizeof args);\n"; pr "\n"; pr " if (!xdr_guestfs_%s_args (xdr_in, &args)) {\n" name; + if is_filein then + pr " cancel_receive ();\n"; pr " reply_with_error (\"daemon failed to decode procedure arguments\");\n"; - pr " return;\n"; + pr " goto done;\n"; pr " }\n"; let pr_args n = pr " char *%s = args.%s;\n" n n @@ -6048,6 +6109,8 @@ and generate_daemon_actions () = pr " %s = realloc (args.%s.%s_val,\n" n n n; pr " sizeof (char *) * (args.%s.%s_len+1));\n" n n; pr " if (%s == NULL) {\n" n; + if is_filein then + pr " cancel_receive ();\n"; pr " reply_with_perror (\"realloc\");\n"; pr " goto done;\n"; pr " }\n"; @@ -6058,13 +6121,16 @@ and generate_daemon_actions () = function | Pathname n -> pr_args n; - pr " ABS_PATH (%s, goto done);\n" n; + pr " ABS_PATH (%s, %s, goto done);\n" + n (if is_filein then "cancel_receive ()" else ""); | Device n -> pr_args n; - pr " RESOLVE_DEVICE (%s, goto done);\n" n; + pr " RESOLVE_DEVICE (%s, %s, goto done);\n" + n (if is_filein then "cancel_receive ()" else ""); | Dev_or_Path n -> pr_args n; - pr " REQUIRE_ROOT_OR_RESOLVE_DEVICE (%s, goto done);\n" n; + pr " REQUIRE_ROOT_OR_RESOLVE_DEVICE (%s, %s, goto done);\n" + n (if is_filein then "cancel_receive ()" else ""); | String n -> pr_args n | OptString n -> pr " %s = args.%s ? *args.%s : NULL;\n" n n n | StringList n -> @@ -6074,7 +6140,8 @@ and generate_daemon_actions () = pr " /* Ensure that each is a device,\n"; pr " * and perform device name translation. */\n"; pr " { int pvi; for (pvi = 0; physvols[pvi] != NULL; ++pvi)\n"; - pr " RESOLVE_DEVICE (physvols[pvi], goto done);\n"; + pr " RESOLVE_DEVICE (physvols[pvi], %s, goto done);\n" + (if is_filein then "cancel_receive ()" else ""); pr " }\n"; | Bool n -> pr " %s = args.%s;\n" n n | Int n -> pr " %s = args.%s;\n" n n @@ -6089,7 +6156,8 @@ and generate_daemon_actions () = if List.exists (function Pathname _ -> true | _ -> false) (snd style) then ( (* Emit NEED_ROOT just once, even when there are two or more Pathname args *) - pr " NEED_ROOT (goto done);\n"; + pr " NEED_ROOT (%s, goto done);\n" + (if is_filein then "cancel_receive ()" else ""); ); (* Don't want to call the impl with any FileIn or FileOut @@ -6175,15 +6243,14 @@ and generate_daemon_actions () = ); (* Free the args. *) + pr "done:\n"; (match snd style with - | [] -> - pr "done: ;\n"; + | [] -> () | _ -> - pr "done:\n"; pr " xdr_free ((xdrproc_t) xdr_guestfs_%s_args, (char *) &args);\n" name ); - + pr " return;\n"; pr "}\n\n"; ) daemon_functions; @@ -7373,11 +7440,11 @@ and generate_fish_cmds () = function | Device n | String n - | OptString n - | FileIn n - | FileOut n -> pr " const char *%s;\n" n + | OptString n -> pr " const char *%s;\n" n | Pathname n - | Dev_or_Path n -> pr " char *%s;\n" n + | Dev_or_Path n + | FileIn n + | FileOut n -> pr " char *%s;\n" n | StringList n | DeviceList n -> pr " char **%s;\n" n | Bool n -> pr " int %s;\n" n | Int n -> pr " int %s;\n" n @@ -7434,11 +7501,11 @@ and generate_fish_cmds () = pr " %s = STRNEQ (argv[%d], \"\") ? argv[%d] : NULL;\n" name i i | FileIn name -> - pr " %s = STRNEQ (argv[%d], \"-\") ? argv[%d] : \"/dev/stdin\";\n" - name i i + pr " %s = file_in (argv[%d]);\n" name i; + pr " if (%s == NULL) return -1;\n" name | FileOut name -> - pr " %s = STRNEQ (argv[%d], \"-\") ? argv[%d] : \"/dev/stdout\";\n" - name i i + pr " %s = file_out (argv[%d]);\n" name i; + pr " if (%s == NULL) return -1;\n" name | StringList name | DeviceList name -> pr " %s = parse_string_list (argv[%d]);\n" name i; pr " if (%s == NULL) return -1;\n" name; @@ -7467,10 +7534,12 @@ and generate_fish_cmds () = List.iter ( function | Device name | String name - | OptString name | FileIn name | FileOut name | Bool name + | OptString name | Bool name | Int name | Int64 name -> () - | Pathname name | Dev_or_Path name -> + | Pathname name | Dev_or_Path name | FileOut name -> pr " free (%s);\n" name + | FileIn name -> + pr " free_file_in (%s);\n" name | StringList name | DeviceList name -> pr " free_strings (%s);\n" name ) (snd style);