|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.