From e19540b5bcf374b80ca04d9101915a1c4437b720 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 16 Sep 2003 04:03:24 +0000
Subject: [PATCH] Mail server now uses .ini-formatted recipient list file (much
 more flexible). Added support for routing to QWKnet uplink (e.g.
 vert!digital.man@youraddr.com)

---
 src/sbbs3/GNUmakefile  |  2 +-
 src/sbbs3/Makefile     |  2 +-
 src/sbbs3/mailsrvr.c   | 76 +++++++++++++++++++++++++-----------------
 src/sbbs3/mailsrvr.dsp |  4 +++
 4 files changed, 52 insertions(+), 32 deletions(-)

diff --git a/src/sbbs3/GNUmakefile b/src/sbbs3/GNUmakefile
index 3ce96f4a8f..0c4f23837d 100644
--- a/src/sbbs3/GNUmakefile
+++ b/src/sbbs3/GNUmakefile
@@ -272,7 +272,7 @@ CON_OBJS	= $(LIBODIR)/sbbscon.o $(LIBODIR)/conwrap.o \
 CON_LDFLAGS	= -lftpsrvr -lwebsrvr -lmailsrvr -lservices
 FTP_OBJS	= $(LIBODIR)/ftpsrvr.o
 MAIL_OBJS	= $(LIBODIR)/mailsrvr.o $(LIBODIR)/mxlookup.o \
- 		  $(LIBODIR)/mime.o $(LIBODIR)/base64.o
+ 		  $(LIBODIR)/mime.o $(LIBODIR)/base64.o $(LIBODIR)/ini_file.o
 WEB_OBJS	= $(LIBODIR)/websrvr.o $(LIBODIR)/sockwrap.o $(LIBODIR)/base64.o
 SERVICE_OBJS	= $(LIBODIR)/services.o $(LIBODIR)/ini_file.o
 
diff --git a/src/sbbs3/Makefile b/src/sbbs3/Makefile
index d52d287d14..85e9f589d1 100644
--- a/src/sbbs3/Makefile
+++ b/src/sbbs3/Makefile
@@ -108,7 +108,7 @@ $(SBBS): $(OBJS)
 		import32.lib cw32mt.lib ws2_32.lib
 
 # Mail Server DLL Link Rule
-$(MAILSRVR): mailsrvr.c mxlookup.c mime.c base64.c md5.c crc32.c $(SBBSLIB)
+$(MAILSRVR): mailsrvr.c mxlookup.c mime.c base64.c md5.c crc32.c ini_file.c $(SBBSLIB)
     @echo Creating $@
 	$(QUIET)$(CC) $(CFLAGS) -WD -WM -lGi -n$(LIBODIR) \
 		-DMAILSRVR_EXPORTS -DSMB_IMPORTS -DWRAPPER_IMPORTS $** $(LIBS)
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 378b4c1485..bbcbcc19e1 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -63,6 +63,7 @@
 #include "md5.h"
 #include "crc32.h"
 #include "base64.h"
+#include "ini_file.h"
 
 /* Constants */
 #define FORWARD			"forward:"
@@ -1505,6 +1506,9 @@ static void smtp_thread(void* arg)
 	int			rd;
 	char		str[512];
 	char		tmp[128];
+	char		value[INI_MAX_VALUE_LEN];
+	char**		sec_list;
+	char*		section;
 	char		buf[1024],*p,*tp,*cp;
 	char		hdrfield[512];
 	char		alias_buf[128];
@@ -2111,22 +2115,24 @@ static void smtp_thread(void* arg)
 					continue;
 				}
 
