From c403a83ab83c36df6938d3b4cb883999b49f5eec Mon Sep 17 00:00:00 2001
From: Avery Pennarun <apenwarr@gmail.com>
Date: Fri, 1 Oct 2010 14:23:27 -0700
Subject: [PATCH] Don't use set() since it's not in python 2.3.

Just use a plain list instead.  Technically probably slightly worse
asymptotic behaviour, but it's not like we'll have a million sockets anyway.
---
 client.py  | 10 +++++-----
 helpers.py |  7 +++++++
 server.py  | 10 +++++-----
 ssnet.py   | 28 +++++++++++++++++-----------
 4 files changed, 34 insertions(+), 21 deletions(-)

diff --git a/client.py b/client.py
index 5a0500d..0a4b2e5 100644
--- a/client.py
+++ b/client.py
@@ -176,9 +176,9 @@ def _main(listener, fw, use_server, remotename, python, seed_hosts, auto_nets):
             if rv:
                 raise Fatal('server died with error code %d' % rv)
         
-        r = set()
-        w = set()
-        x = set()
+        r = []
+        w = []
+        x = []
         handlers = filter(lambda s: s.ok, handlers)
         for s in handlers:
             s.pre_select(r,w,x)
@@ -186,9 +186,9 @@ def _main(listener, fw, use_server, remotename, python, seed_hosts, auto_nets):
             % (len(handlers), len(r), len(w), len(x)))
         (r,w,x) = select.select(r,w,x)
         #log('r=%r w=%r x=%r\n' % (r,w,x))
-        ready = set(r) | set(w) | set(x)
+        ready = r+w+x
         for s in handlers:
-            if s.socks & ready:
+            if list_contains_any(s.socks, ready):
                 s.callback()
         if use_server:
             mux.callback()
diff --git a/helpers.py b/helpers.py
index 8793417..18871a2 100644
--- a/helpers.py
+++ b/helpers.py
@@ -28,3 +28,10 @@ def debug3(s):
 
 class Fatal(Exception):
     pass
+
+
+def list_contains_any(l, sub):
+    for i in sub:
+        if i in l:
+            return True
+    return False
diff --git a/server.py b/server.py
index f285e2c..ad2d21d 100644
--- a/server.py
+++ b/server.py
@@ -158,9 +158,9 @@ def main():
             if rpid:
                 raise Fatal('hostwatch exited unexpectedly: code 0x%04x\n' % rv)
         
-        r = set()
-        w = set()
-        x = set()
+        r = []
+        w = []
+        x = []
         handlers = filter(lambda s: s.ok, handlers)
         for s in handlers:
             s.pre_select(r,w,x)
@@ -169,10 +169,10 @@ def main():
                   mux.fullness, mux.too_full))
         (r,w,x) = select.select(r,w,x)
         #log('r=%r w=%r x=%r\n' % (r,w,x))
-        ready = set(r) | set(w) | set(x)
+        ready = r+w+x
         for s in handlers:
             #debug2('check: %r: %r\n' % (s, s.socks & ready))
-            if s.socks & ready:
+            if list_contains_any(s.socks, ready):
                 s.callback()
         mux.check_fullness()
         mux.callback()
diff --git a/ssnet.py b/ssnet.py
index 932fab4..7aebe25 100644
--- a/ssnet.py
+++ b/ssnet.py
@@ -31,6 +31,11 @@ cmd_to_name = {
     
 
 
+def _add(l, elem):
+    if not elem in l:
+        l.append(elem)
+
+
 def _nb_clean(func, *args):
     try:
         return func(*args)
@@ -167,12 +172,13 @@ class SockWrapper:
 class Handler:
     def __init__(self, socks = None, callback = None):
         self.ok = True
-        self.socks = set(socks or [])
+        self.socks = socks or []
         if callback:
             self.callback = callback
 
     def pre_select(self, r, w, x):
-        r |= self.socks
+        for i in self.socks:
+            _add(r, i)
 
     def callback(self):
         log('--no callback defined-- %r\n' % self)
@@ -181,7 +187,7 @@ class Handler:
             v = s.recv(4096)
             if not v:
                 log('--closed-- %r\n' % self)
-                self.socks = set()
+                self.socks = []
                 self.ok = False
 
 
@@ -194,20 +200,20 @@ class Proxy(Handler):
 
     def pre_select(self, r, w, x):
         if self.wrap1.connect_to:
-            w.add(self.wrap1.rsock)
+            _add(w, self.wrap1.rsock)
         elif self.wrap1.buf:
             if not self.wrap2.too_full():
-                w.add(self.wrap2.wsock)
+                _add(w, self.wrap2.wsock)
         elif not self.wrap1.shut_read:
-            r.add(self.wrap1.rsock)
+            _add(r, self.wrap1.rsock)
 
         if self.wrap2.connect_to:
-            w.add(self.wrap2.rsock)
+            _add(w, self.wrap2.rsock)
         elif self.wrap2.buf:
             if not self.wrap1.too_full():
-                w.add(self.wrap1.wsock)
+                _add(w, self.wrap1.wsock)
         elif not self.wrap2.shut_read:
-            r.add(self.wrap2.rsock)
+            _add(r, self.wrap2.rsock)
 
     def callback(self):
         self.wrap1.try_connect()
@@ -349,9 +355,9 @@ class Mux(Handler):
                 break
 
     def pre_select(self, r, w, x):
-        r.add(self.rsock)
+        _add(r, self.rsock)
         if self.outbuf:
-            w.add(self.wsock)
+            _add(w, self.wsock)
 
     def callback(self):
         (r,w,x) = select.select([self.rsock], [self.wsock], [], 0)