int fixsmb(char* sub) { char* p; char* text; char c; int i,w; ulong l,length,size,n; smbmsg_t msg; memset(&smb,0,sizeof(smb)); SAFECOPY(smb.file,sub); if((p=getfext(smb.file))!=NULL && stricmp(p,".shd")==0) *p=0; /* Chop off .shd extension, if supplied on command-line */ printf("Opening %s\n",smb.file); if((i=smb_open(&smb))!=0) { printf("smb_open returned %d: %s\n",i,smb.last_error); exit(1); } if((i=smb_lock(&smb))!=0) { printf("smb_lock returned %d: %s\n",i,smb.last_error); exit(1); } if((i=smb_locksmbhdr(&smb))!=0) { smb_close(&smb); printf("smb_locksmbhdr returned %d: %s\n",i,smb.last_error); exit(1); } if((i=smb_getstatus(&smb))!=0) { smb_unlocksmbhdr(&smb); smb_close(&smb); printf("smb_getstatus returned %d: %s\n",i,smb.last_error); exit(1); } if(!(smb.status.attr&SMB_HYPERALLOC)) { if((i=smb_open_ha(&smb))!=0) { smb_close(&smb); printf("smb_open_ha returned %d: %s\n",i,smb.last_error); exit(1); } if((i=smb_open_da(&smb))!=0) { smb_close(&smb); printf("smb_open_da returned %d: %s\n",i,smb.last_error); exit(1); } rewind(smb.sha_fp); chsize(fileno(smb.sha_fp),0L); /* Truncate the header allocation file */ rewind(smb.sda_fp); chsize(fileno(smb.sda_fp),0L); /* Truncate the data allocation file */ } rewind(smb.sid_fp); chsize(fileno(smb.sid_fp),0L); /* Truncate the index */ if(!(smb.status.attr&SMB_HYPERALLOC)) { length=filelength(fileno(smb.sdt_fp)); w=0; for(l=0;l<length;l+=SDT_BLOCK_LEN) /* Init .SDA file to NULL */ fwrite(&w,2,1,smb.sda_fp); length=filelength(fileno(smb.shd_fp)); c=0; for(l=0;l<length;l+=SHD_BLOCK_LEN) /* Init .SHD file to NULL */ fwrite(&c,1,1,smb.sha_fp); } else length=filelength(fileno(smb.shd_fp)); n=0; /* messsage offset */ for(l=smb.status.header_offset;l<length;l+=size) { size=SHD_BLOCK_LEN; printf("\r%2lu%% ",(long)(100.0/((float)length/l))); msg.idx.offset=l; if((i=smb_lockmsghdr(&smb,&msg))!=0) { printf("\n(%06lX) smb_lockmsghdr returned %d:\n%s\n",l,i,smb.last_error); continue; } i=smb_getmsghdr(&smb,&msg); smb_unlockmsghdr(&smb,&msg); if(i!=0) { printf("\n(%06lX) smb_getmsghdr returned %d:\n%s\n",l,i,smb.last_error); continue; } size=smb_hdrblocks(smb_getmsghdrlen(&msg))*SHD_BLOCK_LEN; printf("#%-5lu (%06lX) %-25.25s ",msg.hdr.number,l,msg.from); /* Create hash record */ if(msg.hdr.attr&MSG_DELETE) text=NULL; else text=smb_getmsgtxt(&smb,&msg,GETMSGTXT_BODY_ONLY); i=smb_hashmsg(&smb,&msg,text,TRUE /* update */); if(i!=SMB_SUCCESS) printf("!ERROR %d hashing message\n", i); if(text!=NULL) free(text); /* Index the header */ if(msg.hdr.attr&MSG_DELETE) printf("Not indexing deleted message\n"); else if(msg.hdr.number==0) printf("Not indexing invalid message number (0)!\n"); else { msg.offset=n; if(renumber) msg.hdr.number=n+1; if(msg.hdr.netattr&MSG_INTRANSIT) { printf("Removing 'in transit' attribute\n"); msg.hdr.netattr&=~MSG_INTRANSIT; } if((i=smb_putmsg(&smb,&msg))!=0) { printf("\nsmb_putmsg returned %d: %s\n",i,smb.last_error); continue; } n++; } if(!(smb.status.attr&SMB_HYPERALLOC)) { /**************************/ /* Allocate header blocks */ /**************************/ fseek(smb.sha_fp,(l-smb.status.header_offset)/SHD_BLOCK_LEN,SEEK_SET); if(msg.hdr.attr&MSG_DELETE) c=0; /* mark as free */ else c=1; /* or allocated */ for(i=0;i<(int)(size/SHD_BLOCK_LEN);i++) fputc(c,smb.sha_fp); /************************/ /* Allocate data blocks */ /************************/ if(!(msg.hdr.attr&MSG_DELETE)) smb_incmsg_dfields(&smb,&msg,1); } smb_freemsgmem(&msg); } printf("\r%79s\r100%%\n",""); smb.status.total_msgs=n; if(renumber) smb.status.last_msg=n; else sort_index(&smb); printf("Saving message base status (%lu total messages).\n",n); if((i=smb_putstatus(&smb))!=0) printf("\nsmb_putstatus returned %d: %s\n",i,smb.last_error); smb_unlocksmbhdr(&smb); printf("Closing message base.\n"); smb_close(&smb); unlock_msgbase(); printf("Done.\n"); return(0); }
void SMBCALL smb_dump_msghdr(FILE* fp, smbmsg_t* msg) { int i; time_t tt; fprintf(fp,"%-20.20s %"PRId32"\n" ,"number" ,msg->hdr.number); /* convenience strings */ if(msg->subj) fprintf(fp,"%-20.20s \"%s\"\n" ,"subject" ,msg->subj); if(msg->to) { fprintf(fp,"%-20.20s %s" ,"to" ,msg->to); if(msg->to_ext) fprintf(fp," #%s",msg->to_ext); if(msg->to_net.type) fprintf(fp," <%s>",smb_netaddr(&msg->to_net)); fprintf(fp,"\n"); } if(msg->from) { fprintf(fp,"%-20.20s \"%s\"" ,"from" ,msg->from); if(msg->from_ext) fprintf(fp," #%s",msg->from_ext); if(msg->from_net.type) fprintf(fp," <%s>",smb_netaddr(&msg->from_net)); fprintf(fp,"\n"); } if(msg->replyto) { fprintf(fp,"%-20.20s \"%s\"" ,"reply-to" ,msg->replyto); if(msg->replyto_ext) fprintf(fp," #%s",msg->replyto_ext); if(msg->replyto_net.type) fprintf(fp," <%s>",smb_netaddr(&msg->replyto_net)); fprintf(fp,"\n"); } if(msg->summary) fprintf(fp,"%-20.20s \"%s\"\n" ,"summary" ,msg->summary); /* convenience integers */ if(msg->expiration) { tt=msg->expiration; fprintf(fp,"%-20.20s %.24s\n","expiration" ,ctime(&tt)); } /* fixed header fields */ tt=msg->hdr.when_written.time; fprintf(fp,"%-20.20s %.24s UTC%+d:%02d\n" ,"when_written" ,ctime(&tt) ,smb_tzutc(msg->hdr.when_written.zone)/60 ,abs(smb_tzutc(msg->hdr.when_written.zone)%60)); tt=msg->hdr.when_imported.time; fprintf(fp,"%-20.20s %.24s UTC%+d:%02d\n" ,"when_imported" ,ctime(&tt) ,smb_tzutc(msg->hdr.when_imported.zone)/60 ,abs(smb_tzutc(msg->hdr.when_imported.zone)%60)); fprintf(fp,"%-20.20s %04Xh\n" ,"type" ,msg->hdr.type); fprintf(fp,"%-20.20s %04Xh\n" ,"version" ,msg->hdr.version); fprintf(fp,"%-20.20s %04Xh\n" ,"attr" ,msg->hdr.attr); fprintf(fp,"%-20.20s %08"PRIX32"h\n" ,"auxattr" ,msg->hdr.auxattr); fprintf(fp,"%-20.20s %08"PRIX32"h\n" ,"netattr" ,msg->hdr.netattr); /* optional fixed fields */ if(msg->hdr.thread_id) fprintf(fp,"%-20.20s %"PRId32"\n" ,"thread_id" ,msg->hdr.thread_id); if(msg->hdr.thread_back) fprintf(fp,"%-20.20s %"PRId32"\n" ,"thread_back" ,msg->hdr.thread_back); if(msg->hdr.thread_next) fprintf(fp,"%-20.20s %"PRId32"\n" ,"thread_next" ,msg->hdr.thread_next); if(msg->hdr.thread_first) fprintf(fp,"%-20.20s %"PRId32"\n" ,"thread_first" ,msg->hdr.thread_first); if(msg->hdr.delivery_attempts) fprintf(fp,"%-20.20s %hu\n" ,"delivery_attempts",msg->hdr.delivery_attempts); if(msg->hdr.times_downloaded) fprintf(fp,"%-20.20s %"PRIu32"\n" ,"times_downloaded" ,msg->hdr.times_downloaded); if(msg->hdr.last_downloaded) { tt=msg->hdr.last_downloaded; fprintf(fp,"%-20.20s %.24s\n" ,"last_downloaded" ,ctime(&tt)); } fprintf(fp,"%-20.20s %06"PRIX32"h\n" ,"header offset" ,msg->idx.offset); fprintf(fp,"%-20.20s %u\n" ,"header length" ,msg->hdr.length); fprintf(fp,"%-20.20s %lu\n" ,"calculated length",smb_getmsghdrlen(msg)); /* variable fields */ for(i=0;i<msg->total_hfields;i++) fprintf(fp,"%-20.20s \"%s\"\n" ,smb_hfieldtype(msg->hfield[i].type) ,binstr((uchar *)msg->hfield_dat[i],msg->hfield[i].length)); /* data fields */ fprintf(fp,"%-20.20s %06"PRIX32"h\n" ,"data offset" ,msg->hdr.offset); for(i=0;i<msg->hdr.total_dfields;i++) fprintf(fp,"data field[%u] %s, offset %"PRIu32", length %"PRIu32"\n" ,i ,smb_dfieldtype(msg->dfield[i].type) ,msg->dfield[i].offset ,msg->dfield[i].length); }