+static int pkg_init_names(struct upkg *pkg)
+{
+ size_t rc, nbuf = 0, len;
+ unsigned long index = 0;
+ char buf[512];
+
+ if (fseek(pkg->priv->f, pkg->priv->name_offset, SEEK_SET) != 0)
+ return -1;
+
+ pkg->priv->names = malloc(pkg->name_count * sizeof *pkg->priv->names);
+ if (!pkg->priv->names)
+ return -1;
+
+ while (index < pkg->name_count) {
+ struct upkg_name *name = &pkg->priv->names[index];
+ name->index = index;
+
+ /* 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;
+ }
+
+ if (pkg->version >= 64) {
+ len = buf[0];
+ if (nbuf <= len + 4 || buf[len])
+ goto err;
+ name->name = malloc(len);
+ if (!name->name)
+ goto err;
+ memcpy(name->name, buf+1, len);
+ name->flags = unpack_32_le(buf+len+1);
+
+ nbuf -= len + 5;
+ memmove(buf, buf+len+5, nbuf);
+ index++;
+ } else {
+ abort();
+ }
+ }
+
+ return 0;
+err:
+ free(pkg->priv->names);
+ return -1;
+}
+