summaryrefslogtreecommitdiff
path: root/magic.py
diff options
context:
space:
mode:
authorAdam Hupp <adam@hupp.org>2020-12-11 11:57:07 -0800
committerGitHub <noreply@github.com>2020-12-11 11:57:07 -0800
commita96081edc65ddcf20599b3fa1ef72eb2c55f1055 (patch)
tree05c80abbc80da3c96184999a33524fc9b069cabe /magic.py
parent35026a19d6ff2b1934999ec6fb9c1812e4d4b07e (diff)
parentca14bfba7d1eeea543c9e00ea33d1487a49e68e0 (diff)
downloadpython-magic-a96081edc65ddcf20599b3fa1ef72eb2c55f1055.tar.gz
Merge pull request #227 from psrok1/magic-descriptor
Added support for magic_descriptor routine
Diffstat (limited to 'magic.py')
-rw-r--r--magic.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/magic.py b/magic.py
index ccddf46..3b351e2 100644
--- a/magic.py
+++ b/magic.py
@@ -114,6 +114,13 @@ class Magic:
except MagicException as e:
return self._handle509Bug(e)
+ def from_descriptor(self, fd):
+ with self.lock:
+ try:
+ return maybe_decode(magic_descriptor(self.cookie, fd))
+ except MagicException as e:
+ return self._handle509Bug(e)
+
def _handle509Bug(self, e):
# libmagic 5.09 has a bug where it might fail to identify the
# mimetype of a file and returns null from magic_file (and
@@ -180,6 +187,20 @@ def from_buffer(buffer, mime=False):
return m.from_buffer(buffer)
+def from_descriptor(fd, mime=False):
+ """
+ Accepts a file descriptor and returns the detected filetype. Return
+ value is the mimetype if mime=True, otherwise a human readable
+ name.
+
+ >>> f = open("testdata/test.pdf")
+ >>> magic.from_descriptor(f.fileno())
+ 'PDF document, version 1.2'
+ """
+ m = _get_magic_type(mime)
+ return m.from_descriptor(fd)
+
+
libmagic = None
# Let's try to find magic or magic1
dll = ctypes.util.find_library('magic') \
@@ -287,6 +308,7 @@ _magic_file.errcheck = errorcheck_null
def magic_file(cookie, filename):
return _magic_file(cookie, coerce_filename(filename))
+
_magic_buffer = libmagic.magic_buffer
_magic_buffer.restype = c_char_p
_magic_buffer.argtypes = [magic_t, c_void_p, c_size_t]
@@ -297,6 +319,16 @@ def magic_buffer(cookie, buf):
return _magic_buffer(cookie, buf, len(buf))
+_magic_descriptor = libmagic.magic_descriptor
+_magic_descriptor.restype = c_char_p
+_magic_descriptor.argtypes = [magic_t, c_int]
+_magic_descriptor.errcheck = errorcheck_null
+
+
+def magic_descriptor(cookie, fd):
+ return _magic_descriptor(cookie, fd)
+
+
_magic_load = libmagic.magic_load
_magic_load.restype = c_int
_magic_load.argtypes = [magic_t, c_char_p]
@@ -306,6 +338,7 @@ _magic_load.errcheck = errorcheck_negative_one
def magic_load(cookie, filename):
return _magic_load(cookie, coerce_filename(filename))
+
magic_setflags = libmagic.magic_setflags
magic_setflags.restype = c_int
magic_setflags.argtypes = [magic_t, c_int]