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]))
24 #define GALILEO_USER "www"
25 #define GALILEO_SOCK "/var/www/run/galileo.sock"
26 #define CONF_FILE "/etc/galileo.conf"
28 #define PROC_MAX_INSTANCES 32
29 #define PROXY_NUMPROC 3
30 #define PROC_PARENT_SOCK_FILENO 3
55 struct fcgi *clt_fcgi;
56 char *clt_server_name;
57 char *clt_script_name;
59 struct proxy_config *clt_pc;
60 struct event_asr *clt_evasr;
61 struct addrinfo *clt_addrinfo;
62 struct addrinfo *clt_p;
63 struct event clt_evconn;
66 struct bufferevent *clt_bev;
72 SPLAY_ENTRY(client) clt_nodes;
74 SPLAY_HEAD(client_tree, client);
79 struct client_tree fcg_clients;
80 struct bufferevent *fcg_bev;
88 struct galileo *fcg_env;
90 SPLAY_ENTRY(fcgi) fcg_nodes;
92 SPLAY_HEAD(fcgi_tree, fcgi);
95 char host[HOST_NAME_MAX + 1];
96 char stylesheet[PATH_MAX];
97 char proxy_addr[HOST_NAME_MAX + 1];
98 char proxy_name[HOST_NAME_MAX + 1];
99 uint16_t proxy_port; /* TODO: turn into string */
103 TAILQ_ENTRY(server) srv_entry;
104 struct proxy_config srv_conf;
106 TAILQ_HEAD(serverlist, server);
109 char sc_conffile[PATH_MAX];
111 char sc_chroot[PATH_MAX];
112 struct serverlist sc_servers;
113 struct fcgi_tree sc_fcgi_socks;
115 struct privsep *sc_ps;
118 /* XXX: generalize */
120 struct event sc_evsock;
121 struct event sc_evpause;
124 extern int privsep_process;
127 int config_init(struct galileo *);
128 void config_purge(struct galileo *);
129 int config_setserver(struct galileo *, struct server *);
130 int config_getserver(struct galileo *, struct imsg *);
131 int config_setsock(struct galileo *);
132 int config_getsock(struct galileo *, struct imsg *);
133 int config_setreset(struct galileo *);
134 int config_getreset(struct galileo *, struct imsg *);
137 int fcgi_end_request(struct client *, int);
138 int fcgi_abort_request(struct client *);
139 void fcgi_accept(struct galileo *);
140 void fcgi_read(struct bufferevent *, void *);
141 void fcgi_write(struct bufferevent *, void *);
142 void fcgi_error(struct bufferevent *, short error, void *);
143 int clt_write_bufferevent(struct client *, struct bufferevent *);
144 int clt_flush(struct client *);
145 int clt_write(struct client *, const uint8_t *, size_t);
146 int clt_printf(struct client *, const char *, ...)
147 __attribute__((__format__(printf, 2, 3)))
148 __attribute__((__nonnull__(2)));
149 int fcgi_cmp(struct fcgi *, struct fcgi *);
150 int fcgi_client_cmp(struct client *, struct client *);
153 int accept_reserve(int, struct sockaddr *, socklen_t *, int,
156 int parse_config(const char *, struct galileo *);
157 int cmdline_symset(char *);
160 extern volatile int proxy_inflight;
161 extern uint32_t proxy_fcg_id;
163 void proxy(struct privsep *, struct privsep_proc *);
164 void proxy_purge(struct server *);
165 void proxy_start_request(struct galileo *, struct client *);
166 void proxy_client_free(struct client *);
168 SPLAY_PROTOTYPE(fcgi_tree, fcgi, fcg_nodes, fcgi_cmp);
169 SPLAY_PROTOTYPE(client_tree, client, clt_nodes, fcgi_client_cmp);