1*0a6a1f1dSLionel Sambuc /* Id */ 2eda6f593SDavid van Moolenbroek /* $OpenBSD: imsg.h,v 1.4 2010/05/26 13:56:07 nicm Exp $ */ 3eda6f593SDavid van Moolenbroek 4eda6f593SDavid van Moolenbroek /* 5eda6f593SDavid van Moolenbroek * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org> 6eda6f593SDavid van Moolenbroek * Copyright (c) 2006, 2007, 2008 Reyk Floeter <reyk@openbsd.org> 7eda6f593SDavid van Moolenbroek * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 8eda6f593SDavid van Moolenbroek * 9eda6f593SDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any 10eda6f593SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above 11eda6f593SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies. 12eda6f593SDavid van Moolenbroek * 13eda6f593SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14eda6f593SDavid van Moolenbroek * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15eda6f593SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16eda6f593SDavid van Moolenbroek * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17eda6f593SDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18eda6f593SDavid van Moolenbroek * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19eda6f593SDavid van Moolenbroek * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20eda6f593SDavid van Moolenbroek */ 21eda6f593SDavid van Moolenbroek 22eda6f593SDavid van Moolenbroek #include "tmux.h" 23eda6f593SDavid van Moolenbroek 24eda6f593SDavid van Moolenbroek #define IBUF_READ_SIZE 65535 25eda6f593SDavid van Moolenbroek #define IMSG_HEADER_SIZE sizeof(struct imsg_hdr) 26eda6f593SDavid van Moolenbroek #define MAX_IMSGSIZE 16384 27eda6f593SDavid van Moolenbroek 28eda6f593SDavid van Moolenbroek struct ibuf { 29eda6f593SDavid van Moolenbroek TAILQ_ENTRY(ibuf) entry; 30eda6f593SDavid van Moolenbroek u_char *buf; 31eda6f593SDavid van Moolenbroek size_t size; 32eda6f593SDavid van Moolenbroek size_t max; 33eda6f593SDavid van Moolenbroek size_t wpos; 34eda6f593SDavid van Moolenbroek size_t rpos; 35eda6f593SDavid van Moolenbroek int fd; 36eda6f593SDavid van Moolenbroek }; 37eda6f593SDavid van Moolenbroek 38eda6f593SDavid van Moolenbroek struct msgbuf { 39eda6f593SDavid van Moolenbroek TAILQ_HEAD(, ibuf) bufs; 40eda6f593SDavid van Moolenbroek u_int32_t queued; 41eda6f593SDavid van Moolenbroek int fd; 42eda6f593SDavid van Moolenbroek }; 43eda6f593SDavid van Moolenbroek 44eda6f593SDavid van Moolenbroek struct ibuf_read { 45eda6f593SDavid van Moolenbroek u_char buf[IBUF_READ_SIZE]; 46eda6f593SDavid van Moolenbroek u_char *rptr; 47eda6f593SDavid van Moolenbroek size_t wpos; 48eda6f593SDavid van Moolenbroek }; 49eda6f593SDavid van Moolenbroek 50eda6f593SDavid van Moolenbroek struct imsg_fd { 51eda6f593SDavid van Moolenbroek TAILQ_ENTRY(imsg_fd) entry; 52eda6f593SDavid van Moolenbroek int fd; 53eda6f593SDavid van Moolenbroek }; 54eda6f593SDavid van Moolenbroek 55eda6f593SDavid van Moolenbroek struct imsgbuf { 56eda6f593SDavid van Moolenbroek TAILQ_HEAD(, imsg_fd) fds; 57eda6f593SDavid van Moolenbroek struct ibuf_read r; 58eda6f593SDavid van Moolenbroek struct msgbuf w; 59eda6f593SDavid van Moolenbroek int fd; 60eda6f593SDavid van Moolenbroek pid_t pid; 61eda6f593SDavid van Moolenbroek }; 62eda6f593SDavid van Moolenbroek 63eda6f593SDavid van Moolenbroek #define IMSGF_HASFD 1 64eda6f593SDavid van Moolenbroek 65eda6f593SDavid van Moolenbroek struct imsg_hdr { 66eda6f593SDavid van Moolenbroek u_int32_t type; 67eda6f593SDavid van Moolenbroek u_int16_t len; 68eda6f593SDavid van Moolenbroek u_int16_t flags; 69eda6f593SDavid van Moolenbroek u_int32_t peerid; 70eda6f593SDavid van Moolenbroek u_int32_t pid; 71eda6f593SDavid van Moolenbroek }; 72eda6f593SDavid van Moolenbroek 73eda6f593SDavid van Moolenbroek struct imsg { 74eda6f593SDavid van Moolenbroek struct imsg_hdr hdr; 75eda6f593SDavid van Moolenbroek int fd; 76eda6f593SDavid van Moolenbroek void *data; 77eda6f593SDavid van Moolenbroek }; 78eda6f593SDavid van Moolenbroek 79eda6f593SDavid van Moolenbroek 80eda6f593SDavid van Moolenbroek /* buffer.c */ 81eda6f593SDavid van Moolenbroek struct ibuf *ibuf_open(size_t); 82eda6f593SDavid van Moolenbroek struct ibuf *ibuf_dynamic(size_t, size_t); 83eda6f593SDavid van Moolenbroek int ibuf_add(struct ibuf *, const void *, size_t); 84eda6f593SDavid van Moolenbroek void *ibuf_reserve(struct ibuf *, size_t); 85eda6f593SDavid van Moolenbroek void *ibuf_seek(struct ibuf *, size_t, size_t); 86eda6f593SDavid van Moolenbroek size_t ibuf_size(struct ibuf *); 87eda6f593SDavid van Moolenbroek size_t ibuf_left(struct ibuf *); 88eda6f593SDavid van Moolenbroek void ibuf_close(struct msgbuf *, struct ibuf *); 89eda6f593SDavid van Moolenbroek int ibuf_write(struct msgbuf *); 90eda6f593SDavid van Moolenbroek void ibuf_free(struct ibuf *); 91eda6f593SDavid van Moolenbroek void msgbuf_init(struct msgbuf *); 92eda6f593SDavid van Moolenbroek void msgbuf_clear(struct msgbuf *); 93eda6f593SDavid van Moolenbroek int msgbuf_write(struct msgbuf *); 94eda6f593SDavid van Moolenbroek void msgbuf_drain(struct msgbuf *, size_t); 95eda6f593SDavid van Moolenbroek 96eda6f593SDavid van Moolenbroek /* imsg.c */ 97eda6f593SDavid van Moolenbroek void imsg_init(struct imsgbuf *, int); 98eda6f593SDavid van Moolenbroek ssize_t imsg_read(struct imsgbuf *); 99eda6f593SDavid van Moolenbroek ssize_t imsg_get(struct imsgbuf *, struct imsg *); 100eda6f593SDavid van Moolenbroek int imsg_compose(struct imsgbuf *, u_int32_t, u_int32_t, pid_t, 101eda6f593SDavid van Moolenbroek int, void *, u_int16_t); 102eda6f593SDavid van Moolenbroek int imsg_composev(struct imsgbuf *, u_int32_t, u_int32_t, pid_t, 103eda6f593SDavid van Moolenbroek int, const struct iovec *, int); 104eda6f593SDavid van Moolenbroek struct ibuf *imsg_create(struct imsgbuf *, u_int32_t, u_int32_t, pid_t, 105eda6f593SDavid van Moolenbroek u_int16_t); 106eda6f593SDavid van Moolenbroek int imsg_add(struct ibuf *, void *, u_int16_t); 107eda6f593SDavid van Moolenbroek void imsg_close(struct imsgbuf *, struct ibuf *); 108eda6f593SDavid van Moolenbroek void imsg_free(struct imsg *); 109eda6f593SDavid van Moolenbroek int imsg_flush(struct imsgbuf *); 110eda6f593SDavid van Moolenbroek void imsg_clear(struct imsgbuf *); 111