summaryrefslogtreecommitdiffstats
path: root/daemon/tar.c
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-08-14 09:04:51 +0100
committerRichard W.M. Jones <rjones@redhat.com>2012-08-14 09:53:37 +0100
commit864ef706a84c7c87a62f776d4b2e82a6f959ae14 (patch)
tree12902960fade1810e74a72aa6882c9ee28249e8f /daemon/tar.c
parent84c897c93a794e4bdab37dfd505618de68bf145d (diff)
downloadlibguestfs-864ef706a84c7c87a62f776d4b2e82a6f959ae14.tar.gz
libguestfs-864ef706a84c7c87a62f776d4b2e82a6f959ae14.tar.xz
libguestfs-864ef706a84c7c87a62f776d4b2e82a6f959ae14.zip
Add optional compress flag to tar-in, tar-out APIs.
The compress flag can be used to control compression, one of: (none), "compress", "gzip", "bzip2", "xz", "lzop". Thus these calls can now be used instead of tgz-in/tgz-out/txz-in/txz-out, and also support more compression types. Mark these APIs as once_had_no_optargs so that compatibility code is generated.
Diffstat (limited to 'daemon/tar.c')
-rw-r--r--daemon/tar.c81
1 files changed, 56 insertions, 25 deletions
diff --git a/daemon/tar.c b/daemon/tar.c
index 83e68dd3..8d78283e 100644
--- a/daemon/tar.c
+++ b/daemon/tar.c
@@ -113,9 +113,11 @@ write_cb (void *fd_ptr, const void *buf, size_t len)
}
/* Has one FileIn parameter. */
-static int
-do_tXz_in (const char *dir, const char *filter)
+/* Takes optional arguments, consult optargs_bitmask. */
+int
+do_tar_in (const char *dir, const char *compress)
{
+ const char *filter;
int err, r;
FILE *fp;
char *cmd;
@@ -126,6 +128,24 @@ do_tXz_in (const char *dir, const char *filter)
if (chown_supported == -1)
return -1;
+ if ((optargs_bitmask & GUESTFS_TAR_IN_COMPRESS_BITMASK)) {
+ if (STREQ (compress, "compress"))
+ filter = " --compress";
+ else if (STREQ (compress, "gzip"))
+ filter = " --gzip";
+ else if (STREQ (compress, "bzip2"))
+ filter = " --bzip2";
+ else if (STREQ (compress, "xz"))
+ filter = " --xz";
+ else if (STREQ (compress, "lzop"))
+ filter = " --lzop";
+ else {
+ reply_with_error ("unknown compression type: %s", compress);
+ return -1;
+ }
+ } else
+ filter = "";
+
fd = mkstemp (error_file);
if (fd == -1) {
reply_with_perror ("mkstemp");
@@ -135,7 +155,7 @@ do_tXz_in (const char *dir, const char *filter)
close (fd);
/* "tar -C /sysroot%s -xf -" but we have to quote the dir. */
- if (asprintf_nowarn (&cmd, "tar -C %R -%sxf - %s2> %s",
+ if (asprintf_nowarn (&cmd, "tar -C %R%s -xf - %s2> %s",
dir, filter,
chown_supported ? "" : "--no-same-owner ",
error_file) == -1) {
@@ -203,36 +223,52 @@ do_tXz_in (const char *dir, const char *filter)
/* Has one FileIn parameter. */
int
-do_tar_in (const char *dir)
-{
- return do_tXz_in (dir, "");
-}
-
-/* Has one FileIn parameter. */
-int
do_tgz_in (const char *dir)
{
- return do_tXz_in (dir, "z");
+ optargs_bitmask = GUESTFS_TAR_IN_COMPRESS_BITMASK;
+ return do_tar_in (dir, "gzip");
}
/* Has one FileIn parameter. */
int
do_txz_in (const char *dir)
{
- return do_tXz_in (dir, "J");
+ optargs_bitmask = GUESTFS_TAR_IN_COMPRESS_BITMASK;
+ return do_tar_in (dir, "xz");
}
/* Has one FileOut parameter. */
-static int
-do_tXz_out (const char *dir, const char *filter)
+/* Takes optional arguments, consult optargs_bitmask. */
+int
+do_tar_out (const char *dir, const char *compress)
{
+ const char *filter;
int r;
FILE *fp;
char *cmd;
char buf[GUESTFS_MAX_CHUNK_SIZE];
- /* "tar -C /sysroot%s -zcf - ." but we have to quote the dir. */
- if (asprintf_nowarn (&cmd, "tar -C %R -%scf - .", dir, filter) == -1) {
+ if ((optargs_bitmask & GUESTFS_TAR_OUT_COMPRESS_BITMASK)) {
+ if (STREQ (compress, "compress"))
+ filter = " --compress";
+ else if (STREQ (compress, "gzip"))
+ filter = " --gzip";
+ else if (STREQ (compress, "bzip2"))
+ filter = " --bzip2";
+ else if (STREQ (compress, "xz"))
+ filter = " --xz";
+ else if (STREQ (compress, "lzop"))
+ filter = " --lzop";
+ else {
+ reply_with_error ("unknown compression type: %s", compress);
+ return -1;
+ }
+ } else
+ filter = "";
+
+ /* "tar -C /sysroot%s -cf - ." but we have to quote the dir. */
+ if (asprintf_nowarn (&cmd, "tar -C %R%s -cf - .",
+ dir, filter) == -1) {
reply_with_perror ("asprintf");
return -1;
}
@@ -282,21 +318,16 @@ do_tXz_out (const char *dir, const char *filter)
/* Has one FileOut parameter. */
int
-do_tar_out (const char *dir)
-{
- return do_tXz_out (dir, "");
-}
-
-/* Has one FileOut parameter. */
-int
do_tgz_out (const char *dir)
{
- return do_tXz_out (dir, "z");
+ optargs_bitmask = GUESTFS_TAR_OUT_COMPRESS_BITMASK;
+ return do_tar_out (dir, "gzip");
}
/* Has one FileOut parameter. */
int
do_txz_out (const char *dir)
{
- return do_tXz_out (dir, "J");
+ optargs_bitmask = GUESTFS_TAR_OUT_COMPRESS_BITMASK;
+ return do_tar_out (dir, "bzip2");
}