diff --git a/src/xpdev/ini_file.c b/src/xpdev/ini_file.c
index ca408106dc4198dddca1f4dfb1e680782c7d77b7..0baf28fc6599fb8695ada7fc3f0c07d94e02c4b1 100644
--- a/src/xpdev/ini_file.c
+++ b/src/xpdev/ini_file.c
@@ -73,7 +73,7 @@ static char* section_name(char* p)
 	return(p);
 }
 
-static BOOL find_section(FILE* fp, const char* section)
+static BOOL seek_section(FILE* fp, const char* section)
 {
 	char*	p;
 	char	str[INI_MAX_LINE_LEN];
@@ -109,7 +109,7 @@ static size_t find_section_index(str_list_t list, const char* section)
 	return(i);
 }
 
-static size_t find_section_values(str_list_t list, const char* section)
+static size_t find_section(str_list_t list, const char* section)
 {
 	size_t	i;
 
@@ -163,7 +163,7 @@ static char* key_name(char* p, char** vp)
 	return(p);
 }
 
-static char* get_value(FILE* fp, const char* section, const char* key, char* value)
+static char* read_value(FILE* fp, const char* section, const char* key, char* value)
 {
 	char*	p;
 	char*	vp=NULL;
@@ -172,7 +172,7 @@ static char* get_value(FILE* fp, const char* section, const char* key, char* val
 	if(fp==NULL)
 		return(NULL);
 
-	if(!find_section(fp,section))
+	if(!seek_section(fp,section))
 		return(NULL);
 
 	while(!feof(fp)) {
@@ -194,7 +194,7 @@ static char* get_value(FILE* fp, const char* section, const char* key, char* val
 	return(NULL);
 }
 
-static size_t find_value_index(str_list_t list, const char* section, const char* key, char* value)
+static size_t get_value(str_list_t list, const char* section, const char* key, char* value)
 {
 	char	str[INI_MAX_LINE_LEN];
 	char*	p;
@@ -202,7 +202,7 @@ static size_t find_value_index(str_list_t list, const char* section, const char*
 	size_t	i;
 
 	value[0]=0;
-	for(i=find_section_values(list, section); list[i]!=NULL; i++) {
+	for(i=find_section(list, section); list[i]!=NULL; i++) {
 		SAFECOPY(str, list[i]);
 		if((p=key_name(str,&vp))==NULL)
 			continue;
@@ -210,7 +210,7 @@ static size_t find_value_index(str_list_t list, const char* section, const char*
 			break;
 		if(stricmp(p,key)!=0)
 			continue;
-		strcpy(value,vp);
+		sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,vp);
 		return(i);
 	}
 
@@ -233,7 +233,7 @@ BOOL iniKeyExists(str_list_t* list, const char* section, const char* key)
 	char	val[INI_MAX_VALUE_LEN];
 	size_t	i;
 
-	i=find_value_index(*list, section, key, val);
+	i=get_value(*list, section, key, val);
 
 	if((*list)[i]==NULL || *(*list)[i]==INI_OPEN_SECTION_CHAR)
 		return(FALSE);
@@ -245,7 +245,7 @@ BOOL iniValueExists(str_list_t* list, const char* section, const char* key)
 {
 	char	val[INI_MAX_VALUE_LEN];
 
-	find_value_index(*list, section, key, val);
+	get_value(*list, section, key, val);
 
 	return(val[0]!=0);
 }
@@ -255,7 +255,7 @@ BOOL iniRemoveKey(str_list_t* list, const char* section, const char* key)
 	char	val[INI_MAX_VALUE_LEN];
 	size_t	i;
 
-	i=find_value_index(*list, section, key, val);
+	i=get_value(*list, section, key, val);
 
 	if((*list)[i]==NULL || *(*list)[i]==INI_OPEN_SECTION_CHAR)
 		return(FALSE);
@@ -269,7 +269,7 @@ BOOL iniRemoveValue(str_list_t* list, const char* section, const char* key)
 	size_t	i;
 	char*	vp=NULL;
 
-	i=find_value_index(*list, section, key, val);
+	i=get_value(*list, section, key, val);
 
     key_name((*list)[i], &vp);
 	if(vp==NULL)
@@ -357,7 +357,7 @@ char* iniSetString(str_list_t* list, const char* section, const char* key, const
 		value="";
 	safe_snprintf(str, sizeof(str), "%s%-*s%s%s"
 		, style->key_prefix, style->key_len, key, style->value_separator, value);
-	i=find_value_index(*list, section, key, curval);
+	i=get_value(*list, section, key, curval);
 	if((*list)[i]==NULL || *(*list)[i]==INI_OPEN_SECTION_CHAR) {
         while(i && *(*list)[i-1]==0) i--;   /* Insert before blank lines, not after */
 		return strListInsert(list, str, i);
@@ -471,7 +471,7 @@ char* iniSetStringList(str_list_t* list, const char* section, const char* key
 
 char* iniReadString(FILE* fp, const char* section, const char* key, const char* deflt, char* value)
 {
-	if(get_value(fp,section,key,value)==NULL || *value==0 /* blank */) {
+	if(read_value(fp,section,key,value)==NULL || *value==0 /* blank */) {
 		if(deflt==NULL)
 			return(NULL);
 		sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,deflt);
@@ -480,20 +480,24 @@ char* iniReadString(FILE* fp, const char* section, const char* key, const char*
 	return(value);
 }
 
-str_list_t iniReadStringList(FILE* fp, const char* section, const char* key
-						 ,const char* sep, const char* deflt)
+char* iniGetString(str_list_t* list, const char* section, const char* key, const char* deflt, char* value)
 {
-	char*	value;
-	char	buf[INI_MAX_VALUE_LEN];
-	char*	token;
-	char	list[INI_MAX_VALUE_LEN];
-	ulong	items=0;
-	str_list_t	lp;
+	get_value(*list, section, key, value);
 
-	if((value=get_value(fp,section,key,buf))==NULL || *value==0 /* blank */)
-		value=(char*)deflt;
+	if(*value==0 /* blank */) {
+		if(deflt==NULL)
+			return(NULL);
+		sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,deflt);
+	}
 
-	SAFECOPY(list,value);
+	return(value);
+}
+
+static str_list_t splitList(char* list, const char* sep)
+{
+	char*		token;
+	ulong		items=0;
+	str_list_t	lp;
 
 	if((lp=strListInit())==NULL)
 		return(NULL);
@@ -508,9 +512,41 @@ str_list_t iniReadStringList(FILE* fp, const char* section, const char* key
 			break;
 		token=strtok(NULL,sep);
 	}
+
 	return(lp);
 }
 
+str_list_t iniReadStringList(FILE* fp, const char* section, const char* key
+						 ,const char* sep, const char* deflt)
+{
+	char*	value;
+	char	buf[INI_MAX_VALUE_LEN];
+	char	list[INI_MAX_VALUE_LEN];
+
+	if((value=read_value(fp,section,key,buf))==NULL || *value==0 /* blank */)
+		value=(char*)deflt;
+
+	SAFECOPY(list,value);
+
+	return(splitList(list,sep));
+}
+
+str_list_t iniGetStringList(str_list_t* list, const char* section, const char* key
+						 ,const char* sep, const char* deflt)
+{
+	char	buf[INI_MAX_VALUE_LEN];
+	char*	value=buf;
+
+	get_value(*list, section, key, value);
+
+	if(*value==0 /* blank */)
+		value=(char*)deflt;
+
+	SAFECOPY(buf,value);
+
+	return(splitList(buf,sep));
+}
+
 void* iniFreeStringList(str_list_t list)
 {
 	strListFree(&list);
@@ -582,7 +618,7 @@ str_list_t iniReadKeyList(FILE* fp, const char* section)
 
 	rewind(fp);
 
-	if(!find_section(fp,section))
+	if(!seek_section(fp,section))
 		return(lp);
 
 	while(!feof(fp)) {
@@ -619,7 +655,7 @@ iniReadNamedStringList(FILE* fp, const char* section)
 
 	rewind(fp);
 
-	if(!find_section(fp,section))
+	if(!seek_section(fp,section))
 		return(lp);
 
 	while(!feof(fp)) {
@@ -634,12 +670,10 @@ iniReadNamedStringList(FILE* fp, const char* section)
 		lp=np;
 		if((lp[items]=(named_string_t*)malloc(sizeof(named_string_t)))==NULL)
 			break;
-		if((lp[items]->name=(char*)malloc(strlen(name)+1))==NULL)
+		if((lp[items]->name=strdup(name))==NULL)
 			break;
-		strcpy(lp[items]->name,name);
-		if((lp[items]->value=(char*)malloc(strlen(value)+1))==NULL)
+		if((lp[items]->value=strdup(value))==NULL)
 			break;
-		strcpy(lp[items]->value,value);
 		items++;
 	}
 
@@ -655,7 +689,7 @@ long iniReadInteger(FILE* fp, const char* section, const char* key, long deflt)
 	char*	value;
 	char	buf[INI_MAX_VALUE_LEN];
 
-	if((value=get_value(fp,section,key,buf))==NULL)
+	if((value=read_value(fp,section,key,buf))==NULL)
 		return(deflt);
 
 	if(*value==0)		/* blank value */
@@ -664,36 +698,72 @@ long iniReadInteger(FILE* fp, const char* section, const char* key, long deflt)
 	return(strtol(value,NULL,0));
 }
 
+long iniGetInteger(str_list_t* list, const char* section, const char* key, long deflt)
+{
+	char	value[INI_MAX_VALUE_LEN];
+
+	get_value(*list, section, key, value);
+
+	if(*value==0)		/* blank value */
+		return(deflt);
+
+	return(strtol(value,NULL,0));
+}
+
 ushort iniReadShortInt(FILE* fp, const char* section, const char* key, ushort deflt)
 {
 	return((ushort)iniReadInteger(fp, section, key, deflt));
 }
 
+ushort iniGetShortInt(str_list_t* list, const char* section, const char* key, ushort deflt)
+{
+	return((ushort)iniGetInteger(list, section, key, deflt));
+}
+
 #if !defined(NO_SOCKET_SUPPORT)
+
+static ulong parseIpAddress(const char* value)
+{
+	if(strchr(value,'.')==NULL)
+		return(strtol(value,NULL,0));
+
+	return(ntohl(inet_addr(value)));
+}
+
 ulong iniReadIpAddress(FILE* fp, const char* section, const char* key, ulong deflt)
 {
 	char	buf[INI_MAX_VALUE_LEN];
 	char*	value;
 
-	if((value=get_value(fp,section,key,buf))==NULL)
+	if((value=read_value(fp,section,key,buf))==NULL)
 		return(deflt);
 
 	if(*value==0)		/* blank value */
 		return(deflt);
 
-	if(strchr(value,'.')==NULL)
-		return(strtol(value,NULL,0));
+	return(parseIpAddress(value));
+}
 
-	return(ntohl(inet_addr(value)));
+ulong iniGetIpAddress(str_list_t* list, const char* section, const char* key, ulong deflt)
+{
+	char	value[INI_MAX_VALUE_LEN];
+
+	get_value(*list, section, key, value);
+
+	if(*value==0)		/* blank value */
+		return(deflt);
+
+	return(parseIpAddress(value));
 }
-#endif
+
+#endif	/* !NO_SOCKET_SUPPORT */
 
 double iniReadFloat(FILE* fp, const char* section, const char* key, double deflt)
 {
 	char	buf[INI_MAX_VALUE_LEN];
 	char*	value;
 
-	if((value=get_value(fp,section,key,buf))==NULL)
+	if((value=read_value(fp,section,key,buf))==NULL)
 		return(deflt);
 
 	if(*value==0)		/* blank value */
@@ -702,17 +772,20 @@ double iniReadFloat(FILE* fp, const char* section, const char* key, double deflt
 	return(atof(value));
 }
 
-BOOL iniReadBool(FILE* fp, const char* section, const char* key, BOOL deflt)
+double iniGetFloat(str_list_t* list, const char* section, const char* key, double deflt)
 {
-	char	buf[INI_MAX_VALUE_LEN];
-	char*	value;
+	char	value[INI_MAX_VALUE_LEN];
 
-	if((value=get_value(fp,section,key,buf))==NULL)
-		return(deflt);
+	get_value(*list, section, key, value);
 
 	if(*value==0)		/* blank value */
 		return(deflt);
 
+	return(atof(value));
+}
+
+static BOOL parseBool(const char* value)
+{
 	if(!stricmp(value,"TRUE"))
 		return(TRUE);
 	if(!stricmp(value,"FALSE"))
@@ -721,19 +794,39 @@ BOOL iniReadBool(FILE* fp, const char* section, const char* key, BOOL deflt)
 	return(strtol(value,NULL,0));
 }
 
-ulong iniReadBitField(FILE* fp, const char* section, const char* key, 
-						ini_bitdesc_t* bitdesc, ulong deflt)
+BOOL iniReadBool(FILE* fp, const char* section, const char* key, BOOL deflt)
+{
+	char	buf[INI_MAX_VALUE_LEN];
+	char*	value;
+
+	if((value=read_value(fp,section,key,buf))==NULL)
+		return(deflt);
+
+	if(*value==0)		/* blank value */
+		return(deflt);
+
+	return(parseBool(value));
+}
+
+BOOL iniGetBool(str_list_t* list, const char* section, const char* key, BOOL deflt)
+{
+	char	value[INI_MAX_VALUE_LEN];
+
+	get_value(*list, section, key, value);
+
+	if(*value==0)		/* blank value */
+		return(deflt);
+
+	return(parseBool(value));
+}
+
+static ulong parseBitField(char* value, ini_bitdesc_t* bitdesc)
 {
 	int		i;
 	char*	p;
 	char*	tp;
-	char*	value;
-	char	buf[INI_MAX_VALUE_LEN];
 	ulong	v=0;
 
-	if((value=get_value(fp,section,key,buf))==NULL)
-		return(deflt);
-
 	for(p=value;*p;) {
 		tp=strchr(p,'|');
 		if(tp!=NULL)
@@ -759,6 +852,31 @@ ulong iniReadBitField(FILE* fp, const char* section, const char* key,
 	return(v);
 }
 
+ulong iniReadBitField(FILE* fp, const char* section, const char* key, 
+						ini_bitdesc_t* bitdesc, ulong deflt)
+{
+	char*	value;
+	char	buf[INI_MAX_VALUE_LEN];
+
+	if((value=read_value(fp,section,key,buf))==NULL)
+		return(deflt);
+
+	return(parseBitField(value,bitdesc));
+}
+
+ulong iniGetBitField(str_list_t* list, const char* section, const char* key, 
+						ini_bitdesc_t* bitdesc, ulong deflt)
+{
+	char	value[INI_MAX_VALUE_LEN];
+
+	get_value(*list, section, key, value);
+
+	if(*value==0)		/* blank value */
+		return(deflt);
+
+	return(parseBitField(value,bitdesc));
+}
+
 str_list_t iniReadFile(FILE* fp)
 {
 	size_t		i;
diff --git a/src/xpdev/ini_file.h b/src/xpdev/ini_file.h
index fadd514e5f49454ec6d5e2288d07eaf5e9e51295..cd067b4d9986ba6053db9d992eb4dd992caaad46 100644
--- a/src/xpdev/ini_file.h
+++ b/src/xpdev/ini_file.h
@@ -71,22 +71,22 @@ named_string_t**
 			iniReadNamedStringList	(FILE*, const char* section);
 
 /* These functions read a single key of the specified type */
-char*		iniReadString(FILE*, const char* section, const char* key, 
-							 const char* deflt, char* value);
+char*		iniReadString(FILE*, const char* section, const char* key
+					,const char* deflt, char* value);
 str_list_t	iniReadStringList(FILE*, const char* section, const char* key
-							,const char* sep, const char* deflt);
-long		iniReadInteger(FILE*, const char* section, const char* key, 
-							 long deflt);
-ushort		iniReadShortInt(FILE*, const char* section, const char* key, 
-							 ushort deflt);
-ulong		iniReadIpAddress(FILE*, const char* section, const char* key, 
-							 ulong deflt);
-double		iniReadFloat(FILE*, const char* section, const char* key, 
-							 double deflt);
-BOOL		iniReadBool(FILE*, const char* section, const char* key, 
-							 BOOL deflt);
-ulong		iniReadBitField(FILE*, const char* section, const char* key, 
-							 ini_bitdesc_t* bitdesc, ulong deflt);
+					,const char* sep, const char* deflt);
+long		iniReadInteger(FILE*, const char* section, const char* key
+					,long deflt);
+ushort		iniReadShortInt(FILE*, const char* section, const char* key
+					,ushort deflt);
+ulong		iniReadIpAddress(FILE*, const char* section, const char* key
+					,ulong deflt);
+double		iniReadFloat(FILE*, const char* section, const char* key
+					,double deflt);
+BOOL		iniReadBool(FILE*, const char* section, const char* key
+					,BOOL deflt);
+ulong		iniReadBitField(FILE*, const char* section, const char* key
+					,ini_bitdesc_t* bitdesc, ulong deflt);
 
 /* Free string list returned from iniRead*List functions */
 void*		iniFreeStringList(str_list_t list);
@@ -100,8 +100,24 @@ str_list_t	iniReadFile(FILE*);
 BOOL		iniWriteFile(FILE*, const str_list_t);
 
 /* StringList functions */
-size_t		iniAddSection(str_list_t*, const char* section
-					,ini_style_t*);
+char*		iniGetString(str_list_t*, const char* section, const char* key
+					,const char* deflt, char* value);
+str_list_t	iniGetStringList(str_list_t*, const char* section, const char* key
+					,const char* sep, const char* deflt);
+long		iniGetInteger(str_list_t*, const char* section, const char* key
+					,long deflt);
+ushort		iniGetShortInt(str_list_t*, const char* section, const char* key
+					,ushort deflt);
+ulong		iniGetIpAddress(str_list_t*, const char* section, const char* key
+					,ulong deflt);
+double		iniGetFloat(str_list_t*, const char* section, const char* key
+					,double deflt);
+BOOL		iniGetBool(str_list_t*, const char* section, const char* key
+					,BOOL deflt);
+ulong		iniGetBitField(str_list_t*, const char* section, const char* key
+					,ini_bitdesc_t* bitdesc, ulong deflt);
+
+
 char*		iniSetString(str_list_t*, const char* section, const char* key, const char* value
 					,ini_style_t*);
 char*		iniSetInteger(str_list_t*, const char* section, const char* key, long value
@@ -121,6 +137,9 @@ char*		iniSetBitField(str_list_t*, const char* section, const char* key, ini_bit
 char*		iniSetStringList(str_list_t*, const char* section, const char* key
 					,const char* sep, str_list_t value, ini_style_t*);
 
+size_t		iniAddSection(str_list_t*, const char* section
+					,ini_style_t*);
+
 BOOL		iniSectionExists(str_list_t*, const char* section);
 BOOL		iniKeyExists(str_list_t*, const char* section, const char* key);
 BOOL		iniValueExists(str_list_t*, const char* section, const char* key);