Annotation of sbbs/src/sbbs3/execfunc.cpp, revision 1.1.1.2

1.1       root        1: /* execfunc.cpp */
                      2: 
                      3: /* Hi-level command shell/module routines (functions) */
                      4: 
1.1.1.2 ! root        5: /* $Id: execfunc.cpp,v 1.41 2011/07/21 11:19:22 rswindell Exp $ */
1.1       root        6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
1.1.1.2 ! root       11:  * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html         *
1.1       root       12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: #include "cmdshell.h"
                     40: 
                     41: int sbbs_t::exec_function(csi_t *csi)
                     42: {
                     43:        char    str[256];
                     44:        char    tmp[512];
                     45:        uchar*  p;
                     46:        int             s;
                     47:        uint    i,j,k;
                     48:        long    l;
                     49:        node_t  node;
                     50:        struct  tm tm;
                     51: 
                     52:        switch(*(csi->ip++)) {
                     53: 
                     54: 
                     55:                case CS_PRINTFILE_STR:
                     56:                        printfile(csi->str,P_NOATCODES);
                     57:                        return(0);
                     58: 
                     59:        /********************************/
                     60:        /* General Main Menu Type Stuff */
                     61:        /********************************/
                     62:                case CS_AUTO_MESSAGE:
                     63:                        automsg();
                     64:                        return(0);
                     65:                case CS_MINUTE_BANK:
                     66:                        time_bank();
                     67:                        return(0);
                     68:                case CS_CHAT_SECTION:
                     69:                        chatsection();
                     70:                        return(0);
                     71:                case CS_USER_DEFAULTS:
                     72:                        maindflts(&useron);
                     73:                        if(!(useron.rest&FLAG('G')))    /* not guest */
                     74:                                getuserdat(&cfg,&useron);
                     75:                        return(0);
                     76:                case CS_TEXT_FILE_SECTION:
                     77:                        text_sec();
                     78:                        return(0);
                     79:                case CS_INFO_SYSTEM:   /* System information */
                     80:                        sys_info();
                     81:                        return(0);
                     82:                case CS_INFO_SUBBOARD:   /* Sub-board information */
                     83:                        if(!usrgrps) return(0);
                     84:                        subinfo(usrsub[curgrp][cursub[curgrp]]);
                     85:                        return(0);
                     86:                case CS_INFO_DIRECTORY:   /* Sub-board information */
                     87:                        if(!usrlibs) return(0);
                     88:                        dirinfo(usrdir[curlib][curdir[curlib]]);
                     89:                        return(0);
                     90:                case CS_INFO_VERSION:   /* Version */
                     91:                        ver();
                     92:                        return(0);
                     93:                case CS_INFO_USER:       /* User's statistics */
                     94:                        user_info();
                     95:                        return(0);
                     96:                case CS_INFO_XFER_POLICY:
                     97:                        xfer_policy();
                     98:                        return(0);
                     99:                case CS_XTRN_EXEC:
                    100:                        csi->logic=LOGIC_TRUE;
                    101:                        for(i=0;i<cfg.total_xtrns;i++)
                    102:                                if(!stricmp(cfg.xtrn[i]->code,csi->str))
                    103:                                        break;
                    104:                        if(i<cfg.total_xtrns)
                    105:                                exec_xtrn(i);
                    106:                        else
                    107:                                csi->logic=LOGIC_FALSE;
                    108:                        return(0);
                    109:                case CS_XTRN_SECTION:
                    110:                        xtrn_sec();
                    111:                        return(0);
                    112:                case CS_LOGOFF:
1.1.1.2 ! root      113:                        if(text[LogOffQ][0]==0 || !noyes(text[LogOffQ])) {
1.1       root      114:                                if(cfg.logoff_mod[0])
                    115:                                        exec_bin(cfg.logoff_mod,csi);
                    116:                                user_event(EVENT_LOGOFF);
                    117:                                menu("logoff");
                    118:                                SYNC;
1.1.1.2 ! root      119:                                hangup(); 
        !           120:                        }
1.1       root      121:                        return(0);
                    122:                case CS_LOGOFF_FAST:
                    123:                        SYNC;
                    124:                        hangup();
                    125:                        return(0);
                    126:                case CS_NODELIST_ALL:
                    127:                        nodelist();
                    128:                        return(0);
                    129:                case CS_NODELIST_USERS:
                    130:                        whos_online(true);
                    131:                        return(0);
                    132:                case CS_USERLIST_SUB:
                    133:                        userlist(UL_SUB);
                    134:                        return(0);
                    135:                case CS_USERLIST_DIR:
                    136:                        userlist(UL_DIR);
                    137:                        return(0);
                    138:                case CS_USERLIST_ALL:
                    139:                        userlist(UL_ALL);
                    140:                        return(0);
                    141:                case CS_USERLIST_LOGONS:
                    142:                        logonlist();
                    143:                        return(0);
                    144:                case CS_PAGE_SYSOP:
                    145:                        csi->logic=sysop_page() ? LOGIC_TRUE:LOGIC_FALSE;
                    146:                        return(0);
                    147:                case CS_PAGE_GURU:
                    148:                        csi->logic=guru_page() ? LOGIC_TRUE:LOGIC_FALSE;
                    149:                        return(0);
                    150:                case CS_SPY:
                    151:                        csi->logic=spy(atoi(csi->str)) ? LOGIC_TRUE:LOGIC_FALSE;
                    152:                        return(0);
                    153:                case CS_PRIVATE_CHAT:
                    154:                        privchat();
                    155:                        return(0);
                    156:                case CS_PRIVATE_MESSAGE:
                    157:                        nodemsg();
                    158:                        return(0);
                    159: 
                    160:        /*******************/
                    161:        /* Sysop Functions */
                    162:        /*******************/
                    163:                case CS_USER_EDIT:
                    164:                        useredit(csi->str[0] ? finduser(csi->str) : 0);
                    165:                        return(0);
                    166: 
                    167: 
                    168:        /******************/
                    169:        /* Mail Functions */
                    170:        /******************/
                    171: 
                    172:                case CS_MAIL_READ:       /* Read E-mail */
                    173:                        readmail(useron.number,MAIL_YOUR);
                    174:                        return(0);
                    175:                case CS_MAIL_READ_SENT:           /* Kill/read sent mail */
                    176:                        readmail(useron.number,MAIL_SENT);
                    177:                        return(0);
                    178:                case CS_MAIL_READ_ALL:
                    179:                        readmail(useron.number,MAIL_ALL);
                    180:                        return(0);
                    181:                case CS_MAIL_SEND:               /* Send E-mail */
                    182:                        if(strchr(csi->str,'@')) {
                    183:                                i=1;
1.1.1.2 ! root      184:                                netmail(csi->str,nulstr,0); 
        !           185:                        }
1.1       root      186:                        else if((i=finduser(csi->str))!=0 
1.1.1.2 ! root      187:                                || (cfg.msg_misc&MM_REALNAME && (i=userdatdupe(0,U_NAME,LEN_NAME,csi->str))!=0))
1.1       root      188:                                email(i,nulstr,nulstr,WM_EMAIL);
                    189:                        csi->logic=!i;
                    190:                        return(0);
                    191:                case CS_MAIL_SEND_FEEDBACK:       /* Feedback */
                    192:                        if((i=finduser(csi->str))!=0)
                    193:                                email(i,text[ReFeedback],nulstr,WM_EMAIL);
                    194:                        csi->logic=!i;
                    195:                        return(0);
                    196:                case CS_MAIL_SEND_NETMAIL:
                    197:                        bputs(text[EnterNetMailAddress]);
                    198:                        if(getstr(str,60,K_LINE)) {
                    199:                                netmail(str,nulstr,0);
1.1.1.2 ! root      200:                                csi->logic=LOGIC_TRUE; 
        !           201:                        }
1.1       root      202:                        else
                    203:                                csi->logic=LOGIC_FALSE;
                    204:                        return(0);
                    205: 
                    206:                case CS_MAIL_SEND_NETFILE:
                    207:                        bputs(text[EnterNetMailAddress]);
                    208:                        if(getstr(str,60,K_LINE)) {
                    209:                                netmail(str,nulstr,WM_FILE);
1.1.1.2 ! root      210:                                csi->logic=LOGIC_TRUE; 
        !           211:                        }
1.1       root      212:                        else
                    213:                                csi->logic=LOGIC_FALSE;
                    214:                        return(0);
                    215: 
                    216:                case CS_MAIL_SEND_FILE:   /* Upload Attached File to E-mail */
                    217:                        if(strchr(csi->str,'@')) {
                    218:                                i=1;
1.1.1.2 ! root      219:                                netmail(csi->str,nulstr,WM_FILE); 
        !           220:                        }
1.1       root      221:                        else if((i=finduser(csi->str))!=0
1.1.1.2 ! root      222:                                || (cfg.msg_misc&MM_REALNAME && (i=userdatdupe(0,U_NAME,LEN_NAME,csi->str))!=0))
1.1       root      223:                                email(i,nulstr,nulstr,WM_EMAIL|WM_FILE);
                    224:                        csi->logic=!i;
                    225:                        return(0);
                    226:                case CS_MAIL_SEND_BULK:
                    227:                        if(csi->str[0])
                    228:                                p=arstr(NULL,csi->str, &cfg);
                    229:                        else
                    230:                                p=(uchar *)nulstr;
                    231:                        bulkmail(p);
                    232:                        if(p && p[0])
                    233:                                free(p);
                    234:                        return(0);
                    235: 
                    236:                case CS_INC_MAIN_CMDS:
                    237:                        main_cmds++;
                    238:                        return(0);
                    239: 
                    240:                case CS_INC_FILE_CMDS:
                    241:                        xfer_cmds++;
                    242:                        return(0);
                    243: 
                    244:                case CS_SYSTEM_LOG:                 /* System log */
                    245:                        if(!chksyspass())
                    246:                                return(0);
                    247:                        if(localtime_r(&now,&tm)==NULL)
                    248:                                return(0);
                    249:                        sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log", cfg.logs_dir
                    250:                                ,tm.tm_mon+1,tm.tm_mday,TM_YEAR(tm.tm_year));
                    251:                        printfile(str,0);
                    252:                        return(0);
                    253:                case CS_SYSTEM_YLOG:                /* Yesterday's log */
                    254:                        if(!chksyspass())
                    255:                                return(0);
                    256:                        now-=(ulong)60L*24L*60L;
                    257:                        if(localtime_r(&now,&tm)==NULL)
                    258:                                return(0);
                    259:                        sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log",cfg.logs_dir
                    260:                                ,tm.tm_mon+1,tm.tm_mday,TM_YEAR(tm.tm_year));
                    261:                        printfile(str,0);
                    262:                        return(0);
                    263:                case CS_SYSTEM_STATS:               /* System Statistics */
                    264:                        sys_stats();
                    265:                        return(0);
                    266:                case CS_NODE_STATS:              /* Node Statistics */
                    267:                        node_stats(atoi(csi->str));
                    268:                        return(0);
                    269:                case CS_CHANGE_USER:                 /* Change to another user */
                    270:                        change_user();
                    271:                        return(0);
                    272:                case CS_SHOW_MEM:
                    273:                        return(0);
                    274:                case CS_ERROR_LOG:
                    275:                        sprintf(str,"%serror.log", cfg.logs_dir);
                    276:                        if(fexist(str)) {
                    277:                                bputs(text[ErrorLogHdr]);
                    278:                                printfile(str,0);
1.1.1.2 ! root      279:                                if(text[DeleteErrorLogQ][0] && !noyes(text[DeleteErrorLogQ]))
        !           280:                                        remove(str); 
        !           281:                        }
