2 * Copyright (c) 2022 Omar Polo <op@omarpolo.com>
3 * Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org>
4 * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
5 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
25 #define GALILEO_USER "www"
29 #define GALILEO_CONF "/etc/galileo.conf"
33 #define GALILEO_SOCK "/var/www/run/galileo.sock"
37 #define PROC_MAX_INSTANCES 32
38 #define PROXY_NUMPROC 3
39 #define PROC_PARENT_SOCK_FILENO 3
40 #define GEMINI_MAXLEN (1024 + 1) /* NULL */
41 #define FORM_URLENCODED "application/x-www-form-urlencoded"
44 #define DPRINTF log_debug
46 #define DPRINTF(x...) do {} while (0)
79 struct fcgi *clt_fcgi;
80 char *clt_server_name;
81 char *clt_script_name;
88 struct proxy_config *clt_pc;
89 struct event_asr *clt_evasr;
90 struct addrinfo *clt_addrinfo;
91 struct addrinfo *clt_p;
92 struct event clt_evconn;
95 struct bufferevent *clt_bev;
97 struct template *clt_tp;
99 #define TR_ENABLED 0x1
107 SPLAY_ENTRY(client) clt_nodes;
109 SPLAY_HEAD(client_tree, client);
114 struct client_tree fcg_clients;
115 struct bufferevent *fcg_bev;
124 struct galileo *fcg_env;
126 SPLAY_ENTRY(fcgi) fcg_nodes;
128 SPLAY_HEAD(fcgi_tree, fcgi);
130 struct proxy_config {
131 char host[HOST_NAME_MAX + 1];
132 char stylesheet[PATH_MAX];
133 char proxy_addr[HOST_NAME_MAX + 1];
134 char proxy_name[HOST_NAME_MAX + 1];
137 #define PROXY_NO_TLS 0x1
138 #define PROXY_NO_NAVBAR 0x2
139 #define PROXY_NO_FOOTER 0x4
140 #define PROXY_NO_IMGPRV 0x8
145 TAILQ_ENTRY(proxy) pr_entry;
146 struct proxy_config pr_conf;
148 TAILQ_HEAD(proxylist, proxy);
151 char sc_conffile[PATH_MAX];
153 char sc_chroot[PATH_MAX];
154 struct proxylist sc_proxies;
155 struct fcgi_tree sc_fcgi_socks;
157 struct privsep *sc_ps;
160 /* XXX: generalize */
162 struct event sc_evsock;
163 struct event sc_evpause;
166 extern int privsep_process;
169 int config_init(struct galileo *);
170 void config_purge(struct galileo *);
171 int config_setproxy(struct galileo *, struct proxy *);
172 int config_getproxy(struct galileo *, struct imsg *);
173 int config_setsock(struct galileo *);
174 int config_getsock(struct galileo *, struct imsg *);
175 int config_setreset(struct galileo *);
176 int config_getreset(struct galileo *, struct imsg *);
177 int config_getcfg(struct galileo *, struct imsg *);
180 int fcgi_end_request(struct client *, int);
181 int fcgi_abort_request(struct client *);
182 void fcgi_accept(int, short, void *);
183 void fcgi_read(struct bufferevent *, void *);
184 void fcgi_write(struct bufferevent *, void *);
185 void fcgi_error(struct bufferevent *, short error, void *);
186 void fcgi_free(struct fcgi *);
187 int clt_write_bufferevent(struct client *, struct bufferevent *);
188 int clt_flush(struct client *);
189 int clt_write(void *, const void *, size_t);
190 int fcgi_cmp(struct fcgi *, struct fcgi *);
191 int fcgi_client_cmp(struct client *, struct client *);
194 int tp_head(struct template *, const char *, const char *);
195 int tp_foot(struct template *);
196 int tp_figure(struct template *, const char *, const char *);
197 int tp_pre_open(struct template *, const char *);
198 int tp_pre_close(struct template *);
199 int tp_error(struct template *, int, const char *);
200 int tp_inputpage(struct template *, const char *);
203 int accept_reserve(int, struct sockaddr *, socklen_t *, int,
206 int parse_config(const char *, struct galileo *);
207 int cmdline_symset(char *);
210 extern volatile int proxy_inflight;
211 extern uint32_t proxy_fcg_id;
213 void proxy(struct privsep *, struct privsep_proc *);
214 void proxy_purge(struct proxy *);
215 struct proxy_config *proxy_match(struct galileo *, const char *);
216 int proxy_start_request(struct galileo *, struct client *);
217 void proxy_client_free(struct client *);
219 SPLAY_PROTOTYPE(fcgi_tree, fcgi, fcg_nodes, fcgi_cmp);
220 SPLAY_PROTOTYPE(client_tree, client, clt_nodes, fcgi_client_cmp);