xref: /freebsd/usr.sbin/bsdinstall/runconsoles/common.h (revision a2464ee12761660f50d0b6f59f233949ebcacc87)
1*a2464ee1SJessica Clarke /*-
2*a2464ee1SJessica Clarke  * SPDX-License-Identifier: BSD-2-Clause
3*a2464ee1SJessica Clarke  *
4*a2464ee1SJessica Clarke  * Copyright (c) 2022 Jessica Clarke <jrtc27@FreeBSD.org>
5*a2464ee1SJessica Clarke  *
6*a2464ee1SJessica Clarke  * Redistribution and use in source and binary forms, with or without
7*a2464ee1SJessica Clarke  * modification, are permitted provided that the following conditions
8*a2464ee1SJessica Clarke  * are met:
9*a2464ee1SJessica Clarke  * 1. Redistributions of source code must retain the above copyright
10*a2464ee1SJessica Clarke  *    notice, this list of conditions and the following disclaimer.
11*a2464ee1SJessica Clarke  * 2. Redistributions in binary form must reproduce the above copyright
12*a2464ee1SJessica Clarke  *    notice, this list of conditions and the following disclaimer in the
13*a2464ee1SJessica Clarke  *    documentation and/or other materials provided with the distribution.
14*a2464ee1SJessica Clarke  *
15*a2464ee1SJessica Clarke  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*a2464ee1SJessica Clarke  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*a2464ee1SJessica Clarke  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*a2464ee1SJessica Clarke  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*a2464ee1SJessica Clarke  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*a2464ee1SJessica Clarke  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*a2464ee1SJessica Clarke  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*a2464ee1SJessica Clarke  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*a2464ee1SJessica Clarke  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*a2464ee1SJessica Clarke  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*a2464ee1SJessica Clarke  * SUCH DAMAGE.
26*a2464ee1SJessica Clarke  */
27*a2464ee1SJessica Clarke 
28*a2464ee1SJessica Clarke #define	KILL_TIMEOUT	10
29*a2464ee1SJessica Clarke 
30*a2464ee1SJessica Clarke /*
31*a2464ee1SJessica Clarke  * NB: Most of these do not need to be volatile, but a handful are used in
32*a2464ee1SJessica Clarke  * signal handler contexts, so for simplicity we make them all volatile rather
33*a2464ee1SJessica Clarke  * than duplicate the implementation.
34*a2464ee1SJessica Clarke  */
35*a2464ee1SJessica Clarke struct pipe_barrier {
36*a2464ee1SJessica Clarke 	volatile int		fds[2];
37*a2464ee1SJessica Clarke };
38*a2464ee1SJessica Clarke 
39*a2464ee1SJessica Clarke static __inline int
pipe_barrier_init(struct pipe_barrier * p)40*a2464ee1SJessica Clarke pipe_barrier_init(struct pipe_barrier *p)
41*a2464ee1SJessica Clarke {
42*a2464ee1SJessica Clarke 	int error, fds[2], i;
43*a2464ee1SJessica Clarke 
44*a2464ee1SJessica Clarke 	error = pipe(fds);
45*a2464ee1SJessica Clarke 	if (error != 0)
46*a2464ee1SJessica Clarke 		return (error);
47*a2464ee1SJessica Clarke 
48*a2464ee1SJessica Clarke 	for (i = 0; i < 2; ++i)
49*a2464ee1SJessica Clarke 		p->fds[i] = fds[i];
50*a2464ee1SJessica Clarke 
51*a2464ee1SJessica Clarke 	return (0);
52*a2464ee1SJessica Clarke }
53*a2464ee1SJessica Clarke 
54*a2464ee1SJessica Clarke static __inline void
pipe_barrier_wait(struct pipe_barrier * p)55*a2464ee1SJessica Clarke pipe_barrier_wait(struct pipe_barrier *p)
56*a2464ee1SJessica Clarke {
57*a2464ee1SJessica Clarke 	ssize_t ret;
58*a2464ee1SJessica Clarke 	char temp;
59*a2464ee1SJessica Clarke 	int fd;
60*a2464ee1SJessica Clarke 
61*a2464ee1SJessica Clarke 	fd = p->fds[0];
62*a2464ee1SJessica Clarke 	p->fds[0] = -1;
63*a2464ee1SJessica Clarke 	do {
64*a2464ee1SJessica Clarke 		ret = read(fd, &temp, 1);
65*a2464ee1SJessica Clarke 	} while (ret == -1 && errno == EINTR);
66*a2464ee1SJessica Clarke 	close(fd);
67*a2464ee1SJessica Clarke }
68*a2464ee1SJessica Clarke 
69*a2464ee1SJessica Clarke static __inline void
pipe_barrier_ready(struct pipe_barrier * p)70*a2464ee1SJessica Clarke pipe_barrier_ready(struct pipe_barrier *p)
71*a2464ee1SJessica Clarke {
72*a2464ee1SJessica Clarke 	int fd;
73*a2464ee1SJessica Clarke 
74*a2464ee1SJessica Clarke 	fd = p->fds[1];
75*a2464ee1SJessica Clarke 	p->fds[1] = -1;
76*a2464ee1SJessica Clarke 	close(fd);
77*a2464ee1SJessica Clarke }
78*a2464ee1SJessica Clarke 
79*a2464ee1SJessica Clarke static __inline void
pipe_barrier_destroy_impl(struct pipe_barrier * p,int i)80*a2464ee1SJessica Clarke pipe_barrier_destroy_impl(struct pipe_barrier *p, int i)
81*a2464ee1SJessica Clarke {
82*a2464ee1SJessica Clarke 	int fd;
83*a2464ee1SJessica Clarke 
84*a2464ee1SJessica Clarke 	fd = p->fds[i];
85*a2464ee1SJessica Clarke 	if (fd != -1) {
86*a2464ee1SJessica Clarke 		p->fds[i] = -1;
87*a2464ee1SJessica Clarke 		close(fd);
88*a2464ee1SJessica Clarke 	}
89*a2464ee1SJessica Clarke }
90*a2464ee1SJessica Clarke 
91*a2464ee1SJessica Clarke static __inline void
pipe_barrier_destroy_wait(struct pipe_barrier * p)92*a2464ee1SJessica Clarke pipe_barrier_destroy_wait(struct pipe_barrier *p)
93*a2464ee1SJessica Clarke {
94*a2464ee1SJessica Clarke 	pipe_barrier_destroy_impl(p, 0);
95*a2464ee1SJessica Clarke }
96*a2464ee1SJessica Clarke 
97*a2464ee1SJessica Clarke static __inline void
pipe_barrier_destroy_ready(struct pipe_barrier * p)98*a2464ee1SJessica Clarke pipe_barrier_destroy_ready(struct pipe_barrier *p)
99*a2464ee1SJessica Clarke {
100*a2464ee1SJessica Clarke 	pipe_barrier_destroy_impl(p, 1);
101*a2464ee1SJessica Clarke }
102*a2464ee1SJessica Clarke 
103*a2464ee1SJessica Clarke static __inline void
pipe_barrier_destroy(struct pipe_barrier * p)104*a2464ee1SJessica Clarke pipe_barrier_destroy(struct pipe_barrier *p)
105*a2464ee1SJessica Clarke {
106*a2464ee1SJessica Clarke 	pipe_barrier_destroy_wait(p);
107*a2464ee1SJessica Clarke 	pipe_barrier_destroy_ready(p);
108*a2464ee1SJessica Clarke }
109*a2464ee1SJessica Clarke 
110*a2464ee1SJessica Clarke void	reproduce_signal_death(int sig);
111