Try to build Golded+ in MacOSX

This commit is contained in:
Stas Degteff 2006-01-14 22:18:22 +00:00
parent ae3736fc28
commit cba73cfa0d

View File

@ -49,7 +49,7 @@
/* ANSI C Library headers */ /* ANSI C Library headers */
#ifndef __FreeBSD__ #if !defined(__FreeBSD__) && !defined(__APPLE__)
#include <malloc.h> #include <malloc.h>
#endif #endif
@ -103,7 +103,7 @@ int SMBCALL smb_open(smb_t* smb)
/* Set default values, if uninitialized */ /* Set default values, if uninitialized */
if(!smb->retry_time) if(!smb->retry_time)
smb->retry_time=10; /* seconds */ smb->retry_time=10; /* seconds */
if(!smb->retry_delay if(!smb->retry_delay
|| smb->retry_delay>(smb->retry_time*100)) /* at least ten retries */ || smb->retry_delay>(smb->retry_time*100)) /* at least ten retries */
smb->retry_delay=250; /* milliseconds */ smb->retry_delay=250; /* milliseconds */
smb->shd_fp=smb->sdt_fp=smb->sid_fp=NULL; smb->shd_fp=smb->sdt_fp=smb->sid_fp=NULL;
@ -111,13 +111,13 @@ int SMBCALL smb_open(smb_t* smb)
sprintf(str,"%s.shd",smb->file); sprintf(str,"%s.shd",smb->file);
if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO))==-1) { if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO))==-1) {
sprintf(smb->last_error,"%d opening %s",errno,str); sprintf(smb->last_error,"%d opening %s",errno,str);
return(2); return(2);
} }
if((smb->shd_fp=fdopen(file,"r+b"))==NULL) { if((smb->shd_fp=fdopen(file,"r+b"))==NULL) {
sprintf(smb->last_error,"%d fdopening %s (%d)",errno,str,file); sprintf(smb->last_error,"%d fdopening %s (%d)",errno,str,file);
close(file); close(file);
return(4); return(4);
} }
if(filelength(file)>=sizeof(smbhdr_t)) { if(filelength(file)>=sizeof(smbhdr_t)) {
@ -125,7 +125,7 @@ int SMBCALL smb_open(smb_t* smb)
if(smb_locksmbhdr(smb)!=0) { if(smb_locksmbhdr(smb)!=0) {
smb_close(smb); smb_close(smb);
/* smb_lockmsghdr set last_error */ /* smb_lockmsghdr set last_error */
return(-1); return(-1);
} }
memset(&hdr,0,sizeof(smbhdr_t)); memset(&hdr,0,sizeof(smbhdr_t));
if(fread(&hdr,sizeof(smbhdr_t),1,smb->shd_fp)!=1) { if(fread(&hdr,sizeof(smbhdr_t),1,smb->shd_fp)!=1) {
@ -136,21 +136,21 @@ int SMBCALL smb_open(smb_t* smb)
if(memcmp(hdr.id,SMB_HEADER_ID,LEN_HEADER_ID)) { if(memcmp(hdr.id,SMB_HEADER_ID,LEN_HEADER_ID)) {
sprintf(smb->last_error,"corrupt SMB header ID: %.*s",LEN_HEADER_ID,hdr.id); sprintf(smb->last_error,"corrupt SMB header ID: %.*s",LEN_HEADER_ID,hdr.id);
smb_close(smb); smb_close(smb);
return(-2); return(-2);
} }
if(hdr.version<0x110) { /* Compatibility check */ if(hdr.version<0x110) { /* Compatibility check */
sprintf(smb->last_error,"insufficient header version: %X",hdr.version); sprintf(smb->last_error,"insufficient header version: %X",hdr.version);
smb_close(smb); smb_close(smb);
return(-3); return(-3);
} }
if(fread(&(smb->status),1,sizeof(smbstatus_t),smb->shd_fp) if(fread(&(smb->status),1,sizeof(smbstatus_t),smb->shd_fp)
!=sizeof(smbstatus_t)) { !=sizeof(smbstatus_t)) {
sprintf(smb->last_error,"failed to read status"); sprintf(smb->last_error,"failed to read status");
smb_close(smb); smb_close(smb);
return(-4); return(-4);
} }
smb_unlocksmbhdr(smb); smb_unlocksmbhdr(smb);
rewind(smb->shd_fp); rewind(smb->shd_fp);
} }
setvbuf(smb->shd_fp,smb->shd_buf,_IOFBF,SHD_BLOCK_LEN); setvbuf(smb->shd_fp,smb->shd_buf,_IOFBF,SHD_BLOCK_LEN);
@ -159,7 +159,7 @@ int SMBCALL smb_open(smb_t* smb)
if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO))==-1) { if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO))==-1) {
sprintf(smb->last_error,"%d opening %s",errno,str); sprintf(smb->last_error,"%d opening %s",errno,str);
smb_close(smb); smb_close(smb);
return(1); return(1);
} }
if((smb->sdt_fp=fdopen(file,"r+b"))==NULL) { if((smb->sdt_fp=fdopen(file,"r+b"))==NULL) {
@ -175,14 +175,14 @@ int SMBCALL smb_open(smb_t* smb)
if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO))==-1) { if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO))==-1) {
sprintf(smb->last_error,"%d opening %s",errno,str); sprintf(smb->last_error,"%d opening %s",errno,str);
smb_close(smb); smb_close(smb);
return(3); return(3);
} }
if((smb->sid_fp=fdopen(file,"r+b"))==NULL) { if((smb->sid_fp=fdopen(file,"r+b"))==NULL) {
sprintf(smb->last_error,"%d fdopening %s (%d)",errno,str,file); sprintf(smb->last_error,"%d fdopening %s (%d)",errno,str,file);
close(file); close(file);
smb_close(smb); smb_close(smb);
return(6); return(6);
} }
setvbuf(smb->sid_fp,NULL,_IOFBF,2*1024); setvbuf(smb->sid_fp,NULL,_IOFBF,2*1024);
@ -197,7 +197,7 @@ void SMBCALL smb_close(smb_t* smb)
{ {
if(smb->shd_fp!=NULL) { if(smb->shd_fp!=NULL) {
smb_unlocksmbhdr(smb); /* In case it's been locked */ smb_unlocksmbhdr(smb); /* In case it's been locked */
fclose(smb->shd_fp); fclose(smb->shd_fp);
} }
if(smb->sid_fp!=NULL) if(smb->sid_fp!=NULL)
fclose(smb->sid_fp); fclose(smb->sid_fp);
@ -231,14 +231,14 @@ int SMBCALL smb_open_da(smb_t* smb)
if(gtime(NULL)-start >= smb->retry_time) { if(gtime(NULL)-start >= smb->retry_time) {
sprintf(smb->last_error,"timeout opening %s (retry_time=%d)" sprintf(smb->last_error,"timeout opening %s (retry_time=%d)"
,str,smb->retry_time); ,str,smb->retry_time);
return(-2); return(-2);
} }
SLEEP(smb->retry_delay); SLEEP(smb->retry_delay);
} }
if((smb->sda_fp=fdopen(file,"r+b"))==NULL) { if((smb->sda_fp=fdopen(file,"r+b"))==NULL) {
sprintf(smb->last_error,"%d fdopening %s (%d)",errno,str,file); sprintf(smb->last_error,"%d fdopening %s (%d)",errno,str,file);
close(file); close(file);
return(-3); return(-3);
} }
setvbuf(smb->sda_fp,NULL,_IOFBF,2*1024); setvbuf(smb->sda_fp,NULL,_IOFBF,2*1024);
return(0); return(0);
@ -276,14 +276,14 @@ int SMBCALL smb_open_ha(smb_t* smb)
if(gtime(NULL)-start >= smb->retry_time) { if(gtime(NULL)-start >= smb->retry_time) {
sprintf(smb->last_error,"timeout opening %s (retry_time=%d)" sprintf(smb->last_error,"timeout opening %s (retry_time=%d)"
,str,smb->retry_time); ,str,smb->retry_time);
return(-2); return(-2);
} }
SLEEP(smb->retry_delay); SLEEP(smb->retry_delay);
} }
if((smb->sha_fp=fdopen(file,"r+b"))==NULL) { if((smb->sha_fp=fdopen(file,"r+b"))==NULL) {
sprintf(smb->last_error,"%d fdopening %s (%d)",errno,str,file); sprintf(smb->last_error,"%d fdopening %s (%d)",errno,str,file);
close(file); close(file);
return(-3); return(-3);
} }
setvbuf(smb->sha_fp,NULL,_IOFBF,2*1024); setvbuf(smb->sha_fp,NULL,_IOFBF,2*1024);
return(0); return(0);
@ -327,7 +327,7 @@ int SMBCALL smb_stack(smb_t* smb, int op)
return(0); /* Msg base not open */ return(0); /* Msg base not open */
memcpy(&stack[stack_idx],smb,sizeof(smb_t)); memcpy(&stack[stack_idx],smb,sizeof(smb_t));
stack_idx++; stack_idx++;
return(0); return(0);
} }
/* pop or xchng */ /* pop or xchng */
if(!stack_idx) /* Nothing on the stack, so do nothing */ if(!stack_idx) /* Nothing on the stack, so do nothing */
@ -374,7 +374,7 @@ int SMBCALL smb_trunchdr(smb_t* smb)
if(gtime(NULL)-start >= smb->retry_time) { /* Time-out */ if(gtime(NULL)-start >= smb->retry_time) { /* Time-out */
sprintf(smb->last_error,"timeout changing header file size (retry_time=%d)" sprintf(smb->last_error,"timeout changing header file size (retry_time=%d)"
,smb->retry_time); ,smb->retry_time);
return(-2); return(-2);
} }
SLEEP(smb->retry_delay); SLEEP(smb->retry_delay);
} }
@ -404,8 +404,8 @@ int SMBCALL smb_locksmbhdr(smb_t* smb)
if(!start) if(!start)
start = gtime(NULL); start = gtime(NULL);
else else
if(gtime(NULL)-start >= smb->retry_time) if(gtime(NULL)-start >= smb->retry_time)
break; break;
/* In case we've already locked it */ /* In case we've already locked it */
if(unlock(fileno(smb->shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))==0) if(unlock(fileno(smb->shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))==0)
smb->locked=0; /* FALSE */ smb->locked=0; /* FALSE */
@ -496,10 +496,10 @@ int SMBCALL smb_lockmsghdr(smb_t* smb, smbmsg_t* msg)
if(!start) if(!start)
start = gtime(NULL); start = gtime(NULL);
else else
if(gtime(NULL)-start >= smb->retry_time) if(gtime(NULL)-start >= smb->retry_time)
break; break;
/* In case we've already locked it */ /* In case we've already locked it */
unlock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t)); unlock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t));
SLEEP(smb->retry_delay); SLEEP(smb->retry_delay);
} }
sprintf(smb->last_error,"timeout locking header"); sprintf(smb->last_error,"timeout locking header");
@ -530,7 +530,7 @@ int SMBCALL smb_getmsgidx(smb_t* smb, smbmsg_t* msg)
sprintf(smb->last_error,"reading index"); sprintf(smb->last_error,"reading index");
return(1); return(1);
} }
return(0); return(0);
} }
length=filelength(fileno(smb->sid_fp)); length=filelength(fileno(smb->sid_fp));
@ -560,14 +560,14 @@ int SMBCALL smb_getmsgidx(smb_t* smb, smbmsg_t* msg)
if(idx.number>msg->hdr.number) { if(idx.number>msg->hdr.number) {
top=l; top=l;
l=bot+((top-bot)/2); l=bot+((top-bot)/2);
continue; continue;
} }
if(idx.number<msg->hdr.number) { if(idx.number<msg->hdr.number) {
bot=l; bot=l;
l=top-((top-bot)/2); l=top-((top-bot)/2);
continue; continue;
} }
break; break;
} }
msg->idx=idx; msg->idx=idx;
msg->offset=l; msg->offset=l;
@ -632,7 +632,7 @@ uint SMBCALL smb_getmsghdrlen(smbmsg_t* msg)
/* header fields */ /* header fields */
for(i=0;i<msg->total_hfields;i++) { for(i=0;i<msg->total_hfields;i++) {
msg->hdr.length+=sizeof(hfield_t); msg->hdr.length+=sizeof(hfield_t);
msg->hdr.length+=msg->hfield[i].length; msg->hdr.length+=msg->hfield[i].length;
} }
return(msg->hdr.length); return(msg->hdr.length);
} }
@ -694,23 +694,23 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
smb_freemsgmem(msg); smb_freemsgmem(msg);
sprintf(smb->last_error,"malloc failure of %d bytes for %d data fields" sprintf(smb->last_error,"malloc failure of %d bytes for %d data fields"
,(int)sizeof(dfield_t)*msg->hdr.total_dfields, msg->hdr.total_dfields); ,(int)sizeof(dfield_t)*msg->hdr.total_dfields, msg->hdr.total_dfields);
return(-3); return(-3);
} }
i=0; i=0;
while(i<msg->hdr.total_dfields && l<msg->hdr.length) { while(i<msg->hdr.total_dfields && l<msg->hdr.length) {
if(!fread(&msg->dfield[i],sizeof(dfield_t),1,smb->shd_fp)) { if(!fread(&msg->dfield[i],sizeof(dfield_t),1,smb->shd_fp)) {
smb_freemsgmem(msg); smb_freemsgmem(msg);
sprintf(smb->last_error,"reading data field %d",i); sprintf(smb->last_error,"reading data field %d",i);
return(-4); return(-4);
} }
i++; i++;
l+=sizeof(dfield_t); l+=sizeof(dfield_t);
} }
if(i<msg->hdr.total_dfields) { if(i<msg->hdr.total_dfields) {
smb_freemsgmem(msg); smb_freemsgmem(msg);
sprintf(smb->last_error,"insufficient data fields read (%d instead of %d)" sprintf(smb->last_error,"insufficient data fields read (%d instead of %d)"
,i,msg->hdr.total_dfields); ,i,msg->hdr.total_dfields);
return(-8); return(-8);
} }
while(l<msg->hdr.length) { while(l<msg->hdr.length) {
i=msg->total_hfields; i=msg->total_hfields;
@ -719,7 +719,7 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
sprintf(smb->last_error sprintf(smb->last_error
,"realloc failure of %d bytes for header field data" ,"realloc failure of %d bytes for header field data"
,(int)sizeof(void*)*(i+1)); ,(int)sizeof(void*)*(i+1));
return(-3); return(-3);
} }
msg->hfield_dat=vpp; msg->hfield_dat=vpp;
if((vp=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1)))==NULL) { if((vp=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1)))==NULL) {
@ -727,14 +727,14 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
sprintf(smb->last_error sprintf(smb->last_error
,"realloc failure of %d bytes for header fields" ,"realloc failure of %d bytes for header fields"
,(int)sizeof(hfield_t)*(i+1)); ,(int)sizeof(hfield_t)*(i+1));
return(-3); return(-3);
} }
msg->hfield=vp; msg->hfield=vp;
msg->total_hfields++; msg->total_hfields++;
if(!fread(&msg->hfield[i],sizeof(hfield_t),1,smb->shd_fp)) { if(!fread(&msg->hfield[i],sizeof(hfield_t),1,smb->shd_fp)) {
smb_freemsgmem(msg); smb_freemsgmem(msg);
sprintf(smb->last_error,"reading header field"); sprintf(smb->last_error,"reading header field");
return(-5); return(-5);
} }
l+=sizeof(hfield_t); l+=sizeof(hfield_t);
if((msg->hfield_dat[i]=(char*)MALLOC(msg->hfield[i].length+1)) if((msg->hfield_dat[i]=(char*)MALLOC(msg->hfield[i].length+1))
@ -743,20 +743,20 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
,"malloc failure of %d bytes for header field %d" ,"malloc failure of %d bytes for header field %d"
,msg->hfield[i].length+1, i); ,msg->hfield[i].length+1, i);
smb_freemsgmem(msg); /* or 0 length field */ smb_freemsgmem(msg); /* or 0 length field */
return(-3); return(-3);
} }
memset(msg->hfield_dat[i],0,msg->hfield[i].length+1); /* init to NULL */ memset(msg->hfield_dat[i],0,msg->hfield[i].length+1); /* init to NULL */
if(msg->hfield[i].length if(msg->hfield[i].length
&& !fread(msg->hfield_dat[i],msg->hfield[i].length,1,smb->shd_fp)) { && !fread(msg->hfield_dat[i],msg->hfield[i].length,1,smb->shd_fp)) {
smb_freemsgmem(msg); smb_freemsgmem(msg);
sprintf(smb->last_error,"reading header field data"); sprintf(smb->last_error,"reading header field data");
return(-6); return(-6);
} }
switch(msg->hfield[i].type) { /* convenience variables */ switch(msg->hfield[i].type) { /* convenience variables */
case SENDER: case SENDER:
if(!msg->from) { if(!msg->from) {
msg->from=(char *)msg->hfield_dat[i]; msg->from=(char *)msg->hfield_dat[i];
break; break;
} }
case FORWARDED: /* fall through */ case FORWARDED: /* fall through */
msg->forwarded=1; msg->forwarded=1;
@ -837,15 +837,15 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
case FIDOFLAGS: case FIDOFLAGS:
msg->ftn_flags=(char *)msg->hfield_dat[i]; msg->ftn_flags=(char *)msg->hfield_dat[i];
break; break;
} }
l+=msg->hfield[i].length; l+=msg->hfield[i].length;
} }
if(!msg->from || !msg->to || !msg->subj) { if(!msg->from || !msg->to || !msg->subj) {
sprintf(smb->last_error,"missing required header field (from/to/subj)"); sprintf(smb->last_error,"missing required header field (from/to/subj)");
smb_freemsgmem(msg); smb_freemsgmem(msg);
return(-7); return(-7);
} }
return(0); return(0);
} }
@ -932,21 +932,21 @@ int SMBCALL smb_hfield(smbmsg_t* msg, uint16_t type, size_t length, void* data)
int i; int i;
i=msg->total_hfields; i=msg->total_hfields;
if((vp=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1)))==NULL) if((vp=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1)))==NULL)
return(1); return(1);
msg->hfield=vp; msg->hfield=vp;
if((vpp=(void* *)REALLOC(msg->hfield_dat,sizeof(void* )*(i+1)))==NULL) if((vpp=(void* *)REALLOC(msg->hfield_dat,sizeof(void* )*(i+1)))==NULL)
return(2); return(2);
msg->hfield_dat=vpp; msg->hfield_dat=vpp;
msg->total_hfields++; msg->total_hfields++;
msg->hfield[i].type=type; msg->hfield[i].type=type;
msg->hfield[i].length=length; msg->hfield[i].length=length;
if(length) { if(length) {
if((msg->hfield_dat[i]=(void* )MALLOC(length))==NULL) if((msg->hfield_dat[i]=(void* )MALLOC(length))==NULL)
return(4); return(4);
memcpy(msg->hfield_dat[i],data,length); memcpy(msg->hfield_dat[i],data,length);
} }
else else
msg->hfield_dat[i]=NULL; msg->hfield_dat[i]=NULL;
@ -981,9 +981,9 @@ int SMBCALL smb_dfield(smbmsg_t* msg, uint16_t type, uint32_t length)
int i,j; int i,j;
i=msg->hdr.total_dfields; i=msg->hdr.total_dfields;
if((vp=(dfield_t *)REALLOC(msg->dfield,sizeof(dfield_t)*(i+1)))==NULL) if((vp=(dfield_t *)REALLOC(msg->dfield,sizeof(dfield_t)*(i+1)))==NULL)
return(1); return(1);
msg->dfield=vp; msg->dfield=vp;
msg->hdr.total_dfields++; msg->hdr.total_dfields++;
msg->dfield[i].type=type; msg->dfield[i].type=type;
@ -1022,7 +1022,7 @@ int SMBCALL smb_addcrc(smb_t* smb, uint32_t crc)
if(gtime(NULL)-start >= smb->retry_time) { if(gtime(NULL)-start >= smb->retry_time) {
sprintf(smb->last_error,"timeout opening %s (retry_time=%d)" sprintf(smb->last_error,"timeout opening %s (retry_time=%d)"
,str,smb->retry_time); ,str,smb->retry_time);
return(-2); return(-2);
} }
SLEEP(smb->retry_delay); SLEEP(smb->retry_delay);
} }
@ -1031,14 +1031,14 @@ int SMBCALL smb_addcrc(smb_t* smb, uint32_t crc)
if(length<0L) { if(length<0L) {
close(file); close(file);
sprintf(smb->last_error,"invalid file length: %d", length); sprintf(smb->last_error,"invalid file length: %d", length);
return(-4); return(-4);
} }
if((buf=(uint32_t*)MALLOC(smb->status.max_crcs*4))==NULL) { if((buf=(uint32_t*)MALLOC(smb->status.max_crcs*4))==NULL) {
close(file); close(file);
sprintf(smb->last_error sprintf(smb->last_error
,"malloc failure of %d bytes" ,"malloc failure of %d bytes"
,smb->status.max_crcs*4); ,smb->status.max_crcs*4);
return(-3); return(-3);
} }
if((uint32_t)length>=smb->status.max_crcs*4L) { /* Reached or exceeds max crcs */ if((uint32_t)length>=smb->status.max_crcs*4L) { /* Reached or exceeds max crcs */
read(file,buf,smb->status.max_crcs*4); read(file,buf,smb->status.max_crcs*4);
@ -1050,11 +1050,11 @@ int SMBCALL smb_addcrc(smb_t* smb, uint32_t crc)
FREE(buf); FREE(buf);
sprintf(smb->last_error sprintf(smb->last_error
,"duplicate message detected"); ,"duplicate message detected");
return(1); return(1);
} }
chsize(file,0L); /* truncate it */ chsize(file,0L); /* truncate it */
lseek(file,0L,SEEK_SET); lseek(file,0L,SEEK_SET);
write(file,buf+4,(smb->status.max_crcs-1)*4); write(file,buf+4,(smb->status.max_crcs-1)*4);
} }
else if(length/4) { /* Less than max crcs */ else if(length/4) { /* Less than max crcs */
@ -1067,8 +1067,8 @@ int SMBCALL smb_addcrc(smb_t* smb, uint32_t crc)
FREE(buf); FREE(buf);
sprintf(smb->last_error sprintf(smb->last_error
,"duplicate message detected"); ,"duplicate message detected");
return(1); return(1);
} }
} }
lseek(file,0L,SEEK_END); lseek(file,0L,SEEK_END);
@ -1113,7 +1113,7 @@ int SMBCALL smb_addmsghdr(smb_t* smb, smbmsg_t* msg, int storage)
smb_close_ha(smb); smb_close_ha(smb);
if(l==-1L) { if(l==-1L) {
smb_unlocksmbhdr(smb); smb_unlocksmbhdr(smb);
return(-1); return(-1);
} }
msg->idx.number=msg->hdr.number=smb->status.last_msg+1; msg->idx.number=msg->hdr.number=smb->status.last_msg+1;
@ -1182,7 +1182,7 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
sprintf(smb->last_error,"msgbase not open"); sprintf(smb->last_error,"msgbase not open");
return(SMB_ERR_NOT_OPEN); return(SMB_ERR_NOT_OPEN);
} }
if(msg->idx.offset<sizeof(smbhdr_t)+sizeof(smbstatus_t) if(msg->idx.offset<sizeof(smbhdr_t)+sizeof(smbstatus_t)
|| msg->idx.offset<smb->status.header_offset) { || msg->idx.offset<smb->status.header_offset) {
sprintf(smb->last_error,"invalid header offset: %d",msg->idx.offset); sprintf(smb->last_error,"invalid header offset: %d",msg->idx.offset);
return(-7); return(-7);
@ -1226,7 +1226,7 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
if(msg->hfield[i].length /* more then 0 bytes int32_t */ if(msg->hfield[i].length /* more then 0 bytes int32_t */
&& !fwrite(msg->hfield_dat[i],msg->hfield[i].length,1,smb->shd_fp)) { && !fwrite(msg->hfield_dat[i],msg->hfield[i].length,1,smb->shd_fp)) {
sprintf(smb->last_error,"writing header field data"); sprintf(smb->last_error,"writing header field data");
return(-5); return(-5);
} }
} }
@ -1236,7 +1236,7 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
sprintf(smb->last_error,"padding header block"); sprintf(smb->last_error,"padding header block");
return(-6); /* pad block with NULL */ return(-6); /* pad block with NULL */
} }
l++; l++;
} }
fflush(smb->shd_fp); fflush(smb->shd_fp);
return(0); return(0);
@ -1259,7 +1259,7 @@ int SMBCALL smb_create(smb_t* smb)
&& smb_locksmbhdr(smb)) /* header exists, so lock it */ && smb_locksmbhdr(smb)) /* header exists, so lock it */
return(1); return(1);
memset(&hdr,0,sizeof(smbhdr_t)); memset(&hdr,0,sizeof(smbhdr_t));
memcpy(hdr.id,SMB_HEADER_ID,LEN_HEADER_ID); memcpy(hdr.id,SMB_HEADER_ID,LEN_HEADER_ID);
hdr.version=SMB_VERSION; hdr.version=SMB_VERSION;
hdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t); hdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t);
smb->status.last_msg=smb->status.total_msgs=0; smb->status.last_msg=smb->status.total_msgs=0;
@ -1342,8 +1342,8 @@ int32_t SMBCALL smb_allocdat(smb_t* smb, uint32_t length, uint16_t headers)
else j=0; else j=0;
if(j==blocks) { if(j==blocks) {
offset-=(blocks*SDT_BLOCK_LEN); offset-=(blocks*SDT_BLOCK_LEN);
break; break;
} }
} }
clearerr(smb->sda_fp); clearerr(smb->sda_fp);
fseek(smb->sda_fp,(offset/SDT_BLOCK_LEN)*2L,SEEK_SET); fseek(smb->sda_fp,(offset/SDT_BLOCK_LEN)*2L,SEEK_SET);
@ -1431,7 +1431,7 @@ int SMBCALL smb_freemsgdat(smb_t* smb, uint32_t offset, uint32_t length, uint16_
} }
if(!fwrite(&i,2,1,smb->sda_fp)) { if(!fwrite(&i,2,1,smb->sda_fp)) {
sprintf(smb->last_error,"writing allocation bytes"); sprintf(smb->last_error,"writing allocation bytes");
retval=4; retval=4;
break; break;
} }
} }
@ -1459,14 +1459,14 @@ int SMBCALL smb_incdat(smb_t* smb, uint32_t offset, uint32_t length, uint16_t he
for(l=0;l<blocks;l++) { for(l=0;l<blocks;l++) {
fseek(smb->sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET); fseek(smb->sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET);
if(!fread(&i,2,1,smb->sda_fp)) { if(!fread(&i,2,1,smb->sda_fp)) {
sprintf(smb->last_error,"reading allocation record"); sprintf(smb->last_error,"reading allocation record");
return(1); return(1);
} }
i+=headers; i+=headers;
fseek(smb->sda_fp,-2L,SEEK_CUR); fseek(smb->sda_fp,-2L,SEEK_CUR);
if(!fwrite(&i,2,1,smb->sda_fp)) { if(!fwrite(&i,2,1,smb->sda_fp)) {
sprintf(smb->last_error,"writing allocation record"); sprintf(smb->last_error,"writing allocation record");
return(2); return(2);
} }
} }
fflush(smb->sda_fp); fflush(smb->sda_fp);
@ -1512,7 +1512,7 @@ int SMBCALL smb_freemsg(smb_t* smb, smbmsg_t* msg)
for(x=0;x<msg->hdr.total_dfields;x++) { for(x=0;x<msg->hdr.total_dfields;x++) {
if((i=smb_freemsgdat(smb,msg->hdr.offset+msg->dfield[x].offset if((i=smb_freemsgdat(smb,msg->hdr.offset+msg->dfield[x].offset
,msg->dfield[x].length,1))!=0) ,msg->dfield[x].length,1))!=0)
return(i); return(i);
} }
return(smb_freemsghdr(smb,msg->idx.offset-smb->status.header_offset return(smb_freemsghdr(smb,msg->idx.offset-smb->status.header_offset
,msg->hdr.length)); ,msg->hdr.length));
@ -1542,15 +1542,15 @@ int32_t SMBCALL smb_allochdr(smb_t* smb, uint32_t length)
fflush(smb->sha_fp); fflush(smb->sha_fp);
rewind(smb->sha_fp); rewind(smb->sha_fp);
while(!feof(smb->sha_fp)) { while(!feof(smb->sha_fp)) {
if(!fread(&c,1,1,smb->sha_fp)) if(!fread(&c,1,1,smb->sha_fp))
break; break;
offset+=SHD_BLOCK_LEN; offset+=SHD_BLOCK_LEN;
if(!c) i++; if(!c) i++;
else i=0; else i=0;
if(i==blocks) { if(i==blocks) {
offset-=(blocks*SHD_BLOCK_LEN); offset-=(blocks*SHD_BLOCK_LEN);
break; break;
} }
} }
clearerr(smb->sha_fp); clearerr(smb->sha_fp);
fseek(smb->sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET); fseek(smb->sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET);