Blame
Date:
Wed Oct 5 15:10:44 2022 UTC
Message:
make the various strings in the config fixed-length will help in future restructuring to have fixed-size objects.
001
2020-12-24
op
/*
002
2021-01-01
op
* Copyright (c) 2020, 2021, 2022 Omar Polo <op@omarpolo.com>
003
2020-12-24
op
*
004
2020-12-24
op
* Permission to use, copy, modify, and distribute this software for any
005
2020-12-24
op
* purpose with or without fee is hereby granted, provided that the above
006
2020-12-24
op
* copyright notice and this permission notice appear in all copies.
007
2020-12-24
op
*
008
2020-12-24
op
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
009
2020-12-24
op
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
010
2020-12-24
op
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
011
2020-12-24
op
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
012
2020-12-24
op
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
013
2020-12-24
op
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
014
2020-12-24
op
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
015
2020-12-24
op
*/
016
2020-12-24
op
017
2020-12-24
op
#ifndef GMID_H
018
2020-12-24
op
#define GMID_H
019
2021-02-12
op
020
2021-02-12
op
#include "config.h"
021
2020-12-24
op
022
2021-01-24
op
#include <sys/socket.h>
023
2021-01-24
op
#include <sys/types.h>
024
2021-01-24
op
025
2020-12-24
op
#include <arpa/inet.h>
026
2020-12-24
op
#include <netinet/in.h>
027
2020-12-24
op
028
2021-01-24
op
#include <dirent.h>
029
2021-03-19
op
#include <limits.h>
030
2021-03-19
op
#include <netdb.h>
031
2021-02-04
op
#include <signal.h>
032
2020-12-24
op
#include <stdio.h>
033
2020-12-24
op
#include <stdlib.h>
034
2021-02-07
op
#include <time.h>
035
2020-12-24
op
#include <tls.h>
036
2020-12-24
op
#include <unistd.h>
037
2020-12-24
op
038
2021-02-09
op
#include <openssl/x509.h>
039
2021-10-02
op
040
2021-10-02
op
#if HAVE_EVENT2
041
2021-10-02
op
# include <event2/event.h>
042
2021-10-02
op
# include <event2/event_compat.h>
043
2021-10-02
op
# include <event2/event_struct.h>
044
2021-10-02
op
# include <event2/buffer.h>
045
2021-10-02
op
# include <event2/buffer_compat.h>
046
2021-10-02
op
# include <event2/bufferevent.h>
047
2021-10-02
op
# include <event2/bufferevent_struct.h>
048
2021-10-02
op
# include <event2/bufferevent_compat.h>
049
2021-10-02
op
#else
050
2021-10-02
op
# include <event.h>
051
2021-10-02
op
#endif
052
2021-05-15
op
053
2022-09-10
op
#define VERSION_STR(n) n " " VERSION
054
2022-09-10
op
#define GE_STRING VERSION_STR("ge")
055
2022-09-10
op
#define GG_STRING VERSION_STR("gg")
056
2022-09-10
op
#define GMID_STRING VERSION_STR("gmid")
057
2022-09-10
op
058
2021-07-10
op
#define GMID_VERSION "gmid/" VERSION
059
2021-02-09
op
060
2020-12-24
op
#define GEMINI_URL_LEN (1024+3) /* URL max len + \r\n + \0 */
061
2020-12-24
op
062
2020-12-24
op
#define SUCCESS 20
063
2021-01-20
op
#define TEMP_REDIRECT 30
064
2020-12-24
op
#define TEMP_FAILURE 40
065
2021-02-01
op
#define CGI_ERROR 42
066
2021-12-29
op
#define PROXY_ERROR 43
067
2020-12-24
op
#define NOT_FOUND 51
068
2021-01-11
op
#define PROXY_REFUSED 53
069
2020-12-24
op
#define BAD_REQUEST 59
070
2021-02-09
op
#define CLIENT_CERT_REQ 60
071
2021-02-09
op
#define CERT_NOT_AUTH 61
072
2020-12-24
op
073
2021-01-28
op
/* maximum hostname and label length, +1 for the NUL-terminator */
074
2021-01-28
op
#define DOMAIN_NAME_LEN (253+1)
075
2021-01-28
op
#define LABEL_LEN (63+1)
076
2021-03-03
op
077
2022-09-10
op
#define MEDIATYPE_NAMEMAX 128 /* file name extension */
078
2022-09-10
op
#define MEDIATYPE_TYPEMAX 128 /* length of type/subtype */
079
2022-09-10
op
080
2022-10-05
op
#define FCGI_NAME_MAX 511
081
2022-10-05
op
#define FCGI_VAL_MAX 511
082
2022-10-05
op
083
2021-05-09
op
#define FCGI_MAX 32
084
2021-03-03
op
#define PROC_MAX 16
085
2021-12-29
op
086
2021-12-29
op
struct iri {
087
2021-12-29
op
char *schema;
088
2021-12-29
op
char *host;
089
2021-12-29
op
char *port;
090
2021-12-29
op
uint16_t port_no;
091
2021-12-29
op
char *path;
092
2021-12-29
op
char *query;
093
2021-12-29
op
char *fragment;
094
2021-12-29
op
};
095
2021-12-29
op
096
2021-12-29
op
struct parser {
097
2021-12-29
op
char *iri;
098
2021-12-29
op
struct iri *parsed;
099
2021-12-29
op
const char *err;
100
2021-12-29
op
};
101
2021-01-27
op
102
2021-05-09
op
struct fcgi {
103
2021-05-09
op
int id;
104
2022-10-05
op
char path[PATH_MAX];
105
2022-10-05
op
char port[32];
106
2021-05-09
op
};
107
2021-05-09
op
extern struct fcgi fcgi[FCGI_MAX];
108
2021-05-09
op
109
2021-01-02
op
TAILQ_HEAD(proxyhead, proxy);
110
2021-01-01
op
struct proxy {
111
2022-10-05
op
char match_proto[32];
112
2022-10-05
op
char match_host[HOST_NAME_MAX + 1];
113
2022-10-05
op
char match_port[32];
114
2021-01-02
op
115
2022-10-05
op
char host[HOST_NAME_MAX + 1];
116
2022-10-05
op
char port[32];
117
2022-10-05
op
char sni[HOST_NAME_MAX];
118
2021-01-01
op
int notls;
119
2021-01-01
op
uint32_t protocols;
120
2021-01-01
op
int noverifyname;
121
2021-01-01
op
uint8_t *cert;
122
2021-01-01
op
size_t certlen;
123
2021-01-01
op
uint8_t *key;
124
2021-01-01
op
size_t keylen;
125
2022-01-04
op
X509_STORE *reqca;
126
2021-01-02
op
127
2021-01-02
op
TAILQ_ENTRY(proxy) proxies;
128
2021-01-01
op
};
129
2021-01-01
op
130
2021-03-31
op
TAILQ_HEAD(lochead, location);
131
2021-01-24
op
struct location {
132
2022-10-05
op
char match[128];
133
2022-10-05
op
char lang[32];
134
2022-10-05
op
char default_mime[MEDIATYPE_TYPEMAX];
135
2022-10-05
op
char index[PATH_MAX];
136
2021-01-24
op
int auto_index; /* 0 auto, -1 off, 1 on */
137
2021-02-06
op
int block_code;
138
2022-10-05
op
char block_fmt[GEMINI_URL_LEN];
139
2021-02-06
op
int strip;
140
2021-02-09
op
X509_STORE *reqca;
141
2021-02-23
op
int disable_log;
142
2021-05-09
op
int fcgi;
143
2021-04-30
op
144
2022-10-05
op
char dir[PATH_MAX];
145
2021-04-30
op
int dirfd;
146
2021-03-31
op
147
2021-03-31
op
TAILQ_ENTRY(location) locations;
148
2021-01-24
op
};
149
2021-01-24
op
150
2021-04-28
op
TAILQ_HEAD(envhead, envlist);
151
2021-04-28
op
struct envlist {
152
2022-10-05
op
char name[FCGI_NAME_MAX];
153
2022-10-05
op
char value[FCGI_VAL_MAX];
154
2021-04-28
op
TAILQ_ENTRY(envlist) envs;
155
2021-04-28
op
};
156
2021-04-28
op
157
2021-04-29
op
TAILQ_HEAD(aliashead, alist);
158
2021-04-29
op
struct alist {
159
2022-10-05
op
char alias[HOST_NAME_MAX + 1];
160
2021-04-29
op
TAILQ_ENTRY(alist) aliases;
161
2021-04-29
op
};
162
2021-04-29
op
163
2021-03-31
op
extern TAILQ_HEAD(vhosthead, vhost) hosts;
164
2021-01-15
op
struct vhost {
165
2022-10-05
op
char domain[HOST_NAME_MAX + 1];
166
2022-10-05
op
char cert[PATH_MAX];
167
2022-10-05
op
char key[PATH_MAX];
168
2022-10-05
op
char ocsp[PATH_MAX];
169
2021-03-31
op
170
2021-03-31
op
TAILQ_ENTRY(vhost) vhosts;
171
2021-01-30
op
172
2021-07-07
op
/*
173
2021-07-07
op
* the first location rule is always '*' and holds the default
174
2021-03-31
op
* settings for the vhost, then follows the "real" location
175
2021-07-07
op
* rules as specified in the configuration.
176
2021-07-07
op
*/
177
2021-03-31
op
struct lochead locations;
178
2021-04-28
op
179
2021-06-11
op
struct envhead params;
180
2021-04-29
op
struct aliashead aliases;
181
2021-01-02
op
struct proxyhead proxies;
182
2021-01-15
op
};
183
2021-01-15
op
184
2021-01-18
op
struct etm { /* extension to mime */
185
2022-09-10
op
char mime[MEDIATYPE_TYPEMAX];
186
2022-09-10
op
char ext[MEDIATYPE_NAMEMAX];
187
2021-01-18
op
};
188
2021-01-18
op
189
2021-01-21
op
struct mime {
190
2021-01-18
op
struct etm *t;
191
2022-04-08
op
size_t len;
192
2022-04-08
op
size_t cap;
193
2021-01-18
op
};
194
2021-01-18
op
195
2021-01-15
op
struct conf {
196
2021-02-07
op
/* from command line */
197
2021-02-07
op
int foreground;
198
2021-02-07
op
int verbose;
199
2022-09-06
op
int can_open_sockets;
200
2021-02-07
op
201
2021-02-07
op
/* in the config */
202
2021-01-25
op
int port;
203
2021-01-25
op
int ipv6;
204
2021-01-25
op
uint32_t protos;
205
2021-01-25
op
struct mime mime;
206
2022-09-10
op
char chroot[PATH_MAX];
207
2022-09-10
op
char user[LOGIN_NAME_MAX];
208
2021-02-07
op
int prefork;
209
2021-01-15
op
};
210
2021-01-15
op
211
2021-02-08
op
extern const char *config_path;
212
2021-01-15
op
extern struct conf conf;
213
2021-02-23
op
214
2022-09-10
op
extern struct imsgbuf logibuf, servibuf[PROC_MAX];
215
2021-01-15
op
216
2021-03-03
op
extern int servpipes[PROC_MAX];
217
2021-03-03
op
218
2021-03-19
op
typedef void (imsg_handlerfn)(struct imsgbuf*, struct imsg*, size_t);
219
2021-03-19
op
220
2021-10-02
op
enum {
221
2021-10-02
op
REQUEST_UNDECIDED,
222
2021-10-02
op
REQUEST_FILE,
223
2021-10-02
op
REQUEST_DIR,
224
2021-10-02
op
REQUEST_FCGI,
225
2021-12-29
op
REQUEST_PROXY,
226
2021-10-02
op
REQUEST_DONE,
227
2021-10-02
op
};
228
2021-02-01
op
229
2021-12-29
op
#define IS_INTERNAL_REQUEST(x) \
230
2021-12-29
op
(x) != REQUEST_FCGI && \
231
2021-12-29
op
(x) != REQUEST_PROXY)
232
2021-10-02
op
233
2020-12-24
op
struct client {
234
2021-10-07
op
uint32_t id;
235
2020-12-24
op
struct tls *ctx;
236
2021-10-02
op
char *req;
237
2022-03-27
op
size_t reqlen;
238
2021-01-20
op
struct iri iri;
239
2021-01-27
op
char domain[DOMAIN_NAME_LEN];
240
2021-05-09
op
241
2021-10-02
op
struct bufferevent *bev;
242
2021-05-09
op
243
2021-10-02
op
int type;
244
2021-10-02
op
245
2021-10-02
op
struct bufferevent *cgibev;
246
2021-12-29
op
247
2021-01-02
op
struct proxy *proxy;
248
2021-12-29
op
struct bufferevent *proxybev;
249
2021-12-29
op
struct tls *proxyctx;
250
2022-01-27
op
int proxyevset;
251
2021-12-29
op
struct event proxyev;
252
2021-10-02
op
253
2021-10-02
op
char *header;
254
2021-10-02
op
255
2020-12-24
op
int code;
256
2020-12-24
op
const char *meta;
257
2021-02-08
op
int fd, pfd;
258
2021-04-25
op
struct dirent **dir;
259
2021-04-25
op
int dirlen, diroff;
260
2021-03-29
op
261
2021-03-29
op
/* big enough to store STATUS + SPACE + META + CRLF */
262
2021-03-29
op
char sbuf[1029];
263
2021-02-12
op
ssize_t len, off;
264
2021-03-29
op
265
2021-01-10
op
struct sockaddr_storage addr;
266
2021-03-19
op
struct vhost *host; /* host they're talking to */
267
2021-05-15
op
size_t loc; /* location matched */
268
2020-12-24
op
269
2021-10-07
op
SPLAY_ENTRY(client) entry;
270
2021-10-07
op
};
271
2021-10-07
op
SPLAY_HEAD(client_tree_id, client);
272
2021-10-07
op
extern struct client_tree_id clients;
273
2021-03-19
op
274
2021-12-29
op
struct connreq {
275
2021-12-29
op
char host[NI_MAXHOST];
276
2021-12-29
op
char port[NI_MAXSERV];
277
2021-12-29
op
int flag;
278
2021-12-29
op
};
279
2021-12-29
op
280
2020-12-24
op
enum {
281
2020-12-24
op
FILE_EXISTS,
282
2020-12-24
op
FILE_DIRECTORY,
283
2020-12-24
op
FILE_MISSING,
284
2020-12-24
op
};
285
2020-12-24
op
286
2021-03-19
op
enum imsg_type {
287
2021-05-09
op
IMSG_FCGI_REQ,
288
2021-05-09
op
IMSG_FCGI_FD,
289
2021-12-29
op
IMSG_CONN_REQ,
290
2021-12-29
op
IMSG_CONN_FD,
291
2021-03-19
op
IMSG_LOG,
292
2021-07-19
op
IMSG_LOG_REQUEST,
293
2021-06-15
op
IMSG_LOG_TYPE,
294
2021-03-19
op
IMSG_QUIT,
295
2021-03-19
op
};
296
2021-03-19
op
297
2020-12-25
op
/* gmid.c */
298
2021-01-25
op
char *data_dir(void);
299
2022-09-06
op
void load_local_cert(struct vhost*, const char*, const char*);
300
2021-01-25
op
void load_vhosts(void);
301
2021-01-21
op
int make_socket(int, int);
302
2021-01-25
op
void setup_tls(void);
303
2021-01-24
op
void init_config(void);
304
2021-02-04
op
void free_config(void);
305
2021-01-25
op
void drop_priv(void);
306
2021-01-15
op
307
2021-02-06
op
void yyerror(const char*, ...);
308
2021-01-27
op
void parse_conf(const char*);
309
2021-10-09
op
void print_conf(void);
310
2021-06-29
op
int cmdline_symset(char *);
311
2021-01-27
op
312
2021-02-07
op
/* log.c */
313
2021-02-07
op
void fatal(const char*, ...)
314
2021-02-07
op
__attribute__((format (printf, 1, 2)))
315
2021-02-07
op
__attribute__((__noreturn__));
316
2021-02-07
op
317
2021-02-07
op
#define LOG_ATTR_FMT __attribute__((format (printf, 2, 3)))
318
2021-02-07
op
void log_err(struct client*, const char*, ...) LOG_ATTR_FMT;
319
2021-02-07
op
void log_warn(struct client*, const char*, ...) LOG_ATTR_FMT;
320
2021-02-07
op
void log_notice(struct client*, const char*, ...) LOG_ATTR_FMT;
321
2021-02-07
op
void log_info(struct client*, const char*, ...) LOG_ATTR_FMT;
322
2021-02-07
op
void log_debug(struct client*, const char*, ...) LOG_ATTR_FMT;
323
2021-02-07
op
void log_request(struct client*, char*, size_t);
324
2021-02-23
op
int logger_main(int, struct imsgbuf*);
325
2021-02-07
op
326
2021-01-18
op
/* mime.c */
327
2021-01-21
op
void init_mime(struct mime*);
328
2022-04-08
op
int add_mime(struct mime*, const char*, const char*);
329
2022-04-08
op
int load_default_mime(struct mime*);
330
2022-04-08
op
void sort_mime(struct mime *);
331
2021-01-19
op
const char *mime(struct vhost*, const char*);
332
2022-04-08
op
void free_mime(struct mime *);
333
2021-01-18
op
334
2021-01-17
op
/* server.c */
335
2021-07-06
op
extern int shutting_down;
336
2021-01-24
op
const char *vhost_lang(struct vhost*, const char*);
337
2021-01-24
op
const char *vhost_default_mime(struct vhost*, const char*);
338
2021-01-24
op
const char *vhost_index(struct vhost*, const char*);
339
2021-01-24
op
int vhost_auto_index(struct vhost*, const char*);
340
2021-02-06
op
int vhost_block_return(struct vhost*, const char*, int*, const char**);
341
2021-05-09
op
int vhost_fastcgi(struct vhost*, const char*);
342
2021-05-15
op
int vhost_dirfd(struct vhost*, const char*, size_t*);
343
2021-02-06
op
int vhost_strip(struct vhost*, const char*);
344
2021-02-09
op
X509_STORE *vhost_require_ca(struct vhost*, const char*);
345
2021-02-23
op
int vhost_disable_log(struct vhost*, const char*);
346
2021-05-09
op
347
2021-02-03
op
void mark_nonblock(int);
348
2021-10-02
op
void client_write(struct bufferevent *, void *);
349
2021-05-09
op
void start_reply(struct client*, int, const char*);
350
2021-10-02
op
void client_close(struct client *);
351
2022-03-26
op
struct client *client_by_id(int);
352
2021-03-19
op
void loop(struct tls*, int, int, struct imsgbuf*);
353
2021-01-17
op
354
2021-10-07
op
int client_tree_cmp(struct client *, struct client *);
355
2021-10-07
op
SPLAY_PROTOTYPE(client_tree_id, client, entry, client_tree_cmp);
356
2021-10-07
op
357
2021-04-25
op
/* dirs.c */
358
2021-04-25
op
int scandir_fd(int, struct dirent***, int(*)(const struct dirent*),
359
2021-04-25
op
int(*)(const struct dirent**, const struct dirent**));
360
2021-04-25
op
int select_non_dot(const struct dirent*);
361
2021-04-25
op
int select_non_dotdot(const struct dirent*);
362
2021-04-25
op
363
2021-05-09
op
/* fcgi.c */
364
2021-09-26
op
void fcgi_read(struct bufferevent *, void *);
365
2021-09-26
op
void fcgi_write(struct bufferevent *, void *);
366
2021-09-26
op
void fcgi_error(struct bufferevent *, short, void *);
367
2021-10-07
op
void fcgi_req(struct client *);
368
2021-05-09
op
369
2021-01-15
op
/* sandbox.c */
370
2022-09-06
op
void sandbox_server_process(int);
371
2021-03-20
op
void sandbox_logger_process(void);
372
2021-01-15
op
373
2021-01-09
op
/* utf8.c */
374
2021-01-09
op
int valid_multibyte_utf8(struct parser*);
375
2021-01-27
op
char *utf8_nth(char*, size_t);
376
2021-01-09
op
377
2021-01-11
op
/* iri.c */
378
2021-01-11
op
int parse_iri(char*, struct iri*, const char**);
379
2021-02-01
op
int serialize_iri(struct iri*, char*, size_t);
380
2022-07-04
op
int encode_path(char *, size_t, const char *);
381
2021-02-07
op
char *pct_decode_str(char *);
382
2020-12-25
op
383
2021-12-29
op
/* proxy.c */
384
2021-12-29
op
int proxy_init(struct client *);
385
2021-12-29
op
386
2021-01-27
op
/* puny.c */
387
2021-01-29
op
int puny_decode(const char*, char*, size_t, const char**);
388
2021-01-27
op
389
2021-01-27
op
/* utils.c */
390
2021-02-04
op
void block_signals(void);
391
2021-02-04
op
void unblock_signals(void);
392
2021-01-27
op
int starts_with(const char*, const char*);
393
2021-01-27
op
int ends_with(const char*, const char*);
394
2021-01-27
op
ssize_t filesize(int);
395
2021-02-01
op
char *absolutify_path(const char*);
396
2021-02-04
op
char *xstrdup(const char*);
397
2021-03-31
op
void *xcalloc(size_t, size_t);
398
2021-02-07
op
void gen_certificate(const char*, const char*, const char*);
399
2021-02-09
op
X509_STORE *load_ca(const char*);
400
2021-02-09
op
int validate_against_ca(X509_STORE*, const uint8_t*, size_t);
401
2021-03-19
op
void dispatch_imsg(struct imsgbuf*, imsg_handlerfn**, size_t);
402
2021-01-27
op
403
2020-12-24
op
#endif
Omar Polo