Skip to content
Snippets Groups Projects
Commit 58bfc11a authored by rswindell's avatar rswindell
Browse files

cmdstr() now automatically quotes arguments (e.g. filenames) with spaces in

them.
parent a1f7f9fc
No related branches found
No related tags found
No related merge requests found
......@@ -1944,12 +1944,20 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
uint fakeriobp=0xffff;
const char* quoted_string(const char* str, char* buf, size_t maxlen)
{
if(strchr(str,' ')==NULL)
return(str);
safe_snprintf(buf,maxlen,"\"%s\"",str);
return(buf);
}
/*****************************************************************************/
/* Returns command line generated from instr with %c replacments */
/*****************************************************************************/
char* sbbs_t::cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
{
char str[256],*cmd;
char str[MAX_PATH+1],*cmd;
int i,j,len;
if(outstr==NULL)
......@@ -1966,7 +1974,7 @@ char* sbbs_t::cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
ch=toupper(ch);
switch(ch) {
case 'A': /* User alias */
strcat(cmd,useron.alias);
strcat(cmd,quoted_string(useron.alias,str,sizeof(str)));
break;
case 'B': /* Baud (DTE) Rate */
strcat(cmd,ultoa(dte_rate,str,10));
......@@ -1981,10 +1989,10 @@ char* sbbs_t::cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
strcat(cmd,ultoa((ulong)cur_cps*10,str,10));
break;
case 'F': /* File path */
strcat(cmd,fpath);
strcat(cmd,quoted_string(fpath,str,sizeof(str)));
break;
case 'G': /* Temp directory */
strcat(cmd,cfg.temp_dir);
strcat(cmd,quoted_string(cfg.temp_dir,str,sizeof(str)));
break;
case 'H': /* Port Handle or Hardware Flow Control */
#if defined(__unix__)
......@@ -1997,10 +2005,10 @@ char* sbbs_t::cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
strcat(cmd,cid);
break;
case 'J':
strcat(cmd,cfg.data_dir);
strcat(cmd,quoted_string(cfg.data_dir,str,sizeof(str)));
break;
case 'K':
strcat(cmd,cfg.ctrl_dir);
strcat(cmd,quoted_string(cfg.ctrl_dir,str,sizeof(str)));
break;
case 'L': /* Lines per message */
strcat(cmd,ultoa(cfg.level_linespermsg[useron.level],str,10));
......@@ -2009,10 +2017,10 @@ char* sbbs_t::cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
strcat(cmd,ultoa(useron.min,str,10));
break;
case 'N': /* Node Directory (same as SBBSNODE environment var) */
strcat(cmd,cfg.node_dir);
strcat(cmd,quoted_string(cfg.node_dir,str,sizeof(str)));
break;
case 'O': /* SysOp */
strcat(cmd,cfg.sys_op);
strcat(cmd,quoted_string(cfg.sys_op,str,sizeof(str)));
break;
case 'P': /* Client protocol */
strcat(cmd,client.protocol);
......@@ -2024,7 +2032,7 @@ char* sbbs_t::cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
strcat(cmd,ultoa(rows,str,10));
break;
case 'S': /* File Spec */
strcat(cmd,fspec);
strcat(cmd,quoted_string(fspec,str,sizeof(str)));
break;
case 'T': /* Time left in seconds */
gettimeleft();
......@@ -2049,10 +2057,10 @@ char* sbbs_t::cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
strcat(cmd,str);
break;
case 'Y':
strcat(cmd,comspec);
strcat(cmd,quoted_string(comspec,str,sizeof(str)));
break;
case 'Z':
strcat(cmd,cfg.text_dir);
strcat(cmd,quoted_string(cfg.text_dir,str,sizeof(str)));
break;
case '~': /* DOS-compatible (8.3) filename */
#ifdef _WIN32
......@@ -2061,15 +2069,15 @@ char* sbbs_t::cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
GetShortPathName(fpath,sfpath,sizeof(sfpath));
strcat(cmd,sfpath);
#else
strcat(cmd,fpath);
strcat(cmd,quoted_string(fpath,str,sizeof(str)));
#endif
break;
case '!': /* EXEC Directory */
strcat(cmd,cfg.exec_dir);
strcat(cmd,quoted_string(cfg.exec_dir,str,sizeof(str)));
break;
case '@': /* EXEC Directory for DOS/OS2/Win32, blank for Unix */
#ifndef __unix__
strcat(cmd,cfg.exec_dir);
strcat(cmd,quoted_string(cfg.exec_dir,str,sizeof(str)));
#endif
break;
......@@ -2122,7 +2130,7 @@ extern "C"
char* DLLCALL cmdstr(scfg_t* cfg, user_t* user, const char* instr, const char* fpath
,const char* fspec, char* cmd)
{
char str[256];
char str[MAX_PATH+1];
int i,j,len;
len=strlen(instr);
......@@ -2136,7 +2144,7 @@ char* DLLCALL cmdstr(scfg_t* cfg, user_t* user, const char* instr, const char* f
switch(ch) {
case 'A': /* User alias */
if(user!=NULL)
strcat(cmd,user->alias);
strcat(cmd,quoted_string(user->alias,str,sizeof(str)));
break;
case 'B': /* Baud (DTE) Rate */
break;
......@@ -2147,20 +2155,20 @@ char* DLLCALL cmdstr(scfg_t* cfg, user_t* user, const char* instr, const char* f
case 'E': /* Estimated Rate */
break;
case 'F': /* File path */
strcat(cmd,fpath);
strcat(cmd,quoted_string(fpath,str,sizeof(str)));
break;
case 'G': /* Temp directory */
strcat(cmd,cfg->temp_dir);
strcat(cmd,quoted_string(cfg->temp_dir,str,sizeof(str)));
break;
case 'H': /* Port Handle or Hardware Flow Control */
break;
case 'I': /* IP address */
break;
case 'J':
strcat(cmd,cfg->data_dir);
strcat(cmd,quoted_string(cfg->data_dir,str,sizeof(str)));
break;
case 'K':
strcat(cmd,cfg->ctrl_dir);
strcat(cmd,quoted_string(cfg->ctrl_dir,str,sizeof(str)));
break;
case 'L': /* Lines per message */
if(user!=NULL)
......@@ -2171,10 +2179,10 @@ char* DLLCALL cmdstr(scfg_t* cfg, user_t* user, const char* instr, const char* f
strcat(cmd,ultoa(user->min,str,10));
break;
case 'N': /* Node Directory (same as SBBSNODE environment var) */
strcat(cmd,cfg->node_dir);
strcat(cmd,quoted_string(cfg->node_dir,str,sizeof(str)));
break;
case 'O': /* SysOp */
strcat(cmd,cfg->sys_op);
strcat(cmd,quoted_string(cfg->sys_op,str,sizeof(str)));
break;
case 'P': /* Client protocol */
break;
......@@ -2186,7 +2194,7 @@ char* DLLCALL cmdstr(scfg_t* cfg, user_t* user, const char* instr, const char* f
strcat(cmd,ultoa(user->rows,str,10));
break;
case 'S': /* File Spec */
strcat(cmd,fspec);
strcat(cmd,quoted_string(fspec,str,sizeof(str)));
break;
case 'T': /* Time left in seconds */
break;
......@@ -2212,7 +2220,7 @@ char* DLLCALL cmdstr(scfg_t* cfg, user_t* user, const char* instr, const char* f
case 'Y':
break;
case 'Z':
strcat(cmd,cfg->text_dir);
strcat(cmd,quoted_string(cfg->text_dir,str,sizeof(str)));
break;
case '~': /* DOS-compatible (8.3) filename */
#ifdef _WIN32
......@@ -2221,12 +2229,18 @@ char* DLLCALL cmdstr(scfg_t* cfg, user_t* user, const char* instr, const char* f
GetShortPathName(fpath,sfpath,sizeof(sfpath));
strcat(cmd,sfpath);
#else
strcat(cmd,fpath);
strcat(cmd,quoted_string(fpath,str,sizeof(str)));
#endif
break;
case '!': /* EXEC Directory */
strcat(cmd,cfg->exec_dir);
strcat(cmd,quoted_string(cfg->exec_dir,str,sizeof(str)));
break;
case '@': /* EXEC Directory for DOS/OS2/Win32, blank for Unix */
#ifndef __unix__
strcat(cmd,quoted_string(cfg->exec_dir,str,sizeof(str)));
#endif
break;
case '#': /* Node number (same as SBBSNNUM environment var) */
sprintf(str,"%d",cfg->node_num);
strcat(cmd,str);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment