diff options
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Unsupported/mactcp/MACTCPconst.py | 62 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/MacTCPerrors.py | 35 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/socket.py | 240 |
3 files changed, 337 insertions, 0 deletions
diff --git a/Mac/Unsupported/mactcp/MACTCPconst.py b/Mac/Unsupported/mactcp/MACTCPconst.py new file mode 100644 index 0000000..47b9d68 --- /dev/null +++ b/Mac/Unsupported/mactcp/MACTCPconst.py @@ -0,0 +1,62 @@ +# +# MACTCP - event codes for the mactcp module +# + +# UDP asr event codes +UDPDataArrival=1 # A datagram has arrived +UDPICMPReceived=2 # An ICMP error was received + +# TCP asr event codes +TCPClosing=1 # All incoming data has been received and read. +TCPULPTimeout=2 # No response from remote process. +TCPTerminate=3 # Connection terminated. Has a detail parameter. +TCPDataArrival=4 # Data has arrived (and no Rcv call is outstanding) +TCPUrgent=5 # Urgent data is outstanding +TCPICMPReceived=6 # An ICMP error was received +PassiveOpenDone=32766 # (python only) a PassiveOpen has completed. + +# TCP termination reasons +TCPRemoteAbort=2 +TCPNetworkFailure=3 +TCPSecPrecMismatch=4 +TCPULPTimeoutTerminate=5 +TCPULPAbort=6 +TCPULPClose=7 +TCPServiceError=8 + +# MacTCP/DNR errors +ipBadLapErr = -23000 # bad network configuration +ipBadCnfgErr = -23001 # bad IP configuration error +ipNoCnfgErr = -23002 # missing IP or LAP configuration error +ipLoadErr = -23003 # error in MacTCP load +ipBadAddr = -23004 # error in getting address +connectionClosing = -23005 # connection is closing +invalidLength = -23006 +connectionExists = -23007 # request conflicts with existing connection +connectionDoesntExist = -23008 # connection does not exist +insufficientResources = -23009 # insufficient resources to perform request +invalidStreamPtr = -23010 +streamAlreadyOpen = -23011 +connectionTerminated = -23012 +invalidBufPtr = -23013 +invalidRDS = -23014 +invalidWDS = -23014 +openFailed = -23015 +commandTimeout = -23016 +duplicateSocket = -23017 + +# Error codes from internal IP functions +ipDontFragErr = -23032 # Packet too large to send w/o fragmenting +ipDestDeadErr = -23033 # destination not responding +icmpEchoTimeoutErr = -23035 # ICMP echo timed-out +ipNoFragMemErr = -23036 # no memory to send fragmented pkt +ipRouteErr = -23037 # can't route packet off-net + +nameSyntaxErr = -23041 +cacheFault = -23042 +noResultProc = -23043 +noNameServer = -23044 +authNameErr = -23045 +noAnsErr = -23046 +dnrErr = -23047 +outOfMemory = -23048 diff --git a/Mac/Unsupported/mactcp/MacTCPerrors.py b/Mac/Unsupported/mactcp/MacTCPerrors.py new file mode 100644 index 0000000..3f6e72b --- /dev/null +++ b/Mac/Unsupported/mactcp/MacTCPerrors.py @@ -0,0 +1,35 @@ +ipBadLapErr = -23000 # bad network configuration +ipBadCnfgErr = -23001 # bad IP configuration error +ipNoCnfgErr = -23002 # missing IP or LAP configuration error +ipLoadErr = -23003 # error in MacTCP load +ipBadAddr = -23004 # error in getting address +connectionClosing = -23005 # connection is closing +invalidLength = -23006 +connectionExists = -23007 # request conflicts with existing connection +connectionDoesntExist = -23008 # connection does not exist +insufficientResources = -23009 # insufficient resources to perform request +invalidStreamPtr = -23010 +streamAlreadyOpen = -23011 +connectionTerminated = -23012 +invalidBufPtr = -23013 +invalidRDS = -23014 +invalidWDS = -23014 +openFailed = -23015 +commandTimeout = -23016 +duplicateSocket = -23017 + +# Error codes from internal IP functions +ipDontFragErr = -23032 # Packet too large to send w/o fragmenting +ipDestDeadErr = -23033 # destination not responding +icmpEchoTimeoutErr = -23035 # ICMP echo timed-out +ipNoFragMemErr = -23036 # no memory to send fragmented pkt +ipRouteErr = -23037 # can't route packet off-net + +nameSyntaxErr = -23041 +cacheFault = -23042 +noResultProc = -23043 +noNameServer = -23044 +authNameErr = -23045 +noAnsErr = -23046 +dnrErr = -23047 +outOfMemory = -23048 diff --git a/Mac/Unsupported/mactcp/socket.py b/Mac/Unsupported/mactcp/socket.py new file mode 100644 index 0000000..852a653 --- /dev/null +++ b/Mac/Unsupported/mactcp/socket.py @@ -0,0 +1,240 @@ +# +# socket.py for mac - Emulate socket module with mactcp and macdnr +# +# Jack Jansen, CWI, November 1994 +# +import mactcp +import MACTCP +import macdnr +import sys + +# +# Constants +# +_myerror = 'socket_wrapper.error' +error = (mactcp.error, macdnr.error, _myerror) + +SOCK_DGRAM=1 +SOCK_STREAM=2 + +AF_INET=1 + +# +# Internal constants +# +_BUFSIZE=4096 # Size of tcp/udp input buffer +_connectionClosing=-42 # XXXX + +_myaddress=None +_myname=None +_myaddrstr=None + +def _myipaddress(): + global _myaddress + if _myaddress == None: + _myaddress = mactcp.IPAddr() + return _myaddress + +def _ipaddress(str): + if type(str) == type(1): + return str # Already numeric + ptr = macdnr.StrToAddr(str) + ptr.wait() + return ptr.ip0 + +def gethostbyname(str): + id = _ipaddress(str) + return macdnr.AddrToStr(id) + +def gethostname(): + global _myname + if _myname == None: + id = _myipaddress() + ptr = macdnr.AddrToName(id) + ptr.wait() + _myname = ptr.cname + return _myname + +def _gethostaddress(): + global _myaddrstr + if _myaddrstr == None: + id = _myipaddress() + _myaddrstr = macdnr.AddrToStr(id) + return _myaddrstr + +def socket(family, type, *which): + if family <> AF_INET: + raise my_error, 'Protocol family not supported' + if type == SOCK_DGRAM: + return _udpsocket() + elif type == SOCK_STREAM: + return _tcpsocket() + raise my_error, 'Protocol type not supported' + +def fromfd(*args): + raise my_error, 'Operation not supported on a mac' + +class _socket: + def accept(self, *args): + raise my_error, 'Operation not supported on this socket' + + bind = accept + close = accept + connect = accept + fileno = accept + getpeername = accept + getsockname = accept + getsockopt = accept + listen = accept + recv = accept + recvfrom = accept + send = accept + sendto = accept + setblocking = accept + setsockopt = accept + shutdown = accept + +class _tcpsocket(_socket): + def __init__(self): + self.stream = mactcp.TCPCreate(_BUFSIZE) + ##self.stream.asr = self.asr + self.databuf = '' + self.udatabuf = '' + self.port = 0 + self.accepted = 0 + self.listening = 0 + + def accept(self): + if not self.listening: + raise my_error, 'Not listening' + self.listening = 0 + self.stream.wait() + self.accepted = 1 + return self, self.getsockname() + + def bind(self, host, port): + self.port = port + + def close(self): + if self.accepted: + self.accepted = 0 + return + self.stream.Abort() + + def connect(self, host, port): + self.stream.ActiveOpen(self.port, _ipaddress(host), port) + + def getsockname(self): + st = self.stream.Status() + host = macdnr.AddrToStr(st.localHost) + return host, st.localPort + + def getpeername(self): + st = self.stream.Status() + host = macdnr.AddrToStr(st.remoteHost) + return host, st.remotePort + + def listen(self, backlog): + self.stream.PassiveOpen(self.port) + self.listening = 1 + + def makefile(self, rw): + return _socketfile(self) + + def recv(self, bufsize, flags=0): + if flags: + raise my_error, 'recv flags not yet supported on mac' + if not self.databuf: + try: + self.databuf, urg, mark = self.stream.Rcv(0) + if not self.databuf: + print '** socket: no data!' + print '** recv: got ', len(self.databuf) + except mactcp.error, arg: + if arg[0] != MACTCP.connectionClosing: + raise mactcp.error, arg + rv = self.databuf[:bufsize] + self.databuf = self.databuf[bufsize:] + return rv + + def send(self, buf): + self.stream.Send(buf) + return len(buf) + + def shutdown(self, how): + if how == 0: + return + self.stream.Close() + + def bytes_readable(self): + st = self.stream.Status() + return st.amtUnreadData + + def bytes_writeable(self): + st = self.stream.Status() + return st.sendWindow - st.sendUnacked; + +class _udpsocket(_socket): + def __init__(self): + pass + +class _socketfile: + def __init__(self, sock): + self.sock = sock + self.buf = '' + + def read(self, *arg): + if arg: + length = arg + else: + length = 0x7fffffff + while len(self.buf) < length: + new = self.sock.recv(0x7fffffff) + if not new: + break + self.buf = self.buf + new + rv = self.buf[:length] + self.buf = self.buf[length:] + return rv + + def readline(self): + import string + while not '\n' in self.buf: + new = self.sock.recv(0x7fffffff) + if not new: + break + self.buf = self.buf + new + if not '\n' in self.buf: + rv = self.buf + self.buf = '' + else: + i = string.index(self.buf, '\n') + rv = self.buf[:i+1] + self.buf = self.buf[i+1:] + print '** Readline:',self, `rv` + return rv + + def write(self, buf): + self.sock.send(buf) + + def close(self): + self.sock.close() + del self.sock + +def __test_tcp(): + s = socket(AF_INET, SOCK_STREAM) + s.connect('poseidon.cwi.nl', 13) + rv = s.recv(1000) + print 'Time/date:', rv + rv = s.recv(1000) + if rv: + print 'Unexpected extra data:', rv + s.close() + +def __test_udp(): + s = socket(AF_INET, SOCK_DGRAM) + print 'Sending data... (hello world)' + s.sendto(('poseidon.cwi.nl', 7), 'hello world') + rv, host = s.recvfrom(1000) + print 'Got from ', host, ':', rv + |