void do_write(OTUDP *x, long length, void *bytes) { /* This should never be called at interrupt level */ OSStatus err; InetAddress dest_addr; TUnitData udata; OTInitInetAddress(&dest_addr, x->o_inetPort, x->o_inetHost); udata.addr.len = sizeof(dest_addr); udata.addr.buf = (unsigned char *) &dest_addr; udata.opt.len = 0; udata.opt.buf = nil; udata.udata.len = length; udata.udata.buf = bytes; err = OTSndUData(x->o_udp_ep, &udata); if (err == kOTBadSyncErr) { error("¥ OTUDP: failed to send data at interrupt level. Try turning off overdrive."); } else if (err == kEHOSTUNREACHErr) { error("OTUDP: Host address is unreachable; couldn't send packet"); post("Make sure you're really on a network."); } else if (err != noErr) { error("¥ OTUDP: OTSndUData returned error code %ld.", err); } }
int TCPLow_PutPacket(TCPINSTANCE* tcp, TCPPEER* pPeer,void* bufptr,ULONG len) { TUnitData udata; OSStatus err; OTResult theResult; InetAddress destAddr; unsigned char *pt; OTInitInetAddress(&destAddr,pPeer->port,pPeer->addr); udata.addr.maxlen = sizeof(InetAddress); udata.addr.len = sizeof(InetAddress); udata.addr.buf = (unsigned char *) &destAddr; 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 *)bufptr; do { err = OTSndUData(tcp->udpEndpoint, &udata); if (err == kOTLookErr) { theResult = OTLook(tcp->udpEndpoint); if (theResult == T_UDERR) { HandleErrorUDERR(); err = 666; } } } while (err == 666); return err; }
int tcpabi_udp_send( unsigned handle, void *buf, unsigned len, unsigned ttltos, unsigned id, unsigned char flags ) { TUnitData udata; OSStatus err; OTResult theResult; udata.addr.maxlen = sizeof(gDests[handle].dest_addr); udata.addr.len = sizeof(gDests[handle].dest_addr); udata.addr.buf = (unsigned char *) &gDests[handle].dest_addr; 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); return err; }
int tcpabi_udp_broadcast(void *buf, unsigned len) { OSStatus err = noErr; TUnitData udata; OTResult theResult; short i; InetAddress currentAddress; // this method sends the specified packet to our list of // IP addreses. We return noErr if they were all sent // without any trouble (we should ignore errors which // indicate that the other end is not there since we // really don't care if all of these packets are delivered) // we don't broadcast to the first address because it's our own for (i = 1; i < gAddressList.addressCount; i++) { OTInitInetAddress(¤tAddress, SOCKET_MW2, gAddressList.addressList[i]); udata.addr.maxlen = sizeof(InetAddress); udata.addr.len = sizeof(InetAddress); udata.addr.buf = (unsigned char *) ¤tAddress; 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); } return err; }
int atalk_ddp_broadcast(void *buf, unsigned len) { OSStatus err = noErr; TUnitData udata; OTResult theResult; short i; extern short gLookupCount; extern DDPAddress gLookupResults[]; // this method sends the specified packet to our list of // DDP addreses. We return noErr if they were all sent // without any trouble (we should ignore errors which // indicate that the other end is not there since we // really don't care if all of these packets are delivered) for (i = 0; i < gLookupCount; i++) { udata.addr.len = sizeof(DDPAddress); udata.addr.buf = (unsigned char *) &gLookupResults[i]; udata.opt.len = 0; udata.opt.buf = nil; udata.udata.len = len; udata.udata.buf = (unsigned char *)buf; do { err = OTSndUData(gDDPEndpoint, &udata); if (err == kOTLookErr) { theResult = OTLook(gDDPEndpoint); if (theResult == T_UDERR) { HandleErrorUDERR(); err = 666; } } } while (err == 666); } return err; }
NMErr OTIPEnumerator::SendQuery(void) { DEBUG_ENTRY_EXIT("IPEnumerator::SendQuery"); TUnitData udata; OTResult result; InetAddress broadcastAddr; // Set up the unit data structure // fBroadcastAddr doesn't seem to get set right, so construct it OTInitInetAddress(&broadcastAddr, mConfig.address.fPort, mInterfaceInfo.fAddress | ~mInterfaceInfo.fNetmask); udata.addr.buf = (NMUInt8 *) &broadcastAddr; udata.addr.len = sizeof (InetAddress); udata.opt.len = 0; udata.udata.len = kQuerySize; udata.udata.buf = mPacketData; do { result = OTSndUData(mEP, &udata); if (result < 0) { DEBUG_PRINT("OTSndUData returned an error: %ld", result); if (result == kOTLookErr) HandleLookErr(); } } while (result != kNMNoError && result == kOTLookErr); // Set the timestamp so that we'll know when to ping again OTGetTimeStamp(&mLastQueryTimeStamp); return result; }
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; }
/* Send a vector of packets to the the channels specified within the packet. If the channel specified in the packet is -1, the packet will be sent to the address in the 'src' member of the packet. Each packet will be updated with the status of the packet after it has been sent, -1 if the packet send failed. This function returns the number of packets sent. */ int SDLNet_UDP_SendV(UDPsocket sock, UDPpacket **packets, int npackets) { int numsent, i, j; struct UDP_channel *binding; int status; #ifndef MACOS_OPENTRANSPORT int sock_len; struct sockaddr_in sock_addr; /* Set up the variables to send packets */ sock_len = sizeof(sock_addr); #endif numsent = 0; for ( i=0; i<npackets; ++i ) { /* if channel is < 0, then use channel specified in sock */ if ( packets[i]->channel < 0 ) { #ifdef MACOS_OPENTRANSPORT TUnitData OTpacket; InetAddress address; memset(&OTpacket, 0, sizeof(OTpacket)); OTpacket.addr.buf = (Uint8 *)&address; OTpacket.addr.len = (sizeof address); OTpacket.udata.buf = packets[i]->data; OTpacket.udata.len = packets[i]->len; OTInitInetAddress(&address, packets[i]->address.port, packets[i]->address.host); #ifdef DEBUG_NET printf("Packet send address: 0x%8.8x:%d, length = %d\n", packets[i]->address.host, packets[i]->address.port, packets[i]->len); #endif status = OTSndUData(sock->channel, &OTpacket); #ifdef DEBUG_NET printf("SDLNet_UDP_SendV OTSndUData return value is ;%d\n", status ); #endif AsyncUDPPopEvent( sock ); packets[i]->status = status; if (status == noErr) { ++numsent; } #else sock_addr.sin_addr.s_addr = packets[i]->address.host; sock_addr.sin_port = packets[i]->address.port; sock_addr.sin_family = AF_INET; status = sendto(sock->channel, packets[i]->data, packets[i]->len, 0, (struct sockaddr *)&sock_addr,sock_len); if ( status >= 0 ) { packets[i]->status = status; ++numsent; } #endif /* MACOS_OPENTRANSPORT */ } else { /* Send to each of the bound addresses on the channel */ #ifdef DEBUG_NET printf("SDLNet_UDP_SendV sending packet to channel = %d\n", packets[i]->channel ); #endif binding = &sock->binding[packets[i]->channel]; for ( j=binding->numbound-1; j>=0; --j ) { #ifdef MACOS_OPENTRANSPORT TUnitData OTpacket; InetAddress address; OTInitInetAddress(&address, binding->address[j].port,binding->address[j].host); #ifdef DEBUG_NET printf("Packet send address: 0x%8.8x:%d, length = %d\n", binding->address[j].host, binding->address[j].port, packets[i]->len); #endif memset(&OTpacket, 0, sizeof(OTpacket)); OTpacket.addr.buf = (Uint8 *)&address; OTpacket.addr.len = (sizeof address); OTpacket.udata.buf = packets[i]->data; OTpacket.udata.len = packets[i]->len; status = OTSndUData(sock->channel, &OTpacket); #ifdef DEBUG_NET printf("SDLNet_UDP_SendV OTSndUData returne value is;%d\n", status ); #endif AsyncUDPPopEvent(sock); packets[i]->status = status; if (status == noErr) { ++numsent; } #else sock_addr.sin_addr.s_addr = binding->address[j].host; sock_addr.sin_port = binding->address[j].port; sock_addr.sin_family = AF_INET; status = sendto(sock->channel, packets[i]->data, packets[i]->len, 0, (struct sockaddr *)&sock_addr,sock_len); if ( status >= 0 ) { packets[i]->status = status; ++numsent; } #endif /* MACOS_OPENTRANSPORT */ } } } return(numsent); }
// Errors: // EBADF -- bad socket id // EFAULT -- bad buffer static PRInt32 SendReceiveDgram(PRFileDesc *fd, void *buf, PRInt32 amount, PRIntn flags, PRNetAddr *addr, PRUint32 *addrlen, PRIntervalTime timeout, SndRcvOpCode opCode) { OSStatus err; PRInt32 osfd = fd->secret->md.osfd; EndpointRef endpoint = (EndpointRef) osfd; PRThread *me = _PR_MD_CURRENT_THREAD(); PRInt32 bytesLeft = amount; TUnitData dgram; PR_ASSERT(flags == 0); if (endpoint == NULL) { err = kEBADFErr; goto ErrorExit; } if (buf == NULL || addr == NULL) { err = kEFAULTErr; goto ErrorExit; } memset(&dgram, 0 , sizeof(dgram)); dgram.addr.maxlen = *addrlen; dgram.addr.len = *addrlen; dgram.addr.buf = (UInt8*) addr; dgram.udata.maxlen = amount; dgram.udata.len = amount; dgram.udata.buf = (UInt8*) buf; while (bytesLeft > 0) { PrepareThreadForAsyncIO(me, endpoint, osfd); if (opCode == kDGRAM_SEND) err = OTSndUData(endpoint, &dgram); else if (opCode == kDGRAM_RECEIVE) err = OTRcvUData(endpoint, &dgram, NULL); else { err = kEINVALErr; goto ErrorExit; } if (err == kOTNoError) { buf = (void *) ( (UInt32) buf + (UInt32)dgram.udata.len ); bytesLeft -= dgram.udata.len; dgram.udata.buf = (UInt8*) buf; me->io_pending = PR_FALSE; } else { PR_ASSERT(err == kOTNoDataErr || err == kOTOutStateErr); WaitOnThisThread(me, timeout); err = me->md.osErrCode; if (err != kOTNoError) goto ErrorExit; PR_ASSERT(me->md.cookie != NULL); } } if (opCode == kDGRAM_RECEIVE) *addrlen = dgram.addr.len; return amount; ErrorExit: macsock_map_error(err); return -1; }