+static int pkg_init_imports(struct upkg *pkg)
+{
+ size_t rc, len, nbuf = 0;
+ unsigned long index = 0;
+ char buf[512];
+
+ if (fseek(pkg->priv->f, pkg->priv->import_offset, SEEK_SET) != 0)
+ return -1;
+
+ pkg->priv->imports = malloc(pkg->import_count * sizeof *pkg->priv->imports);
+ if (!pkg->priv->imports)
+ return -1;
+
+ while (index < pkg->import_count) {
+ struct upkg_import *import = &pkg->priv->imports[index];
+ long tmp;
+
+ /* Read some data into buffer. */
+ if (!feof(pkg->priv->f)) {
+ rc = fread(buf+nbuf, 1, sizeof buf-nbuf, pkg->priv->f);
+ if (rc == 0)
+ goto err;
+ nbuf += rc;
+ }
+
+ len = 0;
+ rc = decode_index(&tmp, buf+len, nbuf-len);
+ if (rc == 0 || len < 0 || len >= pkg->name_count) goto err;
+ import->class_package = pkg->priv->names[tmp].name;
+ len += rc;
+
+ rc = decode_index(&tmp, buf+len, nbuf-len);
+ if (rc == 0 || len < 0 || len >= pkg->name_count) goto err;
+ import->class_name = pkg->priv->names[tmp].name;
+ len += rc;
+
+ if (nbuf-len < 4) goto err;
+ import->package = unpack_32_le(buf+len);
+ len += 4;
+
+ rc = decode_index(&tmp, buf+len, nbuf-len);
+ if (rc == 0 || len < 0 || len >= pkg->name_count) goto err;
+ import->object_name = pkg->priv->names[tmp].name;
+ len += rc;
+
+ nbuf -= len;
+ memmove(buf, buf+len, nbuf);
+ index++;
+ }
+
+ return 0;
+err:
+ free(pkg->priv->imports);
+ return -1;
+}
+