diff --git a/src/sbbs3/sbbs_ini.c b/src/sbbs3/sbbs_ini.c
index 5b67486f16e300aa56a4ac35aab061be78e13bfd..271e9065579f45815c2de06e8b13ef82f9e83b15 100644
--- a/src/sbbs3/sbbs_ini.c
+++ b/src/sbbs3/sbbs_ini.c
@@ -1,6 +1,6 @@
 /* sbbs_ini.c */
 
-/* Synchronet console configuration (.ini) file routines */
+/* Synchronet initialization (.ini) file routines */
 
 /* $Id$ */
 
@@ -123,18 +123,18 @@ static void sbbs_fix_js_settings(js_startup_t* js)
 	if(js->cx_stack==0)		js->cx_stack=JAVASCRIPT_CONTEXT_STACK;
 }
 
-void sbbs_read_js_settings(
-	 FILE* fp
+void sbbs_get_js_settings(
+	 str_list_t list
 	,const char* section
 	,js_startup_t* js
 	,js_startup_t* defaults)
 {
-	js->max_bytes		= iniReadInteger(fp,section,strJavaScriptMaxBytes		,defaults->max_bytes);
-	js->cx_stack		= iniReadInteger(fp,section,strJavaScriptContextStack	,defaults->cx_stack);
-	js->thread_stack	= iniReadInteger(fp,section,strJavaScriptThreadStack	,defaults->thread_stack);
-	js->branch_limit	= iniReadInteger(fp,section,strJavaScriptBranchLimit	,defaults->branch_limit);
-	js->gc_interval		= iniReadInteger(fp,section,strJavaScriptGcInterval		,defaults->gc_interval);
-	js->yield_interval	= iniReadInteger(fp,section,strJavaScriptYieldInterval	,defaults->yield_interval);
+	js->max_bytes		= iniGetInteger(list,section,strJavaScriptMaxBytes		,defaults->max_bytes);
+	js->cx_stack		= iniGetInteger(list,section,strJavaScriptContextStack	,defaults->cx_stack);
+	js->thread_stack	= iniGetInteger(list,section,strJavaScriptThreadStack	,defaults->thread_stack);
+	js->branch_limit	= iniGetInteger(list,section,strJavaScriptBranchLimit	,defaults->branch_limit);
+	js->gc_interval		= iniGetInteger(list,section,strJavaScriptGcInterval	,defaults->gc_interval);
+	js->yield_interval	= iniGetInteger(list,section,strJavaScriptYieldInterval	,defaults->yield_interval);
 
 	sbbs_fix_js_settings(js);
 }
@@ -194,19 +194,19 @@ BOOL sbbs_set_js_settings(
 	return(!failure);
 }
 
-static void read_ini_globals(FILE* fp, global_startup_t* global)
+static void get_ini_globals(str_list_t list, global_startup_t* global)
 {
 	const char* section = "Global";
 	char		value[INI_MAX_VALUE_LEN];
 	char*		p;
 
-	p=iniReadString(fp,section,strCtrlDirectory,nulstr,value);
+	p=iniGetString(list,section,strCtrlDirectory,nulstr,value);
 	if(*p) {
 	    SAFECOPY(global->ctrl_dir,value);
 		backslash(global->ctrl_dir);
     }
 
-	p=iniReadString(fp,section,strTempDirectory,nulstr,value);
+	p=iniGetString(list,section,strTempDirectory,nulstr,value);
 #if defined(__unix__)
 	if(*p==0)
 		p=_PATH_TMP;	/* Good idea to use "/tmp" on Unix */
@@ -216,15 +216,15 @@ static void read_ini_globals(FILE* fp, global_startup_t* global)
 		backslash(global->temp_dir);
     }
 
-	p=iniReadString(fp,section,strHostName,nulstr,value);
+	p=iniGetString(list,section,strHostName,nulstr,value);
 	if(*p)
         SAFECOPY(global->host_name,value);
 
-	global->sem_chk_freq=iniReadShortInt(fp,section,strSemFileCheckFrequency,0);
-	global->interface_addr=iniReadIpAddress(fp,section,strInterface,INADDR_ANY);
-	global->log_mask=iniReadBitField(fp,section,strLogMask,log_mask_bits,DEFAULT_LOG_MASK);
-	global->bind_retry_count=iniReadInteger(fp,section,strBindRetryCount,DEFAULT_BIND_RETRY_COUNT);
-	global->bind_retry_delay=iniReadInteger(fp,section,strBindRetryDelay,DEFAULT_BIND_RETRY_DELAY);
+	global->sem_chk_freq=iniGetShortInt(list,section,strSemFileCheckFrequency,0);
+	global->interface_addr=iniGetIpAddress(list,section,strInterface,INADDR_ANY);
+	global->log_mask=iniGetBitField(list,section,strLogMask,log_mask_bits,DEFAULT_LOG_MASK);
+	global->bind_retry_count=iniGetInteger(list,section,strBindRetryCount,DEFAULT_BIND_RETRY_COUNT);
+	global->bind_retry_delay=iniGetInteger(list,section,strBindRetryDelay,DEFAULT_BIND_RETRY_DELAY);
 
 	/* Setup default values here */
 	global->js.max_bytes		= JAVASCRIPT_MAX_BYTES;
@@ -235,7 +235,7 @@ static void read_ini_globals(FILE* fp, global_startup_t* global)
 	global->js.yield_interval	= JAVASCRIPT_YIELD_INTERVAL;
 
 	/* Read .ini values here */
-	sbbs_read_js_settings(fp, section, &global->js, &global->js);
+	sbbs_get_js_settings(list, section, &global->js, &global->js);
 }
 
 
