int udpWrite(u_int ud, const void* buf, long len) { NBuf* pNBuf; IPHdr* ipHdr; UDPHdr* udpHdr; long rtn = 0; long copied; u_int mtu; UDPDEBUG(("udpWrite()\n")); if (!(udps[ud].flags & FUDP_OPEN)) return -1; mtu = ipMTU(ntohl(udps[ud].theirAddr.s_addr)); if (!mtu) { UDPDEBUG(("no route to host\n")); return -1; } while (len) { pNBuf = NULL; #if ONETASK_SUPPORT > 0 // We can't do a loop forever in a onetask OS nGET(pNBuf); // No more nBuf buffers available, should return what we have copied so far if (!pNBuf) return rtn; #else // BUSY WAITING! (not nice) do { nGET(pNBuf); } while (pNBuf == NULL); #endif // Reserve room for headers pNBuf->len = pNBuf->chainLen = sizeof(IPHdr) + sizeof(UDPHdr); // Add payload copied = nAppend(pNBuf, (const char *)&((unsigned char *)buf)[rtn], MIN(mtu - sizeof(IPHdr) - sizeof(UDPHdr), len)); if (copied && pNBuf) { len -= copied; rtn += copied; // Setup IP header and prepare it so we can compute the UDP checksum // Use the IP header as UDP pseudo header ipHdr = nBUFTOPTR(pNBuf, IPHdr *); memcpy(ipHdr->ip_src.s_addr, (u_char*)&localHost,4); //db change //my change memcpy(ipHdr->ip_dst.s_addr, udps[ud].theirAddr.s_addr, 4);// db change ipHdr->ip_ttl = 0; ipHdr->ip_p = IPPROTO_UDP; ipHdr->ip_sum = htons(copied + sizeof(UDPHdr)); // Build the UDP header udpHdr = (void *)(ipHdr + 1); udpHdr->srcPort = udps[ud].ourPort; udpHdr->dstPort = udps[ud].theirPort; udpHdr->checksum = 0; udpHdr->length = ipHdr->ip_sum; // Compute UDP header checksum udpHdr->checksum = inChkSum(pNBuf, pNBuf->chainLen - 8, 8); // Build IP header // db change ipHdr->ip_hl_v = ((sizeof(IPHdr) >> 2) & 0x0f) | (4 << 4); // ipHdr->ip_hl = sizeof(IPHdr) >> 2; ipHdr->ip_tos = udps[ud].tos; ipHdr->ip_len = copied + sizeof(IPHdr) + sizeof(UDPHdr); ipHdr->ip_id = IPNEWID(); ipHdr->ip_off = 0; ipHdr->ip_ttl = UDPTTL; ipHdr->ip_sum = 0; ipHdr->ip_sum = inChkSum(pNBuf, sizeof(IPHdr), 0); } else {
void ArrayOps::evaluate(SymTab & symTab, std::unique_ptr<FuncTab> &funcTab) { auto type = symTab.getValueFor(_id)->type(); if(_op == "append") { if(_test == nullptr) { std::cout << "ArrayOps::evaluate append, no element provided\n"; exit(1); } auto element = _test->evaluate(symTab, funcTab); if( type == TypeDescriptor::NUMBERARRAY ) { if(element->type() == TypeDescriptor::INTEGER) { auto nDesc = dynamic_cast<NumberDescriptor*>(element.get()); auto narray = dynamic_cast<NumberArray*> (symTab.getValueFor(_id).get()); narray->nAppend(nDesc->value.intValue); } else { std::cout << "ArrayOps::append error: members must be of "; std::cout << "the same type\n"; exit(1); } } else if(type == TypeDescriptor::STRINGARRAY) { if(element->type() == TypeDescriptor::STRING) { auto sDesc = dynamic_cast<StringDescriptor*>(element.get()); auto sarray = dynamic_cast<StringArray*> (symTab.getValueFor(_id).get()); sarray->sAppend(sDesc->value); } else { std::cout << "ArrayOps::append error: members must be of "; std::cout << "the same type\n"; exit(1); } } else if (type == TypeDescriptor::NULLARRAY) { if(element->type() == TypeDescriptor::INTEGER) { auto nDesc = dynamic_cast<NumberDescriptor*>(element.get()); if(nDesc == nullptr) { std::cout << "ArrayOps::evaluate error: invalid cast"; exit(1); } std::shared_ptr<NumberArray> narray = std::make_shared<NumberArray>(TypeDescriptor::NUMBERARRAY); narray->nAppend(nDesc->value.intValue); symTab.setValueFor(_id, narray); } else if(element->type() == TypeDescriptor::STRING) { auto sDesc = dynamic_cast<StringDescriptor*>(element.get()); if(sDesc == nullptr) { std::cout << "ArrayOps::evaluate error: invalid cast"; exit(1); } std::shared_ptr<StringArray> sarray = std::make_shared<StringArray>(TypeDescriptor::STRINGARRAY); sarray->sAppend(sDesc->value); symTab.setValueFor(_id, sarray); } else { std::cout << "append() is not supported for this type\n"; exit(1); } } else { std::cout << "append() is not supported for this type\n"; exit(1); } } else if (_op == "pop") { if( type == TypeDescriptor::NUMBERARRAY ) { auto narray = dynamic_cast<NumberArray*> (symTab.getValueFor(_id).get()); if(narray != nullptr) { if(_test == nullptr) narray->nPop(); else { auto element = _test->evaluate(symTab, funcTab); narray->nPopIndex(element.get()); } } } else if(type == TypeDescriptor::STRINGARRAY) { auto sarray = dynamic_cast<StringArray*> (symTab.getValueFor(_id).get()); if(sarray != nullptr) { if(_test == nullptr) sarray->sPop(); else { auto element = _test->evaluate(symTab, funcTab); sarray->sPopIndex(element.get()); } } } else { std::cout << "pop is not supported for this type\n"; exit(1); } } }