create recv_one_imsg() helper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
diff --git a/lib/privsep.c b/lib/privsep.c
index cd44eab..3f70527 100644
--- a/lib/privsep.c
+++ b/lib/privsep.c
@@ -64,6 +64,35 @@ poll_fd(int fd, int events, int timeout)
}
static const struct got_error *
+recv_one_imsg(struct imsg *imsg, struct imsgbuf *ibuf, size_t min_datalen)
+{
+ const struct got_error *err;
+ ssize_t n, m;
+
+ err = poll_fd(ibuf->fd, POLLIN, INFTIM);
+ if (err)
+ return err;
+
+ n = imsg_read(ibuf);
+ if (n == -1) {
+ if (errno == EAGAIN) /* Could be a file-descriptor leak. */
+ return got_error(GOT_ERR_PRIVSEP_NO_FD);
+ return got_error(GOT_ERR_PRIVSEP_READ);
+ }
+ if (n == 0)
+ return got_error(GOT_ERR_PRIVSEP_PIPE);
+
+ m = imsg_get(ibuf, imsg);
+ if (m == 0)
+ return got_error(GOT_ERR_PRIVSEP_READ);
+
+ if (imsg->hdr.len < IMSG_HEADER_SIZE + min_datalen)
+ return got_error(GOT_ERR_PRIVSEP_LEN);
+
+ return NULL;
+}
+
+static const struct got_error *
recv_imsg_error(struct imsg *imsg, size_t datalen)
{
struct got_imsg_error ierr;
@@ -148,7 +177,6 @@ got_privsep_recv_obj(struct got_object **obj, struct imsgbuf *ibuf)
const struct got_error *err = NULL;
struct imsg imsg;
struct got_imsg_object iobj;
- ssize_t n, m;
size_t datalen;
int i;
const size_t min_datalen =
@@ -156,26 +184,10 @@ got_privsep_recv_obj(struct got_object **obj, struct imsgbuf *ibuf)
*obj = NULL;
- err = poll_fd(ibuf->fd, POLLIN, INFTIM);
+ err = recv_one_imsg(&imsg, ibuf, min_datalen);
if (err)
return err;
- n = imsg_read(ibuf);
- if (n == -1) {
- if (errno == EAGAIN) /* Could be a file-descriptor leak. */
- return got_error(GOT_ERR_PRIVSEP_NO_FD);
- return got_error(GOT_ERR_PRIVSEP_READ);
- }
- if (n == 0)
- return got_error(GOT_ERR_PRIVSEP_PIPE);
-
- m = imsg_get(ibuf, &imsg);
- if (m == 0)
- return got_error(GOT_ERR_PRIVSEP_READ);
-
- if (imsg.hdr.len < IMSG_HEADER_SIZE + min_datalen)
- return got_error(GOT_ERR_PRIVSEP_LEN);
-
datalen = imsg.hdr.len - IMSG_HEADER_SIZE;
switch (imsg.hdr.type) {