extract: pass root object instead of database

cute-signatures
Timo Teräs 2021-09-03 13:44:48 +03:00
parent bd15683670
commit fd42c073bf
5 changed files with 19 additions and 19 deletions

View File

@ -14,7 +14,7 @@
#include "apk_print.h"
#include "apk_io.h"
struct adb;
struct adb_obj;
struct apk_ctx;
struct apk_extract_ctx;
@ -30,8 +30,8 @@ int apk_extract_file(int atfd, const struct apk_file_info *ae,
struct apk_extract_ops {
int (*v2index)(struct apk_extract_ctx *, apk_blob_t *desc, struct apk_istream *is);
int (*v2meta)(struct apk_extract_ctx *, struct apk_istream *is);
int (*v3index)(struct apk_extract_ctx *, struct adb *);
int (*v3meta)(struct apk_extract_ctx *, struct adb *);
int (*v3index)(struct apk_extract_ctx *, struct adb_obj *);
int (*v3meta)(struct apk_extract_ctx *, struct adb_obj *);
int (*script)(struct apk_extract_ctx *, unsigned int script, size_t size, struct apk_istream *is);
int (*file)(struct apk_extract_ctx *, const struct apk_file_info *fi, struct apk_istream *is);
};

View File

@ -133,7 +133,7 @@ static int apk_extract_volume(struct apk_ctx *ac, const struct apk_file_info *fi
return r;
}
static int extract_v3_meta(struct apk_extract_ctx *ectx, struct adb *db)
static int extract_v3_meta(struct apk_extract_ctx *ectx, struct adb_obj *pkg)
{
return 0;
}

View File

@ -87,19 +87,18 @@ static int process_pkg_file(struct apk_extract_ctx *ectx, const struct apk_file_
return 0;
}
static int process_v3_meta(struct apk_extract_ctx *ectx, struct adb *db)
static int process_v3_meta(struct apk_extract_ctx *ectx, struct adb_obj *pkg)
{
struct manifest_file_ctx *mctx = container_of(ectx, struct manifest_file_ctx, ectx);
struct apk_out *out = mctx->out;
struct adb_obj pkg, paths, path, files, file;
struct adb_obj paths, path, files, file;
struct apk_digest digest;
struct apk_pathbuilder pb;
char buf[APK_DIGEST_MAX_LENGTH*2+1];
apk_blob_t hex;
int i, j;
adb_r_rootobj(db, &pkg, &schema_package);
adb_ro_obj(&pkg, ADBI_PKG_PATHS, &paths);
adb_ro_obj(pkg, ADBI_PKG_PATHS, &paths);
for (i = ADBI_FIRST; i <= adb_ra_num(&paths); i++) {
adb_ro_obj(&paths, i, &path);

View File

@ -176,15 +176,13 @@ static int mkndx_parse_v2meta(struct apk_extract_ctx *ectx, struct apk_istream *
return 0;
}
static int mkndx_parse_v3meta(struct apk_extract_ctx *ectx, struct adb *db)
static int mkndx_parse_v3meta(struct apk_extract_ctx *ectx, struct adb_obj *pkg)
{
struct mkndx_ctx *ctx = container_of(ectx, struct mkndx_ctx, ectx);
struct adb_obj obj;
adb_r_rootobj(db, &obj, &schema_package);
struct adb *db = pkg->db;
adb_val_t o = adb_wa_append(&ctx->pkgs,
adb_w_copy(&ctx->db, db, adb_ro_val(&obj, ADBI_PKG_PKGINFO)));
adb_w_copy(&ctx->db, db, adb_ro_val(pkg, ADBI_PKG_PKGINFO)));
if (ADB_IS_ERROR(o)) return -ADB_VAL_VALUE(o);
return 0;
}

View File

@ -120,13 +120,14 @@ static int apk_extract_v3_next_file(struct apk_extract_ctx *ectx)
int r;
if (!ctx->cur_path) {
r = ectx->ops->v3meta(ectx, &ctx->db);
if (r < 0) return r;
// one time init
ctx->cur_path = ADBI_FIRST;
ctx->cur_file = 0;
adb_r_rootobj(&ctx->db, &ctx->pkg, &schema_package);
r = ectx->ops->v3meta(ectx, &ctx->pkg);
if (r < 0) return r;
adb_ro_obj(&ctx->pkg, ADBI_PKG_PATHS, &ctx->paths);
adb_ro_obj(&ctx->paths, ctx->cur_path, &ctx->path);
adb_ro_obj(&ctx->path, ADBI_DI_FILES, &ctx->files);
@ -190,12 +191,12 @@ static int apk_extract_v3_data_block(struct adb *db, struct adb_block *b, struct
return apk_extract_v3_file(ectx, sz, is);
}
static int apk_extract_v3_verify_index(struct apk_extract_ctx *ectx, struct adb *db)
static int apk_extract_v3_verify_index(struct apk_extract_ctx *ectx, struct adb_obj *obj)
{
return 0;
}
static int apk_extract_v3_verify_meta(struct apk_extract_ctx *ectx, struct adb *db)
static int apk_extract_v3_verify_meta(struct apk_extract_ctx *ectx, struct adb_obj *obj)
{
return 0;
}
@ -222,6 +223,7 @@ int apk_extract_v3(struct apk_extract_ctx *ectx, struct apk_istream *is)
struct apk_extract_v3_ctx ctx = {
.ectx = ectx,
};
struct adb_obj obj;
int r;
if (IS_ERR(is)) return PTR_ERR(is);
@ -244,7 +246,8 @@ int apk_extract_v3(struct apk_extract_ctx *ectx, struct apk_istream *is)
r = -APKE_FORMAT_NOT_SUPPORTED;
break;
}
r = ectx->ops->v3index(ectx, &ctx.db);
adb_r_rootobj(&ctx.db, &obj, &schema_index);
r = ectx->ops->v3index(ectx, &obj);
break;
default:
r = -APKE_ADB_SCHEMA;