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