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

1.1       root        1: #line 1 "STR.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: /*****************************************************/
                      6: /* Functions that perform lengthy string i/o rotines */
                      7: /*****************************************************/
                      8: 
                      9: #include "sbbs.h"
                     10: 
                     11: /****************************************************************************/
                     12: /* Lists all users who have access to the current sub.                      */
                     13: /****************************************************************************/
                     14: void userlist(char mode)
                     15: {
                     16:        uchar name[256],sort=0;
                     17:        int i,j,k,users=0;
                     18:        uchar *line[1000];
                     19:        user_t user;
                     20: 
                     21: if(lastuser()<=1000)
                     22:        sort=yesno(text[SortAlphaQ]);
                     23: if(sort) {
                     24:        bputs(text[CheckingSlots]); }
                     25: else {
                     26:        CRLF; }
                     27: j=0;
                     28: k=lastuser();
                     29: for(i=1;i<=k && !msgabort();i++) {
                     30:        if(sort && (online==ON_LOCAL || !rioctl(TXBC)))
                     31:                bprintf("%-4d\b\b\b\b",i);
                     32:        user.number=i;
                     33:        getuserdat(&user);
                     34:        if(user.misc&(DELETED|INACTIVE))
                     35:                continue;
                     36:        users++;
                     37:        if(mode==UL_SUB) {
                     38:                if(!usrgrps)
                     39:                        continue;
                     40:                if(!chk_ar(grp[usrgrp[curgrp]]->ar,user))
                     41:                        continue;
                     42:                if(!chk_ar(sub[usrsub[curgrp][cursub[curgrp]]]->ar,user)
                     43:                        || (sub[usrsub[curgrp][cursub[curgrp]]]->read_ar[0]
                     44:                        && !chk_ar(sub[usrsub[curgrp][cursub[curgrp]]]->read_ar,user)))
                     45:                        continue; }
                     46:        else if(mode==UL_DIR) {
                     47:                if(user.rest&FLAG('T'))
                     48:                        continue;
                     49:                if(!usrlibs)
                     50:                        continue;
                     51:                if(!chk_ar(lib[usrlib[curlib]]->ar,user))
                     52:                        continue;
                     53:                if(!chk_ar(dir[usrdir[curlib][curdir[curlib]]]->ar,user))
                     54:                        continue; }
                     55:        if(sort) {
                     56:                if((line[j]=(char *)MALLOC(128))==0) {
                     57:                        errormsg(WHERE,ERR_ALLOC,nulstr,83);
                     58:                        for(i=0;i<j;i++)
                     59:                                FREE(line[i]);
                     60:                        return; }
                     61:                sprintf(name,"%s #%d",user.alias,i);
                     62:                sprintf(line[j],text[UserListFmt],name
                     63:                        ,sys_misc&SM_LISTLOC ? user.location : user.note
                     64:                        ,unixtodstr(user.laston,tmp)
                     65:                        ,user.modem); }
                     66:        else {
                     67:                sprintf(name,"%s #%u",user.alias,i);
                     68:                bprintf(text[UserListFmt],name
                     69:                        ,sys_misc&SM_LISTLOC ? user.location : user.note
                     70:                        ,unixtodstr(user.laston,tmp)
                     71:                        ,user.modem); }
                     72:        j++; }
                     73: if(i<=k) {     /* aborted */
                     74:        if(sort)
                     75:                for(i=0;i<j;i++)
                     76:                        FREE(line[i]);
                     77:        return; }
                     78: if(!sort) {
                     79:        CRLF; }
                     80: bprintf(text[NTotalUsers],users);
                     81: if(mode==UL_SUB)
                     82:        bprintf(text[NUsersOnCurSub],j);
                     83: else if(mode==UL_DIR)
                     84:        bprintf(text[NUsersOnCurDir],j);
                     85: if(!sort)
                     86:        return;
                     87: CRLF;
                     88: qsort((void *)line,j,sizeof(line[0])
                     89:        ,(int(*)(const void*, const void*))pstrcmp);
                     90: for(i=0;i<j && !msgabort();i++)
                     91:        bputs(line[i]);
                     92: for(i=0;i<j;i++)
                     93:        FREE(line[i]);
                     94: }
                     95: 
                     96: /****************************************************************************/
                     97: /* SIF input function. See SIF.DOC for more info                                               */
                     98: /****************************************************************************/
                     99: void sif(char *fname, char *answers, long len)
                    100: {
                    101:        char str[256],template[256],HUGE16 *buf,t,max,min,mode,cr;
                    102:        int file;
                    103:        ulong length,l=0,m,top,a=0;
                    104: 
                    105: sprintf(str,"%s%s.SIF",text_dir,strupr(fname));
                    106: if((file=nopen(str,O_RDONLY))==-1) {
                    107:        errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    108:        answers[0]=0;
                    109:        return; }
                    110: length=filelength(file);
                    111: if((buf=(char *)MALLOC(length))==0) {
                    112:        close(file);
                    113:        errormsg(WHERE,ERR_ALLOC,str,length);
                    114:        answers[0]=0;
                    115:        return; }
                    116: if(lread(file,buf,length)!=length) {
                    117:        close(file);
                    118:        errormsg(WHERE,ERR_READ,str,length);
                    119:        answers[0]=0;
                    120:        return; }
                    121: close(file);
                    122: while(l<length && online) {
                    123:        mode=min=max=t=cr=0;
                    124:        top=l;
                    125:        while(l<length && buf[l++]!=STX);
                    126:        for(m=l;m<length;m++)
                    127:                if(buf[m]==ETX || !buf[m]) {
                    128:                        buf[m]=0;
                    129:                        break; }
                    130:        if(l>=length) break;
                    131:        if(online==ON_REMOTE) {
                    132:                rioctl(IOCM|ABORT);
                    133:                rioctl(IOCS|ABORT); }
                    134:        putmsg(buf+l,P_SAVEATR);
                    135:        m++;
                    136:        if(toupper(buf[m])!='C' && toupper(buf[m])!='S')
                    137:         continue;
                    138:        SYNC;
                    139:        if(online==ON_REMOTE)
                    140:                rioctl(IOSM|ABORT);
                    141:        if(a>=len) {
                    142:                errormsg(WHERE,ERR_LEN,fname,len);
                    143:                break; }
                    144:        if((buf[m]&0xdf)=='C') {
                    145:        if((buf[m+1]&0xdf)=='U') {              /* Uppercase only */
                    146:                        mode|=K_UPPER;
                    147:                        m++; }
                    148:                else if((buf[m+1]&0xdf)=='N') { /* Numbers only */
                    149:                        mode|=K_NUMBER;
                    150:                        m++; }
                    151:                if((buf[m+1]&0xdf)=='L') {              /* Draw line */
                    152:                if(useron.misc&COLOR)
                    153:                                attr(color[clr_inputline]);
                    154:                        else
                    155:                                attr(BLACK|(LIGHTGRAY<<4));
                    156:                        bputs(" \b");
                    157:                        m++; }
                    158:                if((buf[m+1]&0xdf)=='R') {              /* Add CRLF */
                    159:                        cr=1;
                    160:                        m++; }
                    161:                if(buf[m+1]=='"') {
                    162:                        m+=2;
                    163:                        for(l=m;l<length;l++)
                    164:                                if(buf[l]=='"') {
                    165:                                        buf[l]=0;
                    166:                                        break; }
                    167:                        answers[a++]=getkeys((char *)buf+m,0); }
                    168:                else {
                    169:                        answers[a]=getkey(mode);
                    170:                        outchar(answers[a++]);
                    171:                        attr(LIGHTGRAY);
                    172:                        CRLF; }
                    173:                if(cr) {
                    174:                        answers[a++]=CR;
                    175:                        answers[a++]=LF; } }
                    176:        else if((buf[m]&0xdf)=='S') {           /* String */
                    177:                if((buf[m+1]&0xdf)=='U') {              /* Uppercase only */
                    178:                        mode|=K_UPPER;
                    179:                        m++; }
                    180:                else if((buf[m+1]&0xdf)=='F') { /* Force Upper/Lowr case */
                    181:                        mode|=K_UPRLWR;
                    182:                        m++; }
                    183:                else if((buf[m+1]&0xdf)=='N') { /* Numbers only */
                    184:                        mode|=K_NUMBER;
                    185:                        m++; }
                    186:                if((buf[m+1]&0xdf)=='L') {              /* Draw line */
                    187:                        mode|=K_LINE;
                    188:                        m++; }
                    189:                if((buf[m+1]&0xdf)=='R') {              /* Add CRLF */
                    190:                        cr=1;
                    191:                        m++; }
                    192:                if(isdigit(buf[m+1])) {
                    193:                        max=buf[++m]&0xf;
                    194:                        if(isdigit(buf[m+1]))
                    195:                                max=max*10+(buf[++m]&0xf); }
                    196:                if(buf[m+1]=='.' && isdigit(buf[m+2])) {
                    197:                        m++;
                    198:                        min=buf[++m]&0xf;
                    199:                        if(isdigit(buf[m+1]))
                    200:                                min=min*10+(buf[++m]&0xf); }
                    201:                if(buf[m+1]=='"') {
                    202:                        m++;
                    203:                        mode&=~K_NUMBER;
                    204:                        while(buf[++m]!='"' && t<80)
                    205:                                template[t++]=buf[m];
                    206:                        template[t]=0;
                    207:                        max=strlen(template); }
                    208:                if(t) {
                    209:                        if(gettmplt(str,template,mode)<min) {
                    210:                                l=top;
                    211:                                continue; } }
                    212:                else {
                    213:                        if(!max)
                    214:                                continue;
                    215:                        if(getstr(str,max,mode)<min) {
                    216:                                l=top;
                    217:                                continue; } }
                    218:                if(!cr) {
                    219:                        for(cr=0;str[cr];cr++)
                    220:                                answers[a+cr]=str[cr];
                    221:                        while(cr<max)
                    222:                                answers[a+cr++]=ETX;
                    223:                        a+=max; }
                    224:                else {
                    225:                        putrec(answers,a,max,str);
                    226:                        putrec(answers,a+max,2,crlf);
                    227:                        a+=max+2; } } }
                    228: answers[a]=0;
                    229: FREE((char *)buf);
                    230: }
                    231: 
                    232: /****************************************************************************/
                    233: /* SIF output function. See SIF.DOC for more info                                              */
                    234: /****************************************************************************/
                    235: void sof(char *fname, char *answers, long len)
                    236: {
                    237:        char str[256],HUGE16 *buf,max,min,cr;
                    238:        int file;
                    239:        ulong length,l=0,m,a=0;
                    240: 
                    241: sprintf(str,"%s%s.SIF",text_dir,strupr(fname));
                    242: if((file=nopen(str,O_RDONLY))==-1) {
                    243:        errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    244:        answers[0]=0;
                    245:        return; }
                    246: length=filelength(file);
                    247: if((buf=(char *)MALLOC(length))==0) {
                    248:        close(file);
                    249:        errormsg(WHERE,ERR_ALLOC,str,length);
                    250:        answers[0]=0;
                    251:        return; }
                    252: if(lread(file,buf,length)!=length) {
                    253:        close(file);
                    254:        errormsg(WHERE,ERR_READ,str,length);
                    255:        answers[0]=0;
                    256:        return; }
                    257: close(file);
                    258: while(l<length && online) {
                    259:        min=max=cr=0;
                    260:        while(l<length && buf[l++]!=STX);
                    261:        for(m=l;m<length;m++)
                    262:                if(buf[m]==ETX || !buf[m]) {
                    263:                        buf[m]=0;
                    264:                        break; }
                    265:        if(l>=length) break;
                    266:        if(online==ON_REMOTE) {
                    267:                rioctl(IOCM|ABORT);
                    268:                rioctl(IOCS|ABORT); }
                    269:        putmsg(buf+l,P_SAVEATR);
                    270:        m++;
                    271:        if(toupper(buf[m])!='C' && toupper(buf[m])!='S')
                    272:                continue;
                    273:        SYNC;
                    274:        if(online==ON_REMOTE)
                    275:                rioctl(IOSM|ABORT);
                    276:        if(a>=len) {
                    277:                bprintf("\r\nSOF: %s defined more data than buffer size "
                    278:                        "(%lu bytes)\r\n",fname,len);
                    279:                break; }
                    280:        if((buf[m]&0xdf)=='C') {
                    281:                if((buf[m+1]&0xdf)=='U')                /* Uppercase only */
                    282:                        m++;
                    283:                else if((buf[m+1]&0xdf)=='N')   /* Numbers only */
                    284:                        m++;
                    285:                if((buf[m+1]&0xdf)=='L') {              /* Draw line */
                    286:                if(useron.misc&COLOR)
                    287:                                attr(color[clr_inputline]);
                    288:                        else
                    289:                                attr(BLACK|(LIGHTGRAY<<4));
                    290:                        bputs(" \b");
                    291:                        m++; }
                    292:                if((buf[m+1]&0xdf)=='R') {              /* Add CRLF */
                    293:                        cr=1;
                    294:                        m++; }
                    295:                outchar(answers[a++]);
                    296:                attr(LIGHTGRAY);
                    297:                CRLF;
                    298:                if(cr)
                    299:                        a+=2; }
                    300:        else if((buf[m]&0xdf)=='S') {           /* String */
                    301:                if((buf[m+1]&0xdf)=='U')
                    302:                        m++;
                    303:                else if((buf[m+1]&0xdf)=='F')
                    304:                        m++;
                    305:                else if((buf[m+1]&0xdf)=='N')   /* Numbers only */
                    306:                        m++;
                    307:                if((buf[m+1]&0xdf)=='L') {
                    308:                if(useron.misc&COLOR)
                    309:                                attr(color[clr_inputline]);
                    310:                        else
                    311:                                attr(BLACK|(LIGHTGRAY<<4));
                    312:                        m++; }
                    313:                if((buf[m+1]&0xdf)=='R') {
                    314:                        cr=1;
                    315:                        m++; }
                    316:                if(isdigit(buf[m+1])) {
                    317:                        max=buf[++m]&0xf;
                    318:                        if(isdigit(buf[m+1]))
                    319:                                max=max*10+(buf[++m]&0xf); }
                    320:                if(buf[m+1]=='.' && isdigit(buf[m+2])) {
                    321:                        m++;
                    322:                        min=buf[++m]&0xf;
                    323:                        if(isdigit(buf[m+1]))
                    324:                                min=min*10+(buf[++m]&0xf); }
                    325:                if(buf[m+1]=='"') {
                    326:                        max=0;
                    327:                        m++;
                    328:                        while(buf[++m]!='"' && max<80)
                    329:                                max++; }
                    330:                if(!max)
                    331:                        continue;
                    332:                getrec(answers,a,max,str);
                    333:                bputs(str);
                    334:                attr(LIGHTGRAY);
                    335:                CRLF;
                    336:                if(!cr)
                    337:                        a+=max;
                    338:                else
                    339:                        a+=max+2; } }
                    340: FREE((char *)buf);
                    341: }
                    342: 
                    343: /****************************************************************************/
                    344: /* Creates data file 'datfile' from input via sif file 'siffile'            */
                    345: /****************************************************************************/
                    346: void create_sif_dat(char *siffile, char *datfile)
                    347: {
                    348:        char *buf;
                    349:        int file;
                    350: 
                    351: if((buf=(char *)MALLOC(SIF_MAXBUF))==NULL) {
                    352:        errormsg(WHERE,ERR_ALLOC,siffile,SIF_MAXBUF);
                    353:        return; }
                    354: memset(buf,SIF_MAXBUF,0);       /* initialize to null */
                    355: sif(siffile,buf,SIF_MAXBUF);
                    356: if((file=nopen(datfile,O_WRONLY|O_TRUNC|O_CREAT))==-1) {
                    357:        FREE(buf);
                    358:        errormsg(WHERE,ERR_OPEN,datfile,O_WRONLY|O_TRUNC|O_CREAT);
                    359:        return; }
                    360: write(file,buf,strlen(buf));
                    361: close(file);
                    362: FREE(buf);
                    363: }
                    364: 
                    365: /****************************************************************************/
                    366: /* Reads data file 'datfile' and displays output via sif file 'siffile'     */
                    367: /****************************************************************************/
                    368: void read_sif_dat(char *siffile, char *datfile)
                    369: {
                    370:        char *buf;
                    371:        int file;
                    372:        long length;
                    373: 
                    374: if((file=nopen(datfile,O_RDONLY))==-1) {
                    375:        errormsg(WHERE,ERR_OPEN,datfile,O_RDONLY);
                    376:        return; }
                    377: length=filelength(file);
                    378: if(!length) {
                    379:        close(file);
                    380:        return; }
                    381: if((buf=(char *)MALLOC(length))==NULL) {
                    382:        close(file);
                    383:        errormsg(WHERE,ERR_ALLOC,datfile,length);
                    384:        return; }
                    385: read(file,buf,length);
                    386: close(file);
                    387: sof(siffile,buf,length);
                    388: FREE(buf);
                    389: }
                    390: 
                    391: /****************************************************************************/
                    392: /* Get string by template. A=Alpha, N=Number, !=Anything                    */
                    393: /* First character MUST be an A,N or !.                                     */
                    394: /* Modes - K_LINE and K_UPPER are supported.                                */
                    395: /****************************************************************************/
                    396: char gettmplt(char *strout,char *template,int mode)
                    397: {
                    398:        uchar t=strlen(template),c=0,ch,str[256];
                    399: 
                    400: sys_status&=~SS_ABORT;
                    401: strupr(template);
                    402: if(useron.misc&ANSI) {
                    403:        if(mode&K_LINE) {
                    404:                if(useron.misc&COLOR)
                    405:             attr(color[clr_inputline]);
                    406:                else
                    407:                        attr(BLACK|(LIGHTGRAY<<4)); }
                    408:        while(c<t) {
                    409:                if(template[c]=='N' || template[c]=='A' || template[c]=='!')
                    410:                        outchar(SP);
                    411:                else
                    412:                        outchar(template[c]);
                    413:                c++; }
                    414:        bprintf("\x1b[%dD",t); }
                    415: c=0;
                    416: if(mode&K_EDIT) {
                    417:        strcpy(str,strout);
                    418:        bputs(str);
                    419:        c=strlen(str); }
                    420: while((ch=getkey(mode))!=CR && online && !(sys_status&SS_ABORT)) {
                    421:        if(ch==BS) {
                    422:                if(!c)
                    423:                        continue;
                    424:                for(ch=1,c--;c;c--,ch++)
                    425:                        if(template[c]=='N' || template[c]=='A' || template[c]=='!')
                    426:                                break;
                    427:                if(useron.misc&ANSI)
                    428:                        bprintf("\x1b[%dD",ch);
                    429:                else while(ch--)
                    430:                        outchar(BS);
                    431:                bputs(" \b");
                    432:                continue; }
                    433:        if(ch==24) {    /* Ctrl-X */
                    434:                for(c--;c!=0xff;c--) {
                    435:                        outchar(BS);
                    436:                        if(template[c]=='N' || template[c]=='A' || template[c]=='!')
                    437:                                bputs(" \b"); }
                    438:                c=0; }
                    439:        else if(c<t) {
                    440:                if(template[c]=='N' && !isdigit(ch))
                    441:                        continue;
                    442:                if(template[c]=='A' && !isalpha(ch))
                    443:                        continue;
                    444:                outchar(ch);
                    445:                str[c++]=ch;
                    446:                while(c<t && template[c]!='N' && template[c]!='A' && template[c]!='!'){
                    447:                        str[c]=template[c];
                    448:                        outchar(template[c++]); } } }
                    449: str[c]=0;
                    450: attr(LIGHTGRAY);
                    451: CRLF;
                    452: if(!(sys_status&SS_ABORT))
                    453:        strcpy(strout,str);
                    454: return(c);
                    455: }
                    456: 
                    457: /*****************************************************************************/
                    458: /* Accepts a user's input to change a new-scan time pointer                  */
                    459: /* Returns 0 if input was aborted or invalid, 1 if complete                                     */
                    460: /*****************************************************************************/
                    461: char inputnstime(time_t *dt)
                    462: {
                    463:        int hour;
                    464:        struct date tmpdate;
                    465:        struct time tmptime;
                    466:        char pm,str[256];
                    467: 
                    468: bputs(text[NScanDate]);
                    469: bputs(timestr(dt));
                    470: CRLF;
                    471: unixtodos(*dt,&tmpdate,&tmptime);
                    472: bputs(text[NScanYear]);
                    473: itoa(tmpdate.da_year,str,10);
                    474: if(!getstr(str,4,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) {
                    475:        CRLF;
                    476:        return(0); }
                    477: tmpdate.da_year=atoi(str);
                    478: if(tmpdate.da_year<1970) {
                    479:        CRLF;
                    480:        return(0); }
                    481: bputs(text[NScanMonth]);
                    482: itoa(tmpdate.da_mon,str,10);
                    483: if(!getstr(str,2,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) {
                    484:        CRLF;
                    485:        return(0); }
                    486: tmpdate.da_mon=atoi(str);
                    487: if(tmpdate.da_mon<1 || tmpdate.da_mon>12) {
                    488:        CRLF;
                    489:        return(0); }
                    490: bputs(text[NScanDay]);
                    491: itoa(tmpdate.da_day,str,10);
                    492: if(!getstr(str,2,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) {
                    493:        CRLF;
                    494:        return(0); }
                    495: tmpdate.da_day=atoi(str);
                    496: if(tmpdate.da_day<1 || tmpdate.da_day>31) {
                    497:        CRLF;
                    498:        return(0); }
                    499: bputs(text[NScanHour]);
                    500: if(sys_misc&SM_MILITARY)
                    501:        hour=tmptime.ti_hour;
                    502: else {
                    503:        if(tmptime.ti_hour==0) {        /* 12 midnite */
                    504:                pm=0;
                    505:                hour=12; }
                    506:        else if(tmptime.ti_hour>12) {
                    507:                hour=tmptime.ti_hour-12;
                    508:                pm=1; }
                    509:        else {
                    510:                hour=tmptime.ti_hour;
                    511:                pm=0; } }
                    512: itoa(hour,str,10);
                    513: if(!getstr(str,2,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) {
                    514:        CRLF;
                    515:        return(0); }
                    516: 
                    517: tmptime.ti_hour=atoi(str);
                    518: if(tmptime.ti_hour>24) {
                    519:        CRLF;
                    520:        return(0); }
                    521: bputs(text[NScanMinute]);
                    522: itoa(tmptime.ti_min,str,10);
                    523: if(!getstr(str,2,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) {
                    524:        CRLF;
                    525:        return(0); }
                    526: 
                    527: tmptime.ti_min=atoi(str);
                    528: if(tmptime.ti_min>59) {
                    529:        CRLF;
                    530:        return(0); }
                    531: tmptime.ti_sec=0;
                    532: if(!(sys_misc&SM_MILITARY) && tmptime.ti_hour && tmptime.ti_hour<13) {
                    533:        if(pm && yesno(text[NScanPmQ])) {
                    534:                        if(tmptime.ti_hour<12)
                    535:                                tmptime.ti_hour+=12; }
                    536:        else if(!pm && !yesno(text[NScanAmQ])) {
                    537:                        if(tmptime.ti_hour<12)
                    538:                                tmptime.ti_hour+=12; }
                    539:        else if(tmptime.ti_hour==12)
                    540:                tmptime.ti_hour=0; }
                    541: else {
                    542:        CRLF; }
                    543: *dt=dostounix(&tmpdate,&tmptime);
                    544: return(1);
                    545: }
                    546: 
                    547: /*****************************************************************************/
                    548: /* Checks a password for uniqueness and validity                              */
                    549: /*****************************************************************************/
                    550: char chkpass(char *pass, user_t user)
                    551: {
                    552:        char c,d,first[128],last[128],sysop[41],sysname[41],*p;
                    553: 
                    554: if(strlen(pass)<4) {
                    555:        bputs(text[PasswordTooShort]);
                    556:        return(0); }
                    557: if(!strcmp(pass,user.pass)) {
                    558:        bputs(text[PasswordNotChanged]);
                    559:        return(0); }
                    560: d=strlen(pass);
                    561: for(c=1;c<d;c++)
                    562:        if(pass[c]!=pass[c-1])
                    563:                break;
                    564: if(c==d) {
                    565:        bputs(text[PasswordInvalid]);
                    566:        return(0); }
                    567: for(c=0;c<3;c++)       /* check for 1234 and ABCD */
                    568:        if(pass[c]!=pass[c+1]+1)
                    569:                break;
                    570: if(c==3) {
                    571:        bputs(text[PasswordObvious]);
                    572:        return(0); }
                    573: for(c=0;c<3;c++)       /* check for 4321 and ZYXW */
                    574:        if(pass[c]!=pass[c+1]-1)
                    575:                break;
                    576: if(c==3) {
                    577:        bputs(text[PasswordObvious]);
                    578:     return(0); }
                    579: strupr(user.name);
                    580: strupr(user.alias);
                    581: strcpy(first,user.alias);
                    582: p=strchr(first,SP);
                    583: if(p) {
                    584:        *p=0;
                    585:        strcpy(last,p+1); }
                    586: else
                    587:        last[0]=0;
                    588: strupr(user.handle);
                    589: strcpy(sysop,sys_op);
                    590: strupr(sysop);
                    591: strcpy(sysname,sys_name);
                    592: strupr(sysname);
                    593: if((user.pass[0]
                    594:                && (strstr(pass,user.pass) || strstr(user.pass,pass)))
                    595:        || (user.name[0]
                    596:                && (strstr(pass,user.name) || strstr(user.name,pass)))
                    597:        || strstr(pass,user.alias) || strstr(user.alias,pass)
                    598:        || strstr(pass,first) || strstr(first,pass)
                    599:        || (last[0]
                    600:                && (strstr(pass,last) || strstr(last,pass)))
                    601:        || strstr(pass,user.handle) || strstr(user.handle,pass)
                    602:        || (user.zipcode[0]
                    603:                && (strstr(pass,user.zipcode) || strstr(user.zipcode,pass)))
                    604:        || (sysname[0]
                    605:                && (strstr(pass,sysname) || strstr(sysname,pass)))
                    606:        || (sysop[0]
                    607:                && (strstr(pass,sysop) || strstr(sysop,pass)))
                    608:        || (sys_id[0]
                    609:                && (strstr(pass,sys_id) || strstr(sys_id,pass)))
                    610:        || (node_phone[0] && strstr(pass,node_phone))
                    611:        || (user.phone[0] && strstr(user.phone,pass))
                    612:        || !strncmp(pass,"QWER",3)
                    613:        || !strncmp(pass,"ASDF",3)
                    614:        || !strncmp(pass,"!@#$",3)
                    615:        )
                    616:        {
                    617:        bputs(text[PasswordObvious]);
                    618:        return(0); }
                    619: return(1);
                    620: }
                    621: 
                    622: /****************************************************************************/
                    623: /* Prompts user for detailed information regarding their computer                      */
                    624: /* and places that information into 'computer'                                                         */
                    625: /* Called from function newuser                                                                                                */
                    626: /****************************************************************************/
                    627: void getcomputer(char *computer)
                    628: {
                    629:        char str[256];
                    630: 
                    631: if(!(uq&UQ_MC_COMP)) {
                    632:        while(online) {
                    633:                bputs(text[EnterYourComputer]);
                    634:                if(getstr(computer,LEN_COMP,K_LINE))
                    635:                        break; }
                    636:        return; }
                    637: bputs(text[ComputerTypeMenu]);
                    638: bputs(text[ComputerTypePrompt]);
                    639: switch(getkeys("ABCDE",0)) {
                    640:        case 'A':
                    641:                sif("COMPUTER",str,8);
                    642:                if(!online) return;
                    643:                switch(str[0]) {
                    644:                        case 'A':
                    645:                                strcpy(computer,"XT");
                    646:                                break;
                    647:                        case 'B':
                    648:                                strcpy(computer,"286");
                    649:                                break;
                    650:                        case 'C':
                    651:                                strcpy(computer,"386SX");
                    652:                                break;
                    653:                        case 'D':
                    654:                                strcpy(computer,"386DX");
                    655:                                break;
                    656:                        case 'E':
                    657:                                strcpy(computer,"486");
                    658:                                break; }
                    659:                switch(str[1]) {
                    660:                        case 'A':
                    661:                                strcat(computer,"-4 ");
                    662:                                break;
                    663:                        case 'B':
                    664:                                strcat(computer,"-6 ");
                    665:                                break;
                    666:                        case 'C':
                    667:                                strcat(computer,"-8 ");
                    668:                                break;
                    669:                        case 'D':
                    670:                                strcat(computer,"-10 ");
                    671:                                break;
                    672:                        case 'E':
                    673:                                strcat(computer,"-12 ");
                    674:                                break;
                    675:                        case 'F':
                    676:                                strcat(computer,"-16 ");
                    677:                                break;
                    678:                        case 'G':
                    679:                                strcat(computer,"-20 ");
                    680:                                break;
                    681:                        case 'H':
                    682:                                strcat(computer,"-25 ");
                    683:                                break;
                    684:                        case 'I':
                    685:                                strcat(computer,"-33 ");
                    686:                                break;
                    687:                        case 'J':
                    688:                                strcat(computer,"-40 ");
                    689:                                break;
                    690:                        case 'K':
                    691:                                strcat(computer,"-50 ");
                    692:                                break; }
                    693:                switch(str[2]) {
                    694:                        case 'A':
                    695:                                strcat(computer,"8bit ");
                    696:                                break;
                    697:                        case 'B':
                    698:                                strcat(computer,"ISA ");
                    699:                                break;
                    700:                        case 'C':
                    701:                                strcat(computer,"MCA ");
                    702:                                break;
                    703:                        case 'D':
                    704:                                strcat(computer,"EISA ");
                    705:                                break; }
                    706:                switch(str[3]) {
                    707:                        case 'A':
                    708:                                strcat(computer,"MDA ");
                    709:                                break;
                    710:                        case 'B':
                    711:                                strcat(computer,"HERC ");
                    712:                                break;
                    713:                        case 'C':
                    714:                                strcat(computer,"CGA ");
                    715:                                break;
                    716:                        case 'D':
                    717:                                strcat(computer,"EGA ");
                    718:                                break;
                    719:                        case 'E':
                    720:                                strcat(computer,"MCGA ");
                    721:                                break;
                    722:                        case 'F':
                    723:                                strcat(computer,"VGA ");
                    724:                                break;
                    725:                        case 'G':
                    726:                                strcat(computer,"SVGA ");
                    727:                                break;
                    728:                        case 'H':
                    729:                                strcat(computer,"MVGA ");
                    730:                                break;
                    731:                        case 'I':
                    732:                                strcat(computer,"8514 ");
                    733:                                break;
                    734:                        case 'J':
                    735:                                strcat(computer,"XGA ");
                    736:                                break;
                    737:                        case 'K':
                    738:                                strcat(computer,"TIGA ");
                    739:                                break; }
                    740:                switch(str[4]) {
                    741:                        case 'A':
                    742:                                strcat(computer,"<1 ");
                    743:                                break;
                    744:                        case 'B':
                    745:                                strcat(computer,"1 ");
                    746:                                break;
                    747:                        case 'C':
                    748:                                strcat(computer,"2 ");
                    749:                                break;
                    750:                        case 'D':
                    751:                                strcat(computer,"3 ");
                    752:                                break;
                    753:                        case 'E':
                    754:                                strcat(computer,"4 ");
                    755:                                break;
                    756:                        case 'F':
                    757:                                strcat(computer,"5 ");
                    758:                                break;
                    759:                        case 'G':
                    760:                                strcat(computer,"6 ");
                    761:                                break;
                    762:                        case 'H':
                    763:                                strcat(computer,"8 ");
                    764:                                break;
                    765:                        case 'I':
                    766:                                strcat(computer,"10 ");
                    767:                                break;
                    768:                        case 'J':
                    769:                                strcat(computer,"12 ");
                    770:                                break;
                    771:                        case 'K':
                    772:                                strcat(computer,"16 ");
                    773:                                break;
                    774:                        case 'L':
                    775:                                strcat(computer,"18 ");
                    776:                                break;
                    777:                        case 'M':
                    778:                                strcat(computer,"24 ");
                    779:                                break;
                    780:                        case 'N':
                    781:                                strcat(computer,"32 ");
                    782:                                break;
                    783:                        case 'O':
                    784:                                strcat(computer,"64 ");
                    785:                                break; }
                    786:                switch(str[5]) {
                    787:                        case 'A':
                    788:                                strcat(computer,"0 ");
                    789:                                break;
                    790:                        case 'B':
                    791:                                strcat(computer,"10 ");
                    792:                                break;
                    793:                        case 'C':
                    794:                                strcat(computer,"20 ");
                    795:                                break;
                    796:                        case 'D':
                    797:                                strcat(computer,"30 ");
                    798:                                break;
                    799:                        case 'E':
                    800:                                strcat(computer,"40 ");
                    801:                                break;
                    802:                        case 'F':
                    803:                                strcat(computer,"60 ");
                    804:                                break;
                    805:                        case 'G':
                    806:                                strcat(computer,"80 ");
                    807:                                break;
                    808:                        case 'H':
                    809:                                strcat(computer,"100 ");
                    810:                                break;
                    811:                        case 'I':
                    812:                                strcat(computer,"120 ");
                    813:                                break;
                    814:                        case 'J':
                    815:                                strcat(computer,"150 ");
                    816:                                break;
                    817:                        case 'K':
                    818:                                strcat(computer,"200 ");
                    819:                                break;
                    820:                        case 'L':
                    821:                                strcat(computer,"250 ");
                    822:                                break;
                    823:                        case 'M':
                    824:                                strcat(computer,"300 ");
                    825:                                break;
                    826:                        case 'N':
                    827:                                strcat(computer,"400 ");
                    828:                                break;
                    829:                        case 'O':
                    830:                                strcat(computer,"500 ");
                    831:                                break;
                    832:                        case 'P':
                    833:                                strcat(computer,"600 ");
                    834:                                break;
                    835:                        case 'Q':
                    836:                                strcat(computer,"700 ");
                    837:                                break;
                    838:                        case 'R':
                    839:                                strcat(computer,"800 ");
                    840:                                break;
                    841:                        case 'S':
                    842:                                strcat(computer,"900 ");
                    843:                                break;
                    844:                        case 'T':
                    845:                                strcat(computer,"1GB ");
                    846:                                break; }
                    847:                switch(str[6]) {
                    848:                        case 'A':
                    849:                                strcat(computer,"ST506");
                    850:                                break;
                    851:                        case 'B':
                    852:                                strcat(computer,"SCSI");
                    853:                                break;
                    854:                        case 'C':
                    855:                                strcat(computer,"SCSI2");
                    856:                                break;
                    857:                        case 'D':
                    858:                                strcat(computer,"ESDI");
                    859:                                break;
                    860:                        case 'E':
                    861:                                strcat(computer,"IDE"); }
                    862:                break;
                    863:        case 'B':
                    864:                sprintf(computer,"%.*s",LEN_COMP,text[ComputerTypeB]);
                    865:                return;
                    866:        case 'C':
                    867:                sprintf(computer,"%.*s",LEN_COMP,text[ComputerTypeC]);
                    868:                return;
                    869:        case 'D':
                    870:                sprintf(computer,"%.*s",LEN_COMP,text[ComputerTypeD]);
                    871:                return;
                    872:        case 'E':
                    873:                sprintf(computer,"%.*s",LEN_COMP,text[ComputerTypeE]);
                    874:                return; }
                    875: }
                    876: 
                    877: /****************************************************************************/
                    878: /* Displays information about sub-board subnum                                                         */
                    879: /****************************************************************************/
                    880: void subinfo(uint subnum)
                    881: {
                    882:        char str[256];
                    883: 
                    884: bputs(text[SubInfoHdr]);
                    885: bprintf(text[SubInfoLongName],sub[subnum]->lname);
                    886: bprintf(text[SubInfoShortName],sub[subnum]->sname);
                    887: bprintf(text[SubInfoQWKName],sub[subnum]->qwkname);
                    888: bprintf(text[SubInfoMaxMsgs],sub[subnum]->maxmsgs);
                    889: if(sub[subnum]->misc&SUB_QNET)
                    890:        bprintf(text[SubInfoTagLine],sub[subnum]->tagline);
                    891: if(sub[subnum]->misc&SUB_FIDO)
                    892:        bprintf(text[SubInfoFidoNet]
                    893:                ,sub[subnum]->origline
                    894:                ,faddrtoa(sub[subnum]->faddr));
                    895: sprintf(str,"%s%s.MSG",sub[subnum]->data_dir,sub[subnum]->code);
                    896: if(fexist(str) && yesno(text[SubInfoViewFileQ]))
                    897:        printfile(str,0);
                    898: }
                    899: 
                    900: /****************************************************************************/
                    901: /* Displays information about transfer directory dirnum                                        */
                    902: /****************************************************************************/
                    903: void dirinfo(uint dirnum)
                    904: {
                    905:        char str[256];
                    906: 
                    907: bputs(text[DirInfoHdr]);
                    908: bprintf(text[DirInfoLongName],dir[dirnum]->lname);
                    909: bprintf(text[DirInfoShortName],dir[dirnum]->sname);
                    910: if(dir[dirnum]->exts[0])
                    911:        bprintf(text[DirInfoAllowedExts],dir[dirnum]->exts);
                    912: bprintf(text[DirInfoMaxFiles],dir[dirnum]->maxfiles);
                    913: sprintf(str,"%s%s.MSG",dir[dirnum]->data_dir,dir[dirnum]->code);
                    914: if(fexist(str) && yesno(text[DirInfoViewFileQ]))
                    915:        printfile(str,0);
                    916: }
                    917: 
                    918: /****************************************************************************/
                    919: /* Searches the file <name>.CAN in the TEXT directory for matches                      */
                    920: /* Returns 1 if found in list, 0 if not.                                                                       */
                    921: /****************************************************************************/
                    922: char trashcan(char *insearch, char *name)
                    923: {
                    924:        char str[256],search[256],c,found=0;
                    925:        int file;
                    926:        FILE *stream;
                    927: 
                    928: sprintf(str,"%s%s.CAN",text_dir,name);
                    929: if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
                    930:        if(fexist(str))
                    931:                errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    932:        return(0); }
                    933: strcpy(search,insearch);
                    934: strupr(search);
                    935: while(!feof(stream) && !ferror(stream) && !found) {
                    936:        if(!fgets(str,81,stream))
                    937:                break;
                    938:        truncsp(str);
                    939:        c=strlen(str);
                    940:        if(c) {
                    941:                c--;
                    942:                strupr(str);
                    943:                if(str[c]=='~') {
                    944:                        str[c]=0;
                    945:                        if(strstr(search,str))
                    946:                                found=1; }
                    947: 
                    948:                else if(str[c]=='^') {
                    949:                        str[c]=0;
                    950:                        if(!strncmp(str,search,c))
                    951:                                found=1; }
                    952: 
                    953:                else if(!strcmp(str,search))
                    954:                        found=1; } }
                    955: fclose(stream);
                    956: if(found) {
                    957:        sprintf(str,"%sBAD%s.MSG",text_dir,name);
                    958:        if(fexist(str))
                    959:                printfile(str,0);
                    960:        return(1); }
                    961: return(0);
                    962: }
                    963: 
                    964: /****************************************************************************/
                    965: /* Error handling routine. Prints to local and remote screens the error     */
                    966: /* information, function, action, object and access and then attempts to    */
                    967: /* write the error information into the file ERROR.LOG and NODE.LOG         */
                    968: /****************************************************************************/
                    969: void errormsg(int line, char *source, char action, char *object, ulong access)
                    970: {
                    971:     char str[512];
                    972:     char actstr[256];
                    973: 
                    974: switch(action) {
                    975:     case ERR_OPEN:
                    976:         strcpy(actstr,"opening");
                    977:         break;
                    978:     case ERR_CLOSE:
                    979:                strcpy(actstr,"closing");
                    980:         break;
                    981:     case ERR_FDOPEN:
                    982:         strcpy(actstr,"fdopen");
                    983:         break;
                    984:     case ERR_READ:
                    985:         strcpy(actstr,"reading");
                    986:         break;
                    987:     case ERR_WRITE:
                    988:         strcpy(actstr,"writing");
                    989:         break;
                    990:     case ERR_REMOVE:
                    991:         strcpy(actstr,"removing");
                    992:         break;
                    993:     case ERR_ALLOC:
                    994:         strcpy(actstr,"allocating memory");
                    995:         break;
                    996:     case ERR_CHK:
                    997:         strcpy(actstr,"checking");
                    998:         break;
                    999:     case ERR_LEN:
                   1000:         strcpy(actstr,"checking length");
                   1001:         break;
                   1002:     case ERR_EXEC:
                   1003:         strcpy(actstr,"executing");
                   1004:         break;
                   1005:     case ERR_CHDIR:
                   1006:         strcpy(actstr,"changing directory");
                   1007:         break;
                   1008:        case ERR_CREATE:
                   1009:                strcpy(actstr,"creating");
                   1010:                break;
                   1011:        case ERR_LOCK:
                   1012:                strcpy(actstr,"locking");
                   1013:                break;
                   1014:        case ERR_UNLOCK:
                   1015:                strcpy(actstr,"unlocking");
                   1016:         break;
                   1017:     default:
                   1018:         strcpy(actstr,"UNKNOWN"); }
                   1019: bprintf("\7\r\nERROR -   action: %s",actstr);   /* tell user about error */
                   1020: bprintf("\7\r\n          object: %s",object);
                   1021: bprintf("\7\r\n          access: %ld",access);
                   1022: if(access>9 && (long)access!=-1 && (short)access!=-1 && (char)access!=-1)
                   1023:        bprintf(" (%lXh)",access);
                   1024: if(sys_misc&SM_ERRALARM) {
                   1025:        beep(500,220); beep(250,220);
                   1026:        beep(500,220); beep(250,220);
                   1027:        beep(500,220); beep(250,220);
                   1028:        nosound(); }
                   1029: bputs("\r\n\r\nThe sysop has been notified. <Hit a key>");
                   1030: getkey(0);
                   1031: CRLF;
                   1032: sprintf(str,"\r\n      file: %s\r\n      line: %d\r\n    action: %s\r\n"
                   1033:        "    object: %s\r\n    access: %ld"
                   1034:        ,source,line,actstr,object,access);
                   1035: if(access>9 && (long)access!=-1 && (short)access!=-1 && (char)access!=-1) {
                   1036:        sprintf(tmp," (%lXh)",access);
                   1037:        strcat(str,tmp); }
                   1038: if(errno) {
                   1039:        sprintf(tmp,"\r\n     errno: %d",errno);
                   1040:     strcat(str,tmp); }
                   1041: if(_doserrno && _doserrno!=errno) {
                   1042:        sprintf(tmp,"\r\n  doserrno: %d",_doserrno);
                   1043:     strcat(str,tmp); }
                   1044: errno=_doserrno=0;
                   1045: errorlog(str);
                   1046: }
                   1047: 
                   1048: /*****************************************************************************/
                   1049: /* Error logging to NODE.LOG and DATA\ERROR.LOG function                     */
                   1050: /*****************************************************************************/
                   1051: void errorlog(char *text)
                   1052: {
                   1053:        static char inside;
                   1054:     char hdr[256],str[256],tmp2[256];
                   1055:     int file;
                   1056: 
                   1057: if(inside)             /* let's not go recursive on this puppy */
                   1058:        return;
                   1059: inside=1;
                   1060: getnodedat(node_num,&thisnode,1);
                   1061: criterrs=++thisnode.errors;
                   1062: putnodedat(node_num,thisnode);
                   1063: now=time(NULL);
                   1064: logline("!!",text);
                   1065: sprintf(str,"%sERROR.LOG",data_dir);
                   1066: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
                   1067:     sprintf(tmp2,"ERROR opening/creating %s",str);
                   1068:     logline("!!",tmp2);
                   1069:        inside=0;
                   1070:     return; }
                   1071: sprintf(hdr,"%s Node %2d: %s #%d"
                   1072:     ,timestr(&now),node_num,useron.alias,useron.number);
                   1073: write(file,hdr,strlen(hdr));
                   1074: write(file,crlf,2);
                   1075: write(file,text,strlen(text));
                   1076: write(file,"\r\n\r\n",4);
                   1077: close(file);
                   1078: inside=0;
                   1079: }
                   1080: 

unix.superglobalmegacorp.com

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