1.1       root      282:                        else
1.1.1.2 ! root      283:                                bprintf(text[FileDoesNotExist],str);
1.1       root      284:                        for(i=1;i<=cfg.sys_nodes;i++) {
                    285:                                getnodedat(i,&node,0);
                    286:                                if(node.errors)
1.1.1.2 ! root      287:                                        break; 
        !           288:                        }
1.1       root      289:                        if(i<=cfg.sys_nodes || criterrs) {
1.1.1.2 ! root      290:                                if(text[ClearErrCounter][0]==0 || !noyes(text[ClearErrCounter])) {
1.1       root      291:                                        for(i=1;i<=cfg.sys_nodes;i++) {
                    292:                                                if(getnodedat(i,&node,true)==0) {
                    293:                                                        node.errors=0;
                    294:                                                        putnodedat(i,&node); 
                    295:                                                }
                    296:                                        criterrs=0; 
                    297:                                        } 
                    298:                                }
                    299:                        }
                    300:                        return(0);
                    301:                case CS_ANSI_CAPTURE:           /* Capture ANSI codes */
                    302:                        sys_status^=SS_ANSCAP;
                    303:                        bprintf(text[ANSICaptureIsNow]
                    304:                                ,sys_status&SS_ANSCAP ? text[ON] : text[OFF]);
                    305:                        return(0);
                    306:                case CS_LIST_TEXT_FILE:              /* View ASCII/ANSI/Ctrl-A file */
                    307:                        if(!chksyspass())
                    308:                                return(0);
                    309:                        bputs(text[Filename]);
                    310:                        if(getstr(str,60,0))
                    311:                                printfile(str,0);
                    312:                        return(0);
                    313:                case CS_EDIT_TEXT_FILE:              /* Edit ASCII/Ctrl-A file */
                    314:                        if(!chksyspass())
                    315:                                return(0);
                    316:                        bputs(text[Filename]);
                    317:                        if(getstr(str,60,0))
                    318:                                editfile(str);
                    319:                        return(0);
                    320:                case CS_GURU_LOG:
                    321:                        sprintf(str,"%sguru.log", cfg.logs_dir);
                    322:                        if(fexist(str)) {
                    323:                                printfile(str,0);
                    324:                                CRLF;
1.1.1.2 ! root      325:                                if(text[DeleteGuruLogQ][0] && !noyes(text[DeleteGuruLogQ]))
        !           326:                                        remove(str); 
        !           327:                        }
