diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index ac9e08bad4155e1f59a62583a2b3cd8feaf1f2a1..fb31c73df43c6d4eda6ed6300a5b5bf2d95bf11e 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -1,10 +1,5 @@
-/* xtrn.cpp */
-// vi: tabstop=4
-
 /* Synchronet external program support routines */
 
-/* $Id: xtrn.cpp,v 1.263 2020/08/02 20:23:34 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -18,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 #include "sbbs.h"
@@ -1856,6 +1839,9 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
 	char	str[MAX_PATH+1],*cmd;
     int		i,j,len;
 
+	if(mode == EX_UNSPECIFIED && (*instr == '?' || *instr == '*'))
+		mode = EX_NATIVE;
+
     if(outstr==NULL)
         cmd=cmdstr_output;
     else
@@ -1888,7 +1874,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'F':   /* File path */
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(*instr != '?' && mode != EX_UNSPECIFIED && !(mode & EX_NATIVE)
+					if(!(mode & EX_NATIVE)
 						&& strncmp(fpath, cfg.node_dir, strlen(cfg.node_dir)) == 0) {
 						strncat(cmd, DOSEMU_NODE_DIR, avail);
 						strncat(cmd, fpath + strlen(cfg.node_dir), avail);
@@ -1899,7 +1885,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'G':   /* Temp directory */
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(*instr != '?' && mode != EX_UNSPECIFIED && !(mode & EX_NATIVE))
+					if(!(mode & EX_NATIVE))
 						strncat(cmd, DOSEMU_TEMP_DIR, avail);
 					else
 #endif
@@ -1913,7 +1899,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'J':
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(*instr != '?' && mode != EX_UNSPECIFIED && !(mode & EX_NATIVE))
+					if(!(mode & EX_NATIVE))
 						strncat(cmd, DOSEMU_DATA_DIR, avail);
 					else
 #endif
@@ -1921,7 +1907,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'K':
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(*instr != '?' && mode != EX_UNSPECIFIED && !(mode & EX_NATIVE))
+					if(!(mode & EX_NATIVE))
 						strncat(cmd, DOSEMU_CTRL_DIR, avail);
 					else
 #endif
@@ -1935,7 +1921,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'N':   /* Node Directory (same as SBBSNODE environment var) */
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(*instr != '?' && mode != EX_UNSPECIFIED && !(mode & EX_NATIVE))
+					if(!(mode & EX_NATIVE))
 						strncat(cmd, DOSEMU_NODE_DIR, avail);
 					else
 #endif
@@ -1980,7 +1966,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'Z':
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(*instr != '?' && mode != EX_UNSPECIFIED && !(mode & EX_NATIVE))
+					if(!(mode & EX_NATIVE))
 						strncat(cmd, DOSEMU_TEXT_DIR, avail);
 					else
 #endif
@@ -1998,7 +1984,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
 					break;
                 case '!':   /* EXEC Directory */
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(*instr != '?' && mode != EX_UNSPECIFIED && !(mode & EX_NATIVE))
+					if(!(mode & EX_NATIVE))
 						strncat(cmd, DOSEMU_EXEC_DIR, avail);
 					else
 #endif
diff --git a/src/sbbs3/xtrn_sec.cpp b/src/sbbs3/xtrn_sec.cpp
index c1a83d36eac21fee11e68f4a02f9e84b78a0553b..33cc509d4d54b3b5fb4738cfd54fb188850c44c8 100644
--- a/src/sbbs3/xtrn_sec.cpp
+++ b/src/sbbs3/xtrn_sec.cpp
@@ -1,9 +1,5 @@
-/* xtrn_sec.cpp */
-
 /* Synchronet external program/door section and drop file routines */
 
-/* $Id: xtrn_sec.cpp,v 1.91 2020/08/01 18:34:24 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -1611,7 +1595,7 @@ bool sbbs_t::exec_xtrn(uint xtrnnum)
 	char drop_file[MAX_PATH + 1];
 	char startup_dir[MAX_PATH + 1];
 #if defined(__linux__) && defined(USE_DOSEMU)
-	if(!(cfg.xtrn[xtrnnum]->misc & XTRN_NATIVE)) {
+	if(cfg.xtrn[xtrnnum]->cmd[0] != '?' && cfg.xtrn[xtrnnum]->cmd[0] != '*'	&& !(cfg.xtrn[xtrnnum]->misc & XTRN_NATIVE)) {
 		SAFEPRINTF2(startup_dir, "%s\\%s", DOSEMU_XTRN_DRIVE, getdirname(cfg.xtrn[xtrnnum]->path));
 		backslash(startup_dir);
 		if(cfg.xtrn[xtrnnum]->misc & STARTUPDIR)