head	1.1;
access;
symbols
	pkgsrc-2026Q1:1.1.0.174
	pkgsrc-2026Q1-base:1.1
	pkgsrc-2025Q4:1.1.0.172
	pkgsrc-2025Q4-base:1.1
	pkgsrc-2025Q3:1.1.0.170
	pkgsrc-2025Q3-base:1.1
	pkgsrc-2025Q2:1.1.0.168
	pkgsrc-2025Q2-base:1.1
	pkgsrc-2025Q1:1.1.0.166
	pkgsrc-2025Q1-base:1.1
	pkgsrc-2024Q4:1.1.0.164
	pkgsrc-2024Q4-base:1.1
	pkgsrc-2024Q3:1.1.0.162
	pkgsrc-2024Q3-base:1.1
	pkgsrc-2024Q2:1.1.0.160
	pkgsrc-2024Q2-base:1.1
	pkgsrc-2024Q1:1.1.0.158
	pkgsrc-2024Q1-base:1.1
	pkgsrc-2023Q4:1.1.0.156
	pkgsrc-2023Q4-base:1.1
	pkgsrc-2023Q3:1.1.0.154
	pkgsrc-2023Q3-base:1.1
	pkgsrc-2023Q2:1.1.0.152
	pkgsrc-2023Q2-base:1.1
	pkgsrc-2023Q1:1.1.0.150
	pkgsrc-2023Q1-base:1.1
	pkgsrc-2022Q4:1.1.0.148
	pkgsrc-2022Q4-base:1.1
	pkgsrc-2022Q3:1.1.0.146
	pkgsrc-2022Q3-base:1.1
	pkgsrc-2022Q2:1.1.0.144
	pkgsrc-2022Q2-base:1.1
	pkgsrc-2022Q1:1.1.0.142
	pkgsrc-2022Q1-base:1.1
	pkgsrc-2021Q4:1.1.0.140
	pkgsrc-2021Q4-base:1.1
	pkgsrc-2021Q3:1.1.0.138
	pkgsrc-2021Q3-base:1.1
	pkgsrc-2021Q2:1.1.0.136
	pkgsrc-2021Q2-base:1.1
	pkgsrc-2021Q1:1.1.0.134
	pkgsrc-2021Q1-base:1.1
	pkgsrc-2020Q4:1.1.0.132
	pkgsrc-2020Q4-base:1.1
	pkgsrc-2020Q3:1.1.0.130
	pkgsrc-2020Q3-base:1.1
	pkgsrc-2020Q2:1.1.0.126
	pkgsrc-2020Q2-base:1.1
	pkgsrc-2020Q1:1.1.0.106
	pkgsrc-2020Q1-base:1.1
	pkgsrc-2019Q4:1.1.0.128
	pkgsrc-2019Q4-base:1.1
	pkgsrc-2019Q3:1.1.0.124
	pkgsrc-2019Q3-base:1.1
	pkgsrc-2019Q2:1.1.0.122
	pkgsrc-2019Q2-base:1.1
	pkgsrc-2019Q1:1.1.0.120
	pkgsrc-2019Q1-base:1.1
	pkgsrc-2018Q4:1.1.0.118
	pkgsrc-2018Q4-base:1.1
	pkgsrc-2018Q3:1.1.0.116
	pkgsrc-2018Q3-base:1.1
	pkgsrc-2018Q2:1.1.0.114
	pkgsrc-2018Q2-base:1.1
	pkgsrc-2018Q1:1.1.0.112
	pkgsrc-2018Q1-base:1.1
	pkgsrc-2017Q4:1.1.0.110
	pkgsrc-2017Q4-base:1.1
	pkgsrc-2017Q3:1.1.0.108
	pkgsrc-2017Q3-base:1.1
	pkgsrc-2017Q2:1.1.0.104
	pkgsrc-2017Q2-base:1.1
	pkgsrc-2017Q1:1.1.0.102
	pkgsrc-2017Q1-base:1.1
	pkgsrc-2016Q4:1.1.0.100
	pkgsrc-2016Q4-base:1.1
	pkgsrc-2016Q3:1.1.0.98
	pkgsrc-2016Q3-base:1.1
	pkgsrc-2016Q2:1.1.0.96
	pkgsrc-2016Q2-base:1.1
	pkgsrc-2016Q1:1.1.0.94
	pkgsrc-2016Q1-base:1.1
	pkgsrc-2015Q4:1.1.0.92
	pkgsrc-2015Q4-base:1.1
	pkgsrc-2015Q3:1.1.0.90
	pkgsrc-2015Q3-base:1.1
	pkgsrc-2015Q2:1.1.0.88
	pkgsrc-2015Q2-base:1.1
	pkgsrc-2015Q1:1.1.0.86
	pkgsrc-2015Q1-base:1.1
	pkgsrc-2014Q4:1.1.0.84
	pkgsrc-2014Q4-base:1.1
	pkgsrc-2014Q3:1.1.0.82
	pkgsrc-2014Q3-base:1.1
	pkgsrc-2014Q2:1.1.0.80
	pkgsrc-2014Q2-base:1.1
	pkgsrc-2014Q1:1.1.0.78
	pkgsrc-2014Q1-base:1.1
	pkgsrc-2013Q4:1.1.0.76
	pkgsrc-2013Q4-base:1.1
	pkgsrc-2013Q3:1.1.0.74
	pkgsrc-2013Q3-base:1.1
	pkgsrc-2013Q2:1.1.0.72
	pkgsrc-2013Q2-base:1.1
	pkgsrc-2013Q1:1.1.0.70
	pkgsrc-2013Q1-base:1.1
	pkgsrc-2012Q4:1.1.0.68
	pkgsrc-2012Q4-base:1.1
	pkgsrc-2012Q3:1.1.0.66
	pkgsrc-2012Q3-base:1.1
	pkgsrc-2012Q2:1.1.0.64
	pkgsrc-2012Q2-base:1.1
	pkgsrc-2012Q1:1.1.0.62
	pkgsrc-2012Q1-base:1.1
	pkgsrc-2011Q4:1.1.0.60
	pkgsrc-2011Q4-base:1.1
	pkgsrc-2011Q3:1.1.0.58
	pkgsrc-2011Q3-base:1.1
	pkgsrc-2011Q2:1.1.0.56
	pkgsrc-2011Q2-base:1.1
	pkgsrc-2011Q1:1.1.0.54
	pkgsrc-2011Q1-base:1.1
	pkgsrc-2010Q4:1.1.0.52
	pkgsrc-2010Q4-base:1.1
	pkgsrc-2010Q3:1.1.0.50
	pkgsrc-2010Q3-base:1.1
	pkgsrc-2010Q2:1.1.0.48
	pkgsrc-2010Q2-base:1.1
	pkgsrc-2010Q1:1.1.0.46
	pkgsrc-2010Q1-base:1.1
	pkgsrc-2009Q4:1.1.0.44
	pkgsrc-2009Q4-base:1.1
	pkgsrc-2009Q3:1.1.0.42
	pkgsrc-2009Q3-base:1.1
	pkgsrc-2009Q2:1.1.0.40
	pkgsrc-2009Q2-base:1.1
	pkgsrc-2009Q1:1.1.0.38
	pkgsrc-2009Q1-base:1.1
	pkgsrc-2008Q4:1.1.0.36
	pkgsrc-2008Q4-base:1.1
	pkgsrc-2008Q3:1.1.0.34
	pkgsrc-2008Q3-base:1.1
	cube-native-xorg:1.1.0.32
	cube-native-xorg-base:1.1
	pkgsrc-2008Q2:1.1.0.30
	pkgsrc-2008Q2-base:1.1
	cwrapper:1.1.0.28
	pkgsrc-2008Q1:1.1.0.26
	pkgsrc-2008Q1-base:1.1
	pkgsrc-2007Q4:1.1.0.24
	pkgsrc-2007Q4-base:1.1
	pkgsrc-2007Q3:1.1.0.22
	pkgsrc-2007Q3-base:1.1
	pkgsrc-2007Q2:1.1.0.20
	pkgsrc-2007Q2-base:1.1
	pkgsrc-2007Q1:1.1.0.18
	pkgsrc-2007Q1-base:1.1
	pkgsrc-2006Q4:1.1.0.16
	pkgsrc-2006Q4-base:1.1
	pkgsrc-2006Q3:1.1.0.14
	pkgsrc-2006Q3-base:1.1
	pkgsrc-2006Q2:1.1.0.12
	pkgsrc-2006Q2-base:1.1
	pkgsrc-2006Q1:1.1.0.10
	pkgsrc-2006Q1-base:1.1
	pkgsrc-2005Q4:1.1.0.8
	pkgsrc-2005Q4-base:1.1
	pkgsrc-2005Q3:1.1.0.6
	pkgsrc-2005Q3-base:1.1
	pkgsrc-2005Q2:1.1.0.4
	pkgsrc-2005Q2-base:1.1
	pkgsrc-2005Q1:1.1.0.2
	pkgsrc-2005Q1-base:1.1;
locks; strict;
comment	@# @;


1.1
date	2005.03.16.12.55.02;	author rillig;	state Exp;
branches;
next	;


desc
@@


1.1
log
@Added two patches to allow building with gcc-2.95.3. Approved by wiz.
@
text
@$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)
@
