test-tar-extract: rename and add support for creating archives
This makes it much easier to test importd code without the surrounding machinery.
This commit is contained in:
committed by
Luca Boccassi
parent
aa8cf865b9
commit
4f0989d42d
@@ -88,7 +88,7 @@ executables += [
|
||||
'sources' : files('import-generator.c'),
|
||||
},
|
||||
test_template + {
|
||||
'sources' : files('test-tar-extract.c'),
|
||||
'sources' : files('test-tar.c'),
|
||||
'type' : 'manual',
|
||||
},
|
||||
test_template + {
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include "errno-util.h"
|
||||
#include "fd-util.h"
|
||||
#include "libarchive-util.h"
|
||||
#include "main-func.h"
|
||||
#include "tar-util.h"
|
||||
#include "tests.h"
|
||||
|
||||
static int run(int argc, char **argv) {
|
||||
int r;
|
||||
|
||||
test_setup_logging(LOG_DEBUG);
|
||||
|
||||
if (argc != 3)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Need two arguments exactly: <input> <output>");
|
||||
|
||||
r = dlopen_libarchive();
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
_cleanup_close_ int input_fd = RET_NERRNO(open(argv[1], O_RDONLY | O_CLOEXEC));
|
||||
if (input_fd < 0)
|
||||
return log_error_errno(input_fd, "Cannot open %s: %m", argv[1]);
|
||||
|
||||
_cleanup_close_ int output_fd = RET_NERRNO(open(argv[2], O_DIRECTORY | O_CLOEXEC));
|
||||
if (output_fd < 0)
|
||||
return log_error_errno(output_fd, "Cannot open %s: %m", argv[2]);
|
||||
|
||||
r = tar_x(input_fd, output_fd, /* flags= */ TAR_SELINUX);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "tar_x failed: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_MAIN_FUNCTION(run);
|
||||
@@ -0,0 +1,58 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "errno-util.h"
|
||||
#include "fd-util.h"
|
||||
#include "libarchive-util.h"
|
||||
#include "main-func.h"
|
||||
#include "tar-util.h"
|
||||
#include "tests.h"
|
||||
|
||||
static int run(int argc, char **argv) {
|
||||
int r;
|
||||
|
||||
test_setup_logging(LOG_DEBUG);
|
||||
|
||||
if (argc != 4)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Need three arguments exactly: -c <output> <input> | -x <input> <output>");
|
||||
|
||||
bool create;
|
||||
if (streq(argv[1], "-c"))
|
||||
create = true;
|
||||
else if (streq(argv[1], "-x"))
|
||||
create = false;
|
||||
else
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown operation '%s'.", argv[1]);
|
||||
|
||||
r = dlopen_libarchive();
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
int flags = create ? O_CREAT | O_WRONLY | O_TRUNC : O_RDONLY;
|
||||
_cleanup_close_ int fd1 = RET_NERRNO(open(argv[2], flags | O_CLOEXEC, 0666));
|
||||
if (fd1 < 0)
|
||||
return log_error_errno(fd1, "Cannot open %s: %m", argv[2]);
|
||||
|
||||
if (!create) {
|
||||
r = RET_NERRNO(mkdir(argv[3], 0777));
|
||||
if (r < 0 && r != -EEXIST)
|
||||
return log_error_errno(r, "Failed to mkdir %s: %m", argv[3]);
|
||||
}
|
||||
|
||||
_cleanup_close_ int fd2 = RET_NERRNO(open(argv[3], O_DIRECTORY | O_CLOEXEC));
|
||||
if (fd2 < 0)
|
||||
return log_error_errno(fd2, "Cannot open %s: %m", argv[3]);
|
||||
|
||||
if (create)
|
||||
r = tar_c(fd2, fd1, argv[2], /* flags= */ TAR_SELINUX);
|
||||
else
|
||||
r = tar_x(fd1, fd2, /* flags= */ TAR_SELINUX);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "tar %s failed: %m", argv[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_MAIN_FUNCTION(run);
|
||||
Reference in New Issue
Block a user