File: tcpbug.py

package info (click to toggle)
python-xlib 0.14%2B20091101-5
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,892 kB
  • ctags: 7,957
  • sloc: python: 22,536; awk: 89; makefile: 61
file content (87 lines) | stat: -rwxr-xr-x 2,242 bytes parent folder | download | duplicates (7)
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/python

import socket
import select
import sys
import os

def tcpbug(listenaddr, destaddr, outputfd):
    listen = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    listen.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    listen.bind(listenaddr)
    listen.listen(1)

    client, addr = listen.accept()

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.connect(destaddr)

    cwbuf = swbuf = outbuf = ''

    while client or server or outbuf:
        readset = []
        if client:
            readset.append(client)
        if server:
            readset.append(server)

        writeset = []
        if cwbuf and client:
            writeset.append(client)
        if swbuf and server:
            writeset.append(server)
        if outbuf:
            writeset.append(outputfd)

        readset, writeset, e = select.select(readset, writeset, [])

        if client in readset:
            data = client.recv(2000)
            if data:
                swbuf = swbuf + data
                outbuf = outbuf + 'C%d\n%s' % (len(data), data)
            else:
                client = None

        if server in readset:
            data = server.recv(2000)
            if data:
                cwbuf = cwbuf + data
                outbuf = outbuf + 'S%d\n%s' % (len(data), data)
            else:
                server = None

        if client in writeset:
            n = client.send(cwbuf)
            cwbuf = cwbuf[n:]

        if server in writeset:
            n = server.send(swbuf)
            swbuf = swbuf[n:]

        if outputfd in writeset:
            n = os.write(outputfd, outbuf)
            outbuf = outbuf[n:]

        if client and not cwbuf and not server:
            client.close()
            client = None

        if server and not swbuf and not client:
            server.close()
            server = None

def main():
    try:
        lport = int(sys.argv[1])
        dhost = sys.argv[2]
        dport = int(sys.argv[3])
    except (IndexError, ValueError):
        sys.stderr.write('Usage: %s listenport desthost destport\n'
                         % sys.argv[0])
        exit(1)

    tcpbug(('', lport), (dhost, dport), 1)

if __name__ == '__main__':
    main()