xref: /openbsd-src/usr.sbin/radiusd/imsg_subr.c (revision 31be28ca73295d552a2d384f01903581ed4a45be)
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