xref: /openbsd-src/sbin/iked/imsg_util.c (revision c45f3621a4984cafb12365fce0a55d4457d95cd4)
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