diff options
Diffstat (limited to 'Mac/Unsupported/mactcp/tcpglue.c')
-rw-r--r-- | Mac/Unsupported/mactcp/tcpglue.c | 477 |
1 files changed, 0 insertions, 477 deletions
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 */ - } -} - |