From 2901b2c9c6389235932be187607c398ef20cb79a Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Wed, 19 Apr 2023 11:17:35 -0400 Subject: opk: Automatically initialize inner gzip and ustar Simplifies interface to main(). --- (limited to 'src/opk.c') diff --git a/src/opk.c b/src/opk.c index 7cd283d..578f85b 100644 --- a/src/opk.c +++ b/src/opk.c @@ -57,7 +57,7 @@ _opkg_opk_opk_file_read(void *user_data, char **buffer, size_t *size) } struct opkg_opk_opk * -opkg_opk_opk_init_outer(const char *file_name) +opkg_opk_opk_init(const char *file_name) { struct opkg_opk_opk *opk; @@ -124,8 +124,8 @@ opkg_opk_opk_init_outer(const char *file_name) return NULL; } -int -opkg_opk_opk_init_inner(struct opkg_opk_opk *opk, const char *member) +static int +_opkg_opk_opk_init_inner(struct opkg_opk_opk *opk, const char *member) { int ret; @@ -164,6 +164,13 @@ opkg_opk_opk_init_inner(struct opkg_opk_opk *opk, const char *member) return OPKG_OPK_OK; } +static void +_opkg_opk_opk_free_inner(struct opkg_opk_opk *opk) +{ + opkg_opk_ustar_free(opk->inner_ustar); + opkg_opk_gzip_free(opk->inner_gzip); +} + int opkg_opk_opk_read_control(struct opkg_opk_opk *opk, struct opkg_opk_ustar_seek_name *names) @@ -173,6 +180,10 @@ opkg_opk_opk_read_control(struct opkg_opk_opk *opk, int ret_seek; int ret_read; + if (_opkg_opk_opk_init_inner(opk, "control.tar.gz") != OPKG_OPK_OK) { + return OPKG_OPK_ERROR; + } + while ((ret_seek = opkg_opk_ustar_seek(opk->inner_ustar, names)) != OPKG_OPK_ERROR) { if (opk->previously_printed == 1) { @@ -184,11 +195,13 @@ opkg_opk_opk_read_control(struct opkg_opk_opk *opk, if (fwrite(buffer, 1, size, stdout) != size) { fputs("Error: Failed to print control file\n", stderr); + _opkg_opk_opk_free_inner(opk); return OPKG_OPK_ERROR; } } if (ret_read == OPKG_OPK_ERROR) { fputs("Error: Failed to read control file\n", stderr); + _opkg_opk_opk_free_inner(opk); return OPKG_OPK_ERROR; } opk->previously_printed = 1; @@ -198,9 +211,12 @@ opkg_opk_opk_read_control(struct opkg_opk_opk *opk, } if (ret_seek == OPKG_OPK_ERROR) { fputs("Error: Failed to find control file\n", stderr); + _opkg_opk_opk_free_inner(opk); return OPKG_OPK_ERROR; } + _opkg_opk_opk_free_inner(opk); + return OPKG_OPK_OK; } @@ -227,6 +243,10 @@ opkg_opk_opk_list_members(struct opkg_opk_opk *opk) puts(""); } + if (_opkg_opk_opk_init_inner(opk, "data.tar.gz") != OPKG_OPK_OK) { + return OPKG_OPK_ERROR; + } + /* Build singly-linked list and find maximum column widths. */ head = NULL; uname_len_max = 0; @@ -254,6 +274,7 @@ opkg_opk_opk_list_members(struct opkg_opk_opk *opk) } if (ret == OPKG_OPK_ERROR) { fputs("Error: Failed to list data files\n", stderr); + _opkg_opk_opk_free_inner(opk); return OPKG_OPK_ERROR; } tail->next = NULL; @@ -293,18 +314,13 @@ opkg_opk_opk_list_members(struct opkg_opk_opk *opk) opk->previously_printed = 1; - return ret; -} + _opkg_opk_opk_free_inner(opk); -void -opkg_opk_opk_free_inner(struct opkg_opk_opk *opk) -{ - opkg_opk_ustar_free(opk->inner_ustar); - opkg_opk_gzip_free(opk->inner_gzip); + return ret; } void -opkg_opk_opk_free_outer(struct opkg_opk_opk *opk) +opkg_opk_opk_free(struct opkg_opk_opk *opk) { opkg_opk_ustar_free(opk->outer_ustar); opkg_opk_gzip_free(opk->outer_gzip); -- cgit v0.9.1