diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2001-05-10 12:17:03 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2001-05-10 12:17:03 (GMT) |
commit | d454b578e29e073250936948df5044e41fada772 (patch) | |
tree | 379ff07879dddaf262539ee01892c87a865494be /Mac/Unsupported/mactcp | |
parent | 95bf9390a488004f66db1eccaa049203ef8ab5b3 (diff) | |
download | cpython-d454b578e29e073250936948df5044e41fada772.zip cpython-d454b578e29e073250936948df5044e41fada772.tar.gz cpython-d454b578e29e073250936948df5044e41fada772.tar.bz2 |
Has been dead so long that there's no use keeping it in the active bit of the repository.
Diffstat (limited to 'Mac/Unsupported/mactcp')
-rw-r--r-- | Mac/Unsupported/mactcp/MACTCPconst.py | 62 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/MacTCPerrors.py | 35 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/macdnrmodule.c | 459 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/mactcpmodule.c | 990 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/mactcpmodules.mu.exp | 2 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/mactcpmodules.mu.hqx | 212 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/socket.py | 304 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/tcpglue.c | 477 | ||||
-rw-r--r-- | Mac/Unsupported/mactcp/tcpglue.h | 68 |
9 files changed, 0 insertions, 2609 deletions
diff --git a/Mac/Unsupported/mactcp/MACTCPconst.py b/Mac/Unsupported/mactcp/MACTCPconst.py deleted file mode 100644 index 47b9d68..0000000 --- a/Mac/Unsupported/mactcp/MACTCPconst.py +++ /dev/null @@ -1,62 +0,0 @@ -# -# 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 deleted file mode 100644 index 3f6e72b..0000000 --- a/Mac/Unsupported/mactcp/MacTCPerrors.py +++ /dev/null @@ -1,35 +0,0 @@ -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/macdnrmodule.c b/Mac/Unsupported/mactcp/macdnrmodule.c deleted file mode 100644 index fe89e03..0000000 --- a/Mac/Unsupported/mactcp/macdnrmodule.c +++ /dev/null @@ -1,459 +0,0 @@ -/*********************************************************** -Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, -The Netherlands. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the names of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -******************************************************************/ - -#include "allobjects.h" -#include "modsupport.h" /* For getargs() etc. */ - -#include "macglue.h" -#include <AddressXlation.h> -#include <Desk.h> - -#ifndef HAVE_UNIVERSAL_HEADERS -#define ResultUPP ResultProcPtr -#define NewResultProc(x) (x) -#define ResultProc2UPP ResultProc2Ptr -#define NewResultProc2Proc(x) (x) -#endif - -static object *ErrorObject; - -/* ----------------------------------------------------- */ -/* Declarations for objects of type MacTCP DNR Result */ - -/* Types of records we have */ -#define DNR_ADDR 0 -#define DNR_HINFO 1 -#define DNR_MX 2 - -typedef struct { - OB_HEAD - int type; /* DNR_XXX */ - int waiting; /* True while completion proc not called */ - struct returnRec hinfo; -} dnrrobject; - -staticforward typeobject Dnrrtype; - -#define is_dnrrobject(v) ((v)->ob_type == &Dnrrtype) - -/* ---------------------------------------------------------------- */ - -static pascal void -dnrr_done(rrp, udp) - struct hostInfo *rrp; /* Unused */ - dnrrobject *udp; -{ - if ( !udp->waiting ) { - printf("macdnr: dnrr_done: spurious completion call!\n"); - return; - } - udp->waiting = 0; - DECREF(udp); -} - -static int dnrwait(self) - dnrrobject *self; -{ - while ( self->waiting ) { - if ( PyMac_Idle() ) - return 0; - } - return 1; -} - -static object * -dnrr_wait(self, args) - dnrrobject *self; - object *args; -{ - if (!newgetargs(args, "")) - return NULL; - if ( !dnrwait(self) ) { - /* XXX An interrupt is pending -- is this correct? */ - INCREF(None); - return None; - } - if ( self->hinfo.rtnCode ) { - PyErr_Mac(ErrorObject, self->hinfo.rtnCode); - return NULL; - } - INCREF(None); - return None; -} - -static object * -dnrr_isdone(self, args) - dnrrobject *self; - object *args; -{ - if (!newgetargs(args, "")) - return NULL; - return newintobject(!self->waiting); -} - -static struct methodlist dnrr_methods[] = { - {"wait", (method)dnrr_wait, 1}, - {"isdone", (method)dnrr_isdone, 1}, - - {NULL, NULL} /* sentinel */ -}; - -/* ---------- */ - -static dnrrobject * -newdnrrobject(tp) - int tp; -{ - dnrrobject *self; - - self = NEWOBJ(dnrrobject, &Dnrrtype); - if (self == NULL) - return NULL; - self->type = tp; - self->waiting = 0; - memset(&self->hinfo, 0, sizeof(self->hinfo)); - return self; -} - -static void -dnrr_dealloc(self) - dnrrobject *self; -{ - self->waiting = 0; /* Not really needed, since we incref for completion */ - DEL(self); -} - -/* Code to access structure members by accessing attributes */ - -#include "structmember.h" - -#define OFF(x) offsetof(struct returnRec, x) - -static struct memberlist dnrr_memberlist_addr[] = { - { "rtnCode", T_INT, OFF(rtnCode), RO}, - { "cname", T_STRING_INPLACE, OFF(cname), RO}, - { "ip0", T_UINT, OFF(rdata.addr[0]), RO}, - { "ip1", T_UINT, OFF(rdata.addr[1]), RO}, - { "ip2", T_UINT, OFF(rdata.addr[2]), RO}, - { "ip3", T_UINT, OFF(rdata.addr[3]), RO}, - {NULL} /* Sentinel */ -}; - -static struct memberlist dnrr_memberlist_hinfo[] = { - { "rtnCode", T_INT, OFF(rtnCode), RO}, - { "cname", T_STRING_INPLACE, OFF(cname), RO}, - { "cpuType", T_STRING_INPLACE, OFF(rdata.hinfo.cpuType), RO}, - { "osType", T_STRING_INPLACE, OFF(rdata.hinfo.osType), RO}, - {NULL} /* Sentinel */ -}; - -static struct memberlist dnrr_memberlist_mx[] = { - { "rtnCode", T_INT, OFF(rtnCode), RO}, - { "cname", T_STRING_INPLACE, OFF(cname), RO}, - { "preference", T_USHORT, OFF(rdata.mx.preference), RO}, - { "exchange", T_STRING_INPLACE, OFF(rdata.mx.exchange), RO}, - {NULL} /* Sentinel */ -}; - -static struct memberlist *dnrr_mlists[3] = { - dnrr_memberlist_addr, - dnrr_memberlist_hinfo, - dnrr_memberlist_mx -}; - -static object * -dnrr_getattr(self, name) - dnrrobject *self; - char *name; -{ - object *rv; - int tp; - - rv = findmethod(dnrr_methods, (object *)self, name); - if ( rv ) return rv; - err_clear(); - if ( self->waiting ) - if ( !dnrwait(self) ) { - /* XXX An interrupt is pending -- is this correct? */ - err_setstr(ErrorObject, "Resolver busy"); - return NULL; - } - tp = self->type; - return getmember((char *)&self->hinfo, dnrr_mlists[tp], name); -} - - -static typeobject Dnrrtype = { - OB_HEAD_INIT(&Typetype) - 0, /*ob_size*/ - "MacTCP DNR Result", /*tp_name*/ - sizeof(dnrrobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)dnrr_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)dnrr_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ -}; - -/* End of code for MacTCP DNR Result objects */ -/* -------------------------------------------------------- */ - -int dnr_is_open; - -static int -opendnr(fn) - char *fn; -{ - OSErr err; - - if ( dnr_is_open ) return 1; - if ( (err=OpenResolver(fn)) ) { - PyErr_Mac(ErrorObject, err); - return 0; - } - dnr_is_open = 1; - return 1; -} - -static object * -dnr_Open(self, args) - object *self; /* Not used */ - object *args; -{ - char *fn = NULL; - - if (!newgetargs(args, "|s", &fn)) - return NULL; - if ( dnr_is_open ) { - err_setstr(ErrorObject, "DNR already open"); - return NULL; - } - if ( !opendnr(fn) ) - return NULL; - INCREF(None); - return None; -} - -static object * -dnr_Close(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - - if (!newgetargs(args, "")) - return NULL; - dnr_is_open = 0; - if ( (err=CloseResolver()) ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - INCREF(None); - return None; -} - -static object * -dnr_StrToAddr(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - char *hostname; - dnrrobject *rv; - ResultUPP cb_upp = NewResultProc(dnrr_done); - - if (!newgetargs(args, "s", &hostname)) - return NULL; - if ( !opendnr(NULL) ) - return NULL; - if ( (rv=newdnrrobject(DNR_ADDR)) == NULL ) - return NULL; - err = StrToAddr(hostname, (struct hostInfo *)&rv->hinfo, cb_upp, (char *)rv); - if ( err == cacheFault ) { - rv->waiting++; - INCREF(rv); - } else if ( err ) { - DECREF(rv); - PyErr_Mac(ErrorObject, err); - return NULL; - } - return (object *)rv; -} - -static object * -dnr_AddrToName(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - unsigned long ipaddr; - dnrrobject *rv; - ResultUPP cb_upp = NewResultProc(dnrr_done); - - if (!newgetargs(args, "l", &ipaddr)) - return NULL; - if ( !opendnr(NULL) ) - return NULL; - if ( (rv=newdnrrobject(DNR_ADDR)) == NULL ) - return NULL; - err = AddrToName(ipaddr, (struct hostInfo *)&rv->hinfo, cb_upp, (char *)rv); - if ( err == cacheFault ) { - rv->waiting++; - INCREF(rv); - } else if ( err ) { - DECREF(rv); - PyErr_Mac(ErrorObject, err); - return NULL; - } - return (object *)rv; -} - -static object * -dnr_AddrToStr(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - unsigned long ipaddr; - char ipname[16]; - - if (!newgetargs(args, "l", &ipaddr)) - return NULL; - if ( !opendnr(NULL) ) - return NULL; - if ( (err=AddrToStr(ipaddr, ipname)) ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return newstringobject(ipname); -} - -static object * -dnr_HInfo(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - char *hostname; - dnrrobject *rv; - ResultProc2UPP cb_upp = NewResultProc2Proc(dnrr_done); - - if (!newgetargs(args, "s", &hostname)) - return NULL; - if ( !opendnr(NULL) ) - return NULL; - if ( (rv=newdnrrobject(DNR_HINFO)) == NULL ) - return NULL; - err = HInfo(hostname, &rv->hinfo, cb_upp, (char *)rv); - if ( err == cacheFault ) { - rv->waiting++; - INCREF(rv); - } else if ( err ) { - DECREF(rv); - PyErr_Mac(ErrorObject, err); - return NULL; - } - return (object *)rv; - - if (!newgetargs(args, "")) - return NULL; - INCREF(None); - return None; -} - -static object * -dnr_MXInfo(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - char *hostname; - dnrrobject *rv; - ResultProc2UPP cb_upp = NewResultProc2Proc(dnrr_done); - - if (!newgetargs(args, "s", &hostname)) - return NULL; - if ( !opendnr(NULL) ) - return NULL; - if ( (rv=newdnrrobject(DNR_MX)) == NULL ) - return NULL; - err = MXInfo(hostname, &rv->hinfo, cb_upp, (char *)rv); - if ( err == cacheFault ) { - rv->waiting++; - INCREF(rv); - } else if ( err ) { - DECREF(rv); - PyErr_Mac(ErrorObject, err); - return NULL; - } - return (object *)rv; -} - -/* List of methods defined in the module */ - -static struct methodlist dnr_methods[] = { - {"Open", dnr_Open, 1}, - {"Close", dnr_Close, 1}, - {"StrToAddr", dnr_StrToAddr, 1}, - {"AddrToStr", dnr_AddrToStr, 1}, - {"AddrToName", dnr_AddrToName, 1}, - {"HInfo", dnr_HInfo, 1}, - {"MXInfo", dnr_MXInfo, 1}, - - {NULL, NULL} /* sentinel */ -}; - - -/* Initialization function for the module (*must* be called initmacdnr) */ - -void -initmacdnr() -{ - object *m, *d; - - /* Create the module and add the functions */ - m = initmodule("macdnr", dnr_methods); - - /* Add some symbolic constants to the module */ - d = getmoduledict(m); - ErrorObject = newstringobject("macdnr.error"); - dictinsert(d, "error", ErrorObject); -#if 0 -/* Not needed, after all */ -#define CONST(name, value) o = newintobject(value); dictinsert(d, name, o); - CONST("ADDR", DNR_ADDR); - CONST("HINFO", DNR_HINFO); - CONST("MX", DNR_MX); -#endif - /* Check for errors */ - if (err_occurred()) - fatal("can't initialize module macdnr"); -} diff --git a/Mac/Unsupported/mactcp/mactcpmodule.c b/Mac/Unsupported/mactcp/mactcpmodule.c deleted file mode 100644 index fc07f1e..0000000 --- a/Mac/Unsupported/mactcp/mactcpmodule.c +++ /dev/null @@ -1,990 +0,0 @@ -/*********************************************************** -Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum, -Amsterdam, The Netherlands. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the names of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -******************************************************************/ - -#include "allobjects.h" -#include "modsupport.h" /* For getargs() etc. */ - -#include "macglue.h" -#include "tcpglue.h" - -#include <Desk.h> - -/* State of a tcp stream, in the connectionState field */ -#define STATE_CLOSED 0 -#define STATE_LISTEN 2 -#define STATE_ESTAB 8 -#define STATE_CWAIT 18 - -/* Python code has an additional reason for asr call: open done */ -#define MY_OPEN_DONE 32766 - -static object *ErrorObject; - -TCPIOCompletionUPP upp_tcp_done; -TCPNotifyUPP upp_tcp_asr; -#if 0 -UDPIOCompletionUPP upp_udp_done; -#endif -UDPNotifyUPP upp_udp_asr; - -/* ----------------------------------------------------- */ -/* Declarations for objects of type MacTCP connection status */ - -typedef struct { - OB_HEAD - TCPStatusPB status; -} tcpcsobject; - -staticforward typeobject Tcpcstype; - -#define is_tcpcsobject(v) ((v)->ob_type == &Tcpcstype) - -/* ---------------------------------------------------------------- */ -/* Declarations for objects of type MacTCP global status */ - -#ifdef TCP_GS -typedef struct { - OB_HEAD - TCPParam *ptr; -} tcpgsobject; - -staticforward typeobject Tcpgstype; - -#define is_tcpgsobject(v) ((v)->ob_type == &Tcpgstype) -#endif /* TCP_GS */ - -/* ---------------------------------------------------------------- */ -/* Declarations for objects of type MacTCP TCP stream */ - -typedef struct { - OB_HEAD - TCPiopb iop; - long localhost; /* Our IP address */ - short localport; /* Our port number */ - object *asr; /* Optional async notification routine */ - int asr_ec; /* error code parameter to asr */ - int asr_reason; /* detail for some errors */ - int async_busy; /* True when completion routine pending */ - int async_err; /* the error for the async call */ -} tcpsobject; - -staticforward typeobject Tcpstype; - -#define is_tcpsobject(v) ((v)->ob_type == &Tcpstype) - -/* ---------------------------------------------------------------- */ -/* Declarations for objects of type MacTCP UDP stream */ - -typedef struct { - OB_HEAD - UDPiopb iop; - object *asr; - int asr_ec; /* error code parameter to asr */ - ip_port port; -} udpsobject; - -staticforward typeobject Udpstype; - -#define is_udpsobject(v) ((v)->ob_type == &Udpstype) - -/* ---------------------------------------------------------------- */ - -static tcpcsobject * -newtcpcsobject(ptr) - TCPStatusPB *ptr; -{ - tcpcsobject *self; - - self = NEWOBJ(tcpcsobject, &Tcpcstype); - if (self == NULL) - return NULL; - self->status = *ptr; - return self; -} - -static void -tcpcs_dealloc(self) - tcpcsobject *self; -{ - DEL(self); -} -/* Code to access structure members by accessing attributes */ - -#include "structmember.h" - -#define OFF(x) offsetof(TCPStatusPB, x) - -static struct memberlist tcpcs_memberlist[] = { - {"remoteHost", T_ULONG, OFF(remoteHost), RO}, - {"remotePort", T_USHORT, OFF(remotePort), RO}, - {"localHost", T_UINT, OFF(localHost), RO}, - {"localPort", T_USHORT, OFF(localPort), RO}, - {"tosFlags", T_BYTE, OFF(tosFlags), RO}, -#if 0 /* Bug in header file: cannot access precedence */ - {"precedence" T_BYTE, OFF(precedence), RO}, -#endif - {"connectionState", T_BYTE, OFF(connectionState), RO}, - {"sendWindow", T_USHORT, OFF(sendWindow), RO}, - {"rcvWindow", T_USHORT, OFF(rcvWindow), RO}, - {"amtUnackedData", T_USHORT, OFF(amtUnackedData), RO}, - {"amtUnreadData", T_USHORT, OFF(amtUnreadData), RO}, - {"sendUnacked", T_UINT, OFF(sendUnacked), RO}, - {"sendNext", T_UINT, OFF(sendNext), RO}, - {"congestionWindow", T_UINT, OFF(congestionWindow), RO}, - {"rcvNext", T_UINT, OFF(rcvNext), RO}, - {"srtt", T_UINT, OFF(srtt), RO}, - {"lastRTT", T_UINT, OFF(lastRTT), RO}, - {"sendMaxSegSize", T_UINT, OFF(sendMaxSegSize), RO}, - {NULL} /* Sentinel */ -}; - -static object * -tcpcs_getattr(self, name) - tcpcsobject *self; - char *name; -{ - return getmember((char *)&self->status, tcpcs_memberlist, name); -} - - -static typeobject Tcpcstype = { - OB_HEAD_INIT(&Typetype) - 0, /*ob_size*/ - "MacTCP connection status", /*tp_name*/ - sizeof(tcpcsobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)tcpcs_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)tcpcs_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ -}; - -/* End of code for MacTCP connection status objects */ -/* -------------------------------------------------------- */ - -#ifdef TCP_GS -static tcpgsobject * -newtcpgsobject(ptr) - TCPParam *ptr; -{ - tcpgsobject *self; - - self = NEWOBJ(tcpgsobject, &Tcpgstype); - if (self == NULL) - return NULL; - self->ptr = ptr; - return self; -} - -static void -tcpgs_dealloc(self) - tcpgsobject *self; -{ - DEL(self); -} -/* Code to access structure members by accessing attributes */ -#undef OFF -#define OFF(x) offsetof(TCPParam, x) - -static struct memberlist tcpgs_memberlist[] = { - {"RtoA", T_UINT, OFF(tcpRtoA), RO}, - {"RtoMin", T_UINT, OFF(tcpRtoMin), RO}, - {"RtoMax", T_UINT, OFF(tcpRtoMax), RO}, - {"MaxSegSize", T_UINT, OFF(tcpMaxSegSize), RO}, - {"MaxConn", T_UINT, OFF(tcpMaxConn), RO}, - {"MaxWindow", T_UINT, OFF(tcpMaxWindow), RO}, - {NULL} /* Sentinel */ -}; - -static object * -tcpgs_getattr(self, name) - tcpgsobject *self; - char *name; -{ - object *rv; - - return getmember((char *)self->ptr, tcpgs_memberlist, name); -} - -static typeobject Tcpgstype = { - OB_HEAD_INIT(&Typetype) - 0, /*ob_size*/ - "MacTCP global status", /*tp_name*/ - sizeof(tcpgsobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)tcpgs_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)tcpgs_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ -}; -#endif /* TCP_GS */ - -/* End of code for MacTCP global status objects */ -/* -------------------------------------------------------- */ - -static int -tcps_checkstate(self, state, state2) - tcpsobject *self; - int state, state2; -{ - OSErr err; - TCPStatusPB *pb; - char buf[80]; - - if ( self->async_busy ) { - err_setstr(ErrorObject, "Operation not allowed, PassiveOpen in progress"); - return -1; - } - if ( state < 0 && state2 < 0 ) - return 0; - err = xTCPStatus(&self->iop, &pb); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return -1; - } - if ( state == pb->connectionState || - state2 == pb->connectionState ) - return 0; - sprintf(buf, "Operation not allowed, connection state=%d", pb->connectionState); - err_setstr(ErrorObject, buf); - return -1; -} - -static int -tcps_asr_safe(arg) - void *arg; -{ - tcpsobject *self = (tcpsobject *)arg; - object *args, *rv; - - if ( self->asr == None ) - return 0; - args = mkvalue("(ii)", self->asr_ec, self->asr_reason); - rv = call_object(self->asr, args); - DECREF(args); - if ( rv ) { - DECREF(rv); - return 0; - } - return -1; -} - -static pascal void -tcps_asr(str, ec, self, reason, icmp) - StreamPtr str; - unsigned short ec; - tcpsobject *self; - unsigned short reason; - struct ICMPReport icmp; -{ - if ( self->asr == None ) - return; - self->asr_ec = ec; - self->asr_reason = reason; - Py_AddPendingCall(tcps_asr_safe, (void *)self); -} - -static void -tcps_done(pb) - TCPiopb *pb; -{ - tcpsobject *self = (tcpsobject *)pb->csParam.open.userDataPtr; - - if ( pb != &self->iop || !self->async_busy ) { - /* Oops... problems */ - printf("tcps_done: unexpected call\n"); - return; - } - self->async_busy = 0; - self->async_err = pb->ioResult; - /* Extension of mactcp semantics: also call asr on open complete */ - if ( self->asr == None ) - return; - self->asr_ec = MY_OPEN_DONE; - self->asr_reason = 0; - Py_AddPendingCall(tcps_asr_safe, (void *)self); -} - -static object * -tcps_isdone(self, args) - tcpsobject *self; - object *args; -{ - if (!newgetargs(args, "")) - return NULL; - return newintobject(!self->async_busy); -} - -static object * -tcps_wait(self, args) - tcpsobject *self; - object *args; -{ - if (!newgetargs(args, "")) - return NULL; - while ( self->async_busy ) { - if ( PyMac_Idle() ) { - INCREF(None); - return None; - } - } - if ( self->async_err ) { - PyErr_Mac(ErrorObject, self->async_err); - self->async_err = 0; - return NULL; - } - INCREF(None); - return None; -} - - -static object * -tcps_PassiveOpen(self, args) - tcpsobject *self; - object *args; -{ - short port; - OSErr err; - - if (!newgetargs(args, "h", &port)) - return NULL; - if ( tcps_checkstate(self, -1, -1) < 0 ) - return NULL; - self->async_busy = 1; - self->async_err = 0; - err = xTCPPassiveOpen(&self->iop, port, upp_tcp_done, - (void *)self); - if ( err ) { - self->async_busy = 0; - PyErr_Mac(ErrorObject, err); - return NULL; - } - self->localhost = self->iop.csParam.open.localHost; - self->localport = self->iop.csParam.open.localPort; - INCREF(None); - return None; -} - -static object * -tcps_ActiveOpen(self, args) - tcpsobject *self; - object *args; -{ - short lport, rport; - long rhost; - OSErr err; - - if (!newgetargs(args, "hlh", &lport, &rhost, &rport)) - return NULL; - if ( tcps_checkstate(self, -1, -1) < 0 ) - return NULL; - err = xTCPActiveOpen(&self->iop, lport, rhost, rport, (TCPIOCompletionUPP)0); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - self->localhost = self->iop.csParam.open.localHost; - self->localport = self->iop.csParam.open.localPort; - INCREF(None); - return None; -} - -static object * -tcps_Send(self, args) - tcpsobject *self; - object *args; -{ - char *buf; - int bufsize; - int push = 0, urgent = 0; - OSErr err; - miniwds wds; - - if (!newgetargs(args, "s#|ii", &buf, &bufsize, &push, &urgent)) - return NULL; - if ( tcps_checkstate(self, STATE_ESTAB, STATE_CWAIT) < 0 ) - return NULL; - wds.length = bufsize; - wds.ptr = buf; - wds.terminus = 0; - err = xTCPSend(&self->iop, (wdsEntry *)&wds, (Boolean)push, (Boolean)urgent, - (TCPIOCompletionUPP)0); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - INCREF(None); - return None; -} - -static object * -tcps_Rcv(self, args) - tcpsobject *self; - object *args; -{ - int timeout; - rdsEntry rds[2]; - OSErr err; - object *rv; - int urgent, mark; - - if (!newgetargs(args, "i", &timeout)) - return NULL; - if ( tcps_checkstate(self, -1, -1) < 0 ) - return NULL; - memset((char *)&rds, 0, sizeof(rds)); - err = xTCPNoCopyRcv(&self->iop, rds, 1, timeout, (TCPIOCompletionUPP)0); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - urgent = self->iop.csParam.receive.urgentFlag; - mark = self->iop.csParam.receive.markFlag; - rv = newsizedstringobject((char *)rds[0].ptr, rds[0].length); - err = xTCPBufReturn(&self->iop, rds, (TCPIOCompletionUPP)0); - if ( err ) { - /* Should not happen */printf("mactcp module: BufReturn failed?\n"); - PyErr_Mac(ErrorObject, err); - DECREF(rv); - return NULL; - } - return mkvalue("(Oii)", rv, urgent, mark); -} - -static object * -tcps_Close(self, args) - tcpsobject *self; - object *args; -{ - OSErr err; - - if (!newgetargs(args, "")) - return NULL; - err = xTCPClose(&self->iop, (TCPIOCompletionUPP)0); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - INCREF(None); - return None; -} - -static object * -tcps_Abort(self, args) - tcpsobject *self; - object *args; -{ - OSErr err; - - if (!newgetargs(args, "")) - return NULL; - err = xTCPAbort(&self->iop); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - INCREF(None); - return None; -} - -static object * -tcps_Status(self, args) - tcpsobject *self; - object *args; -{ - OSErr err; - TCPStatusPB *pb; - - if (!newgetargs(args, "")) - return NULL; - if ( tcps_checkstate(self, -1, -1) < 0 ) - return NULL; - err = xTCPStatus(&self->iop, &pb); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return (object *)newtcpcsobject(pb); -} - -static object * -tcps_GetSockName(self, args) - tcpsobject *self; - object *args; -{ - /* This routine is needed so we can get at the local port even when - ** a PassiveOpen is in progress (when we can't do a Status call). - ** This is needed for socket listen(); getsockname(); accept() emulation - ** as used by ftp and the like. - */ - if (!newgetargs(args, "")) - return NULL; - return mkvalue("(lh)", self->localhost, self->localport); -} - -static struct methodlist tcps_methods[] = { - {"isdone", (method)tcps_isdone, 1}, - {"wait", (method)tcps_wait, 1}, - {"PassiveOpen", (method)tcps_PassiveOpen, 1}, - {"ActiveOpen", (method)tcps_ActiveOpen, 1}, - {"Send", (method)tcps_Send, 1}, - {"Rcv", (method)tcps_Rcv, 1}, - {"Close", (method)tcps_Close, 1}, - {"Abort", (method)tcps_Abort, 1}, - {"Status", (method)tcps_Status, 1}, - {"GetSockName", (method)tcps_GetSockName, 1}, - {NULL, NULL} /* sentinel */ -}; - -/* ---------- */ - -static object * -tcps_getattr(self, name) - tcpsobject *self; - char *name; -{ - if ( strcmp(name, "asr") == 0 ) { - INCREF(self->asr); - return self->asr; - } - return findmethod(tcps_methods, (object *)self, name); -} - -static int -tcps_setattr(self, name, value) - tcpsobject *self; - char *name; - object *value; -{ - if ( strcmp(name, "asr") != 0 || value == NULL ) - return -1; - self->asr = value; /* XXXX Assuming I don't have to incref */ - return 0; -} - -static tcpsobject * -newtcpsobject(bufsize) - int bufsize; -{ - tcpsobject *self; - OSErr err; - - self = NEWOBJ(tcpsobject, &Tcpstype); - if (self == NULL) - return NULL; - memset((char *)&self->iop, 0, sizeof(self->iop)); - err= xTCPCreate(bufsize, upp_tcp_asr, (void *)self, &self->iop); - if ( err ) { - DEL(self); - PyErr_Mac(ErrorObject, err); - return NULL; - } - INCREF(None); - self->localhost = 0; - self->localport = 0; - self->asr = None; - self->async_busy = 0; - self->async_err = 0; - return self; -} - -static void -tcps_dealloc(self) - tcpsobject *self; -{ - if ( self->async_busy ) { - printf("mactcp module: error: dealloc with async busy\n"); - return; - } - xTCPRelease(&self->iop); - DEL(self); -} - -static typeobject Tcpstype = { - OB_HEAD_INIT(&Typetype) - 0, /*ob_size*/ - "MacTCP TCP stream", /*tp_name*/ - sizeof(tcpsobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)tcps_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)tcps_getattr, /*tp_getattr*/ - (setattrfunc)tcps_setattr, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ -}; - -/* End of code for MacTCP TCP stream objects */ -/* -------------------------------------------------------- */ - -static int -udps_asr_safe(arg) - void *arg; -{ - udpsobject *self = (udpsobject *)arg; - object *args, *rv; - - if ( self->asr == None ) - return 0; - args = mkvalue("(i)", self->asr_ec); - rv = call_object(self->asr, args); - DECREF(args); - if ( rv ) { - DECREF(rv); - return 0; - } - return -1; -} - -static pascal void -udps_asr(str, ec, self, icmp) - StreamPtr str; - unsigned short ec; - udpsobject *self; - struct ICMPReport icmp; -{ - if ( self->asr == None ) - return; - self->asr_ec = ec; - Py_AddPendingCall(udps_asr_safe, (void *)self); -} - - -static object * -udps_Read(self, args) - udpsobject *self; - object *args; -{ - OSErr err; - object *rv; - int timeout; - - if (!newgetargs(args, "i", &timeout)) - return NULL; - err = xUDPRead(&self->iop, timeout, (UDPIOCompletionUPP)0); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - rv = newsizedstringobject((char *)self->iop.csParam.receive.rcvBuff, - self->iop.csParam.receive.rcvBuffLen); - err = xUDPBfrReturn(&self->iop, self->iop.csParam.receive.rcvBuff); - if ( err ) { - PyErr_Mac(ErrorObject, err); - DECREF(rv); - return NULL; - } - return rv; -} - -static object * -udps_Write(self, args) - udpsobject *self; - object *args; -{ - unsigned long host; - unsigned short port; - char *buf; - int bufsize; - OSErr err; - miniwds wds; - - if (!newgetargs(args, "lhs#", &host, &port, &buf, &bufsize)) - return NULL; - wds.length = bufsize; - wds.ptr = buf; - wds.terminus = 0; - err = xUDPWrite(&self->iop, host, port, &wds, (UDPIOCompletionUPP)0); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - INCREF(None); - return None; -} -static struct methodlist udps_methods[] = { - {"Read", (method)udps_Read, 1}, - {"Write", (method)udps_Write, 1}, - - {NULL, NULL} /* sentinel */ -}; - -/* ---------- */ - -static object * -udps_getattr(self, name) - udpsobject *self; - char *name; -{ - if ( strcmp(name, "asr") == 0 ) { - INCREF(self->asr); - return self->asr; - } - if ( strcmp(name, "port") == 0 ) - return newintobject((int)self->port); - return findmethod(udps_methods, (object *)self, name); -} - -static int -udps_setattr(self, name, value) - udpsobject *self; - char *name; - object *value; -{ - if ( strcmp(name, "asr") != 0 || value == NULL ) - return -1; - self->asr = value; /* XXXX Assuming I don't have to incref */ - return 0; -} - -static udpsobject * -newudpsobject(bufsize, port) - int bufsize; - int port; -{ - udpsobject *self; - OSErr err; - - self = NEWOBJ(udpsobject, &Udpstype); - if (self == NULL) - return NULL; - memset((char *)&self->iop, 0, sizeof(self->iop)); - self->port = port; - err= xUDPCreate(&self->iop, bufsize, &self->port, upp_udp_asr, - (void *)self); - if ( err ) { - DEL(self); - PyErr_Mac(ErrorObject, err); - return NULL; - } - INCREF(None); - self->asr = None; - return self; -} - -static void -udps_dealloc(self) - udpsobject *self; -{ - xUDPRelease(&self->iop); - DEL(self); -} - -static typeobject Udpstype = { - OB_HEAD_INIT(&Typetype) - 0, /*ob_size*/ - "MacTCP UDP stream", /*tp_name*/ - sizeof(udpsobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)udps_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)udps_getattr, /*tp_getattr*/ - (setattrfunc)udps_setattr, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ -}; - -/* End of code for MacTCP UDP stream objects */ -/* -------------------------------------------------------- */ - -static object * -mactcp_TCPCreate(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - object *rv; - int bufsize; - - if (!newgetargs(args, "i", &bufsize)) - return NULL; - if ( (err = xOpenDriver()) != noErr ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - rv = (object *)newtcpsobject(bufsize); - return rv; -} - -static object * -mactcp_UDPCreate(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - object *rv; - int bufsize, port; - - if (!newgetargs(args, "ii", &bufsize, &port)) - return NULL; - if ( (err = xOpenDriver()) != noErr ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - rv = (object *)newudpsobject(bufsize, port); - return rv; -} - -static object * -mactcp_MTU(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - unsigned short mtu; - - if (!newgetargs(args, "")) - return NULL; - if ( (err = xOpenDriver()) != noErr ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - mtu = xMaxMTU(); - return newintobject((int)mtu); -} - -static object * -mactcp_IPAddr(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - unsigned long rv; - - if (!newgetargs(args, "")) - return NULL; - if ( (err = xOpenDriver()) != noErr ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - rv = xIPAddr(); - return newintobject((int)rv); -} - -static object * -mactcp_NetMask(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - unsigned long rv; - - if (!newgetargs(args, "")) - return NULL; - if ( (err = xOpenDriver()) != noErr ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - rv = xNetMask(); - return newintobject((int)rv); -} - -#ifdef TCP_GS -static object * -mactcp_GlobalInfo(self, args) - object *self; /* Not used */ - object *args; -{ - OSErr err; - - if (!newgetargs(args, "")) - return NULL; - if ( (err = xOpenDriver()) != noErr ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - /* XXXX Allocate, fill */ - INCREF(None); - return None; -} -#endif /* TCP_GS */ - -/* List of methods defined in the module */ - -static struct methodlist mactcp_methods[] = { - {"TCPCreate", mactcp_TCPCreate, 1}, - {"UDPCreate", mactcp_UDPCreate, 1}, - {"MTU", mactcp_MTU, 1}, - {"IPAddr", mactcp_IPAddr, 1}, - {"NetMask", mactcp_NetMask, 1}, -#ifdef TCP_GS - {"GlobalInfo", mactcp_GlobalInfo, 1}, -#endif - - {NULL, NULL} /* sentinel */ -}; - - -/* Initialization function for the module (*must* be called initmactcp) */ - -void -initmactcp() -{ - object *m, *d; - - /* Create the module and add the functions */ - m = initmodule("mactcp", mactcp_methods); - - /* Add some symbolic constants to the module */ - d = getmoduledict(m); - ErrorObject = newstringobject("mactcp.error"); - dictinsert(d, "error", ErrorObject); - - upp_tcp_done = NewTCPIOCompletionProc(tcps_done); - upp_tcp_asr = NewTCPNotifyProc(tcps_asr); -#if 0 - upp_udp_done = NewUDPIOCompletionProc(udps_done); -#endif - upp_udp_asr = NewUDPNotifyProc(udps_asr); - - /* XXXX Add constants here */ - - /* Check for errors */ - if (err_occurred()) - fatal("can't initialize module mactcp"); -} diff --git a/Mac/Unsupported/mactcp/mactcpmodules.mu.exp b/Mac/Unsupported/mactcp/mactcpmodules.mu.exp deleted file mode 100644 index 4cf9f52..0000000 --- a/Mac/Unsupported/mactcp/mactcpmodules.mu.exp +++ /dev/null @@ -1,2 +0,0 @@ -initmacdnr -initmactcp diff --git a/Mac/Unsupported/mactcp/mactcpmodules.mu.hqx b/Mac/Unsupported/mactcp/mactcpmodules.mu.hqx deleted file mode 100644 index b784006..0000000 --- a/Mac/Unsupported/mactcp/mactcpmodules.mu.hqx +++ /dev/null @@ -1,212 +0,0 @@ -(This file must be converted with BinHex 4.0) - -:%'eKBh4MF'e[C(9XCA-ZEA8!68e38N0A588!N!3Dd!!!+q@Mh@0[Ef`!!!!"!!! -!(!!!'Q3!!"U!!!!!8!!!!!3!!!"S!!)!-!!#!"`(8fpeFQ0PFpf3#!#3'3)!-!! -#!#J*6'PLFQ&bD@9chC!'!*!C!J!!!!)!+!P-D@*bBA*TCA2GN!B!N"d#!#J!q2r -`!*!&!G58!*!'-XB!!!!"!*5fU!#3$3)!!-c-!$,-c*Q3"!!cc-bCQ@CQ!$6-c*Q -C-c-!0Fc-QCN!!!!fc-aQC[rr!$I-c'CQc-`!1-c-CQB!!`!"3!F!N!3-5@jdCA* -QB@0P6'PL!*!6V%qP3!'"Fh4eBUa2T8!!!J!$!*!%$QeKBf4ZFQe[C(9XC5jM!*! -4VA-b@3'"9%9B9+ec-PN!!`!$!*!%$QeKBh4MF'e[C(9XC5jM!*!4VA-b@J'"9%9 -B9+ec-PS!"!!$!*!%#A4MF'GXG@8ZB`#3&Uec-PS"J94&@&5YFc*D!!8!!`#3"!a -KE'a[BQTPBh4c,QJ!N"1Z#C!!13'!9%9B9+i*N!!j!!B!!`#3"!KMEfjQD@FZD!# -3&kec-NF"J&4&@&5YFc*(!!G!!`#3"!GcG'4TEbjS!*!BV6qZp!#!9%9B9+drV[3 -!#%!$!*!%"hPfB@ac,QJ!N"LYXp4*!)"849K8VE2853!*3!-!N!3)Fh4bD@jR,QJ -!N"HY2kld!)"849K8V6qZp!!+3!-!N!3(CA*bEQmZD!#3'+drV[)!J&4&@&5Y2kl -b!!X!!`#3"!PYHA"bEh4[,QJ!N"DYFc)H!B"849K8VA-b(J!-!!-!N!3*FQ9ZB@e -P-LjS!*!@VJQ3!$N"J&4&@&5Z#C!!13!0!!-!N!3)Ef*UC@0d,QJ!N"HZ#C!!13' -!9%9B9+i*N!!j!!i!!`#3"!P[BQTTEA"X,QJ!N"DYFc)H!B"849K8VA-b(J!2!!- -!N!31B@0MCA0cEf*UC@0d,QJ!N"'YFc)C!B"849K8VA-b'3!3!!-!N!3,D@jdEf* -UC@0d,QJ!N"5YFc)F!B"849K8VA-b(!!4!!-!N!3-E'pZCfpLDQ9MG#jS!*!6VA- -b(3'!9%9B9+ec-Kd!%J!$!*!%$@CXEf&dEf*UC@0d,QJ!N"+YFc)E!B"849K8VA- -b'`!6!!-!N!30FQ&ZCf9[BQTPBh3ZD!#3%Uec-Km"J&4&@&5YFc)I!"3!!`#3"!j -cG(*TEQG[BQTPBh3ZD!#3%Dec-Km"J&4&@&5YFc)I!"8!!`#3"!edGA"XC@pLDQ9 -MG#jS!*!5VA-b)!'!9%9B9+ec-L!!&J!$!*!%$'aTFh4[BQTPBh3ZD!#3%kec-Kd -"J&4&@&5YFc)G!"F!!`#3"!pYBA"`D@jREf*UC@0d,QJ!N"#YFc)G!B"849K8VA- -b(3!B!!-!N!31E@9dD'pNEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!C!!-!N!3 -1E@pNG@aPEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!D!!-!N!3-CR9ZBfpLDQ9 -MG#jS!*!6VA-b(!'!9%9B9+ec-K`!'`!$!*!%$@0XBA0cEf*UC@0d,QJ!N"+YFc) -D!B"849K8VA-b'J!F!!-!N!3-CQPXC@pLDQ9MG#jS!*!6VJQ3!$N"J&4&@&5Z#C! -!13!G!!-!N!3+EAPYB@aXEf-ZD!#3&Dec-Ki"J&4&@&5YFc)H!"j!!`#3"!KcG'4 -XD@)ZD!#3&kdrV[3!J&4&@&5Y2kld!"m!!`#3"!aYEf4cGA"`Eh*d,QJ!N"1YFc) -G!B"849K8VA-b(3!J3!-!N!3)Fh4NBA*R,QJ!N"HY2kqp!)"849K8V6q[[3!K3!- -!N!3*Ah0dC'&bCbjS!*!@UX`2e`#!9%9B9+V-$pF!)J!$!*!%"f0PGQ&X,QJ!N"L -YFc)D!B"849K8VA-b'J!M!!-!N!3+B@*cG(*KBh3ZD!#3&Dec-KN"J&4&@&5YFc) -C!#3!!`#3"!PYB@0RE(9P,QJ!N"DZ*8AF!B"849K8VL9&h!!P3!B!N!3(9(P`CA- -ZD!#3'+fY'UN!J&4&@&5YV4UT!#C!"J#3""0$EfjNDA4TEfjKE%eKBh*[FbjS!*! --V4rb3!#!9%9B9+dImN!!*d!'!*!%"dCTE'9c,QJ!N"LX)B$!!)"849K8V#'!`!! -S3!B!N!3,6@PiC@40Ef4P,QJ!N"5Y8ec!!)"849K8V90F`!!T3!B!N!3*6e09G'P -XFbjS!*!@VE291`#!9%9B9+fce6X!+N!'!*!%#%ePE@pbH5jS!*!AV#'!`!#!9%9 -B9+`KJ-!!+d!'!*!%#%9fC@jdFbjS!*!AV4rb3!#!9%9B9+dImN!!,%!'!*!%#e& -eD@0VC(*KGbjS!*!8V')D3!#!9%9B9+aL'N!!,8!'!*!%$e&eD@0VC(*KGe4PH(3 -ZD!#3%+`KJ-!!J&4&@&5X)B$!!#j!"J#3"!j6G'&ZC'&bC%CTE'8ZD!#3%D`KJ-! -!J&4&@&5X)B$!!#p!"J#3"!P%D@&XEfGc,QJ!N"DX)B$!!)"849K8V#'!`!!`3!B -!N!3)4A*bEh*c,QJ!N"HY(r*!!)"849K8V4rb3!!a3!B!N!3(6@9ZGA-ZD!#3'+` -KJ-!!J&4&@&5X)B$!!$*!"J#3"!T$EfjdFQpXFbjS!*!9V#'!`!#!9%9B9+`KJ-! -!-d!'!*!%#9GTEQ4[Gh-ZD!#3&UaL'N!!J&4&@&5XBKT!!$4!"J#3"!T8CAKd4@4 -TG#jS!*!9V#'!`!#!9%9B9+`KJ-!!08!&!*!%%%&NC(*PFh0BE'&dD@pZ,QJ!N!q -VZre!!)"849K8Ul[p3!!f3!B!N!3)6@&M9%03,QJ!N"HYQ6a!!)"849K8VCNm3!! -h3!B!N!3,3A"`E'98B@aV,QJ!N"5X)B$!!)"849K8V#'!`!!i3!B!N!3'4'9cDbj -S!*!CV#'!`!#!9%9B9+`KJ-!!18!'!*!%#84PGQPMCA-ZD!#3&UdImN!!J&4&@&5 -Y(r*!!$S!!`#3"!jcG(*eBh4YC@eLCA)ZD!#3%Dec-Km"J&4&@&5YFc)I!$X!!`# -3"!PdBh"RE(9P,QJ!N"DYFc*E!B"849K8VA-b@`!m3!8!N!366@&M9%033fpYE@p -Z9(P`CA-ZD!#3$+X%`dB!J&4&@&5V"-0'!$e!"3#3"!e(CA40H8P33@4NFLjS!*! -5U`6$83#!9%9B9+X%`e%!2N!&!*!%"e4$8&"#,QJ!N"LV"--T!)"849K8U`6$+3! -r3!8!N!3(98438%)ZD!#3'+X%`b!!J&4&@&5V"--J!%!!"!#3"!PbG@jdD@eP,Q- -!N"DXVa"e!B"849K8V+m3G3""!!-!N!3@EAGPFQYcAh"XG@GTEPpMEfjQD@FZD!# -3#Dec-QX"J&4&@&5YFc*V!%)!!`#3"!pMEfe`E'9iEf*UC@0d,QJ!N"#Z#C!!13' -!9%9B9+i*N!!j!%-!!`#3"!PMEf*UC@0d,QJ!N"DYFc)D!B"849K8VA-b'J"%!!) -!N!36E@&MG'0`E@pNG@aPFbke,Q9iF!#3$+cq!28"J&4&@&5XrJ$e!%8!!`#3"!T -`H@9bFQpbFbjS!*!9VA-b(`'!9%9B9+ec-Km!4J!$!*!%#P"jG'K[EN0[FQ8!N"@ -Z*RYp!B"cD'aLVLClI3"(!!-!N!3*F(PNC@*eCbjS!*!@VJQ3!$N"J&4&@&5Z#C! -!13")!!-!N!3,G(*KBf9LB@0V,QJ!N"5YFc)J!B"849K8VA-b)!"*!!-!N!3,F(P -dD'pZFR9Z,QJ!N"5Z#C!!13'!9%9B9+i*N!!j!%S!!`#3"!YcHA0YEf4eE'8ZD!# -3&+i*N!!j!B"849K8VJQ3!$N!5`!$!*!%#fPZG(*MD'9MDbjS!*!8VKP0'!'!9%9 -B9+iC64J!6!!$!*!%#'PYF'pbG#jS!*!AVJQ3!$N"J&4&@&5Z#C!!13"0!!-!N!3 -0BQadD@jYEf4eE'8ZD!#3%Ui*N!!j!B"849K8VJQ3!$N!6N!'!*!%#%YPFQjPE#j -S!*!AV4rb3!#!9%9B9+dImN!!6d!'!*!%%deKBfKTEQ9&H'0PF(4TEfjc,QJ!N!b -X)B$!!)"849K8V#'!`!"33!B!N!316Q&YC9*PCfPcG(*j,QJ!N"'Y(r*!!)"849K -8V4rb3!"43!B!N!323fpNC8CbB@GYC@jdFbjS!*!3V#'!`!#!9%9B9+`KJ-!!!!K --!!F#G!!!!%B!!3#3#!)!N!81E@&MC'jbE@pNG@aP,Q-!N"S#!*!(0DZlr8!!!3! -hV#'!`!!"!&'X)B$!!!%!*UdImN!!!3!bV#'!`!!"!$LX)B$!!!%!1DdImN!!!3! -[V#'!`!!"!!UY2klb!!%!-+dImN!!!3!VV4rb3!!"!#HX)B$!!!%!6UdImN!!!3" -2V#'!`!!"!$DYQ6a!!!%!+U`KJ-!!!3!aV#'!`!!"!#LY8ec!!!%!8+dImN!!!3! -TVE291`!"!#bXBKT!!!%!,D`KJ-!!!3!ZV#'!`!!"!##Y2kqp!!%!"kdrV[3!!3! -HV6qZp!!"!!QY2kld!!%!0+`KJ-!!!3!PVDdDU3!"!$1XBKT!!!%!#+fce%N!!3! -KUX`2e`!"!#1YFc)C!!%!$kec-KN!!3!&VJQ3!$N!!3"0VJQ3!$N!!3!LVA-b'J! -"!"ZYFc)D!!%!3kec-KS!!3"#VJQ3!$N!!3!'VA-b4`!"!"bZ#C!!13!"!"+YFc) -E!!%!'Uec-K`!!3"-VJQ3!$N!!3!3VA-b(!!"!%ZZ'8dB!!%!&Uec-Kd!!3!4VA- -b(3!"!#5Z*8AF!!%!&kec-Kd!!3!BVA-b(3!"!"qYFc)G!!%!'Dec-Kd!!3""VA- -bD`!"!"fYFc)H!!%!#kec-Ki!!3!0VJQ3!$N!!3!1VA-b(J!"!%HZ#C!!13!"!%@ -YFc)I!!%!5Di*N!!j!!%!%kec-Km!!3!-VJQ3!$N!!3!8VA-b(`!"!$UYFc)I!!% -!5Ui*N!!j!!%!5+ec-L!!!3!9VA-b)!!"!TB#Q!+D!T`!!!",!!%!N!J#!*!&$Qe -KBh4MF'e[C(9XC5jM!*!D!`#3"c@VZre!!!%!0k`KJ-!!!3"4V#'!`!!"!#DY(r* -!!!%!-U`KJ-!!!3!iV#'!`!!"!$QY(r*!!!%!,k`KJ-!!!3!+V6qZmJ!"!$#Y(r* -!!!%!+kdImN!!!3!RV#'!`!!"!$fV"-04!!%!6UdImN!!!3"2V#'!`!!"!$DYQ6a -!!!%!2+X%`dB!!3!UV#'!`!!"!$'X)B$!!!%!++e6A-!!!3"3V4rb3!!"!#QYXp8 -l!!%!,+aL'N!!!3!YV#'!`!!"!#kX)B$!!!%!)+drVld!!3!(V6qZp!!"!"kY2kl -d!!%!#DdrV[3!!3!qU`6$+3!"!$5X)B$!!!%!*DfY'UN!!3!rU`6$)!!"!$1XBKT -!!!%!#+fce%N!!3!KUX`2e`!"!#1YFc)C!!%!$kec-KN!!3!&VJQ3!$N!!3"0VJQ -3!$N!!3!LVA-b'J!"!"ZYFc)D!!%!3kec-KS!!3"#VJQ3!$N!!3!'VA-b4`!"!"b -Z#C!!13!"!"+YFc)E!!%!'Uec-K`!!3"-VJQ3!$N!!3!3VA-b(!!"!%ZZ'8dB!!% -!&Uec-Kd!!3!4VA-b(3!"!#5Z*8AF!!%!&kec-Kd!!3!BVA-b(3!"!"qYFc)G!!% -!'Dec-Kd!!3""VA-bD`!"!"fYFc)H!!%!#kec-Ki!!3!0VJQ3!$N!!3!1VA-b(J! -"!%HZ#C!!13!"!%@YFc)I!!%!5Di*N!!j!!%!%kec-Km!!3!-VJQ3!$N!!3!8VA- -b(`!"!$UYFc)I!!%!5Ui*N!!j!!%!1kec-PX!!3")VA-b)!!"!"@YFc)J!!%",J% -`!6)"0!!!!"i!!3#3#!)!N!8*G'0`CfaeC5jM!*!I"!#3"c@VZre!!!%!0k`KJ-! -!!3"4V#'!`!!"!#DY(r*!!!%!-U`KJ-!!!3!jV4rb3!!"!#qX)B$!!!%!-+dImN! -!!3!VV4rb3!!"!#HX)B$!!!%!2DX%`e%!!3"1V4rb3!!"!%qX)B$!!!%!0UfC2%! -!!3!mU`6$4J!"!#UX)B$!!!%!-D`KJ-!!!3!SV90F`!!"!&#Y(r*!!!%!+Dfce6X -!!3!XV')D3!!"!#fX)B$!!!%!2UX%`bN!!3!dV#'!`!!"!#@YV4UT!!%!2kX%`b! -!!3!cV')D3!!"!%'YFc*V!!%!1kec-PX!!3%1!4!"%J%8!!!!!3!"!*!)!J%!N!3 -6E@&MG'0`E@pNG@aPFbke,Q9iF!#3&83!N!G'!%Mp33!"!$HX)3&4FD!!N!BLN!! -"8C6!J-)!!3!jV#'!`J!"!8I!8)$#!!%!-+`KJ-)!!3!VV#'!`J!"!#HX)B$#!!% -!2DX%`e%!!3!fV#'!`3!"!$bV"-0'!!%!+U`KJ-)!!3!aV#'!`J!"!#LX)B$#!!% -!+D`KJ-)!!3!XV#'!`J!"!#fX)B$#!!%!2UX%`bN!!3!dV#'!`J!"!#@XDI6b!!% -!2kX%`b!!!3!cV#'!`J!"!%'Xrbq[!!%!1kY#c6)!!3"'!%J!5J"-!qF!!3!#!*! -)!J%!N!3+8(PdD'pZ3fpbC3#3(NB!N!G'!%J!5J"-!qF!!3!#!*!)!J#3"3a*ER4 -PFQCKBf9-D@)!N"`"!*!(6J"3!&)!9!!!!!)!!J#3#!)"!*!%#A*eER4TE@8ZB`# -3(d!!N!G"VA-bD`!"!*!)!YkYQ!!!!4i!!"%@8%CXF`#3"!,HVY3!!")d!!!)6&" --Fh3!N!S"(!!!!!*38f9Rrrm!N!NF!!!"!&"6C@F!!3!!GM)!!!%!!!!T-`!!+$- -!!!+b!!3!+!!+!F)#J!!S!!S"`J+!!*!1%'eKBh4MF'e[C(9XCA-ZEA9X!J!!!%e -08&*$9dP&!*!%68e38N0A588!N"LZUS!V!!!Dd!!!+q9S!*!B#J!#!*!,"!!##!# -3"-3!"0!!N%&TEQPdH(J!N!X#!!B!!!!+!!3!N!X`!!B"!2rr!*!)rrm"N!8!N!3 -H!3%!N!LCQ3!!2rmrrcrr!3#3"%S!!3!*"Qe[EQ&ME`#3(!3!+!!+!F)#J!!S!!S -"`J+!!*!3!3#3"!)!N!88!!%!@!#Z!-m"d3#3"%S6!!!G0`!!!"S!!`!!QCN!N!4 -rr`#3"(rr!*!%Irm!N!3+-!!%!!!!!`!(!3J!!3%kA*%!jNMN!!j[K'&cDb!!!!! -F!*!*[XUQ!,l,P!#qbk`!N!@r%e`!N!@r%e`!%#5!!*!Sc*!)!1C!d!$Q3'$GN!K -rrhrr!1C!K!#3"%#(!*!%"B3!!+%LrJ)!N!IQ30!!!cNb!*!6!3#qbf)![XY#!,m -(b!!!A*%!jNMN!!!!!f&cDb!!!!!F!*!*[XUQ!,l,P!#qbk`!N!@r%e`![iPF!,m -6'%e33d-"#!!"!MSkN3$Q513!$Qq%BA0V)!!!!"`!N!QqbUB![XZ8!,l,V!#3"Em -6A!#3"Em6A!!3*)!!N#M-N!J!jN$3!1C!B0f3#(rrIrm!jN#%!*!%3)F!N!3&K!! -!S5,q!J#3"qC!d!!$16)!N"-"!,l,BJ#qbd)![`I)!!"FN3$Q513!!!!$BA0V)!! -!!"`!N!QqbUB![XZ8!,l,V!#3"Em6A!#rL9`![a-B69"$3`'i!!)h1NeKBdp6)&0 -eF("[FR3k6'PLFQ&bD@9c1P*eER4TE@8k8R9ZG'PYC5"38%-k+&0[GA*MCA-T1J! -!!"2[E!#3)!'MHpJ!N!A6%83!N!3"Sh[B!!)!!!(6ha!"V8(S!*!KjJ"c!2J!b!' -Y4r`!"!!i!G2J5!!!%83"dpp`,k$Gh3!2k#!!!2r"!$2#d!!6lf`!D`%r!'X"2`( -FF`J"h(48!GaBV!(FFd3"h&,X!GaJZ!!!!2m"I`#qrmIMIJ(6h`!"d`%!!!%B1MS -k3eG(990*)$%Z0Lid1QPZBfaeC'8k-!!6qC3!1D3)!!!dY!#3#Irrr`()p6J"b24 -33J!#"2rGB'`"X@6*!FMdB!!#9E!"XAP3!D)Xd!()p(!!!P@`!"'lj!!e,`!!4!) -!!!%!!3!"!!%!!!!$!FMdX!#3"2rDi)3!!!!"!FMe!!!5qR`"Q)q`!E&Nc!()p-! -!%[Tm!"(+&!()pG)"b26!!!*9X2r8FF!!!+%L!FMdm!!$-8Mrf`1)!*!%!FMf%!! -6fI`!%pR`!FMf@J()p2!!%qCSrpe#1'Mrpd!"b28!!",h+!!4U&!"X@5S!2rrr`! -90c3"d3%!!!)N1NeKBdp6)&0eF("[FR3k5'9KC'9bFcT"6P0*)%KPB@4PFR-k!*! -LjN33!*!(!3!0HPJN!!J%!1C$N!!!%#33!1C&6!#3'4!J[!#3"HC&J!#3"3ekT!# -qk#"!RI&3!"!N%!#3"HC&KJ#3"4!NJ!!!S"`!N"AQ4*!!!*!*$ATB*)!)"!$Q4"! -!%#33!*!H!3!!!L3k6@&M6e-J8h9`F'pbG$T)C@&NCA*c1P"33b"6F'9MD@CTBcS -!N#,Q4"!!N!F"!!ek@#3!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AU -N!,lS)%#Gm9!!%#33!*!&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C -%%!!3*"!!N"i"!!!#2$T0B@028b"6GA"`Eh*d1NKPB@4PFR-k8hPcG'9Y)%9iG(* -KFb")C@&NCA*c1NeKBe4$8#")C@&NCA*c1J#3#ZC%%!#3"`%!$ATB*!!)"!$Q3j! -!!"!N%!$Q48`!N"N3),`!N!AQ4B!!N!80HU3![ZJJ3*ha8!!3*"!!N!AQ4BB!N!8 -3*)!!!+!F!*!9jN53!!#3#3ek@#5!#!3!jN33!"!N%!#3(J%!!!)T1NeKBdp6)&0 -eF("[FR3k5'9KC'9bFcT9EQPfCA*cB@`J5'9KC'9bFcS!N"hQ4"!!N!F"!!ek@#3 -!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AUN!,lS)%#Gm9!!%#33!*! -&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C%%!!3*"!!N"i"!!!#*MT -0B@028b"6GA"`Eh*d1NaTBR*KFQPPFcT0B@028b"$EfeYEfik!*!JjN33!*!(!3! -0HPJN!!J%!1C$N!!!%#33!1C&6!#3'4!J[!#3"HC&J!#3"3ekT!#qk#"!RI&3!"! -N%!#3"HC&KJ#3"4!NJ!!!S"`!N"AQ4*!!!*!*$ATB*)!)"!$Q4"!!%#33!*!H!3! -!!Ldk6@&M6e-J8h9`F'pbG$T-D@*bBA*TCA-k8R9ZG'PYC6T5G@jdD@eP)&"33cS -!N"RQ4"!!N!F"!!ek@#3!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AU -N!,lS)%#Gm9!!%#33!*!&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C -%%!!3*"!!N#!8P!!'%%eKBdp6)&"33b"-D@jVCA)!N"!%%%eKBdp6)&"33b"-D@j -VCA)!N$!D39"36!#33'!!!!""F("X!*"!B!!!!%e06%)!N#!16'PL)%PYF'pbG#" -38%-!N"908%a'!*!J$NaTBL"*EA"[FR3J8&"$!*!969G$4!#33'!!!!"58e*$!*" -!B!!!!&4&@&3$,Q*SBmUV8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfp -Z)%KPE(!!N!8G"!(+Ui!!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ8&" -$!*!A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)&"33`#3&e4&@&3$,Q0M!*!F$%eA)%- -[3bXV)&"33`#3&e4&@&3$,Q0`!*!F$%eA)%-[3bXV)&"33`#3&e4&@&3%,Q0`F!# -3'`a09b"$,d-V+b"38%-!N"G849K8"#jPH(!!N$p849K8!LjS!*!G$%eA)%-[3bX -V)&"33`#3%a!!!!"849K8!Lj`!*!G$8eA)&"KFf0KE#"38%-!N"C849K8"#j`BA- -!N"X069FJ8'&cBf&X)&"33`#3&P4&@&3%,R"MD!#3'`a09b"$,d-V+b"38%-!N"1 -!!!!!9%9B9!BZF'0S+bX!N"N-69FJ3bp$+bXJ8&"$!*!6J!!!!&4&@&3#,R)!N"d -'69FJ8Q9k!*!G9%9B9!)ZFfKMbUY3!!-`b!!8VG!!!!&q!FUV8!!8CF!!!!,@"P" -33d&cE@iJ5'9X!*!'(33"bUZ!!"4P`!'(PY3!N!4B3dp'!*!J%&K$6dC')%PYF'p -bG#"38%-!N"0NEf0e!*"!B!!!!(*cFQ-!N%"J!!!!FfKXBJ#3)!j348BJ5@e`Eh* -d)&"33`#3&A0dG@)!N#!18%9')%PYF'pbG#"38%-!N"N%,Q4[B`#31e!!!!!36@& -M6e-J0MK,)%aTEQYPFJ#3-"T"8&"-!*"!B!!!!%&`F'`!N%"J!!!!68e-3J#3)!j --D@)J5@e`Eh*d)$Bi5`#3&8e36%B!N#!16'PL)%PYF'pbG#!f1%X!N"909d0%!*" -!B!!!!%p#5L!!N#!169"A)%PYF'pbG#!f1%X!N"958e*$!*"!B!!!!&4&@&3$,Q* -SBmUV8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfpZ)%KPE(!!N!8G"!( -+Ui!!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ0MK,!*!A9%9B9!3ZBbX -V!*!E$%eA)%-[3bXV)$Bi5`#3&e4&@&3$,Q0M!*!F$%eA)%-[3bXV)$Bi5`#3&e4 -&@&3$,Q0`!*!F$%eA)%-[3bXV)$Bi5`#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b! -f1%X!N"G849K8"#jPH($+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abTdP%L -VJ!(+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"&4&@&3#,QJ!N"d-69FJ3bp$+bX -J0MK,!*!6%!!!!&4&@&3#,R!!N"d069FJ8'&cBf&X)$Bi5`#3&P4&@&3%,R"KF`# -3'`e09b"3BA0MB@`J0MK,!*!@9%9B9!3ZF'0S!*!E$%eA)%-[3bXV)$Bi5`#3%i! -!!!"849K8"Lj`BfJV+`#3'3a09b"$,d-V+b!f1%X!N"1!!!!!9%9B9!)ZFJ#3(3C -09b"5CAS!N"e849K8"#jcC@I+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abT -dP%LVJ!(+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"'4[Bh8!N%"J!!!!FR0bB`# -33'!!!!"cD'aL!*!J$P"&4L"*EA"[FR3J0MKV!*!9Fh4eBJ#3)!j348BJ5@e`Eh* -d)$BiD`#3'33ZC'pM!*!l8!!!!""AD@ic-L"i1$BJ6'PZDf9b!*!`#94&@&3#,Q- -!N"d-69FJ3bp$+bXJH$Jf!*!A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)(Ji0J#3&e4 -&@&3$,Q0`!*!F$%eA)%-[3bXV)(Ji0J#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b" -i1$B!N"G849K8"#j`BfJ!N"X-69FJ3bp$+bXJH$Jf!*!6J!!!!&4&@&3',R"MD#X -V!*!C$%eA)%-[3bXV)(Ji0J#3%i!!!!"849K8!bjbB`#3(!K09b"AD@j53`#3(`3 -ZE'PL!*!E$NaTBL"*EA"[FR3JH$Jf!*!C"#j[BQS!N"X16f*U)%PYF'pbG#"i1$B -!N"8*68-J6'PZDf9b!*!h#%e03dJ!N%4849K8!LjM!*!G#%e$)%-[3bXV!*!E9%9 -B9!3ZBfac!*!E%8e$)%0XBA0c)%0[EA"TE'9b!*!1J!!!!&4&@&3%,Q4PCJ#32e4 -&@&3%,Q4[B`#31a!!!!"849K8!LjS!*!p%!!!!&4&@&3%,R"MD!#3'`K03b"$,d- -V+`#3&i!!!!"849K8!bjdF`#33`B!!3%!N!B8!!3"!*!(!3#3$!S!!3%!!!%"!!% -!N!31!!F"!!%"!!%"!!!!!3#3"-B!"`#33Mq3"%&38%`!!!'!@)!!N%)rN!3!N!P -9!C!!!3)#H`#3"3)!!!!8!*!%!B!!N"%i!!N!N!F@EAGPFQYcAh"XG@GTEPpMEfj -QD@FZD!#3$!%!N!i-!!-!N!`"fJ!%!*!3!3#3r`#34&pIFh4KFR3!N(`"!!!!0J! --!*!(!3#3*3%!N!8"!!!!$3!#!*!1&!!$!J!"!3!!!3%$!3#3#`S!!3%"!!!"!3! -"!!!!a!!'`J#3``%8!!8!!3!!-XJ!!$,)!!!bb!#3"!eYB@0dBh"YEf4eE'9c!*$ -eZJ!%!!%4E@&MG'0`E@pNG@aPFbjcE')!N!j3HA4SFfKXBJ#3F3%rN!3!N!GA!+i -!kJ(4!3!!!!Y@!!"FN3!!!#i!!J!!!!)!!J#3+!)-!!)!8!!"!!%!!3!"!*$r!"3 -R3dp%45FJ*d4"9%%R)#G35808*`#3lJS!"!#3#J%!!!!T-`!!+$-!!!+b!YkX@#H -U!!!!(!&k!!*`FQ9Q!"J!'R"@CA)!!!&'8e45)`!!!9)%X!!3!!!!"J#3"$U5!"d -!!!!8!*!%FFi!*!!!!%J!N!4E@J!T!!!!R!#3"(Pd!$J!!!#d!*!%$A-!5!!!!0) -!N!32PJ"9!!!,"J#3"&e+!&`!!"qH!*!%*k8!D3!!(kJ!N!3-a!"e!!!I`!#3"#H -U!)B!!"r1!*!%3hX!N3!!(q!!N!4&S`#G!!!JUJ#3"!hN!+`!!#$Q!*!%*ZJ!Z`! -!)2B!N!4kF3$#!!!Le!#3"'@X!0)!!#-1!*!%(YF!iJ!!)am!N!30V3$Z!!!M0`# -3"$#-!2m!!#0&!*!%@MF"#J!!*!d!N!3,L3%5!!!P*3#3"(I+!4i!!#AM!*!%F-F -"+`!!*K8!N!A)rrm!!#JP!*!3'i$rr`!!!*B!N!328(*[DQ9MG#"@CA*cD@pZ$&" -bEfTPBh3J6@PcB`C&C'PdEh)%4QpZG!j3FQpUC@0d)%9iG(*KF`p$GA0dEfdJ5f9 -jGfpbC(--3@0MCA0c)&"KG'Kc"P4KFQGPG!a#G@PXC#"&H(4bBA-,0MK,)%0[C'9 -(C@i30MK,)%4TFf&cFf9YBQaPFJSf1%XJ6'PZDf9b#cBi5b"3FQpUC@0d$N-[3bX -V)%0[EA"TE'9b$N-[3bXV)&GKFQjTEQGc"N0'66Bi5`p3BA0MB@`J3fpYF'PXCA) -28'&cBf&X)&GKFQjTEQGc#e"33b"$Ef4P4f9Z%&"33b"%DA0KFh0PE@*XCA)+8&" -$)%aTEQYPFJG38%-J8%9'#e"33b"3FQpUC@0d$&"33d&cE5"3B@jPE!a5CASJ3fp -YF'PXCA+qM`: diff --git a/Mac/Unsupported/mactcp/socket.py b/Mac/Unsupported/mactcp/socket.py deleted file mode 100644 index e6600b1..0000000 --- a/Mac/Unsupported/mactcp/socket.py +++ /dev/null @@ -1,304 +0,0 @@ -"""socket.py for mac - Emulate socket module with mactcp and macdnr - -Currently only implements TCP sockets (AF_INET, SOCK_STREAM). -Esoteric things like socket options don't work, -but getpeername() and makefile() do work; everything used by ftplib works! -""" - -# Jack Jansen, CWI, November 1994 (initial version) -# Guido van Rossum, CWI, March 1995 (bug fixes and lay-out) - - -import mactcp -import MACTCPconst -import macdnr - - -# Exported constants - -_myerror = 'socket_wrapper.error' -error = (mactcp.error, macdnr.error, _myerror) - -SOCK_DGRAM = 1 -SOCK_STREAM = 2 - -AF_INET = 1 - - -# Internal constants - -_BUFSIZE = 15*1024 # Size of TCP/UDP input buffer - -_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 gethostbyaddr(str): - id = _ipaddress(str) - ptr = macdnr.AddrToName(id) - ptr.wait() - name = ptr.cname - if name[-1:] == '.': name = name[:-1] - names, addresses = [], [str] - return name, names, addresses - -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 _myerror, 'Protocol family %d not supported' % type - if type == SOCK_DGRAM: - return _udpsocket() - elif type == SOCK_STREAM: - return _tcpsocket() - raise _myerror, 'Protocol type %d not supported' % type - - -def fromfd(*args): - raise _myerror, 'Operation not supported on a mac' - - -class _socket: - def unsupported(self, *args): - raise _myerror, 'Operation not supported on this socket' - - accept = unsupported - bind = unsupported - close = unsupported - connect = unsupported - fileno = unsupported - getpeername = unsupported - getsockname = unsupported - getsockopt = unsupported - listen = unsupported - recv = unsupported - recvfrom = unsupported - send = unsupported - sendto = unsupported - setblocking = unsupported - setsockopt = unsupported - shutdown = unsupported - - -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 _myerror, 'Not listening' - self.listening = 0 - self.stream.wait() - self.accepted = 1 - return self, self.getsockname() - - # bind has two ways of calling: s.bind(host, port) or s.bind((host, port)); - # the latter is more proper but the former more common - def bind(self, a1, a2=None): - if a2 is None: - host, port = a1 - else: - host, port = a1, a2 - self.port = port - - def close(self): - if self.accepted: - self.accepted = 0 - return - self.stream.Abort() - - # connect has the same problem as bind (see above) - def connect(self, a1, a2=None): - if a2 is None: - host, port = a1 - else: - host, port = a1, a2 - self.stream.ActiveOpen(self.port, _ipaddress(host), port) - - def getsockname(self): - host, port = self.stream.GetSockName() - host = macdnr.AddrToStr(host) - return host, port - - 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 = 'r', bs = 512): - return _socketfile(self, rw, bs) - - def recv(self, bufsize, flags=0): - if flags: - raise _myerror, 'recv flags not yet supported on mac' - if not self.databuf: - try: - self.databuf, urg, mark = self.stream.Rcv(0) - except mactcp.error, arg: - if arg[0] != MACTCPconst.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, rw, bs): - if rw[1:] == 'b': rw = rw[:1] - if rw not in ('r', 'w'): raise _myerror, "mode must be 'r' or 'w'" - self.sock = sock - self.rw = rw - self.bs = bs - self.buf = '' - - def read(self, length = -1): - if length < 0: - 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:] - return rv - - def readlines(self): - list = [] - line = self.readline() - while line: - list.append(line) - line = self.readline() - return list - - def write(self, buf): - BS = self.bs - if len(buf) >= BS: - self.flush() - self.sock.send(buf) - elif len(buf) + len(self.buf) >= BS: - self.flush() - self.buf = buf - else: - self.buf = self.buf + buf - - def writelines(self, list): - for line in list: - self.write(line) - - def flush(self): - if self.buf and self.rw == 'w': - self.sock.send(self.buf) - self.buf = '' - - def close(self): - self.flush() - ##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 diff --git a/Mac/Unsupported/mactcp/tcpglue.c b/Mac/Unsupported/mactcp/tcpglue.c deleted file mode 100644 index 79042b4..0000000 --- a/Mac/Unsupported/mactcp/tcpglue.c +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Glue routines for mactcp module. - * Jack Jansen, CWI, 1994. - * - * Adapted from mactcp socket library, which was in turn - * adapted from ncsa telnet code. - * - * Original authors: Tom Milligan, Charlie Reiman - */ - -# include <Memory.h> -# include <Files.h> -# include <Errors.h> - -#include "tcpglue.h" -#include <Devices.h> - -static short driver = 0; - -#ifndef __powerc -/* - * Hack fix for MacTCP 1.0.X bug - * - * This hack doesn't work on the PPC. But then, people with new machines - * shouldn't run ancient buggy software. -- Jack. - */ - -pascal char *ReturnA5(void) = {0x2E8D}; -#endif /* !__powerc */ - -OSErr xOpenDriver() -{ - if (driver == 0) - { - ParamBlockRec pb; - OSErr io; - - pb.ioParam.ioCompletion = 0L; - pb.ioParam.ioNamePtr = "\p.IPP"; - pb.ioParam.ioPermssn = fsCurPerm; - io = PBOpen(&pb,false); - if (io != noErr) - return(io); - driver = pb.ioParam.ioRefNum; - } - return noErr; -} - -/* - * create a TCP stream - */ -OSErr xTCPCreate(buflen,notify,udp, pb) - int buflen; - TCPNotifyUPP notify; - void *udp; - TCPiopb *pb; -{ - pb->ioCRefNum = driver; - pb->csCode = TCPCreate; - pb->csParam.create.rcvBuff = (char *)NewPtr(buflen); - pb->csParam.create.rcvBuffLen = buflen; - pb->csParam.create.notifyProc = notify; - pb->csParam.create.userDataPtr = udp; - return (xPBControlSync(pb)); -} - - -/* - * start listening for a TCP connection - */ -OSErr xTCPPassiveOpen(TCPiopb *pb, short port, TCPIOCompletionUPP completion, - void *udp) -{ - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = TCPPassiveOpen; - pb->csParam.open.validityFlags = timeoutValue | timeoutAction; - pb->csParam.open.ulpTimeoutValue = 255 /* seconds */; - pb->csParam.open.ulpTimeoutAction = 0 /* 1:abort 0:report */; - pb->csParam.open.commandTimeoutValue = 0 /* infinity */; - pb->csParam.open.remoteHost = 0; - pb->csParam.open.remotePort = 0; - pb->csParam.open.localHost = 0; - pb->csParam.open.localPort = port; - pb->csParam.open.dontFrag = 0; - pb->csParam.open.timeToLive = 0; - pb->csParam.open.security = 0; - pb->csParam.open.optionCnt = 0; - pb->csParam.open.userDataPtr = udp; - return (xPBControl(pb,completion)); -} - -/* - * connect to a remote TCP - */ -OSErr xTCPActiveOpen(TCPiopb *pb, short port, long rhost, short rport, - TCPIOCompletionUPP completion) -{ - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = TCPActiveOpen; - pb->csParam.open.validityFlags = timeoutValue | timeoutAction; - pb->csParam.open.ulpTimeoutValue = 60 /* seconds */; - pb->csParam.open.ulpTimeoutAction = 1 /* 1:abort 0:report */; - pb->csParam.open.commandTimeoutValue = 0; - pb->csParam.open.remoteHost = rhost; - pb->csParam.open.remotePort = rport; - pb->csParam.open.localHost = 0; - pb->csParam.open.localPort = port; - pb->csParam.open.dontFrag = 0; - pb->csParam.open.timeToLive = 0; - pb->csParam.open.security = 0; - pb->csParam.open.optionCnt = 0; - return (xPBControl(pb,completion)); -} - -OSErr xTCPNoCopyRcv(pb,rds,rdslen,timeout,completion) - TCPiopb *pb; - rdsEntry *rds; - int rdslen; - int timeout; - TCPIOCompletionUPP completion; -{ - - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = TCPNoCopyRcv; - pb->csParam.receive.commandTimeoutValue = timeout; /* seconds, 0 = blocking */ - pb->csParam.receive.rdsPtr = (Ptr)rds; - pb->csParam.receive.rdsLength = rdslen; - return (xPBControl(pb,completion)); -} - -OSErr xTCPBufReturn(TCPiopb *pb,rdsEntry *rds,TCPIOCompletionUPP completion) - { - pb->ioCRefNum = driver; - pb->csCode = TCPRcvBfrReturn; - pb->csParam.receive.rdsPtr = (Ptr)rds; - - return (xPBControl(pb,completion)); - } - -/* - * send data - */ -OSErr xTCPSend(TCPiopb *pb, wdsEntry *wds, Boolean push, Boolean urgent, TCPIOCompletionUPP completion) -{ - if (driver == 0) - return invalidStreamPtr; - - pb->ioCRefNum = driver; - pb->csCode = TCPSend; - pb->csParam.send.validityFlags = timeoutValue | timeoutAction; - pb->csParam.send.ulpTimeoutValue = 60 /* seconds */; - pb->csParam.send.ulpTimeoutAction = 0 /* 0:abort 1:report */; - pb->csParam.send.pushFlag = push; - pb->csParam.send.urgentFlag = urgent; - pb->csParam.send.wdsPtr = (Ptr)wds; - return (xPBControl(pb,completion)); -} - - -/* - * close a connection - */ -OSErr xTCPClose(TCPiopb *pb,TCPIOCompletionUPP completion) -{ - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = TCPClose; - pb->csParam.close.validityFlags = timeoutValue | timeoutAction; - pb->csParam.close.ulpTimeoutValue = 60 /* seconds */; - pb->csParam.close.ulpTimeoutAction = 1 /* 1:abort 0:report */; - return (xPBControl(pb,completion)); -} - -/* - * abort a connection - */ -OSErr xTCPAbort(TCPiopb *pb) -{ - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = TCPAbort; - return (xPBControlSync(pb)); -} - -/* - * close down a TCP stream (aborting a connection, if necessary) - */ -OSErr xTCPRelease(pb) - TCPiopb *pb; -{ - OSErr io; - - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = TCPRelease; - io = xPBControlSync(pb); - if (io == noErr) - DisposPtr(pb->csParam.create.rcvBuff); /* there is no release pb */ - return(io); -} - -#if 0 - -int -xTCPBytesUnread(sp) - SocketPtr sp; -{ - TCPiopb *pb; - OSErr io; - - if (!(pb = sock_fetch_pb(sp))) - return -1; /* panic */ - - if (driver == 0) - return(-1); - - pb->ioCRefNum = driver; - pb->csCode = TCPStatus; - io = xPBControlSync(pb); - if (io != noErr) - return(-1); - return(pb->csParam.status.amtUnreadData); -} - -int -xTCPBytesWriteable(sp) - SocketPtr sp; - { - TCPiopb *pb; - OSErr io; - long amount; - - if (!(pb = sock_fetch_pb(sp))) - return -1; /* panic */ - - if (driver == 0) - return(-1); - - pb->ioCRefNum = driver; - pb->csCode = TCPStatus; - io = xPBControlSync(pb); - if (io != noErr) - return(-1); - amount = pb->csParam.status.sendWindow-pb->csParam.status.amtUnackedData; - if (amount < 0) - amount = 0; - return amount; - } - -int xTCPWriteBytesLeft(SocketPtr sp) - { - TCPiopb *pb; - OSErr io; - - if (!(pb = sock_fetch_pb(sp))) - return -1; /* panic */ - - if (driver == 0) - return(-1); - - pb->ioCRefNum = driver; - pb->csCode = TCPStatus; - io = xPBControlSync(pb); - if (io != noErr) - return(-1); - return (pb->csParam.status.amtUnackedData); - } -#endif - -OSErr xTCPStatus(TCPiopb *pb, TCPStatusPB **spb) - { - OSErr io; - - if (driver == 0) - return(-1); - - pb->ioCRefNum = driver; - pb->csCode = TCPStatus; - io = xPBControlSync(pb); - if (io == noErr) - *spb = &pb->csParam.status; - return(io); - } - - -/* - * create a UDP stream, hook it to a socket. - */ -OSErr xUDPCreate(UDPiopb *pb,int buflen,ip_port *port, UDPNotifyUPP asr, void *udp) - { - OSErr io; - - pb->ioCRefNum = driver; - pb->csCode = UDPCreate; - pb->csParam.create.rcvBuff = (char *)NewPtr(buflen); - pb->csParam.create.rcvBuffLen = buflen; - pb->csParam.create.notifyProc = asr; - pb->csParam.create.userDataPtr = udp; - pb->csParam.create.localPort = *port; - if ( (io = xPBControlSync( (TCPiopb *)pb ) ) != noErr) - return io; - - *port = pb->csParam.create.localPort; - return noErr; - } - -/* - * ask for incoming data - */ -OSErr xUDPRead(UDPiopb *pb, int timeout, UDPIOCompletionUPP completion) - { - - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = UDPRead; - pb->csParam.receive.timeOut = timeout; - pb->csParam.receive.secondTimeStamp = 0/* must be zero */; - return (xPBControl ( (TCPiopb *)pb, (TCPIOCompletionUPP)completion )); - } - -OSErr xUDPBfrReturn(UDPiopb *pb, char *buff) - { - - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = UDPBfrReturn; - pb->csParam.receive.rcvBuff = buff; - return ( xPBControl( (TCPiopb *)pb,(TCPIOCompletionUPP)-1 ) ); - } - -/* - * send data - */ -OSErr xUDPWrite(UDPiopb *pb,ip_addr host,ip_port port,miniwds *wds, - UDPIOCompletionUPP completion) - { - - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = UDPWrite; - pb->csParam.send.remoteHost = host; - pb->csParam.send.remotePort = port; - pb->csParam.send.wdsPtr = (Ptr)wds; - pb->csParam.send.checkSum = true; - pb->csParam.send.sendLength = 0/* must be zero */; - return (xPBControl( (TCPiopb *)pb, (TCPIOCompletionUPP)completion)); - } - -/* - * close down a UDP stream (aborting a read, if necessary) - */ -OSErr xUDPRelease(UDPiopb *pb) { - OSErr io; - - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = UDPRelease; - io = xPBControlSync( (TCPiopb *)pb ); - if (io == noErr) { - DisposPtr(pb->csParam.create.rcvBuff); - } - return(io); - } - -ip_addr xIPAddr(void) -{ - struct GetAddrParamBlock pbr; - OSErr io; - - pbr.ioCRefNum = driver; - pbr.csCode = ipctlGetAddr; - io = xPBControlSync( (TCPiopb *)&pbr ); - if (io != noErr) - return(0); - return(pbr.ourAddress); -} - -long xNetMask() -{ - struct GetAddrParamBlock pbr; - OSErr io; - - pbr.ioCRefNum = driver; - pbr.csCode = ipctlGetAddr; - io = xPBControlSync( (TCPiopb *)&pbr); - if (io != noErr) - return(0); - return(pbr.ourNetMask); -} - -unsigned short xMaxMTU() -{ - struct UDPiopb pbr; - OSErr io; - - pbr.ioCRefNum = driver; - pbr.csCode = UDPMaxMTUSize; - pbr.csParam.mtu.remoteHost = xIPAddr(); - io = xPBControlSync( (TCPiopb *)&pbr ); - if (io != noErr) - return(0); - return(pbr.csParam.mtu.mtuSize); -} - -OSErr xPBControlSync(TCPiopb *pb) -{ - (pb)->ioCompletion = 0L; - return PBControl((ParmBlkPtr)(pb),false); -} - -#pragma segment SOCK_RESIDENT - -OSErr xTCPRcv(pb,buf,buflen,timeout,completion) - TCPiopb *pb; - Ptr buf; - int buflen; - int timeout; - TCPIOCompletionUPP completion; -{ - - if (driver == 0) - return(invalidStreamPtr); - - pb->ioCRefNum = driver; - pb->csCode = TCPRcv; - pb->csParam.receive.commandTimeoutValue = timeout; /* seconds, 0 = blocking */ - pb->csParam.receive.rcvBuff = buf; - pb->csParam.receive.rcvBuffLen = buflen; - return (xPBControl(pb,completion)); -} - -OSErr xPBControl(TCPiopb *pb,TCPIOCompletionUPP completion) -{ -#ifndef __MWERKS__ - pb->ioNamePtr = ReturnA5(); -#endif - - if (completion == 0L) - { - (pb)->ioCompletion = 0L; - return(PBControl((ParmBlkPtr)(pb),false)); /* sync */ - } - else if (completion == (TCPIOCompletionUPP)-1L) - { - (pb)->ioCompletion = 0L; - return(PBControl((ParmBlkPtr)(pb),true)); /* async */ - } - else - { - (pb)->ioCompletion = completion; - return(PBControl((ParmBlkPtr)(pb),true)); /* async */ - } -} - diff --git a/Mac/Unsupported/mactcp/tcpglue.h b/Mac/Unsupported/mactcp/tcpglue.h deleted file mode 100644 index ef9e133..0000000 --- a/Mac/Unsupported/mactcp/tcpglue.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Prototypes for mactcpglue routines and includes/structures needed - * by those. - * - * Jack Jansen, CWI, 1994. - * - * Adapted from mac socket library, which has in turn adapted from ncsa telnet. - * Original authors: Tom Milligan, Charlie Reiman - */ - -#include <MacTCPCommonTypes.h> -#include <GetMyIPAddr.h> -#include <TCPPB.h> -#include <UDPPB.h> -#include <AddressXlation.h> - -#ifndef __MWERKS__ -#define TCPIOCompletionUPP TCPIOCompletionProc -#define TCPNotifyUPP TCPNotifyProc -#define UDPIOCompletionUPP UDPIOCompletionProc -#define UDPNotifyUPP UDPNotifyProc -#define NewTCPIOCompletionProc(x) (x) -#define NewTCPNotifyProc(x) (x) -#define NewUDPIOCompletionProc(x) (x) -#define NewUDPNotifyProc(x) (x) -#endif /* __MWERKS__ */ - -#if defined(powerc) || defined (__powerc) -#pragma options align=mac68k -#endif - -typedef struct miniwds - { - unsigned short length; - char * ptr; - unsigned short terminus; /* must be zero'd for use */ - } miniwds; - -#if defined(powerc) || defined(__powerc) -#pragma options align=reset -#endif - - -OSErr xOpenDriver(void); -OSErr xPBControl(TCPiopb *pb, TCPIOCompletionUPP completion); -OSErr xPBControlSync(TCPiopb *pb); -OSErr xTCPCreate(int buflen, TCPNotifyUPP notify, void *udp, TCPiopb *pb); -OSErr xTCPPassiveOpen(TCPiopb *pb, short port, TCPIOCompletionUPP completion, void *udp); -OSErr xTCPActiveOpen(TCPiopb *pb, short port, long rhost, short rport, TCPIOCompletionUPP completion); -OSErr xTCPRcv(TCPiopb *pb, char *buf, int buflen, int timeout, TCPIOCompletionUPP completion); -OSErr xTCPNoCopyRcv(TCPiopb *,rdsEntry *,int,int,TCPIOCompletionUPP); -OSErr xTCPBufReturn(TCPiopb *pb,rdsEntry *rds,TCPIOCompletionUPP completion); -OSErr xTCPSend(TCPiopb *pb, wdsEntry *wds, Boolean push, Boolean urgent, TCPIOCompletionUPP completion); -OSErr xTCPClose(TCPiopb *pb,TCPIOCompletionUPP completion); -OSErr xTCPAbort(TCPiopb *pb); -OSErr xTCPRelease(TCPiopb *pb); - -OSErr xUDPCreate(UDPiopb *pb,int buflen,ip_port *port, UDPNotifyUPP asr, void *udp); -OSErr xUDPRead(UDPiopb *pb,int timeout, UDPIOCompletionUPP completion); -OSErr xUDPBfrReturn(UDPiopb *pb, char *buff); -OSErr xUDPWrite(UDPiopb *pb,ip_addr host,ip_port port,miniwds *wds, - UDPIOCompletionUPP completion); -OSErr xUDPRelease(UDPiopb *pb); - -ip_addr xIPAddr(void); -long xNetMask(void); -unsigned short xMaxMTU(void); - |