]> git.draconx.ca Git - upkg.git/blobdiff - libupkg.c
Reorganise the upkg structures a bit.
[upkg.git] / libupkg.c
index dfc8e0ffacbe68b0074b1d931291f81afa73e551..617aefaab8c91c52a497d68f38a7f097996193f4 100644 (file)
--- 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;
+}