@@ -258,6 +258,7 @@ void sbbs_read_ini(
 	const char* default_term_ansi;
 	const char*	default_dosemu_path;
 	char		value[INI_MAX_VALUE_LEN];
+	str_list_t	list;
 	global_startup_t global_buf;
 
 	if(global==NULL) {
@@ -265,7 +266,9 @@ void sbbs_read_ini(
 		global=&global_buf;
 	}
 
-	read_ini_globals(fp, global);
+	list=iniReadFile(fp);
+
+	get_ini_globals(list, global);
 
 	if(global->ctrl_dir[0]) {
 		if(bbs!=NULL)		SAFECOPY(bbs->ctrl_dir,global->ctrl_dir);
@@ -286,44 +289,44 @@ void sbbs_read_ini(
 	section = "BBS";
 
 	if(run_bbs!=NULL)
-		*run_bbs=iniReadBool(fp,section,strAutoStart,TRUE);
+		*run_bbs=iniGetBool(list,section,strAutoStart,TRUE);
 
 	if(bbs!=NULL) {
 
 		bbs->telnet_interface
-			=iniReadIpAddress(fp,section,"TelnetInterface",global->interface_addr);
+			=iniGetIpAddress(list,section,"TelnetInterface",global->interface_addr);
 		bbs->telnet_port
-			=iniReadShortInt(fp,section,"TelnetPort",IPPORT_TELNET);
+			=iniGetShortInt(list,section,"TelnetPort",IPPORT_TELNET);
 
 		bbs->rlogin_interface
-			=iniReadIpAddress(fp,section,"RLoginInterface",global->interface_addr);
+			=iniGetIpAddress(list,section,"RLoginInterface",global->interface_addr);
 		bbs->rlogin_port
-			=iniReadShortInt(fp,section,"RLoginPort",513);
+			=iniGetShortInt(list,section,"RLoginPort",513);
 
 		bbs->first_node
-			=iniReadShortInt(fp,section,"FirstNode",1);
+			=iniGetShortInt(list,section,"FirstNode",1);
 		bbs->last_node
-			=iniReadShortInt(fp,section,"LastNode",4);
+			=iniGetShortInt(list,section,"LastNode",4);
 
 		bbs->outbuf_highwater_mark
-			=iniReadShortInt(fp,section,"OutbufHighwaterMark",1024);
+			=iniGetShortInt(list,section,"OutbufHighwaterMark",1024);
 		bbs->outbuf_drain_timeout
-			=iniReadShortInt(fp,section,"OutbufDrainTimeout",10);
+			=iniGetShortInt(list,section,"OutbufDrainTimeout",10);
 
 		bbs->sem_chk_freq
-			=iniReadShortInt(fp,section,strSemFileCheckFrequency,global->sem_chk_freq);
+			=iniGetShortInt(list,section,strSemFileCheckFrequency,global->sem_chk_freq);
 
 		bbs->xtrn_polls_before_yield
-			=iniReadInteger(fp,section,"ExternalYield",10);
+			=iniGetInteger(list,section,"ExternalYield",10);
 
 		/* JavaScript operating parameters */
-		sbbs_read_js_settings(fp, section, &bbs->js, &global->js);
+		sbbs_get_js_settings(list, section, &bbs->js, &global->js);
 
 		SAFECOPY(bbs->host_name
-			,iniReadString(fp,section,strHostName,global->host_name,value));
+			,iniGetString(list,section,strHostName,global->host_name,value));
 
 		SAFECOPY(bbs->temp_dir
-			,iniReadString(fp,section,strTempDirectory,bbs->temp_dir,value));
+			,iniGetString(list,section,strTempDirectory,bbs->temp_dir,value));
 
 		/* Set default terminal type to "stock" termcap closest to "ansi-bbs" */
 	#if defined(__FreeBSD__)
@@ -333,9 +336,9 @@ void sbbs_read_ini(
 	#endif
 
 		SAFECOPY(bbs->xtrn_term_ansi
-			,iniReadString(fp,section,"ExternalTermANSI",default_term_ansi,value));
+			,iniGetString(list,section,"ExternalTermANSI",default_term_ansi,value));
 		SAFECOPY(bbs->xtrn_term_dumb
-			,iniReadString(fp,section,"ExternalTermDumb","dumb",value));
+			,iniGetString(list,section,"ExternalTermDumb","dumb",value));
 
 	#if defined(__FreeBSD__)
 		default_dosemu_path="/usr/bin/doscmd";
@@ -344,273 +347,275 @@ void sbbs_read_ini(
 	#endif
 
 		SAFECOPY(bbs->dosemu_path
-			,iniReadString(fp,section,"DOSemuPath",default_dosemu_path,value));
+			,iniGetString(list,section,"DOSemuPath",default_dosemu_path,value));
 
 		SAFECOPY(bbs->answer_sound
-			,iniReadString(fp,section,strAnswerSound,nulstr,value));
+			,iniGetString(list,section,strAnswerSound,nulstr,value));
 		SAFECOPY(bbs->hangup_sound
-			,iniReadString(fp,section,strHangupSound,nulstr,value));
+			,iniGetString(list,section,strHangupSound,nulstr,value));
 
 		bbs->log_mask
