Beispiel #1
0
//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;
}
Beispiel #2
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;
}
Beispiel #3
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}