$NetBSD$

--- radproto.cxx.orig	Tue Aug 10 01:32:11 2004
+++ radproto.cxx	Wed Mar 16 12:38:12 2005
@@ -238,16 +238,20 @@ unsigned GetRadiusInteger(
 } // anonymous namespace
 
 
-RadiusAttr::RadiusAttr() : m_type(0), m_length(0)
+RadiusAttr::RadiusAttr()
 {
+	s.m_type = 0;
+	s.m_length = 0;
 }
 
 RadiusAttr::RadiusAttr( 
 	unsigned char attrType, /// type of the attribute
 	const void* attrValue, /// actual attribute value data
 	PINDEX valueLength /// length for the attribute value
-	) : m_type(attrType), m_length(FixedHeaderLength)
+	)
 {
+	s.m_type = attrType;
+	s.m_length = FixedHeaderLength;
 	if (valueLength > 0)
 		PAssertNULL(attrValue);
 
@@ -259,9 +263,9 @@ RadiusAttr::RadiusAttr( 
 		valueLength = MaxValueLength;
 
 	if (valueLength > 0) {
-		m_length = m_length + (unsigned char)valueLength;
+		s.m_length = s.m_length + (unsigned char)valueLength;
 		if (attrValue != NULL)
-			memcpy(m_value, attrValue, valueLength);
+			memcpy(s.m_value, attrValue, valueLength);
 	}
 }
 
@@ -270,10 +274,13 @@ RadiusAttr::RadiusAttr(
 	PINDEX valueLength, /// data length (bytes)
 	int vendorId, /// 32 bit vendor identifier
 	unsigned char vendorType /// vendor-specific attribute type
-	) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength),
-		m_vendorType(vendorType), m_vendorLength(2)
+	)
 {
-	SetRadiusInteger(m_vendorId, vendorId);
+	s.m_type = VendorSpecific;
+	s.m_length = VsaRfc2865FixedHeaderLength;
+	s.s.m_vendorType = vendorType;
+	s.s.m_vendorLength = 2;
+	SetRadiusInteger(s.s.m_vendorId, vendorId);
 	
 	if (valueLength > 0)
 		PAssertNULL(attrValue);
@@ -286,18 +293,20 @@ RadiusAttr::RadiusAttr(
 		valueLength = VsaMaxRfc2865ValueLength;
 	
 	if (valueLength > 0) {
-		m_length = m_length + (unsigned char)valueLength;
-		m_vendorLength = m_vendorLength + (unsigned char)valueLength;
+		s.m_length = s.m_length + (unsigned char)valueLength;
+		s.s.m_vendorLength = s.s.m_vendorLength + (unsigned char)valueLength;
 		if (attrValue != NULL)
-			memcpy(m_vendorValue, attrValue, valueLength);
+			memcpy(s.s.m_vendorValue, attrValue, valueLength);
 	}
 }
 
 RadiusAttr::RadiusAttr( 
 	unsigned char attrType, /// Attribute Type (see #enum AttrTypes#)
 	const PString& stringValue /// string to be stored in the attribute Value data
-	) : m_type(attrType), m_length(FixedHeaderLength)
+	) 
 {
+	s.m_type = attrType;
+	s.m_length = FixedHeaderLength;
 	if (attrType == VendorSpecific)
 		PAssertAlways(PInvalidParameter);
 
@@ -307,46 +316,53 @@ RadiusAttr::RadiusAttr( 
 		attrLength = MaxValueLength;
 
 	if (attrLength > 0) {
-		m_length = m_length + (unsigned char)attrLength;
-		memcpy(m_value, (const char*)stringValue, attrLength);
+		s.m_length = s.m_length + (unsigned char)attrLength;
+		memcpy(s.m_value, (const char*)stringValue, attrLength);
 	}
 }
 
 RadiusAttr::RadiusAttr( 
 	unsigned char attrType, /// Attribute Type (see #enum AttrTypes#)
 	int intValue /// 32 bit integer to be stored in the attribute Value
-	) : m_type(attrType), m_length(FixedHeaderLength + 4)
+	)
 {
+	s.m_type = attrType;
+	s.m_length = FixedHeaderLength + 4;
 	if (attrType == VendorSpecific)
 		PAssertAlways(PInvalidParameter);
 
-	SetRadiusInteger(m_value, intValue);
+	SetRadiusInteger(s.m_value, intValue);
 }
 
 RadiusAttr::RadiusAttr( 
 	unsigned char attrType, /// Attribute Type (see #enum AttrTypes#)
 	const PIPSocket::Address& addressValue /// IPv4 address to be stored in the attribute Value
-	) : m_type(attrType), m_length(FixedHeaderLength + 4)
+	)
 {
+	s.m_type = attrType;
+	s.m_length = FixedHeaderLength + 4;
 	if (attrType == VendorSpecific)
 		PAssertAlways(PInvalidParameter);
 
 	const DWORD addr = (DWORD)addressValue;
 	
-	m_value[0] = ((const BYTE*)&addr)[0];
-	m_value[1] = ((const BYTE*)&addr)[1];
-	m_value[2] = ((const BYTE*)&addr)[2];
-	m_value[3] = ((const BYTE*)&addr)[3];
+	s.m_value[0] = ((const BYTE*)&addr)[0];
+	s.m_value[1] = ((const BYTE*)&addr)[1];
+	s.m_value[2] = ((const BYTE*)&addr)[2];
+	s.m_value[3] = ((const BYTE*)&addr)[3];
 }
 
 RadiusAttr::RadiusAttr( 
 	const PString& stringValue, /// string to be stored in the attribute Value
 	int vendorId, /// 32 bit vendor identifier
 	unsigned char vendorType /// vendor-specific attribute type
-	) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength),
-		m_vendorType(vendorType), m_vendorLength(2)
+	)
 {
-	SetRadiusInteger(m_vendorId, vendorId);
+	s.m_type = VendorSpecific;
+	s.m_length = VsaRfc2865FixedHeaderLength;
+	s.s.m_vendorType = vendorType;
+	s.s.m_vendorLength = 2;
+	SetRadiusInteger(s.s.m_vendorId, vendorId);
 	
 	PINDEX vsaLength = stringValue.GetLength();
 
@@ -357,9 +373,9 @@ RadiusAttr::RadiusAttr( 
 		vsaLength = VsaMaxRfc2865ValueLength;
 
 	if (vsaLength > 0) {
-		m_length = m_length + (unsigned char)vsaLength;
-		m_vendorLength = m_vendorLength + (unsigned char)vsaLength;
-		memcpy(m_vendorValue, (const char*)stringValue, vsaLength);
+		s.m_length = s.m_length + (unsigned char)vsaLength;
+		s.s.m_vendorLength = s.s.m_vendorLength + (unsigned char)vsaLength;
+		memcpy(s.s.m_vendorValue, (const char*)stringValue, vsaLength);
 	}
 }
 
@@ -367,71 +383,82 @@ RadiusAttr::RadiusAttr( 
 	int intValue, /// 32 bit integer to be stored in the attribute Value
 	int vendorId, /// 32 bit vendor identifier
 	unsigned char vendorType /// vendor-specific attribute type
-	) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength + 4),
-		m_vendorType(vendorType), m_vendorLength(2 + 4)
+	)
 {
-	SetRadiusInteger(m_vendorId, vendorId);
-	SetRadiusInteger(m_vendorValue, intValue);
+	s.m_type=VendorSpecific;
+	s.m_length=VsaRfc2865FixedHeaderLength + 4;
+	s.s.m_vendorType=vendorType;
+	s.s.m_vendorLength=2 + 4;
+	SetRadiusInteger(s.s.m_vendorId, vendorId);
+	SetRadiusInteger(s.s.m_vendorValue, intValue);
 }
 
 RadiusAttr::RadiusAttr( 
 	const PIPSocket::Address& addressValue, /// IPv4 address to be stored in the attribute Value
 	int vendorId, /// 32 bit vendor identifier
 	unsigned char vendorType /// vendor-specific attribute type
-	) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength + 4),
-		m_vendorType(vendorType), m_vendorLength(2 + 4)
+	)
 {
-	SetRadiusInteger(m_vendorId, vendorId);
+	s.m_type = VendorSpecific;
+	s.m_length = VsaRfc2865FixedHeaderLength + 4;
+	s.s.m_vendorType = vendorType;
+	s.s.m_vendorLength = 2 + 4;
+	SetRadiusInteger(s.s.m_vendorId, vendorId);
 	
 	const DWORD addr = (DWORD)addressValue;
 	
-	m_vendorValue[0] = ((BYTE*)&addr)[0];
-	m_vendorValue[1] = ((BYTE*)&addr)[1];
-	m_vendorValue[2] = ((BYTE*)&addr)[2];
-	m_vendorValue[3] = ((BYTE*)&addr)[3];
+	s.s.m_vendorValue[0] = ((BYTE*)&addr)[0];
+	s.s.m_vendorValue[1] = ((BYTE*)&addr)[1];
+	s.s.m_vendorValue[2] = ((BYTE*)&addr)[2];
+	s.s.m_vendorValue[3] = ((BYTE*)&addr)[3];
 }
 
 RadiusAttr::RadiusAttr(
 	unsigned char type, /// Cisco-specific attribute type
 	bool vsaHack, /// true to not prepend attribute name to its value
 	const PString& stringValue /// string to be stored in the attribute Value
-	) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength),
-		m_vendorType(type), m_vendorLength(2)
+	)
 {
-	SetRadiusInteger(m_vendorId, CiscoVendorId);
+	s.m_type = VendorSpecific;
+	s.m_length = VsaRfc2865FixedHeaderLength;
+	s.s.m_vendorType = type;
+	s.s.m_vendorLength = 2;
+	SetRadiusInteger(s.s.m_vendorId, CiscoVendorId);
 	if (!vsaHack) {
 		int i = 0;
 		while (CiscoAttrNames[i].m_name != NULL)
 			if (CiscoAttrNames[i].m_type == type) {
-				memcpy(m_vendorValue, CiscoAttrNames[i].m_name, CiscoAttrNames[i].m_nameLen);
-				m_length = m_length + (unsigned char)CiscoAttrNames[i].m_nameLen;
-				m_vendorLength = m_vendorLength + (unsigned char)CiscoAttrNames[i].m_nameLen;
-				m_data[m_length++] = '=';
-				m_vendorLength++;
+				memcpy(s.s.m_vendorValue, CiscoAttrNames[i].m_name, CiscoAttrNames[i].m_nameLen);
+				s.m_length = s.m_length + (unsigned char)CiscoAttrNames[i].m_nameLen;
+				s.s.m_vendorLength = s.s.m_vendorLength + (unsigned char)CiscoAttrNames[i].m_nameLen;
+				m_data[s.m_length++] = '=';
+				s.s.m_vendorLength++;
 				break;
 			} else
 				i++;
 	}
 	const PINDEX len = stringValue.GetLength();
-	if (((PINDEX)m_length + len) > MaxLength)
+	if (((PINDEX)s.m_length + len) > MaxLength)
 		return;
 
-	memcpy(m_data + (PINDEX)m_length, (const char*)stringValue, len);
-	m_length = m_length + (unsigned char)len;
-	m_vendorLength = m_vendorLength + (unsigned char)len;
+	memcpy(m_data + (PINDEX)s.m_length, (const char*)stringValue, len);
+	s.m_length = s.m_length + (unsigned char)len;
+	s.s.m_vendorLength = s.s.m_vendorLength + (unsigned char)len;
 }
 
 RadiusAttr::RadiusAttr(
 	const void* rawData, /// buffer with the attribute raw data
 	PINDEX rawLength /// length (bytes) of the buffer
-	) : m_type(0), m_length(0)
+	)
 {
+	s.m_type = 0;
+	s.m_length = 0;
 	Read(rawData, rawLength);
 }
 
 int RadiusAttr::GetVsaVendorId() const 
 {
-	return GetRadiusInteger(m_vendorId);
+	return GetRadiusInteger(s.s.m_vendorId);
 }
 
 bool RadiusAttr::Write(
@@ -446,7 +473,7 @@ bool RadiusAttr::Write(
 	if (offset == P_MAX_INDEX)
 		offset = buffer.GetSize();
 		
-	const PINDEX len = m_length;
+	const PINDEX len = s.m_length;
 	memcpy(buffer.GetPointer(offset + len) + offset, m_data, len);
 	written = len;
 
@@ -455,7 +482,7 @@ bool RadiusAttr::Write(
 
 bool RadiusAttr::Read(const void* rawData, PINDEX rawLength)
 {
-	m_type = m_length = 0;
+	s.m_type = s.m_length = 0;
 
 #ifdef _DEBUG	
 	PAssertNULL(rawData);
@@ -483,9 +510,9 @@ void RadiusAttr::PrintOn(
 
 	if (!IsValid()) {
 		strm << "(Invalid) {\n";
-		if (m_length > 0) {
+		if (s.m_length > 0) {
 			const _Ios_Fmtflags flags = strm.flags();
-			const PBYTEArray value((const BYTE*)m_data, m_length, FALSE);
+			const PBYTEArray value((const BYTE*)m_data, s.m_length, FALSE);
 
 			strm << hex << setfill('0') << resetiosflags(ios::floatfield)
 				<< setprecision(indent) << setw(16);
@@ -508,12 +535,12 @@ void RadiusAttr::PrintOn(
 	strm << "{\n";
 		
 #if PTRACING
-	strm << setw(indent+7) << "type = " << (unsigned)m_type
-		<< " (" << PMAP_ATTR_TYPE_TO_NAME(m_type) << ")\n";
+	strm << setw(indent+7) << "type = " << (unsigned)s.m_type
+		<< " (" << PMAP_ATTR_TYPE_TO_NAME(s.m_type) << ")\n";
 #else
-	strm << setw(indent+7) << "type = " << (unsigned)m_type << '\n';
+	strm << setw(indent+7) << "type = " << (unsigned)s.m_type << '\n';
 #endif
-	const PINDEX totalLen = m_length;
+	const PINDEX totalLen = s.m_length;
 	
 	strm << setw(indent+9) << "length = " << totalLen << " octets\n";
 	
@@ -521,7 +548,7 @@ void RadiusAttr::PrintOn(
 		const _Ios_Fmtflags flags = strm.flags();
 		const PINDEX valueLen = (totalLen <= FixedHeaderLength) 
 			? 0 : (totalLen - FixedHeaderLength);
-		const PBYTEArray value((const BYTE*)m_value, valueLen, FALSE);
+		const PBYTEArray value((const BYTE*)s.m_value, valueLen, FALSE);
 
 		strm << setw(indent+8) << "value = " << value.GetSize() << " octets {\n";
 		strm << hex << setfill('0') << resetiosflags(ios::floatfield)
@@ -552,9 +579,9 @@ void RadiusAttr::PrintOn(
 			valueLen -= 2;
 			headerLen += 2;
 			strm << setw(indent+13) << "vendorType = " 
-				<< (unsigned)m_vendorType << '\n';
+				<< (unsigned)s.s.m_vendorType << '\n';
 			strm << setw(indent+15) << "vendorLength = " 
-				<< (unsigned)m_vendorLength << '\n';
+				<< (unsigned)s.s.m_vendorLength << '\n';
 		}
 		
 		const PBYTEArray value((const BYTE*)(m_data + headerLen), valueLen, FALSE);
@@ -582,13 +609,13 @@ void RadiusAttr::PrintOn(
 
 PINDEX RadiusAttr::GetVsaValueLength() const
 {
-	PINDEX len = m_length;
+	PINDEX len = s.m_length;
 	len = (len <= VsaRfc2865FixedHeaderLength) 
 		? 0 : (len - VsaRfc2865FixedHeaderLength);
 	
 	PINDEX len2 = 0;
 	if (len > 0) {
-		len2 = m_vendorLength;
+		len2 = s.s.m_vendorLength;
 		len2 = (len2 <= 2) ? 0 : (len2 - 2);
 	}
 	if (len2 < len)
@@ -626,7 +653,7 @@ bool RadiusAttr::GetVsaValue(PBYTEArray&
 		offset = buffer.GetSize();
 		
 	if (len > 0)
-		memcpy(buffer.GetPointer(len + offset) + offset, m_vendorValue, len);
+		memcpy(buffer.GetPointer(len + offset) + offset, s.s.m_vendorValue, len);
 
 	return true;
 }
@@ -636,8 +663,8 @@ PString RadiusAttr::AsString() const
 	if (!IsValid())
 		return PString();
 
-	const PINDEX len = m_length;
-	const PINDEX headerLen = (m_type == VendorSpecific) 
+	const PINDEX len = s.m_length;
+	const PINDEX headerLen = (s.m_type == VendorSpecific) 
 			? VsaFixedHeaderLength : FixedHeaderLength;
 
 	if (len <= headerLen)
@@ -648,52 +675,52 @@ PString RadiusAttr::AsString() const
 
 int RadiusAttr::AsInteger() const
 {
-	if (m_length < (FixedHeaderLength+4) || m_type == VendorSpecific)
+	if (s.m_length < (FixedHeaderLength+4) || s.m_type == VendorSpecific)
 		return 0;
 	
-	return GetRadiusInteger(m_value);
+	return GetRadiusInteger(s.m_value);
 }
 
 PIPSocket::Address RadiusAttr::AsAddress() const
 {
-	if (m_length < (FixedHeaderLength+4) || m_type == VendorSpecific)
+	if (s.m_length < (FixedHeaderLength+4) || s.m_type == VendorSpecific)
 		return 0;
 
 	DWORD addr = 0;
-	
-	((BYTE*)&addr)[0] = m_value[0];
-	((BYTE*)&addr)[1] = m_value[1];
-	((BYTE*)&addr)[2] = m_value[2];
-	((BYTE*)&addr)[3] = m_value[3];
+
+	((BYTE*)&addr)[0] = s.m_value[0];
+	((BYTE*)&addr)[1] = s.m_value[1];
+	((BYTE*)&addr)[2] = s.m_value[2];
+	((BYTE*)&addr)[3] = s.m_value[3];
 	
 	return addr;
 }
 
 PString RadiusAttr::AsVsaString() const
 {
-	if (!IsValid() || m_type != VendorSpecific)
+	if (!IsValid() || s.m_type != VendorSpecific)
 		return PString();
 		
-	const PINDEX len = m_length;
+	const PINDEX len = s.m_length;
 
 	if (len <= VsaRfc2865FixedHeaderLength)
 		return PString();
 	else
-		return PString((const char*)m_vendorValue, len - VsaRfc2865FixedHeaderLength);
+		return PString((const char*)s.s.m_vendorValue, len - VsaRfc2865FixedHeaderLength);
 }
 
 PString RadiusAttr::AsCiscoString() const
 {
-	if (!IsValid() || m_type != VendorSpecific 
-			|| GetRadiusInteger(m_vendorId) != CiscoVendorId)
+	if (!IsValid() || s.m_type != VendorSpecific 
+			|| GetRadiusInteger(s.s.m_vendorId) != CiscoVendorId)
 		return PString();
 		
-	const PINDEX len = m_length;
+	const PINDEX len = s.m_length;
 	PINDEX offset = VsaRfc2865FixedHeaderLength;
 
 	int i = 0;
 	while (CiscoAttrNames[i].m_name != NULL)
-		if (CiscoAttrNames[i].m_type == m_vendorType) {
+		if (CiscoAttrNames[i].m_type == s.s.m_vendorType) {
 			if (CiscoAttrNames[i].m_nameLen < (size_t)(len - offset))
 				if (memcmp(m_data + offset, CiscoAttrNames[i].m_name,
 						CiscoAttrNames[i].m_nameLen) == 0
@@ -711,30 +738,32 @@ PString RadiusAttr::AsCiscoString() cons
 
 int RadiusAttr::AsVsaInteger() const
 {
-	if (m_length < (VsaRfc2865FixedHeaderLength+4) || m_type != VendorSpecific)
+	if (s.m_length < (VsaRfc2865FixedHeaderLength+4) || s.m_type != VendorSpecific)
 		return 0;
 		
-	return GetRadiusInteger(m_vendorValue);
+	return GetRadiusInteger(s.s.m_vendorValue);
 }
 
 PIPSocket::Address RadiusAttr::AsVsaAddress() const
 {
-	if (m_length < (VsaRfc2865FixedHeaderLength+4) || m_type != VendorSpecific)
+	if (s.m_length < (VsaRfc2865FixedHeaderLength+4) || s.m_type != VendorSpecific)
 		return 0;
 	
 	DWORD addr = 0;
 	
-	((BYTE*)&addr)[0] = m_vendorValue[0];
-	((BYTE*)&addr)[1] = m_vendorValue[1];
-	((BYTE*)&addr)[2] = m_vendorValue[2];
-	((BYTE*)&addr)[3] = m_vendorValue[3];
+	((BYTE*)&addr)[0] = s.s.m_vendorValue[0];
+	((BYTE*)&addr)[1] = s.s.m_vendorValue[1];
+	((BYTE*)&addr)[2] = s.s.m_vendorValue[2];
+	((BYTE*)&addr)[3] = s.s.m_vendorValue[3];
 	
 	return addr;
 }
 
 
-RadiusPDU::RadiusPDU() : m_code(Invalid), m_id(0)
+RadiusPDU::RadiusPDU()
 {
+	s.m_code = 0;
+	s.m_id = 0;
 	SetLength(FixedHeaderLength);
 }
 
@@ -748,8 +777,10 @@ RadiusPDU::RadiusPDU( 
 RadiusPDU::RadiusPDU( 
 	unsigned char packetCode, /// code - see #Codes enum#
 	unsigned char packetId /// packet id (sequence number)
-	) : m_code(packetCode), m_id(packetId)
+	)
 {
+	s.m_code = packetCode;
+	s.m_id = packetId;
 	SetLength(FixedHeaderLength);
 }
 
@@ -759,7 +790,7 @@ RadiusPDU::RadiusPDU(
 	)
 {
 	if (!Read(rawData, rawLength)) {
-		m_code = m_id = Invalid;
+		s.m_code = s.m_id = Invalid;
 		SetLength(FixedHeaderLength);
 	}
 }
@@ -773,16 +804,16 @@ void RadiusPDU::PrintOn( 
 	strm << ((!IsValid()) ? "(Invalid) {\n" : "{\n");
 	
 #if PTRACING
-	strm << setw(indent+7) << "code = " << (unsigned)m_code
-		<< " (" << PMAP_CODE_TO_NAME(m_code) << ")\n";
+	strm << setw(indent+7) << "code = " << (unsigned)s.m_code
+		<< " (" << PMAP_CODE_TO_NAME(s.m_code) << ")\n";
 #else
-	strm << setw(indent+7) << "code = " << (unsigned)m_code << '\n';
+	strm << setw(indent+7) << "code = " << (unsigned)s.m_code << '\n';
 #endif
-	strm << setw(indent+5) << "id = " << (unsigned)m_id << '\n';
+	strm << setw(indent+5) << "id = " << (unsigned)s.m_id << '\n';
 	strm << setw(indent+9) << "length = " << GetLength() << " octets\n";
 
 	const _Ios_Fmtflags flags = strm.flags();
-	const PBYTEArray value((const BYTE*)m_authenticator, AuthenticatorLength, FALSE);
+	const PBYTEArray value((const BYTE*)s.m_authenticator, AuthenticatorLength, FALSE);
 
 	strm << setw(indent+28) << "authenticator = 16 octets {\n";
 	strm << hex << setfill('0') << resetiosflags(ios::floatfield)
@@ -816,7 +847,7 @@ void RadiusPDU::PrintOn( 
 
 bool RadiusPDU::IsValid() const
 {
-	if (m_code == Invalid)
+	if (s.m_code == Invalid)
 		return false;
 
 	const PINDEX len = GetLength();
@@ -842,7 +873,7 @@ void RadiusPDU::GetAuthenticator(PBYTEAr
 	if (offset == P_MAX_INDEX)
 		offset = vector.GetSize();
 	memcpy(vector.GetPointer(offset + AuthenticatorLength) + offset,
-		m_authenticator, AuthenticatorLength
+		s.m_authenticator, AuthenticatorLength
 		);
 }
 
@@ -855,7 +886,7 @@ bool RadiusPDU::SetAuthenticator(const P
 	len -= offset;
 
 	if (len > 0)
-		memcpy(m_authenticator, ((const BYTE*)vector)+offset,
+		memcpy(s.m_authenticator, ((const BYTE*)vector)+offset,
 			(len < AuthenticatorLength) ? len : AuthenticatorLength
 			);
 
@@ -870,32 +901,32 @@ bool RadiusPDU::SetAuthenticator(const v
 	if (data == NULL)
 		return false;
 
-	memcpy(m_authenticator, data, AuthenticatorLength);
+	memcpy(s.m_authenticator, data, AuthenticatorLength);
 	return true;
 }
 
 void RadiusPDU::SetAuthenticator(PRandom& random)
 {
 	DWORD r = (DWORD)random;
-	m_authenticator[0] = ((const BYTE*)&r)[0];
-	m_authenticator[1] = ((const BYTE*)&r)[1];
-	m_authenticator[2] = ((const BYTE*)&r)[2];
-	m_authenticator[3] = ((const BYTE*)&r)[3];
+	s.m_authenticator[0] = ((const BYTE*)&r)[0];
+	s.m_authenticator[1] = ((const BYTE*)&r)[1];
+	s.m_authenticator[2] = ((const BYTE*)&r)[2];
+	s.m_authenticator[3] = ((const BYTE*)&r)[3];
 	r = (DWORD)random;
-	m_authenticator[4] = ((const BYTE*)&r)[0];
-	m_authenticator[5] = ((const BYTE*)&r)[1];
-	m_authenticator[6] = ((const BYTE*)&r)[2];
-	m_authenticator[7] = ((const BYTE*)&r)[3];
+	s.m_authenticator[4] = ((const BYTE*)&r)[0];
+	s.m_authenticator[5] = ((const BYTE*)&r)[1];
+	s.m_authenticator[6] = ((const BYTE*)&r)[2];
+	s.m_authenticator[7] = ((const BYTE*)&r)[3];
 	r = (DWORD)random;
-	m_authenticator[8] = ((const BYTE*)&r)[0];
-	m_authenticator[9] = ((const BYTE*)&r)[1];
-	m_authenticator[10] = ((const BYTE*)&r)[2];
-	m_authenticator[11] = ((const BYTE*)&r)[3];
+	s.m_authenticator[8] = ((const BYTE*)&r)[0];
+	s.m_authenticator[9] = ((const BYTE*)&r)[1];
+	s.m_authenticator[10] = ((const BYTE*)&r)[2];
+	s.m_authenticator[11] = ((const BYTE*)&r)[3];
 	r = (DWORD)random;
-	m_authenticator[12] = ((const BYTE*)&r)[0];
-	m_authenticator[13] = ((const BYTE*)&r)[1];
-	m_authenticator[14] = ((const BYTE*)&r)[2];
-	m_authenticator[15] = ((const BYTE*)&r)[3];
+	s.m_authenticator[12] = ((const BYTE*)&r)[0];
+	s.m_authenticator[13] = ((const BYTE*)&r)[1];
+	s.m_authenticator[14] = ((const BYTE*)&r)[2];
+	s.m_authenticator[15] = ((const BYTE*)&r)[3];
 }
 
 void RadiusPDU::SetAuthenticator( 
@@ -903,11 +934,11 @@ void RadiusPDU::SetAuthenticator( 
 	PMessageDigest5& md5 
 	)
 {
-	if (m_code == AccountingRequest) {
+	if (s.m_code == AccountingRequest) {
 		const PINDEX pduLength = GetLength();
 		const PINDEX secretLength = secret.GetLength();
 		
-		memset(m_authenticator, 0, AuthenticatorLength);
+		memset(s.m_authenticator, 0, AuthenticatorLength);
 
 		md5.Start();
 		md5.Process(m_data, pduLength);
@@ -916,7 +947,7 @@ void RadiusPDU::SetAuthenticator( 
 			
 		PMessageDigest::Result digest;
 		md5.CompleteDigest(digest);
-		memcpy(m_authenticator, digest.GetPointer(), AuthenticatorLength);
+		memcpy(s.m_authenticator, digest.GetPointer(), AuthenticatorLength);
 	} else {
 		PRandom random;
 		SetAuthenticator(random);
@@ -950,9 +981,9 @@ bool RadiusPDU::AppendAttr( 
 		return false;
 		
 	RadiusAttr* const attr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	attr->m_type = attrType;
-	attr->m_length = attrLen;
-	memcpy(attr->m_value, attrValue, valueLength);
+	attr->s.m_type = attrType;
+	attr->s.m_length = attrLen;
+	memcpy(attr->s.m_value, attrValue, valueLength);
 	SetLength(len + attrLen);
 	
 	return true;
@@ -969,9 +1000,9 @@ bool RadiusPDU::AppendAttr( 
 		return false;
 		
 	RadiusAttr* const attr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	attr->m_type = attrType;
-	attr->m_length = attrLen;
-	memcpy(attr->m_value, (const char*)stringValue, stringValue.GetLength());
+	attr->s.m_type = attrType;
+	attr->s.m_length = attrLen;
+	memcpy(attr->s.m_value, (const char*)stringValue, stringValue.GetLength());
 	SetLength(len + attrLen);
 	
 	return true;
@@ -988,9 +1019,9 @@ bool RadiusPDU::AppendAttr( 
 		return false;
 		
 	RadiusAttr* const attr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	attr->m_type = attrType;
-	attr->m_length = attrLen;
-	SetRadiusInteger(attr->m_value, intValue);
+	attr->s.m_type = attrType;
+	attr->s.m_length = attrLen;
+	SetRadiusInteger(attr->s.m_value, intValue);
 	SetLength(len + attrLen);
 	
 	return true;
@@ -1008,12 +1039,12 @@ bool RadiusPDU::AppendAttr( 
 		
 	const DWORD addr = (DWORD)addressValue;
 	RadiusAttr* const attr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	attr->m_type = attrType;
-	attr->m_length = attrLen;
-	attr->m_value[0] = ((const BYTE*)&addr)[0];
-	attr->m_value[1] = ((const BYTE*)&addr)[1];
-	attr->m_value[2] = ((const BYTE*)&addr)[2];
-	attr->m_value[3] = ((const BYTE*)&addr)[3];
+	attr->s.m_type = attrType;
+	attr->s.m_length = attrLen;
+	attr->s.m_value[0] = ((const BYTE*)&addr)[0];
+	attr->s.m_value[1] = ((const BYTE*)&addr)[1];
+	attr->s.m_value[2] = ((const BYTE*)&addr)[2];
+	attr->s.m_value[3] = ((const BYTE*)&addr)[3];
 	SetLength(len + attrLen);
 	
 	return true;
@@ -1032,12 +1063,12 @@ bool RadiusPDU::AppendVsaAttr( 
 		return false;
 		
 	RadiusAttr* const attr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	attr->m_type = RadiusAttr::VendorSpecific;
-	attr->m_length = attrLen;
-	SetRadiusInteger(attr->m_vendorId, vendorId);
-	attr->m_vendorType = vendorType;
-	attr->m_vendorLength = valueLength + 2;
-	memcpy(attr->m_vendorValue, attrValue, valueLength);
+	attr->s.m_type = RadiusAttr::VendorSpecific;
+	attr->s.m_length = attrLen;
+	SetRadiusInteger(attr->s.s.m_vendorId, vendorId);
+	attr->s.s.m_vendorType = vendorType;
+	attr->s.s.m_vendorLength = valueLength + 2;
+	memcpy(attr->s.s.m_vendorValue, attrValue, valueLength);
 	SetLength(len + attrLen);
 	
 	return true;
@@ -1056,12 +1087,12 @@ bool RadiusPDU::AppendVsaAttr( 
 		return false;
 		
 	RadiusAttr* const attr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	attr->m_type = RadiusAttr::VendorSpecific;
-	attr->m_length = attrLen;
-	SetRadiusInteger(attr->m_vendorId, vendorId);
-	attr->m_vendorType = vendorType;
-	attr->m_vendorLength = valueLen + 2;
-	memcpy(attr->m_vendorValue, (const char*)stringValue, valueLen);
+	attr->s.m_type = RadiusAttr::VendorSpecific;
+	attr->s.m_length = attrLen;
+	SetRadiusInteger(attr->s.s.m_vendorId, vendorId);
+	attr->s.s.m_vendorType = vendorType;
+	attr->s.s.m_vendorLength = valueLen + 2;
+	memcpy(attr->s.s.m_vendorValue, (const char*)stringValue, valueLen);
 	SetLength(len + attrLen);
 	
 	return true;
@@ -1079,12 +1110,12 @@ bool RadiusPDU::AppendVsaAttr( 
 		return false;
 		
 	RadiusAttr* const attr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	attr->m_type = RadiusAttr::VendorSpecific;
-	attr->m_length = attrLen;
-	SetRadiusInteger(attr->m_vendorId, vendorId);
-	attr->m_vendorType = vendorType;
-	attr->m_vendorLength = 4 + 2;
-	SetRadiusInteger(attr->m_vendorValue, intValue);
+	attr->s.m_type = RadiusAttr::VendorSpecific;
+	attr->s.m_length = attrLen;
+	SetRadiusInteger(attr->s.s.m_vendorId, vendorId);
+	attr->s.s.m_vendorType = vendorType;
+	attr->s.s.m_vendorLength = 4 + 2;
+	SetRadiusInteger(attr->s.s.m_vendorValue, intValue);
 	SetLength(len + attrLen);
 	
 	return true;
@@ -1103,15 +1134,15 @@ bool RadiusPDU::AppendVsaAttr( 
 		
 	const DWORD addr = (DWORD)addressValue;
 	RadiusAttr* const attr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	attr->m_type = RadiusAttr::VendorSpecific;
-	attr->m_length = attrLen;
-	SetRadiusInteger(attr->m_vendorId, vendorId);
-	attr->m_vendorType = vendorType;
-	attr->m_vendorLength = 4 + 2;
-	attr->m_vendorValue[0] = ((const BYTE*)&addr)[0];
-	attr->m_vendorValue[1] = ((const BYTE*)&addr)[1];
-	attr->m_vendorValue[2] = ((const BYTE*)&addr)[2];
-	attr->m_vendorValue[3] = ((const BYTE*)&addr)[3];
+	attr->s.m_type = RadiusAttr::VendorSpecific;
+	attr->s.m_length = attrLen;
+	SetRadiusInteger(attr->s.s.m_vendorId, vendorId);
+	attr->s.s.m_vendorType = vendorType;
+	attr->s.s.m_vendorLength = 4 + 2;
+	attr->s.s.m_vendorValue[0] = ((const BYTE*)&addr)[0];
+	attr->s.s.m_vendorValue[1] = ((const BYTE*)&addr)[1];
+	attr->s.s.m_vendorValue[2] = ((const BYTE*)&addr)[2];
+	attr->s.s.m_vendorValue[3] = ((const BYTE*)&addr)[3];
 	SetLength(len + attrLen);
 	
 	return true;
@@ -1130,11 +1161,11 @@ bool RadiusPDU::AppendCiscoAttr( 
 		return false;
 		
 	RadiusAttr* const attr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	attr->m_type = RadiusAttr::VendorSpecific;
-	attr->m_length = attrLen;
-	SetRadiusInteger(attr->m_vendorId, RadiusAttr::CiscoVendorId);
-	attr->m_vendorType = vendorType;
-	attr->m_vendorLength = 2;
+	attr->s.m_type = RadiusAttr::VendorSpecific;
+	attr->s.m_length = attrLen;
+	SetRadiusInteger(attr->s.s.m_vendorId, RadiusAttr::CiscoVendorId);
+	attr->s.s.m_vendorType = vendorType;
+	attr->s.s.m_vendorLength = 2;
 
 	if (!vsaHack) {
 		int i = 0;
@@ -1143,26 +1174,26 @@ bool RadiusPDU::AppendCiscoAttr( 
 				attrLen += CiscoAttrNames[i].m_nameLen + 1;
 				if ((len + attrLen) > MaxPduLength)
 					return false;
-				memcpy(attr->m_vendorValue, CiscoAttrNames[i].m_name, CiscoAttrNames[i].m_nameLen);
-				attr->m_length = attr->m_length 
+				memcpy(attr->s.s.m_vendorValue, CiscoAttrNames[i].m_name, CiscoAttrNames[i].m_nameLen);
+				attr->s.m_length = attr->s.m_length 
 					+ (unsigned char)CiscoAttrNames[i].m_nameLen;
-				attr->m_vendorLength = attr->m_vendorLength 
+				attr->s.s.m_vendorLength = attr->s.s.m_vendorLength 
 					+ (unsigned char)CiscoAttrNames[i].m_nameLen;
-				attr->m_data[attr->m_length++] = '=';
-				attr->m_vendorLength++;
+				attr->m_data[attr->s.m_length++] = '=';
+				attr->s.s.m_vendorLength++;
 				break;
 			} else
 				i++;
 	}
 	const PINDEX strLen = stringValue.GetLength();
 	attrLen += strLen;
-	if (((PINDEX)attr->m_length + strLen) > RadiusAttr::MaxLength
+	if (((PINDEX)attr->s.m_length + strLen) > RadiusAttr::MaxLength
 		|| (len + attrLen) > MaxPduLength)
 		return false;
 
-	memcpy(attr->m_data + (PINDEX)attr->m_length, (const char*)stringValue, strLen);
-	attr->m_length = attr->m_length + (unsigned char)strLen;
-	attr->m_vendorLength = attr->m_vendorLength + (unsigned char)strLen;
+	memcpy(attr->m_data + (PINDEX)attr->s.m_length, (const char*)stringValue, strLen);
+	attr->s.m_length = attr->s.m_length + (unsigned char)strLen;
+	attr->s.s.m_vendorLength = attr->s.s.m_vendorLength + (unsigned char)strLen;
 
 	SetLength(len + attrLen);
 	return true;
@@ -1247,7 +1278,7 @@ bool RadiusPDU::Read(const void* rawData
 	PAssert(rawLength >= MinPduLength, PInvalidParameter);
 #endif
 
-	m_code = m_id = Invalid;
+	s.m_code = s.m_id = Invalid;
 	SetLength(FixedHeaderLength);
 
 	if (rawData == NULL || rawLength < MinPduLength)
@@ -1260,13 +1291,13 @@ bool RadiusPDU::Read(const void* rawData
 
 	const PINDEX length = GetLength();
 	if (length > rawLength || length < MinPduLength || length > MaxPduLength) {
-		m_code = m_id = Invalid;
+		s.m_code = s.m_id = Invalid;
 		SetLength(FixedHeaderLength);
 		return false;
 	}
 
 	if (length > FixedHeaderLength) {
-		memcpy(m_attributes, buffptr, length - FixedHeaderLength);
+		memcpy(s.m_attributes, buffptr, length - FixedHeaderLength);
 	}
 
 	return true;
@@ -1291,13 +1322,13 @@ void RadiusPDU::CopyContents(const Radiu
 
 	const PINDEX len = GetLength();
 	if (len < MinPduLength || len > MaxPduLength) {
-		m_code = m_id = Invalid;
+		s.m_code = s.m_id = Invalid;
 		SetLength(FixedHeaderLength);
 		return;
 	}
 
 	if (len > FixedHeaderLength)
-		memcpy(m_attributes, pdu.m_attributes, len - FixedHeaderLength);
+		memcpy(s.m_attributes, pdu.s.m_attributes, len - FixedHeaderLength);
 }
 
 bool RadiusPDU::EncryptPasswords( 
@@ -1316,7 +1347,7 @@ bool RadiusPDU::EncryptPasswords( 
 	md5.Start();
 	if (secretLength > 0)
 		md5.Process((const char*)secret, secretLength);
-	md5.Process(m_authenticator, AuthenticatorLength);
+	md5.Process(s.m_authenticator, AuthenticatorLength);
 	md5.CompleteDigest(digest);
 
 	// calculate length of the new and the old User-Password value	
@@ -1330,14 +1361,14 @@ bool RadiusPDU::EncryptPasswords( 
 
 	// the encrypted password attribute will be appended as the last attribute
 	RadiusAttr* const encPwdAttr = reinterpret_cast<RadiusAttr*>(m_data + len);
-	encPwdAttr->m_type = RadiusAttr::UserPassword;
-	encPwdAttr->m_length = encPwdLength + RadiusAttr::FixedHeaderLength;
-	memset(encPwdAttr->m_value, 0, encPwdLength);
+	encPwdAttr->s.m_type = RadiusAttr::UserPassword;
+	encPwdAttr->s.m_length = encPwdLength + RadiusAttr::FixedHeaderLength;
+	memset(encPwdAttr->s.m_value, 0, encPwdLength);
 	if (origPwdLength > 0)
-		memcpy(encPwdAttr->m_value, pwdAttr->m_value, origPwdLength);
+		memcpy(encPwdAttr->s.m_value, pwdAttr->s.m_value, origPwdLength);
 
 	// encrypt first 16 bytes of the password
-	DWORD* buf1ptr = reinterpret_cast<DWORD*>(encPwdAttr->m_value);
+	DWORD* buf1ptr = reinterpret_cast<DWORD*>(encPwdAttr->s.m_value);
 	const DWORD* buf2ptr = reinterpret_cast<const DWORD*>(digest.GetPointer());
 
 	// XOR either byte-wise or dword-wise (if the memory block is aligned properly)
