Select Git revision
execmisc.cpp
-
Rob Swindell authored
This won't impact Synchronet as it has a separate signal handling thread, but we still need to behave properly for processes that don't. I'm also saying that ENOMEM does not indicate a disconnection, though it may be better to pretend it was disconnected...
Rob Swindell authoredThis won't impact Synchronet as it has a separate signal handling thread, but we still need to behave properly for processes that don't. I'm also saying that ENOMEM does not indicate a disconnection, though it may be better to pretend it was disconnected...
execmisc.cpp 40.93 KiB
/* Synchronet miscellaneous command shell/module routines */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "sbbs.h"
#include "cmdshell.h"
#include "xpprintf.h"
static char* format_string(sbbs_t* sbbs, csi_t* csi)
{
char* fmt;
void* vp;
int32_t* lp;
unsigned i;
unsigned args;
fmt=xp_asprintf_start((char*)csi->ip);
while(*(csi->ip++)); /* Find '\0' terminator */
args=*(csi->ip++); /* total args */
for(i=0;i<args;i++) {
if((vp=sbbs->getstrvar(csi,*(int32_t *)csi->ip))==NULL) {
if((lp=sbbs->getintvar(csi,*(int32_t *)csi->ip))==NULL)
fmt=xp_asprintf_next(fmt,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,0);
else
fmt=xp_asprintf_next(fmt,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,*lp);
}
else
fmt=xp_asprintf_next(fmt,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_CHARP,*(char **)vp);
csi->ip+=4;
}
return xp_asprintf_end(fmt, NULL);
}
int sbbs_t::exec_misc(csi_t* csi, const char *path)
{
char str[512],tmp[512],buf[1025],ch,op,*p,**pp,**pp1,**pp2;
ushort w;
uint i=0,j;
long l;
int32_t *lp=NULL,*lp1=NULL,*lp2=NULL;
void *vp;
struct dirent *de;
struct tm tm;
FILE* fp;
DIR* dp;
switch(*(csi->ip++)) {
case CS_VAR_INSTRUCTION:
switch(*(csi->ip++)) { /* sub-op-code stored as next byte */
case PRINT_VAR:
pp=getstrvar(csi,*(int32_t *)csi->ip);
if(!pp || !*pp) {
lp=getintvar(csi,*(int32_t *)csi->ip);