commit c4330effadfe340c07b5709bc805de6a0b3764a7 from: Stefan Sperling date: Tue Jun 22 19:11:54 2021 UTC expose got_pack_parse_ref_delta() for library-internal use This will be needed by a future 'gotadmin listpack' command. commit - 02828bfdd5b1fe79298e576b2c28d252509fa089 commit + c4330effadfe340c07b5709bc805de6a0b3764a7 blob - b724471532577da10261814ae16d983663c533c9 blob + e2c8744ffb1b9384501e83ee3f8dd3975eb806be --- lib/got_lib_pack.h +++ lib/got_lib_pack.h @@ -28,6 +28,8 @@ const struct got_error *got_pack_close(struct got_pack const struct got_error *got_pack_parse_offset_delta(off_t *, size_t *, struct got_pack *, off_t, int); +const struct got_error *got_pack_parse_ref_delta(struct got_object_id *, + struct got_pack *, off_t, int); const struct got_error *got_pack_resolve_delta_chain(struct got_delta_chain *, struct got_packidx *, struct got_pack *, off_t, size_t, int, size_t, unsigned int); blob - eb5f6b49d6a70c08668c91709236f37b0e9f6e6a blob + 1b917035bd5fcddb3547066f98679b2ba7a6c567 --- lib/pack.c +++ lib/pack.c @@ -808,7 +808,26 @@ resolve_offset_delta(struct got_delta_chain *deltas, return got_pack_resolve_delta_chain(deltas, packidx, pack, base_offset, base_tslen, base_type, base_size, recursion - 1); } + +const struct got_error * +got_pack_parse_ref_delta(struct got_object_id *id, + struct got_pack *pack, off_t delta_offset, int tslen) +{ + if (pack->map) { + size_t mapoff = delta_offset + tslen; + memcpy(id, pack->map + mapoff, sizeof(*id)); + } else { + ssize_t n; + n = read(pack->fd, id, sizeof(*id)); + if (n < 0) + return got_error_from_errno("read"); + if (n != sizeof(*id)) + return got_error(GOT_ERR_BAD_PACKFILE); + } + return NULL; +} + static const struct got_error * resolve_ref_delta(struct got_delta_chain *deltas, struct got_packidx *packidx, struct got_pack *pack, off_t delta_offset, size_t tslen, int delta_type, @@ -826,18 +845,12 @@ resolve_ref_delta(struct got_delta_chain *deltas, stru if (delta_offset + tslen >= pack->filesize) return got_error(GOT_ERR_PACK_OFFSET); + err = got_pack_parse_ref_delta(&id, pack, delta_offset, tslen); + if (err) + return err; if (pack->map) { - size_t mapoff = delta_offset + tslen; - memcpy(&id, pack->map + mapoff, sizeof(id)); - mapoff += sizeof(id); - delta_data_offset = (off_t)mapoff; + delta_data_offset = delta_offset + tslen + sizeof(id); } else { - ssize_t n; - n = read(pack->fd, &id, sizeof(id)); - if (n < 0) - return got_error_from_errno("read"); - if (n != sizeof(id)) - return got_error(GOT_ERR_BAD_PACKFILE); delta_data_offset = lseek(pack->fd, 0, SEEK_CUR); if (delta_data_offset == -1) return got_error_from_errno("lseek");