Index: Makefile ================================================================== --- Makefile +++ Makefile @@ -1,9 +1,10 @@ CC = gcc CFLAGS = -Wall -Werror -W -pthread -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE LDFLAGS = -pthread LIBS = -lpthread +MIMETYPES = /etc/httpd/mime.types PREFIX = /usr/local prefix = $(PREFIX) bindir = $(prefix)/bin mandir = $(prefix)/share/man @@ -14,11 +15,11 @@ $(CC) $(CFLAGS) $(LDFLAGS) -o "$@" $^ $(LIBS) filed.o: filed.c filed-mime-types.h filed-mime-types.h: generate-mime-types - ./generate-mime-types > filed-mime-types.h + ./generate-mime-types "$(MIMETYPES)" > filed-mime-types.h install: filed filed.1 test -d "$(DESTDIR)$(mandir)/man1" || mkdir -p "$(DESTDIR)$(mandir)/man1" test -d "$(DESTDIR)$(bindir)" || mkdir -p "$(DESTDIR)$(bindir)" cp filed.1 "$(DESTDIR)$(mandir)/man1/" Index: generate-mime-types ================================================================== --- generate-mime-types +++ generate-mime-types @@ -1,9 +1,18 @@ #! /usr/bin/env tclsh +if {[llength $argv] != 1} { + puts stderr "Usage: generate-mime-type " + + exit 1 +} + +set mimeinfofile [lindex $argv 0] + set modulus 16777259 +# Must match what is in filed.c proc filed_hash {str mod} { set retval [expr {$mod - 1}] set prev [expr {$mod % 255}] for {set idx 0} {$idx < [string length $str]} {incr idx} { set curr [string index $str $idx] @@ -32,16 +41,16 @@ return $retval } -set mimeinfofile "/etc/httpd/mime.types" - +# Read contents of mime types file set fd [open $mimeinfofile] set mimeinfo [read $fd] close $fd +# Parse into type and extensions pairs foreach line [split $mimeinfo "\n"] { regsub {#.*} $line {} line set line [string trim $line] if {$line == ""} { @@ -60,16 +69,20 @@ set extensioninfo($extension) $mime } } +# For every extension, generate a hash +# For every hash, note the extension foreach extension [array names extensioninfo] { set hash_id [filed_hash $extension $modulus] lappend hashinfo($hash_id) $extension } + +# Emit a C fragment to take a pointer (p) to an extension determine the mime type puts "\tswitch (filed_hash((const unsigned char *) p, $modulus)) \{" foreach hash [lsort -integer -increasing [array names hashinfo]] { puts "\t\tcase $hash:" foreach extension $hashinfo($hash) { puts "\t\t\tif (strcmp(p, \"$extension\") == 0) \{" @@ -77,5 +90,8 @@ puts "\t\t\t\}" } puts "\t\t\treturn(FILED_DEFAULT_TYPE);" } puts "\t\}" + +# Declare victory +exit 0