From 96fad161d2757be17b6818bfe183577d305324ce Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Wed, 20 Aug 2008 19:34:30 +0000
Subject: [PATCH] return from main rather than calling exit(). Using exit() can
 mess up graphical output and cause a hang when unexpected Xlib async replies
 occur during the exit() process.

---
 src/sbbs3/jsexec.c | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index 0cb6c02ae5..552889f9db 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -256,9 +256,8 @@ static BOOL winsock_startup(void)
 
 #endif
 
-void bail(int code)
+static int do_bail(int code)
 {
-
 #if defined(_WINSOCKAPI_)
 	if(WSAInitialized && WSACleanup()!=0) 
 		lprintf(LOG_ERR,"!WSACleanup ERROR %d",ERROR_VALUE);
@@ -271,7 +270,12 @@ void bail(int code)
 
 	if(code)
 		fprintf(statfp,"\nReturning error code: %d\n",code);
-	exit(code);
+	return(code);
+}
+
+void bail(int code)
+{
+	exit(do_bail(code));
 }
 
 static JSBool
@@ -801,7 +805,7 @@ int main(int argc, char **argv, char** environ)
 	errfp=stderr;
 	if((nulfp=fopen(_PATH_DEVNULL,"w+"))==NULL) {
 		perror(_PATH_DEVNULL);
-		bail(-1);
+		return(do_bail(-1));
 	}
 	if(isatty(fileno(stderr)))
 		statfp=stderr;
@@ -820,7 +824,7 @@ int main(int argc, char **argv, char** environ)
 	scfg.size=sizeof(scfg);
 
 	if(!winsock_startup())
-		bail(2);
+		return(do_bail(2));
 
 	for(argn=1;argn<argc && module==NULL;argn++) {
 		if(argv[argn][0]=='-') {
@@ -878,14 +882,14 @@ int main(int argc, char **argv, char** environ)
 					if(*p==0) p=argv[++argn];
 					if((errfp=fopen(p,omode))==NULL) {
 						perror(p);
-						bail(1);
+						return(do_bail(1));
 					}
 					break;
 				case 'o':
 					if(*p==0) p=argv[++argn];
 					if((confp=fopen(p,omode))==NULL) {
 						perror(p);
-						bail(1);
+						return(do_bail(1));
 					}
 					break;
 				case 'q':
@@ -913,7 +917,7 @@ int main(int argc, char **argv, char** environ)
 				case 'v':
 					banner(statfp);
 					fprintf(statfp,"%s\n",(char *)JS_GetImplementationVersion());
-					bail(0);
+					return(do_bail(0));
 #if defined(__unix__)
 				case 'd':
 					daemonize=TRUE;
@@ -923,7 +927,7 @@ int main(int argc, char **argv, char** environ)
 					fprintf(errfp,"\n!Unsupported option: %s\n",argv[argn]);
 				case '?':
 					usage(errfp);
-					bail(1);
+					return(do_bail(1));
 			}
 			continue;
 		}
@@ -935,7 +939,7 @@ int main(int argc, char **argv, char** environ)
 			fprintf(errfp,"\nSBBSCTRL environment variable not set and -c option not specified.\n");
 			fprintf(errfp,"\nExample: SET SBBSCTRL=/sbbs/ctrl\n");
 			fprintf(errfp,"\n     or: %s -c /sbbs/ctrl [module]\n",argv[0]);
-			bail(1); 
+			return(do_bail(1)); 
 		}
 		SAFECOPY(scfg.ctrl_dir,p);
 	}	
@@ -943,7 +947,7 @@ int main(int argc, char **argv, char** environ)
 	if(module==NULL && isatty(fileno(stdin))) {
 		fprintf(errfp,"\n!Module name not specified\n");
 		usage(errfp);
-		bail(1); 
+		return(do_bail(1)); 
 	}
 
 	banner(statfp);
@@ -954,7 +958,7 @@ int main(int argc, char **argv, char** environ)
 	fprintf(statfp,"\nLoading configuration files from %s\n",scfg.ctrl_dir);
 	if(!load_cfg(&scfg,NULL,TRUE,error)) {
 		fprintf(errfp,"!ERROR loading configuration files: %s\n",error);
-		bail(1);
+		return(do_bail(1));
 	}
 	SAFECOPY(scfg.temp_dir,"../temp");
 	prep_dir(scfg.ctrl_dir, scfg.temp_dir, sizeof(scfg.temp_dir));
@@ -1006,7 +1010,7 @@ int main(int argc, char **argv, char** environ)
 
 		if(!js_init(environ)) {
 			lprintf(LOG_ERR,"!JavaScript initialization failure");
-			bail(1);
+			return(do_bail(1));
 		}
 		fprintf(statfp,"\n");
 
@@ -1023,8 +1027,6 @@ int main(int argc, char **argv, char** environ)
 
 	} while((recycled || loop) && !terminated);
 
-	bail(result);
-
-	return(-1);	/* never gets here */
+	return(do_bail(result));
 }
 
-- 
GitLab