Annotation of sbbs/sbbs2/uti/utiexprt.c, revision 1.1

1.1     ! root        1: /* UTIEXPRT.C */
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: #include "sbbs.h"
        !             6: #include "uti.h"
        !             7: #include "post.h"
        !             8: 
        !             9: char *nulstr="";
        !            10: smb_t smb;
        !            11: 
        !            12: ulong loadmsgs(post_t huge **post, ulong ptr)
        !            13: {
        !            14:        int i;
        !            15:        long l=0;
        !            16:        idxrec_t idx;
        !            17: 
        !            18: 
        !            19: if((i=smb_locksmbhdr(&smb))!=0) {                                /* Be sure noone deletes or */
        !            20:        errormsg(WHERE,ERR_LOCK,smb.file,i);            /* adds while we're reading */
        !            21:        return(0L); }
        !            22: 
        !            23: fseek(smb.sid_fp,0L,SEEK_SET);
        !            24: while(!feof(smb.sid_fp)) {
        !            25:        if(!fread(&idx,sizeof(idxrec_t),1,smb.sid_fp))
        !            26:         break;
        !            27: 
        !            28:        if(idx.number<ptr || idx.attr&MSG_DELETE)
        !            29:                continue;
        !            30: 
        !            31:        if(idx.attr&MSG_MODERATED && !(idx.attr&MSG_VALIDATED))
        !            32:                break;
        !            33: 
        !            34:        if(((*post)=(post_t huge *)REALLOC((*post),sizeof(post_t)*(l+1)))
        !            35:         ==NULL) {
        !            36:                smb_unlocksmbhdr(&smb);
        !            37:                errormsg(WHERE,ERR_ALLOC,smb.file,sizeof(post_t)*(l+1));
        !            38:                return(l); }
        !            39:        (*post)[l].offset=idx.offset;
        !            40:        (*post)[l].number=idx.number;
        !            41:        l++; }
        !            42: smb_unlocksmbhdr(&smb);
        !            43: return(l);
        !            44: }
        !            45: 
        !            46: 
        !            47: int main(int argc, char **argv)
        !            48: {
        !            49:        char    str[512],*buf,ch,*outbuf;
        !            50:        ushort  xlat;
        !            51:        int     i,file,tear,cr,net=0,lzh;
        !            52:        uint    subnum;
        !            53:        long    l,m,length,buflen;
        !            54:        ulong   msgnum,posts,exported=0;
        !            55:        FILE    *stream;
        !            56:        post_t  huge *post;
        !            57:        smbmsg_t msg;
        !            58:        struct  date date;
        !            59:        struct  time curtime;
        !            60: 
        !            61: PREPSCREEN;
        !            62: 
        !            63: printf("Synchronet UTIEXPRT v%s\n",VER);
        !            64: 
        !            65: if(argc<3)
        !            66:        exit(1);
        !            67: 
        !            68: if(argc>4 && !stricmp(argv[4],"/NETWORK"))
        !            69:        net=1;
        !            70: 
        !            71: uti_init("UTIEXPRT",argc,argv);
        !            72: 
        !            73: if((file=nopen(argv[3],O_CREAT|O_TRUNC|O_WRONLY))==-1)
        !            74:        bail(2);
        !            75: if((stream=fdopen(file,"wb"))==NULL)
        !            76:        bail(2);
        !            77: setvbuf(stream,0,_IOFBF,4096);
        !            78: 
        !            79: subnum=getsubnum(argv[1]);
        !            80: if((int)subnum==-1)
        !            81:        bail(7);
        !            82: msgnum=atol(argv[2]);
        !            83: 
        !            84: sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code);
        !            85: smb.retry_time=30;
        !            86: if((i=smb_open(&smb))!=0) {
        !            87:        errormsg(WHERE,ERR_OPEN,smb.file,i);
        !            88:        bail(5); }
        !            89: 
        !            90: post=NULL;
        !            91: posts=loadmsgs(&post,msgnum);
        !            92: 
        !            93: printf("\nExporting\n\n");
        !            94: for(l=0;l<posts;l++) {
        !            95:        printf("\rScanning: %lu of %lu  Exported: %lu",l+1,posts,exported);
        !            96:        msg.idx.offset=post[l].offset;
        !            97:        if((i=smb_lockmsghdr(&smb,&msg))!=0) {
        !            98:                errormsg(WHERE,ERR_LOCK,smb.file,i);
        !            99:                continue; }
        !           100:        i=smb_getmsghdr(&smb,&msg);
        !           101:        if(i || msg.hdr.number!=post[l].number) {
        !           102:                smb_unlockmsghdr(&smb,&msg);
        !           103:                smb_freemsgmem(&msg);
        !           104: 
        !           105:                msg.hdr.number=post[l].number;
        !           106:                if((i=smb_getmsgidx(&smb,&msg))!=0) {
        !           107:                        errormsg(WHERE,ERR_READ,smb.file,i);
        !           108:                        continue; }
        !           109:                if((i=smb_lockmsghdr(&smb,&msg))!=0) {
        !           110:                        errormsg(WHERE,ERR_LOCK,smb.file,i);
        !           111:                        continue; }
        !           112:                if((i=smb_getmsghdr(&smb,&msg))!=0) {
        !           113:                        smb_unlockmsghdr(&smb,&msg);
        !           114:                        errormsg(WHERE,ERR_READ,smb.file,i);
        !           115:                        continue; } }
        !           116: 
        !           117:        if(net                                                                          /* Network */
        !           118:                && (!strncmpi(msg.subj,"NE:",3)         /* No Echo */
        !           119:                || msg.from_net.type==NET_POSTLINK)) {  /* from PostLink */
        !           120:                smb_unlockmsghdr(&smb,&msg);
        !           121:                smb_freemsgmem(&msg);
        !           122:                continue; }                                     /* From a Fido node, ignore it */
        !           123: 
        !           124:        if(net && !(sub[subnum]->misc&SUB_GATE) && msg.from_net.type) {
        !           125:                smb_unlockmsghdr(&smb,&msg);
        !           126:                smb_freemsgmem(&msg);
        !           127:                continue; }
        !           128: 
        !           129:        exported++;
        !           130: 
        !           131:        fprintf(stream,"%s\r\n%s\r\n%s\r\n"
        !           132:                ,msg.to,msg.from,msg.subj);
        !           133:        unixtodos(msg.hdr.when_written.time,&date,&curtime);
        !           134:        fprintf(stream,"%lu\r\n%lu\r\n%02u/%02u/%02u\r\n%02u:%02u\r\n"
        !           135:                "%s\r\n%c\r\n%c\r\nTEXT:\r\n"
        !           136:                ,msg.hdr.number
        !           137:                ,msg.hdr.thread_orig
        !           138:                ,date.da_mon,date.da_day,date.da_year-1900
        !           139:                ,curtime.ti_hour,curtime.ti_min
        !           140:                ,msg.hdr.attr&MSG_PRIVATE ? "PRIVATE" : "PUBLIC"
        !           141:                ,msg.hdr.attr&MSG_READ ? 'Y':'N'
        !           142:                ,strncmpi(msg.subj,"NE:",3) ? 'Y':'N');
        !           143: 
        !           144:        for(i=0;i<msg.hdr.total_dfields;i++) {
        !           145: 
        !           146:                if(msg.dfield[i].type!=TEXT_BODY
        !           147:                        && msg.dfield[i].type!=TEXT_TAIL)
        !           148:                        continue;                                       /* skip non-text data fields */
        !           149: 
        !           150:                if(msg.dfield[i].length<3)              /* need at least 3 bytes */
        !           151:                        continue;
        !           152: 
        !           153:                fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset,SEEK_SET);
        !           154: 
        !           155:                lzh=0;
        !           156:                fread(&xlat,2,1,smb.sdt_fp);
        !           157:                if(xlat==XLAT_LZH) {
        !           158:                        lzh=1;
        !           159:                        fread(&xlat,2,1,smb.sdt_fp); }
        !           160:                if(xlat!=XLAT_NONE)                     /* no translations supported */
        !           161:                        continue;
        !           162: 
        !           163:                length=msg.dfield[i].length-2;
        !           164:                if(lzh)
        !           165:                        length-=2;
        !           166: 
        !           167:                if((buf=MALLOC(length))==NULL) {
        !           168:                        errormsg(WHERE,ERR_ALLOC,nulstr,length);
        !           169:                        continue; }
        !           170: 
        !           171:                fread(buf,length,1,smb.sdt_fp);
        !           172: 
        !           173:                if(lzh) {
        !           174:                        buflen=*(long *)buf;
        !           175:                        if((outbuf=MALLOC(buflen))==NULL) {
        !           176:                                errormsg(WHERE,ERR_ALLOC,"lzh",buflen);
        !           177:                                FREE(buf);
        !           178:                                continue; }
        !           179:                        length=lzh_decode(buf,length,outbuf);
        !           180:                        FREE(buf);
        !           181:                        buf=outbuf; }
        !           182: 
        !           183:                tear=0;
        !           184:                for(m=0,cr=1;m<length;m++) {
        !           185:                        if(buf[m]==1) { /* Ctrl-A, so skip it and the next char */
        !           186:                                m++;
        !           187:                                continue; }
        !           188:                        if(buf[m]==0)  /* Ignore line feeds */
        !           189:                                continue;
        !           190: 
        !           191:                        if(m+3<length && cr && buf[m]=='-' && buf[m+1]=='-'
        !           192:                                && buf[m+2]=='-' && (buf[m+3]==CR || buf[m+3]==SP))
        !           193:                                tear=1;
        !           194: 
        !           195:                        if(buf[m]==LF)
        !           196:                                cr=1;
        !           197:                        else
        !           198:                                cr=0;
        !           199: 
        !           200:                        if(sub[subnum]->misc&SUB_ASCII) {
        !           201:                                if(buf[m]<SP && buf[m]!=CR) /* Ctrl ascii */
        !           202:                                        buf[m]='.';             /* converted to '.' */
        !           203:                                if((uchar)buf[m]>0x7f)          /* extended ASCII */
        !           204:                                        buf[m]='*'; }           /* converted to '*' */
        !           205:                        fputc(buf[m],stream); }
        !           206:                fprintf(stream,"\r\n");
        !           207:                FREE(buf); }
        !           208: 
        !           209:        if(!(sub[subnum]->misc&SUB_NOTAG)) {
        !           210:                if(!tear)       /* No previous tear line */
        !           211:                        fprintf(stream,"---\r\n");            /* so add one */
        !           212:                if(sub[subnum]->misc&SUB_ASCII) ch='*';
        !           213:                else ch='�';
        !           214:                fprintf(stream," %c Synchronet UTI v%s\r\n",ch,VER); }
        !           215: 
        !           216:        fprintf(stream,"\xff\r\n");
        !           217:        smb_unlockmsghdr(&smb,&msg);
        !           218:        smb_freemsgmem(&msg); }
        !           219: 
        !           220: sprintf(str,"%20s Scanned %lu, Exported %lu\r\n"
        !           221:        ,"",posts,exported);
        !           222: write(logfile,str,strlen(str));
        !           223: printf("\nDone.\n");
        !           224: smb_close(&smb);
        !           225: FREE(post);
        !           226: bail(0);
        !           227: return(0);
        !           228: }

unix.superglobalmegacorp.com

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