-			=iniReadBitField(fp,section,strLogMask,log_mask_bits,global->log_mask);
+			=iniGetBitField(list,section,strLogMask,log_mask_bits,global->log_mask);
 		bbs->options
-			=iniReadBitField(fp,section,strOptions,bbs_options
+			=iniGetBitField(list,section,strOptions,bbs_options
 				,BBS_OPT_XTRN_MINIMIZED|BBS_OPT_SYSOP_AVAILABLE);
 
-		bbs->bind_retry_count=iniReadInteger(fp,section,strBindRetryCount,global->bind_retry_count);
-		bbs->bind_retry_delay=iniReadInteger(fp,section,strBindRetryDelay,global->bind_retry_delay);
+		bbs->bind_retry_count=iniGetInteger(list,section,strBindRetryCount,global->bind_retry_count);
+		bbs->bind_retry_delay=iniGetInteger(list,section,strBindRetryDelay,global->bind_retry_delay);
 	}
 
 	/***********************************************************************/
 	section = "FTP";
 
 	if(run_ftp!=NULL)
-		*run_ftp=iniReadBool(fp,section,strAutoStart,TRUE);
+		*run_ftp=iniGetBool(list,section,strAutoStart,TRUE);
 
 	if(ftp!=NULL) {
 
 		ftp->interface_addr
-			=iniReadIpAddress(fp,section,strInterface,global->interface_addr);
+			=iniGetIpAddress(list,section,strInterface,global->interface_addr);
 		ftp->port
-			=iniReadShortInt(fp,section,strPort,IPPORT_FTP);
+			=iniGetShortInt(list,section,strPort,IPPORT_FTP);
 		ftp->max_clients
-			=iniReadShortInt(fp,section,strMaxClients,10);
+			=iniGetShortInt(list,section,strMaxClients,10);
 		ftp->max_inactivity
-			=iniReadShortInt(fp,section,strMaxInactivity,300);	/* seconds */
+			=iniGetShortInt(list,section,strMaxInactivity,300);	/* seconds */
 		ftp->qwk_timeout
-			=iniReadShortInt(fp,section,"QwkTimeout",600);		/* seconds */
+			=iniGetShortInt(list,section,"QwkTimeout",600);		/* seconds */
 		ftp->sem_chk_freq
-			=iniReadShortInt(fp,section,strSemFileCheckFrequency,global->sem_chk_freq);
+			=iniGetShortInt(list,section,strSemFileCheckFrequency,global->sem_chk_freq);
 
 		/* Passive transfer settings (for stupid firewalls/NATs) */
 		ftp->pasv_ip_addr
-			=iniReadIpAddress(fp,section,"PasvIpAddress",0);
+			=iniGetIpAddress(list,section,"PasvIpAddress",0);
 		ftp->pasv_port_low
-			=iniReadShortInt(fp,section,"PasvPortLow",IPPORT_RESERVED);
+			=iniGetShortInt(list,section,"PasvPortLow",IPPORT_RESERVED);
 		ftp->pasv_port_high
-			=iniReadShortInt(fp,section,"PasvPortHigh",0xffff);
+			=iniGetShortInt(list,section,"PasvPortHigh",0xffff);
 
 
 		/* JavaScript Operating Parameters */
-		sbbs_read_js_settings(fp, section, &ftp->js, &global->js);
+		sbbs_get_js_settings(list, section, &ftp->js, &global->js);
 
 		SAFECOPY(ftp->host_name
-			,iniReadString(fp,section,strHostName,global->host_name,value));
+			,iniGetString(list,section,strHostName,global->host_name,value));
 
 		SAFECOPY(ftp->index_file_name
-			,iniReadString(fp,section,"IndexFileName","00index",value));
+			,iniGetString(list,section,"IndexFileName","00index",value));
 		SAFECOPY(ftp->html_index_file
-			,iniReadString(fp,section,"HtmlIndexFile","00index.html",value));
+			,iniGetString(list,section,"HtmlIndexFile","00index.html",value));
 		SAFECOPY(ftp->html_index_script
-			,iniReadString(fp,section,"HtmlIndexScript","ftp-html.js",value));
+			,iniGetString(list,section,"HtmlIndexScript","ftp-html.js",value));
 
 		SAFECOPY(ftp->answer_sound
-			,iniReadString(fp,section,strAnswerSound,nulstr,value));
+			,iniGetString(list,section,strAnswerSound,nulstr,value));
 		SAFECOPY(ftp->hangup_sound
-			,iniReadString(fp,section,strHangupSound,nulstr,value));
+			,iniGetString(list,section,strHangupSound,nulstr,value));
 		SAFECOPY(ftp->hack_sound
-			,iniReadString(fp,section,strHackAttemptSound,nulstr,value));
+			,iniGetString(list,section,strHackAttemptSound,nulstr,value));
 
 		SAFECOPY(ftp->temp_dir
-			,iniReadString(fp,section,strTempDirectory,ftp->temp_dir,value));
+			,iniGetString(list,section,strTempDirectory,ftp->temp_dir,value));
 
 		ftp->log_mask
