libropkg: convert pkg writer to use bluelib compression streams
This commit is contained in:
@@ -1,31 +1,12 @@
|
||||
#include <ropkg/compress.h>
|
||||
#include <ropkg/stream.h>
|
||||
#include "tar.h"
|
||||
|
||||
#include <blue/compress/cstream.h>
|
||||
#include <ropkg/writer.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
struct ustar_header {
|
||||
char tar_filename[100];
|
||||
char tar_mode[8];
|
||||
char tar_uid[8];
|
||||
char tar_gid[8];
|
||||
char tar_filesize[12];
|
||||
char tar_mtime[12];
|
||||
char tar_checksum[8];
|
||||
char tar_type[1];
|
||||
char tar_linkname[100];
|
||||
char tar_ustar_id[6];
|
||||
char tar_ustar_version[2];
|
||||
char tar_owner_name[32];
|
||||
char tar_owner_group[32];
|
||||
char tar_dev_major[8];
|
||||
char tar_dev_minor[8];
|
||||
char tar_filename_prefix[155];
|
||||
char tar_padding[12];
|
||||
};
|
||||
|
||||
struct ropkg_writer {
|
||||
struct ropkg_stream *w_fp;
|
||||
b_cstream *w_fp;
|
||||
|
||||
struct ustar_header w_file_header;
|
||||
size_t w_file_header_offset;
|
||||
@@ -34,9 +15,7 @@ struct ropkg_writer {
|
||||
|
||||
static const char zero_padding[512] = {0};
|
||||
|
||||
enum ropkg_status ropkg_writer_open(
|
||||
struct ropkg_stream *fp,
|
||||
struct ropkg_writer **out)
|
||||
enum ropkg_status ropkg_writer_open(b_cstream *fp, struct ropkg_writer **out)
|
||||
{
|
||||
struct ropkg_writer *writer = malloc(sizeof *writer);
|
||||
if (!writer) {
|
||||
@@ -56,24 +35,24 @@ enum ropkg_status ropkg_writer_close(struct ropkg_writer *pkg)
|
||||
memset(&pkg->w_file_header, 0x0, sizeof pkg->w_file_header);
|
||||
|
||||
size_t nr_written;
|
||||
enum ropkg_status status = ropkg_stream_write(
|
||||
b_status status = b_cstream_write(
|
||||
pkg->w_fp,
|
||||
&pkg->w_file_header,
|
||||
sizeof pkg->w_file_header,
|
||||
&nr_written);
|
||||
|
||||
if (status != ROPKG_SUCCESS) {
|
||||
return status;
|
||||
if (!B_OK(status)) {
|
||||
return ROPKG_ERR_IO_FAILURE;
|
||||
}
|
||||
|
||||
status = ropkg_stream_write(
|
||||
status = b_cstream_write(
|
||||
pkg->w_fp,
|
||||
&pkg->w_file_header,
|
||||
sizeof pkg->w_file_header,
|
||||
&nr_written);
|
||||
|
||||
if (status != ROPKG_SUCCESS) {
|
||||
return status;
|
||||
if (!B_OK(status)) {
|
||||
return ROPKG_ERR_IO_FAILURE;
|
||||
}
|
||||
|
||||
if (nr_written != sizeof pkg->w_file_header) {
|
||||
@@ -129,12 +108,12 @@ enum ropkg_status ropkg_writer_begin_file(
|
||||
const char *path,
|
||||
const struct ropkg_writer_file_info *info)
|
||||
{
|
||||
if (ropkg_stream_is_in_compressed_section(pkg->w_fp)) {
|
||||
pkg->w_file_header_offset
|
||||
= ropkg_stream_get_nr_written_uncompressed(pkg->w_fp);
|
||||
if (b_cstream_in_compressed_section(pkg->w_fp)) {
|
||||
b_cstream_tx_bytes_uncompressed(
|
||||
pkg->w_fp,
|
||||
&pkg->w_file_header_offset);
|
||||
} else {
|
||||
pkg->w_file_header_offset
|
||||
= ropkg_stream_get_nr_written(pkg->w_fp);
|
||||
b_cstream_tx_bytes(pkg->w_fp, &pkg->w_file_header_offset);
|
||||
}
|
||||
|
||||
enum ropkg_status status
|
||||
@@ -144,14 +123,14 @@ enum ropkg_status ropkg_writer_begin_file(
|
||||
}
|
||||
|
||||
size_t nr_written;
|
||||
status = ropkg_stream_write(
|
||||
b_status status2 = b_cstream_write(
|
||||
pkg->w_fp,
|
||||
&pkg->w_file_header,
|
||||
sizeof pkg->w_file_header,
|
||||
&nr_written);
|
||||
|
||||
if (status != ROPKG_SUCCESS) {
|
||||
return status;
|
||||
if (!B_OK(status2)) {
|
||||
return ROPKG_ERR_IO_FAILURE;
|
||||
}
|
||||
|
||||
if (nr_written != sizeof pkg->w_file_header) {
|
||||
@@ -163,26 +142,26 @@ enum ropkg_status ropkg_writer_begin_file(
|
||||
|
||||
enum ropkg_status ropkg_writer_end_file(struct ropkg_writer *pkg)
|
||||
{
|
||||
enum ropkg_status status;
|
||||
b_status status;
|
||||
size_t written, file_length, pos;
|
||||
if (ropkg_stream_is_in_compressed_section(pkg->w_fp)) {
|
||||
pos = ropkg_stream_get_nr_written_uncompressed(pkg->w_fp);
|
||||
if (b_cstream_in_compressed_section(pkg->w_fp)) {
|
||||
b_cstream_tx_bytes_uncompressed(pkg->w_fp, &pos);
|
||||
} else {
|
||||
pos = ropkg_stream_get_nr_written(pkg->w_fp);
|
||||
b_cstream_tx_bytes(pkg->w_fp, &pos);
|
||||
}
|
||||
|
||||
file_length
|
||||
= pos - pkg->w_file_header_offset - sizeof pkg->w_file_header;
|
||||
|
||||
size_t required_padding = 512 - (file_length % 512);
|
||||
status = ropkg_stream_write(
|
||||
status = b_cstream_write(
|
||||
pkg->w_fp,
|
||||
zero_padding,
|
||||
required_padding,
|
||||
&written);
|
||||
|
||||
if (status != ROPKG_SUCCESS) {
|
||||
return status;
|
||||
if (!B_OK(status)) {
|
||||
return ROPKG_ERR_IO_FAILURE;
|
||||
}
|
||||
|
||||
to_octal(
|
||||
@@ -191,16 +170,16 @@ enum ropkg_status ropkg_writer_end_file(struct ropkg_writer *pkg)
|
||||
sizeof pkg->w_file_header.tar_filesize);
|
||||
refresh_header_checksum(&pkg->w_file_header);
|
||||
|
||||
status = ropkg_stream_set_cursor_position(
|
||||
status = b_cstream_set_cursor_position(
|
||||
pkg->w_fp,
|
||||
pkg->w_file_header_offset);
|
||||
if (status == ROPKG_SUCCESS) {
|
||||
ropkg_stream_write(
|
||||
if (B_OK(status)) {
|
||||
b_cstream_write(
|
||||
pkg->w_fp,
|
||||
&pkg->w_file_header,
|
||||
sizeof pkg->w_file_header,
|
||||
&written);
|
||||
ropkg_stream_restore_cursor_position(pkg->w_fp);
|
||||
b_cstream_restore_cursor_position(pkg->w_fp);
|
||||
}
|
||||
|
||||
return ROPKG_SUCCESS;
|
||||
@@ -212,10 +191,9 @@ enum ropkg_status ropkg_writer_write(
|
||||
size_t len,
|
||||
size_t *nr_written)
|
||||
{
|
||||
enum ropkg_status status
|
||||
= ropkg_stream_write(pkg->w_fp, p, len, nr_written);
|
||||
if (status != ROPKG_SUCCESS) {
|
||||
return status;
|
||||
b_status status = b_cstream_write(pkg->w_fp, p, len, nr_written);
|
||||
if (!B_OK(status)) {
|
||||
return ROPKG_ERR_IO_FAILURE;
|
||||
}
|
||||
|
||||
pkg->w_file_nr_written += len;
|
||||
|
||||
Reference in New Issue
Block a user