/* libguestfs - the guestfsd daemon
- * Copyright (C) 2009 Red Hat Inc.
+ * Copyright (C) 2009 Red Hat Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
/* Has one FileIn parameter. */
int
-do_tar_in (const char *dir)
+do_tar_in (char *dir)
{
int err, r, len;
FILE *fp;
}
/* "tar -C /sysroot%s -xf -" but we have to quote the dir. */
- len = 2 * strlen (dir) + 32;
+ len = 2 * strlen (dir) + sysroot_len + 32;
cmd = malloc (len);
if (!cmd) {
err = errno;
reply_with_perror ("malloc");
return -1;
}
- strcpy (cmd, "tar -C /sysroot");
+ strcpy (cmd, "tar -C ");
+ strcat (cmd, sysroot);
shell_quote (cmd+15, len-15, dir);
strcat (cmd, " -xf -");
cancel_receive ();
errno = err;
reply_with_perror ("%s", cmd);
+ free (cmd);
return -1;
}
+ free (cmd);
r = receive_file (fwrite_cb, &fp);
if (r == -1) { /* write error */
return -1;
}
- if (pclose (fp) == -1) {
+ if (pclose (fp) != 0) {
err = errno;
cancel_receive ();
errno = err;
/* Has one FileOut parameter. */
int
-do_tar_out (const char *dir)
+do_tar_out (char *dir)
{
int r, len;
FILE *fp;
ABS_PATH (dir, -1);
/* "tar -C /sysroot%s -cf - ." but we have to quote the dir. */
- len = 2 * strlen (dir) + 32;
+ len = 2 * strlen (dir) + sysroot_len + 32;
cmd = malloc (len);
if (!cmd) {
reply_with_perror ("malloc");
return -1;
}
- strcpy (cmd, "tar -C /sysroot");
+ strcpy (cmd, "tar -C ");
+ strcat (cmd, sysroot);
shell_quote (cmd+15, len-15, dir);
strcat (cmd, " -cf - .");
fp = popen (cmd, "r");
if (fp == NULL) {
reply_with_perror ("%s", cmd);
+ free (cmd);
return -1;
}
+ free (cmd);
/* Now we must send the reply message, before the file contents. After
* this there is no opportunity in the protocol to send any error
}
}
- if (r == -1) {
+ if (ferror (fp)) {
perror (dir);
send_file_end (1); /* Cancel. */
pclose (fp);
return -1;
}
- if (pclose (fp) == -1) {
+ if (pclose (fp) != 0) {
perror (dir);
send_file_end (1); /* Cancel. */
return -1;
/* Has one FileIn parameter. */
int
-do_tgz_in (const char *dir)
+do_tgz_in (char *dir)
{
int err, r, len;
FILE *fp;
}
/* "tar -C /sysroot%s -zxf -" but we have to quote the dir. */
- len = 2 * strlen (dir) + 32;
+ len = 2 * strlen (dir) + sysroot_len + 32;
cmd = malloc (len);
if (!cmd) {
err = errno;
reply_with_perror ("malloc");
return -1;
}
- strcpy (cmd, "tar -C /sysroot");
+ strcpy (cmd, "tar -C ");
+ strcat (cmd, sysroot);
shell_quote (cmd+15, len-15, dir);
strcat (cmd, " -zxf -");
cancel_receive ();
errno = err;
reply_with_perror ("%s", cmd);
+ free (cmd);
return -1;
}
+ free (cmd);
r = receive_file (fwrite_cb, &fp);
if (r == -1) { /* write error */
return -1;
}
- if (pclose (fp) == -1) {
+ if (pclose (fp) != 0) {
err = errno;
cancel_receive ();
errno = err;
/* Has one FileOut parameter. */
int
-do_tgz_out (const char *dir)
+do_tgz_out (char *dir)
{
int r, len;
FILE *fp;
ABS_PATH (dir, -1);
/* "tar -C /sysroot%s -zcf - ." but we have to quote the dir. */
- len = 2 * strlen (dir) + 32;
+ len = 2 * strlen (dir) + sysroot_len + 32;
cmd = malloc (len);
if (!cmd) {
reply_with_perror ("malloc");
return -1;
}
- strcpy (cmd, "tar -C /sysroot");
+ strcpy (cmd, "tar -C ");
+ strcat (cmd, sysroot);
shell_quote (cmd+15, len-15, dir);
strcat (cmd, " -zcf - .");
fp = popen (cmd, "r");
if (fp == NULL) {
reply_with_perror ("%s", cmd);
+ free (cmd);
return -1;
}
+ free (cmd);
/* Now we must send the reply message, before the file contents. After
* this there is no opportunity in the protocol to send any error
}
}
- if (r == -1) {
+ if (ferror (fp)) {
perror (dir);
send_file_end (1); /* Cancel. */
pclose (fp);
return -1;
}
- if (pclose (fp) == -1) {
+ if (pclose (fp) != 0) {
perror (dir);
send_file_end (1); /* Cancel. */
return -1;