diff options
author | Timo Teräs <timo.teras@iki.fi> | 2023-09-11 13:19:58 +0300 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2023-10-15 16:39:10 +0000 |
commit | 3bf521ba06711394d6ac8a12e5e55b452a7e5107 (patch) | |
tree | 558445abff446e9107945e1a94065700561bb336 | |
parent | c5d8d286f6920542a73232d503d92e9a82b7be58 (diff) | |
download | apk-tools-3bf521ba06711394d6ac8a12e5e55b452a7e5107.tar.gz apk-tools-3bf521ba06711394d6ac8a12e5e55b452a7e5107.tar.bz2 apk-tools-3bf521ba06711394d6ac8a12e5e55b452a7e5107.tar.xz apk-tools-3bf521ba06711394d6ac8a12e5e55b452a7e5107.zip |
adb: add support for 64-bit integers
-rw-r--r-- | src/adb.c | 25 | ||||
-rw-r--r-- | src/adb.h | 8 | ||||
-rw-r--r-- | src/apk_adb.c | 9 | ||||
-rw-r--r-- | src/app_mkpkg.c | 2 |
4 files changed, 28 insertions, 16 deletions
@@ -354,9 +354,10 @@ adb_val_t adb_r_root(const struct adb *db) return ((struct adb_hdr*)db->adb.ptr)->root; } -uint32_t adb_r_int(const struct adb *db, adb_val_t v) +uint64_t adb_r_int(const struct adb *db, adb_val_t v) { uint32_t *int4; + uint64_t *int8; switch (ADB_VAL_TYPE(v)) { case ADB_TYPE_INT: @@ -365,6 +366,10 @@ uint32_t adb_r_int(const struct adb *db, adb_val_t v) int4 = adb_r_deref(db, v, 0, sizeof int4); if (!int4) return 0; return le32toh(*int4); + case ADB_TYPE_INT_64: + int8 = adb_r_deref(db, v, 0, sizeof int8); + if (!int8) return 0; + return le64toh(*int8); default: return 0; } @@ -445,7 +450,7 @@ adb_val_t adb_ro_val(const struct adb_obj *o, unsigned i) return o->obj[i]; } -uint32_t adb_ro_int(const struct adb_obj *o, unsigned i) +uint64_t adb_ro_int(const struct adb_obj *o, unsigned i) { return adb_r_int(o->db, adb_ro_val(o, i)); } @@ -702,11 +707,15 @@ static adb_val_t adb_w_blob_raw(struct adb *db, apk_blob_t b) return val; } -adb_val_t adb_w_int(struct adb *db, uint32_t val) +adb_val_t adb_w_int(struct adb *db, uint64_t val) { + if (val >= 0x100000000) { + val = htole64(val); + return ADB_VAL(ADB_TYPE_INT_64, adb_w_data1(db, &val, sizeof val, sizeof val)); + } if (val >= 0x10000000) { - val = htole32(val); - return ADB_VAL(ADB_TYPE_INT_32, adb_w_data1(db, &val, sizeof val, sizeof val)); + uint32_t val32 = htole32(val); + return ADB_VAL(ADB_TYPE_INT_32, adb_w_data1(db, &val32, sizeof val32, sizeof val32)); } return ADB_VAL(ADB_TYPE_INT, val); } @@ -725,6 +734,9 @@ adb_val_t adb_w_copy(struct adb *db, struct adb *srcdb, adb_val_t v) case ADB_TYPE_INT_32: sz = align = sizeof(uint32_t); goto copy; + case ADB_TYPE_INT_64: + sz = align = sizeof(uint64_t); + goto copy; case ADB_TYPE_BLOB_8: ptr = adb_r_deref(srcdb, v, 0, 1); sz = 1UL + *(uint8_t*) ptr; @@ -744,7 +756,6 @@ adb_val_t adb_w_copy(struct adb *db, struct adb *srcdb, adb_val_t v) for (int i = ADBI_FIRST; i < sz; i++) cpy[i] = adb_w_copy(db, srcdb, adb_ro_val(&obj, i)); return ADB_VAL(ADB_VAL_TYPE(v), adb_w_data1(db, cpy, sizeof(adb_val_t[sz]), sizeof(adb_val_t))); } - case ADB_TYPE_INT_64: case ADB_TYPE_BLOB_32: default: return adb_w_error(db, ENOSYS); @@ -910,7 +921,7 @@ adb_val_t adb_wo_val_fromstring(struct adb_obj *o, unsigned i, apk_blob_t val) return o->obj[i] = adb_w_fromstring(o->db, o->schema->fields[i-1].kind, val); } -adb_val_t adb_wo_int(struct adb_obj *o, unsigned i, uint32_t v) +adb_val_t adb_wo_int(struct adb_obj *o, unsigned i, uint64_t v) { return adb_wo_val(o, i, adb_w_int(o->db, v)); } @@ -204,7 +204,7 @@ int adb_w_init_static(struct adb *db, void *buf, size_t bufsz); /* Primitive read */ adb_val_t adb_r_root(const struct adb *); struct adb_obj *adb_r_rootobj(struct adb *a, struct adb_obj *o, const struct adb_object_schema *); -uint32_t adb_r_int(const struct adb *, adb_val_t); +uint64_t adb_r_int(const struct adb *, adb_val_t); apk_blob_t adb_r_blob(const struct adb *, adb_val_t); struct adb_obj *adb_r_obj(struct adb *, adb_val_t, struct adb_obj *o, const struct adb_object_schema *); @@ -214,7 +214,7 @@ static inline uint32_t adb_ra_num(const struct adb_obj *o) { return (o->num ?: 1 const uint8_t *adb_ro_kind(const struct adb_obj *o, unsigned i); adb_val_t adb_ro_val(const struct adb_obj *o, unsigned i); -uint32_t adb_ro_int(const struct adb_obj *o, unsigned i); +uint64_t adb_ro_int(const struct adb_obj *o, unsigned i); apk_blob_t adb_ro_blob(const struct adb_obj *o, unsigned i); struct adb_obj *adb_ro_obj(const struct adb_obj *o, unsigned i, struct adb_obj *); int adb_ro_cmpobj(const struct adb_obj *o1, const struct adb_obj *o2, unsigned mode); @@ -226,7 +226,7 @@ void adb_w_root(struct adb *, adb_val_t); void adb_w_rootobj(struct adb_obj *); adb_val_t adb_w_blob_vec(struct adb *, uint32_t, apk_blob_t *); adb_val_t adb_w_blob(struct adb *, apk_blob_t); -adb_val_t adb_w_int(struct adb *, uint32_t); +adb_val_t adb_w_int(struct adb *, uint64_t); adb_val_t adb_w_copy(struct adb *, struct adb *, adb_val_t); adb_val_t adb_w_adb(struct adb *, struct adb *); adb_val_t adb_w_fromstring(struct adb *, const uint8_t *kind, apk_blob_t); @@ -245,7 +245,7 @@ int adb_wo_fromstring(struct adb_obj *o, apk_blob_t); int adb_wo_copyobj(struct adb_obj *o, struct adb_obj *); adb_val_t adb_wo_val(struct adb_obj *o, unsigned i, adb_val_t); adb_val_t adb_wo_val_fromstring(struct adb_obj *o, unsigned i, apk_blob_t); -adb_val_t adb_wo_int(struct adb_obj *o, unsigned i, uint32_t); +adb_val_t adb_wo_int(struct adb_obj *o, unsigned i, uint64_t); adb_val_t adb_wo_blob(struct adb_obj *o, unsigned i, apk_blob_t); adb_val_t adb_wo_blob_raw(struct adb_obj *o, unsigned i, apk_blob_t); adb_val_t adb_wo_obj(struct adb_obj *o, unsigned i, struct adb_obj *); diff --git a/src/apk_adb.c b/src/apk_adb.c index 60291aa..ed7265f 100644 --- a/src/apk_adb.c +++ b/src/apk_adb.c @@ -1,4 +1,5 @@ #include <errno.h> +#include <inttypes.h> #include "adb.h" #include "apk_adb.h" #include "apk_print.h" @@ -221,7 +222,7 @@ static struct adb_scalar_schema scalar_hexblob = { static apk_blob_t int_tostring(struct adb *db, adb_val_t val, char *buf, size_t bufsz) { - return APK_BLOB_PTR_LEN(buf, snprintf(buf, bufsz, "%u", adb_r_int(db, val))); + return APK_BLOB_PTR_LEN(buf, snprintf(buf, bufsz, "%" PRIu64, adb_r_int(db, val))); } static adb_val_t int_fromstring(struct adb *db, apk_blob_t val) @@ -233,8 +234,8 @@ static adb_val_t int_fromstring(struct adb *db, apk_blob_t val) static int int_compare(struct adb *db1, adb_val_t v1, struct adb *db2, adb_val_t v2) { - uint32_t r1 = adb_r_int(db1, v1); - uint32_t r2 = adb_r_int(db1, v2); + uint64_t r1 = adb_r_int(db1, v1); + uint64_t r2 = adb_r_int(db1, v2); if (r1 < r2) return -1; if (r1 > r2) return 1; return 0; @@ -249,7 +250,7 @@ static struct adb_scalar_schema scalar_int = { static apk_blob_t oct_tostring(struct adb *db, adb_val_t val, char *buf, size_t bufsz) { - return APK_BLOB_PTR_LEN(buf, snprintf(buf, bufsz, "%o", adb_r_int(db, val))); + return APK_BLOB_PTR_LEN(buf, snprintf(buf, bufsz, "%" PRIo64, adb_r_int(db, val))); } static adb_val_t oct_fromstring(struct adb *db, apk_blob_t val) diff --git a/src/app_mkpkg.c b/src/app_mkpkg.c index 8984700..ed885ed 100644 --- a/src/app_mkpkg.c +++ b/src/app_mkpkg.c @@ -423,7 +423,7 @@ static int mkpkg_main(void *pctx, struct apk_ctx *ac, struct apk_string_array *a adb_ro_obj(&files, j, &file); apk_blob_t filename = adb_ro_blob(&file, ADBI_FI_NAME); apk_blob_t target = adb_ro_blob(&file, ADBI_FI_TARGET); - size_t sz = adb_ro_int(&file, ADBI_FI_SIZE); + uint64_t sz = adb_ro_int(&file, ADBI_FI_SIZE); if (!APK_BLOB_IS_NULL(target)) continue; if (!sz) continue; struct adb_data_package hdr = { |