-			=iniReadBitField(fp,section,strLogMask,log_mask_bits,global->log_mask);
+			=iniGetBitField(list,section,strLogMask,log_mask_bits,global->log_mask);
 		ftp->options
-			=iniReadBitField(fp,section,strOptions,ftp_options
+			=iniGetBitField(list,section,strOptions,ftp_options
 				,FTP_OPT_INDEX_FILE|FTP_OPT_HTML_INDEX_FILE|FTP_OPT_ALLOW_QWK);
 
-		ftp->bind_retry_count=iniReadInteger(fp,section,strBindRetryCount,global->bind_retry_count);
-		ftp->bind_retry_delay=iniReadInteger(fp,section,strBindRetryDelay,global->bind_retry_delay);
+		ftp->bind_retry_count=iniGetInteger(list,section,strBindRetryCount,global->bind_retry_count);
+		ftp->bind_retry_delay=iniGetInteger(list,section,strBindRetryDelay,global->bind_retry_delay);
 	}
 
 	/***********************************************************************/
 	section = "Mail";
 
 	if(run_mail!=NULL)
-		*run_mail=iniReadBool(fp,section,strAutoStart,TRUE);
+		*run_mail=iniGetBool(list,section,strAutoStart,TRUE);
 
 	if(mail!=NULL) {
 
 		mail->interface_addr
-			=iniReadIpAddress(fp,section,strInterface,global->interface_addr);
+			=iniGetIpAddress(list,section,strInterface,global->interface_addr);
 		mail->smtp_port
-			=iniReadShortInt(fp,section,"SMTPPort",IPPORT_SMTP);
+			=iniGetShortInt(list,section,"SMTPPort",IPPORT_SMTP);
 		mail->pop3_port
-			=iniReadShortInt(fp,section,"POP3Port",IPPORT_POP3);
+			=iniGetShortInt(list,section,"POP3Port",IPPORT_POP3);
 		mail->relay_port
-			=iniReadShortInt(fp,section,"RelayPort",IPPORT_SMTP);
+			=iniGetShortInt(list,section,"RelayPort",IPPORT_SMTP);
 		mail->max_clients
-			=iniReadShortInt(fp,section,strMaxClients,10);
+			=iniGetShortInt(list,section,strMaxClients,10);
 		mail->max_inactivity
-			=iniReadShortInt(fp,section,strMaxInactivity,120);		/* seconds */
+			=iniGetShortInt(list,section,strMaxInactivity,120);		/* seconds */
 		mail->max_delivery_attempts
-			=iniReadShortInt(fp,section,"MaxDeliveryAttempts",50);
+			=iniGetShortInt(list,section,"MaxDeliveryAttempts",50);
 		mail->rescan_frequency
-			=iniReadShortInt(fp,section,"RescanFrequency",3600);	/* 60 minutes */
+			=iniGetShortInt(list,section,"RescanFrequency",3600);	/* 60 minutes */
 		mail->sem_chk_freq
-			=iniReadShortInt(fp,section,strSemFileCheckFrequency,global->sem_chk_freq);
+			=iniGetShortInt(list,section,strSemFileCheckFrequency,global->sem_chk_freq);
 		mail->lines_per_yield
-			=iniReadShortInt(fp,section,"LinesPerYield",10);
+			=iniGetShortInt(list,section,"LinesPerYield",10);
 		mail->max_recipients
-			=iniReadShortInt(fp,section,"MaxRecipients",100);
+			=iniGetShortInt(list,section,"MaxRecipients",100);
 		mail->max_msg_size
-			=iniReadInteger(fp,section,"MaxMsgSize",DEFAULT_MAX_MSG_SIZE);
+			=iniGetInteger(list,section,"MaxMsgSize",DEFAULT_MAX_MSG_SIZE);
 
 		SAFECOPY(mail->host_name
-			,iniReadString(fp,section,strHostName,global->host_name,value));
+			,iniGetString(list,section,strHostName,global->host_name,value));
 
 		SAFECOPY(mail->temp_dir
-			,iniReadString(fp,section,strTempDirectory,mail->temp_dir,value));
+			,iniGetString(list,section,strTempDirectory,mail->temp_dir,value));
 
 		SAFECOPY(mail->relay_server
-			,iniReadString(fp,section,"RelayServer",mail->relay_server,value));
+			,iniGetString(list,section,"RelayServer",mail->relay_server,value));
 		SAFECOPY(mail->relay_user
-			,iniReadString(fp,section,"RelayUsername",mail->relay_user,value));
+			,iniGetString(list,section,"RelayUsername",mail->relay_user,value));
 		SAFECOPY(mail->relay_pass
-			,iniReadString(fp,section,"RelayPassword",mail->relay_pass,value));
+			,iniGetString(list,section,"RelayPassword",mail->relay_pass,value));
 
 		SAFECOPY(mail->dns_server
-			,iniReadString(fp,section,"DNSServer",mail->dns_server,value));
+			,iniGetString(list,section,"DNSServer",mail->dns_server,value));
 
 		SAFECOPY(mail->default_user
-			,iniReadString(fp,section,"DefaultUser",nulstr,value));
+			,iniGetString(list,section,"DefaultUser",nulstr,value));
 
 		SAFECOPY(mail->dnsbl_hdr
-			,iniReadString(fp,section,"DNSBlacklistHeader","X-DNSBL",value));
+			,iniGetString(list,section,"DNSBlacklistHeader","X-DNSBL",value));
 		SAFECOPY(mail->dnsbl_tag
-			,iniReadString(fp,section,"DNSBlacklistSubject","SPAM",value));
+			,iniGetString(list,section,"DNSBlacklistSubject","SPAM",value));
 
 		SAFECOPY(mail->pop3_sound
-			,iniReadString(fp,section,"POP3Sound",nulstr,value));
+			,iniGetString(list,section,"POP3Sound",nulstr,value));
 		SAFECOPY(mail->inbound_sound
-			,iniReadString(fp,section,"InboundSound",nulstr,value));
+			,iniGetString(list,section,"InboundSound",nulstr,value));
 		SAFECOPY(mail->outbound_sound
-			,iniReadString(fp,section,"OutboundSound",nulstr,value));
+			,iniGetString(list,section,"OutboundSound",nulstr,value));
 
 		/* JavaScript Operating Parameters */
