Annotation of xinu/sys/ip2name.c, revision 1.1.1.1

1.1       root        1: /* ip2name.c - ip2name */
                      2: 
                      3: #include <conf.h>
                      4: #include <kernel.h>
                      5: #include <network.h>
                      6: 
                      7: /*------------------------------------------------------------------------
                      8:  *  ip2name  -  return DARPA Domain name for a host given its IP address
                      9:  *------------------------------------------------------------------------
                     10:  */
                     11: SYSCALL        ip2name(ip, nam)
                     12: IPaddr ip;
                     13: char   *nam;
                     14: {
                     15:        char    tmpstr[20];             /* temporary string buffer      */
                     16:        char    *buf;                   /* buffer to hold domain query  */
                     17:        int     dg, i;
                     18:        register char   *p;
                     19:        register struct dn_mesg *dnptr;
                     20: 
                     21:        dnptr = (struct dn_mesg *) (buf = (char *) getmem(DN_MLEN));
                     22:        *nam = NULLCH;
                     23:        dnptr->dn_id = 0;
                     24:        dnptr->dn_opparm = hs2net(DN_RD);
                     25:        dnptr->dn_qcount = hs2net(1);
                     26:        dnptr->dn_acount = dnptr->dn_ncount = dnptr->dn_dcount = 0;
                     27:        p = dnptr->dn_qaaa;
                     28: 
                     29:        /* Fill in question with  ip[3].ip[2].ip[1].ip[0].in-addr.arpa  */
                     30: 
                     31:        for (i=3 ; i >= 0 ; i--) {
                     32:                sprintf(tmpstr, "%d", ip[i] & LOWBYTE);
                     33:                dn_cat(p, tmpstr);
                     34:        }
                     35:        dn_cat(p, "in-addr");
                     36:        dn_cat(p, "arpa");
                     37:        *p++ = NULLCH;  /* terminate name */
                     38: 
                     39:        /* Add query type and query class fields to name */
                     40: 
                     41:        ( (struct dn_qsuf *)p )->dn_type = hs2net(DN_QTPR);
                     42:        ( (struct dn_qsuf *)p )->dn_clas = hs2net(DN_QCIN);
                     43:        p += sizeof(struct dn_qsuf);
                     44: 
                     45:        /* Broadcast query */
                     46: 
                     47:        dg = open(INTERNET, DSERVER, ANYLPORT);
                     48:        control(dg, DG_SETMODE, DG_DMODE | DG_TMODE);
                     49:        write (dg, buf, p - buf);
                     50:        if ( (i = read(dg, buf, DN_MLEN)) == SYSERR || i == TIMEOUT)
                     51:                panic("No response from name server");
                     52:        close(dg);
                     53:        if (net2hs(dnptr->dn_opparm) & DN_RESP ||
                     54:            net2hs(dnptr->dn_acount) <= 0) {
                     55:                freemem(buf, DN_MLEN);
                     56:                return(SYSERR);
                     57:        }
                     58: 
                     59:        /* In answer, skip name and remainder of resource record header */
                     60: 
                     61:        while (*p != NULLCH)
                     62:                if (*p & DN_CMPRS)      /* compressed section of name   */
                     63:                        *++p = NULLCH;
                     64:                else
                     65:                        p += *p + 1;
                     66:        p += DN_RLEN + 1;
                     67: 
                     68:        /* Copy name to user */
                     69: 
                     70:        *nam = NULLCH;
                     71: 
                     72:        while (*p != NULLCH) {
                     73:                if (*p & DN_CMPRS)
                     74:                        p = buf + (net2hs(*(int *)p) & DN_CPTR);
                     75:                else {
                     76:                        strncat(nam, p+1, *p);
                     77:                        strcat(nam, ".");
                     78:                        p += *p + 1;
                     79:                }
                     80:        }
                     81:        if (strlen(nam))        /* remove trailing dot */
                     82:                nam[strlen(nam) - 1] = NULLCH;
                     83:        freemem(buf, DN_MLEN);
                     84:        return(OK);
                     85: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.