Index: third_party/twisted_8_1/twisted/pair/tuntap.py |
diff --git a/third_party/twisted_8_1/twisted/pair/tuntap.py b/third_party/twisted_8_1/twisted/pair/tuntap.py |
deleted file mode 100644 |
index a8da85e0846ed43015098aabcd8921453b2be3c1..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/pair/tuntap.py |
+++ /dev/null |
@@ -1,170 +0,0 @@ |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-# |
-import errno, os |
-from twisted.python import log, reflect, components |
-from twisted.internet import base, fdesc, error |
-from twisted.pair import ethernet, ip |
- |
-""" |
-You need Eunuchs for twisted.pair.tuntap to work. |
- |
-Eunuchs is a library containing the missing manly parts of |
-UNIX API for Python. |
- |
-Eunuchs is a library of Python extension that complement the standard |
-libraries in parts where full support for the UNIX API (or the Linux |
-API) is missing. |
- |
-Most of the functions wrapped by Eunuchs are low-level, dirty, but |
-absolutely necessary functions for real systems programming. The aim is |
-to have the functions added to mainstream Python libraries. |
- |
-Current list of functions included: |
- |
- - fchdir(2) |
- - recvmsg(2) and sendmsg(2), including use of cmsg(3) |
- - socketpair(2) |
- - support for TUN/TAP virtual network interfaces |
- |
-Eunuchs doesn't have a proper web home right now, but you can fetch |
-the source from http://ftp.debian.org/debian/pool/main/e/eunuch |
--- debian users can just use 'apt-get install python-eunuchs'. |
- |
-""" |
-from eunuchs.tuntap import opentuntap, TuntapPacketInfo, makePacketInfo |
- |
-class TuntapPort(base.BasePort): |
- """A Port that reads and writes packets from/to a TUN/TAP-device. |
- |
- TODO: Share general start/stop etc implementation details with |
- twisted.internet.udp.Port. |
- """ |
- maxThroughput = 256 * 1024 # max bytes we read in one eventloop iteration |
- |
- def __init__(self, interface, proto, maxPacketSize=8192, reactor=None): |
- if components.implements(proto, ethernet.IEthernetProtocol): |
- self.ethernet = 1 |
- else: |
- self.ethernet = 0 |
- assert components.implements(proto, ip.IIPProtocol) # XXX: fix me |
- base.BasePort.__init__(self, reactor) |
- self.interface = interface |
- self.protocol = proto |
- self.maxPacketSize = maxPacketSize |
- self.setLogStr() |
- |
- def __repr__(self): |
- return "<%s on %s>" % (self.protocol.__class__, self.interface) |
- |
- def startListening(self): |
- """Create and bind my socket, and begin listening on it. |
- |
- This is called on unserialization, and must be called after creating a |
- server to begin listening on the specified port. |
- """ |
- self._bindSocket() |
- self._connectToProtocol() |
- |
- def _bindSocket(self): |
- log.msg("%s starting on %s"%(self.protocol.__class__, self.interface)) |
- try: |
- fd, name = opentuntap(name=self.interface, |
- ethernet=self.ethernet, |
- packetinfo=0) |
- except OSError, e: |
- raise error.CannotListenError, (None, self.interface, e) |
- fdesc.setNonBlocking(fd) |
- self.interface = name |
- self.connected = 1 |
- self.fd = fd |
- |
- def fileno(self): |
- return self.fd |
- |
- def _connectToProtocol(self): |
- self.protocol.makeConnection(self) |
- self.startReading() |
- |
- def doRead(self): |
- """Called when my socket is ready for reading.""" |
- read = 0 |
- while read < self.maxThroughput: |
- try: |
- data = os.read(self.fd, self.maxPacketSize) |
- read += len(data) |
-# pkt = TuntapPacketInfo(data) |
- self.protocol.datagramReceived(data, |
- partial=0 # pkt.isPartial(), |
- ) |
- except OSError, e: |
- if e.errno in (errno.EWOULDBLOCK,): |
- return |
- else: |
- raise |
- except IOError, e: |
- if e.errno in (errno.EAGAIN, errno.EINTR): |
- return |
- else: |
- raise |
- except: |
- log.deferr() |
- |
- def write(self, datagram): |
- """Write a datagram.""" |
-# header = makePacketInfo(0, 0) |
- try: |
- return os.write(self.fd, datagram) |
- except IOError, e: |
- if e.errno == errno.EINTR: |
- return self.write(datagram) |
- elif e.errno == errno.EMSGSIZE: |
- raise error.MessageLengthError, "message too long" |
- elif e.errno == errno.ECONNREFUSED: |
- raise error.ConnectionRefusedError |
- else: |
- raise |
- |
- def writeSequence(self, seq): |
- self.write("".join(seq)) |
- |
- def loseConnection(self): |
- """Stop accepting connections on this port. |
- |
- This will shut down my socket and call self.connectionLost(). |
- """ |
- self.stopReading() |
- if self.connected: |
- from twisted.internet import reactor |
- reactor.callLater(0, self.connectionLost) |
- |
- stopListening = loseConnection |
- |
- def connectionLost(self, reason=None): |
- """Cleans up my socket. |
- """ |
- log.msg('(Tuntap %s Closed)' % self.interface) |
- base.BasePort.connectionLost(self, reason) |
- if hasattr(self, "protocol"): |
- # we won't have attribute in ConnectedPort, in cases |
- # where there was an error in connection process |
- self.protocol.doStop() |
- self.connected = 0 |
- os.close(self.fd) |
- del self.fd |
- |
- def setLogStr(self): |
- self.logstr = reflect.qual(self.protocol.__class__) + " (TUNTAP)" |
- |
- def logPrefix(self): |
- """Returns the name of my class, to prefix log entries with. |
- """ |
- return self.logstr |
- |
- def getHost(self): |
- """ |
- Returns a tuple of ('TUNTAP', interface), indicating |
- the servers address |
- """ |
- return ('TUNTAP',)+self.interface |