Annotation of sbbs/sbbs2/execmisc.c, revision 1.1

1.1     ! root        1: #line 1 "EXECMISC.C"
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: #include "sbbs.h"
        !             6: #include "cmdshell.h"
        !             7: #include <sys/locking.h>
        !             8: #include <dirent.h>
        !             9: 
        !            10: 
        !            11: int exec_misc(csi_t *csi, uchar *path)
        !            12: {
        !            13:        uchar   str[256],tmp2[128],buf[1025],ch,*p,**pp,**pp1,**pp2;
        !            14:        ushort  w;
        !            15:        int     i,j,k,s,file;
        !            16:        long    l,*lp,*lp1,*lp2;
        !            17:        void    *vp;
        !            18:        va_list arglist[64];
        !            19:        struct  dirent *de;
        !            20:     struct  tm *tm_p;
        !            21:        struct  ftime ft;
        !            22:        FILE    *fp;
        !            23: 
        !            24: switch(*(csi->ip++)) {
        !            25:        case CS_VAR_INSTRUCTION:
        !            26:                switch(*(csi->ip++)) {  /* sub-op-code stored as next byte */
        !            27:                        case PRINT_VAR:
        !            28:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !            29:                                if(!pp || !*pp) {
        !            30:                                        lp=getintvar(csi,*(long *)csi->ip);
        !            31:                                        if(lp)
        !            32:                                                bprintf("%ld",*lp); }
        !            33:                                else
        !            34:                                        putmsg(cmdstr(*pp,path,csi->str,buf)
        !            35:                                                ,P_SAVEATR|P_NOABORT);
        !            36:                                csi->ip+=4;
        !            37:                                return(0);
        !            38:                        case VAR_PRINTF:
        !            39:                                strcpy(str,csi->ip);
        !            40:                                while(*(csi->ip++));    /* Find NULL */
        !            41:                                j=*(csi->ip++);                 /* total args */
        !            42:                                for(i=0;i<j;i++) {
        !            43:                                        vp=getstrvar(csi,*(long *)csi->ip);
        !            44:                                        if(!vp) {
        !            45:                                                lp=getintvar(csi,*(long *)csi->ip);
        !            46:                                                if(!lp)
        !            47:                                                        arglist[i]=0;
        !            48:                                                else
        !            49:                                                        arglist[i]=(void *)*lp; }
        !            50:                                        else
        !            51:                                                arglist[i]=*(char **)vp;
        !            52:                                        csi->ip+=4; }
        !            53:                                vsprintf(tmp,str,arglist);
        !            54:                                putmsg(cmdstr(tmp,path,csi->str,buf),P_SAVEATR|P_NOABORT);
        !            55:                                return(0);
        !            56:                        case SHOW_VARS:
        !            57:                                bprintf("shell     str=(%08lX) %s\r\n"
        !            58:                                        ,csi->str,csi->str);
        !            59:                                for(i=0;i<csi->str_vars;i++)
        !            60:                                        bprintf("local  str[%d]=(%08lX) (%08lX) %s\r\n"
        !            61:                                                ,i,csi->str_var_name[i]
        !            62:                                                ,csi->str_var[i]
        !            63:                                                ,csi->str_var[i]);
        !            64:                                for(i=0;i<csi->int_vars;i++)
        !            65:                                        bprintf("local  int[%d]=(%08lX) (%08lX) %ld\r\n"
        !            66:                                                ,i,csi->int_var_name[i]
        !            67:                                                ,csi->int_var[i]
        !            68:                                                ,csi->int_var[i]);
        !            69:                                for(i=0;i<global_str_vars;i++)
        !            70:                                        bprintf("global str[%d]=(%08lX) (%08lX) %s\r\n"
        !            71:                                                ,i,global_str_var_name[i]
        !            72:                                                ,global_str_var[i]
        !            73:                                                ,global_str_var[i]);
        !            74:                                for(i=0;i<global_int_vars;i++)
        !            75:                                        bprintf("global int[%d]=(%08lX) (%08lX) %ld\r\n"
        !            76:                                                ,i,global_int_var_name[i]
        !            77:                                                ,global_int_var[i]
        !            78:                                                ,global_int_var[i]);
        !            79:                                return(0);
        !            80:                        case DEFINE_STR_VAR:
        !            81:                                if(getstrvar(csi,*(long *)csi->ip)) {
        !            82:                                        csi->ip+=4;
        !            83:                                        return(0); }
        !            84:                                csi->str_vars++;
        !            85:                                csi->str_var=REALLOC(csi->str_var
        !            86:                                        ,sizeof(char *)*csi->str_vars);
        !            87:                                csi->str_var_name=REALLOC(csi->str_var_name
        !            88:                                        ,sizeof(long)*csi->str_vars);
        !            89:                                if(csi->str_var==NULL
        !            90:                                        || csi->str_var_name==NULL) { /* REALLOC failed */
        !            91:                                        errormsg(WHERE,ERR_ALLOC,"local str var"
        !            92:                                                ,sizeof(char *)*csi->str_vars);
        !            93:                                        if(csi->str_var_name) {
        !            94:                                                FREE(csi->str_var_name);
        !            95:                                                csi->str_var_name=0; }
        !            96:                                        if(csi->str_var) {
        !            97:                                                FREE(csi->str_var);
        !            98:                                                csi->str_var=0; }
        !            99:                                        csi->str_vars=0; }
        !           100:                                else {
        !           101:                                        csi->str_var_name[csi->str_vars-1]=*(long *)csi->ip;
        !           102:                                        csi->str_var[csi->str_vars-1]=0; }
        !           103:                                csi->ip+=4; /* Skip variable name */
        !           104:                                return(0);
        !           105:                        case DEFINE_INT_VAR:
        !           106:                                if(getintvar(csi,*(long *)csi->ip)) {
        !           107:                                        csi->ip+=4;
        !           108:                                        return(0); }
        !           109:                                csi->int_vars++;
        !           110:                                csi->int_var=REALLOC(csi->int_var
        !           111:                                        ,sizeof(char *)*csi->int_vars);
        !           112:                                csi->int_var_name=REALLOC(csi->int_var_name
        !           113:                                        ,sizeof(long)*csi->int_vars);
        !           114:                                if(csi->int_var==NULL
        !           115:                                        || csi->int_var_name==NULL) { /* REALLOC failed */
        !           116:                                        errormsg(WHERE,ERR_ALLOC,"local int var"
        !           117:                                                ,sizeof(char *)*csi->int_vars);
        !           118:                                        if(csi->int_var_name) {
        !           119:                                                FREE(csi->int_var_name);
        !           120:                                                csi->int_var_name=0; }
        !           121:                                        if(csi->int_var) {
        !           122:                                                FREE(csi->int_var);
        !           123:                                                csi->int_var=0; }
        !           124:                                        csi->int_vars=0; }
        !           125:                                else {
        !           126:                                        csi->int_var_name[csi->int_vars-1]=*(long *)csi->ip;
        !           127:                                        csi->int_var[csi->int_vars-1]=0; }
        !           128:                                csi->ip+=4; /* Skip variable name */
        !           129:                                return(0);
        !           130:                        case DEFINE_GLOBAL_STR_VAR:
        !           131:                                if(getstrvar(csi,*(long *)csi->ip)) {
        !           132:                                        csi->ip+=4;
        !           133:                                        return(0); }
        !           134:                                global_str_vars++;
        !           135:                                global_str_var=REALLOC(global_str_var
        !           136:                                        ,sizeof(char *)*global_str_vars);
        !           137:                                global_str_var_name=REALLOC(global_str_var_name
        !           138:                                        ,sizeof(long)*global_str_vars);
        !           139:                                if(global_str_var==NULL
        !           140:                                        || global_str_var_name==NULL) { /* REALLOC failed */
        !           141:                                        errormsg(WHERE,ERR_ALLOC,"global str var"
        !           142:                                                ,sizeof(char *)*global_str_vars);
        !           143:                                        if(global_str_var_name) {
        !           144:                                                FREE(global_str_var_name);
        !           145:                                                global_str_var_name=0; }
        !           146:                                        if(global_str_var) {
        !           147:                                                FREE(global_str_var);
        !           148:                                                global_str_var=0; }
        !           149:                                        global_str_vars=0; }
        !           150:                                else {
        !           151:                                        global_str_var_name[global_str_vars-1]=
        !           152:                                                *(long *)csi->ip;
        !           153:                                        global_str_var[global_str_vars-1]=0; }
        !           154:                                csi->ip+=4; /* Skip variable name */
        !           155:                                return(0);
        !           156:                        case DEFINE_GLOBAL_INT_VAR:
        !           157:                                if(getintvar(csi,*(long *)csi->ip)) {
        !           158:                                        csi->ip+=4;
        !           159:                                        return(0); }
        !           160:                                global_int_vars++;
        !           161:                                global_int_var=REALLOC(global_int_var
        !           162:                                        ,sizeof(char *)*global_int_vars);
        !           163:                                global_int_var_name=REALLOC(global_int_var_name
        !           164:                                        ,sizeof(long)*global_int_vars);
        !           165:                                if(global_int_var==NULL
        !           166:                                        || global_int_var_name==NULL) { /* REALLOC failed */
        !           167:                                        errormsg(WHERE,ERR_ALLOC,"local int var"
        !           168:                                                ,sizeof(char *)*global_int_vars);
        !           169:                                        if(global_int_var_name) {
        !           170:                                                FREE(global_int_var_name);
        !           171:                                                global_int_var_name=0; }
        !           172:                                        if(global_int_var) {
        !           173:                                                FREE(global_int_var);
        !           174:                                                global_int_var=0; }
        !           175:                                        global_int_vars=0; }
        !           176:                                else {
        !           177:                                        global_int_var_name[global_int_vars-1]
        !           178:                                                =*(long *)csi->ip;
        !           179:                                        global_int_var[global_int_vars-1]=0; }
        !           180:                                csi->ip+=4; /* Skip variable name */
        !           181:                                return(0);
        !           182: 
        !           183:                        case SET_STR_VAR:
        !           184:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           185:                                csi->ip+=4; /* Skip variable name */
        !           186:                                if(pp)
        !           187:                                        *pp=copystrvar(csi,*pp
        !           188:                                                ,cmdstr(csi->ip,path,csi->str,buf));
        !           189:                                while(*(csi->ip++));     /* Find NULL */
        !           190:                                return(0);
        !           191:                        case SET_INT_VAR:
        !           192:                                lp=getintvar(csi,*(long *)csi->ip);
        !           193:                                csi->ip+=4; /* Skip variable name */
        !           194:                                if(lp)
        !           195:                                        *lp=*(long *)csi->ip;
        !           196:                                csi->ip+=4; /* Skip value */
        !           197:                                return(0);
        !           198:                        case COMPARE_STR_VAR:
        !           199:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           200:                                csi->ip+=4; /* Skip variable name */
        !           201:                                if(pp)
        !           202:                                        csi->logic=stricmp(*pp
        !           203:                                                ,cmdstr(csi->ip,path,csi->str,buf));
        !           204:                                else {  /* Uninitialized str var */
        !           205:                                        if(*(csi->ip)==0)        /* Blank static str */
        !           206:                                                csi->logic=LOGIC_TRUE;
        !           207:                                        else
        !           208:                                                csi->logic=LOGIC_FALSE; }
        !           209:                                while(*(csi->ip++));     /* Find NULL */
        !           210:                                return(0);
        !           211:                        case STRSTR_VAR:
        !           212:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           213:                                csi->ip+=4; /* Skip variable name */
        !           214:                                if(pp && *pp && strstr(*pp
        !           215:                                        ,cmdstr(csi->ip,path,csi->str,buf)))
        !           216:                                        csi->logic=LOGIC_TRUE;
        !           217:                                else
        !           218:                                        csi->logic=LOGIC_FALSE;
        !           219:                                while(*(csi->ip++));     /* Find NULL */
        !           220:                                return(0);
        !           221:                        case STRNCMP_VAR:
        !           222:                                i=*csi->ip++;
        !           223:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           224:                                csi->ip+=4; /* Skip variable name */
        !           225:                                if(pp && *pp)
        !           226:                                        csi->logic=strnicmp(*pp
        !           227:                                                ,cmdstr(csi->ip,path,csi->str,buf),i);
        !           228:                                else
        !           229:                                        csi->logic=LOGIC_FALSE;
        !           230:                                while(*(csi->ip++));     /* Find NULL */
        !           231:                                return(0);
        !           232:                        case STRNCMP_VARS:
        !           233:                                i=*csi->ip++;
        !           234:                                (char **)pp1=getstrvar(csi,*(long *)csi->ip);
        !           235:                                csi->ip+=4; /* Skip variable name */
        !           236:                                (char **)pp2=getstrvar(csi,*(long *)csi->ip);
        !           237:                                csi->ip+=4;
        !           238:                                if(pp1 && *pp1 && pp2 && *pp2)
        !           239:                                        csi->logic=strnicmp(*pp1,*pp2,i);
        !           240:                                else
        !           241:                                        csi->logic=LOGIC_FALSE;
        !           242:                                return(0);
        !           243:                        case STRSTR_VARS:
        !           244:                                (char **)pp1=getstrvar(csi,*(long *)csi->ip);
        !           245:                                csi->ip+=4; /* Skip variable name */
        !           246:                                (char **)pp2=getstrvar(csi,*(long *)csi->ip);
        !           247:                                csi->ip+=4;
        !           248:                                if(pp1 && *pp1 && pp2 && *pp2 && strstr(*pp1,*pp2))
        !           249:                                        csi->logic=LOGIC_TRUE;
        !           250:                                else
        !           251:                                        csi->logic=LOGIC_FALSE;
        !           252:                                return(0);
        !           253:                        case COMPARE_INT_VAR:
        !           254:                                lp=getintvar(csi,*(long *)csi->ip);
        !           255:                                csi->ip+=4; /* Skip variable name */
        !           256:                                l=*(long *)csi->ip;
        !           257:                                csi->ip+=4; /* Skip static value */
        !           258:                                if(!lp) {       /* Unknown variable */
        !           259:                                        csi->logic=LOGIC_FALSE;
        !           260:                                        return(0); }
        !           261:                                if(*lp>l)
        !           262:                                        csi->logic=LOGIC_GREATER;
        !           263:                                else if(*lp<l)
        !           264:                                        csi->logic=LOGIC_LESS;
        !           265:                                else
        !           266:                                        csi->logic=LOGIC_EQUAL;
        !           267:                                return(0);
        !           268:                        case COMPARE_VARS:
        !           269:                                lp1=lp2=0;
        !           270:                                (char **)pp1=getstrvar(csi,*(long *)csi->ip);
        !           271:                                if(!pp1)
        !           272:                                        lp1=getintvar(csi,*(long *)csi->ip);
        !           273:                                csi->ip+=4; /* Skip variable name */
        !           274:                                (char **)pp2=getstrvar(csi,*(long *)csi->ip);
        !           275:                                if(!pp2)
        !           276:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !           277:                                csi->ip+=4; /* Skip variable name */
        !           278: 
        !           279:                                if(((!pp1 || !*pp1) && !lp1)
        !           280:                                        || ((!pp2 || !*pp2) && !lp2)) {
        !           281:                                        if(pp1 && pp2)          /* Both unitialized or blank */
        !           282:                                                csi->logic=LOGIC_TRUE;
        !           283:                                        else
        !           284:                                                csi->logic=LOGIC_FALSE;
        !           285:                                        return(0); }
        !           286: 
        !           287:                                if(pp1) { /* ASCII */
        !           288:                                        if(!pp2) {
        !           289:                                                ltoa(*lp2,tmp,10);
        !           290:                                                csi->logic=stricmp(*pp1,tmp); }
        !           291:                                        else
        !           292:                                                csi->logic=stricmp(*pp1,*pp2);
        !           293:                                        return(0); }
        !           294: 
        !           295:                                /* Binary */
        !           296:                                if(!lp2) {
        !           297:                                        l=strtol(*pp2,0,0);
        !           298:                                        if(*lp1>l)
        !           299:                                                csi->logic=LOGIC_GREATER;
        !           300:                                        else if(*lp1<l)
        !           301:                                                csi->logic=LOGIC_LESS;
        !           302:                                        else
        !           303:                                                csi->logic=LOGIC_EQUAL;
        !           304:                                        return(0); }
        !           305:                                if(*lp1>*lp2)
        !           306:                                        csi->logic=LOGIC_GREATER;
        !           307:                                else if(*lp1<*lp2)
        !           308:                                        csi->logic=LOGIC_LESS;
        !           309:                                else
        !           310:                                        csi->logic=LOGIC_EQUAL;
        !           311:                                return(0);
        !           312:                        case COPY_VAR:
        !           313:                                lp1=lp2=0;
        !           314:                                (char **)pp1=getstrvar(csi,*(long *)csi->ip);
        !           315:                                if(!pp1)
        !           316:                                        lp1=getintvar(csi,*(long *)csi->ip);
        !           317:                                csi->ip+=4; /* Skip variable name */
        !           318:                                (char **)pp2=getstrvar(csi,*(long *)csi->ip);
        !           319:                                if(!pp2)
        !           320:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !           321:                                csi->ip+=4; /* Skip variable name */
        !           322: 
        !           323:                                if((!pp1 && !lp1)
        !           324:                                        || ((!pp2 || !*pp2) && !lp2)) {
        !           325:                                        csi->logic=LOGIC_FALSE;
        !           326:                                        return(0); }
        !           327:                                csi->logic=LOGIC_TRUE;
        !           328: 
        !           329:                                if(pp1) {       /* ASCII */
        !           330:                                        if(!pp2)
        !           331:                                                ltoa(*lp2,tmp,10);
        !           332:                                        else
        !           333:                                                strcpy(tmp,*pp2);
        !           334:                                        *pp1=copystrvar(csi,*pp1,tmp);
        !           335:                                        return(0); }
        !           336:                                if(!lp2)
        !           337:                                        *lp1=strtol(*pp2,0,0);
        !           338:                                else
        !           339:                                        *lp1=*lp2;
        !           340:                                return(0);
        !           341:                        case SWAP_VARS:
        !           342:                                lp1=lp2=0;
        !           343:                                (char **)pp1=getstrvar(csi,*(long *)csi->ip);
        !           344:                                if(!pp1)
        !           345:                                        lp1=getintvar(csi,*(long *)csi->ip);
        !           346:                                csi->ip+=4; /* Skip variable name */
        !           347:                                (char **)pp2=getstrvar(csi,*(long *)csi->ip);
        !           348:                                if(!pp2)
        !           349:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !           350:                                csi->ip+=4; /* Skip variable name */
        !           351: 
        !           352:                                if(((!pp1 || !*pp1) && !lp1)
        !           353:                                        || ((!pp2 || !*pp2) && !lp2)) {
        !           354:                                        csi->logic=LOGIC_FALSE;
        !           355:                                        return(0); }
        !           356: 
        !           357:                                csi->logic=LOGIC_TRUE;
        !           358: 
        !           359:                                if(pp1) {       /* ASCII */
        !           360:                                        if(!pp2) {
        !           361:                                                if(!strnicmp(*pp2,"0x",2)) {
        !           362:                                                        l=strtol((*pp1)+2,0,16);
        !           363:                                                        ltoa(*lp2,tmp,16); }
        !           364:                                                else {
        !           365:                                                        l=atol(*pp1);
        !           366:                                                        ltoa(*lp2,tmp,10); }
        !           367:                                                *pp1=copystrvar(csi,*pp1,tmp);
        !           368:                                                *lp2=l; }
        !           369:                                        else {
        !           370:                                                p=*pp1;
        !           371:                                                *pp1=*pp2;
        !           372:                                                *pp2=p; }
        !           373:                                        return(0); }
        !           374: 
        !           375:                                /* Binary */
        !           376:                                if(!lp2) {
        !           377:                                        if(!strnicmp(*pp2,"0x",2)) {
        !           378:                                                l=strtol((*pp2)+2,0,16);
        !           379:                                                ltoa(*lp1,tmp,16); }
        !           380:                                        else {
        !           381:                                                l=atol(*pp2);
        !           382:                                                ltoa(*lp1,tmp,10); }
        !           383:                                        *pp2=copystrvar(csi,*pp2,tmp);
        !           384:                                        *lp1=l; }
        !           385:                                else {
        !           386:                                        l=*lp1;
        !           387:                                        *lp1=*lp2;
        !           388:                                        *lp2=l; }
        !           389:                                return(0);
        !           390:                        case CAT_STR_VAR:
        !           391:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           392:                                csi->ip+=4; /* Skip variable name */
        !           393:                                strcpy(tmp,csi->ip);
        !           394:                                while(*(csi->ip++));
        !           395:                                if(pp && *pp)
        !           396:                                        for(i=0;i<MAX_SYSVARS;i++)
        !           397:                                                if(*pp==sysvar_p[i])
        !           398:                                                        break;
        !           399:                                if(pp && *pp!=csi->str && i==MAX_SYSVARS) {
        !           400:                                        if(*pp)
        !           401:                                                *pp=REALLOC(*pp,strlen(*pp)+strlen(tmp)+1);
        !           402:                                        else
        !           403:                                                *pp=REALLOC(*pp,strlen(tmp)+1); }
        !           404:                                if(pp && *pp)
        !           405:                                        strcat(*pp,tmp);
        !           406:                                return(0);
        !           407:                        case CAT_STR_VARS:
        !           408:                                (char **)pp1=getstrvar(csi,*(long *)csi->ip);
        !           409:                                csi->ip+=4; /* Skip dest variable name */
        !           410:                                (char **)pp2=getstrvar(csi,*(long *)csi->ip);
        !           411:                                csi->ip+=4; /* Skip source variable name */
        !           412:                                if(!pp1 || !pp2 || !*pp2) {
        !           413:                                        csi->logic=LOGIC_FALSE;
        !           414:                                        return(0); }
        !           415:                                csi->logic=LOGIC_TRUE;
        !           416:                                if(*pp1)
        !           417:                                        for(i=0;i<MAX_SYSVARS;i++)
        !           418:                                                if(*pp1==sysvar_p[i])
        !           419:                                                        break;
        !           420:                                if(*pp1!=csi->str && (!*pp1 || i==MAX_SYSVARS)) {
        !           421:                                        if(*pp1)
        !           422:                                                *pp1=REALLOC(*pp1,strlen(*pp1)+strlen(*pp2)+1);
        !           423:                                        else
        !           424:                                                *pp1=REALLOC(*pp1,strlen(*pp2)+1); }
        !           425:                                strcat(*pp1,*pp2);
        !           426:                                return(0);
        !           427:                        case FORMAT_STR_VAR:
        !           428:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           429:                                csi->ip+=4; /* Skip variable name */
        !           430:                                strcpy(str,csi->ip);
        !           431:                                while(*(csi->ip++));    /* Find NULL */
        !           432:                                j=*(csi->ip++);                 /* total args */
        !           433:                                for(i=0;i<j;i++) {
        !           434:                                        vp=getstrvar(csi,*(long *)csi->ip);
        !           435:                                        if(!vp) {
        !           436:                                                lp=getintvar(csi,*(long *)csi->ip);
        !           437:                                                if(!lp)
        !           438:                                                        arglist[i]=0;
        !           439:                                                else
        !           440:                                                        arglist[i]=(void *)*lp; }
        !           441:                                        else
        !           442:                                                arglist[i]=*(char **)vp;
        !           443:                                        csi->ip+=4; }
        !           444:                                vsprintf(tmp,str,arglist);
        !           445:                                cmdstr(tmp,path,csi->str,str);
        !           446:                                if(pp)
        !           447:                                        *pp=copystrvar(csi,*pp,str);
        !           448:                                return(0);
        !           449:                        case FORMAT_TIME_STR:
        !           450:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           451:                                csi->ip+=4; /* Skip variable name */
        !           452:                                strcpy(str,csi->ip);
        !           453:                                while(*(csi->ip++));    /* Find NULL */
        !           454:                                lp=getintvar(csi,*(long *)csi->ip);
        !           455:                                csi->ip+=4;
        !           456:                                if(pp && lp) {
        !           457:                                        tm_p=gmtime(lp);
        !           458:                                        strftime(buf,128,str,tm_p);
        !           459:                                        *pp=copystrvar(csi,*pp,buf); }
        !           460:                                return(0);
        !           461:                        case TIME_STR:
        !           462:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           463:                                csi->ip+=4; /* Skip str variable name */
        !           464:                                lp=getintvar(csi,*(long *)csi->ip);
        !           465:                                csi->ip+=4; /* Skip int variable name */
        !           466:                                if(pp && lp) {
        !           467:                                        strcpy(str,timestr(lp));
        !           468:                                        *pp=copystrvar(csi,*pp,str); }
        !           469:                                return(0);
        !           470:                        case DATE_STR:
        !           471:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           472:                                csi->ip+=4; /* Skip str variable name */
        !           473:                                lp=getintvar(csi,*(long *)csi->ip);
        !           474:                                csi->ip+=4; /* Skip int variable name */
        !           475:                                if(pp && lp) {
        !           476:                                        unixtodstr(*lp,str);
        !           477:                                        *pp=copystrvar(csi,*pp,str); }
        !           478:                                return(0);
        !           479:                        case SECOND_STR:
        !           480:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           481:                                csi->ip+=4; /* Skip str variable name */
        !           482:                                lp=getintvar(csi,*(long *)csi->ip);
        !           483:                                csi->ip+=4; /* Skip int variable name */
        !           484:                                if(pp && lp) {
        !           485:                                        sectostr(*lp,str);
        !           486:                                        *pp=copystrvar(csi,*pp,str); }
        !           487:                                return(0);
        !           488:                        case STRUPR_VAR:
        !           489:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           490:                                csi->ip+=4;
        !           491:                                if(pp && *pp)
        !           492:                                        strupr(*pp);
        !           493:                                return(0);
        !           494:                        case STRLWR_VAR:
        !           495:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           496:                                csi->ip+=4;
        !           497:                                if(pp && *pp)
        !           498:                                        strlwr(*pp);
        !           499:                                return(0);
        !           500:                        case TRUNCSP_STR_VAR:
        !           501:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           502:                                csi->ip+=4;
        !           503:                                if(pp && *pp)
        !           504:                                        truncsp(*pp);
        !           505:                                return(0);
        !           506:                        case STRIP_CTRL_STR_VAR:
        !           507:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           508:                                csi->ip+=4;
        !           509:                                if(pp && *pp)
        !           510:                                        strip_ctrl(*pp);
        !           511:                                return(0);
        !           512: 
        !           513:                        case ADD_INT_VAR:
        !           514:                        case SUB_INT_VAR:
        !           515:                        case MUL_INT_VAR:
        !           516:                        case DIV_INT_VAR:
        !           517:                        case MOD_INT_VAR:
        !           518:                        case AND_INT_VAR:
        !           519:                        case OR_INT_VAR:
        !           520:                        case NOT_INT_VAR:
        !           521:                        case XOR_INT_VAR:
        !           522:                                i=*(csi->ip-1);
        !           523:                                lp=getintvar(csi,*(long *)csi->ip);
        !           524:                                csi->ip+=4;
        !           525:                                l=*(long *)csi->ip;
        !           526:                                csi->ip+=4;
        !           527:                                if(!lp)
        !           528:                                        return(0);
        !           529:                                switch(i) {
        !           530:                                        case ADD_INT_VAR:
        !           531:                                                *lp+=l;
        !           532:                                                break;
        !           533:                                        case SUB_INT_VAR:
        !           534:                                                *lp-=l;
        !           535:                                                break;
        !           536:                                        case MUL_INT_VAR:
        !           537:                                                *lp*=l;
        !           538:                                                break;
        !           539:                                        case DIV_INT_VAR:
        !           540:                                                *lp/=l;
        !           541:                                                break;
        !           542:                                        case MOD_INT_VAR:
        !           543:                                                *lp%=l;
        !           544:                                                break;
        !           545:                                        case AND_INT_VAR:
        !           546:                                                *lp&=l;
        !           547:                                                break;
        !           548:                                        case OR_INT_VAR:
        !           549:                                                *lp|=l;
        !           550:                                                break;
        !           551:                                        case NOT_INT_VAR:
        !           552:                                                *lp&=~l;
        !           553:                                                break;
        !           554:                                        case XOR_INT_VAR:
        !           555:                                                *lp^=l;
        !           556:                                                break; }
        !           557:                                return(0);
        !           558:                        case ADD_INT_VARS:
        !           559:                        case SUB_INT_VARS:
        !           560:                        case MUL_INT_VARS:
        !           561:                        case DIV_INT_VARS:
        !           562:                        case MOD_INT_VARS:
        !           563:                        case AND_INT_VARS:
        !           564:                        case OR_INT_VARS:
        !           565:                        case NOT_INT_VARS:
        !           566:                        case XOR_INT_VARS:
        !           567:                                i=*(csi->ip-1);
        !           568:                                lp1=getintvar(csi,*(long *)csi->ip);
        !           569:                                csi->ip+=4;
        !           570:                                lp2=getintvar(csi,*(long *)csi->ip);
        !           571:                                csi->ip+=4;
        !           572:                                if(!lp1)
        !           573:                                        return(0);
        !           574:                                if(!lp2) {
        !           575:                                        (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           576:                                        if(!pp || !*pp)
        !           577:                                                return(0);
        !           578:                                        l=strtol(*pp,0,0); }
        !           579:                                else
        !           580:                                        l=*lp2;
        !           581:                                switch(i) {
        !           582:                                        case ADD_INT_VARS:
        !           583:                                                *lp1+=l;
        !           584:                                                break;
        !           585:                                        case SUB_INT_VARS:
        !           586:                                                *lp1-=l;
        !           587:                                                break;
        !           588:                                        case MUL_INT_VARS:
        !           589:                                                *lp1*=l;
        !           590:                                                break;
        !           591:                                        case DIV_INT_VARS:
        !           592:                                                *lp1/=l;
        !           593:                                                break;
        !           594:                                        case MOD_INT_VARS:
        !           595:                                                *lp1%=l;
        !           596:                                                break;
        !           597:                                        case AND_INT_VARS:
        !           598:                                                *lp1&=l;
        !           599:                                                break;
        !           600:                                        case OR_INT_VARS:
        !           601:                                                *lp1|=l;
        !           602:                                                break;
        !           603:                                        case NOT_INT_VARS:
        !           604:                                                *lp1&=~l;
        !           605:                                                break;
        !           606:                                        case XOR_INT_VARS:
        !           607:                                                *lp1^=l;
        !           608:                                                break; }
        !           609:                                return(0);
        !           610:                        case RANDOM_INT_VAR:
        !           611:                                lp=getintvar(csi,*(long *)csi->ip);
        !           612:                                csi->ip+=4;
        !           613:                                l=*(long *)csi->ip;
        !           614:                                csi->ip+=4;
        !           615:                                if(lp)
        !           616:                                        *lp=random(l);
        !           617:                                return(0);
        !           618:                        case TIME_INT_VAR:
        !           619:                                lp=getintvar(csi,*(long *)csi->ip);
        !           620:                                csi->ip+=4;
        !           621:                                if(lp)
        !           622:                                        *lp=time(NULL);
        !           623:                                return(0);
        !           624:                        case DATE_STR_TO_INT:
        !           625:                                lp=getintvar(csi,*(long *)csi->ip);
        !           626:                                csi->ip+=4;
        !           627:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           628:                                csi->ip+=4;
        !           629:                                if(lp && pp && *pp)
        !           630:                                        *lp=dstrtounix(*pp);
        !           631:                                return(0);
        !           632:                        case STRLEN_INT_VAR:
        !           633:                                lp=getintvar(csi,*(long *)csi->ip);
        !           634:                                csi->ip+=4;
        !           635:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           636:                                csi->ip+=4;
        !           637:                                if(lp) {
        !           638:                                        if(pp && *pp)
        !           639:                                                *lp=strlen(*pp);
        !           640:                                        else
        !           641:                                                *lp=0; }
        !           642:                                return(0);
        !           643:                        case CRC16_TO_INT:
        !           644:                                lp=getintvar(csi,*(long *)csi->ip);
        !           645:                                csi->ip+=4;
        !           646:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           647:                                csi->ip+=4;
        !           648:                                if(lp) {
        !           649:                                        if(pp && *pp)
        !           650:                                                *lp=crc16(*pp);
        !           651:                                        else
        !           652:                                                *lp=0; }
        !           653:                                return(0);
        !           654:                        case CRC32_TO_INT:
        !           655:                                lp=getintvar(csi,*(long *)csi->ip);
        !           656:                                csi->ip+=4;
        !           657:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           658:                                csi->ip+=4;
        !           659:                                if(lp) {
        !           660:                                        if(pp && *pp)
        !           661:                                                *lp=crc32(*pp,strlen(*pp));
        !           662:                                        else
        !           663:                                                *lp=0; }
        !           664:                                return(0);
        !           665:                        case CHKSUM_TO_INT:
        !           666:                                lp=getintvar(csi,*(long *)csi->ip);
        !           667:                                csi->ip+=4;
        !           668:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           669:                                csi->ip+=4;
        !           670:                                if(lp) {
        !           671:                                        *lp=0;
        !           672:                                        if(pp && *pp) {
        !           673:                                                i=0;
        !           674:                                                while(*((*pp)+i))
        !           675:                                                        *lp+=(uchar)*((*pp)+(i++)); } }
        !           676:                                return(0);
        !           677:                        case FLENGTH_TO_INT:
        !           678:                                lp=getintvar(csi,*(long *)csi->ip);
        !           679:                                csi->ip+=4;
        !           680:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           681:                                csi->ip+=4;
        !           682:                                if(lp) {
        !           683:                                        if(pp && *pp)
        !           684:                                                *lp=flength(*pp);
        !           685:                                        else
        !           686:                                                *lp=0; }
        !           687:                                return(0);
        !           688:                        case FTIME_TO_INT:
        !           689:                                lp=getintvar(csi,*(long *)csi->ip);
        !           690:                                csi->ip+=4;
        !           691:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           692:                                csi->ip+=4;
        !           693:                                if(lp) {
        !           694:                                        if(pp && *pp)
        !           695:                                                *lp=fdate_dir(*pp);
        !           696:                                        else
        !           697:                                                *lp=0; }
        !           698:                                return(0);
        !           699:                        case CHARVAL_TO_INT:
        !           700:                                lp=getintvar(csi,*(long *)csi->ip);
        !           701:                                csi->ip+=4;
        !           702:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           703:                                csi->ip+=4;
        !           704:                                if(lp) {
        !           705:                                        if(pp && *pp)
        !           706:                                                *lp=**pp;
        !           707:                                        else
        !           708:                                                *lp=0; }
        !           709:                                return(0);
        !           710:                        case GETSTR_VAR:
        !           711:                        case GETLINE_VAR:
        !           712:                        case GETNAME_VAR:
        !           713:                        case GETSTRUPR_VAR:
        !           714:                        case GETSTR_MODE:
        !           715:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           716:                                csi->ip+=4;
        !           717:                                i=*(csi->ip++);
        !           718:                                csi->logic=LOGIC_FALSE;
        !           719:                                switch(*(csi->ip-6)) {
        !           720:                                        case GETNAME_VAR:
        !           721:                                                getstr(buf,i,K_UPRLWR);
        !           722:                                                break;
        !           723:                                        case GETSTRUPR_VAR:
        !           724:                                                getstr(buf,i,K_UPPER);
        !           725:                                                break;
        !           726:                                        case GETLINE_VAR:
        !           727:                                                getstr(buf,i,K_LINE);
        !           728:                                                break;
        !           729:                                        case GETSTR_MODE:
        !           730:                                                l=*(long *)csi->ip;
        !           731:                                                csi->ip+=4;
        !           732:                                                if(l&K_EDIT) {
        !           733:                                                        if(pp && *pp)
        !           734:                                                                strcpy(buf,*pp);
        !           735:                                                        else
        !           736:                                                                buf[0]=0; }
        !           737:                                                getstr(buf,i,l);
        !           738:                                                break;
        !           739:                                        default:
        !           740:                                                getstr(buf,i,0); }
        !           741:                                if(sys_status&SS_ABORT)
        !           742:                                        return(0);
        !           743:                                if(pp) {
        !           744:                                        *pp=copystrvar(csi,*pp,buf);
        !           745:                                        csi->logic=LOGIC_TRUE; }
        !           746:                                return(0);
        !           747:                        case GETNUM_VAR:
        !           748:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           749:                                if(!pp)
        !           750:                                        lp=getintvar(csi,*(long *)csi->ip);
        !           751:                                csi->ip+=4;
        !           752:                                i=*(short *)csi->ip;
        !           753:                                csi->ip+=2;
        !           754:                                csi->logic=LOGIC_FALSE;
        !           755:                                l=getnum(i);
        !           756:                                if(!pp && !lp)
        !           757:                                        return(0);
        !           758:                                if(pp) {
        !           759:                                        if(l<=0)
        !           760:                                                str[0]=0;
        !           761:                                        else
        !           762:                                                ltoa(l,str,10);
        !           763:                                        *pp=copystrvar(csi,*pp,str);
        !           764:                                        csi->logic=LOGIC_TRUE;
        !           765:                                        return(0); }
        !           766:                                if(lp) {
        !           767:                                        *lp=l;
        !           768:                                        csi->logic=LOGIC_TRUE; }
        !           769:                                return(0);
        !           770: 
        !           771:                        case SHIFT_STR_VAR:
        !           772:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           773:                                csi->ip+=4;
        !           774:                                i=*(csi->ip++);
        !           775:                                if(!pp || !*pp)
        !           776:                                        return(0);
        !           777:                                if(strlen(*pp)>=i)
        !           778:                                        memmove(*pp,*pp+i,strlen(*pp)+1);
        !           779:                                return(0);
        !           780: 
        !           781:                        case CHKFILE_VAR:
        !           782:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           783:                                csi->ip+=4;
        !           784:                                if(pp && *pp && fexist(cmdstr(*pp,path,csi->str,buf)))
        !           785:                                        csi->logic=LOGIC_TRUE;
        !           786:                                else
        !           787:                                        csi->logic=LOGIC_FALSE;
        !           788:                                return(0);
        !           789:                        case PRINTFILE_VAR_MODE:
        !           790:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           791:                                csi->ip+=4;
        !           792:                                i=*(short *)(csi->ip);
        !           793:                                csi->ip+=2;
        !           794:                                if(pp && *pp)
        !           795:                                        printfile(*pp,i);
        !           796:                                return(0);
        !           797:                        case PRINTTAIL_VAR_MODE:
        !           798:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           799:                                csi->ip+=4;
        !           800:                                i=*(short *)(csi->ip);
        !           801:                                csi->ip+=2;
        !           802:                                j=*csi->ip;
        !           803:                                csi->ip++;
        !           804:                                if(pp && *pp)
        !           805:                                        printtail(*pp,j,i);
        !           806:                                return(0);
        !           807:                        case SEND_FILE_VIA:
        !           808:                        case RECEIVE_FILE_VIA:
        !           809:                                j=*(csi->ip-1);
        !           810:                                ch=*(csi->ip++);        /* Protocol */
        !           811:                                cmdstr(csi->ip,csi->str,csi->str,str);
        !           812:                                while(*(csi->ip++));    /* Find NULL */
        !           813:                                for(i=0;i<total_prots;i++)
        !           814:                                        if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron))
        !           815:                                                break;
        !           816:                                csi->logic=LOGIC_FALSE;
        !           817:                                if(i<total_prots)
        !           818:                                        if(external(cmdstr(j==SEND_FILE_VIA
        !           819:                                                ? prot[i]->dlcmd : prot[i]->ulcmd,str,str,buf)
        !           820:                                                ,EX_OUTL)==0)
        !           821:                                                csi->logic=LOGIC_TRUE;
        !           822:                                return(0);
        !           823:                        case SEND_FILE_VIA_VAR:
        !           824:                        case RECEIVE_FILE_VIA_VAR:
        !           825:                                j=*(csi->ip-1);
        !           826:                                ch=*(csi->ip++);        /* Protocol */
        !           827:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           828:                                csi->ip+=4;
        !           829:                                for(i=0;i<total_prots;i++)
        !           830:                                        if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron))
        !           831:                                                break;
        !           832:                                csi->logic=LOGIC_FALSE;
        !           833:                                if(!pp || !(*pp))
        !           834:                                        return(0);
        !           835:                                if(i<total_prots)
        !           836:                                        if(external(cmdstr(j==SEND_FILE_VIA_VAR
        !           837:                                                 ? prot[i]->dlcmd : prot[i]->ulcmd,*pp,*pp,buf)
        !           838:                                                ,EX_OUTL)==0)
        !           839:                                                csi->logic=LOGIC_TRUE;
        !           840:                                return(0);
        !           841: 
        !           842:                        default:
        !           843:                                errormsg(WHERE,ERR_CHK,"var sub-instruction",*(csi->ip-1));
        !           844:                                return(0); }
        !           845: 
        !           846:        case CS_FIO_FUNCTION:
        !           847:                switch(*(csi->ip++)) {  /* sub-op-code stored as next byte */
        !           848:                        case FIO_OPEN:
        !           849:                        case FIO_OPEN_VAR:
        !           850:                                lp=getintvar(csi,*(long *)csi->ip);
        !           851:                                csi->ip+=4;
        !           852:                                w=*(ushort *)csi->ip;
        !           853:                                csi->ip+=2;
        !           854:                                csi->logic=LOGIC_FALSE;
        !           855:                                if(*(csi->ip-7)==FIO_OPEN) {
        !           856:                                        cmdstr(csi->ip,path,csi->str,str);
        !           857:                                        while(*(csi->ip++)); }   /* skip filename */
        !           858:                                else {
        !           859:                                        (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           860:                                        csi->ip+=4;
        !           861:                                        if(!pp || !*pp)
        !           862:                                                return(0);
        !           863:                                        strcpy(str,*pp); }
        !           864:                                if(csi->files>=MAX_FOPENS)
        !           865:                                        return(0);
        !           866:                                if(lp) {
        !           867:                                        /* Access flags are not cross-platform, so convert */
        !           868:                                        i=0;
        !           869:                                        if(w&1)         i|=O_RDONLY;
        !           870:                                        if(w&2)         i|=O_WRONLY;
        !           871:                                        if(w&4)         i|=O_RDWR;
        !           872:                                        if(w&0x040) i|=O_DENYNONE;
        !           873:                                        if(w&0x100) i|=O_CREAT;
        !           874:                                        if(w&0x200) i|=O_TRUNC;
        !           875:                                        if(w&0x400) i|=O_EXCL;
        !           876:                                        if(w&0x800) i|=O_APPEND;
        !           877:                                        *lp=(long)fnopen(&j,str,i);
        !           878:                                        if(*lp) {
        !           879:                                                for(i=0;i<csi->files;i++)
        !           880:                                                        if(!csi->file[i])
        !           881:                                                                break;
        !           882:                                                csi->file[i]=(FILE *)*lp;
        !           883:                                                if(i==csi->files)
        !           884:                                                        csi->files++;
        !           885:                                                csi->logic=LOGIC_TRUE; } }
        !           886:                                return(0);
        !           887:                        case FIO_CLOSE:
        !           888:                                lp=getintvar(csi,*(long *)csi->ip);
        !           889:                                csi->ip+=4;
        !           890:                                if(lp && *lp) {
        !           891:                                        csi->logic=fclose((FILE *)*lp);
        !           892:                                        for(i=0;i<csi->files;i++)
        !           893:                                                if(csi->file[i]==(FILE *)*lp)
        !           894:                                                        csi->file[i]=0; }
        !           895:                                else
        !           896:                                        csi->logic=LOGIC_FALSE;
        !           897:                                return(0);
        !           898:                        case FIO_FLUSH:
        !           899:                                lp=getintvar(csi,*(long *)csi->ip);
        !           900:                                csi->ip+=4;
        !           901:                                if(lp && *lp)
        !           902:                                        csi->logic=fflush((FILE *)*lp);
        !           903:                                else
        !           904:                                        csi->logic=LOGIC_FALSE;
        !           905:                 return(0);
        !           906:                        case FIO_READ:
        !           907:                        case FIO_READ_VAR:
        !           908:                                lp1=getintvar(csi,*(long *)csi->ip);            /* Handle */
        !           909:                                csi->ip+=4;
        !           910:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           911:                                if(!pp)
        !           912:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !           913:                                csi->ip+=4;
        !           914:                                csi->logic=LOGIC_FALSE;
        !           915:                                if(*(csi->ip-9)==FIO_READ) {
        !           916:                                        i=*(short *)csi->ip;
        !           917:                                        csi->ip+=2; /* Length */ }
        !           918:                                else {                  /* FIO_READ_VAR */
        !           919:                                        vp=getintvar(csi,*(long *)csi->ip);
        !           920:                                        csi->ip+=4;
        !           921:                                        if(!vp)
        !           922:                                                return(0);
        !           923:                                        i=*(short *)vp; }
        !           924:                                if(i>1024)
        !           925:                                        i=1024;
        !           926:                                if(!lp1 || !(*lp1) || (!pp && !lp2))
        !           927:                                        return(0);
        !           928:                                if(pp) {
        !           929:                                        if(i<1) {
        !           930:                                                if(*pp && **pp)
        !           931:                                                        i=strlen(*pp);
        !           932:                                                else
        !           933:                                                        i=128; }
        !           934:                                        if((j=fread(buf,1,i,(FILE *)*lp1))==i)
        !           935:                                                csi->logic=LOGIC_TRUE;
        !           936:                                        buf[j]=0;
        !           937:                                        if(csi->etx) {
        !           938:                                                p=strchr(buf,csi->etx);
        !           939:                                                if(p) *p=0; }
        !           940:                                        *pp=copystrvar(csi,*pp,buf); }
        !           941:                                else {
        !           942:                                        *lp2=0;
        !           943:                                        if(i>4 || i<1) i=4;
        !           944:                                        if(fread(lp2,1,i,(FILE *)*lp1)==i)
        !           945:                                                csi->logic=LOGIC_TRUE; }
        !           946:                                return(0);
        !           947:                        case FIO_READ_LINE:
        !           948:                                lp1=getintvar(csi,*(long *)csi->ip);            /* Handle */
        !           949:                                csi->ip+=4;
        !           950:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           951:                                if(!pp)
        !           952:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !           953:                                csi->ip+=4;
        !           954:                                csi->logic=LOGIC_FALSE;
        !           955:                                if(!lp1 || !(*lp1) || feof((FILE *)*lp1) || (!pp && !lp2))
        !           956:                                        return(0);
        !           957:                                csi->logic=LOGIC_TRUE;
        !           958:                                for(i=0;i<1024 /* && !eof(*lp1) removed 1/23/96 */;i++) {
        !           959:                                        if(!fread(buf+i,1,1,(FILE *)*lp1))
        !           960:                                                break;
        !           961:                                        if(*(buf+i)==LF) {
        !           962:                                                i++;
        !           963:                                                break; } }
        !           964:                                buf[i]=0;
        !           965:                                if(csi->etx) {
        !           966:                                        p=strchr(buf,csi->etx);
        !           967:                                        if(p) *p=0; }
        !           968:                                if(pp)
        !           969:                                        *pp=copystrvar(csi,*pp,buf);
        !           970:                                else
        !           971:                                        *lp2=strtol(buf,0,0);
        !           972:                                return(0);
        !           973:                        case FIO_WRITE:
        !           974:                        case FIO_WRITE_VAR:
        !           975:                                lp1=getintvar(csi,*(long *)csi->ip);
        !           976:                                csi->ip+=4;
        !           977:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !           978:                                if(!pp)
        !           979:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !           980:                                csi->ip+=4;
        !           981:                                csi->logic=LOGIC_FALSE;
        !           982:                                if(*(csi->ip-9)==FIO_WRITE) {
        !           983:                                        i=*(short *)csi->ip;
        !           984:                                        csi->ip+=2; /* Length */ }
        !           985:                                else {                  /* FIO_WRITE_VAR */
        !           986:                                        vp=getintvar(csi,*(long *)csi->ip);
        !           987:                                        csi->ip+=4;
        !           988:                                        if(!vp)
        !           989:                                                return(0);
        !           990:                                        i=*(short *)vp; }
        !           991:                                if(i>1024)
        !           992:                                        i=1024;
        !           993:                                if(!lp1 || !(*lp1) || (!pp && !lp2) || (pp && !*pp))
        !           994:                                        return(0);
        !           995:                                if(pp) {
        !           996:                                        j=strlen(*pp);
        !           997:                                        if(i<1) i=j;
        !           998:                                        if(j>i) j=i;
        !           999:                                        j=fwrite(*pp,1,j,(FILE *)*lp1);
        !          1000:                                        if(j<i) {
        !          1001:                                                memset(buf,csi->etx,i-j);
        !          1002:                                                fwrite(buf,1,i-j,(FILE *)*lp1); }
        !          1003:                                        csi->logic=LOGIC_TRUE; }
        !          1004:                                else {
        !          1005:                                        if(i<1 || i>4) i=4;
        !          1006:                                        if(fwrite(lp2,1,i,(FILE *)*lp1)==i)
        !          1007:                                                csi->logic=LOGIC_TRUE; }
        !          1008:                                return(0);
        !          1009:                        case FIO_GET_LENGTH:
        !          1010:                                lp1=getintvar(csi,*(long *)csi->ip);
        !          1011:                                csi->ip+=4;
        !          1012:                                lp2=getintvar(csi,*(long *)csi->ip);
        !          1013:                                csi->ip+=4;
        !          1014:                                if(lp1 && *lp1 && lp2)
        !          1015:                                        *lp2=filelength(fileno((FILE *)*lp1));
        !          1016:                                return(0);
        !          1017:                        case FIO_GET_TIME:
        !          1018:                                lp1=getintvar(csi,*(long *)csi->ip);
        !          1019:                                csi->ip+=4;
        !          1020:                                lp2=getintvar(csi,*(long *)csi->ip);
        !          1021:                                csi->ip+=4;
        !          1022:                                if(lp1 && *lp1 && lp2) {
        !          1023:                                        getftime(fileno((FILE *)*lp1),&ft);
        !          1024:                                        *lp2=ftimetounix(ft); }
        !          1025:                                return(0);
        !          1026:                        case FIO_SET_TIME:
        !          1027:                                lp1=getintvar(csi,*(long *)csi->ip);
        !          1028:                                csi->ip+=4;
        !          1029:                                lp2=getintvar(csi,*(long *)csi->ip);
        !          1030:                                csi->ip+=4;
        !          1031:                                if(lp1 && *lp1 && lp2) {
        !          1032:                                        ft=unixtoftime(*lp2);
        !          1033:                                        setftime(fileno((FILE *)*lp1),&ft); }
        !          1034:                                return(0);
        !          1035:                        case FIO_EOF:
        !          1036:                                lp=getintvar(csi,*(long *)csi->ip);
        !          1037:                                csi->ip+=4;
        !          1038:                                csi->logic=LOGIC_FALSE;
        !          1039:                                if(lp && *lp)
        !          1040:                                        if(ftell((FILE *)*lp)>=filelength(fileno((FILE *)*lp)))
        !          1041:                                                csi->logic=LOGIC_TRUE;
        !          1042:                                return(0);
        !          1043:                        case FIO_GET_POS:
        !          1044:                                lp1=getintvar(csi,*(long *)csi->ip);
        !          1045:                                csi->ip+=4;
        !          1046:                                lp2=getintvar(csi,*(long *)csi->ip);
        !          1047:                                csi->ip+=4;
        !          1048:                                if(lp1 && *lp1 && lp2)
        !          1049:                                        *lp2=ftell((FILE *)*lp1);
        !          1050:                                return(0);
        !          1051:                        case FIO_SEEK:
        !          1052:                        case FIO_SEEK_VAR:
        !          1053:                                lp1=getintvar(csi,*(long *)csi->ip);
        !          1054:                                csi->ip+=4;
        !          1055:                                csi->logic=LOGIC_FALSE;
        !          1056:                                if(*(csi->ip-5)==FIO_SEEK) {
        !          1057:                                        l=*(long *)csi->ip;
        !          1058:                                        csi->ip+=4; }
        !          1059:                                else {
        !          1060:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !          1061:                                        csi->ip+=4;
        !          1062:                                        if(!lp2) {
        !          1063:                                                csi->ip+=2;
        !          1064:                                                return(0); }
        !          1065:                                        l=*lp2; }
        !          1066:                                i=*(short *)csi->ip;
        !          1067:                                csi->ip+=2;
        !          1068:                                if(lp1 && *lp1)
        !          1069:                                        if(fseek((FILE *)*lp1,l,i)!=-1)
        !          1070:                                                csi->logic=LOGIC_TRUE;
        !          1071:                                return(0);
        !          1072:                        case FIO_LOCK:
        !          1073:                        case FIO_LOCK_VAR:
        !          1074:                                lp1=getintvar(csi,*(long *)csi->ip);
        !          1075:                                csi->ip+=4;
        !          1076:                                csi->logic=LOGIC_FALSE;
        !          1077:                                if(*(csi->ip-5)==FIO_LOCK) {
        !          1078:                                        l=*(long *)csi->ip;
        !          1079:                                        csi->ip+=4; }
        !          1080:                                else {
        !          1081:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !          1082:                                        csi->ip+=4;
        !          1083:                                        if(!lp2)
        !          1084:                                                return(0);
        !          1085:                                        l=*lp2; }
        !          1086:                                if(lp1 && *lp1) {
        !          1087:                                        fflush((FILE *)*lp1);
        !          1088:                                        lseek(fileno((FILE *)*lp1),ftell((FILE *)*lp1),SEEK_SET);
        !          1089:                                        csi->logic=locking(fileno((FILE *)*lp1),LK_LOCK,l); }
        !          1090:                                return(0);
        !          1091:                        case FIO_UNLOCK:
        !          1092:                        case FIO_UNLOCK_VAR:
        !          1093:                                lp1=getintvar(csi,*(long *)csi->ip);
        !          1094:                                csi->ip+=4;
        !          1095:                                csi->logic=LOGIC_FALSE;
        !          1096:                                if(*(csi->ip-5)==FIO_UNLOCK) {
        !          1097:                                        l=*(long *)csi->ip;
        !          1098:                                        csi->ip+=4; }
        !          1099:                                else {
        !          1100:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !          1101:                                        csi->ip+=4;
        !          1102:                                        if(!lp2)
        !          1103:                                                return(0);
        !          1104:                                        l=*lp2; }
        !          1105:                                if(lp1 && *lp1) {
        !          1106:                                        fflush((FILE *)*lp1);
        !          1107:                                        lseek(fileno((FILE *)*lp1),ftell((FILE *)*lp1),SEEK_SET);
        !          1108:                                        csi->logic=locking(fileno((FILE *)*lp1),LK_UNLCK,l); }
        !          1109:                                return(0);
        !          1110:                        case FIO_SET_LENGTH:
        !          1111:                        case FIO_SET_LENGTH_VAR:
        !          1112:                                lp1=getintvar(csi,*(long *)csi->ip);
        !          1113:                                csi->ip+=4;
        !          1114:                                csi->logic=LOGIC_FALSE;
        !          1115:                                if(*(csi->ip-5)==FIO_SET_LENGTH) {
        !          1116:                                        l=*(long *)csi->ip;
        !          1117:                                        csi->ip+=4; }
        !          1118:                                else {
        !          1119:                                        lp2=getintvar(csi,*(long *)csi->ip);
        !          1120:                                        csi->ip+=4;
        !          1121:                                        if(!lp2)
        !          1122:                                                return(0);
        !          1123:                                        l=*lp2; }
        !          1124:                                if(lp1 && *lp1)
        !          1125:                                        csi->logic=chsize(fileno((FILE *)*lp1),l);
        !          1126:                                return(0);
        !          1127:                        case FIO_PRINTF:
        !          1128:                                lp1=getintvar(csi,*(long *)csi->ip);
        !          1129:                                csi->ip+=4;
        !          1130:                                strcpy(str,csi->ip);
        !          1131:                                while(*(csi->ip++));    /* Find NULL */
        !          1132:                                j=*(csi->ip++);                 /* total args */
        !          1133:                                for(i=0;i<j;i++) {
        !          1134:                                        vp=getstrvar(csi,*(long *)csi->ip);
        !          1135:                                        if(!vp) {
        !          1136:                                                lp2=getintvar(csi,*(long *)csi->ip);
        !          1137:                                                if(!lp2)
        !          1138:                                                        arglist[i]=0;
        !          1139:                                                else
        !          1140:                                                        arglist[i]=(void *)*lp2; }
        !          1141:                                        else
        !          1142:                                                arglist[i]=*(char **)vp;
        !          1143:                                        csi->ip+=4; }
        !          1144:                                vsprintf(tmp,str,arglist);
        !          1145:                                if(lp1 && *lp1) {
        !          1146:                                        cmdstr(tmp,path,csi->str,str);
        !          1147:                                        fwrite(str,1,strlen(str),(FILE *)*lp1); }
        !          1148:                                return(0);
        !          1149:                        case FIO_SET_ETX:
        !          1150:                                csi->etx=*(csi->ip++);
        !          1151:                                return(0);
        !          1152:                        case REMOVE_FILE:
        !          1153:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !          1154:                                csi->ip+=4;
        !          1155:                                if(pp && *pp && remove(*pp)==0)
        !          1156:                                        csi->logic=LOGIC_TRUE;
        !          1157:                                else
        !          1158:                                        csi->logic=LOGIC_FALSE;
        !          1159:                                return(0);
        !          1160:                        case RENAME_FILE:
        !          1161:                        case COPY_FILE:
        !          1162:                        case MOVE_FILE:
        !          1163:                                (char **)pp1=getstrvar(csi,*(long *)csi->ip);
        !          1164:                                csi->ip+=4; /* Skip variable name */
        !          1165:                                (char **)pp2=getstrvar(csi,*(long *)csi->ip);
        !          1166:                                csi->ip+=4;
        !          1167:                                if(pp1 && *pp1 && pp2 && *pp2)
        !          1168:                                        switch(*(csi->ip-9)) {
        !          1169:                                                case RENAME_FILE:
        !          1170:                                                        csi->logic=rename(*pp1,*pp2);
        !          1171:                                                        break;
        !          1172:                                                case COPY_FILE:
        !          1173:                                                        csi->logic=mv(*pp1,*pp2,1);
        !          1174:                                                        break;
        !          1175:                                                case MOVE_FILE:
        !          1176:                                                        csi->logic=mv(*pp1,*pp2,0);
        !          1177:                                                        break; }
        !          1178:                                else
        !          1179:                                        csi->logic=LOGIC_FALSE;
        !          1180:                                return(0);
        !          1181:                        case GET_FILE_ATTRIB:
        !          1182:                        case SET_FILE_ATTRIB:
        !          1183:                                lp=getintvar(csi,*(long *)csi->ip);
        !          1184:                                csi->ip+=4;
        !          1185:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !          1186:                                csi->ip+=4;
        !          1187:                                if(pp && *pp && lp) {
        !          1188:                                        if(*(csi->ip-9)==GET_FILE_ATTRIB)
        !          1189:                                                *lp=_chmod(*pp,0,0);
        !          1190:                                        else
        !          1191:                                                *lp=_chmod(*pp,1,(int)*lp); }
        !          1192:                                return(0);
        !          1193:                        case MAKE_DIR:
        !          1194:                        case REMOVE_DIR:
        !          1195:                        case CHANGE_DIR:
        !          1196:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !          1197:                                csi->ip+=4;
        !          1198:                                if(pp && *pp)
        !          1199:                                        switch(*(csi->ip-5)) {
        !          1200:                                                case MAKE_DIR:
        !          1201:                                                        csi->logic=mkdir(*pp);
        !          1202:                                                        break;
        !          1203:                                                case REMOVE_DIR:
        !          1204:                                                        csi->logic=rmdir(*pp);
        !          1205:                                                        break;
        !          1206:                                                case CHANGE_DIR:
        !          1207:                                                        csi->logic=chdir(*pp);
        !          1208:                                                        break; }
        !          1209:                                else
        !          1210:                                        csi->logic=LOGIC_FALSE;
        !          1211:                                return(0);
        !          1212:                        case OPEN_DIR:
        !          1213:                                lp=getintvar(csi,*(long *)csi->ip);
        !          1214:                                csi->ip+=4;
        !          1215:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !          1216:                                csi->ip+=4;
        !          1217:                                csi->logic=LOGIC_FALSE;
        !          1218:                                if(pp && *pp && lp) {
        !          1219:                                        *lp=(long)opendir((char *)*pp);
        !          1220:                                        if(*lp)
        !          1221:                                                csi->logic=LOGIC_TRUE; }
        !          1222:                                return(0);
        !          1223:                        case READ_DIR:
        !          1224:                                lp=getintvar(csi,*(long *)csi->ip);
        !          1225:                                csi->ip+=4;
        !          1226:                                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !          1227:                                csi->ip+=4;
        !          1228:                                csi->logic=LOGIC_FALSE;
        !          1229:                                if(pp && lp) {
        !          1230:                                        de=readdir((DIR *)(*lp));
        !          1231:                                        if(de!=NULL) {
        !          1232:                                                csi->logic=LOGIC_TRUE;
        !          1233:                                                *pp=copystrvar(csi,*pp,de->d_name); } }
        !          1234:                                return(0);
        !          1235:                        case REWIND_DIR:
        !          1236:                                lp=getintvar(csi,*(long *)csi->ip);
        !          1237:                                csi->ip+=4;
        !          1238:                                if(lp) {
        !          1239:                                        rewinddir((DIR *)(*lp));
        !          1240:                                        csi->logic=LOGIC_TRUE; }
        !          1241:                                else
        !          1242:                                        csi->logic=LOGIC_FALSE;
        !          1243:                                return(0);
        !          1244:                        case CLOSE_DIR:
        !          1245:                                lp=getintvar(csi,*(long *)csi->ip);
        !          1246:                                csi->ip+=4;
        !          1247:                                if(lp && closedir((DIR *)(*lp))==0)
        !          1248:                                        csi->logic=LOGIC_TRUE;
        !          1249:                                else
        !          1250:                                        csi->logic=LOGIC_FALSE;
        !          1251:                                return(0);
        !          1252:                        default:
        !          1253:                                errormsg(WHERE,ERR_CHK,"fio sub-instruction",*(csi->ip-1));
        !          1254:                                return(0); }
        !          1255: 
        !          1256: 
        !          1257:        case CS_SWITCH:
        !          1258:                lp=getintvar(csi,*(long *)csi->ip);
        !          1259:                csi->ip+=4;
        !          1260:                if(!lp) {
        !          1261:                        skipto(csi,CS_END_SWITCH);
        !          1262:                        csi->ip++; }
        !          1263:                else {
        !          1264:                        csi->misc|=CS_IN_SWITCH;
        !          1265:                        csi->switch_val=*lp; }
        !          1266:                return(0);
        !          1267:        case CS_CASE:
        !          1268:                l=*(long *)csi->ip;
        !          1269:                csi->ip+=4;
        !          1270:                if(csi->misc&CS_IN_SWITCH && csi->switch_val!=l)
        !          1271:                        skipto(csi,CS_NEXTCASE);
        !          1272:                else
        !          1273:                        csi->misc&=~CS_IN_SWITCH;
        !          1274:                return(0);
        !          1275:        case CS_COMPARE_ARS:
        !          1276:                i=*(csi->ip++);  /* Length of ARS stored as byte before ARS */
        !          1277:                csi->logic=!chk_ar(csi->ip,useron);
        !          1278:                csi->ip+=i;
        !          1279:                return(0);
        !          1280:        case CS_TOGGLE_USER_MISC:
        !          1281:                useron.misc^=*(long *)csi->ip;
        !          1282:                putuserrec(useron.number,U_MISC,8,ultoa(useron.misc,tmp,16));
        !          1283:                csi->ip+=4;
        !          1284:                return(0);
        !          1285:        case CS_COMPARE_USER_MISC:
        !          1286:                if((useron.misc&*(long *)csi->ip)==*(long *)csi->ip)
        !          1287:                        csi->logic=LOGIC_TRUE;
        !          1288:                else
        !          1289:                        csi->logic=LOGIC_FALSE;
        !          1290:                csi->ip+=4;
        !          1291:                return(0);
        !          1292:        case CS_TOGGLE_USER_CHAT:
        !          1293:                useron.chat^=*(long *)csi->ip;
        !          1294:                putuserrec(useron.number,U_CHAT,8,ultoa(useron.chat,tmp,16));
        !          1295:                csi->ip+=4;
        !          1296:                return(0);
        !          1297:        case CS_COMPARE_USER_CHAT:
        !          1298:                if((useron.chat&*(long *)csi->ip)==*(long *)csi->ip)
        !          1299:                        csi->logic=LOGIC_TRUE;
        !          1300:                else
        !          1301:                        csi->logic=LOGIC_FALSE;
        !          1302:                csi->ip+=4;
        !          1303:                return(0);
        !          1304:        case CS_TOGGLE_USER_QWK:
        !          1305:                useron.qwk^=*(long *)csi->ip;
        !          1306:                putuserrec(useron.number,U_QWK,8,ultoa(useron.qwk,tmp,16));
        !          1307:                csi->ip+=4;
        !          1308:                return(0);
        !          1309:        case CS_COMPARE_USER_QWK:
        !          1310:                if((useron.qwk&*(long *)csi->ip)==*(long *)csi->ip)
        !          1311:                        csi->logic=LOGIC_TRUE;
        !          1312:                else
        !          1313:                        csi->logic=LOGIC_FALSE;
        !          1314:                csi->ip+=4;
        !          1315:                return(0);
        !          1316:        case CS_REPLACE_TEXT:
        !          1317:                i=*(ushort *)csi->ip;
        !          1318:                csi->ip+=2;
        !          1319:                i--;
        !          1320:                if(i>=TOTAL_TEXT) {
        !          1321:                        errormsg(WHERE,ERR_CHK,"replace text #",i);
        !          1322:                        while(*(csi->ip++));     /* Find NULL */
        !          1323:                        return(0); }
        !          1324:                if(text[i]!=text_sav[i] && text[i]!=nulstr)
        !          1325:                        FREE(text[i]);
        !          1326:                j=strlen(cmdstr(csi->ip,path,csi->str,buf));
        !          1327:                if(!j)
        !          1328:                        text[i]=nulstr;
        !          1329:                else
        !          1330:                        text[i]=MALLOC(j+1);
        !          1331:                if(!text[i]) {
        !          1332:                        errormsg(WHERE,ERR_ALLOC,"replacement text",j);
        !          1333:                        while(*(csi->ip++));     /* Find NULL */
        !          1334:                        text[i]=text_sav[i];
        !          1335:                        return(0); }
        !          1336:                if(j)
        !          1337:                        strcpy(text[i],buf);
        !          1338:                while(*(csi->ip++));     /* Find NULL */
        !          1339:                return(0);
        !          1340:        case CS_USE_INT_VAR:    // Self-modifying code!
        !          1341:                (char **)pp=getstrvar(csi,*(long *)csi->ip);
        !          1342:                if(pp && *pp)
        !          1343:                        l=strtol(*pp,0,0);
        !          1344:                else {
        !          1345:                        lp=getintvar(csi,*(long *)csi->ip);
        !          1346:                        if(lp)
        !          1347:                                l=*lp;
        !          1348:                        else
        !          1349:                                l=0; }
        !          1350:                csi->ip+=4;                     // Variable
        !          1351:                i=*(csi->ip++);                 // Offset
        !          1352:                if(i<1 || csi->ip+1+i>=csi->cs+csi->length) {
        !          1353:                        errormsg(WHERE,ERR_CHK,"offset",i);
        !          1354:                        csi->ip++;
        !          1355:                        return(0); }
        !          1356:                switch(*(csi->ip++)) {  // Length
        !          1357:                        case sizeof(char):
        !          1358:                                *(csi->ip+i)=(char)l;
        !          1359:                                break;
        !          1360:                        case sizeof(short):
        !          1361:                                *((short *)(csi->ip+i))=(short)l;
        !          1362:                                break;
        !          1363:                        case sizeof(long):
        !          1364:                                *((long *)(csi->ip+i))=l;
        !          1365:                 break;
        !          1366:                        default:
        !          1367:                                errormsg(WHERE,ERR_CHK,"length",*(csi->ip-1));
        !          1368:                                break; }
        !          1369:                return(0);
        !          1370:        default:
        !          1371:                errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
        !          1372:                return(0); }
        !          1373: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.