Blame


1 b0a6bcf7 2022-09-13 op /*
2 b0a6bcf7 2022-09-13 op * Copyright (c) 2022 Omar Polo <op@omarpolo.com>
3 b0a6bcf7 2022-09-13 op * Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org>
4 b0a6bcf7 2022-09-13 op * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
5 b0a6bcf7 2022-09-13 op * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
6 b0a6bcf7 2022-09-13 op *
7 b0a6bcf7 2022-09-13 op * Permission to use, copy, modify, and distribute this software for any
8 b0a6bcf7 2022-09-13 op * purpose with or without fee is hereby granted, provided that the above
9 b0a6bcf7 2022-09-13 op * copyright notice and this permission notice appear in all copies.
10 b0a6bcf7 2022-09-13 op *
11 b0a6bcf7 2022-09-13 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 b0a6bcf7 2022-09-13 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 b0a6bcf7 2022-09-13 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 b0a6bcf7 2022-09-13 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 b0a6bcf7 2022-09-13 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 b0a6bcf7 2022-09-13 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 b0a6bcf7 2022-09-13 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 b0a6bcf7 2022-09-13 op */
19 b0a6bcf7 2022-09-13 op
20 b0a6bcf7 2022-09-13 op #ifndef nitems
21 b0a6bcf7 2022-09-13 op #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
22 b0a6bcf7 2022-09-13 op #endif
23 b0a6bcf7 2022-09-13 op
24 83f0f95a 2022-09-29 op #ifndef GALILEO_USER
25 b0a6bcf7 2022-09-13 op #define GALILEO_USER "www"
26 83f0f95a 2022-09-29 op #endif
27 83f0f95a 2022-09-29 op
28 83f0f95a 2022-09-29 op #ifndef GALILEO_CONF
29 83f0f95a 2022-09-29 op #define GALILEO_CONF "/etc/galileo.conf"
30 83f0f95a 2022-09-29 op #endif
31 83f0f95a 2022-09-29 op
32 83f0f95a 2022-09-29 op #ifndef GALILEO_SOCK
33 b0a6bcf7 2022-09-13 op #define GALILEO_SOCK "/var/www/run/galileo.sock"
34 83f0f95a 2022-09-29 op #endif
35 83f0f95a 2022-09-29 op
36 b0a6bcf7 2022-09-13 op #define FD_RESERVE 5
37 b0a6bcf7 2022-09-13 op #define PROC_MAX_INSTANCES 32
38 b0a6bcf7 2022-09-13 op #define PROXY_NUMPROC 3
39 b0a6bcf7 2022-09-13 op #define PROC_PARENT_SOCK_FILENO 3
40 28239bac 2022-09-20 op #define GEMINI_MAXLEN (1024 + 1) /* NULL */
41 8857131d 2022-09-20 op #define FORM_URLENCODED "application/x-www-form-urlencoded"
42 b0a6bcf7 2022-09-13 op
43 58022b94 2022-09-30 op #ifdef DEBUG
44 58022b94 2022-09-30 op #define DPRINTF log_debug
45 58022b94 2022-09-30 op #else
46 58022b94 2022-09-30 op #define DPRINTF(x...) do {} while (0)
47 58022b94 2022-09-30 op #endif
48 58022b94 2022-09-30 op
49 b0a6bcf7 2022-09-13 op enum {
50 8857131d 2022-09-20 op METHOD_UNKNOWN,
51 8857131d 2022-09-20 op METHOD_GET,
52 8857131d 2022-09-20 op METHOD_POST,
53 8857131d 2022-09-20 op };
54 8857131d 2022-09-20 op
55 8857131d 2022-09-20 op enum {
56 b0a6bcf7 2022-09-13 op IMSG_NONE,
57 b0a6bcf7 2022-09-13 op IMSG_CFG_START,
58 b0a6bcf7 2022-09-13 op IMSG_CFG_SRV,
59 b0a6bcf7 2022-09-13 op IMSG_CFG_SOCK,
60 b0a6bcf7 2022-09-13 op IMSG_CFG_DONE,
61 b0a6bcf7 2022-09-13 op IMSG_CTL_START,
62 b0a6bcf7 2022-09-13 op IMSG_CTL_RESET,
63 b0a6bcf7 2022-09-13 op IMSG_CTL_RESTART,
64 b0a6bcf7 2022-09-13 op IMSG_CTL_PROCFD,
65 b0a6bcf7 2022-09-13 op };
66 b0a6bcf7 2022-09-13 op
67 b0a6bcf7 2022-09-13 op struct galileo;
68 b0a6bcf7 2022-09-13 op struct proxy_config;
69 b0a6bcf7 2022-09-13 op
70 b0a6bcf7 2022-09-13 op struct imsg;
71 b0a6bcf7 2022-09-13 op struct privsep;
72 b0a6bcf7 2022-09-13 op struct privsep_proc;
73 bff58270 2022-09-19 op struct template;
74 b0a6bcf7 2022-09-13 op struct tls;
75 b0a6bcf7 2022-09-13 op
76 b0a6bcf7 2022-09-13 op struct client {
77 b0a6bcf7 2022-09-13 op uint32_t clt_id;
78 b0a6bcf7 2022-09-13 op int clt_fd;
79 b0a6bcf7 2022-09-13 op struct fcgi *clt_fcgi;
80 b0a6bcf7 2022-09-13 op char *clt_server_name;
81 b0a6bcf7 2022-09-13 op char *clt_script_name;
82 b0a6bcf7 2022-09-13 op char *clt_path_info;
83 28239bac 2022-09-20 op char *clt_query;
84 8857131d 2022-09-20 op int clt_method;
85 8857131d 2022-09-20 op int clt_bodydone;
86 8857131d 2022-09-20 op char *clt_body;
87 8857131d 2022-09-20 op int clt_bodylen;
88 b0a6bcf7 2022-09-13 op struct proxy_config *clt_pc;
89 b0a6bcf7 2022-09-13 op struct event_asr *clt_evasr;
90 b0a6bcf7 2022-09-13 op struct addrinfo *clt_addrinfo;
91 b0a6bcf7 2022-09-13 op struct addrinfo *clt_p;
92 b0a6bcf7 2022-09-13 op struct event clt_evconn;
93 b0a6bcf7 2022-09-13 op int clt_evconn_live;
94 b0a6bcf7 2022-09-13 op struct tls *clt_ctx;
95 b0a6bcf7 2022-09-13 op struct bufferevent *clt_bev;
96 b0a6bcf7 2022-09-13 op int clt_headersdone;
97 bff58270 2022-09-19 op struct template *clt_tp;
98 b9de0a74 2022-09-14 op
99 b9de0a74 2022-09-14 op #define TR_ENABLED 0x1
100 b9de0a74 2022-09-14 op #define TR_PRE 0x2
101 b9de0a74 2022-09-14 op #define TR_LIST 0x4
102 b9de0a74 2022-09-14 op #define TR_NAV 0x8
103 c9dc4bc6 2022-09-13 op int clt_translate;
104 b0a6bcf7 2022-09-13 op
105 b0a6bcf7 2022-09-13 op char clt_buf[1024];
106 b0a6bcf7 2022-09-13 op size_t clt_buflen;
107 b0a6bcf7 2022-09-13 op
108 b0a6bcf7 2022-09-13 op SPLAY_ENTRY(client) clt_nodes;
109 b0a6bcf7 2022-09-13 op };
110 b0a6bcf7 2022-09-13 op SPLAY_HEAD(client_tree, client);
111 b0a6bcf7 2022-09-13 op
112 b0a6bcf7 2022-09-13 op struct fcgi {
113 b0a6bcf7 2022-09-13 op uint32_t fcg_id;
114 b0a6bcf7 2022-09-13 op int fcg_s;
115 b0a6bcf7 2022-09-13 op struct client_tree fcg_clients;
116 b0a6bcf7 2022-09-13 op struct bufferevent *fcg_bev;
117 b0a6bcf7 2022-09-13 op int fcg_toread;
118 b0a6bcf7 2022-09-13 op int fcg_want;
119 b0a6bcf7 2022-09-13 op int fcg_padding;
120 b0a6bcf7 2022-09-13 op int fcg_type;
121 b0a6bcf7 2022-09-13 op uint16_t fcg_rec_id;
122 b0a6bcf7 2022-09-13 op int fcg_keep_conn;
123 247917be 2022-09-14 op int fcg_done;
124 b0a6bcf7 2022-09-13 op
125 b0a6bcf7 2022-09-13 op struct galileo *fcg_env;
126 b0a6bcf7 2022-09-13 op
127 b0a6bcf7 2022-09-13 op SPLAY_ENTRY(fcgi) fcg_nodes;
128 b0a6bcf7 2022-09-13 op };
129 b0a6bcf7 2022-09-13 op SPLAY_HEAD(fcgi_tree, fcgi);
130 b0a6bcf7 2022-09-13 op
131 b0a6bcf7 2022-09-13 op struct proxy_config {
132 b0a6bcf7 2022-09-13 op char host[HOST_NAME_MAX + 1];
133 b0a6bcf7 2022-09-13 op char stylesheet[PATH_MAX];
134 b0a6bcf7 2022-09-13 op char proxy_addr[HOST_NAME_MAX + 1];
135 b0a6bcf7 2022-09-13 op char proxy_name[HOST_NAME_MAX + 1];
136 26cd3e9d 2022-09-23 op char proxy_port[6];
137 c743c9a1 2022-09-23 op int no_tls;
138 b0a6bcf7 2022-09-13 op };
139 b0a6bcf7 2022-09-13 op
140 afb86b2c 2022-09-23 op struct proxy {
141 afb86b2c 2022-09-23 op TAILQ_ENTRY(proxy) pr_entry;
142 afb86b2c 2022-09-23 op struct proxy_config pr_conf;
143 b0a6bcf7 2022-09-13 op };
144 afb86b2c 2022-09-23 op TAILQ_HEAD(proxylist, proxy);
145 b0a6bcf7 2022-09-13 op
146 b0a6bcf7 2022-09-13 op struct galileo {
147 b0a6bcf7 2022-09-13 op char sc_conffile[PATH_MAX];
148 b0a6bcf7 2022-09-13 op uint16_t sc_prefork;
149 b0a6bcf7 2022-09-13 op char sc_chroot[PATH_MAX];
150 afb86b2c 2022-09-23 op struct proxylist sc_proxies;
151 b0a6bcf7 2022-09-13 op struct fcgi_tree sc_fcgi_socks;
152 b0a6bcf7 2022-09-13 op
153 b0a6bcf7 2022-09-13 op struct privsep *sc_ps;
154 b0a6bcf7 2022-09-13 op int sc_reload;
155 b0a6bcf7 2022-09-13 op
156 b0a6bcf7 2022-09-13 op /* XXX: generalize */
157 b0a6bcf7 2022-09-13 op int sc_sock_fd;
158 b0a6bcf7 2022-09-13 op struct event sc_evsock;
159 b0a6bcf7 2022-09-13 op struct event sc_evpause;
160 b0a6bcf7 2022-09-13 op };
161 b0a6bcf7 2022-09-13 op
162 b0a6bcf7 2022-09-13 op extern int privsep_process;
163 b0a6bcf7 2022-09-13 op
164 b0a6bcf7 2022-09-13 op /* config.c */
165 b0a6bcf7 2022-09-13 op int config_init(struct galileo *);
166 b0a6bcf7 2022-09-13 op void config_purge(struct galileo *);
167 afb86b2c 2022-09-23 op int config_setproxy(struct galileo *, struct proxy *);
168 afb86b2c 2022-09-23 op int config_getproxy(struct galileo *, struct imsg *);
169 b0a6bcf7 2022-09-13 op int config_setsock(struct galileo *);
170 b0a6bcf7 2022-09-13 op int config_getsock(struct galileo *, struct imsg *);
171 b0a6bcf7 2022-09-13 op int config_setreset(struct galileo *);
172 b0a6bcf7 2022-09-13 op int config_getreset(struct galileo *, struct imsg *);
173 40f762b2 2022-09-23 op int config_getcfg(struct galileo *, struct imsg *);
174 b0a6bcf7 2022-09-13 op
175 b0a6bcf7 2022-09-13 op /* fcgi.c */
176 b0a6bcf7 2022-09-13 op int fcgi_end_request(struct client *, int);
177 b0a6bcf7 2022-09-13 op int fcgi_abort_request(struct client *);
178 ea8874f1 2022-09-13 op void fcgi_accept(int, short, void *);
179 b0a6bcf7 2022-09-13 op void fcgi_read(struct bufferevent *, void *);
180 b0a6bcf7 2022-09-13 op void fcgi_write(struct bufferevent *, void *);
181 b0a6bcf7 2022-09-13 op void fcgi_error(struct bufferevent *, short error, void *);
182 40f762b2 2022-09-23 op void fcgi_free(struct fcgi *);
183 c9dc4bc6 2022-09-13 op int clt_putc(struct client *, char);
184 c9dc4bc6 2022-09-13 op int clt_puts(struct client *, const char *);
185 b0a6bcf7 2022-09-13 op int clt_write_bufferevent(struct client *, struct bufferevent *);
186 b0a6bcf7 2022-09-13 op int clt_flush(struct client *);
187 b0a6bcf7 2022-09-13 op int clt_write(struct client *, const uint8_t *, size_t);
188 b0a6bcf7 2022-09-13 op int clt_printf(struct client *, const char *, ...)
189 b0a6bcf7 2022-09-13 op __attribute__((__format__(printf, 2, 3)))
190 b0a6bcf7 2022-09-13 op __attribute__((__nonnull__(2)));
191 232eee45 2022-09-20 op int clt_tp_puts(struct template *, const char *);
192 232eee45 2022-09-20 op int clt_tp_putc(struct template *, int);
193 b0a6bcf7 2022-09-13 op int fcgi_cmp(struct fcgi *, struct fcgi *);
194 b0a6bcf7 2022-09-13 op int fcgi_client_cmp(struct client *, struct client *);
195 b0a6bcf7 2022-09-13 op
196 bff58270 2022-09-19 op /* fragments.tmpl */
197 bff58270 2022-09-19 op int tp_head(struct template *, const char *, const char *);
198 bff58270 2022-09-19 op int tp_foot(struct template *);
199 bff58270 2022-09-19 op int tp_figure(struct template *, const char *, const char *);
200 ceb3f79c 2022-09-29 op int tp_pre_open(struct template *, const char *);
201 ceb3f79c 2022-09-29 op int tp_pre_close(struct template *);
202 abe17781 2022-09-20 op int tp_error(struct template *, int, const char *);
203 8857131d 2022-09-20 op int tp_inputpage(struct template *, const char *);
204 bff58270 2022-09-19 op
205 b0a6bcf7 2022-09-13 op /* galileo.c */
206 b0a6bcf7 2022-09-13 op int accept_reserve(int, struct sockaddr *, socklen_t *, int,
207 b0a6bcf7 2022-09-13 op volatile int *);
208 b0a6bcf7 2022-09-13 op /* parse.y */
209 b0a6bcf7 2022-09-13 op int parse_config(const char *, struct galileo *);
210 b0a6bcf7 2022-09-13 op int cmdline_symset(char *);
211 b0a6bcf7 2022-09-13 op
212 b0a6bcf7 2022-09-13 op /* proxy.c */
213 b0a6bcf7 2022-09-13 op extern volatile int proxy_inflight;
214 b0a6bcf7 2022-09-13 op extern uint32_t proxy_fcg_id;
215 b0a6bcf7 2022-09-13 op
216 f774ad1e 2022-09-23 op void proxy(struct privsep *, struct privsep_proc *);
217 f774ad1e 2022-09-23 op void proxy_purge(struct proxy *);
218 f774ad1e 2022-09-23 op struct proxy_config *proxy_match(struct galileo *, const char *);
219 f774ad1e 2022-09-23 op int proxy_start_request(struct galileo *, struct client *);
220 f774ad1e 2022-09-23 op void proxy_client_free(struct client *);
221 b0a6bcf7 2022-09-13 op
222 b0a6bcf7 2022-09-13 op SPLAY_PROTOTYPE(fcgi_tree, fcgi, fcg_nodes, fcgi_cmp);
223 b0a6bcf7 2022-09-13 op SPLAY_PROTOTYPE(client_tree, client, clt_nodes, fcgi_client_cmp);