-		sbbs_read_js_settings(fp, section, &mail->js, &global->js);
+		sbbs_get_js_settings(list, section, &mail->js, &global->js);
 
 		mail->log_mask
-			=iniReadBitField(fp,section,strLogMask,log_mask_bits,global->log_mask);
+			=iniGetBitField(list,section,strLogMask,log_mask_bits,global->log_mask);
 		mail->options
-			=iniReadBitField(fp,section,strOptions,mail_options
+			=iniGetBitField(list,section,strOptions,mail_options
 				,MAIL_OPT_ALLOW_POP3);
 
-		mail->bind_retry_count=iniReadInteger(fp,section,strBindRetryCount,global->bind_retry_count);
-		mail->bind_retry_delay=iniReadInteger(fp,section,strBindRetryDelay,global->bind_retry_delay);
+		mail->bind_retry_count=iniGetInteger(list,section,strBindRetryCount,global->bind_retry_count);
+		mail->bind_retry_delay=iniGetInteger(list,section,strBindRetryDelay,global->bind_retry_delay);
 	}
 
 	/***********************************************************************/
 	section = "Services";
 
 	if(run_services!=NULL)
-		*run_services=iniReadBool(fp,section,strAutoStart,TRUE);
+		*run_services=iniGetBool(list,section,strAutoStart,TRUE);
 
 	if(services!=NULL) {
 
 		services->interface_addr
-			=iniReadIpAddress(fp,section,strInterface,global->interface_addr);
+			=iniGetIpAddress(list,section,strInterface,global->interface_addr);
 
 		services->sem_chk_freq
-			=iniReadShortInt(fp,section,strSemFileCheckFrequency,global->sem_chk_freq);
+			=iniGetShortInt(list,section,strSemFileCheckFrequency,global->sem_chk_freq);
 
 		/* JavaScript operating parameters */
-		sbbs_read_js_settings(fp, section, &services->js, &global->js);
+		sbbs_get_js_settings(list, section, &services->js, &global->js);
 
 		SAFECOPY(services->host_name
-			,iniReadString(fp,section,strHostName,global->host_name,value));
+			,iniGetString(list,section,strHostName,global->host_name,value));
 
 		SAFECOPY(services->temp_dir
-			,iniReadString(fp,section,strTempDirectory,services->temp_dir,value));
+			,iniGetString(list,section,strTempDirectory,services->temp_dir,value));
 
 		SAFECOPY(services->answer_sound
-			,iniReadString(fp,section,strAnswerSound,nulstr,value));
+			,iniGetString(list,section,strAnswerSound,nulstr,value));
 		SAFECOPY(services->hangup_sound
-			,iniReadString(fp,section,strHangupSound,nulstr,value));
+			,iniGetString(list,section,strHangupSound,nulstr,value));
 
 		services->log_mask
-			=iniReadBitField(fp,section,strLogMask,log_mask_bits,global->log_mask);
+			=iniGetBitField(list,section,strLogMask,log_mask_bits,global->log_mask);
 		services->options
-			=iniReadBitField(fp,section,strOptions,service_options
+			=iniGetBitField(list,section,strOptions,service_options
 				,BBS_OPT_NO_HOST_LOOKUP);
 
-		services->bind_retry_count=iniReadInteger(fp,section,strBindRetryCount,global->bind_retry_count);
-		services->bind_retry_delay=iniReadInteger(fp,section,strBindRetryDelay,global->bind_retry_delay);
+		services->bind_retry_count=iniGetInteger(list,section,strBindRetryCount,global->bind_retry_count);
+		services->bind_retry_delay=iniGetInteger(list,section,strBindRetryDelay,global->bind_retry_delay);
 	}
 
 	/***********************************************************************/
 	section = "Web";
 
 	if(run_web!=NULL)
-		*run_web=iniReadBool(fp,section,strAutoStart,FALSE);
+		*run_web=iniGetBool(list,section,strAutoStart,FALSE);
 
 	if(web!=NULL) {
 
 		web->interface_addr
-			=iniReadIpAddress(fp,section,strInterface,global->interface_addr);
+			=iniGetIpAddress(list,section,strInterface,global->interface_addr);
 		web->port
-			=iniReadShortInt(fp,section,strPort,IPPORT_HTTP);
+			=iniGetShortInt(list,section,strPort,IPPORT_HTTP);
 		web->max_clients
-			=iniReadShortInt(fp,section,strMaxClients,10);
+			=iniGetShortInt(list,section,strMaxClients,10);
 		web->max_inactivity
-			=iniReadShortInt(fp,section,strMaxInactivity,120);		/* seconds */
+			=iniGetShortInt(list,section,strMaxInactivity,120);		/* seconds */
 		web->sem_chk_freq
-			=iniReadShortInt(fp,section,strSemFileCheckFrequency,global->sem_chk_freq);
+			=iniGetShortInt(list,section,strSemFileCheckFrequency,global->sem_chk_freq);
 
 		/* JavaScript operating parameters */
-		sbbs_read_js_settings(fp, section, &web->js, &global->js);
+		sbbs_get_js_settings(list, section, &web->js, &global->js);
 
 		SAFECOPY(web->host_name
-			,iniReadString(fp,section,strHostName,global->host_name,value));
+			,iniGetString(list,section,strHostName,global->host_name,value));
 
 		SAFECOPY(web->temp_dir
-			,iniReadString(fp,section,strTempDirectory,web->temp_dir,value));
+			,iniGetString(list,section,strTempDirectory,web->temp_dir,value));
 
 		SAFECOPY(web->root_dir
-			,iniReadString(fp,section,"RootDirectory",WEB_DEFAULT_ROOT_DIR,value));
+			,iniGetString(list,section,"RootDirectory",WEB_DEFAULT_ROOT_DIR,value));
 		SAFECOPY(web->error_dir
-			,iniReadString(fp,section,"ErrorDirectory",WEB_DEFAULT_ERROR_DIR,value));
+			,iniGetString(list,section,"ErrorDirectory",WEB_DEFAULT_ERROR_DIR,value));
 		SAFECOPY(web->cgi_dir
-			,iniReadString(fp,section,"CGIDirectory",WEB_DEFAULT_CGI_DIR,value));
+			,iniGetString(list,section,"CGIDirectory",WEB_DEFAULT_CGI_DIR,value));
 		SAFECOPY(web->logfile_base
-			,iniReadString(fp,section,"HttpLogFile",nulstr,value));
+			,iniGetString(list,section,"HttpLogFile",nulstr,value));
 
 		SAFECOPY(web->default_cgi_content
-			,iniReadString(fp,section,"DefaultCGIContent",WEB_DEFAULT_CGI_CONTENT,value));
+			,iniGetString(list,section,"DefaultCGIContent",WEB_DEFAULT_CGI_CONTENT,value));
 
 		iniFreeStringList(web->index_file_name);
 		web->index_file_name
