diff --git a/exec/external.bat b/exec/external.bat index a9a13c9f23082e2debf8fdb2d10f52ca0c365de6..e8224b68cec20a41f135e75632d4d855f1c85e29 100644 --- a/exec/external.bat +++ b/exec/external.bat @@ -1,20 +1,23 @@ -@unix -s NODEDIR -@lredir D: linux\fs%NODEDIR% >NUL -@lredir E: linux\fs%XTRNDIR% >NUL -@lredir F: linux\fs%CTRLDIR% >NUL -@lredir G: linux\fs%DATADIR% >NUL -@lredir H: linux\fs%EXECDIR% >NUL +@lredir D: linux\fs$NODEDIR >NUL +@lredir E: linux\fs$XTRNDIR >NUL +@lredir F: linux\fs$CTRLDIR >NUL +@lredir G: linux\fs$DATADIR >NUL +@lredir H: linux\fs$EXECDIR >NUL E: -IF NOT "" == "%STARTDIR%" CD %STARTDIR% +REM Switch to game dir, unless its not defined +REM If not defined, go to node dir (external editors use this) +IF "%STARTDIR%"=="" D: +IF NOT "%STARTDIR%"=="" CD %STARTDIR% REM Optionally call emusetup.bat or put that stuff here for global (in NOEMU) REM Looks in startup dir, then ctrl dir IF EXIST EMUSETUP.BAT GOTO EMULOCAL IF EXIST F:\EMUSETUP.BAT GOTO EMUGLOBAL IF EXIST E:\DOSUTILS\NUL GOTO NOEMU -ECHO ERROR: No emusetup.bat in E:\%STARTDIR% or F, or E:\DOSUTILS\ is missing +IF EXIST H:\DOSUTILS\NUL GOTO NOEMU +ECHO ERROR: No emusetup.bat in E:\%STARTDIR% or F, or DOSUTILS is missing GOTO EXEC :EMULOCAL @@ -26,7 +29,7 @@ CALL F:\EMUSETUP.BAT GOTO EXEC :NOEMU -@set PATH=%PATH%;E:\dosutils +@set PATH=%PATH%;E:\dosutils;H:\dosutils unix -s RUNTYPE REM fossil driver, such as x00, bnu, or dosemu fossil.com rem IF "%RUNTYPE%" == "FOSSIL" @fossil.com >NUL diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c index 923b15564ad9e8daeb4af16a92ae6a5817f7f89c..67ab24cfa4e193c45175fa882c201872e5b884df 100644 --- a/src/sbbs3/str_util.c +++ b/src/sbbs3/str_util.c @@ -652,7 +652,7 @@ char* ascii_str(uchar* str) char* replace_named_values(const char* src ,char* buf ,size_t buflen /* includes '\0' terminator */ - ,char* escape_seq + ,const char* escape_seq ,named_string_t* string_list ,named_int_t* int_list ,BOOL case_sensitive) diff --git a/src/sbbs3/str_util.h b/src/sbbs3/str_util.h index 6eab99c95a8ed1cbfc6feadf5fb63cd9d5520ddd..e0657bfe2a17eb7a633b4bc06dca93ec012ad6f7 100644 --- a/src/sbbs3/str_util.h +++ b/src/sbbs3/str_util.h @@ -39,9 +39,9 @@ DLLEXPORT char * remove_ctrl_a(const char* instr, char* outstr); DLLEXPORT char ctrl_a_to_ascii_char(char code); DLLEXPORT char * truncstr(char* str, const char* set); DLLEXPORT char * ascii_str(uchar* str); -DLLEXPORT char * replace_named_values(const char* src ,char* buf, size_t buflen, - char* escape_seq, named_string_t* string_list, - named_int_t* int_list, BOOL case_sensitive); +DLLEXPORT char * replace_named_values(const char* src ,char* buf, size_t buflen, + const char* escape_seq, named_string_t* string_list, + named_int_t* int_list, BOOL case_sensitive); DLLEXPORT char * condense_whitespace(char* str); DLLEXPORT char exascii_to_ascii_char(uchar ch); DLLEXPORT BOOL findstr(const char *insearch, const char *fname); @@ -73,4 +73,4 @@ DLLEXPORT char * get_ctrl_dir(BOOL warn); #ifdef __cplusplus } #endif -#endif /* Don't add anything after this line */ +#endif /* Don't add anything after this line */ \ No newline at end of file diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp index 2a95e0c0667e1c28ce74d168f2b8d8352584c974..bfbf862a3a6fa391e77a6761648be8ca7bd31850 100644 --- a/src/sbbs3/xtrn.cpp +++ b/src/sbbs3/xtrn.cpp @@ -1176,7 +1176,7 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) #elif defined(__linux__) && defined(USE_DOSEMU) - /* dosemu integration -- Ryan Underwood, <nemesis @ icequake.net> */ + /* dosemu integration -- originally by Ryan Underwood, <nemesis @ icequake.net> */ FILE *dosemubatfp; FILE *externalbatfp; @@ -1265,7 +1265,6 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) * error out. */ SAFECOPY(str,"/etc/dosemu/dosemu.conf"); if (!fexist(str)) { - SAFECOPY(str,"/etc/dosemu.conf"); if (!fexist(str)) { errormsg(WHERE,ERR_READ,str,0); @@ -1296,44 +1295,45 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) fprintf(dosemubatfp,"SET PCBNODE=%d\r\n",cfg.node_num); fprintf(dosemubatfp,"SET PCBDRIVE=%s\r\n",nodedrive); fprintf(dosemubatfp,"SET PCBDIR=\\\r\n"); - fprintf(dosemubatfp,"SET XTRNDIR=%s\r\n",xtrndir_dos); - fprintf(dosemubatfp,"SET CTRLDIR=%s\r\n",ctrldir_dos); - fprintf(dosemubatfp,"SET DATADIR=%s\r\n",datadir_dos); - fprintf(dosemubatfp,"SET EXECDIR=%s\r\n",execdir_dos); - fprintf(dosemubatfp,"SET NODEDIR=%s\r\n",nodedir_dos); - const char* gamedir = ""; + char gamedir[MAX_PATH+1]; if(startup_dir!=NULL && startup_dir[0]) { SAFECOPY(str, startup_dir); *lastchar(str) = 0; - gamedir = getfname(str); + SAFECOPY(gamedir, getfname(str)); } + if(*gamedir == 0) { lprintf(LOG_ERR, "No startup directory configured for DOS command-line: %s", cmdline); return -1; } - if (startup_dir[0]) { - fprintf(dosemubatfp,"SET STARTDIR=%s\r\n",gamedir); + + /* external editors use node dir so unset this */ + if (startup_dir == cfg.node_dir) { + SAFECOPY(gamedir, ""); } + fprintf(dosemubatfp,"SET STARTDIR=%s\r\n",gamedir); + /* now append exec/external.bat (which is editable) to this generated file */ SAFEPRINTF(str,"%sexternal.bat",startup_dir); - if (!fexist(str)) { + + if ((startup_dir == cfg.node_dir) || !fexist(str)) { SAFEPRINTF(str,"%sexternal.bat",cfg.exec_dir); if (!fexist(str)) { errormsg(WHERE,ERR_READ,str,0); return(-1); } - else SAFECOPY(externalbatsrc, str); /* ctrl dir */ } - else SAFECOPY(externalbatsrc, str); /* startup dir/door dir */ + + SAFECOPY(externalbatsrc, str); if (!(externalbatfp=fopen(externalbatsrc,"r"))) { errormsg(WHERE,ERR_OPEN,externalbatsrc,0); return(-1); - } - + } + /* append the command line to the batch file */ SAFECOPY(tok,cmdline); truncstr(tok," "); @@ -1344,14 +1344,11 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) } else { SAFECOPY(cmdlinebatch, cmdline); } - - char nodenum[5]; - SAFEPRINTF(nodenum, "%3u", cfg.node_num); + named_string_t externalbat_replacements[] = { {(char*)"CMDLINE",cmdlinebatch }, {(char*)"DSZLOG",(char*)nodedrive }, {(char*)"SBBSNODE",(char*)nodedrive }, - {(char*)"SBBSNNUM",nodenum }, {(char*)"SBBSCTRL",(char*)ctrldrive }, {(char*)"SBBSDATA",(char*)datadrive }, {(char*)"SBBSEXEC",(char*)execdrive }, @@ -1360,18 +1357,23 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) {(char*)"DATADIR",datadir_dos }, {(char*)"EXECDIR",execdir_dos }, {(char*)"NODEDIR",nodedir_dos }, + {(char*)"STARTDIR",(char*)gamedir }, {NULL, NULL } }; - + + named_int_t externalbat_int_replacements[] = { + {(char*)"SBBSNNUM", cfg.node_num }, + }; + while(!feof(externalbatfp)) { if (fgets(buf, sizeof(buf), externalbatfp)!=NULL) { - replace_named_values(buf, bufout, sizeof(bufout), (char*)"$", externalbat_replacements, NULL, FALSE); + replace_named_values(buf, bufout, sizeof(bufout), "$", externalbat_replacements, + externalbat_int_replacements, FALSE); fprintf(dosemubatfp,"%s",bufout); } } fclose(externalbatfp); - /* Check the "Stdio Interception" flag from scfg for this door. If it's * enabled, we enable doorway mode. Else, it's vmodem for us, unless @@ -1432,57 +1434,46 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) /* * Get the global emu launch command */ - str[0] = '\0'; - /* look for file in startup dir */ SAFEPRINTF(str,"%sdosemulaunch.ini",startup_dir); if (!fexist(str)) { - str[0] = '\0'; - } - - /* look for file in ctrl dir */ - if (str[0] == '\0') { - SAFEPRINTF(str,"%sdosemulaunch.ini",cfg.exec_dir); + /* look for file in ctrl dir */ + SAFEPRINTF(str,"%sdosemulaunch.ini",cfg.exec_dir); if (!fexist(str)) { - str[0] = '\0'; + errormsg(WHERE,ERR_OPEN,"dosemulaunch.ini", 0); + return(-1); } } /* if file found, then open and process it */ - if (str[0] != '\0') { - if ((de_launch_inifp=iniOpenFile(str, false))==NULL) { - errormsg(WHERE,ERR_OPEN,str, 0); - return(-1); - } - de_launch_ini = iniReadFile(de_launch_inifp); - iniCloseFile(de_launch_inifp); - SAFECOPY(de_launch_cmd, ""); - iniGetString(de_launch_ini, ROOT_SECTION, "cmd", nulstr, de_launch_cmd); - if (virtualconf[0] == '\0') { - iniGetString(de_launch_ini, "stdio", "cmd", de_launch_cmd, de_launch_cmd); - } - iniFreeStringList(de_launch_ini); - - named_string_t de_launch_ini_replacements[] = - { - {(char*)"TERM", dosterm}, - {(char*)"CTRLDIR", cfg.ctrl_dir}, - {(char*)"NODEDIR", cfg.node_dir}, - {(char*)"DOSEMUBIN", dosemubinloc}, - {(char*)"VIRTUALCONF", virtualconf}, - {(char*)"DOSEMUCONF", dosemuconf}, - {(char*)"EXTBAT", externalbat}, - {(char*)"EXTLOG", log_external}, - {NULL, NULL} - }; - replace_named_values(de_launch_cmd, fullcmdline, sizeof(fullcmdline), (char*)"$", - de_launch_ini_replacements, NULL, FALSE); - } - else { - errormsg(WHERE,ERR_OPEN,"dosemulaunch.ini", 0); - return(-1); - } - + if ((de_launch_inifp=iniOpenFile(str, false))==NULL) { + errormsg(WHERE,ERR_OPEN,str, 0); + return(-1); + } + de_launch_ini = iniReadFile(de_launch_inifp); + iniCloseFile(de_launch_inifp); + SAFECOPY(de_launch_cmd, ""); + iniGetString(de_launch_ini, ROOT_SECTION, "cmd", nulstr, de_launch_cmd); + if (virtualconf[0] == '\0') { + iniGetString(de_launch_ini, "stdio", "cmd", de_launch_cmd, de_launch_cmd); + } + iniFreeStringList(de_launch_ini); + + named_string_t de_launch_ini_replacements[] = + { + {(char*)"TERM", dosterm}, + {(char*)"CTRLDIR", cfg.ctrl_dir}, + {(char*)"NODEDIR", cfg.node_dir}, + {(char*)"DOSEMUBIN", dosemubinloc}, + {(char*)"VIRTUALCONF", virtualconf}, + {(char*)"DOSEMUCONF", dosemuconf}, + {(char*)"EXTBAT", externalbat}, + {(char*)"EXTLOG", log_external}, + {NULL, NULL} + }; + replace_named_values(de_launch_cmd, fullcmdline, sizeof(fullcmdline), (char*)"$", + de_launch_ini_replacements, NULL, FALSE); + /* Drum roll. */ fprintf(dosemubatfp,"REM For debugging: %s\r\n",fullcmdline); fclose(dosemubatfp);