1*c45f3621Sclaudio /* $OpenBSD: imsg_util.c,v 1.22 2023/12/12 15:52:58 claudio Exp $ */
20e397e29Sreyk
30e397e29Sreyk /*
4fcebd35dSreyk * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
50e397e29Sreyk *
60e397e29Sreyk * Permission to use, copy, modify, and distribute this software for any
70e397e29Sreyk * purpose with or without fee is hereby granted, provided that the above
80e397e29Sreyk * copyright notice and this permission notice appear in all copies.
90e397e29Sreyk *
100e397e29Sreyk * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
110e397e29Sreyk * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
120e397e29Sreyk * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
130e397e29Sreyk * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
140e397e29Sreyk * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
150e397e29Sreyk * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
160e397e29Sreyk * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
170e397e29Sreyk */
180e397e29Sreyk
190e397e29Sreyk #include <sys/queue.h>
200e397e29Sreyk #include <sys/socket.h>
210e397e29Sreyk #include <sys/uio.h>
220e397e29Sreyk
230e397e29Sreyk #include <netdb.h>
240e397e29Sreyk #include <stdio.h>
250e397e29Sreyk #include <stdlib.h>
260e397e29Sreyk #include <unistd.h>
270e397e29Sreyk #include <string.h>
280e397e29Sreyk #include <errno.h>
290e397e29Sreyk #include <fcntl.h>
300e397e29Sreyk #include <ctype.h>
310e397e29Sreyk #include <event.h>
320e397e29Sreyk
330e397e29Sreyk #include "iked.h"
340e397e29Sreyk
350e397e29Sreyk /*
360e397e29Sreyk * Extending the imsg buffer API for internal use
370e397e29Sreyk */
380e397e29Sreyk
390e397e29Sreyk struct ibuf *
ibuf_new(const void * data,size_t len)40a3777487Smikeb ibuf_new(const void *data, size_t len)
410e397e29Sreyk {
420e397e29Sreyk struct ibuf *buf;
430e397e29Sreyk
440e397e29Sreyk if ((buf = ibuf_dynamic(len,
450e397e29Sreyk IKED_MSGBUF_MAX)) == NULL)
460e397e29Sreyk return (NULL);
470e397e29Sreyk
482aed9515Stobhe if (len == 0)
492aed9515Stobhe return (buf);
502aed9515Stobhe
512aed9515Stobhe if (data == NULL) {
52bd027751Sclaudio if (ibuf_add_zero(buf, len) != 0) {
530e397e29Sreyk ibuf_free(buf);
540e397e29Sreyk return (NULL);
550e397e29Sreyk }
560e397e29Sreyk } else {
570e397e29Sreyk if (ibuf_add(buf, data, len) != 0) {
580e397e29Sreyk ibuf_free(buf);
590e397e29Sreyk return (NULL);
600e397e29Sreyk }
610e397e29Sreyk }
620e397e29Sreyk
630e397e29Sreyk return (buf);
640e397e29Sreyk }
650e397e29Sreyk
660e397e29Sreyk struct ibuf *
ibuf_static(void)670e397e29Sreyk ibuf_static(void)
680e397e29Sreyk {
69022b5824Sclaudio return ibuf_open(IKED_MSGBUF_MAX);
700e397e29Sreyk }
710e397e29Sreyk
720e397e29Sreyk size_t
ibuf_length(struct ibuf * buf)730e397e29Sreyk ibuf_length(struct ibuf *buf)
740e397e29Sreyk {
75bd027751Sclaudio if (buf == NULL)
760e397e29Sreyk return (0);
770e397e29Sreyk return (ibuf_size(buf));
780e397e29Sreyk }
790e397e29Sreyk
80bd027751Sclaudio struct ibuf *
ibuf_getdata(struct ibuf * buf,size_t len)810e397e29Sreyk ibuf_getdata(struct ibuf *buf, size_t len)
820e397e29Sreyk {
83*c45f3621Sclaudio struct ibuf tmp;
840e397e29Sreyk
85*c45f3621Sclaudio if (ibuf_get_ibuf(buf, len, &tmp) == -1)
860e397e29Sreyk return (NULL);
870e397e29Sreyk
88*c45f3621Sclaudio return (ibuf_new(ibuf_data(&tmp), ibuf_size(&tmp)));
890e397e29Sreyk }
900e397e29Sreyk
910e397e29Sreyk struct ibuf *
ibuf_dup(struct ibuf * buf)920e397e29Sreyk ibuf_dup(struct ibuf *buf)
930e397e29Sreyk {
940e397e29Sreyk if (buf == NULL)
950e397e29Sreyk return (NULL);
960e397e29Sreyk return (ibuf_new(ibuf_data(buf), ibuf_size(buf)));
970e397e29Sreyk }
980e397e29Sreyk
990e397e29Sreyk struct ibuf *
ibuf_random(size_t len)1000e397e29Sreyk ibuf_random(size_t len)
1010e397e29Sreyk {
1020e397e29Sreyk struct ibuf *buf;
1030e397e29Sreyk void *ptr;
1040e397e29Sreyk
1050e397e29Sreyk if ((buf = ibuf_open(len)) == NULL)
1060e397e29Sreyk return (NULL);
1070e397e29Sreyk if ((ptr = ibuf_reserve(buf, len)) == NULL) {
1080e397e29Sreyk ibuf_free(buf);
1090e397e29Sreyk return (NULL);
1100e397e29Sreyk }
1110e397e29Sreyk arc4random_buf(ptr, len);
1120e397e29Sreyk return (buf);
1130e397e29Sreyk }
1140e397e29Sreyk
1150e397e29Sreyk int
ibuf_setsize(struct ibuf * buf,size_t len)1160e397e29Sreyk ibuf_setsize(struct ibuf *buf, size_t len)
1170e397e29Sreyk {
1180e397e29Sreyk if (len > buf->size)
1190e397e29Sreyk return (-1);
1200e397e29Sreyk buf->wpos = len;
1210e397e29Sreyk return (0);
1220e397e29Sreyk }
123