Annotation of sbbs/sbbs2/uti/utiimprt.c, revision 1.1.1.1

1.1       root        1: /* UTIIMPRT.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 "crc32.h"
                      8: 
                      9: smb_t smb;
                     10: 
                     11: /****************************************************************************/
                     12: /* Updates 16-bit "rcrc" with character 'ch'                                */
                     13: /****************************************************************************/
                     14: void ucrc16(uchar ch, ushort *rcrc) {
                     15:        ushort i, cy;
                     16:     uchar nch=ch;
                     17:  
                     18: for (i=0; i<8; i++) {
                     19:     cy=*rcrc & 0x8000;
                     20:     *rcrc<<=1;
                     21:     if (nch & 0x80) *rcrc |= 1;
                     22:     nch<<=1;
                     23:     if (cy) *rcrc ^= 0x1021; }
                     24: }
                     25: 
                     26: /****************************************************************************/
                     27: /* Returns 16-crc of string (not counting terminating NULL)                            */
                     28: /****************************************************************************/
                     29: ushort crc16(char *str)
                     30: {
                     31:        int     i=0;
                     32:        ushort  crc=0;
                     33: 
                     34: ucrc16(0,&crc);
                     35: while(str[i])
                     36:        ucrc16(str[i++],&crc);
                     37: ucrc16(0,&crc);
                     38: ucrc16(0,&crc);
                     39: return(crc);
                     40: }
                     41: 
                     42: 
                     43: #define PRIVATE 0
                     44: #define PUBLIC 1
                     45: 
                     46: #define DEBUG 0
                     47: 
                     48: 
                     49: char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
                     50: char *mon[]={"Jan","Feb","Mar","Apr","May","Jun"
                     51:             ,"Jul","Aug","Sep","Oct","Nov","Dec"};
                     52: 
                     53: void remove_re(char *str)
                     54: {
                     55: while(!strnicmp(str,"RE:",3)) {
                     56:        strcpy(str,str+3);
                     57:        while(str[0]==SP)
                     58:                strcpy(str,str+1); }
                     59: }
                     60: 
                     61: /****************************************************************************/
                     62: /* Converts a date string in format MM/DD/YY into unix time format                     */
                     63: /****************************************************************************/
                     64: time_t dstrtounix(char *str)
                     65: {
                     66:        struct time curtime;
                     67:        struct date date;
                     68: 
                     69: #if DEBUG
                     70: printf("\rdstrtounix           ");
                     71: #endif
                     72: 
                     73: curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0;
                     74: date.da_year=1900+((str[6]&0xf)*10)+(str[7]&0xf);
                     75: date.da_mon=((str[0]&0xf)*10)+(str[1]&0xf);
                     76: date.da_day=((str[3]&0xf)*10)+(str[4]&0xf);
                     77: return(dostounix(&date,&curtime));
                     78: }
                     79: 
                     80: /****************************************************************************/
                     81: /* Checks the disk drive for the existence of a file. Returns 1 if it       */
                     82: /* exists, 0 if it doesn't.                                                 */
                     83: /* Called from upload                                                       */
                     84: /****************************************************************************/
                     85: char fexist(char *filespec)
                     86: {
                     87:     struct ffblk f;
                     88: 
                     89: if(findfirst(filespec,&f,0)==NULL)
                     90:     return(1);
                     91: return(0);
                     92: }
                     93: 
                     94: /****************************************************************************/
                     95: /* This function reads files that are potentially larger than 32k.             */
                     96: /* Up to one megabyte of data can be read with each call.                   */
                     97: /****************************************************************************/
                     98: long lread(int file, char huge *buf,long bytes)
                     99: {
                    100:        long count;
                    101: 
                    102: for(count=bytes;count>32767;count-=32767,buf+=32767)
                    103:        if(read(file,(char *)buf,32767)!=32767)
                    104:                return(-1L);
                    105: if(read(file,(char *)buf,(int)count)!=count)
                    106:        return(-1L);
                    107: return(bytes);
                    108: }
                    109: 
                    110: 
                    111: int main(int argc, char **argv)
                    112: {
                    113:        char    str[256],to[256],from[256],title[256],*p,*buf,*outbuf;
                    114:        ushort  xlat,net=0;
                    115:        int     i,j,file,lzh,storage;
                    116:        uint    subnum,imported=0;
                    117:        ulong   l,length,lzhlen,offset,crc;
                    118:        FILE    *stream;
                    119:        smbmsg_t        msg;
                    120:        smbstatus_t status;
                    121: 
                    122: PREPSCREEN;
                    123: 
                    124: printf("Synchronet UTIIMPRT v%s\n",VER);
                    125: 
                    126: if(argc<3)
                    127:        exit(1);
                    128: 
                    129: if((argc>3 && !stricmp(argv[3],"/NETWORK"))
                    130:        || (argc>4 && !stricmp(argv[4],"/NETWORK")))
                    131:        net=NET_POSTLINK;
                    132: 
                    133: uti_init("UTIIMPRT",argc,argv);
                    134: 
                    135: if((file=nopen(argv[2],O_RDONLY))==-1)
                    136:        bail(2);
                    137: if((stream=fdopen(file,"rb"))==NULL)
                    138:        bail(2);
                    139: 
                    140: subnum=getsubnum(argv[1]);
                    141: if((int)subnum==-1)
                    142:        bail(7);
                    143: 
                    144: sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code);
                    145: smb.retry_time=30;
                    146: if((i=smb_open(&smb))!=0) {
                    147:        errormsg(WHERE,ERR_OPEN,smb.file,i);
                    148:        bail(5); }
                    149: 
                    150: if(filelength(fileno(smb.shd_fp))<1) {  /* Create it if it doesn't exist */
                    151:        smb.status.max_crcs=sub[subnum]->maxcrcs;
                    152:        smb.status.max_msgs=sub[subnum]->maxmsgs;
                    153:        smb.status.max_age=sub[subnum]->maxage;
                    154:        smb.status.attr=sub[subnum]->misc&SUB_HYPER ? SMB_HYPERALLOC : 0;
                    155:        if((i=smb_create(&smb))!=0) {
                    156:                errormsg(WHERE,ERR_CREATE,smb.file,i);
                    157:                bail(5); } }
                    158: 
                    159: printf("\r\nImporting ");
                    160: 
                    161: while(!feof(stream) && !ferror(stream)) {
                    162:        memset(&msg,0,sizeof(smbmsg_t));
                    163:        memcpy(msg.hdr.id,"SHD\x1a",4);
                    164:        msg.hdr.version=SMB_VERSION;
                    165:        msg.hdr.when_imported.time=time(NULL);
                    166:        msg.hdr.when_imported.zone=sys_timezone;
                    167:        if(sub[subnum]->misc&SUB_AONLY)
                    168:                msg.hdr.attr|=MSG_ANONYMOUS;
                    169: 
                    170:        if(!fgets(to,250,stream))
                    171:                break;
                    172:        if(!fgets(from,250,stream))
                    173:                break;
                    174:        if(!fgets(title,250,stream))
                    175:                break;
                    176:        imported++;
                    177:        printf("%-5u\b\b\b\b\b",imported);
                    178:        truncsp(to);
                    179:        truncsp(from);
                    180:        truncsp(title);
                    181: 
                    182:        smb_hfield(&msg,RECIPIENT,strlen(to),to);
                    183:        strlwr(to);
                    184:        msg.idx.to=crc16(to);
                    185: 
                    186:        smb_hfield(&msg,SENDER,strlen(from),from);
                    187:        strlwr(from);
                    188:        msg.idx.from=crc16(from);
                    189: 
                    190:        if(net)
                    191:                i=smb_hfield(&msg,SENDERNETTYPE,2,&net);
                    192: 
                    193:        i=smb_hfield(&msg,SUBJECT,strlen(title),title);
                    194:        strlwr(title);
                    195:        remove_re(title);
                    196:        msg.idx.subj=crc16(title);
                    197: 
                    198:        fgets(str,128,stream);   /* skip msg # */
                    199:        fgets(str,128,stream);   /* ref # */
                    200:        msg.hdr.thread_orig=atol(str);
                    201:        fgets(str,128,stream);   /* date */
                    202:        msg.hdr.when_written.time=dstrtounix(str);
                    203:        fgets(str,128,stream);   /* time */
                    204:        msg.hdr.when_written.time+=atoi(str)*60*60;  /* hours */
                    205:        p=strchr(str,':');
                    206:        if(p)
                    207:                msg.hdr.when_written.time+=atoi(p+1)*60; /* mins */
                    208:        fgets(str,128,stream);   /* private/public */
                    209:        if(!stricmp(str,"PRIVATE"))
                    210:                msg.hdr.attr|=MSG_PRIVATE;
                    211:        fgets(str,128,stream);   /* Read? Y/N */
                    212:        if(toupper(str[0])=='Y')
                    213:                msg.hdr.attr|=MSG_READ;
                    214:        fgets(str,128,stream);   /* Net? Y/N - ignore */
                    215:        if(toupper(str[0])=='Y')
                    216:                msg.hdr.netattr|=MSG_TYPELOCAL;
                    217:        while(!feof(stream) && !ferror(stream)) {
                    218:                fgets(str,128,stream);
                    219:                if(!strcmp(str,"TEXT:\r\n"))
                    220:                        break; }
                    221: 
                    222:        buf=NULL;
                    223:        length=0;
                    224:        crc=0xffffffff;
                    225:        while(!feof(stream) && !ferror(stream)) {
                    226:                fgets(str,128,stream);
                    227:                if(!strcmp(str,"\xff\r\n"))     /* end of text */
                    228:                        break;
                    229:                j=strlen(str);
                    230:                if((buf=REALLOC(buf,length+j+1))==NULL) {
                    231:                        errormsg(WHERE,ERR_ALLOC,argv[1],length+j+1);
                    232:                        bail(3); }
                    233:                if(sub[subnum]->maxcrcs) {
                    234:                        for(i=0;i<j;i++)
                    235:                                crc=ucrc32(str[i],crc); }
                    236:                strcpy(buf+length,str);
                    237:                length+=strlen(str); }
                    238:        crc=~crc;
                    239: 
                    240:        if((i=smb_locksmbhdr(&smb))!=0) {
                    241:                errormsg(WHERE,ERR_LOCK,smb.file,i);
                    242:                bail(11); }
                    243: 
                    244:        if((i=smb_getstatus(&smb))!=0) {
                    245:                errormsg(WHERE,ERR_READ,smb.file,i);
                    246:                bail(12); }
                    247: 
                    248:        if(sub[subnum]->maxcrcs) {
                    249:                i=smb_addcrc(&smb,crc);
                    250:                if(i) {
                    251:                        printf("\nDuplicate message!\n");
                    252:                        FREE(buf);
                    253:                        smb_unlocksmbhdr(&smb);
                    254:                        smb_freemsgmem(&msg);
                    255:                        continue; } }
                    256: 
                    257:        if(length>=2 && buf[length-1]==LF && buf[length-2]==CR)
                    258:                length-=2;
                    259:        if(length>=2 && buf[length-1]==LF && buf[length-2]==CR)
                    260:         length-=2;
                    261: 
                    262:        lzh=0;
                    263:        if(sub[subnum]->misc&SUB_LZH && length+2>=SDT_BLOCK_LEN) {
                    264:                if((outbuf=(char *)MALLOC(length*2))==NULL) {
                    265:                        errormsg(WHERE,ERR_ALLOC,"lzh",length*2);
                    266:                        smb_unlocksmbhdr(&smb);
                    267:                        smb_freemsgmem(&msg);
                    268:                        bail(3); }
                    269:                lzhlen=lzh_encode(buf,length,outbuf);
                    270:                if(lzhlen>1
                    271:                        && smb_datblocks(lzhlen+4)
                    272:                                <smb_datblocks(length+2)) { /* Compressable */
                    273:                        length=lzhlen+2;
                    274:                        FREE(buf);
                    275:                        lzh=1;
                    276:                        buf=outbuf; }
                    277:                else                            /* Uncompressable */
                    278:                        FREE(outbuf); }
                    279: 
                    280:        length+=2;                                              /* for translation string */
                    281: 
                    282:        if(status.attr&SMB_HYPERALLOC) {
                    283:                offset=smb_hallocdat(&smb);
                    284:                storage=SMB_HYPERALLOC; }
                    285:        else {
                    286:                if((i=smb_open_da(&smb))!=0) {
                    287:                        errormsg(WHERE,ERR_OPEN,smb.file,i);
                    288:                        bail(5); }
                    289:                if(sub[subnum]->misc&SUB_FAST) {
                    290:                        offset=smb_fallocdat(&smb,length,1);
                    291:                        storage=SMB_FASTALLOC; }
                    292:                else {
                    293:                        offset=smb_allocdat(&smb,length,1);
                    294:                        storage=SMB_SELFPACK; }
                    295:                fclose(smb.sda_fp); }
                    296: 
                    297:        msg.hdr.offset=offset;
                    298: 
                    299:        smb_dfield(&msg,TEXT_BODY,length);
                    300: 
                    301:        fseek(smb.sdt_fp,offset,SEEK_SET);
                    302:        if(lzh) {
                    303:                xlat=XLAT_LZH;
                    304:                fwrite(&xlat,2,1,smb.sdt_fp); }
                    305:        xlat=XLAT_NONE;
                    306:        fwrite(&xlat,2,1,smb.sdt_fp);
                    307:        j=SDT_BLOCK_LEN-2;                              /* Don't read/write more than 255 */
                    308:        if(lzh)
                    309:                j-=2;
                    310:        l=0;
                    311:        length-=2;
                    312:        if(lzh)
                    313:                length-=2;
                    314:        while(l<length) {
                    315:                if(l+j>length)
                    316:                        j=length-l;
                    317:                fwrite(buf+l,j,1,smb.sdt_fp);
                    318:                l+=j;
                    319:                j=SDT_BLOCK_LEN; }
                    320:        fflush(smb.sdt_fp);
                    321:        FREE(buf);
                    322:        smb_unlocksmbhdr(&smb);
                    323:        smb_addmsghdr(&smb,&msg,storage);
                    324:        smb_freemsgmem(&msg); }
                    325: 
                    326: sprintf(str,"%20s Imported %u\r\n","",imported);
                    327: write(logfile,str,strlen(str));
                    328: printf("\nDone.\n");
                    329: bail(0);
                    330: return(0);
                    331: }
                    332: 

unix.superglobalmegacorp.com

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