Skip to content
Snippets Groups Projects
xtrn.cpp 62.2 KiB
Newer Older
		curatr=~0;			// Can't guarantee current attributes
		attr(LIGHTGRAY);	// Force to "normal"

		rio_abortable=rio_abortable_save;	// Restore abortable state

		/* Got back to Text/NVT mode */
		request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX);
	if(!(mode&EX_NOLOG))
		close(err_pipe[0]);
	return(errorlevel = WEXITSTATUS(i));
static 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);
}

#define QUOTED_STRING(ch, str, buf, maxlen) \
	((IS_ALPHA(ch) && IS_UPPERCASE(ch)) ? str : quoted_string(str,buf,maxlen))
/*****************************************************************************/
/* Returns command line generated from instr with %c replacements            */
/*****************************************************************************/
char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, char *outstr, int mode)
	bool	native = (mode == EX_UNSPECIFIED) || native_executable(&cfg, instr, mode);
    if(outstr==NULL)
        cmd=cmdstr_output;
    else
        cmd=outstr;
    len=strlen(instr);
	int maxlen = (int)sizeof(cmdstr_output) - 1;
    for(i=j=0; i<len && j < maxlen; i++) {
        if(instr[i]=='%') {
            i++;
            cmd[j]=0;
                case 'A':   /* User alias */
                    strncat(cmd,QUOTED_STRING(instr[i],useron.alias,str,sizeof(str)), avail);
                    break;
                case 'B':   /* Baud (DTE) Rate */
                    strncat(cmd,ultoa(dte_rate,str,10), avail);
                    break;
                case 'C':   /* Connect Description */
                    strncat(cmd,connection, avail);
                    break;
                case 'D':   /* Connect (DCE) Rate */
                    strncat(cmd,ultoa((uint)cur_rate,str,10), avail);
                    break;
                case 'E':   /* Estimated Rate */
                    strncat(cmd,ultoa((uint)cur_cps*10,str,10), avail);
                    break;
                case 'F':   /* File path */
#if defined(__linux__)
					if(!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);
					}
					else
#endif
						strncat(cmd,QUOTED_STRING(instr[i],fpath,str,sizeof(str)), avail);
                    break;
                case 'G':   /* Temp directory */
#if defined(__linux__)
						strncat(cmd, DOSEMU_TEMP_DIR, avail);
					else
#endif
	                    strncat(cmd,cfg.temp_dir, avail);
                    strncat(cmd,ultoa(client_socket_dup,str,10), avail);
#if defined(__linux__)
						strncat(cmd, DOSEMU_DATA_DIR, avail);
					else
#endif
						strncat(cmd,cfg.data_dir, avail);
#if defined(__linux__)
						strncat(cmd, DOSEMU_CTRL_DIR, avail);
					else
#endif
	                    strncat(cmd,cfg.ctrl_dir, avail);
                    break;
                case 'L':   /* Lines per message */
                    strncat(cmd,ultoa(cfg.level_linespermsg[useron.level],str,10), avail);
                    break;
                case 'M':   /* Minutes (credits) for user */
                    strncat(cmd,ultoa(useron.min,str,10), avail);
                    break;
                case 'N':   /* Node Directory (same as SBBSNODE environment var) */
#if defined(__linux__)
						strncat(cmd, DOSEMU_NODE_DIR, avail);
					else
#endif
	                    strncat(cmd,cfg.node_dir, avail);
                    break;
                case 'O':   /* SysOp */
                    strncat(cmd,QUOTED_STRING(instr[i],cfg.sys_op,str,sizeof(str)), avail);
                    strncat(cmd, passthru_thread_running ? "raw" : client.protocol, avail);
                    break;
                case 'Q':   /* QWK ID */
                    strncat(cmd,cfg.sys_id, avail);
                    break;
                case 'R':   /* Rows */
                    strncat(cmd,ultoa(rows,str,10), avail);
                case 'S':   /* File Spec (or Baja command str) or startup-directory */
                    break;
                case 'T':   /* Time left in seconds */
                    gettimeleft();
                    strncat(cmd,ultoa(timeleft,str,10), avail);
                    break;
                case 'U':   /* UART I/O Address (in hex) */
                    strncat(cmd,ultoa(cfg.com_base,str,16), avail);
                    break;
                case 'V':   /* Synchronet Version */
                    snprintf(str, sizeof str, "%s%c",VERSION,REVISION);
                    strncat(cmd,ultoa(cols,str,10), avail);
                    strncat(cmd,cfg.shell[useron.shell]->code, avail);
                    break;
                case '&':   /* Address of msr */
                    break;
                case 'Y':
#if defined(__linux__)
						strncat(cmd, DOSEMU_TEXT_DIR, avail);
					else
#endif
	                    strncat(cmd,cfg.text_dir, avail);
				case '~':	/* DOS-compatible (8.3) filename */
#ifdef _WIN32
					GetShortPathName(fpath,sfpath,sizeof(sfpath));
                    strncat(cmd,QUOTED_STRING(instr[i],fpath,str,sizeof(str)), avail);
#endif
                case '!':   /* EXEC Directory */
#if defined(__linux__)
						strncat(cmd, DOSEMU_EXEC_DIR, avail);
					else
#endif
	                    strncat(cmd,cfg.exec_dir, avail);
                case '@':   /* EXEC Directory for DOS/OS2/Win32, blank for Unix */
#ifndef __unix__
                    strncat(cmd,cfg.exec_dir, avail);
                case '#':   /* Node number (same as SBBSNNUM environment var) */
                    snprintf(str, sizeof str, "%d",cfg.node_num);
                    snprintf(str, sizeof str, "%03d",cfg.node_num);
                    break;
                case '$':   /* Credits */
                    strncat(cmd,_ui64toa(user_available_credits(&useron),str,10), avail);
                    break;
                case '%':   /* %% for percent sign */
				case '.':	/* .exe for DOS/OS2/Win32, blank for Unix */
#ifndef __unix__
				case '?':	/* Platform */
#ifdef __OS2__
					strcpy(str,"OS2");
#else
				case '^':	/* Architecture */
					strncat(cmd, ARCHITECTURE_DESC, avail);
					break;
				case '+':	/* Real name */
					strncat(cmd, quoted_string(useron.name, str, sizeof(str)), avail);
					break;
				case '-':	/* Chat handle */
					strncat(cmd, quoted_string(useron.handle, str, sizeof(str)), avail);
					break;
                default:    /* unknown specification */
                        snprintf(str, sizeof str, "%0*d",instr[i]&0xf,useron.number);