-			=iniReadStringList(fp,section,"IndexFileNames", "," ,"index.html,index.ssjs");
+			=iniGetStringList(list,section,"IndexFileNames", "," ,"index.html,index.ssjs");
 		iniFreeStringList(web->cgi_ext);
 		web->cgi_ext
-			=iniReadStringList(fp,section,"CGIExtensions", "," ,".cgi");
+			=iniGetStringList(list,section,"CGIExtensions", "," ,".cgi");
 		SAFECOPY(web->ssjs_ext
-			,iniReadString(fp,section,"JavaScriptExtension",".ssjs",value));
+			,iniGetString(list,section,"JavaScriptExtension",".ssjs",value));
 		SAFECOPY(web->js_ext
-			,iniReadString(fp,section,"EmbJavaScriptExtension",".bbs",value));
+			,iniGetString(list,section,"EmbJavaScriptExtension",".bbs",value));
 
 		web->max_inactivity
-			=iniReadShortInt(fp,section,strMaxInactivity,120);		/* seconds */
+			=iniGetShortInt(list,section,strMaxInactivity,120);		/* seconds */
 		web->max_cgi_inactivity
-			=iniReadShortInt(fp,section,"MaxCgiInactivity",120);	/* seconds */
+			=iniGetShortInt(list,section,"MaxCgiInactivity",120);	/* seconds */
 
 		SAFECOPY(web->answer_sound
-			,iniReadString(fp,section,strAnswerSound,nulstr,value));
+			,iniGetString(list,section,strAnswerSound,nulstr,value));
 		SAFECOPY(web->hangup_sound
-			,iniReadString(fp,section,strHangupSound,nulstr,value));
+			,iniGetString(list,section,strHangupSound,nulstr,value));
 		SAFECOPY(web->hack_sound
-			,iniReadString(fp,section,strHackAttemptSound,nulstr,value));
+			,iniGetString(list,section,strHackAttemptSound,nulstr,value));
 
 		web->log_mask
-			=iniReadBitField(fp,section,strLogMask,log_mask_bits,global->log_mask);
+			=iniGetBitField(list,section,strLogMask,log_mask_bits,global->log_mask);
 		web->options
-			=iniReadBitField(fp,section,strOptions,web_options
+			=iniGetBitField(list,section,strOptions,web_options
 				,BBS_OPT_NO_HOST_LOOKUP | WEB_OPT_HTTP_LOGGING);
 
-		web->bind_retry_count=iniReadInteger(fp,section,strBindRetryCount,global->bind_retry_count);
-		web->bind_retry_delay=iniReadInteger(fp,section,strBindRetryDelay,global->bind_retry_delay);
+		web->bind_retry_count=iniGetInteger(list,section,strBindRetryCount,global->bind_retry_count);
+		web->bind_retry_delay=iniGetInteger(list,section,strBindRetryDelay,global->bind_retry_delay);
 	}
