X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=generator%2Fgenerator_c.ml;h=d8b13a57c147f94cf9e76d22020ae757267d8ada;hb=8022d46e5e2d9c3ab664ace6c9f185976e34dc20;hp=d0a470246572133f667314e6d612e9b48ec7b265;hpb=4e3837d0f31af26dd460f7196323af10aac24be1;p=libguestfs.git diff --git a/generator/generator_c.ml b/generator/generator_c.ml index d0a4702..d8b13a5 100644 --- a/generator/generator_c.ml +++ b/generator/generator_c.ml @@ -545,6 +545,9 @@ extern void *guestfs_get_private (guestfs_h *g, const char *key); extern void *guestfs_safe_malloc (guestfs_h *g, size_t nbytes); extern void *guestfs_safe_calloc (guestfs_h *g, size_t n, size_t s); extern const char *guestfs_tmpdir (void); +#ifdef GUESTFS_PRIVATE_FOR_EACH_DISK +extern int guestfs___for_each_disk (guestfs_h *g, virDomainPtr dom, int (*)(guestfs_h *g, const char *filename, const char *format, void *data), void *data); +#endif /* End of private functions. */ #ifdef __cplusplus @@ -574,6 +577,9 @@ and generate_client_actions () = #include #include #include +#include +#include +#include #include \"guestfs.h\" #include \"guestfs-internal.h\" @@ -957,10 +963,34 @@ check_state (guestfs_h *g, const char *caller) | RStructList (_, typ) -> pr " struct guestfs_%s_list *ret_v;\n" typ ); + + let has_filein = + List.exists (function FileIn _ -> true | _ -> false) args in + if has_filein then ( + pr " uint64_t progress_hint = 0;\n"; + pr " struct stat progress_stat;\n"; + ) else + pr " const uint64_t progress_hint = 0;\n"; + pr "\n"; check_null_strings shortname style; reject_unknown_optargs shortname style; trace_call shortname style; + + (* Calculate the total size of all FileIn arguments to pass + * as a progress bar hint. + *) + List.iter ( + function + | FileIn n -> + pr " if (stat (%s, &progress_stat) == 0 &&\n" n; + pr " S_ISREG (progress_stat.st_mode))\n"; + pr " progress_hint += progress_stat.st_size;\n"; + pr "\n"; + | _ -> () + ) args; + + (* Check we are in the right state for sending a request. *) pr " if (check_state (g, \"%s\") == -1) {\n" shortname; trace_return_error ~indent:4 style; pr " return %s;\n" error_code; @@ -971,8 +1001,9 @@ check_state (guestfs_h *g, const char *caller) (* Send the main header and arguments. *) (match args with | [] -> - pr " serial = guestfs___send (g, GUESTFS_PROC_%s, NULL, NULL);\n" - (String.uppercase shortname) + pr " serial = guestfs___send (g, GUESTFS_PROC_%s, progress_hint,\n" + (String.uppercase shortname); + pr " NULL, NULL);\n" | args -> List.iter ( function @@ -1003,7 +1034,7 @@ check_state (guestfs_h *g, const char *caller) pr " args.%s.%s_len = %s_size;\n" n n n | Pointer _ -> assert false ) args; - pr " serial = guestfs___send (g, GUESTFS_PROC_%s,\n" + pr " serial = guestfs___send (g, GUESTFS_PROC_%s, progress_hint,\n" (String.uppercase shortname); pr " (xdrproc_t) xdr_%s_args, (char *) &args);\n" name; @@ -1287,6 +1318,7 @@ and generate_linker_script () = "guestfs_safe_strdup"; "guestfs_safe_memdup"; "guestfs_tmpdir"; + "guestfs___for_each_disk"; ] in let functions = List.flatten (