|
Listing 1.4 Level 2 and Level 1 Decoding
int L2_Decode( uchar *dst, /* Decoded name target buffer. */
uchar *src, /* Encoded name source buffer. */
int srcpos, /* Start position of name. */
int srcmax ) /* Size of source buffer. */
{
int len;
int pos;
int next;
/* Be safe. */
dst[0] = '\0';
/* Get encoded string length (doesn't include root label). */
len = strlen( (char *)&(src[srcpos]) );
/* If length is zero, return the empty string. */
if( 0 == len )
return( 0 );
/* Make sure name does not exceed source buffer length. */
if( len >= (srcmax - srcpos) )
return( -1 );
/* Copy source to destination skipping the first label length byte
* (but including the terminating nul label length).
*/
(void)memcpy( dst, &(src[srcpos+1]), len );
/* Find remaining label length bytes and convert them to dots. */
for( pos = src[srcpos]; /* Read the first label length. */
'\0' != (next = dst[pos]); /* While label length is > 0... */
pos += next + 1 ) /* Move one byte beyond label. */
{
dst[pos] = '.';
}
return( --len ); /* Return string length. */
} /* L2_Decode */
int L1_Decode( uchar *name, /* Target. Minimum 16 bytes. */
uchar *src, /* Message buffer. */
int srcpos, /* Start position of name. */
int srcmax ) /* Size of source buffer. */
{
int i;
int suffix;
uchar *p = &src[srcpos];
/* Make sure we have 32 bytes worth of message to read. */
if( (srcmax - srcpos) < 32 )
{
name[0] = '\0';
return( -1 );
}
/* Convert each source pair to their original octet value. */
for( i = 0; i < 32; i++ )
name[i/2] = ( (( (int)(p[i]) - 'A' ) << 4)
+ ( (int)(p[++i]) - 'A' ) );
/* Copy out suffix byte and replace with nul terminator. */
suffix = name[15];
name[15] = '\0';
/* Trim off trailing spaces, if any. */
for( i = 14; (i >= 0) && (' ' == name[i]); i-- )
name[i] = '\0';
return( suffix ); /* Return the suffix value as an int. */
} /* L1_Decode */
$Revision: 1.15 $
$Date: 2003/02/18 21:43:58 $
|
Copyright © 1999-2003 Christopher R. Hertel
Released under the terms of the
LGPL
|
|