+
+	iniFreeStringList(list);
 }
 
 BOOL sbbs_write_ini(
@@ -636,17 +641,17 @@ BOOL sbbs_write_ini(
 	ini_style_t style;
 	global_startup_t	global_buf;
 
-	if(global==NULL) {
-		read_ini_globals(fp, &global_buf);
-		global = &global_buf;
-	}
-	
 	memset(&style, 0, sizeof(style));
 	style.key_prefix = "\t";
     style.bit_separator = " | ";
 
 	if((list=iniReadFile(fp))==NULL)
 		return(FALSE);
+
+	if(global==NULL) {
+		get_ini_globals(list, &global_buf);
+		global = &global_buf;
+	}
 	
 	lp=&list;
 
@@ -1112,7 +1117,7 @@ BOOL sbbs_write_ini(
 
 	} while(0);	/* finally */
 
-	strListFree(&list);
+	iniFreeStringList(list);
 
 	return(result);
 }
diff --git a/src/sbbs3/sbbs_ini.h b/src/sbbs3/sbbs_ini.h
index 5112af11a911dfd22f3010f4dabc33775854ab96..a7dff8ac12cd806e2b5ed7ed2348798e73c882a3 100644
--- a/src/sbbs3/sbbs_ini.h
+++ b/src/sbbs3/sbbs_ini.h
@@ -1,6 +1,6 @@
 /* sbbs_ini.h */
 
-/* Synchronet console configuration (.ini) file routines */
+/* Synchronet initialization (.ini) file routines */
 
 /* $Id$ */
 
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -71,8 +71,8 @@ void sbbs_read_ini(
 	,services_startup_t*	services_startup
 	);
 
-void sbbs_read_js_settings(
-	 FILE* fp
+void sbbs_get_js_settings(
+	 str_list_t list
 	,const char* section
 	,js_startup_t* js
 	,js_startup_t* defaults
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 5ed7b4328bbba437801f12d9be4660a058ca512e..1f9109c741f25242a911a18198952045563fac9f 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -1433,6 +1433,7 @@ static service_t* read_services_ini(service_t* service, DWORD* services)
 	char		prot[INI_MAX_VALUE_LEN];
 	char		services_ini[MAX_PATH+1];
 	char**		sec_list;
+	str_list_t	list;
 	service_t*	np;
 	service_t	serv;
 	int			log_level;
@@ -1445,23 +1446,26 @@ static service_t* read_services_ini(service_t* service, DWORD* services)
 	}
 
 	lprintf(LOG_INFO,"Reading %s",services_ini);
-	log_level = iniReadLogLevel(fp,ROOT_SECTION,"LogLevel",LOG_DEBUG);
-	sec_list = iniReadSectionList(fp,"");
+	list=iniReadFile(fp);
+	fclose(fp);
+
+	log_level = iniGetLogLevel(list,ROOT_SECTION,"LogLevel",LOG_DEBUG);
+	sec_list = iniGetSectionList(list,"");
     for(i=0; sec_list!=NULL && sec_list[i]!=NULL; i++) {
 		memset(&serv,0,sizeof(service_t));
-		SAFECOPY(serv.protocol,iniReadString(fp,sec_list[i],"Protocol",sec_list[i],prot));
+		SAFECOPY(serv.protocol,iniGetString(list,sec_list[i],"Protocol",sec_list[i],prot));
 		serv.socket=INVALID_SOCKET;
-		serv.interface_addr=iniReadIpAddress(fp,sec_list[i],"Interface",startup->interface_addr);
-		serv.port=iniReadShortInt(fp,sec_list[i],"Port",0);
-		serv.max_clients=iniReadInteger(fp,sec_list[i],"MaxClients",0);
-		serv.listen_backlog=iniReadInteger(fp,sec_list[i],"ListenBacklog",DEFAULT_LISTEN_BACKLOG);
-		serv.stack_size=iniReadInteger(fp,sec_list[i],"StackSize",0);
-		serv.options=iniReadBitField(fp,sec_list[i],"Options",service_options,0);
-		serv.log_level = iniReadLogLevel(fp,sec_list[i],"LogLevel",log_level);
-		SAFECOPY(serv.cmd,iniReadString(fp,sec_list[i],"Command","",cmd));
+		serv.interface_addr=iniGetIpAddress(list,sec_list[i],"Interface",startup->interface_addr);
+		serv.port=iniGetShortInt(list,sec_list[i],"Port",0);
+		serv.max_clients=iniGetInteger(list,sec_list[i],"MaxClients",0);
+		serv.listen_backlog=iniGetInteger(list,sec_list[i],"ListenBacklog",DEFAULT_LISTEN_BACKLOG);
+		serv.stack_size=iniGetInteger(list,sec_list[i],"StackSize",0);
+		serv.options=iniGetBitField(list,sec_list[i],"Options",service_options,0);
+		serv.log_level = iniGetLogLevel(list,sec_list[i],"LogLevel",log_level);
+		SAFECOPY(serv.cmd,iniGetString(list,sec_list[i],"Command","",cmd));
 
 		/* JavaScript operating parameters */
-		sbbs_read_js_settings(fp, sec_list[i], &serv.js, &startup->js);
+		sbbs_get_js_settings(list, sec_list[i], &serv.js, &startup->js);
 
 		for(j=0;j<*services;j++)
 			if(service[j].interface_addr==serv.interface_addr && service[j].port==serv.port
@@ -1472,11 +1476,11 @@ static service_t* read_services_ini(service_t* service, DWORD* services)
 			continue;
 		}
 
-		if(stricmp(iniReadString(fp,sec_list[i],"Host",startup->host_name,host), startup->host_name)!=0) {
+		if(stricmp(iniGetString(list,sec_list[i],"Host",startup->host_name,host), startup->host_name)!=0) {
 			lprintf(LOG_NOTICE,"Ignoring service (%s) for host: %s", sec_list[i], host);
 			continue;
 		}
-		if(stricmp(iniReadString(fp,sec_list[i],"NotHost","",host), startup->host_name)==0) {
+		if(stricmp(iniGetString(list,sec_list[i],"NotHost","",host), startup->host_name)==0) {
 			lprintf(LOG_NOTICE,"Ignoring service (%s) not for host: %s", sec_list[i], host);
 			continue;
 		}
@@ -1491,8 +1495,7 @@ static service_t* read_services_ini(service_t* service, DWORD* services)
 		(*services)++;
 	}
 	iniFreeStringList(sec_list);
-
-	fclose(fp);
+	strListFree(&list);
 
 	return(service);
 }