summaryrefslogtreecommitdiffstats
path: root/src/opk.c
diff options
context:
space:
mode:
authorPatrick McDermott <patrick.mcdermott@libiquity.com>2023-04-19 11:17:35 (EDT)
committer Patrick McDermott <patrick.mcdermott@libiquity.com>2023-04-19 11:25:26 (EDT)
commit2901b2c9c6389235932be187607c398ef20cb79a (patch)
tree7776b9f76fd1bddb17501e06b22bbdd8ee2ed7dc /src/opk.c
parentc91c1fa46dfc773090489f1802e4470a007b2cf7 (diff)
opk: Automatically initialize inner gzip and ustar
Simplifies interface to main().
Diffstat (limited to 'src/opk.c')
-rw-r--r--src/opk.c38
1 files changed, 27 insertions, 11 deletions
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);