Annotation of sbbs/src/sbbs3/qwknodes.c, revision 1.1

1.1     ! root        1: /* $Id: qwknodes.c,v 1.16 2005/12/04 20:41:51 rswindell Exp $ */
        !             2: 
        !             3: /* Synchronet QWKnet node list or route.dat file generator */
        !             4: 
        !             5: /****************************************************************************
        !             6:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
        !             7:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
        !             8:  *                                                                                                                                                     *
        !             9:  * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html         *
        !            10:  *                                                                                                                                                     *
        !            11:  * This program is free software; you can redistribute it and/or                       *
        !            12:  * modify it under the terms of the GNU General Public License                         *
        !            13:  * as published by the Free Software Foundation; either version 2                      *
        !            14:  * of the License, or (at your option) any later version.                                      *
        !            15:  * See the GNU General Public License for more details: gpl.txt or                     *
        !            16:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
        !            17:  *                                                                                                                                                     *
        !            18:  * Anonymous FTP access to the most recent released source is available at     *
        !            19:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
        !            20:  *                                                                                                                                                     *
        !            21:  * Anonymous CVS access to the development source and modification history     *
        !            22:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
        !            23:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
        !            24:  *     (just hit return, no password is necessary)                                                     *
        !            25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
        !            26:  *                                                                                                                                                     *
        !            27:  * For Synchronet coding style and modification guidelines, see                                *
        !            28:  * http://www.synchro.net/source.html                                                                          *
        !            29:  *                                                                                                                                                     *
        !            30:  * You are encouraged to submit any modifications (preferably in Unix diff     *
        !            31:  * format) via e-mail to [email protected]                                                                      *
        !            32:  *                                                                                                                                                     *
        !            33:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
        !            34:  ****************************************************************************/
        !            35: 
        !            36: #include "sbbs.h"
        !            37: #include "nopen.h"
        !            38: #include "crc16.h"
        !            39: #include "crc32.h"
        !            40: #include "conwrap.h"   /* kbhit */
        !            41: 
        !            42: unsigned _stklen=10000;
        !            43: smb_t          smb;
        !            44: scfg_t         cfg;
        !            45: 
        !            46: void stripctrla(uchar *str)
        !            47: {
        !            48:        uchar out[256];
        !            49:        int i,j;
        !            50: 
        !            51:        for(i=j=0;str[i] && j<sizeof(out)-1;i++) {
        !            52:                if(str[i]==CTRL_A && str[i+1]!=0)
        !            53:                        i++;
        !            54:                else
        !            55:                        out[j++]=str[i]; 
        !            56:        }
        !            57:        out[j]=0;
        !            58:        strcpy(str,out);
        !            59: }
        !            60: 
        !            61: int lputs(char* str)
        !            62: {
        !            63:     char tmp[256];
        !            64:     int i,j,k;
        !            65: 
        !            66:        j=strlen(str);
        !            67:        for(i=k=0;i<j;i++)      /* remove CRs */
        !            68:                if(str[i]==CR && str[i+1]==LF)
        !            69:                        continue;
        !            70:                else
        !            71:                        tmp[k++]=str[i];
        !            72:        tmp[k]=0;
        !            73:        return(fputs(tmp,stderr));
        !            74: }
        !            75: /****************************************************************************/
        !            76: /* Performs printf() through local assembly routines                        */
        !            77: /* Called from everywhere                                                   */
        !            78: /****************************************************************************/
        !            79: int lprintf(char *fmat, ...)
        !            80: {
        !            81:        va_list argptr;
        !            82:        char sbuf[256];
        !            83:        int chcount;
        !            84: 
        !            85:        va_start(argptr,fmat);
        !            86:        chcount=vsnprintf(sbuf,sizeof(sbuf),fmat,argptr);
        !            87:        sbuf[sizeof(sbuf)-1]=0;
        !            88:        va_end(argptr);
        !            89:        lputs(sbuf);
        !            90:        return(chcount);
        !            91: }
        !            92: void bail(int code)
        !            93: {
        !            94:        exit(code);
        !            95: }
        !            96: 
        !            97: char *loadmsgtail(smbmsg_t msg)
        !            98: {
        !            99:        char    *buf=NULL;
        !           100:        ushort  xlat;
        !           101:        int     i;
        !           102:        long    l=0,length;
        !           103: 
        !           104:        for(i=0;i<msg.hdr.total_dfields;i++) {
        !           105:                if(msg.dfield[i].type!=TEXT_TAIL)
        !           106:                        continue;
        !           107:                fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset
        !           108:                        ,SEEK_SET);
        !           109:                fread(&xlat,2,1,smb.sdt_fp);
        !           110:                if(xlat!=XLAT_NONE)             /* no translations supported */
        !           111:                        continue;
        !           112:                length=msg.dfield[i].length-2;
        !           113:                if((buf=realloc(buf,l+msg.dfield[i].length+1))==NULL)
        !           114:                        return(buf);
        !           115:                l+=fread(buf+l,1,length,smb.sdt_fp);
        !           116:                buf[l]=0; 
        !           117:        }
        !           118:        return(buf);
        !           119: }
        !           120: 
        !           121: 
        !           122: void gettag(smbmsg_t msg, char *tag)
        !           123: {
        !           124:        char *buf,*p;
        !           125: 
        !           126:        tag[0]=0;
        !           127:        buf=loadmsgtail(msg);
        !           128:        if(buf==NULL)
        !           129:                return;
        !           130:        truncsp(buf);
        !           131:        stripctrla(buf);
        !           132:        p=strrchr(buf,LF);
        !           133:        if(!p) p=buf;
        !           134:        else p++;
        !           135:        if(!strnicmp(p," � Synchronet � ",16))
        !           136:                p+=16;
        !           137:        if(!strnicmp(p," * Synchronet * ",16))
        !           138:                p+=16;
        !           139:        while(*p && *p<=' ') p++;
        !           140:        strcpy(tag,p);
        !           141:        free(buf);
        !           142: }
        !           143: 
        !           144: 
        !           145: #define FEED   (1<<0)
        !           146: #define LOCAL  (1<<1)
        !           147: #define APPEND (1<<2)
        !           148: #define TAGS   (1<<3)
        !           149: 
        !           150: #define ROUTE  (1<<1)
        !           151: #define NODES  (1<<2)
        !           152: #define USERS  (1<<3)
        !           153: 
        !           154: char *usage="\nusage: qwknodes [-opts] cmds"
        !           155:                        "\n"
        !           156:                        "\n cmds: r  =  create route.dat"
        !           157:                        "\n       u  =  create users.dat"
        !           158:                        "\n       n  =  create nodes.dat"
        !           159:                        "\n"
        !           160:                        "\n opts: f  =  format addresses for nodes that feed from this system"
        !           161:                        "\n       a  =  append existing output files"
        !           162:                        "\n       t  =  include tag lines in nodes.dat"
        !           163:                        "\n       l  =  include local users in users.dat"
        !           164:                        "\n       m# =  maximum message age set to # days"
        !           165:                        "\n";
        !           166: 
        !           167: int main(int argc, char **argv)
        !           168: {
        !           169:        char            str[256],tmp[128],tag[256],addr[256],*p;
        !           170:        int             i,j,mode=0,cmd=0,o_mode,max_age=0;
        !           171:        ushort          smm,sbl;
        !           172:        ulong           *crc=NULL,curcrc,total_crcs=0,l;
        !           173:        FILE            *route,*users,*nodes;
        !           174:        time_t          now;
        !           175:        smbmsg_t        msg;
        !           176:        char            *ctrl_dir;
        !           177:        char            revision[16];
        !           178: 
        !           179:        sscanf("$Revision: 1.16 $", "%*s %s", revision);
        !           180: 
        !           181:        fprintf(stderr,"\nSynchronet QWKnet Node/Route/User List Generator v%s-%s\n"
        !           182:                ,revision, PLATFORM_DESC);
        !           183: 
        !           184:        for(i=1;i<argc;i++)
        !           185:                for(j=0;argv[i][j];j++)
        !           186:                        switch(toupper(argv[i][j])) {
        !           187:                                case '/':
        !           188:                                case '-':
        !           189:                                        while(argv[i][++j])
        !           190:                                                switch(toupper(argv[i][j])) {
        !           191:                                                        case 'F':
        !           192:                                                                mode|=FEED;
        !           193:                                                                break;
        !           194:                                                        case 'L':
        !           195:                                                                mode|=LOCAL;
        !           196:                                                                break;
        !           197:                                                        case 'A':
        !           198:                                                                mode|=APPEND;
        !           199:                                                                break;
        !           200:                                                        case 'T':
        !           201:                                                                mode|=TAGS;
        !           202:                                                                break;
        !           203:                                                        case 'M':
        !           204:                                                                j++;
        !           205:                                                                max_age=atoi(argv[i]+j);
        !           206:                                                                while(isdigit(argv[i][j+1])) j++;
        !           207:                                                                break;
        !           208:                                                        default:
        !           209:                                                                printf(usage);
        !           210:                                                                return(1)        !           211:                                        }
        !           212:                                        j--;
        !           213:                                        break;
        !           214:                                case 'R':
        !           215:                                        cmd|=ROUTE;
        !           216:                                        break;
        !           217:                                case 'U':
        !           218:                                        cmd|=USERS;
        !           219:                                        break;
        !           220:                                case 'N':
        !           221:                                        cmd|=NODES;
        !           222:                                        break;
        !           223:                                default:
        !           224:                                        printf(usage);
        !           225:                                        return(1)        !           226:                }
        !           227: 
        !           228:        if(!cmd) {
        !           229:                printf(usage);
        !           230:                return(1)        !           231:        }
        !           232: 
        !           233:        if(mode&APPEND)
        !           234:                o_mode=O_WRONLY|O_CREAT|O_APPEND;
        !           235:        else
        !           236:                o_mode=O_WRONLY|O_CREAT|O_TRUNC;
        !           237: 
        !           238:        if(cmd&NODES)
        !           239:                if((nodes=fnopen(&i,"nodes.dat",o_mode))==NULL) {
        !           240:                        printf("\7\nError opening nodes.dat\n");
        !           241:                        return(1)        !           242:                }
        !           243: 
        !           244:        if(cmd&USERS)
        !           245:                if((users=fnopen(&i,"users.dat",o_mode))==NULL) {
        !           246:                        printf("\7\nError opening users.dat\n");
        !           247:                        return(1)        !           248:                }
        !           249: 
        !           250:        if(cmd&ROUTE)
        !           251:                if((route=fnopen(&i,"route.dat",o_mode))==NULL) {
        !           252:                        printf("\7\nError opening route.dat\n");
        !           253:                        return(1)        !           254:                }
        !           255: 
        !           256:        cfg.size=sizeof(cfg);
        !           257:        ctrl_dir=getenv("SBBSCTRL");
        !           258:        if(ctrl_dir==NULL || ctrl_dir[0]==0) {
        !           259:                ctrl_dir="/sbbs/ctrl";          /* Not set? Use default */
        !           260:                printf("!SBBSCTRL environment variable not set, using default value: %s\n\n"
        !           261:                                ,ctrl_dir);
        !           262:        }
        !           263:        SAFECOPY(cfg.ctrl_dir, ctrl_dir);
        !           264: 
        !           265:        if(!load_cfg(&cfg, NULL, TRUE, str)) {
        !           266:                printf("\7\n%s\n",str);
        !           267:        }
        !           268: 
        !           269:        now=time(NULL);
        !           270:        smm=crc16("smm",0);
        !           271:        sbl=crc16("sbl",0);
        !           272:        fprintf(stderr,"\n\n");
        !           273:        for(i=0;i<cfg.total_subs;i++) {
        !           274:                if(!(cfg.sub[i]->misc&SUB_QNET))
        !           275:                        continue;
        !           276:                fprintf(stderr,"%-*s  %s\n"
        !           277:                        ,LEN_GSNAME,cfg.grp[cfg.sub[i]->grp]->sname,cfg.sub[i]->lname);
        !           278:                sprintf(smb.file,"%s%s",cfg.sub[i]->data_dir,cfg.sub[i]->code);
        !           279:                smb.retry_time=30;
        !           280:                smb.subnum=i;
        !           281:                if((j=smb_open(&smb))!=0) {
        !           282:                        printf("smb_open returned %d\n",j);
        !           283:                        continue; 
        !           284:                }
        !           285:                if((j=smb_locksmbhdr(&smb))!=0) {
        !           286:                        printf("smb_locksmbhdr returned %d\n",j);
        !           287:                        smb_close(&smb);
        !           288:                        continue; 
        !           289:                }
        !           290:                if((j=smb_getstatus(&smb))!=0) {
        !           291:                        printf("smb_getstatus returned %d\n",j);
        !           292:                        smb_close(&smb);
        !           293:                        continue; 
        !           294:                }
        !           295:                smb_unlocksmbhdr(&smb);
        !           296:                msg.offset=smb.status.total_msgs;
        !           297:                if(!msg.offset) {
        !           298:                        smb_close(&smb);
        !           299:                        printf("Empty.\n");
        !           300:                        continue; 
        !           301:                }
        !           302:                while(!kbhit() && !ferror(smb.sid_fp) && msg.offset) {
        !           303:                        msg.offset--;
        !           304:                        fseek(smb.sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET);
        !           305:                        if(!fread(&msg.idx,1,sizeof(idxrec_t),smb.sid_fp))
        !           306:                                break;
        !           307:                        fprintf(stderr,"%-5lu\r",msg.offset+1);
        !           308:                        if(msg.idx.to==smm || msg.idx.to==sbl)
        !           309:                                continue;
        !           310:                        if(max_age && now-msg.idx.time>((ulong)max_age*24UL*60UL*60UL))
        !           311:                                continue;
        !           312:                        if((j=smb_lockmsghdr(&smb,&msg))!=0) {
        !           313:                                printf("smb_lockmsghdr returned %d\n",j);
        !           314:                                break; 
        !           315:                        }
        !           316:                        if((j=smb_getmsghdr(&smb,&msg))!=0) {
        !           317:                                printf("smb_getmsghdr returned %d\n",j);
        !           318:                                break; 
        !           319:                        }
        !           320:                        smb_unlockmsghdr(&smb,&msg);
        !           321:                        if((mode&LOCAL && msg.from_net.type==NET_NONE)
        !           322:                                || msg.from_net.type==NET_QWK) {
        !           323:                                if(msg.from_net.type!=NET_QWK)
        !           324:                                        msg.from_net.addr="";
        !           325:                                if(cmd&USERS) {
        !           326:                                        sprintf(str,"%s%s",msg.from_net.addr,msg.from);
        !           327:                                        curcrc=crc32(str,0); 
        !           328:                                }
        !           329:                                else
        !           330:                                        curcrc=crc32(msg.from_net.addr,0);
        !           331:                                for(l=0;l<total_crcs;l++)
        !           332:                                        if(curcrc==crc[l])
        !           333:                                                break;
        !           334:                                if(l==total_crcs) {
        !           335:                                        total_crcs++;
        !           336:                                        if((crc=(ulong *)realloc(crc
        !           337:                                                ,sizeof(ulong)*total_crcs))==NULL) {
        !           338:                                                printf("Error allocating %lu bytes\n"
        !           339:                                                        ,sizeof(ulong)*total_crcs);
        !           340:                                                break; 
        !           341:                                        }
        !           342:                                        crc[l]=curcrc;
        !           343:                                        if(cmd&ROUTE && msg.from_net.type==NET_QWK) {
        !           344:                                                strcpy(addr,msg.from_net.addr);
        !           345:                                                if(mode&FEED) {
        !           346:                                                        p=strrchr(addr,'/');
        !           347:                                                        if(!p)
        !           348:                                                                p=addr;
        !           349:                                                        else
        !           350:                                                                *(p++)=0;
        !           351:                                                        sprintf(str,"%s %s:%s%c%s"
        !           352:                                                                ,unixtodstr(&cfg,msg.hdr.when_written.time,tmp)
        !           353:                                                                ,p,cfg.sys_id,p==addr ? 0 : '/'
        !           354:                                                                ,addr);
        !           355:                                                        fprintf(route,"%s\r\n",str); 
        !           356:                                                }
        !           357:                                                else {
        !           358:                                                        p=strrchr(addr,'/');
        !           359:                                                        if(p) {
        !           360:                                                                *(p++)=0;
        !           361:                                                        fprintf(route,"%s %s:%.*s\r\n"
        !           362:                                                                ,unixtodstr(&cfg,msg.hdr.when_written.time,str)
        !           363:                                                                ,p
        !           364:                                                                ,(uint)(p-addr)
        !           365:                                                                ,addr); 
        !           366:                                                        } 
        !           367:                                                } 
        !           368:                                        }
        !           369:                                        if(cmd&USERS) {
        !           370:                                                if(msg.from_net.type!=NET_QWK)
        !           371:                                                        strcpy(str,cfg.sys_id);
        !           372:                                                else if(mode&FEED)
        !           373:                                                        sprintf(str,"%s/%s",cfg.sys_id,msg.from_net.addr);
        !           374:                                                else
        !           375:                                                        strcpy(str,msg.from_net.addr);
        !           376:                                                p=strrchr(str,'/');
        !           377:                                                if(p)
        !           378:                                                        fprintf(users,"%-25.25s  %-8.8s  %s  (%s)\r\n"
        !           379:                                                                ,msg.from,p+1
        !           380:                                                                ,unixtodstr(&cfg,msg.hdr.when_written.time,tmp)
        !           381:                                                                ,str);
        !           382:                                                else
        !           383:                                                        fprintf(users,"%-25.25s  %-8.8s  %s\r\n"
        !           384:                                                                ,msg.from,str
        !           385:                                                                ,unixtodstr(&cfg,msg.hdr.when_written.time,tmp)); 
        !           386:                                        }
        !           387:                                        if(cmd&NODES && msg.from_net.type==NET_QWK) {
        !           388:                                                if(mode&TAGS)
        !           389:                                                        gettag(msg,tag);
        !           390:                                                if(mode&FEED)
        !           391:                                                        sprintf(str,"%s/%s",cfg.sys_id,msg.from_net.addr);
        !           392:                                                else
        !           393:                                                        strcpy(str,msg.from_net.addr);
        !           394:                                                p=strrchr(str,'/');
        !           395:                                                if(p) {
        !           396:                                                        if(mode&TAGS)
        !           397:                                                                fprintf(nodes,"%-8.8s  %s\r\n"
        !           398:                                                                        ,p+1
        !           399:                                                                        ,tag);
        !           400:                                                        else
        !           401:                                                                fprintf(nodes,"%-8.8s  %s  (%s)\r\n"
        !           402:                                                                        ,p+1
        !           403:                                                                        ,unixtodstr(&cfg,msg.hdr.when_written.time,tmp)
        !           404:                                                                        ,str); 
        !           405:                                                }
        !           406:                                                else
        !           407:                                                        fprintf(nodes,"%-8.8s  %s\r\n"
        !           408:                                                                ,str
        !           409:                                                                ,mode&TAGS
        !           410:                                                                ? tag
        !           411:                                                                : unixtodstr(&cfg,msg.hdr.when_written.time,tmp)); 
        !           412:                                        }
        !           413:                                } 
        !           414:                        }
        !           415:                        smb_freemsgmem(&msg); 
        !           416:                }
        !           417: 
        !           418:                smb_close(&smb);
        !           419:                if(kbhit()) {
        !           420:                        getch();
        !           421:                        fprintf(stderr,"Key pressed.\n");
        !           422:                        break; 
        !           423:                } 
        !           424:        }
        !           425:        fprintf(stderr,"Done.\n");
        !           426: 
        !           427:        return(0);
        !           428: }

unix.superglobalmegacorp.com

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