xref: /openbsd-src/lib/libutil/imsg.h (revision ff59764deb7c720c75d582b75dac4b924ec7c8a6)
1*ff59764dSclaudio /*	$OpenBSD: imsg.h,v 1.19 2024/11/26 13:57:31 claudio Exp $	*/
2dfaf6462Snicm 
3dfaf6462Snicm /*
44658a150Sclaudio  * Copyright (c) 2023 Claudio Jeker <claudio@openbsd.org>
5dfaf6462Snicm  * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
6dfaf6462Snicm  * Copyright (c) 2006, 2007, 2008 Reyk Floeter <reyk@openbsd.org>
7dfaf6462Snicm  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
8dfaf6462Snicm  *
9dfaf6462Snicm  * Permission to use, copy, modify, and distribute this software for any
10dfaf6462Snicm  * purpose with or without fee is hereby granted, provided that the above
11dfaf6462Snicm  * copyright notice and this permission notice appear in all copies.
12dfaf6462Snicm  *
13dfaf6462Snicm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14dfaf6462Snicm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15dfaf6462Snicm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16dfaf6462Snicm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17dfaf6462Snicm  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18dfaf6462Snicm  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19dfaf6462Snicm  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20dfaf6462Snicm  */
21dfaf6462Snicm 
222da19defSnicm #ifndef _IMSG_H_
232da19defSnicm #define _IMSG_H_
242da19defSnicm 
254658a150Sclaudio #include <sys/types.h>
26b13109f3Sbcook 
27dfaf6462Snicm #define IBUF_READ_SIZE		65535
28dfaf6462Snicm #define IMSG_HEADER_SIZE	sizeof(struct imsg_hdr)
29dfaf6462Snicm #define MAX_IMSGSIZE		16384
30dfaf6462Snicm 
31dfaf6462Snicm struct ibuf {
32dfaf6462Snicm 	TAILQ_ENTRY(ibuf)	 entry;
33b13109f3Sbcook 	unsigned char		*buf;
34dfaf6462Snicm 	size_t			 size;
35dfaf6462Snicm 	size_t			 max;
36dfaf6462Snicm 	size_t			 wpos;
37dfaf6462Snicm 	size_t			 rpos;
38dfaf6462Snicm 	int			 fd;
39dfaf6462Snicm };
40dfaf6462Snicm 
41156c3c53Sclaudio struct msgbuf;
42156c3c53Sclaudio 
43dfaf6462Snicm struct imsgbuf {
44156c3c53Sclaudio 	struct msgbuf		*w;
45dfaf6462Snicm 	pid_t			 pid;
4604d83f12Sclaudio 	uint32_t		 maxsize;
4704d83f12Sclaudio 	int			 fd;
4804d83f12Sclaudio 	int			 flags;
49dfaf6462Snicm };
50dfaf6462Snicm 
51dfaf6462Snicm struct imsg_hdr {
52303db1f0Snicm 	uint32_t	 type;
5304d83f12Sclaudio 	uint32_t	 len;
54303db1f0Snicm 	uint32_t	 peerid;
55303db1f0Snicm 	uint32_t	 pid;
56dfaf6462Snicm };
57dfaf6462Snicm 
58dfaf6462Snicm struct imsg {
59dfaf6462Snicm 	struct imsg_hdr	 hdr;
60dfaf6462Snicm 	void		*data;
614658a150Sclaudio 	struct ibuf	*buf;
62dfaf6462Snicm };
63dfaf6462Snicm 
64692fa786Sclaudio struct iovec;
65dfaf6462Snicm 
6619778535Sclaudio /* imsg-buffer.c */
67dfaf6462Snicm struct ibuf	*ibuf_open(size_t);
68dfaf6462Snicm struct ibuf	*ibuf_dynamic(size_t, size_t);
69dfaf6462Snicm int		 ibuf_add(struct ibuf *, const void *, size_t);
704658a150Sclaudio int		 ibuf_add_ibuf(struct ibuf *, const struct ibuf *);
7119778535Sclaudio int		 ibuf_add_zero(struct ibuf *, size_t);
7219778535Sclaudio int		 ibuf_add_n8(struct ibuf *, uint64_t);
7319778535Sclaudio int		 ibuf_add_n16(struct ibuf *, uint64_t);
7419778535Sclaudio int		 ibuf_add_n32(struct ibuf *, uint64_t);
7519778535Sclaudio int		 ibuf_add_n64(struct ibuf *, uint64_t);
764658a150Sclaudio int		 ibuf_add_h16(struct ibuf *, uint64_t);
774658a150Sclaudio int		 ibuf_add_h32(struct ibuf *, uint64_t);
784658a150Sclaudio int		 ibuf_add_h64(struct ibuf *, uint64_t);
79dfaf6462Snicm void		*ibuf_reserve(struct ibuf *, size_t);
80dfaf6462Snicm void		*ibuf_seek(struct ibuf *, size_t, size_t);
8119778535Sclaudio int		 ibuf_set(struct ibuf *, size_t, const void *, size_t);
8219778535Sclaudio int		 ibuf_set_n8(struct ibuf *, size_t, uint64_t);
8319778535Sclaudio int		 ibuf_set_n16(struct ibuf *, size_t, uint64_t);
8419778535Sclaudio int		 ibuf_set_n32(struct ibuf *, size_t, uint64_t);
8519778535Sclaudio int		 ibuf_set_n64(struct ibuf *, size_t, uint64_t);
864658a150Sclaudio int		 ibuf_set_h16(struct ibuf *, size_t, uint64_t);
874658a150Sclaudio int		 ibuf_set_h32(struct ibuf *, size_t, uint64_t);
884658a150Sclaudio int		 ibuf_set_h64(struct ibuf *, size_t, uint64_t);
894658a150Sclaudio void		*ibuf_data(const struct ibuf *);
904658a150Sclaudio size_t		 ibuf_size(const struct ibuf *);
914658a150Sclaudio size_t		 ibuf_left(const struct ibuf *);
924658a150Sclaudio int		 ibuf_truncate(struct ibuf *, size_t);
934658a150Sclaudio void		 ibuf_rewind(struct ibuf *);
94dfaf6462Snicm void		 ibuf_close(struct msgbuf *, struct ibuf *);
954658a150Sclaudio void		 ibuf_from_buffer(struct ibuf *, void *, size_t);
964658a150Sclaudio void		 ibuf_from_ibuf(struct ibuf *, const struct ibuf *);
974658a150Sclaudio int		 ibuf_get(struct ibuf *, void *, size_t);
984658a150Sclaudio int		 ibuf_get_ibuf(struct ibuf *, size_t, struct ibuf *);
994658a150Sclaudio int		 ibuf_get_n8(struct ibuf *, uint8_t *);
1004658a150Sclaudio int		 ibuf_get_n16(struct ibuf *, uint16_t *);
1014658a150Sclaudio int		 ibuf_get_n32(struct ibuf *, uint32_t *);
1024658a150Sclaudio int		 ibuf_get_n64(struct ibuf *, uint64_t *);
1034658a150Sclaudio int		 ibuf_get_h16(struct ibuf *, uint16_t *);
1044658a150Sclaudio int		 ibuf_get_h32(struct ibuf *, uint32_t *);
1054658a150Sclaudio int		 ibuf_get_h64(struct ibuf *, uint64_t *);
106442dea11Sclaudio char		*ibuf_get_string(struct ibuf *, size_t);
1074658a150Sclaudio int		 ibuf_skip(struct ibuf *, size_t);
108dfaf6462Snicm void		 ibuf_free(struct ibuf *);
10919778535Sclaudio int		 ibuf_fd_avail(struct ibuf *);
11019778535Sclaudio int		 ibuf_fd_get(struct ibuf *);
11119778535Sclaudio void		 ibuf_fd_set(struct ibuf *, int);
112156c3c53Sclaudio struct msgbuf	*msgbuf_new(void);
113*ff59764dSclaudio struct msgbuf	*msgbuf_new_reader(size_t,
114*ff59764dSclaudio 		    struct ibuf *(*)(struct ibuf *, void *, int *), void *);
115156c3c53Sclaudio void		 msgbuf_free(struct msgbuf *);
116dfaf6462Snicm void		 msgbuf_clear(struct msgbuf *);
1174658a150Sclaudio uint32_t	 msgbuf_queuelen(struct msgbuf *);
1184494689aSclaudio int		 ibuf_write(int, struct msgbuf *);
1194494689aSclaudio int		 msgbuf_write(int, struct msgbuf *);
12004d83f12Sclaudio int		 ibuf_read(int, struct msgbuf *);
12104d83f12Sclaudio int		 msgbuf_read(int, struct msgbuf *);
12204d83f12Sclaudio struct ibuf	*msgbuf_get(struct msgbuf *);
123dfaf6462Snicm 
124dfaf6462Snicm /* imsg.c */
12504d83f12Sclaudio int	 imsgbuf_init(struct imsgbuf *, int);
12604d83f12Sclaudio void	 imsgbuf_allow_fdpass(struct imsgbuf *imsgbuf);
127*ff59764dSclaudio int	 imsgbuf_set_maxsize(struct imsgbuf *, uint32_t);
128c362c6deSclaudio int	 imsgbuf_read(struct imsgbuf *);
129d5c9e083Sclaudio int	 imsgbuf_write(struct imsgbuf *);
130d5c9e083Sclaudio int	 imsgbuf_flush(struct imsgbuf *);
131d5c9e083Sclaudio void	 imsgbuf_clear(struct imsgbuf *);
132a17071b2Sclaudio uint32_t imsgbuf_queuelen(struct imsgbuf *);
133dfaf6462Snicm ssize_t	 imsg_get(struct imsgbuf *, struct imsg *);
1344658a150Sclaudio int	 imsg_get_ibuf(struct imsg *, struct ibuf *);
1354658a150Sclaudio int	 imsg_get_data(struct imsg *, void *, size_t);
1364658a150Sclaudio int	 imsg_get_fd(struct imsg *);
1374658a150Sclaudio uint32_t imsg_get_id(struct imsg *);
1384658a150Sclaudio size_t	 imsg_get_len(struct imsg *);
1394658a150Sclaudio pid_t	 imsg_get_pid(struct imsg *);
1404658a150Sclaudio uint32_t imsg_get_type(struct imsg *);
1414658a150Sclaudio int	 imsg_forward(struct imsgbuf *, struct imsg *);
142303db1f0Snicm int	 imsg_compose(struct imsgbuf *, uint32_t, uint32_t, pid_t, int,
1434658a150Sclaudio 	    const void *, size_t);
144303db1f0Snicm int	 imsg_composev(struct imsgbuf *, uint32_t, uint32_t,  pid_t, int,
145303db1f0Snicm 	    const struct iovec *, int);
14619778535Sclaudio int	 imsg_compose_ibuf(struct imsgbuf *, uint32_t, uint32_t, pid_t,
14719778535Sclaudio 	    struct ibuf *);
1484658a150Sclaudio struct ibuf *imsg_create(struct imsgbuf *, uint32_t, uint32_t, pid_t, size_t);
1494658a150Sclaudio int	 imsg_add(struct ibuf *, const void *, size_t);
150dfaf6462Snicm void	 imsg_close(struct imsgbuf *, struct ibuf *);
151dfaf6462Snicm void	 imsg_free(struct imsg *);
1522da19defSnicm 
1532da19defSnicm #endif
154