From 40c1ceffe1625130e7ee332de0a9be7e4ac9760c Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Sun, 27 Dec 2020 20:42:01 -0800
Subject: [PATCH] Fix Y2K issues with QWK messagse (import and export).

---
 EXEC/SBBS.EXE | Bin 487840 -> 487904 bytes
 SRC/DEFS.H    |   2 ++
 SRC/QWK.C     |  21 +++++++++++++++------
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/EXEC/SBBS.EXE b/EXEC/SBBS.EXE
index a6caee08df66b72fea3fa4b79b9e9878ef5ba7c7..547c303aada1f98c9f05d89e4ec6543440e7a4a6 100644
GIT binary patch
delta 2835
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
N@2uPFzOyM+0RS2}Art@r

delta 2742
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

diff --git a/SRC/DEFS.H b/SRC/DEFS.H
index 0966d9c..aab4311 100644
--- a/SRC/DEFS.H
+++ b/SRC/DEFS.H
@@ -23,6 +23,8 @@
 #define REVISION	6		/* Revision number */
 #define BETA		0		/* Beta release? */
 
+#define Y2K_2DIGIT_WINDOW	70
+#define TM_YEAR(yy)		((yy)%100)
 
 #if !DEMO
 
diff --git a/SRC/QWK.C b/SRC/QWK.C
index 5e9f1eb..fec3f1f 100644
--- a/SRC/QWK.C
+++ b/SRC/QWK.C
@@ -242,7 +242,10 @@ if(length<2)
 	return(0);
 date.da_mon=((qwkbuf[8]&0xf)*10)+(qwkbuf[9]&0xf);
 date.da_day=((qwkbuf[11]&0xf)*10)+(qwkbuf[12]&0xf);
-date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf)+1900;
+date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf);
+if(date.da_year<Y2K_2DIGIT_WINDOW)
+	date.da_year+=100;
+date.da_year+=1900;
 curtime.ti_hour=((qwkbuf[16]&0xf)*10)+(qwkbuf[17]&0xf);
 curtime.ti_min=((qwkbuf[19]&0xf)*10)+(qwkbuf[20]&0xf);
 curtime.ti_sec=0;
@@ -721,7 +724,7 @@ if(mail && !(sys_status&SS_ABORT)) {
 			p=strchr(tmp,'@');              /* remove the system id */
 			if(p!=NULL) *p=0; }
 		sprintf(tmp2,"%02u-%02u-%02u%02u:%02u"
-			,date.da_mon,date.da_day,date.da_year-1900
+			,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900)
 			,curtime.ti_hour,curtime.ti_min);
 		sprintf(str,"%c%-7d%-13.13s%-25.25s"
 			"%-25.25s%-25.25s%12s%-8d%-6lu\xe1%c%c%c%c%c"
@@ -832,7 +835,7 @@ for(i=0;i<usrgrps;i++) {
 					if(p!=NULL) *p=0; }
 				n=((i+1)*100)+j+1;	/* ggss */
 				sprintf(tmp2,"%02u-%02u-%02u%02u:%02u"
-					,date.da_mon,date.da_day,date.da_year-1900
+					,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900)
 					,curtime.ti_hour,curtime.ti_min);
 				if(msg[k]->mode&MSG_PRIVATE) {
 					if(msg[k]->mode&MSG_READ)
@@ -1073,7 +1076,7 @@ for(i=0;i<qhub[hubnum]->subs;i++) {
 		n=qhub[hubnum]->conf[i];
 		unixtodos(msg[k]->time,&date,&curtime);
 		sprintf(tmp2,"%02u-%02u-%02u%02u:%02u"
-			,date.da_mon,date.da_day,date.da_year-1900
+			,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900)
 			,curtime.ti_hour,curtime.ti_min);
 
 		if(msg[k]->mode&MSG_PRIVATE) {
@@ -1450,7 +1453,10 @@ for(l=128;l<size;l+=i*128) {
 				strcpy(tmp,useron.alias); }
 		date.da_mon=((block[8]&0xf)*10)+(block[9]&0xf);
 		date.da_day=((block[11]&0xf)*10)+(block[12]&0xf);
-		date.da_year=((block[14]&0xf)*10)+(block[15]&0xf)+1900;
+		date.da_year=((block[14]&0xf)*10)+(block[15]&0xf);
+		if(date.da_year<Y2K_2DIGIT_WINDOW)
+			date.da_year+=100;
+		date.da_year+=1900;
 		curtime.ti_hour=((block[16]&0xf)*10)+(block[17]&0xf);
 		curtime.ti_min=((block[19]&0xf)*10)+(block[20]&0xf);
         curtime.ti_sec=0;
@@ -1616,7 +1622,10 @@ for(l=128;l<size;l+=i*128) {
 
 	date.da_mon=((block[8]&0xf)*10)+(block[9]&0xf);
 	date.da_day=((block[11]&0xf)*10)+(block[12]&0xf);
-	date.da_year=((block[14]&0xf)*10)+(block[15]&0xf)+1900;
+	date.da_year=((block[14]&0xf)*10)+(block[15]&0xf);
+	if(date.da_year<Y2K_2DIGIT_WINDOW)
+		date.da_year+=100;
+	date.da_year+=1900;
 	curtime.ti_hour=((block[16]&0xf)*10)+(block[17]&0xf);
 	curtime.ti_min=((block[19]&0xf)*10)+(block[20]&0xf);
 	curtime.ti_sec=0;
-- 
GitLab