-				rcpt_count=0;
-				while(!feof(rcptlst) && rcpt_count<startup->max_recipients) {
+				sec_list=iniGetSectionList(rcptlst,NULL);	/* Each section is a recipient */
+				for(rcpt_count=0; sec_list!=NULL
+					&& sec_list[rcpt_count]!=NULL 
+					&& rcpt_count<startup->max_recipients; rcpt_count++) {
+
 					if((i=smb_copymsgmem(&smb,&newmsg,&msg))!=0) {
 						lprintf("%04d !SMTP ERROR %d (%s) copying message"
 							,socket, i, smb.last_error);
 						break;
 					}
-					if(fgets(str,sizeof(str),rcptlst)==NULL)
-						break;
-					usernum=atoi(str);
-					if(fgets(rcpt_name,sizeof(rcpt_name),rcptlst)==NULL)
-						break;
-					truncsp(rcpt_name);
-					if(fgets(rcpt_addr,sizeof(rcpt_addr),rcptlst)==NULL)
-						break;
-					truncsp(rcpt_addr);
+					
+					section=sec_list[rcpt_count];
+
+					SAFECOPY(rcpt_name,iniGetString(rcptlst,section	,smb_hfieldtype(RECIPIENT),"unknown",value));
+					usernum=iniGetInteger(rcptlst,section			,smb_hfieldtype(RECIPIENTEXT),0);
+					nettype=iniGetShortInt(rcptlst,section			,smb_hfieldtype(RECIPIENTNETTYPE),NET_NONE);
+					sprintf(str,"#%u",usernum);
+					SAFECOPY(rcpt_addr,iniGetString(rcptlst,section	,smb_hfieldtype(RECIPIENTNETADDR),str,value));
 
 					snprintf(hdrfield,sizeof(hdrfield),
 						"Received: from %s (%s [%s])\r\n"
@@ -2141,13 +2147,12 @@ static void smtp_thread(void* arg)
 
 					smb_hfield(&newmsg, RECIPIENT, (ushort)strlen(rcpt_name), rcpt_name);
 
-					if(rcpt_addr[0]=='#') {	/* Local destination */
-						newmsg.idx.to=atoi(rcpt_addr+1);
-						smb_hfield(&newmsg, RECIPIENTEXT
-							,(ushort)strlen(rcpt_addr+1), rcpt_addr+1);
+					if(nettype==NET_NONE) {	/* Local destination */
+						newmsg.idx.to=usernum;
+						sprintf(str,"%u",usernum);
+						smb_hfield(&newmsg, RECIPIENTEXT, (ushort)strlen(str), str);
 					} else {
 						newmsg.idx.to=0;
-						nettype=NET_INTERNET;
 						smb_hfield(&newmsg, RECIPIENTNETTYPE, sizeof(nettype), &nettype);
 						smb_hfield(&newmsg, RECIPIENTNETADDR
 							,(ushort)strlen(rcpt_addr), rcpt_addr);
@@ -2174,8 +2179,8 @@ static void smtp_thread(void* arg)
 						}
 						putsmsg(&scfg, usernum, str);
 					}
-					rcpt_count++;
 				}
+				iniFreeStringList(sec_list);
 				if(rcpt_count<1) {
 					smb_freemsg_dfields(&smb,&msg,SMB_ALL_REFS);
 					sockprintf(socket, "452 Insufficient system storage");
@@ -2648,13 +2653,13 @@ static void smtp_thread(void* arg)
 					lprintf("%04d SMTP %s relaying to external mail service: %s"
 						,socket, relay_user.alias, tp+1);
 
-					fprintf(rcptlst,"0\n%.*s\n%.*s\n"
-						,(int)sizeof(rcpt_name)-1,rcpt_addr
-						,(int)sizeof(rcpt_addr)-1,p);
-					
+					fprintf(rcptlst,"[%u]\n",rcpt_count++);
+					fprintf(rcptlst,"%s=%s\n",smb_hfieldtype(RECIPIENT),rcpt_addr);
+					fprintf(rcptlst,"%s=%u\n",smb_hfieldtype(RECIPIENTNETTYPE),NET_INTERNET);
+					fprintf(rcptlst,"%s=%s\n",smb_hfieldtype(RECIPIENTNETADDR),p);
+
 					sockprintf(socket,ok_rsp);
 					state=SMTP_STATE_RCPT_TO;
-					rcpt_count++;
 					continue;
 				}
 			}
@@ -2702,8 +2707,19 @@ static void smtp_thread(void* arg)
 					if(!stricmp(p,scfg.qhub[i]->id))
 						break;
 				}
-				if(i<scfg.total_qhubs) {	/* found matching QWKnet hub */
+				if(i<scfg.total_qhubs) {	/* found matching QWKnet Hub */
 
+					lprintf("%04d SMTP routing mail for %s to QWKnet Hub: %s"
+						,socket, rcpt_addr, scfg.qhub[i]->id);
+
+					fprintf(rcptlst,"[%u]\n",rcpt_count++);
+					fprintf(rcptlst,"%s=%s\n",smb_hfieldtype(RECIPIENT),rcpt_addr);
+					fprintf(rcptlst,"%s=%u\n",smb_hfieldtype(RECIPIENTNETTYPE),NET_QWK);
+					fprintf(rcptlst,"%s=%s\n",smb_hfieldtype(RECIPIENTNETADDR),scfg.qhub[i]->id);
+
+					sockprintf(socket,ok_rsp);
+					state=SMTP_STATE_RCPT_TO;
+					continue;
 				}
 			}
 
@@ -2789,8 +2805,10 @@ static void smtp_thread(void* arg)
 			} else
 				telegram=TRUE;
 
-			fprintf(rcptlst,"%u\n%.*s\n"
-				,user.number,(int)sizeof(rcpt_name)-1,rcpt_addr);
+			fprintf(rcptlst,"[%u]\n",rcpt_count++);
+			fprintf(rcptlst,"%s=%s\n",smb_hfieldtype(RECIPIENT),rcpt_addr);
+			fprintf(rcptlst,"%s=%u\n",smb_hfieldtype(RECIPIENTEXT),user.number);
+
 
 			/* Forward to Internet */
 			tp=strrchr(user.netmail,'@');
@@ -2803,14 +2821,12 @@ static void smtp_thread(void* arg)
 				&& !strstr(tp,scfg.sys_inetaddr)) {
 				lprintf("%04d SMTP Forwarding to: %s"
 					,socket, user.netmail);
-				fprintf(rcptlst,"%s\n",user.netmail);
+				fprintf(rcptlst,"%s=%u\n",smb_hfieldtype(RECIPIENTNETTYPE),NET_INTERNET);
+				fprintf(rcptlst,"%s=%s\n",smb_hfieldtype(RECIPIENTNETADDR),user.netmail);
 				sockprintf(socket,"251 User not local; will forward to %s", user.netmail);
-			} else { /* Local (no-forward) */
-				fprintf(rcptlst,"#%u\n",usernum);
+			} else /* Local (no-forward) */
 				sockprintf(socket,ok_rsp);
-			}
 			state=SMTP_STATE_RCPT_TO;
-			rcpt_count++;
 			continue;
 		}
 		/* Message Data (header and body) */
diff --git a/src/sbbs3/mailsrvr.dsp b/src/sbbs3/mailsrvr.dsp
index 5ded612f88..7b5e3f54ca 100644
--- a/src/sbbs3/mailsrvr.dsp
+++ b/src/sbbs3/mailsrvr.dsp
@@ -97,6 +97,10 @@ SOURCE=.\crc32.c
 # End Source File
 # Begin Source File
 
+SOURCE=..\xpdev\ini_file.c
+# End Source File
+# Begin Source File
+
 SOURCE=.\mailsrvr.c
 # End Source File
 # Begin Source File
-- 
GitLab