xref: /netbsd/external/bsd/tmux/dist/compat/imsg.h (revision 5b2b32f5)
1*5b2b32f5Schristos /*	$OpenBSD: imsg.h,v 1.5 2019/01/20 02:50:03 bcook Exp $	*/
27123b0aaSjmmv 
37123b0aaSjmmv /*
47123b0aaSjmmv  * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
57123b0aaSjmmv  * Copyright (c) 2006, 2007, 2008 Reyk Floeter <reyk@openbsd.org>
67123b0aaSjmmv  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
77123b0aaSjmmv  *
87123b0aaSjmmv  * Permission to use, copy, modify, and distribute this software for any
97123b0aaSjmmv  * purpose with or without fee is hereby granted, provided that the above
107123b0aaSjmmv  * copyright notice and this permission notice appear in all copies.
117123b0aaSjmmv  *
127123b0aaSjmmv  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
137123b0aaSjmmv  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
147123b0aaSjmmv  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
157123b0aaSjmmv  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
167123b0aaSjmmv  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
177123b0aaSjmmv  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
187123b0aaSjmmv  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
197123b0aaSjmmv  */
207123b0aaSjmmv 
2162d8286bSchristos #ifndef _IMSG_H_
2262d8286bSchristos #define _IMSG_H_
2362d8286bSchristos 
24*5b2b32f5Schristos #include <stdint.h>
25*5b2b32f5Schristos 
267123b0aaSjmmv #define IBUF_READ_SIZE		65535
277123b0aaSjmmv #define IMSG_HEADER_SIZE	sizeof(struct imsg_hdr)
287123b0aaSjmmv #define MAX_IMSGSIZE		16384
297123b0aaSjmmv 
307123b0aaSjmmv struct ibuf {
317123b0aaSjmmv 	TAILQ_ENTRY(ibuf)	 entry;
32*5b2b32f5Schristos 	unsigned char		*buf;
337123b0aaSjmmv 	size_t			 size;
347123b0aaSjmmv 	size_t			 max;
357123b0aaSjmmv 	size_t			 wpos;
367123b0aaSjmmv 	size_t			 rpos;
377123b0aaSjmmv 	int			 fd;
387123b0aaSjmmv };
397123b0aaSjmmv 
407123b0aaSjmmv struct msgbuf {
417123b0aaSjmmv 	TAILQ_HEAD(, ibuf)	 bufs;
42cc6bd9f9Schristos 	uint32_t		 queued;
437123b0aaSjmmv 	int			 fd;
447123b0aaSjmmv };
457123b0aaSjmmv 
467123b0aaSjmmv struct ibuf_read {
47*5b2b32f5Schristos 	unsigned char		 buf[IBUF_READ_SIZE];
48*5b2b32f5Schristos 	unsigned char		*rptr;
497123b0aaSjmmv 	size_t			 wpos;
507123b0aaSjmmv };
517123b0aaSjmmv 
527123b0aaSjmmv struct imsg_fd {
537123b0aaSjmmv 	TAILQ_ENTRY(imsg_fd)	entry;
547123b0aaSjmmv 	int			fd;
557123b0aaSjmmv };
567123b0aaSjmmv 
577123b0aaSjmmv struct imsgbuf {
587123b0aaSjmmv 	TAILQ_HEAD(, imsg_fd)	 fds;
597123b0aaSjmmv 	struct ibuf_read	 r;
607123b0aaSjmmv 	struct msgbuf		 w;
617123b0aaSjmmv 	int			 fd;
627123b0aaSjmmv 	pid_t			 pid;
637123b0aaSjmmv };
647123b0aaSjmmv 
657123b0aaSjmmv #define IMSGF_HASFD	1
667123b0aaSjmmv 
677123b0aaSjmmv struct imsg_hdr {
68cc6bd9f9Schristos 	uint32_t	 type;
69cc6bd9f9Schristos 	uint16_t	 len;
70cc6bd9f9Schristos 	uint16_t	 flags;
71cc6bd9f9Schristos 	uint32_t	 peerid;
72cc6bd9f9Schristos 	uint32_t	 pid;
737123b0aaSjmmv };
747123b0aaSjmmv 
757123b0aaSjmmv struct imsg {
767123b0aaSjmmv 	struct imsg_hdr	 hdr;
777123b0aaSjmmv 	int		 fd;
787123b0aaSjmmv 	void		*data;
797123b0aaSjmmv };
807123b0aaSjmmv 
817123b0aaSjmmv 
827123b0aaSjmmv /* buffer.c */
837123b0aaSjmmv struct ibuf	*ibuf_open(size_t);
847123b0aaSjmmv struct ibuf	*ibuf_dynamic(size_t, size_t);
857123b0aaSjmmv int		 ibuf_add(struct ibuf *, const void *, size_t);
867123b0aaSjmmv void		*ibuf_reserve(struct ibuf *, size_t);
877123b0aaSjmmv void		*ibuf_seek(struct ibuf *, size_t, size_t);
887123b0aaSjmmv size_t		 ibuf_size(struct ibuf *);
897123b0aaSjmmv size_t		 ibuf_left(struct ibuf *);
907123b0aaSjmmv void		 ibuf_close(struct msgbuf *, struct ibuf *);
917123b0aaSjmmv int		 ibuf_write(struct msgbuf *);
927123b0aaSjmmv void		 ibuf_free(struct ibuf *);
937123b0aaSjmmv void		 msgbuf_init(struct msgbuf *);
947123b0aaSjmmv void		 msgbuf_clear(struct msgbuf *);
957123b0aaSjmmv int		 msgbuf_write(struct msgbuf *);
967123b0aaSjmmv void		 msgbuf_drain(struct msgbuf *, size_t);
977123b0aaSjmmv 
987123b0aaSjmmv /* imsg.c */
997123b0aaSjmmv void	 imsg_init(struct imsgbuf *, int);
1007123b0aaSjmmv ssize_t	 imsg_read(struct imsgbuf *);
1017123b0aaSjmmv ssize_t	 imsg_get(struct imsgbuf *, struct imsg *);
102cc6bd9f9Schristos int	 imsg_compose(struct imsgbuf *, uint32_t, uint32_t, pid_t, int,
103cc6bd9f9Schristos 	    const void *, uint16_t);
104cc6bd9f9Schristos int	 imsg_composev(struct imsgbuf *, uint32_t, uint32_t,  pid_t, int,
105cc6bd9f9Schristos 	    const struct iovec *, int);
106cc6bd9f9Schristos struct ibuf *imsg_create(struct imsgbuf *, uint32_t, uint32_t, pid_t, uint16_t);
107cc6bd9f9Schristos int	 imsg_add(struct ibuf *, const void *, uint16_t);
1087123b0aaSjmmv void	 imsg_close(struct imsgbuf *, struct ibuf *);
1097123b0aaSjmmv void	 imsg_free(struct imsg *);
1107123b0aaSjmmv int	 imsg_flush(struct imsgbuf *);
1117123b0aaSjmmv void	 imsg_clear(struct imsgbuf *);
11262d8286bSchristos 
11362d8286bSchristos #endif
114