From 11fc8fe75d3d340f93e675d54e2550d82ab1ab2c Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Fri, 5 Jun 2009 01:17:36 -0400 Subject: [PATCH] Reorganise the upkg structures a bit. --- libupkg.c | 46 +++++++++++++++++++++------------------------- upkg.c | 2 ++ upkg.h | 2 ++ 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/libupkg.c b/libupkg.c index dfc8e0f..617aefa 100644 --- a/libupkg.c +++ b/libupkg.c @@ -4,15 +4,12 @@ #include "upkg.h" #include "pack.h" -struct upkg_table { - size_t offset; - size_t count; -}; struct upkg_private { FILE *f; - struct upkg_table names, exports, imports; + + unsigned long name_offset, export_offset, import_offset; unsigned char guid[16]; }; @@ -31,22 +28,16 @@ static struct upkg *init_upkg(unsigned char hdr[static UPKG_HDR_SIZE]) return NULL; } - pkg->version = unpack_16_le(hdr+4); - pkg->license = unpack_16_le(hdr+6); - pkg->flags = unpack_32_le(hdr+8); + pkg->version = unpack_16_le(hdr+4); + pkg->license = unpack_16_le(hdr+6); + pkg->flags = unpack_32_le(hdr+8); + pkg->name_count = unpack_32_le(hdr+12); + pkg->export_count = unpack_32_le(hdr+20); + pkg->import_count = unpack_32_le(hdr+28); - pkg->priv->names = (struct upkg_table) { - .count = unpack_32_le(hdr+12), - .offset = unpack_32_le(hdr+16), - }; - pkg->priv->exports = (struct upkg_table) { - .count = unpack_32_le(hdr+20), - .offset = unpack_32_le(hdr+24), - }; - pkg->priv->imports = (struct upkg_table) { - .count = unpack_32_le(hdr+28), - .offset = unpack_32_le(hdr+32), - }; + pkg->priv->name_offset = unpack_32_le(hdr+16); + pkg->priv->export_offset = unpack_32_le(hdr+24); + pkg->priv->import_offset = unpack_32_le(hdr+32); return pkg; } @@ -57,27 +48,32 @@ struct upkg *upkg_fopen(const char *path) struct upkg *pkg; FILE *f; - f = fopen(path, "rb"); - if (!f) { + if (!(f = fopen(path, "rb"))) { return NULL; } - if (fread(hdr_buf, sizeof hdr_buf, 1, f) != 1) { goto err; } - if (unpack_32_le(hdr_buf) != UPKG_HDR_MAGIC) { goto err; } + /* Initialize package structure. */ pkg = init_upkg(hdr_buf); if (!pkg) { goto err; } - pkg->priv->f = f; + return pkg; err: fclose(f); return NULL; } + +int upkg_close(struct upkg *pkg) +{ + if (pkg->priv->f) + return fclose(pkg->priv->f); + return 0; +} diff --git a/upkg.c b/upkg.c index d0ba146..3cfd727 100644 --- a/upkg.c +++ b/upkg.c @@ -38,6 +38,8 @@ int main(int argc, char **argv) printf("License: %u\n", pkg->license); printf("Flags: %lx\n", pkg->flags); print_upkg_flags("\t", pkg->flags); + printf("Names: %zu\n", pkg->name_count); + upkg_close(pkg); return 0; } diff --git a/upkg.h b/upkg.h index acd176b..c4d582d 100644 --- a/upkg.h +++ b/upkg.h @@ -15,6 +15,8 @@ struct upkg { unsigned version, license; unsigned long flags; + unsigned long name_count, export_count, import_count; + struct upkg_private *priv; }; -- 2.43.2