From 0fdbb8006d3713cf28c37299e8a4c6de5da36245 Mon Sep 17 00:00:00 2001 From: super Date: Fri, 14 Oct 2016 12:49:19 +0800 Subject: [PATCH 1/3] add Decoder constructor with magic database file --- magicmime.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/magicmime.go b/magicmime.go index c4366dc..36ed5e4 100644 --- a/magicmime.go +++ b/magicmime.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build linux darwin +// +build linux darwin windows // Package magicmime detects mimetypes using libmagic. // This package requires libmagic, install it by the following @@ -143,6 +143,28 @@ func NewDecoder(flags Flag) (*Decoder, error) { return d, nil } +// NewDecoderWithMagicDB creates a detector with the magic database file and the specified flags. Upon +// success users are expected to call Close on the returned Decoder +// when it is no longer needed. +func NewDecoderWithMagicDB(flags Flag, magicDB string) (*Decoder, error) { + db := C.magic_open(C.int(0)) + if db == nil { + return nil, errors.New("error opening magic") + } + d := &Decoder{db: db} + if code := C.magic_setflags(db, C.int(flags)); code != 0 { + d.Close() + return nil, errors.New(C.GoString(C.magic_error(d.db))) + } + path := C.CString(magicDB) + defer C.free(unsafe.Pointer(path)) + if code := C.magic_load(db, path); code != 0 { + d.Close() + return nil, errors.New(C.GoString(C.magic_error(d.db))) + } + return d, nil +} + // TypeByFile looks up for a file's mimetype by its content. // It uses a magic number database which is described in magic(5). func (d *Decoder) TypeByFile(filename string) (string, error) { From adda3dff0418547d58c1c86f435edca929662d40 Mon Sep 17 00:00:00 2001 From: Super Date: Tue, 18 Apr 2017 18:14:43 +0800 Subject: [PATCH 2/3] Update magicmime.go fix crash when magic file is error --- magicmime.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/magicmime.go b/magicmime.go index 36ed5e4..746e1be 100644 --- a/magicmime.go +++ b/magicmime.go @@ -159,8 +159,9 @@ func NewDecoderWithMagicDB(flags Flag, magicDB string) (*Decoder, error) { path := C.CString(magicDB) defer C.free(unsafe.Pointer(path)) if code := C.magic_load(db, path); code != 0 { + err = errors.New(C.GoString(C.magic_error(d.db))) d.Close() - return nil, errors.New(C.GoString(C.magic_error(d.db))) + return nil, err } return d, nil } From 7ef5e55f1fcd54158b67bcfa7af35a7fb6846840 Mon Sep 17 00:00:00 2001 From: Super Date: Tue, 18 Apr 2017 18:16:15 +0800 Subject: [PATCH 3/3] Update magicmime.go fix code error --- magicmime.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/magicmime.go b/magicmime.go index 746e1be..60b4178 100644 --- a/magicmime.go +++ b/magicmime.go @@ -152,9 +152,11 @@ func NewDecoderWithMagicDB(flags Flag, magicDB string) (*Decoder, error) { return nil, errors.New("error opening magic") } d := &Decoder{db: db} + var err error if code := C.magic_setflags(db, C.int(flags)); code != 0 { + err = errors.New(C.GoString(C.magic_error(d.db))) d.Close() - return nil, errors.New(C.GoString(C.magic_error(d.db))) + return nil, err } path := C.CString(magicDB) defer C.free(unsafe.Pointer(path))