summaryrefslogtreecommitdiff
path: root/src/adb.h
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2021-07-16 19:01:41 +0300
committerTimo Teräs <timo.teras@iki.fi>2021-07-22 15:30:08 +0300
commit3b00c0dc808f4b6c3809c91a67709ca2d7bf8865 (patch)
tree2700fe81689ae7210516196b8db58cf987536fba /src/adb.h
parent69bcdd23b94dab9e0ef67bd480e7f875b06dc71d (diff)
downloadapk-tools-3b00c0dc808f4b6c3809c91a67709ca2d7bf8865.tar.gz
apk-tools-3b00c0dc808f4b6c3809c91a67709ca2d7bf8865.tar.bz2
apk-tools-3b00c0dc808f4b6c3809c91a67709ca2d7bf8865.tar.xz
apk-tools-3b00c0dc808f4b6c3809c91a67709ca2d7bf8865.zip
adb: unify various interfaces to adb_m_process
Removes code duplication, and puts important checks in one place. Support seamless decompression in adbdump.
Diffstat (limited to 'src/adb.h')
-rw-r--r--src/adb.h32
1 files changed, 11 insertions, 21 deletions
diff --git a/src/adb.h b/src/adb.h
index 9cb73b4..fd5462b 100644
--- a/src/adb.h
+++ b/src/adb.h
@@ -44,6 +44,7 @@ typedef uint32_t adb_val_t;
/* File Header */
#define ADB_FORMAT_MAGIC 0x2e424441 // ADB.
+#define ADB_SCHEMA_IMPLIED 0x80000000
struct adb_header {
uint32_t magic;
@@ -52,7 +53,6 @@ struct adb_header {
/* Blocks */
#define ADB_BLOCK_ALIGNMENT 8
-#define ADB_BLOCK_END -1
#define ADB_BLOCK_ADB 0
#define ADB_BLOCK_SIG 2
#define ADB_BLOCK_DATA 3
@@ -86,12 +86,6 @@ struct adb_sign_v0 {
uint8_t sig[0];
};
-/* Block enumeration */
-struct adb_block *adb_block_first(apk_blob_t b);
-struct adb_block *adb_block_next(struct adb_block *cur, apk_blob_t b);
-#define adb_foreach_block(__blk, __adb) \
- for (__blk = adb_block_first(__adb); !IS_ERR_OR_NULL(__blk); __blk = adb_block_next(__blk, __adb))
-
/* Schema */
#define ADB_KIND_ADB 1
#define ADB_KIND_OBJECT 2
@@ -144,9 +138,11 @@ struct adb_w_bucket {
};
struct adb {
- apk_blob_t mmap, data, adb;
+ struct apk_istream *is;
+ apk_blob_t adb;
struct adb_header hdr;
size_t num_buckets;
+ size_t alloc_len;
struct list_head *bucket;
};
@@ -158,12 +154,15 @@ struct adb_obj {
};
/* Container read interface */
+static inline void adb_init(struct adb *db) { memset(db, 0, sizeof *db); }
int adb_free(struct adb *);
void adb_reset(struct adb *);
int adb_m_blob(struct adb *, apk_blob_t, struct apk_trust *);
-int adb_m_map(struct adb *, int fd, uint32_t expected_schema, struct apk_trust *);
-int adb_m_stream(struct adb *db, struct apk_istream *is, uint32_t expected_schema, struct apk_trust *trust, int (*datacb)(struct adb *, size_t, struct apk_istream *));
+int adb_m_process(struct adb *db, struct apk_istream *is, uint32_t expected_schema, struct apk_trust *trust, int (*cb)(struct adb *, struct adb_block *, struct apk_istream *));
+static inline int adb_m_open(struct adb *db, struct apk_istream *is, uint32_t expected_schema, struct apk_trust *trust) {
+ return adb_m_process(db, is, expected_schema, trust, 0);
+}
#define adb_w_init_alloca(db, schema, num_buckets) adb_w_init_dynamic(db, schema, alloca(sizeof(struct list_head[num_buckets])), num_buckets)
#define adb_w_init_tmp(db, size) adb_w_init_static(db, alloca(size), size)
int adb_w_init_dynamic(struct adb *db, uint32_t schema, void *buckets, size_t num_buckets);
@@ -240,15 +239,6 @@ struct adb_verify_ctx {
int adb_trust_write_signatures(struct apk_trust *trust, struct adb *db, struct adb_verify_ctx *vfy, struct apk_ostream *os);
int adb_trust_verify_signature(struct apk_trust *trust, struct adb *db, struct adb_verify_ctx *vfy, apk_blob_t sigb);
-/* Transform existing file */
-struct adb_xfrm {
- struct apk_istream *is;
- struct apk_ostream *os;
- struct adb db;
- struct adb_verify_ctx vfy;
-};
-int adb_c_xfrm(struct adb_xfrm *, int (*cb)(struct adb_xfrm *, struct adb_block *, struct apk_istream *));
-
/* SAX style event based handling of ADB */
struct adb_db_schema {
@@ -297,8 +287,8 @@ struct adb_walk_genadb {
adb_val_t vals[ADB_WALK_GENADB_MAX_VALUES];
};
-int adb_walk_adb(struct adb_walk *d, struct adb *db, struct apk_trust *trust);
-int adb_walk_istream(struct adb_walk *d, struct apk_istream *is);
+int adb_walk_adb(struct adb_walk *d, struct apk_istream *is, struct apk_trust *trust);
+int adb_walk_text(struct adb_walk *d, struct apk_istream *is);
// Seamless compression support