#!/usr/local/bin/python # # Copyright 2005 John-Mark Gurney # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # import socket import select __all__ = [ 'divert' ] IPPROTO_DIVERT = 258 class Divert: def __init__(self, port, block = True, bufsize = 2048): self.sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, IPPROTO_DIVERT) self.sock.bind(('127.0.0.1', port)) self.block = block self.bufsize = bufsize self.sock.setblocking(block) def handlepkt(self, buf, addr): raise NotImplementedError def sendpkt(self, buf, addr = None): if addr != None: return self.sock.sendto(buf, addr) else: return self.sock.send(buf) def checkandhandle(self, timeout = None): args = [ [self.sock], [], [] ] if timeout != None: args.append(timeout) rd, foo, foo = apply(select.select, args) if rd: buf, addr = self.sock.recvfrom(self.bufsize) if buf: self.handlepkt(buf, addr)