1.1       root      328:                        return(0);
                    329:                case CS_FILE_SET_ALT_PATH:
                    330:                        altul=atoi(csi->str);
                    331:                        if(altul>cfg.altpaths)
                    332:                                altul=0;
                    333:                        bprintf(text[AltULPathIsNow],altul ? cfg.altpath[altul-1] : text[OFF]);
                    334:                        return(0);
                    335:                case CS_FILE_RESORT_DIRECTORY:
                    336:                        for(i=1;i<=cfg.sys_nodes;i++)
                    337:                                if(i!=cfg.node_num) {
                    338:                                        getnodedat(i,&node,0);
                    339:                                        if(node.status==NODE_INUSE
                    340:                                                || node.status==NODE_QUIET)
1.1.1.2 ! root      341:                                                break; 
        !           342:                                }
1.1       root      343: 
                    344:                        if(i<=cfg.sys_nodes) {
                    345:                                bputs(text[ResortWarning]);
1.1.1.2 ! root      346:                                return(0)        !           347:                        }
1.1       root      348: 
                    349:                        if(!stricmp(csi->str,"ALL")) {     /* all libraries */
                    350:                                for(i=0;i<usrlibs;i++)
                    351:                                        for(j=0;j<usrdirs[i];j++)
                    352:                                                resort(usrdir[i][j]);
1.1.1.2 ! root      353:                                return(0)        !           354:                        }
1.1       root      355:                        if(!stricmp(csi->str,"LIB")) {     /* current library */
                    356:                                for(i=0;i<usrdirs[curlib];i++)
                    357:                                        resort(usrdir[curlib][i]);
1.1.1.2 ! root      358:                                return(0)        !           359:                        }
1.1       root      360:                        resort(usrdir[curlib][curdir[curlib]]);
                    361:                        return(0);
                    362: 
                    363:                case CS_FILE_GET:
                    364:                        if(!fexist(csi->str)) {
                    365:                                bputs(text[FileNotFound]);
1.1.1.2 ! root      366:                                return(0)        !           367:                        }
1.1       root      368:                        if(!chksyspass())
                    369:                                return(0);
                    370: 
                    371:                case CS_FILE_SEND:
                    372: 
                    373:                        csi->logic=sendfile(csi->str) ? LOGIC_TRUE:LOGIC_FALSE;
                    374:                        return(0);
                    375: 
                    376:                case CS_FILE_PUT:
                    377:                        csi->logic=LOGIC_FALSE;
                    378:                        if(!chksyspass())
                    379:                                return(0);
                    380: 
                    381:                case CS_FILE_RECEIVE:
                    382:                        csi->logic=recvfile(csi->str) ? LOGIC_TRUE:LOGIC_FALSE;
                    383:                        return(0);
                    384: 
                    385:                case CS_FILE_UPLOAD_BULK:
                    386: 
                    387:                        if(!usrlibs) return(0);
                    388: 
                    389:                        if(!stricmp(csi->str,"ALL")) {     /* all libraries */
                    390:                                for(i=0;i<usrlibs;i++)
                    391:                                        for(j=0;j<usrdirs[i];j++) {
                    392:                                                if(cfg.lib[i]->offline_dir==usrdir[i][j])
                    393:                                                        continue;
1.1.1.2 ! root      394:                                                if(bulkupload(usrdir[i][j])) return(0)        !           395:                                        }
        !           396:                                return(0)        !           397:                        }
