void TCPLow_Create(TCPINSTANCE* pTcp, u_short* port, TCPPEER* peer, int* status) { TBind boundAddr; InetAddress boundInetAddr; InetInterfaceInfo inetInfo; OSStatus err; pTcp->isValid = false; // Initialize OpenTransport err = InitOpenTransport(); if (err != noErr) { *status = comm_STATUS_BAD; return; } // initialize Internet Services pTcp->inetService = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err); if (err != noErr) { *status = comm_STATUS_BAD; return; } // open an endpoint for sending and recieving data err = CreateAndConfigUDP(&pTcp->udpEndpoint); if (err != noErr) { ShutDownUDP(pTcp->udpEndpoint); *status = comm_STATUS_BAD; return; } pTcp->isValid = true; // Get information about Internet err = OTInetGetInterfaceInfo(&inetInfo, kDefaultInetInterface); if (err != noErr) { //DebugStr("\pCannot Get Information About Default Interface"); *status = comm_STATUS_BAD; ShutDownUDP(pTcp->udpEndpoint); return; } boundAddr.addr.maxlen = sizeof(boundInetAddr); boundAddr.addr.buf = (unsigned char*) &boundInetAddr;; err = OTGetProtAddress(pTcp->udpEndpoint,&boundAddr,NULL); if (err != noErr) { *status = comm_STATUS_BAD; ShutDownUDP(pTcp->udpEndpoint); return; } peer->addr = inetInfo.fAddress; peer->port = *port = boundInetAddr.fPort; pTcp->myHandle = dcstReplace(pTcp->handles,pTcp->myHandle,peer); }
int commTerm( commTermReq_t * req, // Request (or NULL) commTermResp_t * resp) // Response (or NULL) { commTermReq_t reqDummy; commTermResp_t respDummy; DPRINT(("@TRUMP commTerm(): ")); if (req == NULL) req = (commTermReq_t *)memset(&reqDummy, 0, sizeof(*req)); if (resp == NULL) resp = &respDummy; if (peertab) { int i; for (i=0; i<peertab->n_used; i++) { assoctab_item_t *pe = assoctab_getkey(peertab, i); if (!pe) DPRINT(("commTerm: couldn't find entry\n")); else if (pe->key != trump_HDL_ME) { DPRINT(("commTerm: closing handle %d\n", pe->key)); tcpabi_udp_close(pe->key, UDP_CLOSE_NORMAL); } else { DPRINT(("commTerm: not closing handle %d\n", pe->key)); } } assoctab_destroy(peertab); } free(scratch_flat); resp->status = comm_STATUS_OK; DPRINT(("commTerm: success\n")); // unbind our endpoint and close open transport ShutDownUDP(); return TRUE; }
void TCPLow_Destroy(TCPINSTANCE* pTcp) { if (pTcp->isValid) ShutDownUDP(pTcp->udpEndpoint); pTcp->isValid = false; }
int commInit( commInitReq_t * req, // Request (or NULL) commInitResp_t * resp) // Response (or NULL) { commInitReq_t reqDummy; commInitResp_t respDummy; ip_adr_t adr_broadcast; ip_adr_t *padr; OSStatus err; extern Str255 gSavedSelection; // DebugStr ( "\pcommInit()" ); DPRINT(("@TRUMP commInit(): ")); if (req == NULL) req = (commInitReq_t *)memset(&reqDummy, 0, sizeof(*req)); if (resp == NULL) resp = &respDummy; scratch_flat = malloc(MAX_RAW_PKTLEN); //scratch_flat = my_dos_malloc(MAX_RAW_PKTLEN, &scratch_seg, &scratch_off, &scratch_selector); if (!scratch_flat) { DPRINT(("commInit: couldn't allocate DOS memory!\n")); resp->status = comm_STATUS_BAD; return FALSE; } // check for the existanct of OpenTransport if(!OpenTransportExists() || !OpenTransportInetExists()) { //DebugStr("\pOpen Transport Does Not Exist"); DPRINT(("commInit: UDP ABI not found\n")); resp->status = comm_STATUS_NETWORK_NOT_PRESENT; free(scratch_flat); return FALSE; } // Initialize OpenTransport err = InitOpenTransport(); if (err != noErr) { resp->status = comm_STATUS_BAD; free(scratch_flat); return FALSE; } // initialize Internet Services gInetService = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err); if (err != noErr) { resp->status = comm_STATUS_BAD; free(scratch_flat); return FALSE; } // open an endpoint for sending and recieving data err = CreateAndConfigUDP(&gUDPEndpoint); if (err != noErr) { resp->status = comm_STATUS_BAD; free(scratch_flat); ShutDownUDP(); return FALSE; } // create the peer table peertab = assoctab_create(sizeof(ip_adr_t)); if (!peertab) { // ABORT! Out of Memory resp->status = comm_STATUS_BAD; free(scratch_flat); ShutDownUDP(); return FALSE; } // Get information about the Internet err = OTInetGetInterfaceInfo(&gInetInfo, kDefaultInetInterface); if (err != noErr) { //DebugStr("\pCannot Get Information About Default Interface"); resp->status = comm_STATUS_BAD; free(scratch_flat); ShutDownUDP(); return FALSE; } // Store our address in the peer table under the bogus ME handle padr = (ip_adr_t *)assoctab_subscript_grow(peertab, trump_HDL_ME); if (!padr) { DPRINT(("commInit: couldn't grow peer table\n")); resp->status = comm_STATUS_BAD; free(scratch_flat); assoctab_destroy(peertab); ShutDownUDP(); return FALSE; } dprint_peertab(peertab); DPRINT(("commInit: saving handle %d adr %x at %p\n", trump_HDL_ME, gInetInfo.fAddress, padr)); memcpy(padr, &gInetInfo.fAddress, sizeof(ip_adr_t)); dprint_peertab(peertab); // Open a handle good for receiving packets on the standard port // SRC = (*,*) // DEST = (localhost, pt->port) adr_broadcast = 0xffffffff; hdl_rx = trump_adr2hdl(adr_broadcast, SOCKET_MW2, SOCKET_MW2, TRUE); if (hdl_rx == trump_HDL_NONE) { DPRINT(("commInit: couldn't open handle for listening\n")); resp->status = comm_STATUS_BUSY; free(scratch_flat); assoctab_destroy(peertab); ShutDownUDP(); return FALSE; } /* if ((req->flags & comm_INIT_FLAGS_RESUME) == 0) { if (!DoHostListDialog()) { resp->status = comm_STATUS_EMPTY; free(scratch_flat); assoctab_destroy(peertab); ShutDownUDP(); return FALSE; } } else { // we need to load the last string selected when we are resuming OpenPrefsFile(); p2cstr(gSavedSelection); // the apps like C-strings ClosePrefsFile(); } */ // initialize our address list to nothing InitAddressList(); // add our own address to the beginning of the list (it MUST Be the first // address in our list - we broadcast to all _other_ addresses in our list) AddAddressToList(gInetInfo.fAddress); // add the address from the dialog to our broadcast list if the user chose one if (gSavedSelection[0] != 0) { InetHostInfo theHostInfo; OTSetSynchronous(gInetService); err = OTInetStringToAddress(gInetService, gSavedSelection, &theHostInfo); OTSetAsynchronous(gInetService); if (err == noErr) { AddAddressToList(theHostInfo.addrs[0]); } } resp->status = comm_STATUS_OK; DPRINT(("commInit: success\n")); return TRUE; }