xref: /openbsd/usr.sbin/vmd/proc.h (revision 00ee6dc4)
1 /*	$OpenBSD: proc.h,v 1.24 2024/02/20 21:40:37 dv Exp $	*/
2 
3 /*
4  * Copyright (c) 2010-2015 Reyk Floeter <reyk@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/queue.h>
20 #include <sys/socket.h>
21 #include <sys/uio.h>
22 
23 #include <event.h>
24 #include <imsg.h>
25 
26 #ifndef _PROC_H
27 #define _PROC_H
28 
29 enum {
30 	IMSG_NONE,
31 	IMSG_CTL_OK,
32 	IMSG_CTL_FAIL,
33 	IMSG_CTL_VERBOSE,
34 	IMSG_CTL_END,
35 	IMSG_CTL_RESET,
36 	IMSG_CTL_PROCFD,
37 	IMSG_PROC_MAX
38 };
39 
40 /* imsg */
41 struct imsgev {
42 	struct imsgbuf		 ibuf;
43 	void			(*handler)(int, short, void *);
44 	struct event		 ev;
45 	struct privsep_proc	*proc;
46 	void			*data;
47 	short			 events;
48 };
49 
50 #define IMSG_SIZE_CHECK(imsg, p) do {					\
51 	if (IMSG_DATA_SIZE(imsg) < sizeof(*p))				\
52 		fatalx("bad length imsg received (%s)",	#p);		\
53 } while (0)
54 #define IMSG_DATA_SIZE(imsg)	((imsg)->hdr.len - IMSG_HEADER_SIZE)
55 
56 /* control socket */
57 struct control_sock {
58 	const char	*cs_name;
59 	struct event	 cs_ev;
60 	struct event	 cs_evt;
61 	int		 cs_fd;
62 	int		 cs_restricted;
63 	void		*cs_env;
64 	uid_t		 cs_uid;
65 	gid_t		 cs_gid;
66 
67 	TAILQ_ENTRY(control_sock) cs_entry;
68 };
69 TAILQ_HEAD(control_socks, control_sock);
70 
71 struct ctl_conn {
72 	TAILQ_ENTRY(ctl_conn)	 entry;
73 	struct imsgev		 iev;
74 	struct sockpeercred	 peercred;
75 };
76 TAILQ_HEAD(ctl_connlist, ctl_conn);
77 
78 /* privsep */
79 enum privsep_procid {
80 	PROC_PARENT	= 0,
81 	PROC_CONTROL,
82 	PROC_AGENTX,
83 	PROC_VMM,
84 	PROC_PRIV,
85 	PROC_MAX,
86 };
87 extern enum privsep_procid privsep_process;
88 
89 #define CONFIG_RELOAD		0x00
90 #define CONFIG_VMS		0x01
91 #define CONFIG_SWITCHES		0x02
92 #define CONFIG_ALL		0xff
93 
94 struct privsep_pipes {
95 	int				*pp_pipes[PROC_MAX];
96 };
97 
98 struct privsep {
99 	struct privsep_pipes		*ps_pipes[PROC_MAX];
100 	struct privsep_pipes		*ps_pp;
101 
102 	struct imsgev			*ps_ievs[PROC_MAX];
103 	const char			*ps_title[PROC_MAX];
104 	uint8_t				 ps_what[PROC_MAX];
105 
106 	struct passwd			*ps_pw;
107 	int				 ps_noaction;
108 
109 	struct control_sock		 ps_csock;
110 	struct control_socks		 ps_rcsocks;
111 
112 	unsigned int			 ps_instances[PROC_MAX];
113 	unsigned int			 ps_instance;
114 
115 	/* Event and signal handlers */
116 	struct event			 ps_evsigint;
117 	struct event			 ps_evsigterm;
118 	struct event			 ps_evsigchld;
119 	struct event			 ps_evsighup;
120 	struct event			 ps_evsigpipe;
121 	struct event			 ps_evsigusr1;
122 
123 	void				*ps_env;
124 };
125 
126 struct privsep_proc {
127 	const char		*p_title;
128 	enum privsep_procid	 p_id;
129 	int			(*p_cb)(int, struct privsep_proc *,
130 				    struct imsg *);
131 	void			(*p_init)(struct privsep *,
132 				    struct privsep_proc *);
133 	void			(*p_shutdown)(void);
134 	const char		*p_chroot;
135 	struct passwd		*p_pw;
136 	struct privsep		*p_ps;
137 };
138 
139 struct privsep_fd {
140 	enum privsep_procid		 pf_procid;
141 	unsigned int			 pf_instance;
142 };
143 
144 #if DEBUG
145 #define DPRINTF		log_debug
146 #else
147 #define DPRINTF(x...)	do {} while(0)
148 #endif
149 
150 #define PROC_PARENT_SOCK_FILENO	3
151 #define PROC_MAX_INSTANCES	32
152 
153 /* proc.c */
154 void	 proc_init(struct privsep *, struct privsep_proc *, unsigned int, int,
155 	    int, char **, enum privsep_procid);
156 void	 proc_kill(struct privsep *);
157 void	 proc_connect(struct privsep *ps);
158 void	 proc_dispatch(int, short event, void *);
159 void	 proc_run(struct privsep *, struct privsep_proc *,
160 	    struct privsep_proc *, unsigned int,
161 	    void (*)(struct privsep *, struct privsep_proc *, void *), void *);
162 void	 imsg_event_add(struct imsgev *);
163 void	 imsg_event_add2(struct imsgev *, struct event_base *);
164 int	 imsg_compose_event(struct imsgev *, uint16_t, uint32_t,
165 	    pid_t, int, void *, uint16_t);
166 int	 imsg_compose_event2(struct imsgev *, uint16_t, uint32_t,
167     	    pid_t, int, void *, uint16_t, struct event_base *);
168 int	 imsg_composev_event(struct imsgev *, uint16_t, uint32_t,
169 	    pid_t, int, const struct iovec *, int);
170 int	 proc_compose_imsg(struct privsep *, enum privsep_procid, int,
171 	    uint16_t, uint32_t, int, void *, uint16_t);
172 int	 proc_compose(struct privsep *, enum privsep_procid,
173 	    uint16_t, void *data, uint16_t);
174 int	 proc_composev_imsg(struct privsep *, enum privsep_procid, int,
175 	    uint16_t, uint32_t, int, const struct iovec *, int);
176 int	 proc_composev(struct privsep *, enum privsep_procid,
177 	    uint16_t, const struct iovec *, int);
178 int	 proc_forward_imsg(struct privsep *, struct imsg *,
179 	    enum privsep_procid, int);
180 struct imsgbuf *
181 	 proc_ibuf(struct privsep *, enum privsep_procid, int);
182 struct imsgev *
183 	 proc_iev(struct privsep *, enum privsep_procid, int);
184 enum privsep_procid
185 	 proc_getid(struct privsep_proc *, unsigned int, const char *);
186 int	 proc_flush_imsg(struct privsep *, enum privsep_procid, int);
187 
188 /* control.c */
189 void	 control(struct privsep *, struct privsep_proc *);
190 int	 control_init(struct privsep *, struct control_sock *);
191 int	 control_reset(struct control_sock *);
192 int	 control_listen(struct control_sock *);
193 
194 /* log.c */
195 void	log_init(int, int);
196 void	log_procinit(const char *, ...);
197 void	log_setverbose(int);
198 int	log_getverbose(void);
199 void	log_warn(const char *, ...)
200 	    __attribute__((__format__ (printf, 1, 2)));
201 void	log_warnx(const char *, ...)
202 	    __attribute__((__format__ (printf, 1, 2)));
203 void	log_info(const char *, ...)
204 	    __attribute__((__format__ (printf, 1, 2)));
205 void	log_debug(const char *, ...)
206 	    __attribute__((__format__ (printf, 1, 2)));
207 void	logit(int, const char *, ...)
208 	    __attribute__((__format__ (printf, 2, 3)));
209 void	vlog(int, const char *, va_list)
210 	    __attribute__((__format__ (printf, 2, 0)));
211 __dead void fatal(const char *, ...)
212 	    __attribute__((__format__ (printf, 1, 2)));
213 __dead void fatalx(const char *, ...)
214 	    __attribute__((__format__ (printf, 1, 2)));
215 
216 #endif /* _PROC_H */
217