diff options
author | Patrick 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) |
commit | 2901b2c9c6389235932be187607c398ef20cb79a (patch) | |
tree | 7776b9f76fd1bddb17501e06b22bbdd8ee2ed7dc | |
parent | c91c1fa46dfc773090489f1802e4470a007b2cf7 (diff) |
opk: Automatically initialize inner gzip and ustar
Simplifies interface to main().
-rw-r--r-- | src/main.c | 20 | ||||
-rw-r--r-- | src/opk.c | 38 | ||||
-rw-r--r-- | src/opk.h | 35 |
3 files changed, 36 insertions, 57 deletions
@@ -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; @@ -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); @@ -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_ */ |