Annotation of sbbs/sbbs2/main_wfc.c, revision 1.1.1.1

1.1       root        1: #line 1 "MAIN_WFC.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include "sbbs.h"
                      6: #include "etext.h"
                      7: #include "cmdshell.h"
                      8: #include "qwk.h"
                      9: 
                     10: extern char onquiet,nmi,llo,qwklogon;
                     11: extern char term_ret;
                     12: extern ulong connect_rate;      /* already connected at xbps */
                     13: extern char *wday[],*mon[];
                     14: extern char *hungupstr;
                     15: extern char cidarg[];
                     16: 
                     17: void reset_logon_vars(void)
                     18: {
                     19:        int i;
                     20: 
                     21: sys_status&=~(SS_USERON|SS_TMPSYSOP|SS_LCHAT|SS_ABORT
                     22:     |SS_PAUSEON|SS_PAUSEOFF|SS_EVENT|SS_NEWUSER|SS_NEWDAY);
                     23: keybufbot=keybuftop=lbuflen=slcnt=altul=timeleft_warn=0;
                     24: logon_uls=logon_ulb=logon_dls=logon_dlb=0;
                     25: logon_posts=logon_emails=logon_fbacks=0;
                     26: batdn_total=batup_total=0;
                     27: usrgrps=usrlibs=0;
                     28: curgrp=curlib=0;
                     29: for(i=0;i<total_libs;i++)
                     30:        curdir[i]=0;
                     31: for(i=0;i<total_grps;i++)
                     32:        cursub[i]=0;
                     33: }
                     34: 
                     35: void mail_maint(void)
                     36: {
                     37:        int i;
                     38: 
                     39: lprintf("\r\n\r\nPurging deleted/expired e-mail...");
                     40: sprintf(smb.file,"%sMAIL",data_dir);
                     41: smb.retry_time=smb_retry_time;
                     42: if((i=smb_open(&smb))!=0)
                     43:        errormsg(WHERE,ERR_OPEN,smb.file,i);
                     44: else {
                     45:        if((i=smb_locksmbhdr(&smb))!=0)
                     46:                errormsg(WHERE,ERR_LOCK,smb.file,i);
                     47:        else
                     48:                delmail(0,MAIL_ALL);
                     49:        smb_close(&smb); }
                     50: }
                     51: 
                     52: /*************************************************************/
                     53: /* Returns 0 to reinitialize modem and start WFC cycle again */
                     54: /* Returns 1 to continue checking things peacefully             */
                     55: /*************************************************************/
                     56: char wfc_events(time_t lastnodechk)
                     57: {
                     58:        char    str[256],str2[256],*buf;
                     59:        int     i,j,k,file,ret=1,chunk;
                     60:        ulong   l,m;
                     61:        user_t  user;
                     62:        node_t  node;
                     63:        struct  ffblk ff;
                     64:        struct  tm *gm;
                     65:        struct  date lastdate;
                     66: 
                     67: for(i=0;i<total_qhubs;i++) {
                     68:        gm=localtime(&now);       /* Qnet call out based on time */
                     69:        unixtodos(qhub[i]->last,&date,&curtime);
                     70:        if(node_num==qhub[i]->node                              /* or frequency */
                     71:                && (qhub[i]->last==-1L
                     72:                || ((qhub[i]->freq
                     73:                        && (now-qhub[i]->last)/60>qhub[i]->freq)
                     74:                || (qhub[i]->time
                     75:                        && (gm->tm_hour*60)+gm->tm_min>=qhub[i]->time
                     76:                && (gm->tm_mday!=date.da_day || gm->tm_mon!=date.da_mon-1)))
                     77:                && qhub[i]->days&(1<<gm->tm_wday))) {
                     78:                offhook();
                     79:                lputc(FF);
                     80:                sprintf(str,"%sQNET\\%s.NOW"
                     81:                        ,data_dir,qhub[i]->id);
                     82:                remove(str);                                    /* Remove semaphore file */
                     83:                sprintf(str,"%sQNET\\%s.PTR"
                     84:                        ,data_dir,qhub[i]->id);
                     85:                file=nopen(str,O_RDONLY);
                     86:                for(j=0;j<qhub[i]->subs;j++) {
                     87:                        sub[qhub[i]->sub[j]]->ptr=0;
                     88:                        lseek(file,sub[qhub[i]->sub[j]]->ptridx*4L,SEEK_SET);
                     89:                        read(file,&sub[qhub[i]->sub[j]]->ptr,4); }
                     90:                if(file!=-1)
                     91:                        close(file);
                     92:                if(pack_rep(i)) {
                     93:                        if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
                     94:                                errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT);
                     95:                        else {
                     96:                                for(j=l=0;j<qhub[i]->subs;j++) {
                     97:                                        while(filelength(file)<sub[qhub[i]->sub[j]]->ptridx*4L)
                     98:                                                write(file,&l,4);               /* initialize ptrs to null */
                     99:                                        lseek(file,sub[qhub[i]->sub[j]]->ptridx*4L,SEEK_SET);
                    100:                                        write(file,&sub[qhub[i]->sub[j]]->ptr,4); }
                    101:                                close(file); } }
                    102:                delfiles(temp_dir,"*.*");
                    103: 
                    104:                qhub[i]->last=time(NULL);
                    105:                sprintf(str,"%sQNET.DAB",ctrl_dir);
                    106:                if((file=nopen(str,O_WRONLY))==-1) {
                    107:                        errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
                    108:                        bail(1); }
                    109:                lseek(file,sizeof(time_t)*i,SEEK_SET);
                    110:                write(file,&qhub[i]->last,sizeof(time_t));
                    111:                close(file);
                    112: 
                    113:                if(qhub[i]->call[0]) {
                    114:                        getnodedat(node_num,&thisnode,1);
                    115:                        thisnode.status=NODE_NETTING;
                    116:                        putnodedat(node_num,thisnode);
                    117:                        lputc(FF);
                    118:                        external(cmdstr(qhub[i]->call,nulstr,nulstr,NULL),EX_SWAP);
                    119:                        ret=0; }
                    120:                for(j=0;j<10;j++) {
                    121:                        sprintf(str,"%s%s.QW%c",data_dir,qhub[i]->id,j ? (j-1)+'0' : 'K');
                    122:                        if(fexist(str)) {
                    123:                                lclini(node_scrnlen-1);
                    124:                                delfiles(temp_dir,"*.*");
                    125:                                unpack_qwk(str,i); } }
                    126:                lputc(FF); } }
                    127: 
                    128: for(i=0;i<total_phubs;i++) {
                    129:        gm=localtime(&now);       /* PostLink call out based on time */
                    130:        unixtodos(phub[i]->last,&date,&curtime);
                    131:        if(node_num==phub[i]->node                              /* or frequency */
                    132:                && ((phub[i]->freq
                    133:                        && (now-phub[i]->last)/60>phub[i]->freq)
                    134:                || (phub[i]->time
                    135:                        && (gm->tm_hour*60)+gm->tm_min>=phub[i]->time
                    136:                && (gm->tm_mday!=date.da_day || gm->tm_mon!=date.da_mon-1)))
                    137:                && phub[i]->days&(1<<gm->tm_wday)) {
                    138:                offhook();
                    139:                lputc(FF);
                    140: 
                    141:                phub[i]->last=time(NULL);
                    142:                sprintf(str,"%sPNET.DAB",ctrl_dir);
                    143:                if((file=nopen(str,O_WRONLY))==-1) {
                    144:                        errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
                    145:                        bail(1); }
                    146:                lseek(file,sizeof(time_t)*i,SEEK_SET);
                    147:                write(file,&phub[i]->last,sizeof(time_t));
                    148:                close(file);
                    149: 
                    150:                if(phub[i]->call[0]) {
                    151:                        getnodedat(node_num,&thisnode,1);
                    152:                        thisnode.status=NODE_NETTING;
                    153:                        putnodedat(node_num,thisnode);
                    154:                        lputc(FF);
                    155:                        external(cmdstr(phub[i]->call,nulstr,nulstr,NULL),EX_SWAP);
                    156:                        ret=0; } } }
                    157: 
                    158: for(i=0;i<total_events;i++) {
                    159:        if(!event[i]->node || event[i]->node>sys_nodes)
                    160:         continue;
                    161:        gm=localtime(&now);
                    162:        unixtodos(event[i]->last,&date,&curtime);
                    163:        if(event[i]->last==-1
                    164:                || ((gm->tm_hour*60)+gm->tm_min>=event[i]->time
                    165:                && (gm->tm_mday!=date.da_day || gm->tm_mon!=date.da_mon-1)
                    166:                && event[i]->days&(1<<gm->tm_wday))) {
                    167: 
                    168:                if(event[i]->misc&EVENT_EXCL) { /* exclusive event */
                    169:                        offhook();
                    170:                        lputc(FF);
                    171:                        if(event[i]->node!=node_num) {
                    172:                                lprintf("Waiting for node %d to run timed event.\r\n\r\n"
                    173:                                        ,event[i]->node);
                    174:                                lputs("Hit any key to abort wait...");
                    175:                                getnodedat(node_num,&thisnode,1);
                    176:                                thisnode.status=NODE_EVENT_LIMBO;
                    177:                                thisnode.aux=event[i]->node;
                    178:                                putnodedat(node_num,thisnode);
                    179:                                lastnodechk=0;   /* really last event time check */
                    180:                                while(!lkbrd(0)) {
                    181:                                        mswait(1);
                    182:                                        now=time(NULL);
                    183:                                        if(now-lastnodechk<10)
                    184:                                                continue;
                    185:                                        getnodedat(node_num,&thisnode,0);
                    186:                                        if(thisnode.misc&NODE_DOWN)
                    187:                                                return(0);
                    188:                                        lastnodechk=now;
                    189:                                        sprintf(str,"%sTIME.DAB",ctrl_dir);
                    190:                                        if((file=nopen(str,O_RDONLY))==-1) {
                    191:                                                errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    192:                                                event[i]->last=now;
                    193:                                                return(0); }
                    194:                                        lseek(file,(long)i*4L,SEEK_SET);
                    195:                                        read(file,&event[i]->last,sizeof(time_t));
                    196:                                        close(file);
                    197:                                        if(now-event[i]->last<(60*60))  /* event is done */
                    198:                                                break; }
                    199:                                sprintf(str,"%s%s.NOW",data_dir,event[i]->code);
                    200:                                remove(str);
                    201:                                event[i]->last=now;
                    202:                                ret=0; }
                    203:                        else {
                    204:                                lputs("Waiting for all nodes to become inactive before "
                    205:                                        "running timed event.\r\n\r\n");
                    206:                                lputs("Hit any key to abort wait and run event now...\r\n\r\n");
                    207:                                getnodedat(node_num,&thisnode,1);
                    208:                                thisnode.status=NODE_EVENT_WAITING;
                    209:                                putnodedat(node_num,thisnode);
                    210:                                lastnodechk=0;
                    211:                                while(!lkbrd(0)) {
                    212:                                        mswait(1);
                    213:                                        now=time(NULL);
                    214:                                        if(now-lastnodechk<10)
                    215:                                                continue;
                    216:                                        lastnodechk=now;
                    217:                                        getnodedat(node_num,&thisnode,0);
                    218:                                        if(thisnode.misc&NODE_DOWN)
                    219:                         return(0);
                    220:                                        for(j=1;j<=sys_nodes;j++) {
                    221:                                                if(j==node_num)
                    222:                                                        continue;
                    223:                                                getnodedat(j,&node,0);
                    224:                                                if(node.status==NODE_EVENT_WAITING)  /* two nodes */
                    225:                                                        break;                                                   /* waiting ?!?! */
                    226:                                                if(node.status!=NODE_OFFLINE
                    227:                                                        && node.status!=NODE_EVENT_LIMBO)
                    228:                                                        break; }
                    229:                                        if(j>sys_nodes) /* all nodes either offline or in limbo */
                    230:                                                break;
                    231:                                        lprintf("\rWaiting for node %d (status=%d)"
                    232:                                                ,j,node.status);
                    233:                                        lputc(CLREOL); } } }
                    234:                if(event[i]->node!=node_num)
                    235:                        event[i]->last=now;
                    236:                else {
                    237:                        sprintf(str,"%s%s.NOW",data_dir,event[i]->code);
                    238:                        remove(str);
                    239:                        offhook();
                    240:                        lputc(FF);
                    241:                        getnodedat(node_num,&thisnode,1);
                    242:                        thisnode.status=NODE_EVENT_RUNNING;
                    243:                        putnodedat(node_num,thisnode);
                    244:                        if(event[i]->dir[0]) {
                    245:                                if(event[i]->dir[1]==':')           /* drive letter specified */
                    246:                                        setdisk(toupper(event[i]->dir[0])-'A');
                    247:                                if(chdir(event[i]->dir))
                    248:                                        errormsg(WHERE,ERR_CHDIR,event[i]->dir,0); }
                    249: 
                    250:                        external(cmdstr(event[i]->cmd,nulstr,nulstr,NULL),0);  /* EX_CC */
                    251:                        event[i]->last=time(NULL);
                    252:                        sprintf(str,"%sTIME.DAB",ctrl_dir);
                    253:                        if((file=nopen(str,O_WRONLY))==-1) {
                    254:                                errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
                    255:                                return(ret); }
                    256:                        lseek(file,(long)i*4L,SEEK_SET);
                    257:                        write(file,&event[i]->last,sizeof(time_t));
                    258:                        close(file);
                    259:                        ret=0; } } }
                    260: 
                    261: 
                    262: if(sys_status&SS_DAILY || thisnode.misc&NODE_EVENT) {  /* daily events */
                    263: 
                    264:        offhook();
                    265:     lputc(FF);
                    266: 
                    267:        if(sys_status&SS_DAILY) {
                    268: 
                    269:                getnodedat(node_num,&thisnode,1);
                    270:                now=time(NULL);
                    271:                j=lastuser();
                    272:                thisnode.status=NODE_EVENT_RUNNING;
                    273:                putnodedat(node_num,thisnode);
                    274: 
                    275:                lprintf("Running system daily maintenance...\r\n\r\n");
                    276:                logentry("!:","Ran system daily maintenance");
                    277:                for(i=1;i<=j;i++) {
                    278: 
                    279:                        lprintf("\rChecking user %5u of %-5u",i,j);
                    280:                        user.number=i;
                    281:                        getuserdat(&user);
                    282: 
                    283:                        /***********************************************/
                    284:                        /* Fix name (NAME.DAT and USER.DAT) mismatches */
                    285:                        /***********************************************/
                    286:                        if(user.misc&DELETED) {
                    287:                                if(strcmp(username(i,str2),"DELETED USER"))
                    288:                                        putusername(i,nulstr);
                    289:                                continue; }
                    290: 
                    291:                        if(strcmp(user.alias,username(i,str2)))
                    292:                                putusername(i,user.alias);
                    293: 
                    294:                        if(!(user.misc&(DELETED|INACTIVE))
                    295:                                && user.expire && (ulong)user.expire<=(ulong)now) {
                    296:                                putsmsg(i,text[AccountHasExpired]);
                    297:                                sprintf(str,"%s #%u Expired",user.alias,user.number);
                    298:                                logentry("!%",str);
                    299:                                if(level_misc[user.level]&LEVEL_EXPTOVAL
                    300:                                        && level_expireto[user.level]<10) {
                    301:                                        user.flags1=val_flags1[level_expireto[user.level]];
                    302:                                        user.flags2=val_flags2[level_expireto[user.level]];
                    303:                                        user.flags3=val_flags3[level_expireto[user.level]];
                    304:                                        user.flags4=val_flags4[level_expireto[user.level]];
                    305:                                        user.exempt=val_exempt[level_expireto[user.level]];
                    306:                                        user.rest=val_rest[level_expireto[user.level]];
                    307:                                        if(val_expire[level_expireto[user.level]])
                    308:                                                user.expire=now
                    309:                                                        +(val_expire[level_expireto[user.level]]*24*60*60);
                    310:                                        else
                    311:                                                user.expire=0;
                    312:                                        user.level=val_level[level_expireto[user.level]]; }
                    313:                                else {
                    314:                                        if(level_misc[user.level]&LEVEL_EXPTOLVL)
                    315:                                                user.level=level_expireto[user.level];
                    316:                                        else
                    317:                                                user.level=expired_level;
                    318:                                        user.flags1&=~expired_flags1; /* expired status */
                    319:                                        user.flags2&=~expired_flags2; /* expired status */
                    320:                                        user.flags3&=~expired_flags3; /* expired status */
                    321:                                        user.flags4&=~expired_flags4; /* expired status */
                    322:                                        user.exempt&=~expired_exempt;
                    323:                                        user.rest|=expired_rest;
                    324:                                        user.expire=0; }
                    325:                                putuserrec(i,U_LEVEL,2,itoa(user.level,str,10));
                    326:                                putuserrec(i,U_FLAGS1,8,ultoa(user.flags1,str,16));
                    327:                                putuserrec(i,U_FLAGS2,8,ultoa(user.flags2,str,16));
                    328:                                putuserrec(i,U_FLAGS3,8,ultoa(user.flags3,str,16));
                    329:                                putuserrec(i,U_FLAGS4,8,ultoa(user.flags4,str,16));
                    330:                                putuserrec(i,U_EXPIRE,8,ultoa(user.expire,str,16));
                    331:                                putuserrec(i,U_EXEMPT,8,ultoa(user.exempt,str,16));
                    332:                                putuserrec(i,U_REST,8,ultoa(user.rest,str,16));
                    333:                                if(expire_mod[0]) {
                    334:                                        useron=user;
                    335:                                        online=ON_LOCAL;
                    336:                                        exec_bin(expire_mod,&main_csi);
                    337:                                        online=0; }
                    338:                                }
                    339: 
                    340:                        /***********************************************************/
                    341:                        /* Auto deletion based on expiration date or days inactive */
                    342:                        /***********************************************************/
                    343:                        if(!(user.exempt&FLAG('P'))     /* Not a permanent account */
                    344:                                && !(user.misc&(DELETED|INACTIVE))       /* alive */
                    345:                                && (sys_autodel && (now-user.laston)/(long)(24L*60L*60L)
                    346:                                > sys_autodel)) {                       /* Inactive too long */
                    347:                                sprintf(str,"Auto-Deleted %s #%u",user.alias,user.number);
                    348:                                logentry("!*",str);
                    349:                                delallmail(i);
                    350:                                putusername(i,nulstr);
                    351:                                putuserrec(i,U_MISC,8,ultoa(user.misc|DELETED,str,16)); }
                    352: 
                    353:                        if(!(user.misc&(DELETED|INACTIVE))
                    354:                                && preqwk_ar[0] && chk_ar(preqwk_ar,user)) {  /* Pre-QWK */
                    355:                                for(k=1;k<=sys_nodes;k++) {
                    356:                                        getnodedat(k,&node,0);
                    357:                                        if((node.status==NODE_INUSE || node.status==NODE_QUIET
                    358:                                                || node.status==NODE_LOGON) && node.useron==i)
                    359:                                                break; }
                    360:                                if(k<=sys_nodes)        /* Don't pre-pack with user online */
                    361:                                        continue;
                    362:                                lclini(node_scrnlen-1);
                    363:                                lclatr(LIGHTGRAY);
                    364:                 lputc(FF);
                    365:                                console|=CON_L_ECHO;
                    366:                                lprintf("Pre-packing QWK for %s...\r\n"
                    367:                                        ,user.alias);
                    368:                                useron=user;
                    369:                                online=ON_LOCAL;
                    370:                                statline=sys_def_stat;
                    371:                                statusline();
                    372:                                useron.qwk&=~QWK_FILES; /* turn off for pre-packing */
                    373:                                useron.misc|=(ANSI|COLOR);
                    374:                                delfiles(temp_dir,"*.*");
                    375:                                getmsgptrs();
                    376:                                getusrsubs();
                    377:                                batdn_total=0;
                    378:                                sprintf(str,"%sFILE\\%04u.QWK"
                    379:                                        ,data_dir,useron.number);
                    380:                                if(pack_qwk(str,&l,1)) {
                    381:                                        qwk_success(l,0,1);
                    382:                                        putmsgptrs(); }
                    383:                                delfiles(temp_dir,"*.*");
                    384:                                lclatr(LIGHTGRAY);
                    385:                                lclini(node_scrnlen);
                    386:                                online=0;
                    387:                                lputc(FF); } }
                    388: 
                    389:                mail_maint();
                    390: 
                    391:                lprintf("\r\n\r\nRunning system daily event...\r\n");
                    392:                logentry("!:","Ran system daily event");
                    393:                sys_status&=~SS_DAILY;
                    394:                if(sys_daily[0])
                    395:                        external(cmdstr(sys_daily,nulstr,nulstr,NULL),0); }    /* EX_CC */
                    396: 
                    397:        if(thisnode.misc&NODE_EVENT) {
                    398:                getnodedat(node_num,&thisnode,1);
                    399:         thisnode.status=NODE_EVENT_RUNNING;
                    400:         putnodedat(node_num,thisnode);
                    401:                if(node_daily[0])
                    402:                        external(cmdstr(node_daily,nulstr,nulstr,NULL),0); /* EX_CC */
                    403:                getnodedat(node_num,&thisnode,1);
                    404:                thisnode.misc&=~NODE_EVENT;
                    405:                putnodedat(node_num,thisnode); }
                    406:        ret=0; }
                    407: return(ret);
                    408: }
                    409: 
                    410: /****************************************************************************/
                    411: /* This function waits for either a caller or a local logon. It returns 0   */
                    412: /* if the user failed the logon procedure, a 1 if the user succeeded        */
                    413: /* Called from function main                                                */
                    414: /****************************************************************************/
                    415: char waitforcall()
                    416: {
                    417:        static uint calls;
                    418:        uchar str[256],str2[256],cname[LEN_CID+1],c,gotcaller=0,x,y,dcd,*p
                    419:                ,ans=0,hbeat=0,menuon=0,blank=0
                    420:                ,*ok=mdm_misc&MDM_VERBAL ? "OK":"0"
                    421: 
                    422:        /* IP logging vars added by enigma */
                    423:                , ipstr[256], *ips;
                    424: 
                    425:        uint i,j,k,nodes,lastnodes=0;
                    426:        long l,m;
                    427:        int file,result_code=0;
                    428:        time_t start,lastnodechk=0,laststatchk=0,laststatfdate=0;
                    429:     node_t node;
                    430:     struct tm *gm;
                    431:        struct dfree d;
                    432:        stats_t stats,node_stats;
                    433: 
                    434: reset_logon_vars();
                    435: ipstr[0]=cid[0]=cname[0]=0;
                    436: online=console=0;
                    437: start=time(NULL);
                    438: 
                    439: getnodedat(node_num,&thisnode,1);
                    440: thisnode.status=NODE_WFC;
                    441: thisnode.misc&=~(NODE_INTR|NODE_MSGW|NODE_NMSG|NODE_UDAT|NODE_POFF|NODE_AOFF);
                    442: putnodedat(node_num,thisnode);
                    443: catsyslog(0);
                    444: if(term_ret)
                    445:     return(terminal());
                    446: /***
                    447: if(com_port)
                    448:     rioctl(0x10f);  /* for blanking debug line */
                    449: ***/
                    450: 
                    451: if(qoc && calls) {
                    452:     if(qoc==1)
                    453:         offhook();
                    454:     lclini(node_scrnlen);
                    455:     lputc(FF);
                    456:     bail(0); }
                    457: useron.misc=0;
                    458: rows=24;
                    459: lputc(FF);
                    460: if(node_misc&NM_RESETVID) {
                    461:        textmode(C40);
                    462:        textmode(C80);
                    463:        _setcursortype(_NORMALCURSOR); }
                    464: 
                    465: lclatr(curatr=LIGHTGRAY);
                    466: lclini(node_scrnlen);
                    467: 
                    468: 
                    469: lputc(FF);
                    470: if(com_port && !connect_rate) {  /* Initialize the modem */
                    471:        lprintf("\rSetting DTE rate: %lu baud",com_rate);
                    472:        lputc(CLREOL);
                    473: #ifdef __OS2__
                    474:        if((i=setbaud(com_rate))!=0) {
                    475: #else
                    476:        if((i=setbaud((uint)(com_rate&0xffffL)))!=0) {
                    477: #endif
                    478:                lprintf(" - Failed! (%d)\r\n",i);
                    479:                bail(1); }
                    480:     c=0;
                    481:        if(!nmi && !(mdm_misc&MDM_DUMB))        /* if not dumb */
                    482:     while(c<4) {
                    483:         rioctl(IOFB);
                    484:         rioctl(IOCM|PAUSE|ABORT);
                    485:         rioctl(IOCS|PAUSE|ABORT);
                    486: 
                    487:                if(mdm_misc&MDM_CTS)
                    488:             if(!(rioctl(IOSTATE)&CTS)) {
                    489:                                lputs("\rWaiting up to 30 seconds for CTS to raise (  )\b\b\b");
                    490:                                for(i=0;i<30 && !lkbrd(0);i++) {   /* wait upto 15 seconds */
                    491:                                        lprintf("%2d\b\b",i+1);
                    492:                                        mswait(1000);
                    493:                                        if(rioctl(IOSTATE)&CTS)
                    494:                                                break; }
                    495:                                if(i==30) {
                    496:                                        lputs("\r\n\r\nModem configured for hardware flow "
                    497:                                                "control and CTS is stuck low.\r\n");
                    498:                                        logline("@!","CTS stuck low. Can't initialize.");
                    499:                                        bail(1); } }
                    500: 
                    501:                lputs("\rInitializing modem...");
                    502:                lputc(CLREOL);
                    503: 
                    504:                dtr(5);                 /* in case we're still connected to somebody */
                    505:         dtr(1);
                    506:                mswait(750);    /* DTR is sometimes slow */
                    507:         rioctl(IOFB);   /* crap comes in when dtr is raised ? */
                    508:                if(rioctl(IOSTATE)&DCD && mdm_hang[0]) {
                    509:                        mdmcmd(mdm_hang);
                    510:                        if(strcmp(str,"0") && strcmp(str,"OK"))
                    511:                                getmdmstr(str,SEC_OK); }
                    512: 
                    513:                /******************************************/
                    514:                /* Take phone off-hook while initializing */
                    515:                /******************************************/
                    516:                offhook();              
                    517:                getmdmstr(str,SEC_OK);
                    518:         if(strcmp(str,"0") && strcmp(str,"OK"))
                    519:                        getmdmstr(str,SEC_OK);
                    520: 
                    521:                /*********************************************************/
                    522:                /* Send User Configured (broken?) initialization strings */
                    523:                /*********************************************************/
                    524:         mdmcmd(mdm_init);
                    525:         if(mdm_spec[0]) {
                    526:                        getmdmstr(str,SEC_OK);
                    527:                        if(strcmp(str,"0") && strcmp(str,"OK"))
                    528:                                getmdmstr(str,SEC_OK);
                    529:             mdmcmd(mdm_spec); }
                    530:                getmdmstr(str,SEC_OK);
                    531:                if(strcmp(str,"0") && strcmp(str,"OK"))
                    532:                        getmdmstr(str,SEC_OK);
                    533: 
                    534:                /*****************************/
                    535:                /* Send AT&C1 if DCD is high */
                    536:                /*****************************/
                    537:         if(rioctl(IOSTATE)&DCD) {
                    538:                        lputs("\r\nDCD is high. Sending AT&C1 to modem...");
                    539:                        mdmcmd("AT&C1");
                    540:                        getmdmstr(str,SEC_OK);
                    541:                        if(strcmp(str,ok))
                    542:                                getmdmstr(str,SEC_OK); }
                    543: 
                    544:                /**********************************************/
                    545:                /* DCD still high? Pause and try dropping DTR */
                    546:                /**********************************************/
                    547:         if(rioctl(IOSTATE)&DCD) {
                    548:                        lputs("\r\nDCD is high. Pausing...");
                    549:                        dtr(0);
                    550:                        mswait(2000);
                    551:                        rioctl(MSR);
                    552:                        if(rioctl(IOSTATE)&DCD) {
                    553:                                lputs("\rDCD was high after modem init.\r\n");
                    554:                                logentry("@!","DCD was high after modem init");
                    555:                                if(mdm_misc&MDM_NODTR)
                    556:                                        mdmcmd(mdm_hang);
                    557:                                else
                    558:                                        dtr(15);
                    559:                                if(rioctl(IOSTATE)&DCD) {
                    560:                                        lputs("Hanging up failed to lower DCD.\r\n");
                    561:                                        logentry("@!","Hanging up failed to lower DCD");
                    562:                                        if(++c==4)
                    563:                                                break;
                    564:                                        continue; } }
                    565:                        dtr(1); }
                    566: 
                    567:                /************************************************************/
                    568:                /* Let's repair any damage the user configured init strings */
                    569:                /* may have caused                                                                                      */
                    570:                /************************************************************/
                    571:                for(i=0;i<4;i++) {
                    572:                        rioctl(IOFB);
                    573:                        mdmcmd("AT");
                    574:                        if(!getmdmstr(str,SEC_OK) || !strcmp(str,ok))
                    575:                                break;
                    576:                        if(!strcmp(str,"AT")) {     /* Echoing commands? */
                    577:                                getmdmstr(str,SEC_OK);  /* Get OK */
                    578:                                lputs("\r\nCommand echoed. Sending ATE0 to modem...");
                    579:                                mdmcmd("ATE0"); }
                    580:                        else if(mdm_misc&MDM_VERBAL && !strcmp(str,"0")) { /* numeric? */
                    581:                                lputs("\r\nNumeric response. Sending ATV1 to modem...");
                    582:                                mdmcmd("ATV1"); }
                    583:                        else if(!(mdm_misc&MDM_VERBAL) && !strcmp(str,"OK")) {
                    584:                                lputs("\r\nVerbal response. Sending ATV0 to modem...");
                    585:                                mdmcmd("ATV0"); }
                    586:                        else {
                    587:                                lprintf("\r\nUnrecognized response '%s'. Sending AT to modem..."
                    588:                                        ,str);
                    589:                                mdmcmd("AT"); }
                    590:                        if(getmdmstr(str,SEC_OK) && !strcmp(str,ok))
                    591:                                break; }
                    592: 
                    593:                /************************************************/
                    594:                /* Put phone back on-hook and check result code */
                    595:                /************************************************/
                    596:                if(!mdm_hang[0])
                    597:                        mdmcmd("ATH");
                    598:                else
                    599:                        mdmcmd(mdm_hang); 
                    600:                if(!getmdmstr(str,SEC_OK)) {
                    601:                        lputs("\r\nNo response.\r\n");
                    602:                        logentry("@!","No response"); }
                    603:         else {
                    604:                        if(!strcmp(str,ok))
                    605:                 break;
                    606:                        lprintf("\r\nInvalid result code: '%s' "
                    607:                                "instead of '%s'.\r\n",str,ok);
                    608:                        sprintf(tmp,"Invalid result code: '%s' instead of '%s'.",str,ok);
                    609:             logentry("@!",tmp); }
                    610:         if(++c==4)
                    611:             break;
                    612:         rioini(0,0);                /* remove com routines */
                    613:         sys_status&=~SS_COMISR;
                    614:                comini();
                    615:                setrate(); }
                    616:     if(c==4) {
                    617:                lputs("\r\nModem failed initialization.\r\n");
                    618:                errorlog("Modem failed initialization.");
                    619:                offhook();
                    620:         bail(1); }
                    621:        lputc(FF); }
                    622: 
                    623: else if(com_port && connect_rate) {
                    624:     gotcaller=1;
                    625:        console=CON_R_ECHO|CON_L_ECHO|CON_R_INPUT|CON_L_INPUT;
                    626:        online=ON_REMOTE;
                    627:        sprintf(connection,"%lu",connect_rate);
                    628:        cur_rate=connect_rate;
                    629:        cur_cps=connect_rate/10;
                    630:        connect_rate=0;
                    631:        if(cidarg[0]) {                                         /* Caller-id passed as argument */
                    632:                mdm_misc|=MDM_CALLERID;
                    633:                p=strstr(cidarg,"NUMBER:");
                    634:                if(p) p+=8;
                    635:                else {
                    636:                        p=strstr(cidarg,"NMBR");
                    637:                        if(p) p+=7; }
                    638:                if(p) {                                                    /* 3 message format */
                    639:                        sprintf(cid,"%.*s",LEN_CID,p);
                    640:                        for(i=strlen(cid);!isdigit(cid[i]) && i;i--)
                    641:                                ;
                    642:                        cid[i+1]=0;                                     /* chop off non-numbers */
                    643:                        p=strstr(cidarg,"NAME:");
                    644:                        if(p) p+=6;
                    645:                        else {
                    646:                                p=strstr(cidarg,"NAME");
                    647:                                if(p) p+=7; }
                    648:                        if(p)
                    649:                                sprintf(cname,"%.*s",LEN_CID,p); }
                    650:                else if(strlen(cidarg)>12)                 /* Single message format */
                    651:                        sprintf(cid,"%.*s",LEN_CID,cidarg+12);
                    652:                else
                    653:                        sprintf(cid,"ERROR: '%s'",cidarg); } }
                    654: 
                    655: 
                    656: if(!online) {
                    657:        /*******************************************************/
                    658:     /* To make sure that BBS print routines work correctly */
                    659:     /*******************************************************/
                    660:     useron.number=1;
                    661:     getuserdat(&useron);
                    662:     if(!useron.number)
                    663:         useron.misc=ANSI|COLOR; }
                    664: 
                    665: useron.misc&=~UPAUSE;  /* make sure pause is off */
                    666: 
                    667: if(llo) {
                    668:        quicklogonstuff();
                    669:        sys_status&=~SS_USERON;
                    670:        gotcaller=1; }
                    671: 
                    672: if(!(useron.misc&EXPERT) && !gotcaller) {      /* Novice sysop */
                    673:        console=CON_L_ECHO;
                    674:        online=ON_LOCAL;
                    675:        lputc(FF);
                    676:        tos=1;
                    677:        lncntr=0;
                    678:        menu("WFC");
                    679:        menuon=1;
                    680:        online=0; }
                    681: 
                    682: while(!gotcaller) {
                    683:        mswait(0);                 /* give up rest of time slice */
                    684: 
                    685:        console=CON_L_ECHO;
                    686:     now=time(NULL);
                    687: 
                    688:        if(node_scrnblank && (now-start)/60>node_scrnblank
                    689:                && !blank) { /* blank screen */
                    690:                lputc(FF);
                    691:                menuon=0;
                    692:                blank=1; }
                    693:        if(mdm_reinit && (now-start)/60>mdm_reinit) /* reinitialize modem */
                    694:                return(0);
                    695:        if(now-lastnodechk>node_sem_check) {  /* check node.dab every x seconds */
                    696: 
                    697: #if 1
                    698:                if((i=heapcheck())!=_HEAPOK) {
                    699:                        lputc(FF);
                    700:                        offhook();
                    701:                        errormsg(WHERE,ERR_CHK,"heap",i);
                    702:                        bail(1); }
                    703: #endif
                    704: 
                    705:                for(i=0;i<total_qhubs;i++)
                    706:                        if(node_num==qhub[i]->node) {
                    707:                                sprintf(str,"%sQNET\\%s.NOW",data_dir,qhub[i]->id);
                    708:                                if(fexist(str))
                    709:                                        qhub[i]->last=-1; }
                    710: 
                    711:                for(i=0;i<total_events;i++)
                    712:                        if(node_num==event[i]->node || event[i]->misc&EVENT_EXCL) {
                    713:                                sprintf(str,"%s%s.NOW",data_dir,event[i]->code);
                    714:                                if(fexist(str))
                    715:                                        event[i]->last=-1; }
                    716: 
                    717:         lastnodechk=now;
                    718:         getnodedat(node_num,&thisnode,0);
                    719:         if(thisnode.misc&NODE_DOWN) {
                    720:             lputc(FF);
                    721:             offhook();
                    722:             bail(0); }
                    723:         if(thisnode.status!=NODE_WFC) {
                    724:             getnodedat(node_num,&thisnode,1);
                    725:             thisnode.status=NODE_WFC;
                    726:             putnodedat(node_num,thisnode); }
                    727:         if(thisnode.misc&NODE_RRUN) {   /* Re-run the node */
                    728:             offhook();
                    729:             lputc(FF);
                    730:             getnodedat(node_num,&thisnode,1);
                    731:             thisnode.status=NODE_OFFLINE;
                    732:             thisnode.misc=0;
                    733:             putnodedat(node_num,thisnode);
                    734:             close(nodefile);
                    735:                        close(node_ext);
                    736:                        sys_status&=~SS_NODEDAB;
                    737:             if(sys_status&SS_LOGOPEN)
                    738:                 close(logfile);
                    739:             if(sys_status&SS_COMISR)
                    740:                 rioini(0,0);
                    741:             sys_status&=~(SS_COMISR|SS_INITIAL|SS_LOGOPEN);
                    742:             p=strchr(orgcmd,' ');
                    743:             if(p)
                    744:                 p++;
                    745:                        close(5);
                    746:                        if(execle(orgcmd,orgcmd,p,NULL,envp)) {
                    747:                                lprintf("\r\nCouldn't execute %s!\r\n",orgcmd);
                    748:                 bail(1); } } }
                    749: 
                    750:        if(!wfc_events(lastnodechk))
                    751:                return(0);
                    752: 
                    753:        if(!menuon) {
                    754:                /******************/
                    755:                /* Roaming cursor */
                    756:                /******************/
                    757:                x=lclwx();
                    758:                y=lclwy();
                    759:                switch(random(5)) {
                    760:                        case 0:
                    761:                                if(x>1)
                    762:                                        x--;
                    763:                                break;
                    764:                        case 1:
                    765:                                if(x<79)
                    766:                                        x++;
                    767:                                break;
                    768:                        case 2:
                    769:                                if(y>1)
                    770:                                        y--;
                    771:                                break;
                    772:                        case 4:
                    773:                                if(y<node_scrnlen-2)
                    774:                                        y++;
                    775:                                break; } }
                    776:        else {                                          /* across the bottom */
                    777:                y=25;
                    778:                x=lclwx();
                    779:                if(x%2) x+=2;
                    780:                else x-=2;
                    781:                if(x<1)
                    782:                        x=1;
                    783:                else if(x>80)
                    784:                        x=80;
                    785: /*
                    786:                lclxy(x,y);
                    787:                gettext(x,y,x,y,&i);
                    788:                lclatr(random(0xf)+1);
                    789:                lputc(i);
                    790:                lclatr(LIGHTGRAY);
                    791: */
                    792: /**
                    793:                mswait(100);
                    794:                puttext(x,y,x,y,&i);
                    795: **/       }
                    796: 
                    797: #ifndef __FLAT__               // Heart beat always for 32-bit OSs
                    798:        if(inDV) {
                    799: #endif
                    800:                lclxy(80,1);
                    801:                if(hbeat) {
                    802:                        lclatr(RED|HIGH);
                    803:                        lputc(3); }
                    804:                else
                    805:                        lputc(0);
                    806:                hbeat=!hbeat;
                    807:                lclatr(LIGHTGRAY);
                    808: #ifndef __FLAT__
                    809:                }
                    810: #endif
                    811: 
                    812:        lclxy(x,y);
                    813:        mswait(100);
                    814: 
                    815:                                                                /* Wait for call screen */
                    816:                                                                /* check every 10 seconds */
                    817: 
                    818:        if(node_misc&NM_WFCSCRN && now-laststatchk>node_stat_check
                    819:                && !menuon && !blank) {
                    820:                laststatchk=now;
                    821:                sprintf(str,"%sDSTS.DAB",ctrl_dir);
                    822:                if(fdate(str)!=laststatfdate) {   /* system statistics */
                    823:                        lclxy(1,1);
                    824:                        lclatr(LIGHTGRAY);
                    825:                        lputs("Retrieving Statistics.");
                    826:                        lputc(CLREOL);
                    827:                        if(!laststatfdate)      /* First time this WFC */
                    828:                                getstats(node_num,&node_stats);
                    829:                        lputc('.');
                    830:                        laststatfdate=fdate(str);
                    831:                        getstats(0,&stats);
                    832:                        lputc('.');
                    833:                        l=m=0;
                    834:                        if(node_misc&NM_WFCMSGS) {
                    835:                                for(i=0;i<total_subs;i++)
                    836:                                        l+=getposts(i);                         /* l=total posts */
                    837:                                lputc('.');
                    838:                                for(i=0;i<total_dirs;i++)
                    839:                                        m+=getfiles(i);                         /* m=total files */
                    840:                                lputc('.'); }
                    841:                        i=getmail(0,0);                                 /* i=total email */
                    842:                        lputc('.');
                    843:                        j=getmail(1,0);                                 /* j=total fback */
                    844:                        lclxy(1,1);
                    845:                        lclatr(GREEN);
                    846:                        lprintf("Node #: ");
                    847:                        lclatr(GREEN|HIGH);
                    848:                        gm=localtime(&now);
                    849:                        lprintf("%-3u ",node_num);
                    850:                        lclatr(GREEN);
                    851:                        lprintf("%-3.3s %-2u  Space: ",mon[gm->tm_mon],gm->tm_mday);
                    852:                        if(temp_dir[1]==':')
                    853:                                k=temp_dir[0]-'A'+1;
                    854:                        else k=0;
                    855:                        getdfree(k,&d);
                    856:                        if((ulong)d.df_bsec*(ulong)d.df_sclus
                    857:                                *(ulong)d.df_avail<((ulong)min_dspace*1024L)*2L)
                    858:                                lclatr(RED|HIGH|BLINK);
                    859:                        else
                    860:                                lclatr(GREEN|HIGH);
                    861:                        sprintf(str,"%sk",ultoac(((ulong)d.df_bsec
                    862:                                *(ulong)d.df_sclus*(ulong)d.df_avail)/1024UL,tmp));
                    863:                        lprintf("%-12.12s",str);
                    864:                        if(lastuseron[0]) {
                    865:                                lclatr(GREEN);
                    866:                                lprintf("Laston: ");
                    867:                                lclatr(GREEN|HIGH);
                    868:                                lprintf(lastuseron);
                    869:                                lclatr(GREEN);
                    870:                                if(thisnode.connection)
                    871:                                        lprintf(" %u",thisnode.connection);
                    872:                                else
                    873:                                        lprintf(" Local"); }
                    874:                        lprintf("\r\n");
                    875:                        lclatr(GREEN);
                    876:                        lprintf("Logons: ");
                    877:                        lclatr(GREEN|HIGH);
                    878:                        sprintf(tmp,"%lu/%lu",node_stats.ltoday,stats.ltoday);
                    879:                        lprintf("%-12.12s",tmp);
                    880:                        lclatr(GREEN);
                    881:                        lprintf("Total: ");
                    882:                        lclatr(GREEN|HIGH);
                    883:                        lprintf("%-12.12s",ultoac(stats.logons,tmp));
                    884:                        lclatr(GREEN);
                    885:                        lprintf("Timeon: ");
                    886:                        lclatr(GREEN|HIGH);
                    887:                        sprintf(tmp,"%lu/%lu",node_stats.ttoday,stats.ttoday);
                    888:                        lprintf("%-12.12s",tmp);
                    889:                        lclatr(GREEN);
                    890:                        lprintf("Total: ");
                    891:                        lclatr(GREEN|HIGH);
                    892:                        lprintf("%-12.12s\r\n",ultoac(stats.timeon,tmp));
                    893:                        lclatr(GREEN);
                    894:                        lprintf("Emails: ");
                    895:                        lclatr(GREEN|HIGH);
                    896:                        sprintf(str,"%u/%u",(uint)stats.etoday,i);
                    897:                        lprintf("%-12.12s",str);
                    898:                        lclatr(GREEN);
                    899:                        lprintf("Posts: ");
                    900:                        lclatr(GREEN|HIGH);
                    901:                        sprintf(str,"%u",(uint)stats.ptoday);
                    902:                        if(node_misc&NM_WFCMSGS) {
                    903:                                strcat(str,"/");
                    904:                                strcat(str,ultoa(l,tmp,10)); }
                    905:                        lprintf("%-12.12s",str);
                    906:                        lclatr(GREEN);
                    907:                        lprintf("Fbacks: ");
                    908:                        lclatr(GREEN|HIGH);
                    909:                        sprintf(str,"%u/%u",(uint)stats.ftoday,j);
                    910:                        lprintf("%-12.12s",str);
                    911:                        lclatr(GREEN);
                    912:                        lprintf("Users: ");
                    913:                        lclatr(GREEN|HIGH);
                    914:                        sprintf(str,"%u/%u",stats.nusers,lastuser());
                    915:                        lprintf("%-12.12s\r\n",str);
                    916:                        lclatr(GREEN);
                    917:                        lprintf("Uloads: ");
                    918:                        lclatr(GREEN|HIGH);
                    919:                        ultoac(stats.ulb/1024UL,tmp);
                    920:                        strcat(tmp,"k");
                    921:                        lprintf("%-12.12s",tmp);
                    922:                        lclatr(GREEN);
                    923:                        lprintf("Files: ");
                    924:                        lclatr(GREEN|HIGH);
                    925:                        sprintf(str,"%u",(uint)stats.uls);
                    926:                        if(node_misc&NM_WFCMSGS) {
                    927:                                strcat(str,"/");
                    928:                                strcat(str,ultoa(m,tmp,10)); }
                    929:                        lprintf("%-12.12s",str);
                    930:                        lclatr(GREEN);
                    931:                        lprintf("Dloads: ");
                    932:                        lclatr(GREEN|HIGH);
                    933:                        ultoac(stats.dlb/1024UL,tmp);
                    934:                        strcat(tmp,"k");
                    935:                        lprintf("%-12.12s",tmp);
                    936:                        lclatr(GREEN);
                    937:                        lprintf("Files: ");
                    938:                        lclatr(GREEN|HIGH);
                    939:                        lprintf("%-12.12s\r\n",ultoac(stats.dls,tmp)); }
                    940:                lclatr(curatr=LIGHTGRAY);
                    941:                lclxy(1,6);
                    942:                nodes=0;
                    943:                for(i=1;i<=sys_nodes;i++) {
                    944:                        getnodedat(i,&node,0);
                    945:                        if((node.status!=NODE_WFC && node.status!=NODE_OFFLINE)
                    946:                                || node.errors) {
                    947:                                lputc(CLREOL);
                    948:                                printnodedat(i,node);
                    949:                                nodes++; } }
                    950:                if(nodes<lastnodes) {
                    951:                        i=j=lclwy();
                    952:                        j+=(lastnodes-nodes)+1;
                    953:                        for(;i<=node_scrnlen && i<j;i++) {
                    954:                                lclxy(1,i);
                    955:                                lputc(CLREOL); } }
                    956:                lastnodes=nodes;
                    957:                lclatr(curatr=LIGHTGRAY); }
                    958: 
                    959: 
                    960:        if(!(node_misc&NM_NO_LKBRD) && lkbrd(1)) {
                    961:                start=time(NULL);
                    962:                /* menuon=0; */
                    963:         lputc(FF);
                    964:         tos=1;
                    965:                lncntr=0;
                    966:                i=lkbrd(0);
                    967:                if(!(i&0xff) && (i>=0x3b00 && i<=0x4400)
                    968:                        || i==0x8500 || i==0x8600) {            /* F1-F12 */
                    969:                        if(i>=0x3b00 && i<=0x4400)
                    970:                                i=((i-0x3b00)>>8);
                    971:                        else if(i==0x8500)
                    972:                                i=10;
                    973:                        else
                    974:                                i=11;
                    975:                        offhook();
                    976:                        external(cmdstr(wfc_scmd[i],nulstr,nulstr,NULL),EX_SWAP);
                    977:             return(0); }
                    978: 
                    979:                if(isdigit(i&0xff)) {
                    980:                        offhook();
                    981:                        external(cmdstr(wfc_cmd[i&0xf],nulstr,nulstr,NULL),0);
                    982:                        return(0); }
                    983: 
                    984:                switch(toupper(i)) {
                    985:             case 'A':   /* forced answer */
                    986:                 ans=1;
                    987:                 break;
                    988:                        case 'C':   /* configure */
                    989:                                if(node_misc&NM_SYSPW) {
                    990:                                        quicklogonstuff();
                    991:                                        if(!chksyspass(1))
                    992:                         return(0); }
                    993:                 offhook();
                    994:                  if(sys_status&SS_LOGOPEN) {
                    995:                     close(logfile);
                    996:                     sys_status&=~SS_LOGOPEN; }
                    997:                 if(sys_status&SS_COMISR) {
                    998:                     rioini(0,0);    /* replace COM i/o vectors */
                    999:                     sys_status&=~SS_COMISR; }
                   1000:                 close(nodefile);
                   1001:                                close(node_ext);
                   1002:                                sys_status&=~SS_NODEDAB;
                   1003:                                sprintf(str,"%sEXECSBBS.%s",exec_dir,
                   1004: #ifdef __OS2__
                   1005:                                        "EXE"
                   1006: #else
                   1007:                                        "COM"
                   1008: #endif
                   1009:                                        );
                   1010:                                sprintf(tmp,"\"%s \"",cmdstr(scfg_cmd,nulstr,nulstr,NULL));
                   1011:                                if(execl(str,str,".",tmp,orgcmd,NULL,envp)) {
                   1012:                                        errormsg(WHERE,ERR_EXEC,str,0);
                   1013:                     bail(1); }
                   1014:                        case 'D':   /* Dos shell */
                   1015:                 offhook();
                   1016:                                external(comspec,0);
                   1017:                                return(0);
                   1018:                        case 'F':   /* Force Network Call-out */
                   1019:                 quicklogonstuff();
                   1020:                                lclatr(YELLOW);
                   1021:                                lputs("QWK Hub ID: ");
                   1022:                                lclatr(WHITE);
                   1023:                                if(!getstr(str,8,K_UPPER))
                   1024:                                        return(0);
                   1025:                                for(i=0;i<total_qhubs;i++)
                   1026:                                        if(!stricmp(str,qhub[i]->id)) {
                   1027:                                                if(qhub[i]->node==node_num)
                   1028:                                                        qhub[i]->last=-1;
                   1029:                                                else {
                   1030:                                                        sprintf(tmp,"%sQNET\\%s.NOW",data_dir,str);
                   1031:                                                        if((file=nopen(tmp,O_CREAT|O_TRUNC|O_WRONLY))
                   1032:                                                                !=-1)
                   1033:                                                                close(file); }
                   1034:                                                break; }
                   1035:                 return(0);
                   1036:             case 'L':   /* Log */
                   1037:                                if(node_misc&NM_SYSPW) {
                   1038:                                        quicklogonstuff();
                   1039:                                        if(!chksyspass(1))
                   1040:                         return(0); }
                   1041:                 offhook();
                   1042:                 now=time(NULL);
                   1043:                 unixtodos(now,&date,&curtime);
                   1044:                 sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG"
                   1045:                     ,data_dir,date.da_mon,date.da_day,date.da_year-1900);
                   1046:                                external(cmdstr(node_viewer,str,nulstr,NULL),0);
                   1047:                 return(0);
                   1048:             case 'M':   /* Read all mail */
                   1049:                 quicklogonstuff();
                   1050:                                if(node_misc&NM_SYSPW && !chksyspass(1))
                   1051:                     return(0);
                   1052:                                readmail(1,MAIL_ALL);
                   1053:                 online=console=0;
                   1054:                 return(0);
                   1055:             case 'N':   /* Node statistics */
                   1056:                 quicklogonstuff();
                   1057:                                if(node_misc&NM_SYSPW && !chksyspass(1))
                   1058:                     return(0);
                   1059:                                useron.misc|=UPAUSE;
                   1060:                 printstatslog(node_num);
                   1061:                 pause();
                   1062:                 return(0);
                   1063:             case 'Q':   /* Quit */
                   1064:                 offhook();
                   1065:                 bail(0);
                   1066:                        case 'R':   /* Read feedback */
                   1067:                 quicklogonstuff();
                   1068:                                if(node_misc&NM_SYSPW && !chksyspass(1))
                   1069:                     return(0);
                   1070:                                readmail(1,MAIL_YOUR);
                   1071:                 return(0);
                   1072:                        case 'K':   /* Sent mail */
                   1073:                 quicklogonstuff();
                   1074:                                if(node_misc&NM_SYSPW && !chksyspass(1))
                   1075:                     return(0);
                   1076:                                readmail(1,MAIL_SENT);
                   1077:                                return(0);
                   1078:             case 'S':   /* System Statistics */
                   1079:                 quicklogonstuff();
                   1080:                                if(node_misc&NM_SYSPW && !chksyspass(1))
                   1081:                     return(0);
                   1082:                                useron.misc|=UPAUSE;
                   1083:                 printstatslog(0);
                   1084:                 pause();
                   1085:                 return(0);
                   1086:                        case 'T':   /* Terminal mode */
                   1087:                                if(!com_port) {
                   1088:                                        lprintf("No COM port configured.");
                   1089:                                        getch();
                   1090:                     lputc(FF);
                   1091:                                        return(0); }
                   1092:                                if(node_misc&NM_SYSPW) {
                   1093:                     quicklogonstuff();
                   1094:                                        if(!chksyspass(1))
                   1095:                         return(0); }
                   1096:                 return(terminal());
                   1097:                        case 'U':   /* User edit */
                   1098:                 quicklogonstuff();
                   1099:                                useredit(0,1);
                   1100:                 return(0);
                   1101:                        case 'E':
                   1102:                        case 'W':   /* Write e-mail */
                   1103:                 quicklogonstuff();
                   1104:                                if(node_misc&NM_SYSPW && !chksyspass(1))
                   1105:                                        return(0);
                   1106:                 bputs(text[Email]);
                   1107:                                if(!getstr(str,50,0))
                   1108:                     return(0);
                   1109:                                if(!strchr(str,'@') && (i=finduser(str))!=0)
                   1110:                                        email(i,nulstr,nulstr,WM_EMAIL);
                   1111:                                else
                   1112:                                        netmail(str,nulstr,0);
                   1113:                 return(0);
                   1114:                        case 'X':   /* Exit with phone on-hook */
                   1115:                 bail(0);
                   1116:                        case 'Y':   /* Yesterday's log */
                   1117:                                if(node_misc&NM_SYSPW) {
                   1118:                                        quicklogonstuff();
                   1119:                                        if(!chksyspass(1))
                   1120:                                                return(0); }
                   1121:                 offhook();
                   1122:                 now=time(NULL);
                   1123:                 now-=(ulong)60L*24L*60L;
                   1124:                 unixtodos(now,&date,&curtime);
                   1125:                 sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG"
                   1126:                     ,data_dir,date.da_mon,date.da_day,date.da_year-1900);
                   1127:                                external(cmdstr(node_viewer,str,nulstr,NULL),0);
                   1128:                 return(0);
                   1129:                        case 'Z':
                   1130:                                mail_maint();
                   1131:                                return(0);
                   1132:                        case '?':   /* Menu */
                   1133:                                if(menuon) {
                   1134:                                        menuon=0;
                   1135:                                        lputc(FF);
                   1136:                                        laststatchk=0;
                   1137:                                        laststatfdate=0; }
                   1138:                                else {
                   1139:                                        online=ON_LOCAL;
                   1140:                                        menu("WFC");
                   1141:                                        menuon=1;
                   1142:                                        blank=0;
                   1143:                                        online=0; }
                   1144:                 continue;
                   1145:                        case SP:   /* Log on */
                   1146:                                lclatr(WHITE|HIGH); lputc('Y'); lclatr(GREEN);
                   1147:                                lputs(" Yes\r\n");
                   1148:                                lclatr(WHITE|HIGH); lputc('Z'); lclatr(GREEN);
                   1149:                                lputs(" Yes, Quiet\r\n");
                   1150:                                lclatr(WHITE|HIGH); lputc('F'); lclatr(GREEN);
                   1151:                                lputs(" Fast User #1\r\n");
                   1152:                                lclatr(WHITE|HIGH); lputc('Q'); lclatr(GREEN);
                   1153:                                lputs(" Fast User #1, Quiet\r\n");
                   1154:                                lclatr(BROWN|HIGH);
                   1155:                                lputs("\r\nLog on? [No]: ");
                   1156:                                lclatr(LIGHTGRAY);
                   1157:                                i=getch();
                   1158:                                switch(toupper(i)) {
                   1159:                     case 'Z':
                   1160:                         onquiet=1;
                   1161:                                        case 'Y':       /* Yes, logon */
                   1162:                         lputc(FF);
                   1163:                         quicklogonstuff();
                   1164:                                                sys_status&=~SS_USERON;
                   1165:                                                useron.misc=(UPAUSE|ANSI|COLOR);
                   1166:                         gotcaller=1;
                   1167:                         continue;
                   1168:                     case 'Q':
                   1169:                         onquiet=1;
                   1170:                     case 'F':
                   1171:                         lputc(FF);
                   1172:                         quicklogonstuff();
                   1173:                                                if(sys_misc&SM_REQ_PW || node_misc&NM_SYSPW) {
                   1174:                                                        useron.misc=(UPAUSE|ANSI|COLOR);
                   1175:                                                        gotcaller=1;
                   1176:                                                        continue; }
                   1177:                         if(!useron.number) {
                   1178:                             lputc(7);
                   1179:                             lputs("A Sysop account hasn't been created");
                   1180:                                                        getch();
                   1181:                             return(0); }
                   1182:                                                return(logon());
                   1183:                     default:
                   1184:                                                return(0); }
                   1185:             default:
                   1186:                 lputs("Hit '?' for a menu.");
                   1187:                 continue; } }
                   1188:        if(com_port) {
                   1189:                if(mdm_misc&MDM_VERBAL) {
                   1190:                        if(rioctl(RXBC)) {
                   1191:                                lputc(FF);
                   1192:                                getmdmstr(str,SEC_RING);
                   1193:                                if(!strcmp(str,"RING"))
                   1194:                                        ans=1; } }
                   1195:                else {  /* numeric */
                   1196:                        if(incom()=='2')
                   1197:                                ans=1; }
                   1198:                if(mdm_misc&MDM_DUMB && DCDHIGH)
                   1199:                        ans=1; }
                   1200:        if(ans) {
                   1201:         lputc(FF);
                   1202:                if(mdm_misc&MDM_CALLERID) {
                   1203:                        lputs("Obtaining Caller-ID...");
                   1204:                        getmdmstr(str,SEC_CID);
                   1205:                        lprintf("\r\nCID: %s",str);
                   1206:                        if(!strncmpi(str,"TIME:",5)) {  /* 3 message format */
                   1207:                                getmdmstr(str,SEC_CID);
                   1208:                                lprintf("\r\nCID: %s",str);
                   1209:                                p=strchr(str,':');
                   1210:                                if(p)
                   1211:                                        strcpy(cid,p+2);                /* Phone Number */
                   1212:                                getmdmstr(str,SEC_CID);
                   1213:                                lprintf("\r\nCID: %s",str);
                   1214:                                p=strchr(str,':');
                   1215:                                if(p)
                   1216:                                        sprintf(cname,"%.*s",LEN_CID,p+2); }    /* Caller Name */
                   1217:                        else if(!strncmpi(str,"DATE =",6)) { /* Supra format */
                   1218:                                getmdmstr(str,SEC_CID);
                   1219:                                lprintf("\r\nCID: %s",str);     /* TIME = line */
                   1220:                                getmdmstr(str,SEC_CID);
                   1221:                                lprintf("\r\nCID: %s",str);     /* NMBR = line */
                   1222:                                p=strchr(str,'=');
                   1223:                                if(p)
                   1224:                                        sprintf(strstr(str,"NAME") ? cname:cid,"%.*s",LEN_CID,p+2);
                   1225:                                getmdmstr(str,SEC_CID);                 /* NAME = line */
                   1226:                                lprintf("\r\nCID: %s",str);
                   1227:                                p=strchr(str,'=');
                   1228:                                if(p)
                   1229:                                        sprintf(strstr(str,"NAME") ? cname:cid,"%.*s",LEN_CID,p+2);
                   1230:                                }
                   1231:                        else if(strlen(str)>12)                 /* Single message format */
                   1232:                                sprintf(cid,"%.*s",LEN_CID,str+12);
                   1233:                        else
                   1234:                                sprintf(cid,"ERROR: '%s'",str);
                   1235:                        lputs(crlf); }
                   1236:                cur_rate=cur_cps=0;
                   1237:                connection[0]=0;
                   1238:                result_code=0;
                   1239:                if(!(mdm_misc&MDM_DUMB)) {
                   1240:                        if(mdm_rings>1) {
                   1241:                                lputs("Ring\r\n");
                   1242:                                for(i=1;i<mdm_rings;i++)
                   1243:                                        if(!getmdmstr(str,10))
                   1244:                                                break;
                   1245:                                        else
                   1246:                                                lputs("Ring\r\n");
                   1247:                                if(i<mdm_rings)
                   1248:                                        return(0);
                   1249:                                lputs(crlf); }
                   1250:                        lputs("Answering...");
                   1251:                        mdmcmd(mdm_answ);
                   1252:                        rioctl(IOFI);                                           // flush extra ring results
                   1253:                        while(!cur_rate || rioctl(RXBC)) {      // no connect or more rsults
                   1254:                                if(!getmdmstr(str,SEC_ANSWER)) {
                   1255:                                        if(cur_rate)
                   1256:                                                break;
                   1257:                                        lprintf("\r\nNO CARRIER\r\n");
                   1258:                                        if(!(mdm_misc&MDM_NODTR)) {
                   1259:                                                dtr(15);
                   1260:                                                dtr(1);
                   1261:                                                mswait(500); }
                   1262:                                        mdmcmd(nulstr);
                   1263:                                        hangup();
                   1264:                                        return(0); }
                   1265:                                i=0;
                   1266:                                while(i<2
                   1267:                                        && (!strcmp(str,"2")
                   1268:                                        || !strcmp(str,"RING"))) { /* Ring? Get next result */
                   1269:                                        lputs("Ring\r\n");
                   1270:                                        if(i) {
                   1271:                                                mdmcmd(mdm_answ);         /* Give a second ATA */
                   1272:                                                rioctl(IOFI); }
                   1273:                                        if(!getmdmstr(str,SEC_ANSWER)) {
                   1274:                                                if(!(mdm_misc&MDM_NODTR)) {
                   1275:                                                        dtr(15);
                   1276:                                                        dtr(1);
                   1277:                                                        mswait(500); }
                   1278:                                                mdmcmd(nulstr);
                   1279:                                                hangup();                 /* Get next result code from modem */
                   1280:                                                return(0); }
                   1281:                                        i++; }
                   1282:                                if(!strcmp(str,"3") || !strcmp(str,"NO CARRIER")) {
                   1283:                                        lprintf("\r\nNO CARRIER\r\n");
                   1284:                                        hangup();
                   1285:                                        return(0); }
                   1286: 
                   1287:                                lprintf("\r\nResult Code: %s\r\n",str);
                   1288: 
                   1289:                                /* IP (vmodem) logging additions by enigma */
                   1290:                                ips = strstr(str, "TEL FROM ");
                   1291:                                if(ips) {
                   1292:                                  strcpy(ipstr, ips+9);
                   1293:                                }
                   1294: 
                   1295:                                if(strstr(str,"FAX") || strstr(str,"+FCO")) {
                   1296:                                     /* Just for the ZyXEL's */
                   1297:                     mswait(1500);   /* 1 and a half second wait for ZyXEL */
                   1298:                     sys_misc&=~SM_ERRALARM;
                   1299:                     bail(100); }
                   1300: 
                   1301:                                if(mdm_misc&MDM_VERBAL) {
                   1302:                                        if(!cur_rate
                   1303:                                                && (!strnicmp(str,"CONNECT ",8)
                   1304:                                                || !strnicmp(str,"CARRIER ",8))) {
                   1305:                                                cur_rate=atol(str+8);
                   1306:                                                // build description
                   1307:                                                for(i=8,j=0;str[i] && j<LEN_MODEM;i++) {
                   1308:                                                        if(j==2 && isdigit(str[i])
                   1309:                                                                && str[i+1]=='0' && str[i+2]=='0'
                   1310:                                                                && !isdigit(str[i+3]) && j+1<LEN_MODEM) {
                   1311:                                                                connection[j++]='.';
                   1312:                                                                connection[j++]=str[i];
                   1313:                                                                i+=2; }
                   1314:                                                        else
                   1315:                                                                connection[j++]=str[i]; }
                   1316:                                                connection[j]=0; }
                   1317:                                        if(!cur_rate && !strcmp(str,"CONNECT"))
                   1318:                                                cur_rate=com_rate;
                   1319:                                        if(cur_rate
                   1320:                                                && (strstr(str,"ARQ") || strstr(str,"MNP")
                   1321:                                                || strstr(str,"V42") || strstr(str,"LAPM")
                   1322:                                                || strstr(str,"REL")))
                   1323:                                                cur_cps=cur_rate/9; }
                   1324:                                else {  /* numeric */
                   1325:                                        j=atoi(str);
                   1326:                                        for(i=0;i<mdm_results;i++)
                   1327:                                                if(mdm_result[i].code==j) break;
                   1328:                                        if(!cur_rate) {
                   1329:                                                if(i==mdm_results) {
                   1330:                                                        lprintf("Unknown result code: '%s'\r\n",str);
                   1331:                                                        sprintf(tmp,"Unknown modem result code: '%s'",str);
                   1332:                                                        errorlog(tmp);
                   1333:                                                        if(mdm_misc&MDM_KNOWNRES || !mdm_results) {
                   1334:                                                                hangup();
                   1335:                                                                return(0); }    /* Don't allow invalid codes */
                   1336:                                                        i--; }  /* Use last configured result code */
                   1337:                                                else
                   1338:                                                        result_code=mdm_result[i].code; }
                   1339:                                        if(!strncmpi(mdm_result[i].str,"EXIT ",5))
                   1340:                                                bail(atoi(mdm_result[i].str+5));
                   1341:                                        if(!strcmpi(mdm_result[i].str,"FAX")) {
                   1342:                                                lputs("FAX Connection\r\n");
                   1343:                                                bail(100); }
                   1344:                                        if(!strcmpi(mdm_result[i].str,"IGNORE") || cur_rate)
                   1345:                         lputs("Ignored\r\n");
                   1346:                                        else {
                   1347:                                                cur_rate=mdm_result[i].rate;
                   1348:                                                cur_cps=mdm_result[i].cps;
                   1349:                                                strcpy(connection,mdm_result[i].str); } } } }
                   1350:                else   /* dumb modem */
                   1351:                        cur_rate=com_rate;
                   1352: 
                   1353:                if(!connection[0])
                   1354:                        sprintf(connection,"%lu",cur_rate);
                   1355:                lprintf("Logging Caller in at %s\r\n",connection);
                   1356:                if(!cur_cps)
                   1357:                        cur_cps=cur_rate/10L;
                   1358: 
                   1359:         rioctl(IOCE|((RXLOST|FERR|PERR|OVRR)<<8));  /* clear error flags */
                   1360:         console=CON_R_ECHO|CON_L_ECHO|CON_R_INPUT|CON_L_INPUT;
                   1361:         online=ON_REMOTE;
                   1362:         gotcaller=1;
                   1363:                putcom(crlf);
                   1364: #if defined(__OS2__)
                   1365:                putcom(decrypt(VersionNoticeOS2,0));
                   1366: #elif defined(__WIN32__)
                   1367:                putcom(decrypt(VersionNoticeW32,0));
                   1368: #else
                   1369:                putcom(decrypt(VersionNoticeDOS,0));
                   1370: #endif
                   1371:                putcom(crlf);
                   1372:                lprintf("Pausing %u Seconds...",mdm_ansdelay);
                   1373:                if(node_misc&NM_ANSALARM) {
                   1374:                        now=time(NULL);
                   1375:                        while(time(NULL)-now<mdm_ansdelay)
                   1376:                 for(x=0;x<10;x++)
                   1377:                                        for(y=0;y<10;y++)
                   1378:                                                beep((x*100)+(y*5),10); }
                   1379:                else
                   1380:                        secwait(mdm_ansdelay);
                   1381:         nosound();
                   1382:                rioctl(IOFI); } }       /* flush input buffer */
                   1383: 
                   1384: reset_logon_vars();
                   1385: calls++;
                   1386: useron.misc=0;
                   1387: answertime=logontime=starttime=time(NULL);
                   1388: if(online==ON_REMOTE) {
                   1389:        setrate();
                   1390: 
                   1391:     now=time(NULL);
                   1392:     gm=localtime(&now);
                   1393:        sprintf(str,"%02d:%02d%c  %s %s %02d %u            Node %3u  %5lubps (%s)"
                   1394:         ,gm->tm_hour>12 ? gm->tm_hour-12 : gm->tm_hour==0 ? 12 : gm->tm_hour
                   1395:                ,gm->tm_min,gm->tm_hour>=12 ? 'p' : 'a',wday[gm->tm_wday]
                   1396:         ,mon[gm->tm_mon],gm->tm_mday,gm->tm_year+1900,node_num,cur_rate
                   1397:         ,connection);
                   1398:        if(result_code) {
                   1399:                sprintf(tmp," [%d]",result_code);
                   1400:                strcat(str,tmp); }
                   1401:        logline("@",str);
                   1402: 
                   1403:        /* IP trashcan modification by enigma */
                   1404:        if(trashcan(ipstr,"IP")) {
                   1405:                sprintf(tmp, "IP Trashcan: %s, hanging up!\r\n", ipstr);
                   1406:                logline("@!",tmp);
                   1407:                hangup();
                   1408:                return(0); }
                   1409: 
                   1410:        if(mdm_misc&MDM_CALLERID) {
                   1411:                outcom(0xC);
                   1412: #if defined(__OS2__)
                   1413:                putcom(decrypt(VersionNoticeOS2,0));
                   1414: #elif defined(__WIN32__)
                   1415:                putcom(decrypt(VersionNoticeW32,0));
                   1416: #else
                   1417:                putcom(decrypt(VersionNoticeDOS,0));
                   1418: #endif
                   1419:                putcom(crlf);
                   1420:                sprintf(str,"CID: %-*s %s",LEN_CID,cid,cname);
                   1421:                logline("@*",str);
                   1422:                if(trashcan(cid,"CID")) {
                   1423:                        hangup();
                   1424:                        return(0); } } }
                   1425: lclini(node_scrnlen-1);
                   1426: if(online==ON_REMOTE) {
                   1427:     if(node_dollars_per_call) { /* Billing node stuff */
                   1428:         now=time(NULL);
                   1429:         bprintf(text[BillingNodeMsg],sys_name,node_dollars_per_call);
                   1430:                while(online && now-answertime<30) {
                   1431:                        if(incom()!=NOINP) {
                   1432:                                if(!(mdm_misc&MDM_NODTR))
                   1433:                                        dtr(15);
                   1434:                                else
                   1435:                                        mdmcmd(mdm_hang); }
                   1436:             checkline();
                   1437:             now=time(NULL); }
                   1438:         if(!online)
                   1439:             return(0); }
                   1440:        rioctl(IOFI);
                   1441:        putcom("\x1b[99B\x1b[6n\x1b[!_\x1b[0t_\x1b[0m_\xC");
                   1442:     lputc(FF);
                   1443:        i=l=lncntr=autoterm=0;
                   1444:        tos=1;
                   1445: #if defined(__OS2__)
                   1446:        strcpy(str,decrypt(VersionNoticeOS2,0));
                   1447: #elif defined(__WIN32__)
                   1448:        strcpy(str,decrypt(VersionNoticeW32,0));
                   1449: #else
                   1450:        strcpy(str,decrypt(VersionNoticeDOS,0));
                   1451: #endif
                   1452:        strcat(str,decrypt(CopyrightNotice,0));
                   1453:        center(str);
                   1454:        while(i++<30 && l<40) {                 /* wait up to 3 seconds for response */
                   1455:                if((c=(incom()&0x7f))=='R') {   /* break immediately if response */
                   1456:                        str[l++]=c;
                   1457:                        mswait(110);
                   1458:                        break; }
                   1459:         if(c) {
                   1460:                        str[l++]=c;
                   1461:                        if(l==1 && c!=ESC)
                   1462:                                break; }
                   1463:         else
                   1464:                        mswait(100); }
                   1465: 
                   1466:        if(rioctl(RXBC))        /* wait a bit for extra RIP reply chars */
                   1467:                mswait(550);
                   1468: 
                   1469:        while((i=(incom()&0x7f))!=NOINP && l<40)
                   1470:                str[l++]=i;
                   1471:        str[l]=0;
                   1472: 
                   1473: #if 0
                   1474:        for(i=0;str[i];i++)
                   1475:                lprintf("%02X ",str[i]);
                   1476:        lputs(crlf);
                   1477: #endif
                   1478: 
                   1479:     if(l) {
                   1480:         if(str[0]==ESC && str[1]=='[') {
                   1481:                        useron.misc|=(ANSI|COLOR);
                   1482:                        autoterm|=ANSI;
                   1483:             rows=((str[2]&0xf)*10)+(str[3]&0xf);
                   1484:                        if(rows<10 || rows>99) rows=24; }
                   1485:                truncsp(str);
                   1486:                if(strstr(str,"RIPSCRIP")) {
                   1487:                        logline("@R",strstr(str,"RIPSCRIP"));
                   1488:                        useron.misc|=(RIP|COLOR|ANSI);
                   1489:                        autoterm|=(RIP|COLOR|ANSI); }
                   1490:                else if(strstr(str,"DC-TERM")
                   1491:                        && toupper(*(strstr(str,"DC-TERM")+12))=='W') {
                   1492:                        logline("@W",strstr(str,"DC-TERM"));
                   1493:                        useron.misc|=(WIP|COLOR|ANSI);
                   1494:                        autoterm|=(WIP|COLOR|ANSI); } }
                   1495:     rioctl(IOFI); /* flush left-over or late response chars */
                   1496:     sprintf(str,"%sANSWER",text_dir);
                   1497:        sprintf(tmp,"%s.%s",str,autoterm&WIP ? "WIP":"RIP");
                   1498:        sprintf(str2,"%s.ANS",str);
                   1499:        if(autoterm&(RIP|WIP) && fexist(tmp))
                   1500:                strcat(str,autoterm&WIP ? ".WIP":".RIP");
                   1501:        else if(autoterm&ANSI && fexist(str2))
                   1502:         strcat(str,".ANS");
                   1503:     else
                   1504:                strcat(str,".ASC");
                   1505:     rioctl(IOSM|PAUSE);
                   1506:        sys_status|=SS_PAUSEON;
                   1507:        tos=1;
                   1508:     printfile(str,P_NOABORT);
                   1509:        sys_status&=~SS_PAUSEON;
                   1510:     CRLF; }
                   1511: else
                   1512:        useron.misc=(UPAUSE|ANSI|COLOR);
                   1513: 
                   1514: useron.number=0;
                   1515: 
                   1516: exec_bin(login_mod,&main_csi);
                   1517: 
                   1518: if(!useron.number)
                   1519:     hangup();
                   1520: if(!online) {
                   1521:        logout();
                   1522:        return(0); }
                   1523: 
                   1524: if(online==ON_REMOTE && mdm_misc&MDM_CALLERID) {
                   1525:        strcpy(useron.note,cid);
                   1526:        putuserrec(useron.number,U_NOTE,LEN_NOTE,useron.note); }
                   1527: 
                   1528: /* log the IP by enigma */
                   1529: 
                   1530: if(online==ON_REMOTE && ipstr[0]!='\0') {
                   1531:        sprintf(useron.note, "Telnet: %s", ipstr);
                   1532:        putuserrec(useron.number,U_NOTE,LEN_NOTE,useron.note);
                   1533:        logline("@*", useron.note); }
                   1534: 
                   1535: if(!(sys_status&SS_USERON)) {
                   1536:     errormsg(WHERE,ERR_CHK,"User not logged on",0);
                   1537:        hangup();
                   1538:        logout();
                   1539:        return(0); }
                   1540: 
                   1541: return(1);
                   1542: }
                   1543: 

unix.superglobalmegacorp.com

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