New standard modules for the mac.
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
+