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