diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/generator.ml | 108 | ||||
-rw-r--r-- | src/guestfs-actions.c | 360 | ||||
-rw-r--r-- | src/guestfs-actions.h | 4 | ||||
-rw-r--r-- | src/guestfs_protocol.c | 40 | ||||
-rw-r--r-- | src/guestfs_protocol.h | 34 | ||||
-rw-r--r-- | src/guestfs_protocol.x | 20 |
6 files changed, 530 insertions, 36 deletions
diff --git a/src/generator.ml b/src/generator.ml index ae1dfe9f..bdd032c8 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -1369,6 +1369,46 @@ Compute the SHA512 hash (using the C<sha512sum> program). The checksum is returned as a printable string."); + ("tar_in", (RErr, [FileIn "tarfile"; String "directory"]), 69, [], + [InitBasicFS, TestOutput ( + [["tar_in"; "images/helloworld.tar"; "/"]; + ["cat"; "/hello"]], "hello\n")], + "unpack tarfile to directory", + "\ +This command uploads and unpacks local file C<tarfile> (an +I<uncompressed> tar file) into C<directory>. + +To upload a compressed tarball, use C<guestfs_tgz_in>."); + + ("tar_out", (RErr, [String "directory"; FileOut "tarfile"]), 70, [], + [], + "pack directory into tarfile", + "\ +This command packs the contents of C<directory> and downloads +it to local file C<tarfile>. + +To download a compressed tarball, use C<guestfs_tgz_out>."); + + ("tgz_in", (RErr, [FileIn "tarball"; String "directory"]), 71, [], + [InitBasicFS, TestOutput ( + [["tgz_in"; "images/helloworld.tar.gz"; "/"]; + ["cat"; "/hello"]], "hello\n")], + "unpack compressed tarball to directory", + "\ +This command uploads and unpacks local file C<tarball> (a +I<gzip compressed> tar file) into C<directory>. + +To upload an uncompressed tarball, use C<guestfs_tar_in>."); + + ("tgz_out", (RErr, [String "directory"; FileOut "tarball"]), 72, [], + [], + "pack directory into compressed tarball", + "\ +This command packs the contents of C<directory> and downloads +it to local file C<tarball>. + +To download an uncompressed tarball, use C<guestfs_tar_out>."); + ] let all_functions = non_daemon_functions @ daemon_functions @@ -2856,8 +2896,8 @@ int main (int argc, char *argv[]) char c = 0; int failed = 0; const char *srcdir; + const char *filename; int fd; - char buf[256]; int nr_tests, test_num = 0; no_test_warnings (); @@ -2872,89 +2912,90 @@ int main (int argc, char *argv[]) srcdir = getenv (\"srcdir\"); if (!srcdir) srcdir = \".\"; - guestfs_set_path (g, srcdir); + chdir (srcdir); + guestfs_set_path (g, \".\"); - snprintf (buf, sizeof buf, \"%%s/test1.img\", srcdir); - fd = open (buf, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666); + filename = \"test1.img\"; + fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666); if (fd == -1) { - perror (buf); + perror (filename); exit (1); } if (lseek (fd, %d, SEEK_SET) == -1) { perror (\"lseek\"); close (fd); - unlink (buf); + unlink (filename); exit (1); } if (write (fd, &c, 1) == -1) { perror (\"write\"); close (fd); - unlink (buf); + unlink (filename); exit (1); } if (close (fd) == -1) { - perror (buf); - unlink (buf); + perror (filename); + unlink (filename); exit (1); } - if (guestfs_add_drive (g, buf) == -1) { - printf (\"guestfs_add_drive %%s FAILED\\n\", buf); + if (guestfs_add_drive (g, filename) == -1) { + printf (\"guestfs_add_drive %%s FAILED\\n\", filename); exit (1); } - snprintf (buf, sizeof buf, \"%%s/test2.img\", srcdir); - fd = open (buf, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666); + filename = \"test2.img\"; + fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666); if (fd == -1) { - perror (buf); + perror (filename); exit (1); } if (lseek (fd, %d, SEEK_SET) == -1) { perror (\"lseek\"); close (fd); - unlink (buf); + unlink (filename); exit (1); } if (write (fd, &c, 1) == -1) { perror (\"write\"); close (fd); - unlink (buf); + unlink (filename); exit (1); } if (close (fd) == -1) { - perror (buf); - unlink (buf); + perror (filename); + unlink (filename); exit (1); } - if (guestfs_add_drive (g, buf) == -1) { - printf (\"guestfs_add_drive %%s FAILED\\n\", buf); + if (guestfs_add_drive (g, filename) == -1) { + printf (\"guestfs_add_drive %%s FAILED\\n\", filename); exit (1); } - snprintf (buf, sizeof buf, \"%%s/test3.img\", srcdir); - fd = open (buf, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666); + filename = \"test3.img\"; + fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666); if (fd == -1) { - perror (buf); + perror (filename); exit (1); } if (lseek (fd, %d, SEEK_SET) == -1) { perror (\"lseek\"); close (fd); - unlink (buf); + unlink (filename); exit (1); } if (write (fd, &c, 1) == -1) { perror (\"write\"); close (fd); - unlink (buf); + unlink (filename); exit (1); } if (close (fd) == -1) { - perror (buf); - unlink (buf); + perror (filename); + unlink (filename); exit (1); } - if (guestfs_add_drive (g, buf) == -1) { - printf (\"guestfs_add_drive %%s FAILED\\n\", buf); + if (guestfs_add_drive (g, filename) == -1) { + printf (\"guestfs_add_drive %%s FAILED\\n\", filename); exit (1); } @@ -2983,12 +3024,9 @@ int main (int argc, char *argv[]) pr "\n"; pr " guestfs_close (g);\n"; - pr " snprintf (buf, sizeof buf, \"%%s/test1.img\", srcdir);\n"; - pr " unlink (buf);\n"; - pr " snprintf (buf, sizeof buf, \"%%s/test2.img\", srcdir);\n"; - pr " unlink (buf);\n"; - pr " snprintf (buf, sizeof buf, \"%%s/test3.img\", srcdir);\n"; - pr " unlink (buf);\n"; + pr " unlink (\"test1.img\");\n"; + pr " unlink (\"test2.img\");\n"; + pr " unlink (\"test3.img\");\n"; pr "\n"; pr " if (failed > 0) {\n"; diff --git a/src/guestfs-actions.c b/src/guestfs-actions.c index 5985e41c..efc556ea 100644 --- a/src/guestfs-actions.c +++ b/src/guestfs-actions.c @@ -5777,3 +5777,363 @@ char *guestfs_checksum (guestfs_h *g, return ctx.ret.checksum; /* caller will free */ } +struct tar_in_ctx { + /* This flag is set by the callbacks, so we know we've done + * the callbacks as expected, and in the right sequence. + * 0 = not called, 1 = send called, + * 1001 = reply called. + */ + int cb_sequence; + struct guestfs_message_header hdr; + struct guestfs_message_error err; +}; + +static void tar_in_reply_cb (guestfs_h *g, void *data, XDR *xdr) +{ + guestfs_main_loop *ml = guestfs_get_main_loop (g); + struct tar_in_ctx *ctx = (struct tar_in_ctx *) data; + + ml->main_loop_quit (ml, g); + + if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) { + error (g, "%s: failed to parse reply header", "guestfs_tar_in"); + return; + } + if (ctx->hdr.status == GUESTFS_STATUS_ERROR) { + if (!xdr_guestfs_message_error (xdr, &ctx->err)) { + error (g, "%s: failed to parse reply error", "guestfs_tar_in"); + return; + } + goto done; + } + done: + ctx->cb_sequence = 1001; +} + +int guestfs_tar_in (guestfs_h *g, + const char *tarfile, + const char *directory) +{ + struct guestfs_tar_in_args args; + struct tar_in_ctx ctx; + guestfs_main_loop *ml = guestfs_get_main_loop (g); + int serial; + + if (check_state (g, "guestfs_tar_in") == -1) return -1; + guestfs_set_busy (g); + + memset (&ctx, 0, sizeof ctx); + + args.directory = (char *) directory; + serial = guestfs__send_sync (g, GUESTFS_PROC_TAR_IN, + (xdrproc_t) xdr_guestfs_tar_in_args, (char *) &args); + if (serial == -1) { + guestfs_set_ready (g); + return -1; + } + + { + int r; + + r = guestfs__send_file_sync (g, tarfile); + if (r == -1) { + guestfs_set_ready (g); + return -1; + } + if (r == -2) /* daemon cancelled */ + goto read_reply; + } + + read_reply: + guestfs__switch_to_receiving (g); + ctx.cb_sequence = 0; + guestfs_set_reply_callback (g, tar_in_reply_cb, &ctx); + (void) ml->main_loop_run (ml, g); + guestfs_set_reply_callback (g, NULL, NULL); + if (ctx.cb_sequence != 1001) { + error (g, "%s reply failed, see earlier error messages", "guestfs_tar_in"); + guestfs_set_ready (g); + return -1; + } + + if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_TAR_IN, serial) == -1) { + guestfs_set_ready (g); + return -1; + } + + if (ctx.hdr.status == GUESTFS_STATUS_ERROR) { + error (g, "%s", ctx.err.error_message); + guestfs_set_ready (g); + return -1; + } + + guestfs_set_ready (g); + return 0; +} + +struct tar_out_ctx { + /* This flag is set by the callbacks, so we know we've done + * the callbacks as expected, and in the right sequence. + * 0 = not called, 1 = send called, + * 1001 = reply called. + */ + int cb_sequence; + struct guestfs_message_header hdr; + struct guestfs_message_error err; +}; + +static void tar_out_reply_cb (guestfs_h *g, void *data, XDR *xdr) +{ + guestfs_main_loop *ml = guestfs_get_main_loop (g); + struct tar_out_ctx *ctx = (struct tar_out_ctx *) data; + + ml->main_loop_quit (ml, g); + + if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) { + error (g, "%s: failed to parse reply header", "guestfs_tar_out"); + return; + } + if (ctx->hdr.status == GUESTFS_STATUS_ERROR) { + if (!xdr_guestfs_message_error (xdr, &ctx->err)) { + error (g, "%s: failed to parse reply error", "guestfs_tar_out"); + return; + } + goto done; + } + done: + ctx->cb_sequence = 1001; +} + +int guestfs_tar_out (guestfs_h *g, + const char *directory, + const char *tarfile) +{ + struct guestfs_tar_out_args args; + struct tar_out_ctx ctx; + guestfs_main_loop *ml = guestfs_get_main_loop (g); + int serial; + + if (check_state (g, "guestfs_tar_out") == -1) return -1; + guestfs_set_busy (g); + + memset (&ctx, 0, sizeof ctx); + + args.directory = (char *) directory; + serial = guestfs__send_sync (g, GUESTFS_PROC_TAR_OUT, + (xdrproc_t) xdr_guestfs_tar_out_args, (char *) &args); + if (serial == -1) { + guestfs_set_ready (g); + return -1; + } + + guestfs__switch_to_receiving (g); + ctx.cb_sequence = 0; + guestfs_set_reply_callback (g, tar_out_reply_cb, &ctx); + (void) ml->main_loop_run (ml, g); + guestfs_set_reply_callback (g, NULL, NULL); + if (ctx.cb_sequence != 1001) { + error (g, "%s reply failed, see earlier error messages", "guestfs_tar_out"); + guestfs_set_ready (g); + return -1; + } + + if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_TAR_OUT, serial) == -1) { + guestfs_set_ready (g); + return -1; + } + + if (ctx.hdr.status == GUESTFS_STATUS_ERROR) { + error (g, "%s", ctx.err.error_message); + guestfs_set_ready (g); + return -1; + } + + if (guestfs__receive_file_sync (g, tarfile) == -1) { + guestfs_set_ready (g); + return -1; + } + + guestfs_set_ready (g); + return 0; +} + +struct tgz_in_ctx { + /* This flag is set by the callbacks, so we know we've done + * the callbacks as expected, and in the right sequence. + * 0 = not called, 1 = send called, + * 1001 = reply called. + */ + int cb_sequence; + struct guestfs_message_header hdr; + struct guestfs_message_error err; +}; + +static void tgz_in_reply_cb (guestfs_h *g, void *data, XDR *xdr) +{ + guestfs_main_loop *ml = guestfs_get_main_loop (g); + struct tgz_in_ctx *ctx = (struct tgz_in_ctx *) data; + + ml->main_loop_quit (ml, g); + + if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) { + error (g, "%s: failed to parse reply header", "guestfs_tgz_in"); + return; + } + if (ctx->hdr.status == GUESTFS_STATUS_ERROR) { + if (!xdr_guestfs_message_error (xdr, &ctx->err)) { + error (g, "%s: failed to parse reply error", "guestfs_tgz_in"); + return; + } + goto done; + } + done: + ctx->cb_sequence = 1001; +} + +int guestfs_tgz_in (guestfs_h *g, + const char *tarball, + const char *directory) +{ + struct guestfs_tgz_in_args args; + struct tgz_in_ctx ctx; + guestfs_main_loop *ml = guestfs_get_main_loop (g); + int serial; + + if (check_state (g, "guestfs_tgz_in") == -1) return -1; + guestfs_set_busy (g); + + memset (&ctx, 0, sizeof ctx); + + args.directory = (char *) directory; + serial = guestfs__send_sync (g, GUESTFS_PROC_TGZ_IN, + (xdrproc_t) xdr_guestfs_tgz_in_args, (char *) &args); + if (serial == -1) { + guestfs_set_ready (g); + return -1; + } + + { + int r; + + r = guestfs__send_file_sync (g, tarball); + if (r == -1) { + guestfs_set_ready (g); + return -1; + } + if (r == -2) /* daemon cancelled */ + goto read_reply; + } + + read_reply: + guestfs__switch_to_receiving (g); + ctx.cb_sequence = 0; + guestfs_set_reply_callback (g, tgz_in_reply_cb, &ctx); + (void) ml->main_loop_run (ml, g); + guestfs_set_reply_callback (g, NULL, NULL); + if (ctx.cb_sequence != 1001) { + error (g, "%s reply failed, see earlier error messages", "guestfs_tgz_in"); + guestfs_set_ready (g); + return -1; + } + + if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_TGZ_IN, serial) == -1) { + guestfs_set_ready (g); + return -1; + } + + if (ctx.hdr.status == GUESTFS_STATUS_ERROR) { + error (g, "%s", ctx.err.error_message); + guestfs_set_ready (g); + return -1; + } + + guestfs_set_ready (g); + return 0; +} + +struct tgz_out_ctx { + /* This flag is set by the callbacks, so we know we've done + * the callbacks as expected, and in the right sequence. + * 0 = not called, 1 = send called, + * 1001 = reply called. + */ + int cb_sequence; + struct guestfs_message_header hdr; + struct guestfs_message_error err; +}; + +static void tgz_out_reply_cb (guestfs_h *g, void *data, XDR *xdr) +{ + guestfs_main_loop *ml = guestfs_get_main_loop (g); + struct tgz_out_ctx *ctx = (struct tgz_out_ctx *) data; + + ml->main_loop_quit (ml, g); + + if (!xdr_guestfs_message_header (xdr, &ctx->hdr)) { + error (g, "%s: failed to parse reply header", "guestfs_tgz_out"); + return; + } + if (ctx->hdr.status == GUESTFS_STATUS_ERROR) { + if (!xdr_guestfs_message_error (xdr, &ctx->err)) { + error (g, "%s: failed to parse reply error", "guestfs_tgz_out"); + return; + } + goto done; + } + done: + ctx->cb_sequence = 1001; +} + +int guestfs_tgz_out (guestfs_h *g, + const char *directory, + const char *tarball) +{ + struct guestfs_tgz_out_args args; + struct tgz_out_ctx ctx; + guestfs_main_loop *ml = guestfs_get_main_loop (g); + int serial; + + if (check_state (g, "guestfs_tgz_out") == -1) return -1; + guestfs_set_busy (g); + + memset (&ctx, 0, sizeof ctx); + + args.directory = (char *) directory; + serial = guestfs__send_sync (g, GUESTFS_PROC_TGZ_OUT, + (xdrproc_t) xdr_guestfs_tgz_out_args, (char *) &args); + if (serial == -1) { + guestfs_set_ready (g); + return -1; + } + + guestfs__switch_to_receiving (g); + ctx.cb_sequence = 0; + guestfs_set_reply_callback (g, tgz_out_reply_cb, &ctx); + (void) ml->main_loop_run (ml, g); + guestfs_set_reply_callback (g, NULL, NULL); + if (ctx.cb_sequence != 1001) { + error (g, "%s reply failed, see earlier error messages", "guestfs_tgz_out"); + guestfs_set_ready (g); + return -1; + } + + if (check_reply_header (g, &ctx.hdr, GUESTFS_PROC_TGZ_OUT, serial) == -1) { + guestfs_set_ready (g); + return -1; + } + + if (ctx.hdr.status == GUESTFS_STATUS_ERROR) { + error (g, "%s", ctx.err.error_message); + guestfs_set_ready (g); + return -1; + } + + if (guestfs__receive_file_sync (g, tarball) == -1) { + guestfs_set_ready (g); + return -1; + } + + guestfs_set_ready (g); + return 0; +} + diff --git a/src/guestfs-actions.h b/src/guestfs-actions.h index c694ddda..ae54d3a3 100644 --- a/src/guestfs-actions.h +++ b/src/guestfs-actions.h @@ -106,3 +106,7 @@ extern int guestfs_blockdev_rereadpt (guestfs_h *handle, const char *device); extern int guestfs_upload (guestfs_h *handle, const char *filename, const char *remotefilename); extern int guestfs_download (guestfs_h *handle, const char *remotefilename, const char *filename); extern char *guestfs_checksum (guestfs_h *handle, const char *csumtype, const char *path); +extern int guestfs_tar_in (guestfs_h *handle, const char *tarfile, const char *directory); +extern int guestfs_tar_out (guestfs_h *handle, const char *directory, const char *tarfile); +extern int guestfs_tgz_in (guestfs_h *handle, const char *tarball, const char *directory); +extern int guestfs_tgz_out (guestfs_h *handle, const char *directory, const char *tarball); diff --git a/src/guestfs_protocol.c b/src/guestfs_protocol.c index fc2eae97..8b88ad95 100644 --- a/src/guestfs_protocol.c +++ b/src/guestfs_protocol.c @@ -1229,6 +1229,46 @@ xdr_guestfs_checksum_ret (XDR *xdrs, guestfs_checksum_ret *objp) } bool_t +xdr_guestfs_tar_in_args (XDR *xdrs, guestfs_tar_in_args *objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, &objp->directory, ~0)) + return FALSE; + return TRUE; +} + +bool_t +xdr_guestfs_tar_out_args (XDR *xdrs, guestfs_tar_out_args *objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, &objp->directory, ~0)) + return FALSE; + return TRUE; +} + +bool_t +xdr_guestfs_tgz_in_args (XDR *xdrs, guestfs_tgz_in_args *objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, &objp->directory, ~0)) + return FALSE; + return TRUE; +} + +bool_t +xdr_guestfs_tgz_out_args (XDR *xdrs, guestfs_tgz_out_args *objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, &objp->directory, ~0)) + return FALSE; + return TRUE; +} + +bool_t xdr_guestfs_procedure (XDR *xdrs, guestfs_procedure *objp) { register int32_t *buf; diff --git a/src/guestfs_protocol.h b/src/guestfs_protocol.h index 05bd40bb..55e6241e 100644 --- a/src/guestfs_protocol.h +++ b/src/guestfs_protocol.h @@ -637,6 +637,26 @@ struct guestfs_checksum_ret { }; typedef struct guestfs_checksum_ret guestfs_checksum_ret; +struct guestfs_tar_in_args { + char *directory; +}; +typedef struct guestfs_tar_in_args guestfs_tar_in_args; + +struct guestfs_tar_out_args { + char *directory; +}; +typedef struct guestfs_tar_out_args guestfs_tar_out_args; + +struct guestfs_tgz_in_args { + char *directory; +}; +typedef struct guestfs_tgz_in_args guestfs_tgz_in_args; + +struct guestfs_tgz_out_args { + char *directory; +}; +typedef struct guestfs_tgz_out_args guestfs_tgz_out_args; + enum guestfs_procedure { GUESTFS_PROC_MOUNT = 1, GUESTFS_PROC_SYNC = 2, @@ -706,7 +726,11 @@ enum guestfs_procedure { GUESTFS_PROC_UPLOAD = 66, GUESTFS_PROC_DOWNLOAD = 67, GUESTFS_PROC_CHECKSUM = 68, - GUESTFS_PROC_NR_PROCS = 68 + 1, + GUESTFS_PROC_TAR_IN = 69, + GUESTFS_PROC_TAR_OUT = 70, + GUESTFS_PROC_TGZ_IN = 71, + GUESTFS_PROC_TGZ_OUT = 72, + GUESTFS_PROC_NR_PROCS = 72 + 1, }; typedef enum guestfs_procedure guestfs_procedure; #define GUESTFS_MESSAGE_MAX 4194304 @@ -853,6 +877,10 @@ extern bool_t xdr_guestfs_upload_args (XDR *, guestfs_upload_args*); extern bool_t xdr_guestfs_download_args (XDR *, guestfs_download_args*); extern bool_t xdr_guestfs_checksum_args (XDR *, guestfs_checksum_args*); extern bool_t xdr_guestfs_checksum_ret (XDR *, guestfs_checksum_ret*); +extern bool_t xdr_guestfs_tar_in_args (XDR *, guestfs_tar_in_args*); +extern bool_t xdr_guestfs_tar_out_args (XDR *, guestfs_tar_out_args*); +extern bool_t xdr_guestfs_tgz_in_args (XDR *, guestfs_tgz_in_args*); +extern bool_t xdr_guestfs_tgz_out_args (XDR *, guestfs_tgz_out_args*); extern bool_t xdr_guestfs_procedure (XDR *, guestfs_procedure*); extern bool_t xdr_guestfs_message_direction (XDR *, guestfs_message_direction*); extern bool_t xdr_guestfs_message_status (XDR *, guestfs_message_status*); @@ -958,6 +986,10 @@ extern bool_t xdr_guestfs_upload_args (); extern bool_t xdr_guestfs_download_args (); extern bool_t xdr_guestfs_checksum_args (); extern bool_t xdr_guestfs_checksum_ret (); +extern bool_t xdr_guestfs_tar_in_args (); +extern bool_t xdr_guestfs_tar_out_args (); +extern bool_t xdr_guestfs_tgz_in_args (); +extern bool_t xdr_guestfs_tgz_out_args (); extern bool_t xdr_guestfs_procedure (); extern bool_t xdr_guestfs_message_direction (); extern bool_t xdr_guestfs_message_status (); diff --git a/src/guestfs_protocol.x b/src/guestfs_protocol.x index ca2d0ced..7f982693 100644 --- a/src/guestfs_protocol.x +++ b/src/guestfs_protocol.x @@ -492,6 +492,22 @@ struct guestfs_checksum_ret { string checksum<>; }; +struct guestfs_tar_in_args { + string directory<>; +}; + +struct guestfs_tar_out_args { + string directory<>; +}; + +struct guestfs_tgz_in_args { + string directory<>; +}; + +struct guestfs_tgz_out_args { + string directory<>; +}; + enum guestfs_procedure { GUESTFS_PROC_MOUNT = 1, GUESTFS_PROC_SYNC = 2, @@ -561,6 +577,10 @@ enum guestfs_procedure { GUESTFS_PROC_UPLOAD = 66, GUESTFS_PROC_DOWNLOAD = 67, GUESTFS_PROC_CHECKSUM = 68, + GUESTFS_PROC_TAR_IN = 69, + GUESTFS_PROC_TAR_OUT = 70, + GUESTFS_PROC_TGZ_IN = 71, + GUESTFS_PROC_TGZ_OUT = 72, GUESTFS_PROC_NR_PROCS }; |