Blame


1 a596b957 2022-07-14 tracey /*
2 a596b957 2022-07-14 tracey * Copyright (c) 2020-2021 Tracey Emery <tracey@traceyemery.net>
3 a596b957 2022-07-14 tracey * Copyright (c) 2015 Reyk Floeter <reyk@openbsd.org>
4 a596b957 2022-07-14 tracey *
5 a596b957 2022-07-14 tracey * Permission to use, copy, modify, and distribute this software for any
6 a596b957 2022-07-14 tracey * purpose with or without fee is hereby granted, provided that the above
7 a596b957 2022-07-14 tracey * copyright notice and this permission notice appear in all copies.
8 a596b957 2022-07-14 tracey *
9 a596b957 2022-07-14 tracey * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 a596b957 2022-07-14 tracey * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 a596b957 2022-07-14 tracey * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 a596b957 2022-07-14 tracey * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 a596b957 2022-07-14 tracey * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 a596b957 2022-07-14 tracey * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 a596b957 2022-07-14 tracey * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 a596b957 2022-07-14 tracey */
17 a596b957 2022-07-14 tracey
18 a596b957 2022-07-14 tracey #include <sys/types.h>
19 a596b957 2022-07-14 tracey #include <sys/queue.h>
20 a596b957 2022-07-14 tracey #include <sys/time.h>
21 a596b957 2022-07-14 tracey #include <sys/uio.h>
22 a596b957 2022-07-14 tracey #include <sys/socket.h>
23 a596b957 2022-07-14 tracey
24 a596b957 2022-07-14 tracey #include <net/if.h>
25 a596b957 2022-07-14 tracey #include <netinet/in.h>
26 a596b957 2022-07-14 tracey
27 a596b957 2022-07-14 tracey #include <stdio.h>
28 a596b957 2022-07-14 tracey #include <stdlib.h>
29 a596b957 2022-07-14 tracey #include <termios.h>
30 a596b957 2022-07-14 tracey #include <unistd.h>
31 a596b957 2022-07-14 tracey #include <limits.h>
32 a596b957 2022-07-14 tracey #include <string.h>
33 a596b957 2022-07-14 tracey #include <event.h>
34 a596b957 2022-07-14 tracey #include <fcntl.h>
35 a596b957 2022-07-14 tracey #include <util.h>
36 a596b957 2022-07-14 tracey #include <errno.h>
37 a596b957 2022-07-14 tracey #include <imsg.h>
38 a596b957 2022-07-14 tracey
39 a596b957 2022-07-14 tracey #include "got_opentemp.h"
40 df2d3cd2 2023-03-11 op #include "got_reference.h"
41 a596b957 2022-07-14 tracey
42 a596b957 2022-07-14 tracey #include "gotwebd.h"
43 1220d7ea 2024-05-21 op #include "log.h"
44 a596b957 2022-07-14 tracey
45 a596b957 2022-07-14 tracey int
46 a596b957 2022-07-14 tracey config_init(struct gotwebd *env)
47 a596b957 2022-07-14 tracey {
48 2a83fef7 2024-05-27 op int i;
49 2a83fef7 2024-05-27 op
50 f4a5cef1 2023-06-15 op strlcpy(env->httpd_chroot, D_HTTPD_CHROOT, sizeof(env->httpd_chroot));
51 a596b957 2022-07-14 tracey
52 26678add 2023-11-16 op env->prefork_gotwebd = GOTWEBD_NUMPROC;
53 26678add 2023-11-16 op env->server_cnt = 0;
54 26678add 2023-11-16 op TAILQ_INIT(&env->servers);
55 26678add 2023-11-16 op TAILQ_INIT(&env->sockets);
56 36079424 2024-05-16 op TAILQ_INIT(&env->addresses);
57 a596b957 2022-07-14 tracey
58 2a83fef7 2024-05-27 op for (i = 0; i < PRIV_FDS__MAX; i++)
59 2a83fef7 2024-05-27 op env->priv_fd[i] = -1;
60 2a83fef7 2024-05-27 op
61 2a83fef7 2024-05-27 op for (i = 0; i < GOTWEB_PACK_NUM_TEMPFILES; i++)
62 2a83fef7 2024-05-27 op env->pack_fds[i] = -1;
63 2a83fef7 2024-05-27 op
64 f90f59b4 2023-05-17 op return 0;
65 a596b957 2022-07-14 tracey }
66 a596b957 2022-07-14 tracey
67 a596b957 2022-07-14 tracey int
68 a596b957 2022-07-14 tracey config_getcfg(struct gotwebd *env, struct imsg *imsg)
69 a596b957 2022-07-14 tracey {
70 a596b957 2022-07-14 tracey /* nothing to do but tell gotwebd configuration is done */
71 26678add 2023-11-16 op if (sockets_compose_main(env, IMSG_CFG_DONE, NULL, 0) == -1)
72 26678add 2023-11-16 op fatal("sockets_compose_main IMSG_CFG_DONE");
73 f90f59b4 2023-05-17 op return 0;
74 a596b957 2022-07-14 tracey }
75 a596b957 2022-07-14 tracey
76 a596b957 2022-07-14 tracey int
77 a596b957 2022-07-14 tracey config_setserver(struct gotwebd *env, struct server *srv)
78 a596b957 2022-07-14 tracey {
79 26678add 2023-11-16 op if (main_compose_sockets(env, IMSG_CFG_SRV, -1, srv, sizeof(*srv))
80 7e0ec052 2022-09-06 op == -1)
81 26678add 2023-11-16 op fatal("main_compose_sockets IMSG_CFG_SRV");
82 f90f59b4 2023-05-17 op return 0;
83 a596b957 2022-07-14 tracey }
84 a596b957 2022-07-14 tracey
85 a596b957 2022-07-14 tracey int
86 a596b957 2022-07-14 tracey config_getserver(struct gotwebd *env, struct imsg *imsg)
87 a596b957 2022-07-14 tracey {
88 a596b957 2022-07-14 tracey struct server *srv;
89 a596b957 2022-07-14 tracey uint8_t *p = imsg->data;
90 a596b957 2022-07-14 tracey
91 a596b957 2022-07-14 tracey srv = calloc(1, sizeof(*srv));
92 a596b957 2022-07-14 tracey if (srv == NULL)
93 a596b957 2022-07-14 tracey fatalx("%s: calloc", __func__);
94 a596b957 2022-07-14 tracey
95 6e0942f6 2023-11-17 op if (IMSG_DATA_SIZE(imsg) != sizeof(*srv))
96 6e0942f6 2023-11-17 op fatalx("%s: wrong size", __func__);
97 7e0ec052 2022-09-06 op
98 7e0ec052 2022-09-06 op memcpy(srv, p, sizeof(*srv));
99 a596b957 2022-07-14 tracey
100 a596b957 2022-07-14 tracey /* log server info */
101 36079424 2024-05-16 op log_debug("%s: server=%s", __func__, srv->name);
102 a596b957 2022-07-14 tracey
103 2ad48e9a 2022-08-16 stsp TAILQ_INSERT_TAIL(&env->servers, srv, entry);
104 a596b957 2022-07-14 tracey
105 f90f59b4 2023-05-17 op return 0;
106 a596b957 2022-07-14 tracey }
107 a596b957 2022-07-14 tracey
108 a596b957 2022-07-14 tracey int
109 a596b957 2022-07-14 tracey config_setsock(struct gotwebd *env, struct socket *sock)
110 a596b957 2022-07-14 tracey {
111 a596b957 2022-07-14 tracey /* open listening sockets */
112 a596b957 2022-07-14 tracey if (sockets_privinit(env, sock) == -1)
113 a596b957 2022-07-14 tracey return -1;
114 a596b957 2022-07-14 tracey
115 26678add 2023-11-16 op if (main_compose_sockets(env, IMSG_CFG_SOCK, sock->fd,
116 26678add 2023-11-16 op &sock->conf, sizeof(sock->conf)) == -1)
117 26678add 2023-11-16 op fatal("main_compose_sockets IMSG_CFG_SOCK");
118 a596b957 2022-07-14 tracey
119 26678add 2023-11-16 op sock->fd = -1;
120 f90f59b4 2023-05-17 op return 0;
121 a596b957 2022-07-14 tracey }
122 a596b957 2022-07-14 tracey
123 a596b957 2022-07-14 tracey int
124 a596b957 2022-07-14 tracey config_getsock(struct gotwebd *env, struct imsg *imsg)
125 a596b957 2022-07-14 tracey {
126 a596b957 2022-07-14 tracey struct socket *sock = NULL;
127 a596b957 2022-07-14 tracey struct socket_conf sock_conf;
128 a596b957 2022-07-14 tracey uint8_t *p = imsg->data;
129 a596b957 2022-07-14 tracey
130 6e0942f6 2023-11-17 op if (IMSG_DATA_SIZE(imsg) != sizeof(sock_conf))
131 6e0942f6 2023-11-17 op fatalx("%s: wrong size", __func__);
132 6e0942f6 2023-11-17 op
133 a596b957 2022-07-14 tracey memcpy(&sock_conf, p, sizeof(sock_conf));
134 a596b957 2022-07-14 tracey
135 a596b957 2022-07-14 tracey if (IMSG_DATA_SIZE(imsg) != sizeof(sock_conf)) {
136 a596b957 2022-07-14 tracey log_debug("%s: imsg size error", __func__);
137 a596b957 2022-07-14 tracey return 1;
138 a596b957 2022-07-14 tracey }
139 a596b957 2022-07-14 tracey
140 a596b957 2022-07-14 tracey /* create a new socket */
141 a596b957 2022-07-14 tracey if ((sock = calloc(1, sizeof(*sock))) == NULL) {
142 a596b957 2022-07-14 tracey return 1;
143 a596b957 2022-07-14 tracey }
144 a596b957 2022-07-14 tracey
145 a596b957 2022-07-14 tracey memcpy(&sock->conf, &sock_conf, sizeof(sock->conf));
146 2c52c623 2024-01-30 op sock->fd = imsg_get_fd(imsg);
147 a596b957 2022-07-14 tracey
148 2ad48e9a 2022-08-16 stsp TAILQ_INSERT_TAIL(&env->sockets, sock, entry);
149 a596b957 2022-07-14 tracey
150 a596b957 2022-07-14 tracey /* log new socket info */
151 36079424 2024-05-16 op log_debug("%s: id=%d af_type=%s socket_path=%s",
152 36079424 2024-05-16 op __func__, sock->conf.id,
153 4fcc9f74 2022-08-16 stsp sock->conf.af_type == AF_UNIX ? "unix" :
154 4fcc9f74 2022-08-16 stsp (sock->conf.af_type == AF_INET ? "inet" :
155 4fcc9f74 2022-08-16 stsp (sock->conf.af_type == AF_INET6 ? "inet6" : "unknown")),
156 4448825a 2023-06-16 op *sock->conf.unix_socket_name != '\0' ?
157 a596b957 2022-07-14 tracey sock->conf.unix_socket_name : "none");
158 a596b957 2022-07-14 tracey
159 f90f59b4 2023-05-17 op return 0;
160 a596b957 2022-07-14 tracey }
161 a596b957 2022-07-14 tracey
162 a596b957 2022-07-14 tracey int
163 2a83fef7 2024-05-27 op config_setfd(struct gotwebd *env)
164 a596b957 2022-07-14 tracey {
165 58cdb97c 2023-11-16 op int i, j, ret, fd;
166 a596b957 2022-07-14 tracey
167 a596b957 2022-07-14 tracey log_debug("%s: Allocating %d file descriptors",
168 0f91044a 2022-07-22 stsp __func__, PRIV_FDS__MAX + GOTWEB_PACK_NUM_TEMPFILES);
169 a596b957 2022-07-14 tracey
170 26678add 2023-11-16 op for (i = 0; i < PRIV_FDS__MAX + GOTWEB_PACK_NUM_TEMPFILES; i++) {
171 58cdb97c 2023-11-16 op for (j = 0; j < env->nserver; ++j) {
172 58cdb97c 2023-11-16 op fd = got_opentempfd();
173 58cdb97c 2023-11-16 op if (fd == -1)
174 58cdb97c 2023-11-16 op fatal("got_opentemp");
175 58cdb97c 2023-11-16 op if (imsg_compose_event(&env->iev_server[j],
176 2a83fef7 2024-05-27 op IMSG_CFG_FD, 0, -1, fd, NULL, 0) == -1)
177 58cdb97c 2023-11-16 op fatal("imsg_compose_event IMSG_CFG_FD");
178 58cdb97c 2023-11-16 op
179 58cdb97c 2023-11-16 op do {
180 58cdb97c 2023-11-16 op ret = imsg_flush(&env->iev_server[j].ibuf);
181 58cdb97c 2023-11-16 op } while (ret == -1 && errno == EAGAIN);
182 58cdb97c 2023-11-16 op if (ret == -1)
183 58cdb97c 2023-11-16 op fatal("imsg_flush");
184 58cdb97c 2023-11-16 op imsg_event_add(&env->iev_server[j]);
185 58cdb97c 2023-11-16 op }
186 a596b957 2022-07-14 tracey }
187 26678add 2023-11-16 op
188 a596b957 2022-07-14 tracey return 0;
189 a596b957 2022-07-14 tracey }
190 a596b957 2022-07-14 tracey
191 a596b957 2022-07-14 tracey int
192 a596b957 2022-07-14 tracey config_getfd(struct gotwebd *env, struct imsg *imsg)
193 a596b957 2022-07-14 tracey {
194 2a83fef7 2024-05-27 op int match = 0, i, j;
195 2a83fef7 2024-05-27 op const int nfds = GOTWEB_PACK_NUM_TEMPFILES + PRIV_FDS__MAX;
196 a596b957 2022-07-14 tracey
197 2a83fef7 2024-05-27 op if (imsg_get_len(imsg) != 0)
198 6e0942f6 2023-11-17 op fatalx("%s: wrong size", __func__);
199 6e0942f6 2023-11-17 op
200 2a83fef7 2024-05-27 op for (i = 0; i < nfds; i++) {
201 2a83fef7 2024-05-27 op if (i < PRIV_FDS__MAX && env->priv_fd[i] == -1) {
202 2a83fef7 2024-05-27 op env->priv_fd[i] = imsg_get_fd(imsg);
203 2a83fef7 2024-05-27 op log_debug("%s: assigning priv_fd %d",
204 2a83fef7 2024-05-27 op __func__, env->priv_fd[i]);
205 2a83fef7 2024-05-27 op match = 1;
206 2a83fef7 2024-05-27 op break;
207 2a83fef7 2024-05-27 op }
208 a596b957 2022-07-14 tracey
209 2a83fef7 2024-05-27 op j = i - PRIV_FDS__MAX;
210 2a83fef7 2024-05-27 op if (env->pack_fds[j] == -1) {
211 2a83fef7 2024-05-27 op env->pack_fds[j] = imsg_get_fd(imsg);
212 2a83fef7 2024-05-27 op log_debug("%s: assigning pack_fd %d",
213 2a83fef7 2024-05-27 op __func__, env->pack_fds[j]);
214 2a83fef7 2024-05-27 op match = 1;
215 2a83fef7 2024-05-27 op break;
216 a596b957 2022-07-14 tracey }
217 a596b957 2022-07-14 tracey }
218 a596b957 2022-07-14 tracey
219 a596b957 2022-07-14 tracey if (match)
220 f90f59b4 2023-05-17 op return 0;
221 a596b957 2022-07-14 tracey else
222 a596b957 2022-07-14 tracey return 1;
223 a596b957 2022-07-14 tracey }