diff --git a/src/sbbs3/sbbs_ini.c b/src/sbbs3/sbbs_ini.c
index 386a1539c997c4d0b7ebc3c1dfb07b14d0eecf8a..280a2f6f855488df9500fdd3bd2985307e843d18 100644
--- a/src/sbbs3/sbbs_ini.c
+++ b/src/sbbs3/sbbs_ini.c
@@ -166,257 +166,272 @@ void sbbs_read_ini(
 	ctrl_dir=iniGetString(fp,section,"CtrlDirectory",nulstr);
 	if(*ctrl_dir) {
 		backslash(ctrl_dir);
-		SAFECOPY(bbs->ctrl_dir,ctrl_dir);
-		SAFECOPY(ftp->ctrl_dir,ctrl_dir);
-		SAFECOPY(mail->ctrl_dir,ctrl_dir);
-		SAFECOPY(services->ctrl_dir,ctrl_dir);
+		if(bbs!=NULL)		SAFECOPY(bbs->ctrl_dir,ctrl_dir);
+		if(ftp!=NULL)		SAFECOPY(ftp->ctrl_dir,ctrl_dir);
+		if(mail!=NULL)		SAFECOPY(mail->ctrl_dir,ctrl_dir);
+		if(services!=NULL)	SAFECOPY(services->ctrl_dir,ctrl_dir);
 	}
 	temp_dir=iniGetString(fp,section,"TempDirectory",nulstr);
 	if(*temp_dir) {
 		backslash(temp_dir);
-		SAFECOPY(bbs->temp_dir,temp_dir);
-		SAFECOPY(ftp->temp_dir,temp_dir);
+		if(bbs!=NULL)		SAFECOPY(bbs->temp_dir,temp_dir);
+		if(ftp!=NULL)		SAFECOPY(ftp->temp_dir,temp_dir);
 	}
 
 	SAFECOPY(host_name,iniGetString(fp,section,"HostName",nulstr));
 	js_max_bytes=iniGetInteger(fp,section,"JavaScriptMaxBytes",0);
 																		
 	/***********************************************************************/
-	section = "BBS";
-
-	*run_bbs
-		=iniGetBool(fp,section,"AutoStart",TRUE);
-
-	bbs->telnet_interface
-		=iniGetIpAddress(fp,section,"TelnetInterface",INADDR_ANY);
-	bbs->telnet_port
-		=iniGetShortInt(fp,section,"TelnetPort",IPPORT_TELNET);
-
-	bbs->rlogin_interface
-		=iniGetIpAddress(fp,section,"RLoginInterface",INADDR_ANY);
-	bbs->rlogin_port
-		=iniGetShortInt(fp,section,"RLoginPort",513);
-
-	bbs->first_node
-		=iniGetShortInt(fp,section,"FirstNode",1);
-	bbs->last_node
-		=iniGetShortInt(fp,section,"LastNode",4);
-
-	bbs->outbuf_highwater_mark
-		=iniGetShortInt(fp,section,"OutbufHighwaterMark",1024);
-	bbs->outbuf_drain_timeout
-		=iniGetShortInt(fp,section,"OutbufDrainTimeout",10);
-
-	bbs->xtrn_polls_before_yield
-		=iniGetInteger(fp,section,"ExternalYield",10);
-	bbs->js_max_bytes
-		=iniGetInteger(fp,section,"JavaScriptMaxBytes",js_max_bytes);
-
-	SAFECOPY(bbs->host_name
-		,iniGetString(fp,section,"HostName",host_name));
-
-	/* Set default terminal type to "stock" termcap closest to "ansi-bbs" */
-#if defined(__FreeBSD__)
-	default_term_ansi="cons25";
-#else
-	default_term_ansi="pc3";
-#endif
-
-	SAFECOPY(bbs->xtrn_term_ansi
-		,iniGetString(fp,section,"ExternalTermANSI",default_term_ansi));
-	SAFECOPY(bbs->xtrn_term_dumb
-		,iniGetString(fp,section,"ExternalTermDumb","dumb"));
-
-#if defined(__FreeBSD__)
-	default_dosemu_path="/usr/bin/doscmd";
-#else
-	default_dosemu_path="/usr/bin/dosemu.bin";
-#endif
-
-	SAFECOPY(bbs->dosemu_path
-		,iniGetString(fp,section,"DOSemuPath",default_dosemu_path));
-
-	SAFECOPY(bbs->answer_sound
-		,iniGetString(fp,section,"AnswerSound",nulstr));
-	SAFECOPY(bbs->hangup_sound
-		,iniGetString(fp,section,"HangupSound",nulstr));
-
-	bbs->options
-		=iniGetBitField(fp,section,"Options",bbs_options
-			,BBS_OPT_XTRN_MINIMIZED|BBS_OPT_SYSOP_AVAILABLE);
+	if(bbs!=NULL) {
+
+		section = "BBS";
+
+		*run_bbs
+			=iniGetBool(fp,section,"AutoStart",TRUE);
+
+		bbs->telnet_interface
+			=iniGetIpAddress(fp,section,"TelnetInterface",INADDR_ANY);
+		bbs->telnet_port
+			=iniGetShortInt(fp,section,"TelnetPort",IPPORT_TELNET);
+
+		bbs->rlogin_interface
+			=iniGetIpAddress(fp,section,"RLoginInterface",INADDR_ANY);
+		bbs->rlogin_port
+			=iniGetShortInt(fp,section,"RLoginPort",513);
+
+		bbs->first_node
+			=iniGetShortInt(fp,section,"FirstNode",1);
+		bbs->last_node
+			=iniGetShortInt(fp,section,"LastNode",4);
+
+		bbs->outbuf_highwater_mark
+			=iniGetShortInt(fp,section,"OutbufHighwaterMark",1024);
+		bbs->outbuf_drain_timeout
+			=iniGetShortInt(fp,section,"OutbufDrainTimeout",10);
+
+		bbs->xtrn_polls_before_yield
+			=iniGetInteger(fp,section,"ExternalYield",10);
+		bbs->js_max_bytes
+			=iniGetInteger(fp,section,"JavaScriptMaxBytes",js_max_bytes);
+
+		SAFECOPY(bbs->host_name
+			,iniGetString(fp,section,"HostName",host_name));
+
+		/* Set default terminal type to "stock" termcap closest to "ansi-bbs" */
+	#if defined(__FreeBSD__)
+		default_term_ansi="cons25";
+	#else
+		default_term_ansi="pc3";
+	#endif
+
+		SAFECOPY(bbs->xtrn_term_ansi
+			,iniGetString(fp,section,"ExternalTermANSI",default_term_ansi));
+		SAFECOPY(bbs->xtrn_term_dumb
+			,iniGetString(fp,section,"ExternalTermDumb","dumb"));
+
+	#if defined(__FreeBSD__)
+		default_dosemu_path="/usr/bin/doscmd";
+	#else
+		default_dosemu_path="/usr/bin/dosemu.bin";
+	#endif
+
+		SAFECOPY(bbs->dosemu_path
+			,iniGetString(fp,section,"DOSemuPath",default_dosemu_path));
+
+		SAFECOPY(bbs->answer_sound
+			,iniGetString(fp,section,"AnswerSound",nulstr));
+		SAFECOPY(bbs->hangup_sound
+			,iniGetString(fp,section,"HangupSound",nulstr));
+
+		bbs->options
+			=iniGetBitField(fp,section,"Options",bbs_options
+				,BBS_OPT_XTRN_MINIMIZED|BBS_OPT_SYSOP_AVAILABLE);
+	}
 
 	/***********************************************************************/
-	section = "FTP";
-
-	*run_ftp
-		=iniGetBool(fp,section,"AutoStart",TRUE);
-
-	ftp->interface_addr
-		=iniGetIpAddress(fp,section,"Interface",INADDR_ANY);
-	ftp->port
-		=iniGetShortInt(fp,section,"Port",ftp->port);
-	ftp->max_clients
-		=iniGetShortInt(fp,section,"MaxClients",10);
-	ftp->max_inactivity
-		=iniGetShortInt(fp,section,"MaxInactivity",300);	/* seconds */
-	ftp->qwk_timeout
-		=iniGetShortInt(fp,section,"QwkTimeout",600);		/* seconds */
-	ftp->js_max_bytes
-		=iniGetInteger(fp,section,"JavaScriptMaxBytes",js_max_bytes);
-
-	SAFECOPY(ftp->host_name
-		,iniGetString(fp,section,"HostName",host_name));
-
-	SAFECOPY(ftp->index_file_name
-		,iniGetString(fp,section,"IndexFileName","00index"));
-	SAFECOPY(ftp->html_index_file
-		,iniGetString(fp,section,"HtmlIndexFile","00index.html"));
-	SAFECOPY(ftp->html_index_script
-		,iniGetString(fp,section,"HtmlIndexScript","ftp-html.js"));
-
-	SAFECOPY(ftp->answer_sound
-		,iniGetString(fp,section,"AnswerSound",nulstr));
-	SAFECOPY(ftp->hangup_sound
-		,iniGetString(fp,section,"HangupSound",nulstr));
-	SAFECOPY(ftp->hack_sound
-		,iniGetString(fp,section,"HackAttemptSound",nulstr));
-
-	ftp->options
-		=iniGetBitField(fp,section,"Options",ftp_options
-			,FTP_OPT_INDEX_FILE|FTP_OPT_HTML_INDEX_FILE|FTP_OPT_ALLOW_QWK);
+	if(ftp!=NULL) {
+
+		section = "FTP";
+
+		*run_ftp
+			=iniGetBool(fp,section,"AutoStart",TRUE);
+
+		ftp->interface_addr
+			=iniGetIpAddress(fp,section,"Interface",INADDR_ANY);
+		ftp->port
+			=iniGetShortInt(fp,section,"Port",ftp->port);
+		ftp->max_clients
+			=iniGetShortInt(fp,section,"MaxClients",10);
+		ftp->max_inactivity
+			=iniGetShortInt(fp,section,"MaxInactivity",300);	/* seconds */
+		ftp->qwk_timeout
+			=iniGetShortInt(fp,section,"QwkTimeout",600);		/* seconds */
+		ftp->js_max_bytes
+			=iniGetInteger(fp,section,"JavaScriptMaxBytes",js_max_bytes);
+
+		SAFECOPY(ftp->host_name
+			,iniGetString(fp,section,"HostName",host_name));
+
+		SAFECOPY(ftp->index_file_name
+			,iniGetString(fp,section,"IndexFileName","00index"));
+		SAFECOPY(ftp->html_index_file
+			,iniGetString(fp,section,"HtmlIndexFile","00index.html"));
+		SAFECOPY(ftp->html_index_script
+			,iniGetString(fp,section,"HtmlIndexScript","ftp-html.js"));
+
+		SAFECOPY(ftp->answer_sound
+			,iniGetString(fp,section,"AnswerSound",nulstr));
+		SAFECOPY(ftp->hangup_sound
+			,iniGetString(fp,section,"HangupSound",nulstr));
+		SAFECOPY(ftp->hack_sound
+			,iniGetString(fp,section,"HackAttemptSound",nulstr));
+
+		ftp->options
+			=iniGetBitField(fp,section,"Options",ftp_options
+				,FTP_OPT_INDEX_FILE|FTP_OPT_HTML_INDEX_FILE|FTP_OPT_ALLOW_QWK);
+	}
 
 	/***********************************************************************/
-	section = "Mail";
-
-	*run_mail
-		=iniGetBool(fp,section,"AutoStart",TRUE);
-
-	mail->interface_addr
-		=iniGetIpAddress(fp,section,"Interface",INADDR_ANY);
-	mail->smtp_port
-		=iniGetShortInt(fp,section,"SMTPPort",IPPORT_SMTP);
-	mail->pop3_port
-		=iniGetShortInt(fp,section,"POP3Port",IPPORT_POP3);
-	mail->relay_port
-		=iniGetShortInt(fp,section,"RelayPort",IPPORT_SMTP);
-	mail->max_clients
-		=iniGetShortInt(fp,section,"MaxClients",10);
-	mail->max_inactivity
-		=iniGetShortInt(fp,section,"MaxInactivity",120);		/* seconds */
-	mail->max_delivery_attempts
-		=iniGetShortInt(fp,section,"MaxDeliveryAttempts",50);
-	mail->rescan_frequency
-		=iniGetShortInt(fp,section,"RescanFrequency",3600);	/* 60 minutes */
-	mail->lines_per_yield
-		=iniGetShortInt(fp,section,"LinesPerYield",10);
-	mail->max_recipients
-		=iniGetShortInt(fp,section,"MaxRecipients",100);
-	mail->max_msg_size
-		=iniGetInteger(fp,section,"MaxMsgSize",10*1024*1024);	/* 10MB */
-
-	SAFECOPY(mail->host_name
-		,iniGetString(fp,section,"HostName",host_name));
-
-	SAFECOPY(mail->relay_server
-		,iniGetString(fp,section,"RelayServer",mail->relay_server));
-	SAFECOPY(mail->dns_server
-		,iniGetString(fp,section,"DNSServer",mail->dns_server));
-
-	SAFECOPY(mail->default_user
-		,iniGetString(fp,section,"DefaultUser",nulstr));
-
-	SAFECOPY(mail->dnsbl_hdr
-		,iniGetString(fp,section,"DNSBlacklistHeader","X-DNSBL"));
-	SAFECOPY(mail->dnsbl_tag
-		,iniGetString(fp,section,"DNSBlacklistSubject","SPAM"));
-
-	SAFECOPY(mail->pop3_sound
-		,iniGetString(fp,section,"POP3Sound",nulstr));
-	SAFECOPY(mail->inbound_sound
-		,iniGetString(fp,section,"InboundSound",nulstr));
-	SAFECOPY(mail->outbound_sound
-		,iniGetString(fp,section,"OutboundSound",nulstr));
-
-	SAFECOPY(mail->proc_cfg_file
-		,iniGetString(fp,section,"ProcessConfigFile","mailproc.cfg"));
-
-	mail->options
-		=iniGetBitField(fp,section,"Options",mail_options
-			,MAIL_OPT_ALLOW_POP3);
+	if(mail!=NULL) {
+
+		section = "Mail";
+
+		*run_mail
+			=iniGetBool(fp,section,"AutoStart",TRUE);
+
+		mail->interface_addr
+			=iniGetIpAddress(fp,section,"Interface",INADDR_ANY);
+		mail->smtp_port
+			=iniGetShortInt(fp,section,"SMTPPort",IPPORT_SMTP);
+		mail->pop3_port
+			=iniGetShortInt(fp,section,"POP3Port",IPPORT_POP3);
+		mail->relay_port
+			=iniGetShortInt(fp,section,"RelayPort",IPPORT_SMTP);
+		mail->max_clients
+			=iniGetShortInt(fp,section,"MaxClients",10);
+		mail->max_inactivity
+			=iniGetShortInt(fp,section,"MaxInactivity",120);		/* seconds */
+		mail->max_delivery_attempts
+			=iniGetShortInt(fp,section,"MaxDeliveryAttempts",50);
+		mail->rescan_frequency
+			=iniGetShortInt(fp,section,"RescanFrequency",3600);	/* 60 minutes */
+		mail->lines_per_yield
+			=iniGetShortInt(fp,section,"LinesPerYield",10);
+		mail->max_recipients
+			=iniGetShortInt(fp,section,"MaxRecipients",100);
+		mail->max_msg_size
+			=iniGetInteger(fp,section,"MaxMsgSize",10*1024*1024);	/* 10MB */
+
+		SAFECOPY(mail->host_name
+			,iniGetString(fp,section,"HostName",host_name));
+
+		SAFECOPY(mail->relay_server
+			,iniGetString(fp,section,"RelayServer",mail->relay_server));
+		SAFECOPY(mail->dns_server
+			,iniGetString(fp,section,"DNSServer",mail->dns_server));
+
+		SAFECOPY(mail->default_user
+			,iniGetString(fp,section,"DefaultUser",nulstr));
+
+		SAFECOPY(mail->dnsbl_hdr
+			,iniGetString(fp,section,"DNSBlacklistHeader","X-DNSBL"));
+		SAFECOPY(mail->dnsbl_tag
+			,iniGetString(fp,section,"DNSBlacklistSubject","SPAM"));
+
+		SAFECOPY(mail->pop3_sound
+			,iniGetString(fp,section,"POP3Sound",nulstr));
+		SAFECOPY(mail->inbound_sound
+			,iniGetString(fp,section,"InboundSound",nulstr));
+		SAFECOPY(mail->outbound_sound
+			,iniGetString(fp,section,"OutboundSound",nulstr));
+
+		SAFECOPY(mail->proc_cfg_file
+			,iniGetString(fp,section,"ProcessConfigFile","mailproc.cfg"));
+
+		mail->options
+			=iniGetBitField(fp,section,"Options",mail_options
+				,MAIL_OPT_ALLOW_POP3);
+	}
 
 	/***********************************************************************/
-	section = "Services";
+	if(services!=NULL) {
 
-	*run_services
-		=iniGetBool(fp,section,"AutoStart",TRUE);
+		section = "Services";
 
-	services->interface_addr
-		=iniGetIpAddress(fp,section,"Interface",INADDR_ANY);
+		*run_services
+			=iniGetBool(fp,section,"AutoStart",TRUE);
 
-	services->js_max_bytes
-		=iniGetInteger(fp,section,"JavaScriptMaxBytes",js_max_bytes);
+		services->interface_addr
+			=iniGetIpAddress(fp,section,"Interface",INADDR_ANY);
 
-	SAFECOPY(services->host_name
-		,iniGetString(fp,section,"HostName",host_name));
+		services->js_max_bytes
+			=iniGetInteger(fp,section,"JavaScriptMaxBytes",js_max_bytes);
 
-	SAFECOPY(services->cfg_file
-		,iniGetString(fp,section,"ConfigFile","services.cfg"));
+		SAFECOPY(services->host_name
+			,iniGetString(fp,section,"HostName",host_name));
 
-	SAFECOPY(services->answer_sound
-		,iniGetString(fp,section,"AnswerSound",nulstr));
-	SAFECOPY(services->hangup_sound
-		,iniGetString(fp,section,"HangupSound",nulstr));
+		SAFECOPY(services->cfg_file
+			,iniGetString(fp,section,"ConfigFile","services.cfg"));
 
-	services->options
-		=iniGetBitField(fp,section,"Options",service_options
-			,BBS_OPT_NO_HOST_LOOKUP);
+		SAFECOPY(services->answer_sound
+			,iniGetString(fp,section,"AnswerSound",nulstr));
+		SAFECOPY(services->hangup_sound
+			,iniGetString(fp,section,"HangupSound",nulstr));
+
+		services->options
+			=iniGetBitField(fp,section,"Options",service_options
+				,BBS_OPT_NO_HOST_LOOKUP);
+	}
 
 	/***********************************************************************/
-	section = "Web";
-
-	*run_web
-		=iniGetBool(fp,section,"AutoStart",FALSE);
-
-	web->interface_addr
-		=iniGetIpAddress(fp,section,"Interface",INADDR_ANY);
-	web->port
-		=iniGetShortInt(fp,section,"Port",IPPORT_HTTP);
-	web->js_max_bytes
-		=iniGetInteger(fp,section,"JavaScriptMaxBytes",js_max_bytes);
-
-	SAFECOPY(web->host_name
-		,iniGetString(fp,section,"HostName",host_name));
-
-	SAFECOPY(web->root_dir
-		,iniGetString(fp,section,"RootDirectory","../html"));
-	SAFECOPY(web->error_dir
-		,iniGetString(fp,section,"ErrorDirectory","../html/error"));
-
-	iniFreeStringList(web->index_file_name);
-	web->index_file_name
-		=iniGetStringList(fp,section,"IndexFileNames", "," ,"index.html,index.ssjs");
-	iniFreeStringList(web->cgi_ext);
-	web->cgi_ext
-		=iniGetStringList(fp,section,"CGIExtensions", "," ,".cgi");
-	SAFECOPY(web->ssjs_ext
-		,iniGetString(fp,section,"JavaScriptExtension",".ssjs"));
-
-	web->max_inactivity
-		=iniGetShortInt(fp,section,"MaxInactivity",120);		/* seconds */
-	web->max_cgi_inactivity
-		=iniGetShortInt(fp,section,"MaxCgiInactivity",120);	/* seconds */
-
-
-#ifdef __unix__
-	default_cgi_temp = "/tmp";
-#else
-	if((default_cgi_temp = getenv("TEMP")) == NULL)
-		default_cgi_temp = nulstr;
-#endif
-	SAFECOPY(web->cgi_temp_dir
-		,iniGetString(fp,section,"CGITempDirectory",default_cgi_temp));
-
-	web->options
-		=iniGetBitField(fp,section,"Options",web_options
-			,BBS_OPT_NO_HOST_LOOKUP);
+	if(web!=NULL) {
+
+		section = "Web";
+
+		*run_web
+			=iniGetBool(fp,section,"AutoStart",FALSE);
+
+		web->interface_addr
+			=iniGetIpAddress(fp,section,"Interface",INADDR_ANY);
+		web->port
+			=iniGetShortInt(fp,section,"Port",IPPORT_HTTP);
+		web->js_max_bytes
+			=iniGetInteger(fp,section,"JavaScriptMaxBytes",js_max_bytes);
+
+		SAFECOPY(web->host_name
+			,iniGetString(fp,section,"HostName",host_name));
+
+		SAFECOPY(web->root_dir
+			,iniGetString(fp,section,"RootDirectory","../html"));
+		SAFECOPY(web->error_dir
+			,iniGetString(fp,section,"ErrorDirectory","../html/error"));
+
+		iniFreeStringList(web->index_file_name);
+		web->index_file_name
+			=iniGetStringList(fp,section,"IndexFileNames", "," ,"index.html,index.ssjs");
+		iniFreeStringList(web->cgi_ext);
+		web->cgi_ext
+			=iniGetStringList(fp,section,"CGIExtensions", "," ,".cgi");
+		SAFECOPY(web->ssjs_ext
+			,iniGetString(fp,section,"JavaScriptExtension",".ssjs"));
+
+		web->max_inactivity
+			=iniGetShortInt(fp,section,"MaxInactivity",120);		/* seconds */
+		web->max_cgi_inactivity
+			=iniGetShortInt(fp,section,"MaxCgiInactivity",120);	/* seconds */
+
+
+	#ifdef __unix__
+		default_cgi_temp = "/tmp";
+	#else
+		if((default_cgi_temp = getenv("TEMP")) == NULL)
+			default_cgi_temp = nulstr;
+	#endif
+		SAFECOPY(web->cgi_temp_dir
+			,iniGetString(fp,section,"CGITempDirectory",default_cgi_temp));
+
+		web->options
+			=iniGetBitField(fp,section,"Options",web_options
+				,BBS_OPT_NO_HOST_LOOKUP);
+	}
 }