Commit Diff


commit - 0adca11afbf75e5e1995e8a5106d0dd0914374e9
commit + 817c5a18db169317b90ca35d48c3c43c8f8ce537
blob - ac420c8b27bdfa56508ea4e25573f453564c686f
blob + ffb585aa6226197301c3981968e715c8af667099
--- lib/got_lib_pack.h
+++ lib/got_lib_pack.h
@@ -144,6 +144,7 @@ struct got_packfile_obj_data {
 	} __attribute__((__packed__));
 } __attribute__((__packed__));
 
+const struct got_error *got_packidx_init_hdr(struct got_packidx *, int);
 const struct got_error *got_packidx_open(struct got_packidx **,
     const char *, int);
 const struct got_error* got_packidx_close(struct got_packidx *);
blob - 440b49e9e7985b8b90d68b74b93873747b06cd36
blob + e50ad5cee685e50dfd69627e821e2008f4918d94
--- lib/pack.c
+++ lib/pack.c
@@ -119,53 +119,17 @@ get_packfile_size(size_t *size, const char *path)
 }
 
 const struct got_error *
-got_packidx_open(struct got_packidx **packidx, const char *path, int verify)
+got_packidx_init_hdr(struct got_packidx *p, int verify)
 {
-	struct got_packidx *p;
-	struct got_packidx_v2_hdr *h;
 	const struct got_error *err = NULL;
-	size_t nobj, len_fanout, len_ids, offset, remain;
-	ssize_t n;
+	struct got_packidx_v2_hdr *h;
 	SHA1_CTX ctx;
 	uint8_t sha1[SHA1_DIGEST_LENGTH];
+	size_t nobj, len_fanout, len_ids, offset, remain;
+	ssize_t n;
 
-	*packidx = NULL;
-
 	SHA1Init(&ctx);
 
-	p = calloc(1, sizeof(*p));
-	if (p == NULL)
-		return got_error_from_errno();
-
-	p->fd = open(path, O_RDONLY | O_NOFOLLOW, GOT_DEFAULT_FILE_MODE);
-	if (p->fd == -1)
-		return got_error_from_errno();
-
-	err = get_packfile_size(&p->len, path);
-	if (err) {
-		close(p->fd);
-		free(p);
-		return err;
-	}
-	if (p->len < sizeof(p->hdr)) {
-		err = got_error(GOT_ERR_BAD_PACKIDX);
-		close(p->fd);
-		free(p);
-		return err;
-	}
-
-	p->path_packidx = strdup(path);
-	if (p->path_packidx == NULL) {
-		err = got_error_from_errno();
-		goto done;
-	}
-
-#ifndef GOT_PACK_NO_MMAP
-	p->map = mmap(NULL, p->len, PROT_READ, MAP_PRIVATE, p->fd, 0);
-	if (p->map == MAP_FAILED)
-		p->map = NULL; /* fall back to read(2) */
-#endif
-
 	h = &p->hdr;
 	offset = 0;
 	remain = p->len;
@@ -384,10 +348,57 @@ checksum:
 			err = got_error(GOT_ERR_PACKIDX_CSUM);
 	}
 done:
+	return err;
+}
+
+const struct got_error *
+got_packidx_open(struct got_packidx **packidx, const char *path, int verify)
+{
+	const struct got_error *err = NULL;
+	struct got_packidx *p;
+
+	*packidx = NULL;
+
+	p = calloc(1, sizeof(*p));
+	if (p == NULL)
+		return got_error_from_errno();
+
+	p->fd = open(path, O_RDONLY | O_NOFOLLOW, GOT_DEFAULT_FILE_MODE);
+	if (p->fd == -1)
+		return got_error_from_errno();
+
+	err = get_packfile_size(&p->len, path);
+	if (err) {
+		close(p->fd);
+		free(p);
+		return err;
+	}
+	if (p->len < sizeof(p->hdr)) {
+		err = got_error(GOT_ERR_BAD_PACKIDX);
+		close(p->fd);
+		free(p);
+		return err;
+	}
+
+	p->path_packidx = strdup(path);
+	if (p->path_packidx == NULL) {
+		err = got_error_from_errno();
+		goto done;
+	}
+
+#ifndef GOT_PACK_NO_MMAP
+	p->map = mmap(NULL, p->len, PROT_READ, MAP_PRIVATE, p->fd, 0);
+	if (p->map == MAP_FAILED)
+		p->map = NULL; /* fall back to read(2) */
+#endif
+
+	err = got_packidx_init_hdr(p, verify);
+done:
 	if (err)
 		got_packidx_close(p);
 	else
 		*packidx = p;
+
 	return err;
 }