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

1.1     ! root        1: /* SCB */
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: #include "xsdk.h"
        !             6: #include "scb.h"
        !             7: 
        !             8: /* RCIOLL.ASM */
        !             9: 
        !            10: int  rioini(int com,int irq);          /* initialize com,irq */
        !            11: int  setbaud(int rate);                /* set baud rate */
        !            12: int  rioctl(int action);               /* remote i/o control */
        !            13: int  dtr(char onoff);                  /* set/reset dtr */
        !            14: int  outcom(int ch);                   /* send character */
        !            15: int  incom(void);                      /* receive character */
        !            16: int  ivhctl(int intcode);              /* local i/o redirection */
        !            17: 
        !            18: /************************/
        !            19: /* Remote I/O Constants */
        !            20: /************************/
        !            21: 
        !            22:                                                        /* i/o mode and state flags */
        !            23: #define CTSCK 0x1000           /* check cts (mode only) */
        !            24: #define RTSCK 0x2000           /* check rts (mode only) */
        !            25: #define TXBOF 0x0800           /* transmit buffer overflow (outcom only) */
        !            26: #define ABORT 0x0400           /* check for ^C (mode), aborting (state) */
        !            27: #define PAUSE 0x0200           /* check for ^S (mode), pausing (state) */
        !            28: #define NOINP 0x0100           /* input buffer empty (incom only) */
        !            29: 
        !            30:                                                        /* status flags */
        !            31: #define RIODCD 0x80            /* DCD on */
        !            32: #define RI             0x40            /* Ring indicate */
        !            33: #define DSR    0x20            /* Dataset ready */
        !            34: #define CTS    0x10            /* CTS on */
        !            35: #define FERR   0x08            /* Frameing error */
        !            36: #define PERR   0x04            /* Parity error */
        !            37: #define OVRR   0x02            /* Overrun */
        !            38: #define RXLOST         0x01            /* Receive buffer overflow */
        !            39: 
        !            40: /* rioctl() arguments */
        !            41: /* returns mode or state flags in high 8 bits, status flags in low 8 bits */
        !            42: 
        !            43:                                                        /* the following return mode in high 8 bits */
        !            44: #define IOMODE 0               /* no operation */
        !            45: #define IOSM 1                 /* i/o set mode flags */
        !            46: #define IOCM 2                 /* i/o clear mode flags */
        !            47:                                                        /* the following return state in high 8 bits */
        !            48: #define IOSTATE 4              /* no operation */
        !            49: #define IOSS 5                 /* i/o set state flags */
        !            50: #define IOCS 6                 /* i/o clear state flags */
        !            51: #define IOFB 0x308             /* i/o buffer flush */
        !            52: #define IOFI 0x208             /* input buffer flush */
        !            53: #define IOFO 0x108             /* output buffer flush */
        !            54: #define IOCE 9                 /* i/o clear error flags */
        !            55: 
        !            56:                                                        /* return count (16bit) */
        !            57: #define RXBC   0x0a            /* get receive buffer count */
        !            58: #define TXBC   0x0b            /* get transmit buffer count */
        !            59: #define TXSYNC  0x0c        /* sync transmition (seconds<<8|0x0c) */
        !            60: #define IDLE   0x0d            /* suspend communication routines */
        !            61: #define RESUME  0x10d          /* return from suspended state */
        !            62: #define RLERC  0x000e          /* read line error count and clear */
        !            63: #define CPTON  0x0110          /* set input translation flag for ctrl-p on */
        !            64: #define CPTOFF 0x0010          /* set input translation flag for ctrl-p off */
        !            65: #define GETCPT 0x8010          /* return the status of ctrl-p translation */
        !            66: #define MSR    0x0011          /* read modem status register */
        !            67: #define FIFOCTL 0x0012         /* FIFO UART control */
        !            68: #define TSTYPE 0x0013          /* Time-slice API type */
        !            69: #define GETTST  0x8013      /* Get Time-slice API type */
        !            70: 
        !            71: 
        !            72: #define I14DB  0x001d          /* DigiBoard int 14h driver */
        !            73: #define I14PC  0x011d          /* PC int 14h driver */
        !            74: #define I14PS  0x021d          /* PS/2 int 14h driver */
        !            75: #define I14FO   0x031d      /* FOSSIL int 14h driver */
        !            76: 
        !            77: 
        !            78:                                                        /* ivhctl() arguments */
        !            79: #define INT29R 1               /* copy int 29h output to remote */
        !            80: #define INT29L 2                       /* Use _putlc for int 29h */
        !            81: #define INT16  0x10            /* return remote chars to int 16h calls */
        !            82: #define INTCLR 0            /* release int 16h, int 29h */
        !            83: 
        !            84: #define LEN_ALIAS              25      /* User alias                                                           */
        !            85: #define LEN_NAME               25      /* User name                                                            */
        !            86: #define LEN_HANDLE             8       /* User chat handle                                             */
        !            87: #define LEN_NOTE               30      /* User note                                                            */
        !            88: #define LEN_COMP               30      /* User computer description                            */
        !            89: #define LEN_COMMENT    60      /* User comment                                                         */
        !            90: #define LEN_NETMAIL    60      /* NetMail forwarding address                           */
        !            91: #define LEN_PASS                8      /* User password                                                        */
        !            92: #define LEN_PHONE              12      /* User phone number                                            */
        !            93: #define LEN_BIRTH               8      /* Birthday in MM/DD/YY format                          */
        !            94: #define LEN_ADDRESS    30      /* User address                                                         */
        !            95: #define LEN_LOCATION   30      /* Location (City, State)                                       */
        !            96: #define LEN_ZIPCODE    10      /* Zip/Postal code                                                      */
        !            97: #define LEN_MODEM               8      /* User modem type description                          */
        !            98: #define LEN_FDESC              58      /* File description                                             */
        !            99: #define LEN_TITLE              70      /* Message title                                                        */
        !           100: #define LEN_MAIN_CMD   40      /* Storage in user.dat for custom commands      */
        !           101: #define LEN_XFER_CMD   40
        !           102: #define LEN_SCAN_CMD   40
        !           103: #define LEN_MAIL_CMD   40
        !           104: #define LEN_CID                25      /* Caller ID (phone number)                             */
        !           105: #define LEN_ARSTR              40      /* Max length of Access Requirement string      */
        !           106: 
        !           107: /****************************************************************************/
        !           108: /* This is a list of offsets into the USER.DAT file for different variables */
        !           109: /* that are stored (for each user)                                                                                     */
        !           110: /****************************************************************************/
        !           111: #define U_ALIAS        0                                       /* Offset to alias */
        !           112: #define U_NAME         (U_ALIAS+LEN_ALIAS) /* Offset to name */
        !           113: #define U_HANDLE       (U_NAME+LEN_NAME)
        !           114: #define U_NOTE         (U_HANDLE+LEN_HANDLE+2)
        !           115: #define U_COMP         (U_NOTE+LEN_NOTE)
        !           116: #define U_COMMENT      (U_COMP+LEN_COMP+2)
        !           117: 
        !           118: #define U_NETMAIL      (U_COMMENT+LEN_COMMENT+2)
        !           119: 
        !           120: #define U_ADDRESS      (U_NETMAIL+LEN_NETMAIL+2)
        !           121: #define U_LOCATION     (U_ADDRESS+LEN_ADDRESS)
        !           122: #define U_ZIPCODE      (U_LOCATION+LEN_LOCATION)
        !           123: 
        !           124: #define U_PASS         (U_ZIPCODE+LEN_ZIPCODE+2)
        !           125: #define U_PHONE        (U_PASS+8)                      /* Offset to phone-number */
        !           126: #define U_BIRTH        (U_PHONE+12)            /* Offset to users birthday     */
        !           127: #define U_MODEM     (U_BIRTH+8)
        !           128: #define U_LASTON       (U_MODEM+8)
        !           129: #define U_FIRSTON      (U_LASTON+8)
        !           130: #define U_EXPIRE    (U_FIRSTON+8)
        !           131: #define U_PWMOD     (U_EXPIRE+8)
        !           132: 
        !           133: #define U_LOGONS    (U_PWMOD+8+2)
        !           134: #define U_LTODAY    (U_LOGONS+5)
        !           135: #define U_TIMEON    (U_LTODAY+5)
        !           136: #define U_TEXTRA       (U_TIMEON+5)
        !           137: #define U_TTODAY    (U_TEXTRA+5)
        !           138: #define U_TLAST     (U_TTODAY+5)
        !           139: #define U_POSTS     (U_TLAST+5)
        !           140: #define U_EMAILS    (U_POSTS+5)
        !           141: #define U_FBACKS    (U_EMAILS+5)
        !           142: #define U_ETODAY       (U_FBACKS+5)
        !           143: #define U_PTODAY       (U_ETODAY+5)
        !           144: 
        !           145: #define U_ULB       (U_PTODAY+5+2)
        !           146: #define U_ULS       (U_ULB+10)
        !           147: #define U_DLB       (U_ULS+5)
        !           148: #define U_DLS       (U_DLB+10)
        !           149: #define U_CDT          (U_DLS+5)
        !           150: #define U_MIN          (U_CDT+10)
        !           151: 
        !           152: #define U_LEVEL        (U_MIN+10+2)    /* Offset to Security Level    */
        !           153: #define U_FLAGS1       (U_LEVEL+2)     /* Offset to Flags */
        !           154: #define U_TL           (U_FLAGS1+8)    /* Offset to unused field */
        !           155: #define U_FLAGS2       (U_TL+2)                /* Offset to unused field */
        !           156: #define U_EXEMPT       (U_FLAGS2+8)
        !           157: #define U_REST         (U_EXEMPT+8)
        !           158: #define U_ROWS         (U_REST+8+2)    /* Number of Rows on user's monitor */
        !           159: #define U_SEX          (U_ROWS+2)              /* Sex, Del, ANSI, color etc.           */
        !           160: #define U_MISC         (U_SEX+1)               /* Miscellaneous flags in 8byte hex */
        !           161: #define U_XEDIT        (U_MISC+8)              /* External editor */
        !           162: #define U_LEECH        (U_XEDIT+2)     /* two hex digits - leech attempt count */
        !           163: #define U_CURGRP       (U_LEECH+2)     /* Current group */
        !           164: #define U_CURSUB       (U_CURGRP+4)    /* Current sub-board */
        !           165: #define U_CURLIB       (U_CURSUB+4)    /* Current library */
        !           166: #define U_CURDIR       (U_CURLIB+4)    /* Current directory */
        !           167: #define U_CMDSET       (U_CURDIR+4)    /* User's command set */
        !           168: #define U_MAIN_CMD     (U_CMDSET+2+2)  /* Custom main command set */
        !           169: #define U_XFER_CMD     (U_MAIN_CMD+LEN_MAIN_CMD)
        !           170: #define U_SCAN_CMD     (U_XFER_CMD+LEN_XFER_CMD+2)
        !           171: #define U_MAIL_CMD     (U_SCAN_CMD+LEN_SCAN_CMD)
        !           172: #define U_FREECDT      (U_MAIL_CMD+LEN_MAIL_CMD+2)  /* Unused bytes */
        !           173: #define U_FLAGS3       (U_FREECDT+10)  /* Unused bytes */
        !           174: #define U_FLAGS4       (U_FLAGS3+8)
        !           175: #define U_UNUSED1      (U_FLAGS4+8)
        !           176: #define U_UNUSED2      (U_UNUSED1+22+2)
        !           177: #define U_LEN       (U_UNUSED2+48+2)
        !           178: 
        !           179: enum {
        !           180:         PHONE_OKAY
        !           181:        ,PHONE_INVALID
        !           182:        ,PHONE_LD
        !           183:        };
        !           184: 
        !           185: unsigned _stklen=16000;                  /* Set stack size in code, not header */
        !           186: 
        !           187: uint asmrev,options=0;
        !           188: char canfile[256],result[256]={NULL},tmp[256],
        !           189:         addfile[256],phone_number[81]={NULL},flags1[81],flags2[81],flags3[81],
        !           190:         flags4[81],exempt[81],restrict[81],expiration[81],credits[81],minutes[81],
        !           191:         level[81],bbs_ac[81];
        !           192: char *crlf="\r\n";
        !           193: extern uint riobp;
        !           194: extern int mswtyp;
        !           195: char io_int=0,validated=0;             /* i/o interrupts intercepted? yes/no */
        !           196: int sysop=0;
        !           197: int ldstart[7],ldend[7],min_phone_len,max_phone_len,hangup_time;
        !           198: 
        !           199: /***********************/
        !           200: /* Function Prototypes */
        !           201: /***********************/
        !           202: int lprintf(char *fmat, ...);
        !           203: void bail();
        !           204: int main();
        !           205: void phone_val();
        !           206: char *get_user_pw();
        !           207: char check_phone(char *insearch);
        !           208: void mdmcmd(char *str);
        !           209: void putcomch(char ch);
        !           210: char getmdmstr(char *str, int sec);
        !           211: void mswait(int);
        !           212: void moduser();
        !           213: void write_info();
        !           214: char long_distance(char *number);
        !           215: 
        !           216: /****************************************************************************/
        !           217: /* Performs printf() through local assembly routines                        */
        !           218: /* Called from everywhere                                                   */
        !           219: /****************************************************************************/
        !           220: int lprintf(char *fmat, ...) {
        !           221:        char sbuf[256];
        !           222:        int chcount;
        !           223: 
        !           224: chcount=vsprintf(sbuf,fmat,_va_ptr);
        !           225: lputs(sbuf);
        !           226: return(chcount);
        !           227: }
        !           228: 
        !           229: void bail()
        !           230: {
        !           231:        char str[256];
        !           232:        int i;
        !           233: 
        !           234: if(io_int)
        !           235:        ivhctl(0);
        !           236: else if(!(options&STAY_CONNECTED)) { /* exiting without re-connecting */
        !           237:        dtr(10);
        !           238:        sprintf(str,"%sHANGUP.NOW",node_dir);
        !           239:        if((i=nopen(str,O_CREAT|O_RDWR))!=-1)
        !           240:                close(i); }
        !           241: if(com_port) {
        !           242:        for(i=0;i<5;i++)
        !           243:                if(!rioctl(TXBC))               /* wait for rest of output */
        !           244:                        break;
        !           245:                else
        !           246:                        mswait(1000);
        !           247:        rioini(0,0); }
        !           248: if(options&ALWAYS_VALIDATE || validated)
        !           249:        moduser();
        !           250: write_info();
        !           251: lputc(FF);
        !           252: }
        !           253: 
        !           254: int main()
        !           255: {
        !           256:        void *v;
        !           257:        uchar far *s;
        !           258:        char str[128],ch,*p;
        !           259:        int i,file;
        !           260:        uint base=0xffff;
        !           261:        FILE *stream;
        !           262: 
        !           263: node_dir[0]=0;
        !           264: 
        !           265: p=getenv("SBBSNODE");
        !           266: if(p)
        !           267:        strcpy(node_dir,p);
        !           268: 
        !           269: if(!node_dir[0]) {       /* node directory not specified */
        !           270:        printf("\n\7SBBSNODE environment variable must be set.\n");
        !           271:        printf("\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n");
        !           272:        getch();
        !           273:        return(1); }
        !           274: 
        !           275: if(node_dir[strlen(node_dir)-1]!='\\')  /* make sure node_dir ends in '\' */
        !           276:        strcat(node_dir,"\\");
        !           277: 
        !           278: initdata();                                 /* read XTRN.DAT and more */
        !           279: 
        !           280: if((asmrev=*(&riobp-1))!=23) {
        !           281:     printf("Wrong rciol.obj\n");
        !           282:     exit(1); }
        !           283: 
        !           284: lclini(0xd<<8);         /* Tab expansion, no CRLF expansion */
        !           285: 
        !           286: if(com_port) {
        !           287:        lprintf("\r\nInitializing COM port %u: ",com_port);
        !           288:        switch(com_base) {
        !           289:                case 0xb:
        !           290:                        lputs("PC BIOS");
        !           291:                        rioctl(I14PC);
        !           292:                        break;
        !           293:                case 0xffff:
        !           294:                case 0xd:
        !           295:                        lputs("DigiBoard");
        !           296:                        rioctl(I14DB);
        !           297:                        break;
        !           298:                case 0xe:
        !           299:                        lputs("PS/2 BIOS");
        !           300:                        rioctl(I14PS);
        !           301:                        break;
        !           302:                case 0xf:
        !           303:                        lputs("FOSSIL");
        !           304:                        rioctl(I14FO);
        !           305:                        break;
        !           306:                case 0:
        !           307:                        base=com_port;
        !           308:                        lputs("UART I/O (BIOS), ");
        !           309:                        if(com_irq)
        !           310:                                lprintf("IRQ %d",com_irq);
        !           311:                        else lputs("default IRQ");
        !           312:                        break;
        !           313:                default:
        !           314:                        base=com_base;
        !           315:                        lprintf("UART I/O %Xh, ",com_base);
        !           316:                        if(com_irq)
        !           317:                                lprintf("IRQ %d",com_irq);
        !           318:                        else lputs("default IRQ");
        !           319:                        break; }
        !           320: 
        !           321:        if(base==0xffff)
        !           322:                lprintf(" channel %u",com_irq);
        !           323:        i=rioini(base,com_irq);
        !           324:        if(i) {
        !           325:                lprintf(" - Failed! (%d)\r\n",i);
        !           326:                exit(1); }
        !           327:        if(mdm_misc&MDM_FLOWCTRL)
        !           328:                rioctl(IOSM|CTSCK|RTSCK); /* set rts/cts chk */
        !           329:        setbaud((uint)(com_rate&0xffffL));
        !           330:        msr=&riobp-1; }
        !           331: 
        !           332: rioctl(TSTYPE|mswtyp);  /* set time-slice API type */
        !           333: 
        !           334: rioctl(CPTON);          /* ctrl-p translation */
        !           335: 
        !           336: i=INT29L;
        !           337: if(com_port)
        !           338:        i|=(INT29R|INT16);
        !           339: ivhctl(i);
        !           340: io_int=1;
        !           341: 
        !           342: atexit(bail);
        !           343: 
        !           344: phone_val();
        !           345: 
        !           346: return(0);
        !           347: }
        !           348: 
        !           349: /******************************************************************************
        !           350:  Main phone validation loop.
        !           351: ******************************************************************************/
        !           352: void phone_val()
        !           353: {
        !           354:        FILE *stream;
        !           355:        char user_password[9],str[256],init_attempts=0,callout_attempts=0,*p;
        !           356:        int i=0,j,file;
        !           357: 
        !           358:        if((file=nopen("SCB.CFG",O_RDONLY))==-1) {
        !           359:                bprintf("ERROR: Opening configuration file\r\n"); exit(1); }
        !           360:        if((stream=fdopen(file,"rb"))==NULL) {
        !           361:                bprintf("ERROR: Converting configuration file to a stream\r\n");
        !           362:                exit(1); }
        !           363:        fgets(str,81,stream); truncsp(str); callout_attempts=atoi(str);
        !           364:        fgets(str,81,stream); truncsp(str);
        !           365:        if(str[0]=='Y') options|=ALWAYS_VALIDATE;
        !           366:        if(str[1]=='Y') options|=MODIFY_USER_NOTE;
        !           367:        if(str[2]=='Y') options|=START_WITH_0;
        !           368:        if(str[3]=='Y') options|=START_WITH_1;
        !           369:        if(str[4]=='Y') options|=STAY_CONNECTED;
        !           370:        if(str[5]=='Y') options|=SC_LOCAL_ONLY;
        !           371:        if(str[6]=='Y') options|=US_PHONE_FORMAT;
        !           372:        if(str[7]=='Y') options|=ALLOWED_ONLY;
        !           373:        if(str[8]!='N') options|=SAME_AREA_LD;
        !           374:        fgets(canfile,81,stream); truncsp(canfile);
        !           375:        fgets(addfile,81,stream); truncsp(addfile);
        !           376:        fgets(credits,81,stream); truncsp(credits);
        !           377:        fgets(str,81,stream); truncsp(str); sysop=atoi(str);
        !           378:        fgets(level,81,stream); truncsp(level);
        !           379:        fgets(flags1,81,stream); truncsp(flags1);
        !           380:        fgets(flags2,81,stream); truncsp(flags2);
        !           381:        fgets(exempt,81,stream); truncsp(exempt);
        !           382:        fgets(restrict,81,stream); truncsp(restrict);
        !           383:        fgets(expiration,81,stream); truncsp(expiration);
        !           384:        fgets(minutes,81,stream); truncsp(minutes);
        !           385:        fgets(flags3,81,stream); truncsp(flags3);
        !           386:        fgets(flags4,81,stream); truncsp(flags4);
        !           387:        for(i=0;i<7;i++) {
        !           388:                fgets(str,81,stream); ldstart[i]=atoi(str);    /* min since midnight */
        !           389:                fgets(str,81,stream); ldend[i]=atoi(str); }
        !           390:        fgets(str,81,stream); min_phone_len=atoi(str);
        !           391:        fgets(str,81,stream); max_phone_len=atoi(str);
        !           392:        fgets(bbs_ac,81,stream); truncsp(bbs_ac);
        !           393:        if(fgets(str,81,stream)) {
        !           394:                hangup_time=atoi(str);
        !           395:                if(hangup_time>90)
        !           396:                        hangup_time=90; }
        !           397:        else
        !           398:                hangup_time=30;
        !           399: 
        !           400:        fgets(str,81,stream);           // regnum
        !           401: 
        !           402:        fclose(stream);
        !           403: 
        !           404:        cls();
        !           405:        strcpy(result,"Hung up");
        !           406:        strcpy(user_password,get_user_pw());
        !           407:        bprintf("\1c\1hSynchronet Callback v%s  "
        !           408:                "Developed 1995-1997 Rob Swindell\r\n",VERSION);
        !           409:        sprintf(str,"%s..\\EXEC\\",ctrl_dir);
        !           410:        printfile("SCB.MSG");
        !           411:        if(yesno("\r\nDo you need instructions"))
        !           412:                printfile("INSTRUCT.MSG");
        !           413:        if(!yesno("\r\nContinue with verification")) {
        !           414:         options&=~ALWAYS_VALIDATE;
        !           415:         cls(); printfile("REFUSED.MSG"); pause();
        !           416:         strcpy(result,"Refused");
        !           417:         return; }
        !           418: /***
        !           419:        if(!(options&ALLOW_LD) && yesno("Are you calling long distance")) {
        !           420:                bprintf("\r\n\1n\1cSorry, \1h%s \1n\1cwill verify \1y\1hLOCAL "
        !           421:                        "\1n\1ccalls only!\r\n",sys_name);
        !           422:                        strcpy(result,"Long Dist"); pause();
        !           423:                return; }
        !           424: ***/
        !           425: 
        !           426:        while(1) {
        !           427:                while(1) {
        !           428:                        bprintf("\r\n\r\n\1n\1cEnter your \1h\1yCOMPLETE \1n\1cphone "
        !           429:                                "number now. If you are calling long distance, enter\r\n\1h\1y"
        !           430:                                "ALL \1n\1cof the digits necessary to reach your phone number. "
        !           431:                                "If you are a \1h\1yLOCAL \1n\1ccall from the BBS, \1h\1yDO NOT"
        !           432:                                "\1n\1c enter unnecessary digits (your area code, for example)."
        !           433:                                "\r\n:");
        !           434:                        getstr(phone_number,20,K_LINE|K_NUMBER);
        !           435:                        if(yesno("\r\nIs this correct")) break; }
        !           436: 
        !           437:                if(bbs_ac[0]) {                                                         /* Strip off area code */
        !           438:                        if(!strncmp(phone_number,bbs_ac,strlen(bbs_ac)))
        !           439:                                strcpy(phone_number,phone_number+strlen(bbs_ac));
        !           440:                        else {
        !           441:                                sprintf(tmp,"1%s",bbs_ac);
        !           442:                                if(!strncmp(phone_number,tmp,strlen(tmp)))
        !           443:                                        strcpy(phone_number,phone_number+strlen(tmp)); } }
        !           444: 
        !           445:                if(options&US_PHONE_FORMAT &&                           /* Add 1 to number */
        !           446:                        (phone_number[1]=='0' || phone_number[1]=='1') &&
        !           447:                        strlen(phone_number)>7) {
        !           448:                        sprintf(tmp,"1%s",phone_number);
        !           449:                        strcpy(phone_number,tmp); }
        !           450: 
        !           451:                j=check_phone(phone_number);
        !           452: 
        !           453:                if(j==PHONE_LD) {
        !           454:                        strcpy(result,"Long Dist");
        !           455:                        pause();
        !           456:                        return; }
        !           457:                if(j==PHONE_OKAY)
        !           458:                        break;
        !           459:                options&=~ALWAYS_VALIDATE;
        !           460:                strcpy(result,"Invalid #");
        !           461:                bprintf("\r\n\1n\1cReturning you to \1h%s.\1n\r\n",sys_name);
        !           462:                return; }
        !           463: 
        !           464:        bprintf("\r\n\r\n\1n\1cDropping Carrier, \1h%s \1n\1cwill call you back "
        !           465:                "now.\r\nType \1h\1yATA \1n\1cto answer when your modem rings!\r\n\r\n"
        !           466:                ,sys_name);
        !           467:        if(!com_port) exit(0);
        !           468:        mswait(1000);
        !           469:        ivhctl(0);              /* put intercepted i/o vectors back */
        !           470:        io_int=0;
        !           471: 
        !           472:        for(init_attempts=0;init_attempts<4;init_attempts++) {   /* 4 attempts */
        !           473:                dtr(5);
        !           474:                if(!init_attempts) mswait(1000);
        !           475:                dtr(1);
        !           476:                rioctl(IOFB);
        !           477:                for(i=0;i<4;i++) {
        !           478:                        mdmcmd(mdm_init);
        !           479:                        if(!getmdmstr(str,10))
        !           480:                                continue;
        !           481:                        if(!stricmp(str,mdm_init)) {    /* Echo on? */
        !           482:                                getmdmstr(str,10);                      /* Get OK */
        !           483:                                mdmcmd("ATE0");             /* Turn echo off */
        !           484:                                if(!getmdmstr(str,10))
        !           485:                     continue; }
        !           486:                        if(!strcmp(str,"OK")) {         /* Verbal response? */
        !           487:                                mdmcmd("ATV0");             /* Turn verbal off */
        !           488:                                if(!getmdmstr(str,10))
        !           489:                                        continue; }
        !           490:                        if(!strcmp(str,"0"))
        !           491:                                break;
        !           492:                        rioctl(IOFB);           /* Send fool-proof init string */
        !           493:                        mdmcmd("ATE0V0");
        !           494:                        if(getmdmstr(str,10) && !strcmp(str,"0"))
        !           495:                                break; }
        !           496:                if(i==4)
        !           497:                        continue;
        !           498:                mswait(100);
        !           499:                if(mdm_spec[0]) {
        !           500:                        for(i=0;i<4;i++) {
        !           501:                                mdmcmd(mdm_spec);
        !           502:                                if(!getmdmstr(str,10)) continue;
        !           503:                                if(!strcmp(str,"0")) break; }
        !           504:                        if(i==4)
        !           505:                                continue; }
        !           506:                break; }
        !           507: 
        !           508:        if(init_attempts==4) {   /* couldn't init */
        !           509:                strcpy(result,"No Init");
        !           510:                exit(1); }
        !           511: 
        !           512:        mswait(1000);
        !           513:        mdmcmd("ATH");
        !           514:        str[0]=0;
        !           515:        getmdmstr(str,10);
        !           516:        if(strcmp(str,"0")) {
        !           517:                strcpy(result,"No Init");
        !           518:                exit(1); }
        !           519:        if(hangup_time)
        !           520:                bprintf("\r\n\1n\1cWaiting \1h%u\1n\1c seconds before dialing..."
        !           521:                        "\r\n\r\n",hangup_time);
        !           522:        mswait(hangup_time*1000);                       /* Wait xx seconds before dialing */
        !           523: 
        !           524:        for(i=0;i<callout_attempts;i++) {
        !           525:                mswait(5000);
        !           526:                rioctl(IOFB);
        !           527:                sprintf(str,"%s%s",mdm_dial,phone_number);
        !           528:                mdmcmd(str);
        !           529:                if(!getmdmstr(str,60)) {
        !           530:                        mdmcmd("");         /* send CR to abort dial */
        !           531:                        continue; }
        !           532:                if(strcmp(str,"0") && strcmp(str,"2") && strcmp(str,"3")
        !           533:                        && strcmp(str,"4") && strcmp(str,"6") && strcmp(str,"7")
        !           534:                        && strcmp(str,"8") && strcmp(str,"9"))
        !           535:                   break; }
        !           536: 
        !           537:        if(i==callout_attempts) {                       /* Couldn't connect */
        !           538:                strcpy(result,"No Connect");
        !           539:                exit(1); }
        !           540: 
        !           541:        i=INT29L;               /* intercept i/o vectors again */
        !           542:        if(com_port)
        !           543:                i|=(INT29R|INT16);
        !           544:        ivhctl(i);
        !           545:        io_int=1;
        !           546: 
        !           547:        if(rioctl(IOSTATE|DCD)) {
        !           548:                mswait(5000);   /* wait 5 seconds for MNP to Non-MNP connect */
        !           549:                rioctl(IOFB);
        !           550:                lncntr=0;
        !           551:                i=0; cls();
        !           552:                bprintf("\r\n\r\n\1n\1cThis is \1h%s \1n\1ccalling for \1m%s.",
        !           553:                        sys_name,user_name);
        !           554:                while(1) {
        !           555:                        bprintf("\r\n\r\n\1h\1yEnter your password for verification: ");
        !           556:                        getstr(str,8,K_UPPER|K_LINE);
        !           557:                        if(!stricmp(str,user_password)) {
        !           558:                                validated=1;
        !           559:                                bprintf("\r\n\r\n\1n\1cYou have now been verified on \1h%s!",
        !           560:                                        sys_name);
        !           561:                                printfile("VERIFIED.MSG");
        !           562:                                strcpy(result,"Verified");
        !           563:                                break; }
        !           564:                        else {
        !           565:                                bprintf("\r\n\1r\1hINCORRECT!\1n");
        !           566:                                if(++i>=4) {
        !           567:                                        bprintf("\r\n\r\n\1r\1hYou have entered an incorrect "
        !           568:                                                "password.  Goodbye.\r\n\r\n"); dtr(5);
        !           569:                                                strcpy(result,"Bad Pass"); return; } } }
        !           570: 
        !           571:                if(!(options&STAY_CONNECTED)) {
        !           572:                        mswait(2000);
        !           573:                        for(i=0;i<5;i++) {
        !           574:                                dtr(5);
        !           575:                                if(!(rioctl(IOSTATE)&DCD))      /* no carrier detect */
        !           576:                                        break;
        !           577:                                lprintf("SCB: Dropping DTR failed to lower DCD.\r\n");
        !           578:                                dtr(1);
        !           579:                                mswait(2000); }
        !           580:                        sprintf(str,"%sHANGUP.NOW",node_dir);
        !           581:                        if((i=nopen(str,O_CREAT|O_RDWR))!=-1)
        !           582:                                close(i); } }
        !           583: }
        !           584: 
        !           585: /******************************************************************************
        !           586:  Writes the MODUSER.DAT file.
        !           587: ******************************************************************************/
        !           588: void moduser()
        !           589: {
        !           590:        FILE *stream;
        !           591:        char str[512];
        !           592:        int file;
        !           593:        long expire;
        !           594:        time_t now;
        !           595: 
        !           596:        now=time(NULL);
        !           597: 
        !           598:        if(user_expire>now)
        !           599:                expire=(user_expire+(atol(expiration)*24L*60L*60L));
        !           600:        else
        !           601:                expire=(now+(atol(expiration)*24L*60L*60L));
        !           602: 
        !           603:        sprintf(str,"%sMODUSER.DAT",node_dir);
        !           604:        if((stream=fopen(str,"wb"))!=NULL) {
        !           605:                fprintf(stream,"%s\r\n",credits);
        !           606:                fprintf(stream,"%s\r\n",level);
        !           607:                fprintf(stream,"\r\n");
        !           608:                fprintf(stream,"%s\r\n",flags1);
        !           609:                fprintf(stream,"%s\r\n",flags2);
        !           610:                fprintf(stream,"%s\r\n",exempt);
        !           611:                fprintf(stream,"%s\r\n",restrict);
        !           612:                fprintf(stream,"%s\r\n",atol(expiration) ? ultoa(expire,str,16) : "");
        !           613:                fprintf(stream,"%s\r\n",minutes);
        !           614:                fprintf(stream,"%s\r\n",flags3);
        !           615:                fprintf(stream,"%s\r\n",flags4);
        !           616:                fclose(stream);
        !           617:                }
        !           618:        else
        !           619:         bprintf("\7\r\nError opening %s for write.\r\n",str);
        !           620:        if(addfile[0] && phone_number[0]) {
        !           621:         if((file=nopen(addfile,O_WRONLY|O_APPEND|O_CREAT))!=-1) {
        !           622:             sprintf(str,"%s^\r\n",phone_number);
        !           623:             write(file,str,strlen(str));
        !           624:             close(file); }
        !           625:         else
        !           626:             bprintf("\7\r\nError opening %s for write.\r\n",addfile); }
        !           627:        if(sysop) {
        !           628:                sprintf(str,"\1c\1hSCB: \1y%s \1n\1cwas validated \1h%.24s\1n\r\n"
        !           629:                        ,user_name,ctime(&now));
        !           630:                putsmsg(sysop,str); }
        !           631: }
        !           632: 
        !           633: /******************************************************************************
        !           634:  Writes the log file.
        !           635: ******************************************************************************/
        !           636: void write_info()
        !           637: {
        !           638:        char str[512];
        !           639:        int file;
        !           640:        time_t now;
        !           641: 
        !           642:        now=time(NULL);
        !           643:        if((file=nopen("SCB.LOG",O_WRONLY|O_APPEND|O_CREAT))!=-1) {
        !           644:                sprintf(str,
        !           645:                        "Node %-3d     : %.24s\r\n"
        !           646:                        "User Name    : %s\r\n"
        !           647:                        "Voice Number : %s\r\n"
        !           648:                        "Modem Number : %s\r\n"
        !           649:                        "Result       : %s\r\n\r\n"
        !           650:                        ,node_num,ctime(&now),user_name,user_phone,phone_number,result);
        !           651:                write(file,str,strlen(str));
        !           652:                close(file); }
        !           653:        else
        !           654:                bprintf("\7\r\nError opening SCB.LOG for write.\r\n");
        !           655:        sprintf(str,"%sNODE.LOG",node_dir);
        !           656:        if(com_port && (file=nopen(str,O_WRONLY|O_APPEND|O_CREAT))!=-1) {
        !           657:                sprintf(str,"cb Result: %s %s\r\n",result,phone_number);
        !           658:                write(file,str,strlen(str));
        !           659:                close(file); }
        !           660:        if(options&MODIFY_USER_NOTE) {
        !           661:         sprintf(str,"%sUSER\\USER.DAT",data_dir);
        !           662:                if((file=nopen(str,O_WRONLY|O_DENYNONE))!=-1) {
        !           663:                        lseek(file,(long)((((long)user_number-1L)*U_LEN)+U_NOTE),SEEK_SET);
        !           664:             memset(str,'\3',30);
        !           665:                        sprintf(str,"%s %s",result,phone_number);
        !           666:                        str[strlen(str)]=3;
        !           667:                        write(file,str,30);
        !           668:             close(file); } }
        !           669: }
        !           670: 
        !           671: /******************************************************************************
        !           672:  Returns the users' password.
        !           673: ******************************************************************************/
        !           674: char *get_user_pw()
        !           675: {
        !           676:        static char pw[9];
        !           677:        char str[256];
        !           678:        int file,x;
        !           679: 
        !           680:        sprintf(str,"%sUSER\\USER.DAT",data_dir);
        !           681:        if((file=nopen(str,O_RDONLY))==-1) {
        !           682:                printf("Unable to open %s.",str); exit(1); }
        !           683:        lseek(file,(long)((((long)user_number-1L)*U_LEN)+U_PASS),SEEK_SET);
        !           684:        read(file,pw,8);
        !           685:        for(x=0;x<8;x++)
        !           686:                if(pw[x]==3) break;
        !           687:        pw[x]=0;
        !           688:        close(file);
        !           689:        return(pw);
        !           690: }
        !           691: 
        !           692: /******************************************************************************
        !           693:  Checks the phone number entered.  0=Good, 1=Bad.
        !           694: ******************************************************************************/
        !           695: char check_phone(char *insearch)
        !           696: {
        !           697:        char str[256],search[256],c,found=0,allowed=0,long_distance=0;
        !           698:        int file,day,t;
        !           699:        FILE *stream;
        !           700:        time_t now;
        !           701:        struct date date;
        !           702:        struct time curtime;
        !           703:        struct tm *tblock;
        !           704: 
        !           705: if(strlen(insearch)<min_phone_len) {
        !           706:        printfile("TOOSHORT.MSG");
        !           707:        return(PHONE_INVALID); }
        !           708: if(strlen(insearch)>max_phone_len) {
        !           709:        printfile("TOOLONG.MSG");
        !           710:     return(PHONE_INVALID); }
        !           711: 
        !           712: strcpy(str,"ALLOWED.DAT");
        !           713: if((file=nopen(str,O_RDONLY|O_TEXT))!=-1)
        !           714:        if((stream=fdopen(file,"rt"))!=NULL) {
        !           715:                strcpy(search,insearch);
        !           716:                strupr(search);
        !           717:                while(!feof(stream) && !ferror(stream)) {
        !           718:                        if(!fgets(str,81,stream))
        !           719:                                break;
        !           720:                        truncsp(str);
        !           721:                        c=strlen(str);
        !           722:                        if(c && !strncmp(str,search,c)) {
        !           723:                                allowed=1;
        !           724:                                break; } }
        !           725:        fclose(stream); }
        !           726: 
        !           727: if(!allowed) {
        !           728: 
        !           729:        if(options&ALLOWED_ONLY)
        !           730:                long_distance=1;
        !           731:        else {
        !           732:                strcpy(str,"LDPREFIX.DAT");
        !           733:                if((file=nopen(str,O_RDONLY|O_TEXT))!=-1)
        !           734:                        if((stream=fdopen(file,"rt"))!=NULL) {
        !           735:                                strcpy(search,insearch);
        !           736:                                strupr(search);
        !           737:                                while(!feof(stream) && !ferror(stream)) {
        !           738:                                        if(!fgets(str,81,stream))
        !           739:                                                break;
        !           740:                                        truncsp(str);
        !           741:                                        c=strlen(str);
        !           742:                                        if(c && !strncmp(str,search,c)) {
        !           743:                                                long_distance=1;
        !           744:                                                break; } }
        !           745:                        fclose(stream); } }
        !           746: 
        !           747:        if(!(options&START_WITH_0) && insearch[0]=='0') {
        !           748:                printfile("NO_ZERO.MSG");
        !           749:                return(PHONE_LD); }
        !           750:        if(!(options&START_WITH_1) && insearch[0]=='1') {
        !           751:                printfile("NO_ONE.MSG");
        !           752:                return(PHONE_LD); }
        !           753:        if(!(options&SAME_AREA_LD) && insearch[0]!='0' && insearch[0]!='1'
        !           754:                && long_distance) {
        !           755:                printfile("NO_LD.MSG");
        !           756:                return(PHONE_LD); }
        !           757:        if((insearch[0]=='1' || insearch[0]=='0' || long_distance) &&
        !           758:                (ldstart[day] || ldend[day])) {
        !           759:                now=time(NULL);
        !           760:                tblock=localtime(&now);
        !           761:                day=tblock->tm_wday;
        !           762:                unixtodos(now,&date,&curtime);
        !           763:                t=(curtime.ti_hour*60)+curtime.ti_min;
        !           764: 
        !           765:                if((ldstart[day]<ldend[day]
        !           766:                        && (t<ldstart[day] || t>ldend[day]))
        !           767: 
        !           768:                || (ldstart[day]>ldend[day]
        !           769:                        && (t<ldstart[day] && t>ldend[day]))
        !           770: 
        !           771:                        ) {
        !           772: 
        !           773:                        bprintf("\7\r\n\1n\1gLong distance calls are only allowed between "
        !           774:                                "\1h%02d:%02d \1n\1gand \1h%02d:%02d\1n\1g.\r\n"
        !           775:                                ,ldstart[day]/60,ldstart[day]%60
        !           776:                                ,ldend[day]/60,ldend[day]%60);
        !           777:                        printfile("LD_TIME.MSG");
        !           778:                        return(PHONE_LD); } } }
        !           779: 
        !           780: strcpy(str,canfile);
        !           781: if((file=nopen(str,O_RDONLY|O_TEXT))==-1) {
        !           782:        if(fexist(str))
        !           783:                printf("ERROR: Unable to open %s for read.",str);
        !           784:        return(PHONE_OKAY); }
        !           785: if((stream=fdopen(file,"rt"))==NULL) {
        !           786:        printf("ERROR: Converting %s to a stream.",str);
        !           787:        return(PHONE_OKAY); }
        !           788: strcpy(search,insearch);
        !           789: strupr(search);
        !           790: while(!feof(stream) && !ferror(stream) && !found) {
        !           791:        if(!fgets(str,81,stream))
        !           792:                break;
        !           793:        truncsp(str);
        !           794:        c=strlen(str);
        !           795:        if(c) {
        !           796:                c--;
        !           797:                strupr(str);
        !           798:                if(str[c]=='~') {
        !           799:                        str[c]=0;
        !           800:                        if(strstr(search,str))
        !           801:                                found=1; }
        !           802: 
        !           803:                else if(str[c]=='^') {
        !           804:                        str[c]=0;
        !           805:                        if(!strncmp(str,search,c))
        !           806:                                found=1; }
        !           807: 
        !           808:                else if(!strcmp(str,search))
        !           809:                        found=1; } }
        !           810: fclose(stream);
        !           811: if(found) {
        !           812:        printfile("PHONECAN.MSG");
        !           813:        return(PHONE_INVALID); }
        !           814: if(!allowed && options&STAY_CONNECTED && options&SC_LOCAL_ONLY &&
        !           815:        (insearch[0]=='1' || insearch[0]=='0'))
        !           816:     options&=~STAY_CONNECTED;
        !           817: return(PHONE_OKAY);
        !           818: }
        !           819: 
        !           820: /****************************************************************************/
        !           821: /* Outputs a single character to the COM port                                                          */
        !           822: /****************************************************************************/
        !           823: void putcomch(char ch)
        !           824: {
        !           825:        char    lch;
        !           826:        int     i=0;
        !           827: 
        !           828: if(!com_port)
        !           829:        return;
        !           830: while(outcom(ch)&TXBOF && i<1440) {    /* 3 minute pause delay */
        !           831:     if(lkbrd(1)) {
        !           832:                lch=lkbrd(0);   /* ctrl-c */
        !           833:                if(lch==3) {
        !           834:                        lputs("local abort (putcomch)\r\n");
        !           835:                        i=1440;
        !           836:                        break; }
        !           837:                ungetkey(lch); }
        !           838:     if(!(rioctl(IOSTATE)&DCD))
        !           839:                break;
        !           840:        i++;
        !           841:        mswait(80); }
        !           842: if(i==1440) {                                          /* timeout - beep flush outbuf */
        !           843:        i=rioctl(TXBC);
        !           844:        lprintf("timeout(putcomch) %04X %04X\r\n",i,rioctl(IOFO));
        !           845:        outcom(7);
        !           846:        lputc(7);
        !           847:        rioctl(IOCS|PAUSE); }
        !           848: }
        !           849: 
        !           850: /****************************************************************************/
        !           851: /* Sends string of characters to COM port. Interprets ^M and ~ (pause)         */
        !           852: /* Called from functions waitforcall and offhook                                                       */
        !           853: /****************************************************************************/
        !           854: void mdmcmd(char *str)
        !           855: {
        !           856:        int     i=0;
        !           857:        uint    lch;
        !           858: 
        !           859: lputs("\r\nModem command  : ");
        !           860: while(str[i]) {
        !           861:        if(str[i]=='~')
        !           862:                mswait(500);
        !           863:        else {
        !           864:                if(i && str[i-1]=='^' && str[i]!='^')  /* control character */
        !           865:                        putcomch(toupper(str[i])-64);
        !           866:                else if(str[i]!='^' || (i && str[i-1]=='^'))
        !           867:                        putcomch(str[i]);
        !           868:                lputc(str[i]); }
        !           869:        i++; }
        !           870: putcomch(CR);
        !           871: i=0;
        !           872: while(rioctl(TXSYNC) && i<10) {   /* wait for modem to receive all chars */
        !           873:        if(lkbrd(1)) {
        !           874:                lch=lkbrd(0);   /* ctrl-c */
        !           875:                if(lch==0x2e03) {
        !           876:                        lputs("local abort (mdmcmd)\r\n");
        !           877:                        break; }
        !           878:                if(lch==0xff00)
        !           879:                        bail(1);
        !           880:                ungetkey(lch); }
        !           881:        i++; }
        !           882: if(i==10) {
        !           883:        i=rioctl(TXBC);
        !           884:        lprintf("\r\n\7timeout(mdmcmd) %04X %04X\r\n",i,rioctl(IOFO)); }
        !           885: lputs(crlf);
        !           886: }
        !           887: /****************************************************************************/
        !           888: /* Returns CR terminated string from the COM port.                                                     */
        !           889: /* Called from function waitforcall                                                                            */
        !           890: /****************************************************************************/
        !           891: char getmdmstr(char *str, int sec)
        !           892: {
        !           893:        uchar   j=0,ch;
        !           894:        uint    lch;
        !           895:        time_t  start;
        !           896: 
        !           897: lputs("Modem response : ");
        !           898: start=time(NULL);
        !           899: while(time(NULL)-start<sec && j<81) {
        !           900:        if(lkbrd(1)) {
        !           901:                lch=lkbrd(0);   /* ctrl-c */
        !           902:                if(lch==0x2e03) {
        !           903:                        lputs("local abort (getmdmstr)\r\n");
        !           904:                        break; }
        !           905:                if(lch==0xff00)
        !           906:                        bail(1);
        !           907:                ungetkey(lch); }
        !           908:        if((ch=incom())==CR && j)
        !           909:                break;
        !           910:        if(ch && (ch<0x20 || ch>0x7f)) /* ignore control characters and ex-ascii */
        !           911:                continue;
        !           912:        if(ch) {
        !           913:                str[j++]=ch;
        !           914:                lputc(ch); }
        !           915:        else mswait(0); }
        !           916: mswait(500);
        !           917: str[j]=0;
        !           918: lputs(crlf);
        !           919: return(j);
        !           920: }

unix.superglobalmegacorp.com

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