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