xref: /freebsd/lib/libopenbsd/imsg.h (revision b3e76948)
170623c80SCraig Rodrigues /*	$OpenBSD: imsg.h,v 1.3 2013/12/26 17:32:33 eric Exp $	*/
270623c80SCraig Rodrigues 
370623c80SCraig Rodrigues /*
470623c80SCraig Rodrigues  * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
570623c80SCraig Rodrigues  * Copyright (c) 2006, 2007, 2008 Reyk Floeter <reyk@openbsd.org>
670623c80SCraig Rodrigues  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
770623c80SCraig Rodrigues  *
870623c80SCraig Rodrigues  * Permission to use, copy, modify, and distribute this software for any
970623c80SCraig Rodrigues  * purpose with or without fee is hereby granted, provided that the above
1070623c80SCraig Rodrigues  * copyright notice and this permission notice appear in all copies.
1170623c80SCraig Rodrigues  *
1270623c80SCraig Rodrigues  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1370623c80SCraig Rodrigues  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1470623c80SCraig Rodrigues  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1570623c80SCraig Rodrigues  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1670623c80SCraig Rodrigues  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1770623c80SCraig Rodrigues  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1870623c80SCraig Rodrigues  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1970623c80SCraig Rodrigues  */
2070623c80SCraig Rodrigues 
2170623c80SCraig Rodrigues #ifndef _IMSG_H_
2270623c80SCraig Rodrigues #define _IMSG_H_
2370623c80SCraig Rodrigues 
2470623c80SCraig Rodrigues #define IBUF_READ_SIZE		65535
2570623c80SCraig Rodrigues #define IMSG_HEADER_SIZE	sizeof(struct imsg_hdr)
2670623c80SCraig Rodrigues #define MAX_IMSGSIZE		16384
2770623c80SCraig Rodrigues 
2870623c80SCraig Rodrigues struct ibuf {
2970623c80SCraig Rodrigues 	TAILQ_ENTRY(ibuf)	 entry;
3070623c80SCraig Rodrigues 	u_char			*buf;
3170623c80SCraig Rodrigues 	size_t			 size;
3270623c80SCraig Rodrigues 	size_t			 max;
3370623c80SCraig Rodrigues 	size_t			 wpos;
3470623c80SCraig Rodrigues 	size_t			 rpos;
3570623c80SCraig Rodrigues 	int			 fd;
3670623c80SCraig Rodrigues };
3770623c80SCraig Rodrigues 
3870623c80SCraig Rodrigues struct msgbuf {
3970623c80SCraig Rodrigues 	TAILQ_HEAD(, ibuf)	 bufs;
4070623c80SCraig Rodrigues 	u_int32_t		 queued;
4170623c80SCraig Rodrigues 	int			 fd;
4270623c80SCraig Rodrigues };
4370623c80SCraig Rodrigues 
4470623c80SCraig Rodrigues struct ibuf_read {
4570623c80SCraig Rodrigues 	u_char			 buf[IBUF_READ_SIZE];
4670623c80SCraig Rodrigues 	u_char			*rptr;
4770623c80SCraig Rodrigues 	size_t			 wpos;
4870623c80SCraig Rodrigues };
4970623c80SCraig Rodrigues 
5070623c80SCraig Rodrigues struct imsg_fd {
5170623c80SCraig Rodrigues 	TAILQ_ENTRY(imsg_fd)	entry;
5270623c80SCraig Rodrigues 	int			fd;
5370623c80SCraig Rodrigues };
5470623c80SCraig Rodrigues 
5570623c80SCraig Rodrigues struct imsgbuf {
5670623c80SCraig Rodrigues 	TAILQ_HEAD(, imsg_fd)	 fds;
5770623c80SCraig Rodrigues 	struct ibuf_read	 r;
5870623c80SCraig Rodrigues 	struct msgbuf		 w;
5970623c80SCraig Rodrigues 	int			 fd;
6070623c80SCraig Rodrigues 	pid_t			 pid;
6170623c80SCraig Rodrigues };
6270623c80SCraig Rodrigues 
6370623c80SCraig Rodrigues #define IMSGF_HASFD	1
6470623c80SCraig Rodrigues 
6570623c80SCraig Rodrigues struct imsg_hdr {
6670623c80SCraig Rodrigues 	u_int32_t	 type;
6770623c80SCraig Rodrigues 	u_int16_t	 len;
6870623c80SCraig Rodrigues 	u_int16_t	 flags;
6970623c80SCraig Rodrigues 	u_int32_t	 peerid;
7070623c80SCraig Rodrigues 	u_int32_t	 pid;
7170623c80SCraig Rodrigues };
7270623c80SCraig Rodrigues 
7370623c80SCraig Rodrigues struct imsg {
7470623c80SCraig Rodrigues 	struct imsg_hdr	 hdr;
7570623c80SCraig Rodrigues 	int		 fd;
7670623c80SCraig Rodrigues 	void		*data;
7770623c80SCraig Rodrigues };
7870623c80SCraig Rodrigues 
7970623c80SCraig Rodrigues 
8070623c80SCraig Rodrigues /* buffer.c */
8170623c80SCraig Rodrigues struct ibuf	*ibuf_open(size_t);
8270623c80SCraig Rodrigues struct ibuf	*ibuf_dynamic(size_t, size_t);
8370623c80SCraig Rodrigues int		 ibuf_add(struct ibuf *, const void *, size_t);
8470623c80SCraig Rodrigues void		*ibuf_reserve(struct ibuf *, size_t);
8570623c80SCraig Rodrigues void		*ibuf_seek(struct ibuf *, size_t, size_t);
8670623c80SCraig Rodrigues size_t		 ibuf_size(struct ibuf *);
8770623c80SCraig Rodrigues size_t		 ibuf_left(struct ibuf *);
8870623c80SCraig Rodrigues void		 ibuf_close(struct msgbuf *, struct ibuf *);
8970623c80SCraig Rodrigues int		 ibuf_write(struct msgbuf *);
9070623c80SCraig Rodrigues void		 ibuf_free(struct ibuf *);
9170623c80SCraig Rodrigues void		 msgbuf_init(struct msgbuf *);
9270623c80SCraig Rodrigues void		 msgbuf_clear(struct msgbuf *);
9370623c80SCraig Rodrigues int		 msgbuf_write(struct msgbuf *);
9470623c80SCraig Rodrigues void		 msgbuf_drain(struct msgbuf *, size_t);
9570623c80SCraig Rodrigues 
9670623c80SCraig Rodrigues /* imsg.c */
9770623c80SCraig Rodrigues void	 imsg_init(struct imsgbuf *, int);
9870623c80SCraig Rodrigues ssize_t	 imsg_read(struct imsgbuf *);
9970623c80SCraig Rodrigues ssize_t	 imsg_get(struct imsgbuf *, struct imsg *);
10070623c80SCraig Rodrigues int	 imsg_compose(struct imsgbuf *, u_int32_t, u_int32_t, pid_t,
10170623c80SCraig Rodrigues 	    int, const void *, u_int16_t);
10270623c80SCraig Rodrigues int	 imsg_composev(struct imsgbuf *, u_int32_t, u_int32_t,  pid_t,
10370623c80SCraig Rodrigues 	    int, const struct iovec *, int);
10470623c80SCraig Rodrigues struct ibuf *imsg_create(struct imsgbuf *, u_int32_t, u_int32_t, pid_t,
10570623c80SCraig Rodrigues 	    u_int16_t);
10670623c80SCraig Rodrigues int	 imsg_add(struct ibuf *, const void *, u_int16_t);
10770623c80SCraig Rodrigues void	 imsg_close(struct imsgbuf *, struct ibuf *);
10870623c80SCraig Rodrigues void	 imsg_free(struct imsg *);
10970623c80SCraig Rodrigues int	 imsg_flush(struct imsgbuf *);
11070623c80SCraig Rodrigues void	 imsg_clear(struct imsgbuf *);
11170623c80SCraig Rodrigues 
11270623c80SCraig Rodrigues #endif
113