1.1       root      398:                        if(!stricmp(csi->str,"LIB")) {     /* current library */
                    399:                                for(i=0;i<usrdirs[curlib];i++) {
                    400:                                        if(cfg.lib[usrlib[curlib]]->offline_dir
                    401:                                                ==usrdir[curlib][i])
                    402:                                                continue;
1.1.1.2 ! root      403:                                        if(bulkupload(usrdir[curlib][i])) return(0)        !           404:                                }
        !           405:                                return(0)        !           406:                        }
1.1       root      407:                        bulkupload(usrdir[curlib][curdir[curlib]]); /* current dir */
                    408:                        return(0);
                    409: 
                    410:                case CS_FILE_FIND_OLD:
                    411:                case CS_FILE_FIND_OPEN:
                    412:                case CS_FILE_FIND_OFFLINE:
                    413:                case CS_FILE_FIND_OLD_UPLOADS:
                    414:                        if(!usrlibs) return(0);
                    415:                        if(!getfilespec(tmp))
                    416:                                return(0);
                    417:                        padfname(tmp,str);
                    418:                        k=0;
                    419:                        bputs("\r\nSearching ");
                    420:                        if(!stricmp(csi->str,"ALL"))
                    421:                                bputs("all libraries");
                    422:                        else if(!stricmp(csi->str,"LIB"))
                    423:                                bputs("library");
                    424:                        else
                    425:                                bputs("directory");
                    426:                        bputs(" for files ");
                    427:                        if(*(csi->ip-1)==CS_FILE_FIND_OLD_UPLOADS) {
                    428:                                l=FI_OLDUL;
1.1.1.2 ! root      429:                                bprintf("uploaded before %s\r\n",timestr(ns_time)); 
        !           430:                        }
