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