diff options
Diffstat (limited to 'storage/magic.go')
-rw-r--r-- | storage/magic.go | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/storage/magic.go b/storage/magic.go new file mode 100644 index 0000000..16f655d --- /dev/null +++ b/storage/magic.go @@ -0,0 +1,31 @@ +package storage + +// #cgo LDFLAGS: -lmagic +// #include <stdlib.h> +// #include <magic.h> +import "C" +import "errors" +import "unsafe" + +var magic C.magic_t + +func init() { + magic = C.magic_open(C.MAGIC_MIME_TYPE | C.MAGIC_SYMLINK | C.MAGIC_ERROR) + if magic == nil { + panic("unable to initialize libmagic") + } + if C.magic_load(magic, nil) != 0 { + C.magic_close(magic) + panic("unable to load libmagic database: " + C.GoString(C.magic_error(magic))) + } +} + +func GetMimeType(fname string) (string, error) { + cfname := C.CString(fname) + defer C.free(unsafe.Pointer(cfname)) + mime := C.magic_file(magic, cfname) + if mime == nil { + return "", errors.New(C.GoString(C.magic_error(magic))) + } + return C.GoString(mime), nil +} |