From 424f9940af2a3c1e61faac8db65e72900d067d63 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Wed, 14 Jun 2017 15:52:19 +0200 Subject: [PATCH] remove legacy sparsecp sparsecp gets only used in qmextract, which is part of the old backup method (pre PVE 2.3). Do not remove qmextract for now people could still have backups from < PVE 2.3 around. They could be restored manually, but we shouldn't make restoring complicated. Thus replace sparsecp with `cp sparse=always`. Signed-off-by: Thomas Lamprecht --- Makefile | 6 +-- qmextract | 4 +- sparsecp.c | 132 --------------------------------------------------- utils.c | 135 ----------------------------------------------------- 4 files changed, 3 insertions(+), 274 deletions(-) delete mode 100644 sparsecp.c delete mode 100644 utils.c diff --git a/Makefile b/Makefile index a11b6577..25eb34ff 100644 --- a/Makefile +++ b/Makefile @@ -36,9 +36,6 @@ all: dinstall: deb dpkg -i ${DEB} -sparsecp: sparsecp.c utils.c - gcc ${CFLAGS} -o sparsecp sparsecp.c - qm.bash-completion: PVE_GENERATING_DOCS=1 perl -I. -T -e "use PVE::CLI::qm; PVE::CLI::qm->generate_bash_completions();" >$@.tmp mv $@.tmp $@ @@ -47,7 +44,7 @@ qmrestore.bash-completion: PVE_GENERATING_DOCS=1 perl -I. -T -e "use PVE::CLI::qmrestore; PVE::CLI::qmrestore->generate_bash_completions();" >$@.tmp mv $@.tmp $@ -PKGSOURCES=qm qm.1 qmrestore qmrestore.1 qmextract sparsecp qm.conf.5 qm.bash-completion qmrestore.bash-completion +PKGSOURCES=qm qm.1 qmrestore qmrestore.1 qmextract qm.conf.5 qm.bash-completion qmrestore.bash-completion .PHONY: install install: ${PKGSOURCES} @@ -69,7 +66,6 @@ install: ${PKGSOURCES} install -m 0755 pve-bridge ${DESTDIR}${VARLIBDIR}/pve-bridge install -m 0755 pve-bridge-hotplug ${DESTDIR}${VARLIBDIR}/pve-bridge-hotplug install -m 0755 pve-bridgedown ${DESTDIR}${VARLIBDIR}/pve-bridgedown - install -s -m 0755 sparsecp ${DESTDIR}${LIBDIR} install -D -m 0644 modules-load.conf ${DESTDIR}/etc/modules-load.d/qemu-server.conf install -m 0755 qmextract ${DESTDIR}${LIBDIR} install -m 0644 qm.1 ${DESTDIR}/${MAN1DIR} diff --git a/qmextract b/qmextract index b660b915..1466a586 100755 --- a/qmextract +++ b/qmextract @@ -191,8 +191,8 @@ sub extract_archive { exec 'dd', 'ibs=256K', 'obs=256K', "of=$path"; die "couldn't exec dd: $!\n"; } else { - exec '/usr/lib/qemu-server/sparsecp', $path; - die "couldn't exec sparsecp: $!\n"; + exec '/bin/cp', '--sparse=always', '/dev/stdin', $path; + die "couldn't exec cp: $!\n"; } } diff --git a/sparsecp.c b/sparsecp.c deleted file mode 100644 index 950a27ce..00000000 --- a/sparsecp.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - Copyright (C) 2007-2009 Proxmox Server Solutions GmbH - - Copyright: vzdump is under GNU GPL, the GNU General Public License. - - 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 - the Free Software Foundation; version 2 dated June, 1991. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, - MA 02110-1301, USA. - - Author: Dietmar Maurer - -*/ - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "utils.c" - -#define BLOCKSIZE 512*8 - -static char *outname; - -static void -cleanup (void) -{ - if (outname) - unlink (outname); -} - -void term_handler() -{ - fprintf (stderr, "received signal - terminate process\n"); - exit(-1); -} - -size_t -sparse_cp (int infd, int outfd) -{ - size_t total = 0; - size_t count; - char buffer[BLOCKSIZE]; - int last_write_made_hole = 0; - - while ((count = safe_read (infd, buffer, sizeof (buffer))) > 0) { - if (block_is_zero (buffer, count)) { - - if (lseek (outfd, count, SEEK_CUR) < 0) { - perror ("cannot lseek\n"); - exit (-1); - } - last_write_made_hole = 1; - } else { - full_write (outfd, buffer, count); - last_write_made_hole = 0; - } - total += count; - } - - if (last_write_made_hole) { - if (ftruncate (outfd, total) < 0) { - perror ("cannot ftruncate\n"); - exit (-1); - } - } - - return total; -} - -int -main (int argc, char **argv) -{ - struct sigaction sa; - - if (argc != 2) { - fprintf (stderr, "wrong number of arguments\n"); - exit (-1); - } - - time_t starttime = time(NULL); - - outname = argv[1]; - - int outfd; - - if ((outfd = open(outname, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) { - fprintf (stderr, "unable to open file '%s' - %s\n", - outname, strerror (errno)); - exit (-1); - } - atexit(cleanup); - - setsig(&sa, SIGINT, term_handler, SA_RESTART); - setsig(&sa, SIGQUIT, term_handler, SA_RESTART); - setsig(&sa, SIGTERM, term_handler, SA_RESTART); - setsig(&sa, SIGPIPE, term_handler, SA_RESTART); - - size_t total = sparse_cp (0, outfd); - - close (outfd); - - time_t delay = time(NULL) - starttime; - if (delay <= 0) delay = 1; - - fprintf (stderr, "%zu bytes copied, %zd s, %.2f MiB/s\n", total, delay, - (total/(1024*1024))/(float)delay); - - outname = NULL; - - exit (0); -} diff --git a/utils.c b/utils.c deleted file mode 100644 index c69e0ef5..00000000 --- a/utils.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - Copyright (C) 2007-2009 Proxmox Server Solutions GmbH - - Copyright: vzdump is under GNU GPL, the GNU General Public License. - - 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 - the Free Software Foundation; version 2 dated June, 1991. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, - MA 02110-1301, USA. - - Author: Dietmar Maurer - -*/ - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Set a signal handler */ -static void -setsig (struct sigaction *sa, int sig, void (*fun)(int), int flags) -{ - sa->sa_handler = fun; - sa->sa_flags = flags; - sigemptyset(&sa->sa_mask); - sigaction(sig, sa, NULL); -} - -int -block_is_zero (char const *buffer, size_t size) -{ - while (size--) - if (*buffer++) - return 0; - - return 1; -} - -ssize_t -safe_read(int fd, char *buf, size_t count) -{ - ssize_t n; - - do { - n = read(fd, buf, count); - } while (n < 0 && errno == EINTR); - - return n; -} - -int -full_read(int fd, char *buf, size_t len) -{ - ssize_t n; - size_t total; - - total = 0; - - while (len > 0) { - n = safe_read(fd, buf, len); - - if (n == 0) - return total; - - if (n < 0) - break; - - buf += n; - total += n; - len -= n; - } - - if (len) { - fprintf (stderr, "ERROR: incomplete read detected\n"); - exit (-1); - } - - return total; -} - -ssize_t -safe_write(int fd, char *buf, size_t count) -{ - ssize_t n; - - do { - n = write(fd, buf, count); - } while (n < 0 && errno == EINTR); - - return n; -} - -int -full_write(int fd, char *buf, size_t len) -{ - ssize_t n; - size_t total; - - total = 0; - - while (len > 0) { - n = safe_write(fd, buf, len); - - if (n < 0) - break; - - buf += n; - total += n; - len -= n; - } - - if (len) { - fprintf (stderr, "ERROR: incomplete write detected\n"); - exit (-1); - } - - return total; -}