diff --git a/scapy/scapypipes.py b/scapy/scapypipes.py index 9af8193e4da5e76d8f70ba1b563547989c5dd191..fbd4747e1961dd5e8db978cd3a326b7c191fc264 100644 --- a/scapy/scapypipes.py +++ b/scapy/scapypipes.py @@ -124,3 +124,53 @@ class UDPDrain(Drain): p = IP(dst=self.ip)/UDP(sport=1234,dport=self.port)/msg self._send(p) + +class FDSourceSink(Source): + def __init__(self, fd, name=None): + Source.__init__(self, name=name) + self.fd = fd + def push(self, msg): + self.fd.write(msg) + def fileno(self): + return self.fd.fileno() + def deliver(self): + self._send(self.fd.read()) + + +class TCPConnectPipe(Source): + def __init__(self, addr="", port=0, name=None): + Source.__init__(self, name=name) + self.addr = addr + self.port = port + self.fd = None + def start(self): + self.fd = socket.socket() + self.fd.connect((self.addr,self.port)) + def stop(self): + self.fd.close() + def push(self, msg): + self.fd.send(msg) + def fileno(self): + return self.fd.fileno() + def deliver(self): + self._send(self.fd.recv(65536)) + +class TCPListenPipe(TCPConnectPipe): + def __init__(self, addr="", port=0, name=None): + TCPConnectPipe.__init__(self, addr, port, name) + self.connected = False + def start(self): + self.connected = False + self.fd = socket.socket() + self.fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.fd.bind((self.addr,self.port)) + self.fd.listen(1) + def deliver(self): + if self.connected: + self._send(self.fd.recv(65536)) + else: + fd,frm = self.fd.accept() + self._high_send(repr(frm)) + self.fd.close() + self.fd = fd + self.connected = True