aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/utils.py
blob: 00e1cd12de9a2cbeca8835120384b5375cc6ac8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import socket


def isascii(s):
    try:
        s.decode("ascii")
    except ValueError:
        return False
    return True


def cleanBin(s, fixspacing=False):
    """
        Cleans binary data to make it safe to display. If fixspacing is True,
        tabs, newlines and so forth will be maintained, if not, they will be
        replaced with a placeholder.
    """
    parts = []
    for i in s:
        o = ord(i)
        if (o > 31 and o < 127):
            parts.append(i)
        elif i in "\n\t" and not fixspacing:
            parts.append(i)
        else:
            parts.append(".")
    return "".join(parts)


def hexdump(s):
    """
        Returns a set of tuples:
            (offset, hex, str)
    """
    parts = []
    for i in range(0, len(s), 16):
        o = "%.10x" % i
        part = s[i:i + 16]
        x = " ".join("%.2x" % ord(i) for i in part)
        if len(part) < 16:
            x += " "
            x += " ".join("  " for i in range(16 - len(part)))
        parts.append(
            (o, x, cleanBin(part, True))
        )
    return parts


def inet_ntop(address_family, packed_ip):
    if hasattr(socket, "inet_ntop"):
        return socket.inet_ntop(address_family, packed_ip)
    # Windows Fallbacks
    if address_family == socket.AF_INET:
        return socket.inet_ntoa(packed_ip)
    if address_family == socket.AF_INET6:
        ip = packed_ip.encode("hex")
        return ":".join([ip[i:i + 4] for i in range(0, len(ip), 4)])


def inet_pton(address_family, ip_string):
    if hasattr(socket, "inet_pton"):
        return socket.inet_pton(address_family, ip_string)
    # Windows Fallbacks
    if address_family == socket.AF_INET:
        return socket.inet_aton(ip_string)
    if address_family == socket.AF_INET6:
        return ip_string.replace(":", "").decode("hex")