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>
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.
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.
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>
24 a596b957 2022-07-14 tracey #include <net/if.h>
25 a596b957 2022-07-14 tracey #include <netinet/in.h>
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>
39 a596b957 2022-07-14 tracey #include "got_opentemp.h"
40 df2d3cd2 2023-03-11 op #include "got_reference.h"
42 a596b957 2022-07-14 tracey #include "gotwebd.h"
45 a596b957 2022-07-14 tracey config_init(struct gotwebd *env)
47 f4a5cef1 2023-06-15 op strlcpy(env->httpd_chroot, D_HTTPD_CHROOT, sizeof(env->httpd_chroot));
49 26678add 2023-11-16 op env->prefork_gotwebd = GOTWEBD_NUMPROC;
50 26678add 2023-11-16 op env->server_cnt = 0;
51 26678add 2023-11-16 op TAILQ_INIT(&env->servers);
52 26678add 2023-11-16 op TAILQ_INIT(&env->sockets);
58 a596b957 2022-07-14 tracey config_getcfg(struct gotwebd *env, struct imsg *imsg)
60 a596b957 2022-07-14 tracey /* nothing to do but tell gotwebd configuration is done */
61 26678add 2023-11-16 op if (sockets_compose_main(env, IMSG_CFG_DONE, NULL, 0) == -1)
62 26678add 2023-11-16 op fatal("sockets_compose_main IMSG_CFG_DONE");
67 a596b957 2022-07-14 tracey config_setserver(struct gotwebd *env, struct server *srv)
69 26678add 2023-11-16 op if (main_compose_sockets(env, IMSG_CFG_SRV, -1, srv, sizeof(*srv))
71 26678add 2023-11-16 op fatal("main_compose_sockets IMSG_CFG_SRV");
76 a596b957 2022-07-14 tracey config_getserver(struct gotwebd *env, struct imsg *imsg)
78 a596b957 2022-07-14 tracey struct server *srv;
79 a596b957 2022-07-14 tracey uint8_t *p = imsg->data;
81 a596b957 2022-07-14 tracey srv = calloc(1, sizeof(*srv));
82 a596b957 2022-07-14 tracey if (srv == NULL)
83 a596b957 2022-07-14 tracey fatalx("%s: calloc", __func__);
85 26678add 2023-11-16 op IMSG_SIZE_CHECK(imsg, srv);
87 7e0ec052 2022-09-06 op memcpy(srv, p, sizeof(*srv));
88 7e0ec052 2022-09-06 op srv->cached_repos = calloc(GOTWEBD_REPO_CACHESIZE,
89 7e0ec052 2022-09-06 op sizeof(*srv->cached_repos));
90 7e0ec052 2022-09-06 op if (srv->cached_repos == NULL)
91 7e0ec052 2022-09-06 op fatal("%s: calloc", __func__);
92 7e0ec052 2022-09-06 op srv->ncached_repos = 0;
94 a596b957 2022-07-14 tracey /* log server info */
95 a596b957 2022-07-14 tracey log_debug("%s: server=%s fcgi_socket=%s unix_socket=%s", __func__,
96 a596b957 2022-07-14 tracey srv->name, srv->fcgi_socket ? "yes" : "no", srv->unix_socket ?
97 a596b957 2022-07-14 tracey "yes" : "no");
99 2ad48e9a 2022-08-16 stsp TAILQ_INSERT_TAIL(&env->servers, srv, entry);
105 a596b957 2022-07-14 tracey config_setsock(struct gotwebd *env, struct socket *sock)
107 a596b957 2022-07-14 tracey /* open listening sockets */
108 a596b957 2022-07-14 tracey if (sockets_privinit(env, sock) == -1)
109 a596b957 2022-07-14 tracey return -1;
111 26678add 2023-11-16 op if (main_compose_sockets(env, IMSG_CFG_SOCK, sock->fd,
112 26678add 2023-11-16 op &sock->conf, sizeof(sock->conf)) == -1)
113 26678add 2023-11-16 op fatal("main_compose_sockets IMSG_CFG_SOCK");
115 26678add 2023-11-16 op sock->fd = -1;
120 a596b957 2022-07-14 tracey config_getsock(struct gotwebd *env, struct imsg *imsg)
122 a596b957 2022-07-14 tracey struct socket *sock = NULL;
123 a596b957 2022-07-14 tracey struct socket_conf sock_conf;
124 a596b957 2022-07-14 tracey uint8_t *p = imsg->data;
127 a596b957 2022-07-14 tracey IMSG_SIZE_CHECK(imsg, &sock_conf);
128 a596b957 2022-07-14 tracey memcpy(&sock_conf, p, sizeof(sock_conf));
130 a596b957 2022-07-14 tracey if (IMSG_DATA_SIZE(imsg) != sizeof(sock_conf)) {
131 a596b957 2022-07-14 tracey log_debug("%s: imsg size error", __func__);
132 a596b957 2022-07-14 tracey return 1;
135 a596b957 2022-07-14 tracey /* create a new socket */
136 a596b957 2022-07-14 tracey if ((sock = calloc(1, sizeof(*sock))) == NULL) {
137 a596b957 2022-07-14 tracey if (imsg->fd != -1)
138 a596b957 2022-07-14 tracey close(imsg->fd);
139 a596b957 2022-07-14 tracey return 1;
142 a596b957 2022-07-14 tracey memcpy(&sock->conf, &sock_conf, sizeof(sock->conf));
143 a596b957 2022-07-14 tracey sock->fd = imsg->fd;
145 2ad48e9a 2022-08-16 stsp TAILQ_INSERT_TAIL(&env->sockets, sock, entry);
147 a596b957 2022-07-14 tracey for (i = 0; i < PRIV_FDS__MAX; i++)
148 a596b957 2022-07-14 tracey sock->priv_fd[i] = -1;
150 0f91044a 2022-07-22 stsp for (i = 0; i < GOTWEB_PACK_NUM_TEMPFILES; i++)
151 a596b957 2022-07-14 tracey sock->pack_fds[i] = -1;
153 a596b957 2022-07-14 tracey /* log new socket info */
154 4fcc9f74 2022-08-16 stsp log_debug("%s: name=%s id=%d server=%s af_type=%s socket_path=%s",
155 a596b957 2022-07-14 tracey __func__, sock->conf.name, sock->conf.id, sock->conf.srv_name,
156 4fcc9f74 2022-08-16 stsp sock->conf.af_type == AF_UNIX ? "unix" :
157 4fcc9f74 2022-08-16 stsp (sock->conf.af_type == AF_INET ? "inet" :
158 4fcc9f74 2022-08-16 stsp (sock->conf.af_type == AF_INET6 ? "inet6" : "unknown")),
159 4448825a 2023-06-16 op *sock->conf.unix_socket_name != '\0' ?
160 a596b957 2022-07-14 tracey sock->conf.unix_socket_name : "none");
166 a596b957 2022-07-14 tracey config_setfd(struct gotwebd *env, struct socket *sock)
170 a596b957 2022-07-14 tracey log_debug("%s: Allocating %d file descriptors",
171 0f91044a 2022-07-22 stsp __func__, PRIV_FDS__MAX + GOTWEB_PACK_NUM_TEMPFILES);
173 26678add 2023-11-16 op for (i = 0; i < PRIV_FDS__MAX + GOTWEB_PACK_NUM_TEMPFILES; i++) {
174 26678add 2023-11-16 op fd = got_opentempfd();
175 26678add 2023-11-16 op if (fd == -1)
176 26678add 2023-11-16 op fatal("got_opentemp");
177 26678add 2023-11-16 op if (main_compose_sockets(env, IMSG_CFG_FD, fd,
178 26678add 2023-11-16 op &sock->conf.id, sizeof(sock->conf.id)) == -1)
179 26678add 2023-11-16 op fatal("main_compose_sockets IMSG_CFG_FD");
182 a596b957 2022-07-14 tracey return 0;
186 a596b957 2022-07-14 tracey config_getfd(struct gotwebd *env, struct imsg *imsg)
188 a596b957 2022-07-14 tracey struct socket *sock;
189 a596b957 2022-07-14 tracey uint8_t *p = imsg->data;
190 a596b957 2022-07-14 tracey int sock_id, match = 0, i;
192 a596b957 2022-07-14 tracey IMSG_SIZE_CHECK(imsg, &sock_id);
193 a596b957 2022-07-14 tracey memcpy(&sock_id, p, sizeof(sock_id));
195 2ad48e9a 2022-08-16 stsp TAILQ_FOREACH(sock, &env->sockets, entry) {
196 0f91044a 2022-07-22 stsp const int nfds = (GOTWEB_PACK_NUM_TEMPFILES + PRIV_FDS__MAX);
197 0f91044a 2022-07-22 stsp for (i = 0; i < nfds; i++) {
198 a596b957 2022-07-14 tracey if (i < PRIV_FDS__MAX && sock->priv_fd[i] == -1) {
199 a596b957 2022-07-14 tracey log_debug("%s: assigning socket %d priv_fd %d",
200 a596b957 2022-07-14 tracey __func__, sock_id, imsg->fd);
201 a596b957 2022-07-14 tracey sock->priv_fd[i] = imsg->fd;
202 a596b957 2022-07-14 tracey match = 1;
205 a596b957 2022-07-14 tracey if (sock->pack_fds[i - PRIV_FDS__MAX] == -1) {
206 a596b957 2022-07-14 tracey log_debug("%s: assigning socket %d pack_fd %d",
207 a596b957 2022-07-14 tracey __func__, sock_id, imsg->fd);
208 a596b957 2022-07-14 tracey sock->pack_fds[i - PRIV_FDS__MAX] = imsg->fd;
209 a596b957 2022-07-14 tracey match = 1;
215 a596b957 2022-07-14 tracey if (match)
218 a596b957 2022-07-14 tracey return 1;