Use the ibuf_fd_*() API for file descriptor passing and also ibuf_set() instead of ibuf_seek().
-- :wq Claudio Index: http.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/http.c,v retrieving revision 1.76 diff -u -p -r1.76 http.c --- http.c 12 Jun 2023 15:27:52 -0000 1.76 +++ http.c 12 Jun 2023 16:03:16 -0000 @@ -2150,7 +2150,7 @@ proc_http(char *bind_addr, int fd) io_read_str(b, &mod); /* queue up new requests */ - http_req_new(id, uri, mod, 0, b->fd); + http_req_new(id, uri, mod, 0, ibuf_fd_get(b)); ibuf_free(b); } } Index: io.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/io.c,v retrieving revision 1.22 diff -u -p -r1.22 io.c --- io.c 14 Dec 2022 15:19:16 -0000 1.22 +++ io.c 16 Jun 2023 14:37:42 -0000 @@ -41,7 +41,7 @@ io_new_buffer(void) if ((b = ibuf_dynamic(64, INT32_MAX)) == NULL) err(1, NULL); - ibuf_reserve(b, sizeof(size_t)); /* can not fail */ + ibuf_add_zero(b, sizeof(size_t)); /* can not fail */ return b; } @@ -88,7 +88,7 @@ io_close_buffer(struct msgbuf *msgbuf, s size_t len; len = ibuf_size(b) - sizeof(len); - memcpy(ibuf_seek(b, 0, sizeof(len)), &len, sizeof(len)); + ibuf_set(b, 0, &len, sizeof(len)); ibuf_close(msgbuf, b); } @@ -280,7 +280,7 @@ io_buf_recvfd(int fd, struct ibuf **ib) for (i = 0; i < j; i++) { f = ((int *)CMSG_DATA(cmsg))[i]; if (i == 0) - b->fd = f; + ibuf_fd_set(b, f); else close(f); } Index: main.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v retrieving revision 1.241 diff -u -p -r1.241 main.c --- main.c 30 May 2023 16:02:28 -0000 1.241 +++ main.c 12 Jun 2023 07:09:58 -0000 @@ -341,7 +341,7 @@ http_fetch(unsigned int id, const char * io_str_buffer(b, uri); io_str_buffer(b, last_mod); /* pass file as fd */ - b->fd = fd; + ibuf_fd_set(b, fd); io_close_buffer(&httpq, b); } @@ -362,7 +362,7 @@ rrdp_http_fetch(unsigned int id, const c b = io_new_buffer(); io_simple_buffer(b, &type, sizeof(type)); io_simple_buffer(b, &id, sizeof(id)); - b->fd = pi[0]; + ibuf_fd_set(b, pi[0]); io_close_buffer(&rrdpq, b); http_fetch(id, uri, last_mod, pi[1]); Index: rrdp.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/rrdp.c,v retrieving revision 1.30 diff -u -p -r1.30 rrdp.c --- rrdp.c 3 May 2023 07:51:08 -0000 1.30 +++ rrdp.c 16 Jun 2023 15:06:58 -0000 @@ -431,20 +431,20 @@ rrdp_input_handler(int fd) io_read_str(b, &session_id); io_read_buf(b, &serial, sizeof(serial)); io_read_str(b, &last_mod); - if (b->fd != -1) + if (ibuf_fd_avail(b)) errx(1, "received unexpected fd"); rrdp_new(id, local, notify, session_id, serial, last_mod); break; case RRDP_HTTP_INI: - if (b->fd == -1) - errx(1, "expected fd not received"); s = rrdp_get(id); if (s == NULL) errx(1, "http ini, rrdp session %u does not exist", id); if (s->state != RRDP_STATE_WAIT) errx(1, "%s: bad internal state", s->local); - s->infd = b->fd; + s->infd = ibuf_fd_get(b); + if (s->infd == -1) + errx(1, "expected fd not received"); s->state = RRDP_STATE_PARSE; if (s->aborted) { rrdp_abort_req(s); @@ -454,7 +454,7 @@ rrdp_input_handler(int fd) case RRDP_HTTP_FIN: io_read_buf(b, &res, sizeof(res)); io_read_str(b, &last_mod); - if (b->fd != -1) + if (ibuf_fd_avail(b)) errx(1, "received unexpected fd"); s = rrdp_get(id); @@ -472,7 +472,7 @@ rrdp_input_handler(int fd) s = rrdp_get(id); if (s == NULL) errx(1, "file, rrdp session %u does not exist", id);; - if (b->fd != -1) + if (ibuf_fd_avail(b)) errx(1, "received unexpected fd"); io_read_buf(b, &ok, sizeof(ok)); if (ok != 1) @@ -482,7 +482,7 @@ rrdp_input_handler(int fd) rrdp_finished(s); break; case RRDP_ABORT: - if (b->fd != -1) + if (ibuf_fd_avail(b)) errx(1, "received unexpected fd"); s = rrdp_get(id); if (s != NULL)