summaryrefslogtreecommitdiffstats
path: root/src
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
parentc91c1fa46dfc773090489f1802e4470a007b2cf7 (diff)
opk: Automatically initialize inner gzip and ustar
Simplifies interface to main().
Diffstat (limited to 'src')
-rw-r--r--src/main.c20
-rw-r--r--src/opk.c38
-rw-r--r--src/opk.h35
3 files changed, 36 insertions, 57 deletions
diff --git a/src/main.c b/src/main.c
index 7b18541..1201330 100644
--- a/src/main.c
+++ b/src/main.c
@@ -39,37 +39,27 @@ main(int argc, char *argv[])
}
/* Initialize outer archive. */
- opk = opkg_opk_opk_init_outer(argv[1]);
+ opk = opkg_opk_opk_init(argv[1]);
if (opk == NULL) {
goto error0;
}
/* Read control file. */
- if (opkg_opk_opk_init_inner(opk, "control.tar.gz") != OPKG_OPK_OK) {
- goto error1;
- }
if (opkg_opk_opk_read_control(opk, control_files) != OPKG_OPK_OK) {
- goto error2;
+ goto error1;
}
- opkg_opk_opk_free_inner(opk);
/* List data files. */
- if (opkg_opk_opk_init_inner(opk, "data.tar.gz") != OPKG_OPK_OK) {
- goto error1;
- }
if (opkg_opk_opk_list_members(opk) != OPKG_OPK_OK) {
- goto error2;
+ goto error1;
}
- opkg_opk_opk_free_inner(opk);
- opkg_opk_opk_free_outer(opk);
+ opkg_opk_opk_free(opk);
opkg_opk_ustar_free_seek_names(control_files);
return EXIT_SUCCESS;
- error2:
- opkg_opk_opk_free_inner(opk);
error1:
- opkg_opk_opk_free_outer(opk);
+ opkg_opk_opk_free(opk);
error0:
opkg_opk_ustar_free_seek_names(control_files);
return EXIT_FAILURE;
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);
diff --git a/src/opk.h b/src/opk.h
index 8a8cc54..0677071 100644
--- a/src/opk.h
+++ b/src/opk.h
@@ -29,28 +29,11 @@ struct opkg_opk_opk;
* Parameters:
* - file_name: Package's file name.
* Returns:
- * - Allocated package structure on success. Free with
- * opkg_opk_opk_free_outer().
+ * - Allocated package structure on success. Free with opkg_opk_opk_free().
* - NULL on memory exhaustion.
*/
struct opkg_opk_opk *
-opkg_opk_opk_init_outer(const char *file_name);
-
-/*
- * Initializes an inner archive of a package. Free with
- * opkg_opk_opk_free_outer(). May be called again after freeing.
- * Parameters:
- * - opk: Package structure.
- * - member: Name of member file to find and prepare to read. Should be either
- * "control.tar.gz" or "data.tar.gz", in that order if both are to be read.
- * Returns:
- * - OPKG_OPK_OK if the inner archive is found and initialized.
- * - OPKG_OPK_ERROR if no matching member is found or on decompression error,
- * premature end of gzip stream, an invalid header, unsupported file type, or
- * memory exhaustion.
- */
-int
-opkg_opk_opk_init_inner(struct opkg_opk_opk *opk, const char *member);
+opkg_opk_opk_init(const char *file_name);
/*
* Reads and prints all specified control files.
@@ -81,21 +64,11 @@ int
opkg_opk_opk_list_members(struct opkg_opk_opk *opk);
/*
- * Frees a package structure's inner archive. Call before
- * opkg_opk_opk_free_outer() if a opkg_opk_opk_init_inner() call succeeds.
- * Parameters:
- * - opk: Package structure.
- */
-void
-opkg_opk_opk_free_inner(struct opkg_opk_opk *opk);
-
-/*
- * Frees a package structure. Call opkg_opk_opk_free_inner() first after a
- * successful opkg_opk_opk_init_inner() call.
+ * Frees a package structure.
* Parameters:
* - opk: Package structure.
*/
void
-opkg_opk_opk_free_outer(struct opkg_opk_opk *opk);
+opkg_opk_opk_free(struct opkg_opk_opk *opk);
#endif /* OPKG_OPK_OPK_H_ */