#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];
};
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;
}
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;
+}