mirror of
https://github.com/pygos/pkg-utils.git
synced 2024-11-21 20:39:46 +01:00
pkg2sqfs: implement meta data compression
Signed-off-by: David Oberhollenzer <goliath@infraroot.at>
This commit is contained in:
parent
f80e4e8d29
commit
e123eaf433
5 changed files with 35 additions and 25 deletions
|
@ -208,7 +208,7 @@ out_file_blocks:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sqfs_write_inodes(sqfs_info_t *info)
|
int sqfs_write_inodes(sqfs_info_t *info, compressor_stream_t *strm)
|
||||||
{
|
{
|
||||||
meta_writer_t *im, *dm;
|
meta_writer_t *im, *dm;
|
||||||
size_t i, diff;
|
size_t i, diff;
|
||||||
|
@ -224,11 +224,11 @@ int sqfs_write_inodes(sqfs_info_t *info)
|
||||||
|
|
||||||
tmpfd = fileno(tmp);
|
tmpfd = fileno(tmp);
|
||||||
|
|
||||||
im = meta_writer_create(info->outfd);
|
im = meta_writer_create(info->outfd, strm);
|
||||||
if (im == NULL)
|
if (im == NULL)
|
||||||
goto fail_tmp;
|
goto fail_tmp;
|
||||||
|
|
||||||
dm = meta_writer_create(tmpfd);
|
dm = meta_writer_create(tmpfd, strm);
|
||||||
if (dm == NULL)
|
if (dm == NULL)
|
||||||
goto fail_im;
|
goto fail_im;
|
||||||
|
|
||||||
|
@ -280,8 +280,6 @@ int sqfs_write_inodes(sqfs_info_t *info)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info->super.flags |= SQFS_FLAG_UNCOMPRESSED_INODES;
|
|
||||||
|
|
||||||
meta_writer_destroy(dm);
|
meta_writer_destroy(dm);
|
||||||
meta_writer_destroy(im);
|
meta_writer_destroy(im);
|
||||||
fclose(tmp);
|
fclose(tmp);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* SPDX-License-Identifier: ISC */
|
/* SPDX-License-Identifier: ISC */
|
||||||
#include "pkg2sqfs.h"
|
#include "pkg2sqfs.h"
|
||||||
|
|
||||||
meta_writer_t *meta_writer_create(int fd)
|
meta_writer_t *meta_writer_create(int fd, compressor_stream_t *strm)
|
||||||
{
|
{
|
||||||
meta_writer_t *m = calloc(1, sizeof(*m));
|
meta_writer_t *m = calloc(1, sizeof(*m));
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ meta_writer_t *meta_writer_create(int fd)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m->strm = strm;
|
||||||
m->outfd = fd;
|
m->outfd = fd;
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
@ -23,13 +24,22 @@ int meta_writer_flush(meta_writer_t *m)
|
||||||
{
|
{
|
||||||
ssize_t ret, count;
|
ssize_t ret, count;
|
||||||
|
|
||||||
/* TODO: compress buffer */
|
|
||||||
|
|
||||||
if (m->offset == 0)
|
if (m->offset == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
((uint16_t *)m->data)[0] = htole16(m->offset | 0x8000);
|
ret = m->strm->do_block(m->strm, m->data + 2, m->scratch,
|
||||||
count = m->offset + 2;
|
m->offset, sizeof(m->scratch));
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (ret > 0 && (size_t)ret < m->offset) {
|
||||||
|
memcpy(m->data + 2, m->scratch, ret);
|
||||||
|
((uint16_t *)m->data)[0] = htole16(ret);
|
||||||
|
count = ret + 2;
|
||||||
|
} else {
|
||||||
|
((uint16_t *)m->data)[0] = htole16(m->offset | 0x8000);
|
||||||
|
count = m->offset + 2;
|
||||||
|
}
|
||||||
|
|
||||||
ret = write_retry(m->outfd, m->data, count);
|
ret = write_retry(m->outfd, m->data, count);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
|
@ -284,13 +284,13 @@ int main(int argc, char **argv)
|
||||||
free(info.block);
|
free(info.block);
|
||||||
info.block = NULL;
|
info.block = NULL;
|
||||||
|
|
||||||
if (sqfs_write_inodes(&info))
|
if (sqfs_write_inodes(&info, cmp))
|
||||||
goto out_fragments;
|
goto out_fragments;
|
||||||
|
|
||||||
if (sqfs_write_fragment_table(&info))
|
if (sqfs_write_fragment_table(&info, cmp))
|
||||||
goto out_fragments;
|
goto out_fragments;
|
||||||
|
|
||||||
if (sqfs_write_ids(&info))
|
if (sqfs_write_ids(&info, cmp))
|
||||||
goto out_fragments;
|
goto out_fragments;
|
||||||
|
|
||||||
if (sqfs_super_write(&info))
|
if (sqfs_super_write(&info))
|
||||||
|
|
|
@ -30,9 +30,11 @@
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t data[SQFS_META_BLOCK_SIZE + 2];
|
uint8_t data[SQFS_META_BLOCK_SIZE + 2];
|
||||||
|
uint8_t scratch[SQFS_META_BLOCK_SIZE];
|
||||||
size_t offset;
|
size_t offset;
|
||||||
size_t written;
|
size_t written;
|
||||||
int outfd;
|
int outfd;
|
||||||
|
compressor_stream_t *strm;
|
||||||
} meta_writer_t;
|
} meta_writer_t;
|
||||||
|
|
||||||
typedef struct file_info_t {
|
typedef struct file_info_t {
|
||||||
|
@ -121,13 +123,13 @@ void destroy_vfs_tree(vfs_t *fs);
|
||||||
|
|
||||||
node_t *vfs_node_from_file_id(vfs_t *fs, uint32_t id);
|
node_t *vfs_node_from_file_id(vfs_t *fs, uint32_t id);
|
||||||
|
|
||||||
int sqfs_write_inodes(sqfs_info_t *info);
|
int sqfs_write_inodes(sqfs_info_t *info, compressor_stream_t *strm);
|
||||||
|
|
||||||
int sqfs_write_ids(sqfs_info_t *info);
|
int sqfs_write_ids(sqfs_info_t *info, compressor_stream_t *strm);
|
||||||
|
|
||||||
int sqfs_write_fragment_table(sqfs_info_t *info);
|
int sqfs_write_fragment_table(sqfs_info_t *info, compressor_stream_t *strm);
|
||||||
|
|
||||||
meta_writer_t *meta_writer_create(int fd);
|
meta_writer_t *meta_writer_create(int fd, compressor_stream_t *strm);
|
||||||
|
|
||||||
void meta_writer_destroy(meta_writer_t *m);
|
void meta_writer_destroy(meta_writer_t *m);
|
||||||
|
|
||||||
|
|
16
sqfs/table.c
16
sqfs/table.c
|
@ -2,7 +2,8 @@
|
||||||
#include "pkg2sqfs.h"
|
#include "pkg2sqfs.h"
|
||||||
|
|
||||||
static int sqfs_write_table(sqfs_info_t *info, const void *data,
|
static int sqfs_write_table(sqfs_info_t *info, const void *data,
|
||||||
size_t entsize, size_t count, uint64_t *startblock)
|
size_t entsize, size_t count, uint64_t *startblock,
|
||||||
|
compressor_stream_t *strm)
|
||||||
{
|
{
|
||||||
size_t ent_per_blocks = SQFS_META_BLOCK_SIZE / entsize;
|
size_t ent_per_blocks = SQFS_META_BLOCK_SIZE / entsize;
|
||||||
uint64_t blocks[count / ent_per_blocks + 1];
|
uint64_t blocks[count / ent_per_blocks + 1];
|
||||||
|
@ -12,7 +13,7 @@ static int sqfs_write_table(sqfs_info_t *info, const void *data,
|
||||||
|
|
||||||
/* Write actual data. Whenever we cross a block boundary, remember
|
/* Write actual data. Whenever we cross a block boundary, remember
|
||||||
the block start offset */
|
the block start offset */
|
||||||
m = meta_writer_create(info->outfd);
|
m = meta_writer_create(info->outfd, strm);
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -57,21 +58,20 @@ fail:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sqfs_write_fragment_table(sqfs_info_t *info)
|
int sqfs_write_fragment_table(sqfs_info_t *info, compressor_stream_t *strm)
|
||||||
{
|
{
|
||||||
info->super.fragment_entry_count = info->num_fragments;
|
info->super.fragment_entry_count = info->num_fragments;
|
||||||
|
|
||||||
return sqfs_write_table(info, info->fragments,
|
return sqfs_write_table(info, info->fragments,
|
||||||
sizeof(info->fragments[0]),
|
sizeof(info->fragments[0]),
|
||||||
info->num_fragments,
|
info->num_fragments,
|
||||||
&info->super.fragment_table_start);
|
&info->super.fragment_table_start, strm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sqfs_write_ids(sqfs_info_t *info)
|
int sqfs_write_ids(sqfs_info_t *info, compressor_stream_t *strm)
|
||||||
{
|
{
|
||||||
info->super.flags |= SQFS_FLAG_UNCOMPRESSED_IDS;
|
|
||||||
|
|
||||||
return sqfs_write_table(info, info->fs.id_tbl,
|
return sqfs_write_table(info, info->fs.id_tbl,
|
||||||
sizeof(info->fs.id_tbl[0]),
|
sizeof(info->fs.id_tbl[0]),
|
||||||
info->fs.num_ids, &info->super.id_table_start);
|
info->fs.num_ids,
|
||||||
|
&info->super.id_table_start, strm);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue