//we'd better send the right domain and id int send_tc_to_client(mbuf_type *mbuf) { uchar *itor = mbuf->buf; dnsheader *hdr = (dnsheader *) itor; qdns *qd = NULL; if (mbuf->td == NULL) return -1; hdr->id = mbuf->id; hdr->flags = 0; hdr->flags = SET_QR_R(hdr->flags); hdr->flags = SET_RA(hdr->flags); hdr->flags = SET_TC(hdr->flags); hdr->flags = htons(hdr->flags); hdr->qdcount = htons(1); hdr->ancount = hdr->nscount = hdr->arcount = htons(0); itor += sizeof(dnsheader); memcpy(itor, mbuf->td, mbuf->dlen); itor = itor + mbuf->dlen; qd = (qdns *) itor; qd->type = htons(mbuf->qtype); qd->dclass = htons(CLASS_IN); itor += sizeof(qdns); mbuf->buflen = itor - mbuf->buf; udp_write_info(mbuf, 0); return 0; }
//we'd better send the right domain and id int send_tc_to_client(uchar *td,struct sockinfo *si,ushort cid) { uchar buffer[255] = {0},*itor = buffer; dnsheader *hdr = (dnsheader*)itor; qdns *qd = NULL; int dlen = -1; if(td == NULL || si == NULL) return -1; hdr->id = cid; hdr->flags = 0; hdr->flags = SET_QR_R(hdr->flags); hdr->flags = SET_RA(hdr->flags); hdr->flags = SET_TC(hdr->flags); hdr->flags = htons(hdr->flags); hdr->qdcount = htons(1); hdr->ancount = hdr->nscount = hdr->arcount = htons(0); itor += sizeof(dnsheader); dlen = strlen(td + 1); memcpy(itor,td + 1,dlen + 1); itor = itor + dlen + 1; qd = (qdns*)itor; qd->type = htons(td[0]); qd->dclass = htons(CLASS_IN); itor += sizeof(qdns); si->buf = buffer; si->buflen = itor - buffer; udp_write_info(si,0); return 0; }
uchar *fill_header_in_msg(struct setheader *sh) { uchar llen = 0; uchar *itor = sh->itor; dnsheader *hdr = (dnsheader*)(sh->itor); qdns *qd; int i,dlen; hdr->id = sh->id; hdr->flags = 0; hdr->flags = SET_QR_R(hdr->flags); hdr->flags = SET_RA(hdr->flags); //hdr->flags = SET_ERROR(hdr->flags,mf->ed); hdr->flags = htons(hdr->flags); hdr->qdcount = htons(1); hdr->ancount = htons(sh->an); hdr->nscount = htons(sh->ns); hdr->arcount = htons(0); itor += sizeof(dnsheader); dlen = strlen(sh->od) + 1; memcpy(itor,sh->od,dlen); itor = itor + dlen; qd = (qdns*)itor; qd->type = htons(sh->type); qd->dclass = htons(CLASS_IN); itor += sizeof(qdns); return itor; }
uchar * fill_header_in_msg(struct setheader * sh) { uchar *itor = sh->itor; dnsheader *hdr = (dnsheader *) (sh->itor); qdns *qd; hdr->flags = 0; hdr->flags = SET_QR_R(hdr->flags); hdr->flags = SET_RA(hdr->flags); hdr->flags = DNS_GET16(hdr->flags); hdr->ancount = DNS_GET16(sh->an); hdr->nscount = DNS_GET16(sh->ns); hdr->arcount = 0; //DNS_GET16(0); itor += sizeof(dnsheader); itor = itor + sh->dlen; qd = (qdns *) itor; qd->type = DNS_GET16(sh->type); qd->dclass = DNS_GET16(CLASS_IN); itor += sizeof(qdns); return itor; }
zysst() { IATYPE whence, temp; FILEPOS offset; register struct fcblk *fcb = WA (struct fcblk *); register struct ioblk *iob = MK_MP(fcb->iob, struct ioblk *); register struct icblk *icp; /* ensure iob is open, fail if unsuccessful */ if ( !(iob->flg1 & IO_OPN) ) return EXIT_3; #if PIPES /* not allowed to do a set of a pipe */ if ( iob->flg2 & IO_PIP ) return EXIT_4; #endif /* PIPES */ /* whence may come in either integer or string form */ icp = WC( struct icblk * ); if ( !getint(icp,&whence) ) return EXIT_1; #if SETREAL /* offset comes in as a real in RA */ offset = RA(FILEPOS); #else /* offset may come in either integer or string form */ icp = WB( struct icblk * ); if ( !getint(icp,&temp) ) { struct scblk *scp; scp = (struct scblk *)icp; if (!checkstr(scp) || scp->len != 1) return EXIT_1; temp = whence; switch (uppercase(scp->str[0])) { case 'P': whence = 0; break; case 'H': temp = (whence << 15) + ((int)doset(iob,0,1) & 0x7FFFL); whence = 0; break; case 'R': whence = 1; break; case 'E': whence = 2; break; case 'C': if ( fcb->mode == 0 && temp > 0 && temp <= (word)maxsize ) { fcb->rsz = temp; temp = 0; whence = 1; /* return current position */ break; } else { if (temp < 0 || temp > (word)maxsize) return EXIT_2; else return EXIT_1; } default: return EXIT_1; /* Unrecognised control */ } } offset = (FILEPOS)temp; #endif /* finally, set the file position */ offset = doset( iob, offset, (int)whence ); /* test for error. 01.02 */ if ( offset < (FILEPOS)0 ) return EXIT_5; #if SETREAL /* return resulting position in RA. 01.07 */ SET_RA( offset ); #else /* return resulting position in IA. 01.02 */ SET_IA( (IATYPE)offset ); #endif /* normal return */ return NORMAL_RETURN; }