commit 18bd83915eab0f06b7e2920d0d71a39108b2d641 from: Omar Polo date: Fri Apr 08 15:14:09 2022 UTC sort the MIME mappings and do a binary search to match commit - ca44613693732f925bb60419342e9a62e4ddf000 commit + 18bd83915eab0f06b7e2920d0d71a39108b2d641 blob - 21ac1f758c05dd9302104324ebb876a2e81b1871 blob + 12b070084af562bb3e68dc4382383d8434abc89c --- gmid.c +++ gmid.c @@ -253,6 +253,7 @@ listener_main(struct imsgbuf *ibuf) drop_priv(); if (!conf.mime.skip_defaults && load_default_mime(&conf.mime) == -1) fatal("load_default_mime: %s", strerror(errno)); + sort_mime(&conf.mime); load_vhosts(); loop(ctx, sock4, sock6, ibuf); return 0; blob - 3bf9798e546420f85e88c85e773f7f3aca1c4b8c blob + cc6253a87732028a882fa4e58463565bd9d82732 --- gmid.h +++ gmid.h @@ -362,6 +362,7 @@ int logger_main(int, struct imsgbuf*); void init_mime(struct mime*); int add_mime(struct mime*, const char*, const char*); int load_default_mime(struct mime*); +void sort_mime(struct mime *); const char *mime(struct vhost*, const char*); void free_mime(struct mime *); blob - 715bec5ecae060903c30e03a29d54158caa8ce6c blob + 8ce73fd8f002028d42d459577b80a398691a5666 --- mime.c +++ mime.c @@ -111,6 +111,29 @@ path_ext(const char *path) return NULL; } +static int +mime_comp(const void *a, const void *b) +{ + const struct etm *x = a, *y = b; + + return strcmp(x->ext, y->ext); +} + +void +sort_mime(struct mime *m) +{ + qsort(m->t, m->len, sizeof(*m->t), mime_comp); +} + +static int +mime_find(const void *a, const void *b) +{ + const char *ext = a; + const struct etm *x = b; + + return strcmp(ext, x->ext); +} + const char * mime(struct vhost *host, const char *path) { @@ -122,10 +145,10 @@ mime(struct vhost *host, const char *path) if ((ext = path_ext(path)) == NULL) return def; - for (t = conf.mime.t; t->mime != NULL; ++t) - if (!strcmp(ext, t->ext)) - return t->mime; - + t = bsearch(ext, conf.mime.t, conf.mime.len, sizeof(*conf.mime.t), + mime_find); + if (t != NULL) + return t->mime; return def; }