|
Listing 1.8 Name Service Resource Records
NS_Rrec.h
/* Label String Pointer. */
#define LSP 0xC00C /* Pointer to offset 12 */
/* Resource Record Type. */
#define RRTYPE_A 0x0001 /* IP Addr RR (unused) */
#define RRTYPE_NS 0x0002 /* Name Server (unused) */
#define RRTYPE_NULL 0x000A /* NULL RR (unused) */
#define RRTYPE_NB 0x0020 /* NetBIOS */
#define RRTYPE_NBSTAT 0x0021 /* NB Status Response */
/* Resource Record Class. */
#define RRCLASS_IN 0x0001 /* Internet Class */
NS_Rrec.c
#include <string.h> /* For memcpy() */
#include <netinet/in.h> /* htons(), ntohs(), etc. */
#include "NS_Rrec.h"
int Put_RRec_Name( uchar *rrec,
const uchar *name,
const uchar pad,
const uchar sfx,
const uchar *scope,
const ushort rrtype )
/* ---------------------------------------------------- **
* Create and store the fully qualified NBT name in the
* destination buffer. Also store the RR_TYPE and
* RR_CLASS values.
* Return the number of bytes written.
* ---------------------------------------------------- **
*/
{
int len;
ushort tmp;
ushort rrclass_in;
/* Validate the rrtype.
* Note that we exclude the A, NS, and NULL RRTYPEs
* as these are never used.
*/
if( (RRTYPE_NB != rrtype)
&& (RRTYPE_NBSTAT != rrtype ) )
return( -1 );
len = L2_Encode( rrec, name, pad, sfx, scope );
if( len < 0 )
return( len );
tmp = htons( rrtype );
(void)memcpy( &(rrec[len]), &tmp, 2 );
len += 2;
rrclass_in = htons( RRCLASS_IN );
(void)memcpy( &(rrec[len]), &rrclass_in, 2 );
return( len + 2 );
} /* Put_RRec_Name */
int Put_RRec_LSP( uchar *rrec, const ushort rrtype )
/* ---------------------------------------------------- **
* Write a Label String Pointer (LSP) instead of an NBT
* name. RR_TYPE and RR_CLASS are also written.
* Return the number of bytes written (always 6).
* ---------------------------------------------------- **
*/
{
ushort tmp;
ushort lsp;
ushort rrclass_in;
lsp = htons( 0xC00C );
(void)memcpy( rrec, &lsp, 2 );
tmp = htons( rrtype );
(void)memcpy( &(rrec[2]), &tmp, 2 );
rrclass_in = htons( RRCLASS_IN );
(void)memcpy( &(rrec[4]), &rrclass_in, 2 );
return( 6 );
} /* Put_RRec_LSP */
int Put_RRec_TTL( uchar *rrec, int offset, ulong ttl )
/* ---------------------------------------------------- **
* Write the TTL value at rrec[offset].
*
* By this point it should be obvious that functions or
* macros for transferring long and short integers to
* and from packet buffers would be a good idea.
* ---------------------------------------------------- **
*/
{
ttl = htonl( ttl );
(void)memcpy( &(rrec[offset]), &ttl, 4 );
return( 4 );
} /* Put_RRec_TTL */
int Is_RRec_LSP( const uchar *rrec )
/* ---------------------------------------------------- **
* Check the Resource Record to see if the name field
* is actually a Label String Pointer.
*
* If the name is not an LSP, the function returns 0.
*
* If the name is a valid LSP, the function returns 12
* (which is the offset into the received packet at
* which the QUERY_NAME can be found).
*
* If the name contains an invalid label length, or
* an invalid LSP, the function will return -1.
* ---------------------------------------------------- **
*/
{
if( 0 == (0xC0 & rrec[0]) )
return( 0 ); /* Not an LSP */
if( (0xC0 == rrec[0]) && (0x0C == rrec[1]) )
return( 12 ); /* Valid LSP */
return( -1 ); /* Bogon */
} /* Is_RRec_LSP */
ushort Get_RR_type( const uchar *rrec, int offset )
/* ---------------------------------------------------- **
* Read the RR_TYPE value. The offset can be
* determined by decoding the NBT name using the
* L2_Decode() function from listing 1.4.
* ---------------------------------------------------- **
*/
{
ushort tmp;
/* Read the two bytes from the packet.
*/
(void)memcpy( &tmp, &(rrec[offset]), 2 );
/* Convert to host byte order and return. */
return( ntohs( tmp ) );
} /* Get_RR_type */
ulong Get_RRec_TTL( const uchar *rrec, int offset )
/* ---------------------------------------------------- **
* Read the TTL value.
* ---------------------------------------------------- **
*/
{
ulong tmp;
(void)memcpy( &tmp, &(rrec[offset]), 4 );
return( ntohl( tmp ) );
} /* Get_RRec_TTL */
$Revision: 1.12 $
$Date: 2003/02/18 21:43:58 $
|
Copyright © 1999-2003 Christopher R. Hertel
Released under the terms of the
LGPL
|
|