tinywebd
annotate src/mime.c @ 6:4f191dbfac7e
commited a bunch of missing files from previous commits
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 17 Apr 2015 01:57:25 +0300 |
parents | |
children | 5ec50ca0d071 |
rev | line source |
---|---|
nuclear@6 | 1 #include <stdlib.h> |
nuclear@6 | 2 #include <string.h> |
nuclear@6 | 3 #include "mime.h" |
nuclear@6 | 4 #include "rbtree.h" |
nuclear@6 | 5 |
nuclear@6 | 6 /* TODO: do proper content detection */ |
nuclear@6 | 7 struct mime_type { |
nuclear@6 | 8 const char *suffix, *type; |
nuclear@6 | 9 }; |
nuclear@6 | 10 |
nuclear@6 | 11 static struct mime_type def_types[] = { |
nuclear@6 | 12 {"txt", "text/plain"}, |
nuclear@6 | 13 {"htm", "text/html"}, |
nuclear@6 | 14 {"html", "text/html"}, |
nuclear@6 | 15 {"png", "image/png"}, |
nuclear@6 | 16 {"jpg", "image/jpeg"}, |
nuclear@6 | 17 {"jpeg", "image/jpeg"}, |
nuclear@6 | 18 {"gif", "image/gif"}, |
nuclear@6 | 19 {"bmp", "image/bmp"}, |
nuclear@6 | 20 {"cgi", 0} |
nuclear@6 | 21 , |
nuclear@6 | 22 {0, 0} |
nuclear@6 | 23 }; |
nuclear@6 | 24 |
nuclear@6 | 25 static int init_types(void); |
nuclear@6 | 26 static void del_func(struct rbnode *node, void *cls); |
nuclear@6 | 27 |
nuclear@6 | 28 static struct rbtree *types; |
nuclear@6 | 29 |
nuclear@6 | 30 static int init_types(void) |
nuclear@6 | 31 { |
nuclear@6 | 32 int i; |
nuclear@6 | 33 |
nuclear@6 | 34 if(types) return 0; |
nuclear@6 | 35 |
nuclear@6 | 36 if(rb_init(types, RB_KEY_STRING) == -1) { |
nuclear@6 | 37 return -1; |
nuclear@6 | 38 } |
nuclear@6 | 39 rb_set_delete_func(types, del_func, 0); |
nuclear@6 | 40 |
nuclear@6 | 41 for(i=0; def_types[i].suffix; i++) { |
nuclear@6 | 42 add_mime_type(def_types[i].suffix, def_types[i].type); |
nuclear@6 | 43 } |
nuclear@6 | 44 return 0; |
nuclear@6 | 45 } |
nuclear@6 | 46 |
nuclear@6 | 47 static void del_func(struct rbnode *node, void *cls) |
nuclear@6 | 48 { |
nuclear@6 | 49 free(node->key); |
nuclear@6 | 50 free(node->data); |
nuclear@6 | 51 } |
nuclear@6 | 52 |
nuclear@6 | 53 int add_mime_type(const char *suffix, const char *type) |
nuclear@6 | 54 { |
nuclear@6 | 55 init_types(); |
nuclear@6 | 56 |
nuclear@6 | 57 return rb_insert(types, strdup(suffix), strdup(type)); |
nuclear@6 | 58 } |
nuclear@6 | 59 |
nuclear@6 | 60 const char *mime_type(const char *path) |
nuclear@6 | 61 { |
nuclear@6 | 62 const char *suffix; |
nuclear@6 | 63 |
nuclear@6 | 64 init_types(); |
nuclear@6 | 65 |
nuclear@6 | 66 if((suffix = strrchr(path, '.'))) { |
nuclear@6 | 67 struct rbnode *node = rb_find(types, (void*)(suffix + 1)); |
nuclear@6 | 68 if(node) { |
nuclear@6 | 69 return node->data; |
nuclear@6 | 70 } |
nuclear@6 | 71 } |
nuclear@6 | 72 return "text/plain"; |
nuclear@6 | 73 } |