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

1.1       root        1: /* execfunc.cpp */
                      2: 
                      3: /* Hi-level command shell/module routines (functions) */
                      4: 
                      5: /* $Id: execfunc.cpp,v 1.35 2006/02/28 00:47:34 rswindell Exp $ */
                      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:  *                                                                                                                                                     *
                     11:  * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html         *
                     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:
                    113:                        if(!noyes(text[LogOffQ])) {
                    114:                                if(cfg.logoff_mod[0])
                    115:                                        exec_bin(cfg.logoff_mod,csi);
                    116:                                user_event(EVENT_LOGOFF);
                    117:                                menu("logoff");
                    118:                                SYNC;
                    119:                                hangup(); }
                    120:                        return(0);
                    121:                case CS_LOGOFF_FAST:
                    122:                        SYNC;
                    123:                        hangup();
                    124:                        return(0);
                    125:                case CS_NODELIST_ALL:
                    126:                        nodelist();
                    127:                        return(0);
                    128:                case CS_NODELIST_USERS:
                    129:                        whos_online(true);
                    130:                        return(0);
                    131:                case CS_USERLIST_SUB:
                    132:                        userlist(UL_SUB);
                    133:                        return(0);
                    134:                case CS_USERLIST_DIR:
                    135:                        userlist(UL_DIR);
                    136:                        return(0);
                    137:                case CS_USERLIST_ALL:
                    138:                        userlist(UL_ALL);
                    139:                        return(0);
                    140:                case CS_USERLIST_LOGONS:
                    141:                        logonlist();
                    142:                        return(0);
                    143:                case CS_PAGE_SYSOP:
                    144:                        csi->logic=sysop_page() ? LOGIC_TRUE:LOGIC_FALSE;
                    145:                        return(0);
                    146:                case CS_PAGE_GURU:
                    147:                        csi->logic=guru_page() ? LOGIC_TRUE:LOGIC_FALSE;
                    148:                        return(0);
                    149:                case CS_SPY:
                    150:                        csi->logic=spy(atoi(csi->str)) ? LOGIC_TRUE:LOGIC_FALSE;
                    151:                        return(0);
                    152:                case CS_PRIVATE_CHAT:
                    153:                        privchat();
                    154:                        return(0);
                    155:                case CS_PRIVATE_MESSAGE:
                    156:                        nodemsg();
                    157:                        return(0);
                    158: 
                    159:        /*******************/
                    160:        /* Sysop Functions */
                    161:        /*******************/
                    162:                case CS_USER_EDIT:
                    163:                        useredit(csi->str[0] ? finduser(csi->str) : 0);
                    164:                        return(0);
                    165: 
                    166: 
                    167:        /******************/
                    168:        /* Mail Functions */
                    169:        /******************/
                    170: 
                    171:                case CS_MAIL_READ:       /* Read E-mail */
                    172:                        readmail(useron.number,MAIL_YOUR);
                    173:                        return(0);
                    174:                case CS_MAIL_READ_SENT:           /* Kill/read sent mail */
                    175:                        readmail(useron.number,MAIL_SENT);
                    176:                        return(0);
                    177:                case CS_MAIL_READ_ALL:
                    178:                        readmail(useron.number,MAIL_ALL);
                    179:                        return(0);
                    180:                case CS_MAIL_SEND:               /* Send E-mail */
                    181:                        if(strchr(csi->str,'@')) {
                    182:                                i=1;
                    183:                                netmail(csi->str,nulstr,0); }
                    184:                        else if((i=finduser(csi->str))!=0 
                    185:                                || (cfg.msg_misc&MM_REALNAME && (i=userdatdupe(0,U_NAME,LEN_NAME,csi->str,false))!=0))
                    186:                                email(i,nulstr,nulstr,WM_EMAIL);
                    187:                        csi->logic=!i;
                    188:                        return(0);
                    189:                case CS_MAIL_SEND_FEEDBACK:       /* Feedback */
                    190:                        if((i=finduser(csi->str))!=0)
                    191:                                email(i,text[ReFeedback],nulstr,WM_EMAIL);
                    192:                        csi->logic=!i;
                    193:                        return(0);
                    194:                case CS_MAIL_SEND_NETMAIL:
                    195:                        bputs(text[EnterNetMailAddress]);
                    196:                        if(getstr(str,60,K_LINE)) {
                    197:                                netmail(str,nulstr,0);
                    198:                                csi->logic=LOGIC_TRUE; }
                    199:                        else
                    200:                                csi->logic=LOGIC_FALSE;
                    201:                        return(0);
                    202: 
                    203:                case CS_MAIL_SEND_NETFILE:
                    204:                        bputs(text[EnterNetMailAddress]);
                    205:                        if(getstr(str,60,K_LINE)) {
                    206:                                netmail(str,nulstr,WM_FILE);
                    207:                                csi->logic=LOGIC_TRUE; }
                    208:                        else
                    209:                                csi->logic=LOGIC_FALSE;
                    210:                        return(0);
                    211: 
                    212:                case CS_MAIL_SEND_FILE:   /* Upload Attached File to E-mail */
                    213:                        if(strchr(csi->str,'@')) {
                    214:                                i=1;
                    215:                                netmail(csi->str,nulstr,WM_FILE); }
                    216:                        else if((i=finduser(csi->str))!=0
                    217:                                || (cfg.msg_misc&MM_REALNAME && (i=userdatdupe(0,U_NAME,LEN_NAME,csi->str,false))!=0))
                    218:                                email(i,nulstr,nulstr,WM_EMAIL|WM_FILE);
                    219:                        csi->logic=!i;
                    220:                        return(0);
                    221:                case CS_MAIL_SEND_BULK:
                    222:                        if(csi->str[0])
                    223:                                p=arstr(NULL,csi->str, &cfg);
                    224:                        else
                    225:                                p=(uchar *)nulstr;
                    226:                        bulkmail(p);
                    227:                        if(p && p[0])
                    228:                                free(p);
                    229:                        return(0);
                    230: 
                    231:                case CS_INC_MAIN_CMDS:
                    232:                        main_cmds++;
                    233:                        return(0);
                    234: 
                    235:                case CS_INC_FILE_CMDS:
                    236:                        xfer_cmds++;
                    237:                        return(0);
                    238: 
                    239:                case CS_SYSTEM_LOG:                 /* System log */
                    240:                        if(!chksyspass())
                    241:                                return(0);
                    242:                        if(localtime_r(&now,&tm)==NULL)
                    243:                                return(0);
                    244:                        sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log", cfg.logs_dir
                    245:                                ,tm.tm_mon+1,tm.tm_mday,TM_YEAR(tm.tm_year));
                    246:                        printfile(str,0);
                    247:                        return(0);
                    248:                case CS_SYSTEM_YLOG:                /* Yesterday's log */
                    249:                        if(!chksyspass())
                    250:                                return(0);
                    251:                        now-=(ulong)60L*24L*60L;
                    252:                        if(localtime_r(&now,&tm)==NULL)
                    253:                                return(0);
                    254:                        sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log",cfg.logs_dir
                    255:                                ,tm.tm_mon+1,tm.tm_mday,TM_YEAR(tm.tm_year));
                    256:                        printfile(str,0);
                    257:                        return(0);
                    258:                case CS_SYSTEM_STATS:               /* System Statistics */
                    259:                        sys_stats();
                    260:                        return(0);
                    261:                case CS_NODE_STATS:              /* Node Statistics */
                    262:                        node_stats(atoi(csi->str));
                    263:                        return(0);
                    264:                case CS_CHANGE_USER:                 /* Change to another user */
                    265:                        change_user();
                    266:                        return(0);
                    267:                case CS_SHOW_MEM:
                    268:                        return(0);
                    269:                case CS_ERROR_LOG:
                    270:                        sprintf(str,"%serror.log", cfg.logs_dir);
                    271:                        if(fexist(str)) {
                    272:                                bputs(text[ErrorLogHdr]);
                    273:                                printfile(str,0);
                    274:                                if(!noyes(text[DeleteErrorLogQ]))
                    275:                                        remove(str); }
                    276:                        else
                    277:                                bputs(text[NoErrorLogExists]);
                    278:                        for(i=1;i<=cfg.sys_nodes;i++) {
                    279:                                getnodedat(i,&node,0);
                    280:                                if(node.errors)
                    281:                                        break; }
                    282:                        if(i<=cfg.sys_nodes || criterrs) {
                    283:                                if(!noyes(text[ClearErrCounter])) {
                    284:                                        for(i=1;i<=cfg.sys_nodes;i++) {
                    285:                                                if(getnodedat(i,&node,true)==0) {
                    286:                                                        node.errors=0;
                    287:                                                        putnodedat(i,&node); 
                    288:                                                }
                    289:                                        criterrs=0; 
                    290:                                        } 
                    291:                                }
                    292:                        }
                    293:                        return(0);
                    294:                case CS_ANSI_CAPTURE:           /* Capture ANSI codes */
                    295:                        sys_status^=SS_ANSCAP;
                    296:                        bprintf(text[ANSICaptureIsNow]
                    297:                                ,sys_status&SS_ANSCAP ? text[ON] : text[OFF]);
                    298:                        return(0);
                    299:                case CS_LIST_TEXT_FILE:              /* View ASCII/ANSI/Ctrl-A file */
                    300:                        if(!chksyspass())
                    301:                                return(0);
                    302:                        bputs(text[Filename]);
                    303:                        if(getstr(str,60,0))
                    304:                                printfile(str,0);
                    305:                        return(0);
                    306:                case CS_EDIT_TEXT_FILE:              /* Edit ASCII/Ctrl-A file */
                    307:                        if(!chksyspass())
                    308:                                return(0);
                    309:                        bputs(text[Filename]);
                    310:                        if(getstr(str,60,0))
                    311:                                editfile(str);
                    312:                        return(0);
                    313:                case CS_GURU_LOG:
                    314:                        sprintf(str,"%sguru.log", cfg.logs_dir);
                    315:                        if(fexist(str)) {
                    316:                                printfile(str,0);
                    317:                                CRLF;
                    318:                                if(!noyes(text[DeleteGuruLogQ]))
                    319:                                        remove(str); }
                    320:                        return(0);
                    321:                case CS_FILE_SET_ALT_PATH:
                    322:                        altul=atoi(csi->str);
                    323:                        if(altul>cfg.altpaths)
                    324:                                altul=0;
                    325:                        bprintf(text[AltULPathIsNow],altul ? cfg.altpath[altul-1] : text[OFF]);
                    326:                        return(0);
                    327:                case CS_FILE_RESORT_DIRECTORY:
                    328:                        for(i=1;i<=cfg.sys_nodes;i++)
                    329:                                if(i!=cfg.node_num) {
                    330:                                        getnodedat(i,&node,0);
                    331:                                        if(node.status==NODE_INUSE
                    332:                                                || node.status==NODE_QUIET)
                    333:                                                break; }
                    334: 
                    335:                        if(i<=cfg.sys_nodes) {
                    336:                                bputs(text[ResortWarning]);
                    337:                                return(0); }
                    338: 
                    339:                        if(!stricmp(csi->str,"ALL")) {     /* all libraries */
                    340:                                for(i=0;i<usrlibs;i++)
                    341:                                        for(j=0;j<usrdirs[i];j++)
                    342:                                                resort(usrdir[i][j]);
                    343:                                return(0); }
                    344:                        if(!stricmp(csi->str,"LIB")) {     /* current library */
                    345:                                for(i=0;i<usrdirs[curlib];i++)
                    346:                                        resort(usrdir[curlib][i]);
                    347:                                return(0); }
                    348:                        resort(usrdir[curlib][curdir[curlib]]);
                    349:                        return(0);
                    350: 
                    351:                case CS_FILE_GET:
                    352:                        if(!fexist(csi->str)) {
                    353:                                bputs(text[FileNotFound]);
                    354:                                return(0); }
                    355:                        if(!chksyspass())
                    356:                                return(0);
                    357: 
                    358:                case CS_FILE_SEND:
                    359: 
                    360:                        csi->logic=sendfile(csi->str) ? LOGIC_TRUE:LOGIC_FALSE;
                    361:                        return(0);
                    362: 
                    363:                case CS_FILE_PUT:
                    364:                        csi->logic=LOGIC_FALSE;
                    365:                        if(!chksyspass())
                    366:                                return(0);
                    367: 
                    368:                case CS_FILE_RECEIVE:
                    369:                        csi->logic=recvfile(csi->str) ? LOGIC_TRUE:LOGIC_FALSE;
                    370:                        return(0);
                    371: 
                    372:                case CS_FILE_UPLOAD_BULK:
                    373: 
                    374:                        if(!usrlibs) return(0);
                    375: 
                    376:                        if(!stricmp(csi->str,"ALL")) {     /* all libraries */
                    377:                                for(i=0;i<usrlibs;i++)
                    378:                                        for(j=0;j<usrdirs[i];j++) {
                    379:                                                if(cfg.lib[i]->offline_dir==usrdir[i][j])
                    380:                                                        continue;
                    381:                                                if(bulkupload(usrdir[i][j])) return(0); }
                    382:                                return(0); }
                    383:                        if(!stricmp(csi->str,"LIB")) {     /* current library */
                    384:                                for(i=0;i<usrdirs[curlib];i++) {
                    385:                                        if(cfg.lib[usrlib[curlib]]->offline_dir
                    386:                                                ==usrdir[curlib][i])
                    387:                                                continue;
                    388:                                        if(bulkupload(usrdir[curlib][i])) return(0); }
                    389:                                return(0); }
                    390:                        bulkupload(usrdir[curlib][curdir[curlib]]); /* current dir */
                    391:                        return(0);
                    392: 
                    393:                case CS_FILE_FIND_OLD:
                    394:                case CS_FILE_FIND_OPEN:
                    395:                case CS_FILE_FIND_OFFLINE:
                    396:                case CS_FILE_FIND_OLD_UPLOADS:
                    397:                        if(!usrlibs) return(0);
                    398:                        if(!getfilespec(tmp))
                    399:                                return(0);
                    400:                        padfname(tmp,str);
                    401:                        k=0;
                    402:                        bputs("\r\nSearching ");
                    403:                        if(!stricmp(csi->str,"ALL"))
                    404:                                bputs("all libraries");
                    405:                        else if(!stricmp(csi->str,"LIB"))
                    406:                                bputs("library");
                    407:                        else
                    408:                                bputs("directory");
                    409:                        bputs(" for files ");
                    410:                        if(*(csi->ip-1)==CS_FILE_FIND_OLD_UPLOADS) {
                    411:                                l=FI_OLDUL;
                    412:                                bprintf("uploaded before %s\r\n",timestr(&ns_time)); }
                    413:                        else if(*(csi->ip-1)==CS_FILE_FIND_OLD) { /* go by download date */
                    414:                                l=FI_OLD;
                    415:                                bprintf("not downloaded since %s\r\n",timestr(&ns_time)); }
                    416:                        else if(*(csi->ip-1)==CS_FILE_FIND_OFFLINE) {
                    417:                                l=FI_OFFLINE;
                    418:                                bputs("not online...\r\n"); }
                    419:                        else {
                    420:                                l=FI_CLOSE;
                    421:                                bputs("currently open...\r\n"); }
                    422:                        if(!stricmp(csi->str,"ALL")) {
                    423:                                for(i=0;i<usrlibs;i++)
                    424:                                        for(j=0;j<usrdirs[i];j++) {
                    425:                                                if(cfg.lib[i]->offline_dir==usrdir[i][j])
                    426:                                                        continue;
                    427:                                                if((s=listfileinfo(usrdir[i][j],str,(char)l))==-1)
                    428:                                                        return(0);
                    429:                                                else k+=s; } }
                    430:                        else if(!stricmp(csi->str,"LIB")) {
                    431:                                for(i=0;i<usrdirs[curlib];i++) {
                    432:                                        if(cfg.lib[usrlib[curlib]]->offline_dir==usrdir[curlib][i])
                    433:                                                        continue;
                    434:                                        if((s=listfileinfo(usrdir[curlib][i],str,(char)l))==-1)
                    435:                                                return(0);
                    436:                                        else k+=s; } }
                    437:                        else {
                    438:                                s=listfileinfo(usrdir[curlib][curdir[curlib]],str,(char)l);
                    439:                                if(s==-1)
                    440:                                        return(0);
                    441:                                k=s; }
                    442:                        if(k>1) {
                    443:                                bprintf(text[NFilesListed],k); }
                    444:                        return(0); }
                    445: 
                    446:        if(*(csi->ip-1)>=CS_MSG_SET_AREA && *(csi->ip-1)<=CS_MSG_UNUSED1) {
                    447:                csi->ip--;
                    448:                return(exec_msg(csi)); }
                    449: 
                    450:        if(*(csi->ip-1)>=CS_FILE_SET_AREA && *(csi->ip-1)<=CS_FILE_RECEIVE) {
                    451:                csi->ip--;
                    452:                return(exec_file(csi)); }
                    453: 
                    454:        errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1));
                    455:        return(0);
                    456: }

unix.superglobalmegacorp.com

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