diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c index e8cc33fcebc1ec350d73f85f7ec0907a6b7b3485..3a6611fb59cb8b854fbf6a9d2e7999a8bb6e93c5 100644 --- a/src/sbbs3/sbbsecho.c +++ b/src/sbbs3/sbbsecho.c @@ -2584,7 +2584,7 @@ void seektonull(FILE *stream) /****************************************************************************** This function returns a packet name - used for outgoing packets ******************************************************************************/ -char *pktname(void) +char *pktname(BOOL temp) { static char str[128]; int i; @@ -2595,8 +2595,8 @@ char *pktname(void) for(i=0;i<MAX_TOTAL_PKTS*2;i++) { now+=i; tm=localtime(&now); - sprintf(str,"%s%02u%02u%02u%02u.pk_",cfg.outbound,tm->tm_mday,tm->tm_hour - ,tm->tm_min,tm->tm_sec); + sprintf(str,"%s%02u%02u%02u%02u.%s",cfg.outbound,tm->tm_mday,tm->tm_hour + ,tm->tm_min,tm->tm_sec,temp ? "pk_" : "pkt"); if(!fexist(str)) /* Add 1 second if name exists */ break; } return(str); @@ -2613,6 +2613,7 @@ void putfmsg(FILE *stream,uchar *fbuf,fmsghdr_t fmsghdr,areasbbs_t area faddr_t addr,sysaddr; fpkdmsg_t pkdmsg; time_t t; + size_t len; struct tm* tm; addr=getsysfaddr(fmsghdr.destzone); @@ -2634,13 +2635,15 @@ void putfmsg(FILE *stream,uchar *fbuf,fmsghdr_t fmsghdr,areasbbs_t area fwrite(fmsghdr.from ,strlen(fmsghdr.from)+1 ,1,stream); fwrite(fmsghdr.subj ,strlen(fmsghdr.subj)+1 ,1,stream); + len = strlen((char *)fbuf); + /* Write message body */ if(area.name) if(strncmp((char *)fbuf,"AREA:",5)) /* No AREA: Line */ fprintf(stream,"AREA:%s\r",area.name); /* So add one */ - fwrite(fbuf,strlen((char *)fbuf),1,stream); + fwrite(fbuf,len,1,stream); lastlen=9; - if(fbuf[strlen((char *)fbuf)-1]!='\r') + if(len && fbuf[len-1]!='\r') fputc('\r',stream); if(area.name==NULL) { /* NetMail, so add FSP-1010 Via kludge line */ @@ -2774,7 +2777,30 @@ void putfmsg(FILE *stream,uchar *fbuf,fmsghdr_t fmsghdr,areasbbs_t area fputc('\r',stream); } - fputc(0,stream); + fputc(FIDO_PACKED_MSG_TERMINATOR, stream); +} + +size_t terminate_packet(FILE* stream) +{ + WORD terminator=FIDO_PACKET_TERMINATOR; + + return fwrite(&terminator, sizeof(terminator), 1, stream); +} + +long find_packet_terminator(FILE* stream) +{ + WORD terminator; + long offset; + + fseek(stream, 0, SEEK_END); + offset = ftell(stream); + if(offset >= sizeof(fpkthdr_t)+sizeof(terminator)) { + fseek(stream, offset-sizeof(terminator), SEEK_SET); + if(fread(&terminator, sizeof(terminator), 1, stream) + && terminator==FIDO_PACKET_TERMINATOR) + offset -= sizeof(terminator); + } + return(offset); } /****************************************************************************** @@ -3024,8 +3050,7 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t area,faddr_t faddr break; } if(outpkt[i].curopen) { - fputc(0,outpkt[i].stream); - fputc(0,outpkt[i].stream); + terminate_packet(outpkt[i].stream); fclose(outpkt[i].stream); } else { if((outpkt[i].stream=fnopen(&file,outpkt[i].filename @@ -3033,8 +3058,7 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t area,faddr_t faddr lprintf(LOG_ERR,"ERROR line %d opening %s %s",__LINE__ ,outpkt[i].filename,strerror(errno)); continue; } - fputc(0,outpkt[i].stream); - fputc(0,outpkt[i].stream); + terminate_packet(outpkt[i].stream); fclose(outpkt[i].stream); } /* pack_nundle() disabled. Why? ToDo */ /* pack_bundle(outpkt[i].filename,outpkt[i].uplink); */ @@ -3089,8 +3113,7 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t area,faddr_t faddr fmsghdr.destzone=area.uplink[j].zone; putfmsg(outpkt[i].stream,fbuf,fmsghdr,area,seenbys,paths); } else { - fputc(0,outpkt[i].stream); - fputc(0,outpkt[i].stream); + terminate_packet(outpkt[i].stream); fclose(outpkt[i].stream); /* pack_bundle() disabled. Why? ToDo */ /* pack_bundle(outpkt[i].filename,outpkt[i].uplink); */ @@ -3112,7 +3135,7 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t area,faddr_t faddr outpkt[k].curopen=0; --openpkts; break; } } - strcpy(outpkt[i].filename,pktname()); + strcpy(outpkt[i].filename,pktname(/* temp? */ TRUE)); now=time(NULL); tm=localtime(&now); if((outpkt[i].stream=fnopen(&file,outpkt[i].filename @@ -4147,11 +4170,11 @@ int main(int argc, char **argv) fseek(fidomsg,-3L,SEEK_END); fread(str,3,1,fidomsg); if(str[2]) /* No ending NULL, probably junk */ - fputc(0,fidomsg); + fputc(FIDO_PACKED_MSG_TERMINATOR,fidomsg); if(str[1]) - fputc(0,fidomsg); + fputc(FIDO_PACKED_MSG_TERMINATOR,fidomsg); if(str[0]) - fputc(0,fidomsg); + fputc(FIDO_PACKED_MSG_TERMINATOR,fidomsg); fclose(fidomsg); pkt_faddr.zone=pkthdr.destzone; pkt_faddr.net=pkthdr.destnet; @@ -4168,7 +4191,7 @@ int main(int argc, char **argv) pack_bundle(packet,pkt_faddr); } else { fclose(fidomsg); - lprintf(LOG_WARNING,"Stray Outbound Packet (%s) possibly still in use (ftime: .%24s)" + lprintf(LOG_WARNING,"Stray Outbound Packet (%s) possibly still in use (ftime: %.24s)" ,packet,ctime(&ftime)); } } @@ -4808,17 +4831,19 @@ int main(int argc, char **argv) if(write_flofile(hdr.subj,addr,FALSE /* !bundle */)) bail(1); } else - strcpy(packet,pktname()); + strcpy(packet,pktname(/* Temp? */ FALSE)); now=time(NULL); tm=localtime(&now); - if((stream=fnopen(&file,packet,O_WRONLY|O_APPEND|O_CREAT))==NULL) { + if((stream=fnopen(&file,packet,O_RDWR|O_CREAT))==NULL) { lprintf(LOG_ERR,"ERROR line %d opening %s %s",__LINE__,packet ,strerror(errno)); bail(1); } - if(!filelength(file)) { + if(filelength(file) < sizeof(pkthdr_t)) { + chsize(file,0); + rewind(stream); memset(&pkthdr,0,sizeof(pkthdr)); pkthdr.orignode=hdr.orignode; pkthdr.destnode=addr.node; @@ -4856,10 +4881,14 @@ int main(int argc, char **argv) memcpy(pkthdr.password,cfg.nodecfg[node].pktpwd,sizeof(pkthdr.password)); } fwrite(&pkthdr,sizeof(pkthdr_t),1,stream); - } + } else + fseek(stream,find_packet_terminator(stream),SEEK_SET); putfmsg(stream,fmsgbuf,hdr,fakearea,msg_seen,msg_path); + /* Write packet terminator */ + terminate_packet(stream); + free(fmsgbuf); fclose(stream); /**************************************/