1*31be28caSclaudio /* $OpenBSD: imsg_subr.c,v 1.3 2024/11/21 13:18:38 claudio Exp $ */ 2a7ca44b8Syasuoka 3a7ca44b8Syasuoka /* 4a7ca44b8Syasuoka * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net> 5a7ca44b8Syasuoka * 6a7ca44b8Syasuoka * Permission to use, copy, modify, and distribute this software for any 7a7ca44b8Syasuoka * purpose with or without fee is hereby granted, provided that the above 8a7ca44b8Syasuoka * copyright notice and this permission notice appear in all copies. 9a7ca44b8Syasuoka * 10a7ca44b8Syasuoka * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11a7ca44b8Syasuoka * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12a7ca44b8Syasuoka * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13a7ca44b8Syasuoka * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14a7ca44b8Syasuoka * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15a7ca44b8Syasuoka * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16a7ca44b8Syasuoka * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17a7ca44b8Syasuoka */ 18a7ca44b8Syasuoka #include <sys/types.h> 19a7ca44b8Syasuoka #include <sys/queue.h> 20a7ca44b8Syasuoka #include <sys/uio.h> 21a7ca44b8Syasuoka 22a7ca44b8Syasuoka #include <imsg.h> 23a7ca44b8Syasuoka #include <stdarg.h> 24a7ca44b8Syasuoka #include <stdio.h> 25a7ca44b8Syasuoka #include <string.h> 26a7ca44b8Syasuoka #include <poll.h> 27a7ca44b8Syasuoka #include <errno.h> 28a7ca44b8Syasuoka 29a7ca44b8Syasuoka #include "imsg_subr.h" 30a7ca44b8Syasuoka 31a7ca44b8Syasuoka /* 32dd7efffeSclaudio * Check readability not to spin before calling imsgbuf_read(3). 33dd7efffeSclaudio * Wait 'millisec' until it becomes readable. 34a7ca44b8Syasuoka */ 35a7ca44b8Syasuoka int 36a7ca44b8Syasuoka imsg_sync_read(struct imsgbuf *ibuf, int millisec) 37a7ca44b8Syasuoka { 38a7ca44b8Syasuoka struct pollfd fds[1]; 39a7ca44b8Syasuoka int retval; 40a7ca44b8Syasuoka 41a7ca44b8Syasuoka fds[0].fd = ibuf->fd; 42a7ca44b8Syasuoka fds[0].events = POLLIN; 43a7ca44b8Syasuoka retval = poll(fds, 1, millisec); 44a7ca44b8Syasuoka if (retval == 0) { 45a7ca44b8Syasuoka errno = EAGAIN; 46a7ca44b8Syasuoka return (-1); 47a7ca44b8Syasuoka } 48a7ca44b8Syasuoka if (retval > 0 && (fds[0].revents & POLLIN) != 0) 49dd7efffeSclaudio return imsgbuf_read(ibuf); 50a7ca44b8Syasuoka 51a7ca44b8Syasuoka return (-1); 52a7ca44b8Syasuoka } 53a7ca44b8Syasuoka 54a7ca44b8Syasuoka /* 55dd7efffeSclaudio * Check writability not to spin before calling imsgbuf_flush(3). 56dd7efffeSclaudio * Wait 'millisec' until it becomes writable. 57a7ca44b8Syasuoka */ 58a7ca44b8Syasuoka int 59a7ca44b8Syasuoka imsg_sync_flush(struct imsgbuf *ibuf, int millisec) 60a7ca44b8Syasuoka { 61a7ca44b8Syasuoka struct pollfd fds[1]; 62a7ca44b8Syasuoka int retval; 63a7ca44b8Syasuoka 64*31be28caSclaudio if (imsgbuf_queuelen(ibuf) == 0) 65a7ca44b8Syasuoka return (0); /* already flushed */ 66a7ca44b8Syasuoka 67a7ca44b8Syasuoka fds[0].fd = ibuf->fd; 68a7ca44b8Syasuoka fds[0].events = POLLOUT; 69a7ca44b8Syasuoka retval = poll(fds, 1, millisec); 70a7ca44b8Syasuoka if (retval == 0) { 71a7ca44b8Syasuoka errno = EAGAIN; 72a7ca44b8Syasuoka return (-1); 73a7ca44b8Syasuoka } 74a7ca44b8Syasuoka if (retval > 0 && (fds[0].revents & POLLOUT) != 0) 75dd7efffeSclaudio return imsgbuf_flush(ibuf); 76a7ca44b8Syasuoka 77a7ca44b8Syasuoka return (-1); 78a7ca44b8Syasuoka } 79