void AddAddressListToList(InetHost* newAddressList, short count) { short i; // if the list is full, bail out if (gAddressList.addressCount < kMaxAddressesIP - 1) { for (i = 0; i < count; i++) { AddAddressToList(*newAddressList); // add this IP to our list newAddressList++; // next IP address } } }
int tcpabi_udp_send_to_address(InetAddress* theAddress, void *buf, unsigned len) { TUnitData udata; OSStatus err; OTResult theResult; // send our list of addresses to the destination address udata.addr.maxlen = sizeof(InetAddress); udata.addr.len = sizeof(InetAddress); udata.addr.buf = (unsigned char *) theAddress; udata.opt.maxlen = 0; udata.opt.len = 0; udata.opt.buf = nil; udata.udata.maxlen = len; udata.udata.len = len; udata.udata.buf = (unsigned char *)buf; do { err = OTSndUData(gUDPEndpoint, &udata); if (err == kOTLookErr) { theResult = OTLook(gUDPEndpoint); if (theResult == T_UDERR) { HandleErrorUDERR(); err = 666; } } } while (err == 666); // add the destination address to our list of addresses AddAddressToList(theAddress->fHost); return err; }
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; }