Commit Diff


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;
 }