Commit Diff


commit - a158c90155bc8066c8f6d87a4a9600d8c5bf54c8
commit + 711fb6e8a4b06757bc43841881939c11a6191aae
blob - d47d917051346eabe1c76e22aeb6b7d3fd73d3c2
blob + d4be0fe065aea7e0b447615317770f7706bdcd35
--- lib/object.c
+++ lib/object.c
@@ -227,17 +227,12 @@ request_packed_object(struct got_object **obj, struct 
 }
 
 static const struct got_error *
-read_packed_object_privsep(struct got_object **obj,
-    struct got_repository *repo, struct got_pack *pack,
-    struct got_packidx *packidx, int idx, struct got_object_id *id)
+start_pack_privsep_child(struct got_pack *pack, struct got_packidx *packidx)
 {
 	const struct got_error *err = NULL;
 	int imsg_fds[2];
 	pid_t pid;
 	struct imsgbuf *ibuf;
-
-	if (pack->privsep_child)
-		return request_packed_object(obj, pack, idx, id);
 
 	ibuf = calloc(1, sizeof(*ibuf));
 	if (ibuf == NULL)
@@ -290,12 +285,28 @@ done:
 		free(ibuf);
 		free(pack->privsep_child);
 		pack->privsep_child = NULL;
-	} else
-		err = request_packed_object(obj, pack, idx, id);
+	}
 	return err;
 }
 
+static const struct got_error *
+read_packed_object_privsep(struct got_object **obj,
+    struct got_repository *repo, struct got_pack *pack,
+    struct got_packidx *packidx, int idx, struct got_object_id *id)
+{
+	const struct got_error *err = NULL;
 
+	if (pack->privsep_child)
+		return request_packed_object(obj, pack, idx, id);
+
+	err = start_pack_privsep_child(pack, packidx);
+	if (err)
+		return err;
+
+	return request_packed_object(obj, pack, idx, id);
+}
+
+
 static const struct got_error *
 open_packed_object(struct got_object **obj, struct got_object_id *id,
     struct got_repository *repo)
@@ -432,70 +443,17 @@ read_packed_commit_privsep(struct got_commit_object **
     struct got_object_id *id)
 {
 	const struct got_error *err = NULL;
-	int imsg_fds[2];
-	pid_t pid;
-	struct imsgbuf *ibuf;
 
 	if (pack->privsep_child)
 		return request_packed_commit(commit, pack, idx, id);
 
-	ibuf = calloc(1, sizeof(*ibuf));
-	if (ibuf == NULL)
-		return got_error_from_errno();
-
-	pack->privsep_child = calloc(1, sizeof(*pack->privsep_child));
-	if (pack->privsep_child == NULL) {
-		err = got_error_from_errno();
-		free(ibuf);
+	err = start_pack_privsep_child(pack, packidx);
+	if (err)
 		return err;
-	}
 
-	if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, imsg_fds) == -1) {
-		err = got_error_from_errno();
-		goto done;
-	}
-
-	pid = fork();
-	if (pid == -1) {
-		err = got_error_from_errno();
-		goto done;
-	} else if (pid == 0) {
-		exec_privsep_child(imsg_fds, GOT_PATH_PROG_READ_PACK,
-		    pack->path_packfile);
-		/* not reached */
-	}
-
-	close(imsg_fds[1]);
-	pack->privsep_child->imsg_fd = imsg_fds[0];
-	pack->privsep_child->pid = pid;
-	imsg_init(ibuf, imsg_fds[0]);
-	pack->privsep_child->ibuf = ibuf;
-
-	err = got_privsep_init_pack_child(ibuf, pack, packidx);
-	if (err) {
-		const struct got_error *child_err;
-		err = got_privsep_send_stop(pack->privsep_child->imsg_fd);
-		child_err = got_privsep_wait_for_child(
-		    pack->privsep_child->pid);
-		if (child_err && err == NULL)
-			err = child_err;
-		free(ibuf);
-		free(pack->privsep_child);
-		pack->privsep_child = NULL;
-		return err;
-	}
-
-done:
-	if (err) {
-		free(ibuf);
-		free(pack->privsep_child);
-		pack->privsep_child = NULL;
-	} else
-		err = request_packed_commit(commit, pack, idx, id);
-	return err;
+	return request_packed_commit(commit, pack, idx, id);
 }
 
-
 static const struct got_error *
 open_commit(struct got_commit_object **commit,
     struct got_repository *repo, struct got_object_id *id, int check_cache)