home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / comm / amitcp-3.0ß2.lha / AmiTCP / src / amitcp / api / res_mkquery.c < prev    next >
C/C++ Source or Header  |  1994-04-01  |  4KB  |  133 lines

  1. /*
  2.  * Copyright (c) 1985 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #if defined(LIBC_SCCS) && !defined(lint)
  35. static char sccsid[] = "@(#)res_mkquery.c    6.16 (Berkeley) 3/6/91";
  36. #endif /* LIBC_SCCS and not lint */
  37.  
  38. #include <conf.h>
  39.  
  40. #include <sys/param.h>
  41. #include <api/arpa_nameser.h>
  42. #include <api/resolv.h>
  43. #include <kern/amiga_includes.h>
  44. #include <api/amiga_api.h>
  45. #include <kern/amiga_subr.h>     
  46.  
  47. /*
  48.  * Form all types of queries.
  49.  * Returns the size of the result or -1.
  50.  */
  51.  
  52. int res_mkquery(struct SocketBase *libPtr,
  53.         int op,            /* opcode of query */
  54.         const char *dname,    /* domain name */
  55.         int class,
  56.         int type,        /* class and type of query */
  57.         const char *data,    /* resource record data */
  58.         int datalen,        /* length of data */
  59.         const struct rrec *newrr, /* new rr for modify or append */
  60.         char *buf,        /* buffer to put query */
  61.         int buflen)        /* size of buffer */
  62. {
  63.     register HEADER *hp;
  64.     register char *cp;
  65.     register int n;
  66.     char *dnptrs[10], **dpp, **lastdnptr;
  67.  
  68. #ifdef RES_DEBUG
  69.            printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type);
  70. #endif /* RES_DEBUG */
  71.     /*
  72.      * Initialize header fields.
  73.      */
  74.     if ((buf == NULL) || (buflen < sizeof(HEADER)))
  75.         return(-1);
  76.     bzero(buf, sizeof(HEADER));
  77.     hp = (HEADER *) buf;
  78.     hp->id = htons(++_res.id);
  79.     hp->opcode = op;
  80.     hp->pr = (_res.options & RES_PRIMARY) != 0;
  81.     hp->rd = (_res.options & RES_RECURSE) != 0;
  82.     hp->rcode = NOERROR;
  83.     cp = buf + sizeof(HEADER);
  84.     buflen -= sizeof(HEADER);
  85.     dpp = dnptrs;
  86.     *dpp++ = buf;
  87.     *dpp++ = NULL;
  88.     lastdnptr = dnptrs + sizeof(dnptrs)/sizeof(dnptrs[0]);
  89.     /*
  90.      * perform opcode specific processing
  91.      */
  92.     switch (op) {
  93.     case QUERY:
  94.         if ((buflen -= QFIXEDSZ) < 0)
  95.             return(-1);
  96.         if ((n = dn_comp((u_char *)dname, (u_char *)cp, buflen,
  97.             (u_char **)dnptrs, (u_char **)lastdnptr)) < 0)
  98.             return (-1);
  99.         cp += n;
  100.         buflen -= n;
  101.         __putshort(type, (u_char *)cp);
  102.         cp += sizeof(u_short);
  103.         __putshort(class, (u_char *)cp);
  104.         cp += sizeof(u_short);
  105.         hp->qdcount = htons(1);
  106.         if (op == QUERY || data == NULL)
  107.             break;
  108.         /*
  109.          * Make an additional record for completion domain.
  110.          */
  111.         buflen -= RRFIXEDSZ;
  112.         if ((n = dn_comp((u_char *)data, (u_char *)cp, buflen,
  113.             (u_char **)dnptrs, (u_char **)lastdnptr)) < 0)
  114.             return (-1);
  115.         cp += n;
  116.         buflen -= n;
  117.         __putshort(T_NULL, (u_char *)cp);
  118.         cp += sizeof(u_short);
  119.         __putshort(class, (u_char *)cp);
  120.         cp += sizeof(u_short);
  121.         __putlong(0, (u_char *)cp);
  122.         cp += sizeof(u_long);
  123.         __putshort(0, (u_char *)cp);
  124.         cp += sizeof(u_short);
  125.         hp->arcount = htons(1);
  126.         break;
  127.     default:
  128.         return (-1); /* is call initially comes from gethostname()
  129.                 no other opcodes are used */
  130.     }
  131.     return (cp - buf);
  132. }
  133.