aboutsummaryrefslogtreecommitdiff
path: root/lib/sqfs/serialize_fstree.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqfs/serialize_fstree.c')
-rw-r--r--lib/sqfs/serialize_fstree.c72
1 files changed, 15 insertions, 57 deletions
diff --git a/lib/sqfs/serialize_fstree.c b/lib/sqfs/serialize_fstree.c
index f3e7bba..d786244 100644
--- a/lib/sqfs/serialize_fstree.c
+++ b/lib/sqfs/serialize_fstree.c
@@ -10,42 +10,31 @@ int sqfs_serialize_fstree(int outfd, sqfs_super_t *super, fstree_t *fs,
compressor_t *cmp, id_table_t *idtbl)
{
meta_writer_t *im, *dm;
- uint8_t buffer[1024];
uint32_t offset;
uint64_t block;
- size_t i, diff;
- ssize_t ret;
- FILE *tmp;
- int tmpfd;
-
- tmp = tmpfile();
- if (tmp == NULL) {
- perror("tmpfile");
- return -1;
- }
-
- tmpfd = fileno(tmp);
+ int ret = -1;
+ size_t i;
im = meta_writer_create(outfd, cmp, false);
if (im == NULL)
- goto fail_tmp;
+ return -1;
- dm = meta_writer_create(tmpfd, cmp, false);
+ dm = meta_writer_create(outfd, cmp, true);
if (dm == NULL)
- goto fail_im;
+ goto out_im;
for (i = 2; i < fs->inode_tbl_size; ++i) {
if (meta_writer_write_inode(fs, idtbl, im, dm,
fs->inode_table[i])) {
- goto fail;
+ goto out;
}
}
if (meta_writer_flush(im))
- goto fail;
+ goto out;
if (meta_writer_flush(dm))
- goto fail;
+ goto out;
super->root_inode_ref = fs->root->inode_ref;
@@ -53,48 +42,17 @@ int sqfs_serialize_fstree(int outfd, sqfs_super_t *super, fstree_t *fs,
super->inode_table_start = super->bytes_used;
super->bytes_used += block;
- super->directory_table_start = super->bytes_used;
meta_writer_get_position(dm, &block, &offset);
+ super->directory_table_start = super->bytes_used;
super->bytes_used += block;
- if (lseek(tmpfd, 0, SEEK_SET) == (off_t)-1) {
- perror("rewind on directory temp file");
- goto fail;
- }
-
- for (;;) {
- ret = read_retry(tmpfd, buffer, sizeof(buffer));
+ if (meta_write_write_to_file(dm))
+ goto out;
- if (ret < 0) {
- perror("read from temp file");
- goto fail;
- }
- if (ret == 0)
- break;
-
- diff = ret;
- ret = write_retry(outfd, buffer, diff);
-
- if (ret < 0) {
- perror("write to image file");
- goto fail;
- }
- if ((size_t)ret < diff) {
- fputs("copying meta data to image file: "
- "truncated write\n", stderr);
- goto fail;
- }
- }
-
- meta_writer_destroy(dm);
- meta_writer_destroy(im);
- fclose(tmp);
- return 0;
-fail:
+ ret = 0;
+out:
meta_writer_destroy(dm);
-fail_im:
+out_im:
meta_writer_destroy(im);
-fail_tmp:
- fclose(tmp);
- return -1;
+ return ret;
}