chiark / gitweb /
slip fix
[hippotat.git] / hippotat / __init__.py
index 9f72b48abcee4f225cb0917dbf5dcece16450a0e..654a5c5f52fe2bccfd9d043d2acb3185e68a81cd 100644 (file)
@@ -206,8 +206,9 @@ class SlipStreamDecoder():
 
   def inputdata(self, data):
     self._log('inputdata', d=data)
-    packets = slip.decode(data)
-    packets[0] = self._buffer + packets[0]
+    data = self._buffer + data
+    self._buffer = b''
+    packets = slip.decode(data, True)
     self._buffer = packets.pop()
     for packet in packets:
       self._maybe_packet(packet)
@@ -220,8 +221,11 @@ class SlipStreamDecoder():
 
   def flush(self):
     self._log('flush')
-    self._maybe_packet(self._buffer)
+    data = self._buffer
     self._buffer = b''
+    packets = slip.decode(data)
+    assert(len(packets) == 1)
+    self._maybe_packet(packets[0])
 
 class _IpifProcessProtocol(twisted.internet.protocol.ProcessProtocol):
   def __init__(self, router):
@@ -240,14 +244,14 @@ class _IpifProcessProtocol(twisted.internet.protocol.ProcessProtocol):
     status.raiseException()
 
 def start_ipif(command, router):
-  global ipif
   ipif = _IpifProcessProtocol(router)
   reactor.spawnProcess(ipif,
                        '/bin/sh',['sh','-xc', command],
                        childFDs={0:'w', 1:'r', 2:2},
                        env=None)
+  return ipif
 
-def queue_inbound(packet):
+def queue_inbound(ipif, packet):
   log_debug(DBG.FLOW, "queue_inbound", d=packet)
   ipif.transport.write(slip.delimiter)
   ipif.transport.write(slip.encode(packet))