From a4c36610fd486afc42b64d0923947e79c3206067 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Fri, 12 Jan 2018 07:53:50 +0000
Subject: [PATCH] sbbs_t::sendfile() (used by JS bbs.send_file() and Baja
 FILE_SEND) would not check the protocol.log (e.g. DSZ.LOG) for successful
 transfer even when the protocol was so-configured in SCFG. Fixed.
 Additionally, while sendfile() would return a proper boolean result based on
 the errorlevel returned by the protocol driver process, the log and console
 output would report success and statistics adjusted as though the xfer was
 successful, regardless.

---
 src/sbbs3/download.cpp | 44 +++++++++++++++++++++++++-----------------
 src/sbbs3/sbbs.h       |  2 +-
 2 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/src/sbbs3/download.cpp b/src/sbbs3/download.cpp
index ebb75fd269..178bd4f598 100644
--- a/src/sbbs3/download.cpp
+++ b/src/sbbs3/download.cpp
@@ -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 2015 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 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				*
@@ -306,14 +306,12 @@ void sbbs_t::autohangup()
 		CRLF;
 }
 
-bool sbbs_t::checkdszlog(file_t* f)
+bool sbbs_t::checkdszlog(const char* fpath)
 {
 	char	path[MAX_PATH+1];
-	char	str[MAX_PATH+128];
-	char	fname[MAX_PATH+1];
 	char	rpath[MAX_PATH+1];
+	char	str[MAX_PATH+128];
 	char*	p;
-	char*	rname;
 	char	code;
 	ulong	bytes;
 	FILE*	fp;
@@ -323,11 +321,8 @@ bool sbbs_t::checkdszlog(file_t* f)
 	if((fp=fopen(path,"r"))==NULL)
 		return(false);
 
-	unpadfname(f->name,fname);
-
-	getfilepath(&cfg,f,rpath);
-	fexistcase(rpath);	/* incase of long filename */
-	rname=getfname(rpath);
+	SAFECOPY(rpath, fpath);
+	fexistcase(rpath);
 
 	while(!ferror(fp)) {
 		if(!fgets(str,sizeof(str),fp))
@@ -358,7 +353,7 @@ bool sbbs_t::checkdszlog(file_t* f)
 		FIND_WHITESPACE(p);	// Skip block size
 		SKIP_WHITESPACE(p);
 		p=getfname(p);	/* DSZ stores fullpath, BiModem doesn't */
-		if(stricmp(p,fname)==0 || stricmp(p,rname)==0) {
+		if(stricmp(p, getfname(fpath))==0 || stricmp(p, getfname(rpath))==0) {
 			/* E for Error or L for Lost Carrier or s for Skipped */
 			/* or only sent 0 bytes! */
 			if(code!='E' && code!='L' && code!='s' && bytes!=0)
@@ -380,9 +375,11 @@ bool sbbs_t::checkprotresult(prot_t* prot, int error, file_t* f)
 	char str[512];
 	char tmp[128];
 	bool success;
+	char fpath[MAX_PATH+1];
 
+	getfilepath(&cfg,f,fpath);
 	if(prot->misc&PROT_DSZLOG)
-		success=checkdszlog(f);
+		success=checkdszlog(fpath);
 	else
 		success=(error==0);
 
@@ -455,7 +452,8 @@ bool sbbs_t::sendfile(char* fname, char prot, const char* desc)
 	char	keys[128];
 	char	ch;
 	size_t	i;
-	bool	result=false;
+	int		error;
+	bool	result;
 
 	if(prot > ' ')
 		ch=toupper(prot);
@@ -475,9 +473,15 @@ bool sbbs_t::sendfile(char* fname, char prot, const char* desc)
 	for(i=0;i<cfg.total_prots;i++)
 		if(cfg.prot[i]->mnemonic==ch && chk_ar(cfg.prot[i]->ar,&useron,&client))
 			break;
-	if(i<cfg.total_prots) {
-		if(protocol(cfg.prot[i],XFER_DOWNLOAD,fname,fname,false)==0)
-			result=true;
+	if(i >= cfg.total_prots)
+		return false;
+	error = protocol(cfg.prot[i],XFER_DOWNLOAD,fname,fname,false);
+	if(cfg.prot[i]->misc&PROT_DSZLOG)
+		result = checkdszlog(fname);
+	else
+		result = (error == 0);
+
+	if(result) {
 		off_t length = flength(fname);
 		logon_dlb += length;	/* Update stats */
 		logon_dls++;
@@ -491,7 +495,11 @@ bool sbbs_t::sendfile(char* fname, char prot, const char* desc)
 			,useron.alias, desc == NULL ? "file" : desc, fname, bytes);
 		logline("D-",str); 
 		autohangup(); 
+	} else {
+		char str[128];
+		bprintf(text[FileNotSent], getfname(fname));
+		sprintf(str,"%s attempted to download attached file: %s", useron.alias, fname);
+		logline(LOG_NOTICE,"D!",str);
 	}
-
-	return(result);
+	return result;
 }
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index d9b0dad0df..c9d323c898 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -822,7 +822,7 @@ public:
 	const char*	protcmdline(prot_t* prot, enum XFER_TYPE type);
 	void	seqwait(uint devnum);
 	void	autohangup(void);
-	bool	checkdszlog(file_t*);
+	bool	checkdszlog(const char*);
 	bool	checkprotresult(prot_t*, int error, file_t*);
 	bool	sendfile(char* fname, char prot=0, const char* description = NULL);
 	bool	recvfile(char* fname, char prot=0);
-- 
GitLab