1.1       root      431:                        else if(*(csi->ip-1)==CS_FILE_FIND_OLD) { /* go by download date */
                    432:                                l=FI_OLD;
1.1.1.2 ! root      433:                                bprintf("not downloaded since %s\r\n",timestr(ns_time)); 
        !           434:                        }
1.1       root      435:                        else if(*(csi->ip-1)==CS_FILE_FIND_OFFLINE) {
                    436:                                l=FI_OFFLINE;
1.1.1.2 ! root      437:                                bputs("not online...\r\n"); 
        !           438:                        }
1.1       root      439:                        else {
                    440:                                l=FI_CLOSE;
1.1.1.2 ! root      441:                                bputs("currently open...\r\n"); 
        !           442:                        }
1.1       root      443:                        if(!stricmp(csi->str,"ALL")) {
                    444:                                for(i=0;i<usrlibs;i++)
                    445:                                        for(j=0;j<usrdirs[i];j++) {
                    446:                                                if(cfg.lib[i]->offline_dir==usrdir[i][j])
                    447:                                                        continue;
                    448:                                                if((s=listfileinfo(usrdir[i][j],str,(char)l))==-1)
                    449:                                                        return(0);
1.1.1.2 ! root      450:                                                else k+=s; 
        !           451:                                        } 
        !           452:                        }
1.1       root      453:                        else if(!stricmp(csi->str,"LIB")) {
                    454:                                for(i=0;i<usrdirs[curlib];i++) {
                    455:                                        if(cfg.lib[usrlib[curlib]]->offline_dir==usrdir[curlib][i])
                    456:                                                        continue;
                    457:                                        if((s=listfileinfo(usrdir[curlib][i],str,(char)l))==-1)
                    458:                                                return(0);
1.1.1.2 ! root      459:                                        else k+=s; 
        !           460:                                } 
        !           461:                        }
1.1       root      462:                        else {
                    463:                                s=listfileinfo(usrdir[curlib][curdir[curlib]],str,(char)l);
                    464:                                if(s==-1)
                    465:                                        return(0);
1.1.1.2 ! root      466:                                k=s; 
        !           467:                        }
1.1       root      468:                        if(k>1) {
1.1.1.2 ! root      469:                                bprintf(text[NFilesListed],k); 
        !           470:                        }
        !           471:                        return(0)        !           472:        }
1.1       root      473: 
                    474:        if(*(csi->ip-1)>=CS_MSG_SET_AREA && *(csi->ip-1)<=CS_MSG_UNUSED1) {
                    475:                csi->ip--;
1.1.1.2 ! root      476:                return(exec_msg(csi)); 
        !           477:        }
1.1       root      478: 
                    479:        if(*(csi->ip-1)>=CS_FILE_SET_AREA && *(csi->ip-1)<=CS_FILE_RECEIVE) {
                    480:                csi->ip--;
1.1.1.2 ! root      481:                return(exec_file(csi)); 
        !           482:        }
1.1       root      483: 
                    484:        errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1));
                    485:        return(0);
                    486: }

unix.superglobalmegacorp.com

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