1# Copyright (c) 2016, Tomohiro Kusumi
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are met:
6#
7# 1. Redistributions of source code must retain the above copyright notice, this
8#    list of conditions and the following disclaimer.
9# 2. Redistributions in binary form must reproduce the above copyright notice,
10#    this list of conditions and the following disclaimer in the documentation
11#    and/or other materials provided with the distribution.
12#
13# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
24import sys
25
26from . import setting
27from . import util
28
29class Error (util.GenericError):
30    pass
31
32try:
33    from . import _native
34    _e = None
35except Exception: # not only ImportError
36    _e = sys.exc_info()[1]
37    _native = None
38    if setting.use_debug:
39        raise
40
41def get_so(safe=False):
42    if not _native:
43        if safe:
44            return None
45        raise Error(repr(_e))
46    return _native
47
48def is_enabled():
49    return get_so(True) is not None
50
51def get_blkdev_info(f):
52    return get_so().get_blkdev_info(f)
53
54def has_ptrace():
55    return get_ptrace_word_size() > 0
56
57def ptrace_peektext(pid, addr):
58    return get_so().ptrace_peektext(pid, addr)
59
60def ptrace_peekdata(pid, addr):
61    return get_so().ptrace_peekdata(pid, addr)
62
63def ptrace_poketext(pid, addr, data):
64    return get_so().ptrace_poketext(pid, addr, data)
65
66def ptrace_pokedata(pid, addr, data):
67    return get_so().ptrace_pokedata(pid, addr, data)
68
69def ptrace_attach(pid):
70    return get_so().ptrace_attach(pid)
71
72def ptrace_detach(pid):
73    return get_so().ptrace_detach(pid)
74
75def get_ptrace_word_size():
76    try:
77        return get_so().get_ptrace_word_size()
78    except Exception:
79        return -1 # don't raise an exception
80