Annotation of sbbs/sbbs2/uti/utiexprt.c, revision 1.1.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.