summaryrefslogtreecommitdiff
path: root/tar
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-09-08 14:53:30 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-09-08 14:53:30 +0200
commit3a851dfe87c88ac1d4dddc2a26cc48b037f852f9 (patch)
treea8a8f34291aa58b25737088d247a91a7f60b4fec /tar
parent60064dd0412a149fe00cfc4e2f2361c22656db57 (diff)
Replace direct file I/O with abstraction layer
This should make it easier to use libsquashfs with custom setups that embedd a squashfs image inside something else. Also, it should make it easier to port to non unix-like platforms. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'tar')
-rw-r--r--tar/tar2sqfs.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/tar/tar2sqfs.c b/tar/tar2sqfs.c
index d2772e6..a27f72b 100644
--- a/tar/tar2sqfs.c
+++ b/tar/tar2sqfs.c
@@ -10,6 +10,8 @@
#include "sqfs/id_table.h"
#include "sqfs/xattr.h"
#include "sqfs/data.h"
+#include "sqfs/io.h"
+
#include "data_writer.h"
#include "highlevel.h"
#include "fstree.h"
@@ -94,7 +96,7 @@ static const char *filename;
static int block_size = SQFS_DEFAULT_BLOCK_SIZE;
static size_t devblksize = SQFS_DEVBLK_SIZE;
static bool quiet = false;
-static int outmode = O_WRONLY | O_CREAT | O_EXCL;
+static int outmode = 0;
static unsigned int num_jobs = 1;
static E_SQFS_COMPRESSOR comp_id;
static char *comp_extra = NULL;
@@ -165,7 +167,7 @@ static void process_args(int argc, char **argv)
exportable = true;
break;
case 'f':
- outmode = O_WRONLY | O_CREAT | O_TRUNC;
+ outmode |= SQFS_FILE_OPEN_OVERWRITE;
break;
case 'q':
quiet = true;
@@ -354,10 +356,11 @@ fail:
int main(int argc, char **argv)
{
- int outfd, status = EXIT_SUCCESS;
sqfs_compressor_config_t cfg;
+ int status = EXIT_SUCCESS;
sqfs_compressor_t *cmp;
sqfs_id_table_t *idtbl;
+ sqfs_file_t *outfile;
data_writer_t *data;
sqfs_super_t super;
fstree_t fs;
@@ -370,8 +373,8 @@ int main(int argc, char **argv)
return EXIT_FAILURE;
}
- outfd = open(filename, outmode, 0644);
- if (outfd < 0) {
+ outfile = sqfs_open_file(filename, outmode);
+ if (outfile == NULL) {
perror(filename);
return EXIT_FAILURE;
}
@@ -388,10 +391,10 @@ int main(int argc, char **argv)
if (sqfs_super_init(&super, block_size, fs.defaults.st_mtime, comp_id))
goto out_cmp;
- if (sqfs_super_write(&super, outfd))
+ if (sqfs_super_write(&super, outfile))
goto out_cmp;
- ret = cmp->write_options(cmp, outfd);
+ ret = cmp->write_options(cmp, outfile);
if (ret < 0)
goto out_cmp;
@@ -400,7 +403,7 @@ int main(int argc, char **argv)
super.bytes_used += ret;
}
- data = data_writer_create(&super, cmp, outfd, devblksize, num_jobs);
+ data = data_writer_create(&super, cmp, outfile, devblksize, num_jobs);
if (data == NULL)
goto out_cmp;
@@ -422,27 +425,27 @@ int main(int argc, char **argv)
fstree_xattr_deduplicate(&fs);
- if (sqfs_serialize_fstree(outfd, &super, &fs, cmp, idtbl))
+ if (sqfs_serialize_fstree(outfile, &super, &fs, cmp, idtbl))
goto out;
if (data_writer_write_fragment_table(data))
goto out;
if (exportable) {
- if (write_export_table(outfd, &fs, &super, cmp))
+ if (write_export_table(outfile, &fs, &super, cmp))
goto out;
}
- if (sqfs_id_table_write(idtbl, outfd, &super, cmp))
+ if (sqfs_id_table_write(idtbl, outfile, &super, cmp))
goto out;
- if (write_xattr(outfd, &fs, &super, cmp))
+ if (write_xattr(outfile, &fs, &super, cmp))
goto out;
- if (sqfs_super_write(&super, outfd))
+ if (sqfs_super_write(&super, outfile))
goto out;
- if (padd_file(outfd, super.bytes_used, devblksize))
+ if (padd_sqfs(outfile, super.bytes_used, devblksize))
goto out;
if (!quiet) {
@@ -460,6 +463,6 @@ out_cmp:
out_fs:
fstree_cleanup(&fs);
out_fd:
- close(outfd);
+ outfile->destroy(outfile);
return status;
}