From b65c075d13990383f30b27aeafacdd4575fafdee Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Tue, 18 Apr 2023 16:41:42 -0400 Subject: ustar: Use linked list instead of varargs in seek Also indicate when all sought member files are found. --- (limited to 'src/opk.c') diff --git a/src/opk.c b/src/opk.c index ce24e55..82aaca3 100644 --- a/src/opk.c +++ b/src/opk.c @@ -59,7 +59,8 @@ _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) { - struct opkg_opk_opk *opk; + struct opkg_opk_opk *opk; + struct opkg_opk_ustar_seek_name seek_name; opk = malloc(sizeof(*opk)); if (opk == NULL) { @@ -89,8 +90,10 @@ opkg_opk_opk_init_outer(const char *file_name) } /* Check package version. */ - if (opkg_opk_ustar_seek(opk->outer_ustar, 1, "debian-binary") != - OPKG_OPK_OK) { + seek_name.name = "debian-binary"; + seek_name.next = NULL; + if (opkg_opk_ustar_seek(opk->outer_ustar, &seek_name) == OPKG_OPK_ERROR) + { fputs("Error: Failed to find \"debian-binary\" in archive\n", stderr); goto error3; @@ -125,7 +128,8 @@ opkg_opk_opk_init_outer(const char *file_name) int opkg_opk_opk_init_inner(struct opkg_opk_opk *opk, const char *member) { - int ret; + int ret; + struct opkg_opk_ustar_seek_name seek_name; /* Finish reading previous inner archive, if any. */ while ((ret = opkg_opk_ustar_read(opk->outer_ustar, NULL, NULL)) == @@ -136,8 +140,11 @@ opkg_opk_opk_init_inner(struct opkg_opk_opk *opk, const char *member) } /* Find requested inner archive. */ - if (opkg_opk_ustar_seek(opk->outer_ustar, 1, member) != - OPKG_OPK_OK) { + seek_name.name = member; + seek_name.found = 0; + seek_name.next = NULL; + if (opkg_opk_ustar_seek(opk->outer_ustar, &seek_name) == OPKG_OPK_ERROR) + { fprintf(stderr, "Error: Failed to find \"%s\" in archive\n", member); return OPKG_OPK_ERROR; @@ -164,7 +171,8 @@ opkg_opk_opk_init_inner(struct opkg_opk_opk *opk, const char *member) } int -opkg_opk_opk_read_control(struct opkg_opk_opk *opk) +opkg_opk_opk_read_control(struct opkg_opk_opk *opk, + struct opkg_opk_ustar_seek_name *names) { char *buffer; size_t size; @@ -174,8 +182,7 @@ opkg_opk_opk_read_control(struct opkg_opk_opk *opk) puts(""); } - if (opkg_opk_ustar_seek(opk->inner_ustar, 2, "control", "./control") != - OPKG_OPK_OK) { + if (opkg_opk_ustar_seek(opk->inner_ustar, names) == OPKG_OPK_ERROR) { fputs("Error: Failed to find control file\n", stderr); return OPKG_OPK_ERROR; } -- cgit v0.9.1