Annotation of sbbs/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.11 2000/12/11 23:21:11 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 2000 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: extern SOCKET spy_socket[];
                     42: extern RingBuf* node_inbuf[];
                     43: 
                     44: int sbbs_t::exec_function(csi_t *csi)
                     45: {
                     46:        char    str[256],tmp2[128],ch;
                     47:        char    tmp[512];
                     48:        uchar*  p;
                     49:        char    ansi_seq[32];
                     50:        int             ansi_len;
                     51:        int             in;
                     52:        int             s,file;
                     53:        uint    i,j,k;
                     54:        long    l;
                     55:        stats_t stats;
                     56:        node_t  node;
                     57:        struct  tm * tm;
                     58: 
                     59:        switch(*(csi->ip++)) {
                     60: 
                     61: 
                     62:                case CS_PRINTFILE_STR:
                     63:                        printfile(csi->str,P_NOATCODES);
                     64:                        return(0);
                     65: 
                     66:        /********************************/
                     67:        /* General Main Menu Type Stuff */
                     68:        /********************************/
                     69:                case CS_AUTO_MESSAGE:
                     70:                        automsg();
                     71:                        return(0);
                     72:                case CS_MINUTE_BANK:
                     73:                        if(cfg.sys_misc&SM_TIMEBANK) {  /* Allow users to deposit free time */
                     74:                                s=(cfg.level_timeperday[useron.level]-useron.ttoday)+useron.textra;
                     75:                                if(s<0) s=0;
                     76:                                if(s>cfg.level_timepercall[useron.level])
                     77:                                        s=cfg.level_timepercall[useron.level];
                     78:                                s-=(now-starttime)/60;
                     79:                                if(s<0) s=0;
                     80:                                bprintf(text[FreeMinLeft],s);
                     81:                                bprintf(text[UserMinutes],ultoac(useron.min,tmp));
                     82:                                if(cfg.max_minutes && useron.min>=cfg.max_minutes) {
                     83:                                        bputs(text[YouHaveTooManyMinutes]);
                     84:                                        return(0); }
                     85:                                if(cfg.max_minutes)
                     86:                                        while(s>0 && s+useron.min>cfg.max_minutes) s--;
                     87:                                bprintf(text[FreeMinToDeposit],s);
                     88:                                s=getnum(s);
                     89:                                if(s>0) {
                     90:                                        logline("  ","Minute Bank Deposit");
                     91:                                        useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,s);
                     92:                                        useron.ttoday=(ushort)adjustuserrec(&cfg,useron.number,U_TTODAY,10,s);
                     93:                                        sprintf(str,"Minute Adjustment: %u",s*cfg.cdt_min_value);
                     94:                                        logline("*+",str); } }
                     95: 
                     96:                        if(!(cfg.sys_misc&SM_NOCDTCVT)) {
                     97:                                bprintf(text[ConversionRate],cfg.cdt_min_value);
                     98:                                bprintf(text[UserCredits]
                     99:                                        ,ultoac(useron.cdt,tmp)
                    100:                                        ,ultoac(useron.freecdt,tmp2)
                    101:                                        ,ultoac(cfg.level_freecdtperday[useron.level],str));
                    102:                                bprintf(text[UserMinutes],ultoac(useron.min,tmp));
                    103:                                if(useron.cdt/102400L<1L) {
                    104:                                        bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt,tmp));
                    105:                                        return(0); }
                    106:                                if(cfg.max_minutes && useron.min>=cfg.max_minutes) {
                    107:                                        bputs(text[YouHaveTooManyMinutes]);
                    108:                                        return(0); }
                    109:                                s=useron.cdt/102400L;
                    110:                                if(cfg.max_minutes)
                    111:                                        while(s>0 && (s*cfg.cdt_min_value)+useron.min>cfg.max_minutes) s--;
                    112:                                bprintf(text[CreditsToMin],s);
                    113:                                s=getnum(s);
                    114:                                if(s>0) {
                    115:                                        logline("  ","Credit to Minute Conversion");
                    116:                                        useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10,-(s*102400L));
                    117:                                        useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,s*cfg.cdt_min_value);
                    118:                                        sprintf(str,"Credit Adjustment: %ld",-(s*102400L));
                    119:                                        logline("$-",str);
                    120:                                        sprintf(str,"Minute Adjustment: %u",s*cfg.cdt_min_value);
                    121:                                        logline("*+",str); } }
                    122:                        return(0);
                    123:                case CS_CHAT_SECTION:
                    124:                        if(useron.rest&FLAG('C'))
                    125:                                bputs(text[R_Chat]);
                    126:                        else
                    127:                                chatsection();
                    128:                        return(0);
                    129:                case CS_USER_DEFAULTS:
                    130:                        maindflts(&useron);
                    131:                        if(!(useron.rest&FLAG('G')))    /* not guest */
                    132:                                getuserdat(&cfg,&useron);
                    133:                        return(0);
                    134:                case CS_TEXT_FILE_SECTION:
                    135:                        text_sec();
                    136:                        return(0);
                    137:                case CS_INFO_SYSTEM:   /* System information */
                    138:                        bputs(text[SiHdr]);
                    139:                        getstats(&cfg,0,&stats);
                    140:                        bprintf(text[SiSysName],cfg.sys_name);
                    141:                        bprintf(text[SiSysID],cfg.sys_id);      /* QWK ID */
                    142:                        for(i=0;i<cfg.total_faddrs;i++)
                    143:                                bprintf(text[SiSysFaddr],faddrtoa(cfg.faddr[i]));
                    144:                        if(cfg.sys_psname[0])                           /* PostLink/PCRelay */
                    145:                                bprintf(text[SiSysPsite],cfg.sys_psname,cfg.sys_psnum);
                    146:                        bprintf(text[SiSysLocation],cfg.sys_location);
                    147:                        bprintf(text[SiSysop],cfg.sys_op);
                    148:                        bprintf(text[SiSysNodes],cfg.sys_nodes);
                    149:        //              bprintf(text[SiNodeNumberName],cfg.node_num,cfg.node_name);
                    150:                        bprintf(text[SiNodePhone],cfg.node_phone);
                    151:                        bprintf(text[SiTotalLogons],ultoac(stats.logons,tmp));
                    152:                        bprintf(text[SiLogonsToday],ultoac(stats.ltoday,tmp));
                    153:                        bprintf(text[SiTotalTime],ultoac(stats.timeon,tmp));
                    154:                        bprintf(text[SiTimeToday],ultoac(stats.ttoday,tmp));
                    155:                        ver();
                    156:                        if(yesno(text[ViewSysInfoFileQ])) {
                    157:                                CLS;
                    158:                                sprintf(str,"%ssystem.msg", cfg.text_dir);
                    159:                                printfile(str,0); }
                    160:                        if(yesno(text[ViewLogonMsgQ])) {
                    161:                                CLS;
                    162:                                menu("logon"); }
                    163:                        return(0);
                    164:                case CS_INFO_SUBBOARD:   /* Sub-board information */
                    165:                        if(!usrgrps) return(0);
                    166:                        subinfo(usrsub[curgrp][cursub[curgrp]]);
                    167:                        return(0);
                    168:                case CS_INFO_DIRECTORY:   /* Sub-board information */
                    169:                        if(!usrlibs) return(0);
                    170:                        dirinfo(usrdir[curlib][curdir[curlib]]);
                    171:                        return(0);
                    172:                case CS_INFO_VERSION:   /* Version */
                    173:                        ver();
                    174:                        return(0);
                    175:                case CS_INFO_USER:       /* User's statistics */
                    176:                        bprintf(text[UserStats],useron.alias,useron.number);
                    177: 
                    178:                        tm=gmtime(&useron.laston);
                    179:                        if(tm!=NULL)
                    180:                                bprintf(text[UserDates]
                    181:                                        ,unixtodstr(&cfg,useron.firston,str)
                    182:                                        ,unixtodstr(&cfg,useron.expire,tmp)
                    183:                                        ,unixtodstr(&cfg,useron.laston,tmp2)
                    184:                                        ,tm->tm_hour,tm->tm_min);
                    185: 
                    186:                        bprintf(text[UserTimes]
                    187:                                ,useron.timeon,useron.ttoday
                    188:                                ,cfg.level_timeperday[useron.level]
                    189:                                ,useron.tlast
                    190:                                ,cfg.level_timepercall[useron.level]
                    191:                                ,useron.textra);
                    192:                        if(useron.posts)
                    193:                                i=useron.logons/useron.posts;
                    194:                        else
                    195:                                i=0;
                    196:                        bprintf(text[UserLogons]
                    197:                                ,useron.logons,useron.ltoday
                    198:                                ,cfg.level_callsperday[useron.level],useron.posts
                    199:                                ,i ? 100/i : useron.posts>useron.logons ? 100 : 0
                    200:                                ,useron.ptoday);
                    201:                        bprintf(text[UserEmails]
                    202:                                ,useron.emails,useron.fbacks
                    203:                                ,getmail(&cfg,useron.number,0),useron.etoday);
                    204:                        CRLF;
                    205:                        bprintf(text[UserUploads]
                    206:                                ,ultoac(useron.ulb,tmp),useron.uls);
                    207:                        bprintf(text[UserDownloads]
                    208:                                ,ultoac(useron.dlb,tmp),useron.dls,nulstr);
                    209:                        bprintf(text[UserCredits],ultoac(useron.cdt,tmp)
                    210:                                ,ultoac(useron.freecdt,tmp2)
                    211:                                ,ultoac(cfg.level_freecdtperday[useron.level],str));
                    212:                        bprintf(text[UserMinutes],ultoac(useron.min,tmp));
                    213:                        return(0);
                    214:                case CS_INFO_XFER_POLICY:
                    215:                        if(!usrlibs) return(0);
                    216:                        sprintf(str,"%smenu/tpolicy.*", cfg.text_dir);
                    217:                        if(fexist(str))
                    218:                                menu("tpolicy");
                    219:                        else {
                    220:                                bprintf(text[TransferPolicyHdr],cfg.sys_name);
                    221:                                bprintf(text[TpUpload]
                    222:                                        ,cfg.dir[usrdir[curlib][curdir[curlib]]]->up_pct);
                    223:                                bprintf(text[TpDownload]
                    224:                                        ,cfg.dir[usrdir[curlib][curdir[curlib]]]->dn_pct);
                    225:                                }
                    226:                        return(0);
                    227:                case CS_XTRN_EXEC:
                    228:                        csi->logic=LOGIC_TRUE;
                    229:                        for(i=0;i<cfg.total_xtrns;i++)
                    230:                                if(!stricmp(cfg.xtrn[i]->code,csi->str))
                    231:                                        break;
                    232:                        if(i<cfg.total_xtrns)
                    233:                                exec_xtrn(i);
                    234:                        else
                    235:                                csi->logic=LOGIC_FALSE;
                    236:                        return(0);
                    237:                case CS_XTRN_SECTION:
                    238:                        if(useron.rest&FLAG('X'))
                    239:                                bputs(text[R_ExternalPrograms]);
                    240:                        else
                    241:                                xtrn_sec();     /* If external available, don't pause */
                    242:                        return(0);
                    243:                case CS_LOGOFF:
                    244:                        if(!noyes(text[LogOffQ])) {
                    245:                                if(cfg.logoff_mod[0])
                    246:                                        exec_bin(cfg.logoff_mod,csi);
                    247:                                user_event(EVENT_LOGOFF);
                    248:                                menu("logoff");
                    249:                                SYNC;
                    250:                                hangup(); }
                    251:                        return(0);
                    252:                case CS_LOGOFF_FAST:
                    253:                        SYNC;
                    254:                        hangup();
                    255:                        return(0);
                    256:                case CS_NODELIST_ALL:
                    257:                        CRLF;
                    258:                        bputs(text[NodeLstHdr]);
                    259:                        for(i=1;i<=cfg.sys_nodes && i<=cfg.sys_lastnode;i++) {
                    260:                                getnodedat(i,&node,0);
                    261:                                printnodedat(i,&node); }
                    262:                        return(0);
                    263:                case CS_NODELIST_USERS:
                    264:                        whos_online(true);
                    265:                        return(0);
                    266:                case CS_USERLIST_SUB:
                    267:                        userlist(UL_SUB);
                    268:                        return(0);
                    269:                case CS_USERLIST_DIR:
                    270:                        userlist(UL_DIR);
                    271:                        return(0);
                    272:                case CS_USERLIST_ALL:
                    273:                        userlist(UL_ALL);
                    274:                        return(0);
                    275:                case CS_USERLIST_LOGONS:
                    276:                        sprintf(str,"%slogon.lst", cfg.data_dir);
                    277:                        if(flength(str)<1) {
                    278:                                bputs("\r\n\r\n");
                    279:                                bputs(text[NoOneHasLoggedOnToday]); }
                    280:                        else {
                    281:                                bputs(text[CallersToday]);
                    282:                                printfile(str,P_NOATCODES|P_OPENCLOSE);
                    283:                                CRLF; }
                    284:                        return(0);
                    285:                case CS_PAGE_SYSOP:
                    286:                        if(cfg.startup->options&BBS_OPT_SYSOP_AVAILABLE 
                    287:                                || (cfg.sys_chat_ar[0] && chk_ar(cfg.sys_chat_ar,&useron))
                    288:                                || useron.exempt&FLAG('C')) {
                    289:                                sysop_page();
                    290:                                return(0); }
                    291:                        bprintf(text[SysopIsNotAvailable],cfg.sys_op);
                    292:                        return(0);
                    293:                case CS_PAGE_GURU:
                    294:                        csi->logic=LOGIC_FALSE;
                    295:                        for(i=0;i<cfg.total_gurus;i++)
                    296:                                if(!stricmp(csi->str,cfg.guru[i]->code)
                    297:                                        && chk_ar(cfg.guru[i]->ar,&useron))
                    298:                                        break;
                    299:                        if(i>=cfg.total_gurus)
                    300:                                return(0);
                    301:                        sprintf(str,"%s%s.dat", cfg.ctrl_dir, cfg.guru[i]->code);
                    302:                        if((file=nopen(str,O_RDONLY))==-1) {
                    303:                                errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    304:                                return(0); }
                    305:                        if((p=(uchar *)MALLOC(filelength(file)+1))==NULL) {
                    306:                                close(file);
                    307:                                errormsg(WHERE,ERR_ALLOC,str,filelength(file)+1);
                    308:                                return(0); }
                    309:                        read(file,p,filelength(file));
                    310:                        p[filelength(file)]=0;
                    311:                        close(file);
                    312:                        localguru((char*)p,i);
                    313:                        FREE(p);
                    314:                        csi->logic=LOGIC_TRUE;
                    315:                        return(0);
                    316:                case CS_SPY:
                    317:                        i=atoi(csi->str);
                    318:                        if(!i || i>MAX_NODES) {
                    319:                                bprintf("Invalid node number: %d\r\n",i);
                    320:                                csi->logic=LOGIC_FALSE;
                    321:                                return(0);
                    322:                        }
                    323:                        if(i==cfg.node_num) {
                    324:                                bprintf("Can't spy on yourself.\r\n");
                    325:                                csi->logic=LOGIC_FALSE;
                    326:                                return(0);
                    327:                        }
                    328:                        if(spy_socket[i-1]!=INVALID_SOCKET) {
                    329:                                bprintf("Node %d already being spied (%lx)\r\n",i,spy_socket[i-1]);
                    330:                                csi->logic=LOGIC_FALSE;
                    331:                                return(0);
                    332:                        }
                    333:                        bprintf("*** Synchronet Remote Spy on Node %d: Ctrl-C to Abort ***"
                    334:                                "\r\n\r\n",i);
                    335:                        spy_socket[i-1]=client_socket;
                    336:                        ansi_len=0;
                    337:                        while(online 
                    338:                                && client_socket!=INVALID_SOCKET 
                    339:                                && spy_socket[i-1]!=INVALID_SOCKET 
                    340:                                && !msgabort()) {
                    341:                                in=incom();
                    342:                                if(in==NOINP) {
                    343:                                        gettimeleft();
                    344:                                        mswait(1);
                    345:                                        continue;
                    346:                                }
                    347:                                ch=in;
                    348:                                if(ch==ESC) {
                    349:                                        if(!ansi_len) {
                    350:                                                ansi_seq[ansi_len++]=ch;
                    351:                                                continue;
                    352:                                        }
                    353:                                        ansi_len=0;
                    354:                                }
                    355:                                if(ansi_len && ansi_len<sizeof(ansi_seq)-2) {
                    356:                                        if(ansi_len==1) {
                    357:                                                if(ch=='[') {
                    358:                                                        ansi_seq[ansi_len++]=ch;
                    359:                                                        continue;
                    360:                                                }
                    361:                                                ansi_len=0;
                    362:                                        }
                    363:                                        if(ch=='R') { /* through-away cursor position report */
                    364:                                                ansi_len=0;
                    365:                                                continue;
                    366:                                        }
                    367:                                        ansi_seq[ansi_len++]=ch;
                    368:                                        if(isalpha(ch)) {
                    369:                                                RingBufWrite(node_inbuf[i-1],(uchar*)ansi_seq,ansi_len);
                    370:                                                ansi_len=0;
                    371:                                        }
                    372:                                        continue;
                    373:                                }
                    374:                                if(ch==16) {    /* Ctrl-P Private node-node comm */
                    375:                                        lncntr=0;                                               /* defeat pause */
                    376:                                        spy_socket[i-1]=INVALID_SOCKET; /* disable spy output */
                    377:                                        nodesync();                                     /* read waiting messages */
                    378:                                        nodemsg();                                              /* send a message */
                    379:                                        spy_socket[i-1]=client_socket;  /* enable spy output */
                    380:                                        continue; 
                    381:                                }
                    382:                                if(ch==21) {    /* Ctrl-U Users online */
                    383:                                        lncntr=0;                       /* defeat pause */
                    384:                                        whos_online(true);      /* list users */
                    385:                                        continue;
                    386:                                }
                    387:                                if(node_inbuf[i-1]!=NULL) 
                    388:                                        RingBufWrite(node_inbuf[i-1],(uchar*)&ch,1);
                    389:                        }
                    390:                        spy_socket[i-1]=INVALID_SOCKET;
                    391:                        csi->logic=LOGIC_TRUE;
                    392:                        return(0);
                    393:                case CS_PRIVATE_CHAT:
                    394:                        privchat();
                    395:                        return(0);
                    396:                case CS_PRIVATE_MESSAGE:
                    397:                        nodemsg();
                    398:                        return(0);
                    399: 
                    400:        /*******************/
                    401:        /* Sysop Functions */
                    402:        /*******************/
                    403:                case CS_USER_EDIT:
                    404:                        useredit(csi->str[0] ? finduser(csi->str) : 0,0);
                    405:                        return(0);
                    406: 
                    407: 
                    408:        /******************/
                    409:        /* Mail Functions */
                    410:        /******************/
                    411: 
                    412:                case CS_MAIL_READ:       /* Read E-mail */
                    413:                        readmail(useron.number,MAIL_YOUR);
                    414:                        return(0);
                    415:                case CS_MAIL_READ_SENT:           /* Kill/read sent mail */
                    416:                        if(useron.rest&FLAG('K'))
                    417:                                bputs(text[R_ReadSentMail]);
                    418:                        else
                    419:                                readmail(useron.number,MAIL_SENT);
                    420:                        return(0);
                    421:                case CS_MAIL_READ_ALL:
                    422:                        readmail(useron.number,MAIL_ALL);
                    423:                        return(0);
                    424:                case CS_MAIL_SEND:               /* Send E-mail */
                    425:                        if(strchr(csi->str,'@')) {
                    426:                                i=1;
                    427:                                netmail(csi->str,nulstr,0); }
                    428:                        else if((i=finduser(csi->str))!=0)
                    429:                                email(i,nulstr,nulstr,WM_EMAIL);
                    430:                        csi->logic=!i;
                    431:                        return(0);
                    432:                case CS_MAIL_SEND_FEEDBACK:       /* Feedback */
                    433:                        if((i=finduser(csi->str))!=0)
                    434:                                email(i,text[ReFeedback],nulstr,WM_EMAIL);
                    435:                        csi->logic=!i;
                    436:                        return(0);
                    437:                case CS_MAIL_SEND_NETMAIL:
                    438:                        bputs(text[EnterNetMailAddress]);
                    439:                        if(getstr(str,60,K_LINE)) {
                    440:                                netmail(str,nulstr,0);
                    441:                                csi->logic=LOGIC_TRUE; }
                    442:                        else
                    443:                                csi->logic=LOGIC_FALSE;
                    444:                        return(0);
                    445: 
                    446:                case CS_MAIL_SEND_NETFILE:
                    447:                        bputs(text[EnterNetMailAddress]);
                    448:                        if(getstr(str,60,K_LINE)) {
                    449:                                netmail(str,nulstr,WM_FILE);
                    450:                                csi->logic=LOGIC_TRUE; }
                    451:                        else
                    452:                                csi->logic=LOGIC_FALSE;
                    453:                        return(0);
                    454: 
                    455:                case CS_MAIL_SEND_FILE:   /* Upload Attached File to E-mail */
                    456:                        if(strchr(csi->str,'@')) {
                    457:                                i=1;
                    458:                                netmail(csi->str,nulstr,WM_FILE); }
                    459:                        else if((i=finduser(csi->str))!=0)
                    460:                                email(i,nulstr,nulstr,WM_EMAIL|WM_FILE);
                    461:                        csi->logic=!i;
                    462:                        return(0);
                    463:                case CS_MAIL_SEND_BULK:
                    464:                        if(csi->str[0])
                    465:                                p=arstr(0,csi->str, &cfg);
                    466:                        else
                    467:                                p=(uchar *)nulstr;
                    468:                        bulkmail(p);
                    469:                        if(p && p[0])
                    470:                                FREE(p);
                    471:                        return(0);
                    472: 
                    473:                case CS_INC_MAIN_CMDS:
                    474:                        main_cmds++;
                    475:                        return(0);
                    476: 
                    477:                case CS_INC_FILE_CMDS:
                    478:                        xfer_cmds++;
                    479:                        return(0);
                    480: 
                    481:                case CS_SYSTEM_LOG:                 /* System log */
                    482:                        if(!chksyspass(0))
                    483:                                return(0);
                    484:                        tm=gmtime(&now);
                    485:                        if(tm==NULL)
                    486:                                return(0);
                    487:                        sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log", cfg.data_dir
                    488:                                ,tm->tm_mon+1,tm->tm_mday,TM_YEAR(tm->tm_year));
                    489:                        printfile(str,0);
                    490:                        return(0);
                    491:                case CS_SYSTEM_YLOG:                /* Yesterday's log */
                    492:                        if(!chksyspass(0))
                    493:                                return(0);
                    494:                        now-=(ulong)60L*24L*60L;
                    495:                        tm=gmtime(&now);
                    496:                        if(tm==NULL)
                    497:                                return(0);
                    498:                        sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log",cfg.data_dir
                    499:                                ,tm->tm_mon+1,tm->tm_mday,TM_YEAR(tm->tm_year));
                    500:                        printfile(str,0);
                    501:                        return(0);
                    502:                case CS_SYSTEM_STATS:               /* System Statistics */
                    503:                        bputs(text[SystemStatsHdr]);
                    504:                        getstats(&cfg,0,&stats);
                    505:                        bprintf(text[StatsTotalLogons],ultoac(stats.logons,tmp));
                    506:                        bprintf(text[StatsLogonsToday],ultoac(stats.ltoday,tmp));
                    507:                        bprintf(text[StatsTotalTime],ultoac(stats.timeon,tmp));
                    508:                        bprintf(text[StatsTimeToday],ultoac(stats.ttoday,tmp));
                    509:                        bprintf(text[StatsUploadsToday],ultoac(stats.ulb,tmp)
                    510:                                ,stats.uls);
                    511:                        bprintf(text[StatsDownloadsToday],ultoac(stats.dlb,tmp)
                    512:                                ,stats.dls);
                    513:                        bprintf(text[StatsPostsToday],ultoac(stats.ptoday,tmp));
                    514:                        bprintf(text[StatsEmailsToday],ultoac(stats.etoday,tmp));
                    515:                        bprintf(text[StatsFeedbacksToday],ultoac(stats.ftoday,tmp));
                    516:                        return(0);
                    517:                case CS_NODE_STATS:              /* Node Statistics */
                    518:                        i=atoi(csi->str);
                    519:                        if(i>cfg.sys_nodes) {
                    520:                                bputs(text[InvalidNode]);
                    521:                                return(0); }
                    522:                        if(!i) i=cfg.node_num;
                    523:                        bprintf(text[NodeStatsHdr],i);
                    524:                        getstats(&cfg,i,&stats);
                    525:                        bprintf(text[StatsTotalLogons],ultoac(stats.logons,tmp));
                    526:                        bprintf(text[StatsLogonsToday],ultoac(stats.ltoday,tmp));
                    527:                        bprintf(text[StatsTotalTime],ultoac(stats.timeon,tmp));
                    528:                        bprintf(text[StatsTimeToday],ultoac(stats.ttoday,tmp));
                    529:                        bprintf(text[StatsUploadsToday],ultoac(stats.ulb,tmp)
                    530:                                ,stats.uls);
                    531:                        bprintf(text[StatsDownloadsToday],ultoac(stats.dlb,tmp)
                    532:                                ,stats.dls);
                    533:                        bprintf(text[StatsPostsToday],ultoac(stats.ptoday,tmp));
                    534:                        bprintf(text[StatsEmailsToday],ultoac(stats.etoday,tmp));
                    535:                        bprintf(text[StatsFeedbacksToday],ultoac(stats.ftoday,tmp));
                    536:                        return(0);
                    537:                case CS_CHANGE_USER:                 /* Change to another user */
                    538:                        if(!chksyspass(0))
                    539:                                return(0);
                    540:                        bputs(text[ChUserPrompt]);
                    541:                        if(!getstr(str,LEN_ALIAS,K_UPPER))
                    542:                                return(0);
                    543:                        if((i=finduser(str))==0)
                    544:                                return(0);
                    545:                        if(online==ON_REMOTE) {
                    546:                                getuserrec(&cfg,i,U_LEVEL,2,str);
                    547:                                if(atoi(str)>logon_ml) {
                    548:                                        getuserrec(&cfg,i,U_PASS,8,tmp);
                    549:                                        bputs(text[ChUserPwPrompt]);
                    550:                                        console|=CON_R_ECHOX;
                    551:                                        if(!(cfg.sys_misc&SM_ECHO_PW))
                    552:                                                console|=CON_L_ECHOX;
                    553:                                        getstr(str,8,K_UPPER);
                    554:                                        console&=~(CON_R_ECHOX|CON_L_ECHOX);
                    555:                                        if(strcmp(str,tmp))
                    556:                                                return(0); } }
                    557:                        putmsgptrs();
                    558:                        putuserrec(&cfg,useron.number,U_CURSUB,8
                    559:                                ,cfg.sub[usrsub[curgrp][cursub[curgrp]]]->code);
                    560:                        putuserrec(&cfg,useron.number,U_CURDIR,8
                    561:                                ,cfg.dir[usrdir[curlib][curdir[curlib]]]->code);
                    562:                        useron.number=i;
                    563:                        getuserdat(&cfg,&useron);
                    564:                        getnodedat(cfg.node_num,&thisnode,1);
                    565:                        thisnode.useron=useron.number;
                    566:                        putnodedat(cfg.node_num,&thisnode);
                    567:                        getmsgptrs();
                    568:                        if(REALSYSOP) sys_status&=~SS_TMPSYSOP;
                    569:                        else sys_status|=SS_TMPSYSOP;
                    570:                        sprintf(str,"Changed into %s #%u",useron.alias,useron.number);
                    571:                        logline("S+",str);
                    572:                        return(0);
                    573:                case CS_SHOW_MEM:
                    574:        #ifdef __MSDOS__
                    575:                         bprintf(text[NBytesFreeMemory],farcoreleft());
                    576:        #endif
                    577:                        return(0);
                    578:                case CS_ERROR_LOG:
                    579:                        sprintf(str,"%serror.log", cfg.data_dir);
                    580:                        if(fexist(str)) {
                    581:                                bputs(text[ErrorLogHdr]);
                    582:                                printfile(str,0);
                    583:                                if(!noyes(text[DeleteErrorLogQ]))
                    584:                                        remove(str); }
                    585:                        else
                    586:                                bputs(text[NoErrorLogExists]);
                    587:                        for(i=1;i<=cfg.sys_nodes;i++) {
                    588:                                getnodedat(i,&node,0);
                    589:                                if(node.errors)
                    590:                                        break; }
                    591:                        if(i<=cfg.sys_nodes || criterrs) {
                    592:                                if(!noyes(text[ClearErrCounter])) {
                    593:                                        for(i=1;i<=cfg.sys_nodes;i++) {
                    594:                                                getnodedat(i,&node,1);
                    595:                                                node.errors=0;
                    596:                                                putnodedat(i,&node); }
                    597:                                        criterrs=0; } }
                    598:                        return(0);
                    599:                case CS_ANSI_CAPTURE:           /* Capture ANSI codes */
                    600:                        sys_status^=SS_ANSCAP;
                    601:                        bprintf(text[ANSICaptureIsNow]
                    602:                                ,sys_status&SS_ANSCAP ? text[ON] : text[OFF]);
                    603:                        return(0);
                    604:                case CS_LIST_TEXT_FILE:              /* View ASCII/ANSI/Ctrl-A file */
                    605:                        if(!chksyspass(0))
                    606:                                return(0);
                    607:                        bputs(text[Filename]);
                    608:                        if(getstr(str,60,0))
                    609:                                printfile(str,0);
                    610:                        return(0);
                    611:                case CS_EDIT_TEXT_FILE:              /* Edit ASCII/Ctrl-A file */
                    612:                        if(!chksyspass(0))
                    613:                                return(0);
                    614:                        bputs(text[Filename]);
                    615:                        if(getstr(str,60,0))
                    616:                                editfile(str);
                    617:                        return(0);
                    618:                case CS_GURU_LOG:
                    619:                        sprintf(str,"%sguru.log", cfg.data_dir);
                    620:                        if(fexist(str)) {
                    621:                                printfile(str,0);
                    622:                                CRLF;
                    623:                                if(!noyes(text[DeleteGuruLogQ]))
                    624:                                        remove(str); }
                    625:                        return(0);
                    626:                case CS_FILE_SET_ALT_PATH:
                    627:                        altul=atoi(csi->str);
                    628:                        if(altul>cfg.altpaths)
                    629:                                altul=0;
                    630:                        bprintf(text[AltULPathIsNow],altul ? cfg.altpath[altul-1] : text[OFF]);
                    631:                        return(0);
                    632:                case CS_FILE_RESORT_DIRECTORY:
                    633:                        for(i=1;i<=cfg.sys_nodes;i++)
                    634:                                if(i!=cfg.node_num) {
                    635:                                        getnodedat(i,&node,0);
                    636:                                        if(node.status==NODE_INUSE
                    637:                                                || node.status==NODE_QUIET)
                    638:                                                break; }
                    639: 
                    640:                        if(i<=cfg.sys_nodes) {
                    641:                                bputs(text[ResortWarning]);
                    642:                                return(0); }
                    643: 
                    644:                        if(!stricmp(csi->str,"ALL")) {     /* all libraries */
                    645:                                for(i=0;i<usrlibs;i++)
                    646:                                        for(j=0;j<usrdirs[i];j++)
                    647:                                                resort(usrdir[i][j]);
                    648:                                return(0); }
                    649:                        if(!stricmp(csi->str,"LIB")) {     /* current library */
                    650:                                for(i=0;i<usrdirs[curlib];i++)
                    651:                                        resort(usrdir[curlib][i]);
                    652:                                return(0); }
                    653:                        resort(usrdir[curlib][curdir[curlib]]);
                    654:                        return(0);
                    655: 
                    656:                case CS_FILE_GET:
                    657: 
                    658:                        if(!fexist(csi->str)) {
                    659:                                bputs(text[FileNotFound]);
                    660:                                return(0); }
                    661:                        if(!chksyspass(0))
                    662:                                return(0);
                    663: 
                    664:                case CS_FILE_SEND:
                    665: 
                    666:                        menu("dlprot");
                    667:                        mnemonics(text[ProtocolOrQuit]);
                    668:                        strcpy(str,"Q");
                    669:                        for(i=0;i<cfg.total_prots;i++)
                    670:                                if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) {
                    671:                                        sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
                    672:                                        strcat(str,tmp); }
                    673:                        ch=(char)getkeys(str,0);
                    674:                        if(ch=='Q' || sys_status&SS_ABORT) {
                    675:                                return(0); }
                    676:                        for(i=0;i<cfg.total_prots;i++)
                    677:                                if(cfg.prot[i]->mnemonic==ch && chk_ar(cfg.prot[i]->ar,&useron))
                    678:                                        break;
                    679:                        if(i<cfg.total_prots) {
                    680:                                protocol(cmdstr(cfg.prot[i]->dlcmd,csi->str,csi->str,str),0);
                    681:                                autohangup(); }
                    682:                        return(0);
                    683: 
                    684:                case CS_FILE_PUT:
                    685:                        if(!chksyspass(0))
                    686:                                return(0);
                    687:                        menu("ulprot");
                    688:                        mnemonics(text[ProtocolOrQuit]);
                    689:                        strcpy(str,"Q");
                    690:                        for(i=0;i<cfg.total_prots;i++)
                    691:                                if(cfg.prot[i]->ulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) {
                    692:                                        sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
                    693:                                        strcat(str,tmp); }
                    694:                        ch=(char)getkeys(str,0);
                    695:                        if(ch=='Q' || sys_status&SS_ABORT) {
                    696:                                lncntr=0;
                    697:                                return(0); }
                    698:                        for(i=0;i<cfg.total_prots;i++)
                    699:                                if(cfg.prot[i]->mnemonic==ch && chk_ar(cfg.prot[i]->ar,&useron))
                    700:                                        break;
                    701:                        if(i<cfg.total_prots) {
                    702:                                protocol(cmdstr(cfg.prot[i]->ulcmd,csi->str,csi->str,str),0);
                    703:                                autohangup(); }
                    704:                        return(0);
                    705: 
                    706:                case CS_FILE_UPLOAD_BULK:
                    707: 
                    708:                        if(!usrlibs) return(0);
                    709: 
                    710:                        if(!stricmp(csi->str,"ALL")) {     /* all libraries */
                    711:                                for(i=0;i<usrlibs;i++)
                    712:                                        for(j=0;j<usrdirs[i];j++) {
                    713:                                                if(cfg.lib[i]->offline_dir==usrdir[i][j])
                    714:                                                        continue;
                    715:                                                if(bulkupload(usrdir[i][j])) return(0); }
                    716:                                return(0); }
                    717:                        if(!stricmp(csi->str,"LIB")) {     /* current library */
                    718:                                for(i=0;i<usrdirs[curlib];i++) {
                    719:                                        if(cfg.lib[usrlib[curlib]]->offline_dir
                    720:                                                ==usrdir[curlib][i])
                    721:                                                continue;
                    722:                                        if(bulkupload(usrdir[curlib][i])) return(0); }
                    723:                                return(0); }
                    724:                        bulkupload(usrdir[curlib][curdir[curlib]]); /* current dir */
                    725:                        return(0);
                    726: 
                    727:                case CS_FILE_FIND_OLD:
                    728:                case CS_FILE_FIND_OPEN:
                    729:                case CS_FILE_FIND_OFFLINE:
                    730:                case CS_FILE_FIND_OLD_UPLOADS:
                    731:                        if(!usrlibs) return(0);
                    732:                        if(!getfilespec(tmp))
                    733:                                return(0);
                    734:                        padfname(tmp,str);
                    735:                        k=0;
                    736:                        bputs("\r\nSearching ");
                    737:                        if(!stricmp(csi->str,"ALL"))
                    738:                                bputs("all libraries");
                    739:                        else if(!stricmp(csi->str,"LIB"))
                    740:                                bputs("library");
                    741:                        else
                    742:                                bputs("directory");
                    743:                        bputs(" for files ");
                    744:                        if(*(csi->ip-1)==CS_FILE_FIND_OLD_UPLOADS) {
                    745:                                l=FI_OLDUL;
                    746:                                bprintf("uploaded before %s\r\n",timestr(&ns_time)); }
                    747:                        else if(*(csi->ip-1)==CS_FILE_FIND_OLD) { /* go by download date */
                    748:                                l=FI_OLD;
                    749:                                bprintf("not downloaded since %s\r\n",timestr(&ns_time)); }
                    750:                        else if(*(csi->ip-1)==CS_FILE_FIND_OFFLINE) {
                    751:                                l=FI_OFFLINE;
                    752:                                bputs("not online...\r\n"); }
                    753:                        else {
                    754:                                l=FI_CLOSE;
                    755:                                bputs("currently open...\r\n"); }
                    756:                        if(!stricmp(csi->str,"ALL")) {
                    757:                                for(i=0;i<usrlibs;i++)
                    758:                                        for(j=0;j<usrdirs[i];j++) {
                    759:                                                if(cfg.lib[i]->offline_dir==usrdir[i][j])
                    760:                                                        continue;
                    761:                                                if((s=listfileinfo(usrdir[i][j],str,(char)l))==-1)
                    762:                                                        return(0);
                    763:                                                else k+=s; } }
                    764:                        else if(!stricmp(csi->str,"LIB")) {
                    765:                                for(i=0;i<usrdirs[curlib];i++) {
                    766:                                        if(cfg.lib[usrlib[curlib]]->offline_dir==usrdir[curlib][i])
                    767:                                                        continue;
                    768:                                        if((s=listfileinfo(usrdir[curlib][i],str,(char)l))==-1)
                    769:                                                return(0);
                    770:                                        else k+=s; } }
                    771:                        else {
                    772:                                s=listfileinfo(usrdir[curlib][curdir[curlib]],str,(char)l);
                    773:                                if(s==-1)
                    774:                                        return(0);
                    775:                                k=s; }
                    776:                        if(k>1) {
                    777:                                bprintf(text[NFilesListed],k); }
                    778:                        return(0); }
                    779: 
                    780:        if(*(csi->ip-1)>=CS_MSG_SET_AREA && *(csi->ip-1)<=CS_MSG_UNUSED1) {
                    781:                csi->ip--;
                    782:                return(execmsg(csi)); }
                    783: 
                    784:        if(*(csi->ip-1)>=CS_FILE_SET_AREA && *(csi->ip-1)<=CS_FILE_UNUSED1) {
                    785:                csi->ip--;
                    786:                return(execfile(csi)); }
                    787: 
                    788:        errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1));
                    789:        return(0);
                    790: }

unix.superglobalmegacorp.com

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