From: Nick Bowler Date: Mon, 8 Jun 2009 20:41:46 +0000 (-0400) Subject: Implement GUID handling. X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/commitdiff_plain/67988e9de2e9002064d52b4a1c5b5c4f8e6e665f Implement GUID handling. --- diff --git a/src/libupkg.c b/src/libupkg.c index f7c55ba..f2addc9 100644 --- a/src/libupkg.c +++ b/src/libupkg.c @@ -124,6 +124,34 @@ static struct upkg *init_upkg(unsigned char hdr[static UPKG_HDR_SIZE]) return &alloc->pkg; } +static int pkg_init_guid(struct upkg *pkg) +{ + size_t rc; + + if (pkg->version < 68) { + unsigned long heritage_count, heritage_offset; + unsigned char buf[8]; + + rc = fread(buf, 1, sizeof buf, pkg->priv->f); + if (rc < 8) + return -1; + + heritage_count = unpack_32_le(buf+0); + heritage_offset = unpack_32_le(buf+4); + + if (heritage_count == 0) + return -1; + if (fseek(pkg->priv->f, heritage_offset, SEEK_SET) != 0) + return -1; + } + + rc = fread(pkg->guid, 1, 16, pkg->priv->f); + if (rc < 16) + return -1; + + return 0; +} + static int pkg_init_names(struct upkg *pkg) { size_t rc, len, nbuf = 0; @@ -335,6 +363,10 @@ struct upkg *upkg_fopen(const char *path) } pkg->priv->f = f; + if (pkg_init_guid(pkg) != 0) { + goto err2; + } + if (pkg_init_names(pkg) != 0) { goto err2; } diff --git a/src/upkg.c b/src/upkg.c index 02d8e57..20b7336 100644 --- a/src/upkg.c +++ b/src/upkg.c @@ -37,6 +37,16 @@ void print_upkg_flags(const char *prefix, unsigned long flags) printf("%sRequired\n", prefix); } +void print_guid(unsigned char guid[static 16]) +{ + for (unsigned i = 0; i < 16; i++) { + printf("%02hhx", guid[i]); + if (i == 15) + putchar('\n'); + else + putchar(' '); + } +} int main(int argc, char **argv) { @@ -55,6 +65,8 @@ int main(int argc, char **argv) printf("Version: %u\n", pkg->version); printf("License: %u\n", pkg->license); + printf("GUID: "); + print_guid(pkg->guid); printf("Flags: %lx\n", pkg->flags); print_upkg_flags("\t", pkg->flags); diff --git a/src/upkg.h b/src/upkg.h index 8aa81a1..2e92e85 100644 --- a/src/upkg.h +++ b/src/upkg.h @@ -44,6 +44,7 @@ struct upkg { unsigned version, license; + unsigned char guid[16]; unsigned long flags; unsigned long name_count, export_count, import_count;