2 * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 init_mime(struct mime *mime)
29 mime->t = calloc(mime->cap, sizeof(struct etm));
31 fatal("calloc: %s", strerror(errno));
34 /* register mime for the given extension */
36 add_mime(struct mime *mime, const char *mt, const char *ext)
40 if (mime->len == mime->cap) {
43 mime->t = recallocarray(mime->t, oldcap, mime->cap,
46 err(1, "recallocarray");
49 mime->t[mime->len].mime = mt;
50 mime->t[mime->len].ext = ext;
54 /* load a default set of common mime-extension associations */
56 load_default_mime(struct mime *mime)
58 struct etm *i, m[] = {
59 {"application/pdf", "pdf"},
61 {"image/jpeg", "jpg"},
62 {"image/jpeg", "jpeg"},
64 {"image/svg+xml", "svg"},
65 {"text/gemini", "gemini"},
66 {"text/gemini", "gmi"},
67 {"text/markdown", "markdown"},
68 {"text/markdown", "md"},
69 {"text/plain", "txt"},
74 for (i = m; i->mime != NULL; ++i)
75 add_mime(mime, i->mime, i->ext);
79 path_ext(const char *path)
83 end = path + strlen(path)-1;
84 for (; end != path; --end) {
95 mime(struct vhost *host, const char *path)
97 const char *def, *ext;
100 if ((def = host->default_mime) == NULL)
101 def = "application/octet-stream";
103 if ((ext = path_ext(path)) == NULL)
106 for (t = conf.mime.t; t->mime != NULL; ++t)
107 if (!strcmp(ext, t->ext))