diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index 40c4bea799bbf979bfe6d338f447ac5f802b758a..df35a7882bb004c6d7814c10e0c139ae5af399ad 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -68,7 +68,7 @@
 #include "filewrap.h"
 
 /* Use smb_ver() and smb_lib_ver() to obtain these values */
-#define SMBLIB_VERSION		"2.16"      /* SMB library version */
+#define SMBLIB_VERSION		"2.20"      /* SMB library version */
 #define SMB_VERSION 		0x0121		/* SMB format version */
 										/* High byte major, low byte minor */
 
@@ -82,6 +82,22 @@ char* SMBCALL smb_lib_ver(void)
 	return(SMBLIB_VERSION);
 }
 
+#if !defined(__unix__)
+/****************************************************************************/
+/* Truncates white-space chars off end of 'str'								*/
+/* Need for non-Unix version of STRERROR macro.								*/
+/****************************************************************************/
+static char* DLLCALL truncsp(char *str)
+{
+	uint c;
+
+	c=strlen(str);
+	while(c && (uchar)str[c-1]<=' ') c--;
+	str[c]=0;
+	return(str);
+}
+#endif
+
 /****************************************************************************/
 /* Open a message base of name 'smb->file'                                  */
 /* Opens files for READing messages or updating message indices only        */
@@ -102,14 +118,16 @@ int SMBCALL smb_open(smb_t* smb)
 	smb->last_error[0]=0;
 	sprintf(str,"%s.shd",smb->file);
 	if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO))==-1) {
-		sprintf(smb->last_error,"%d opening %s",errno,str);
-		return(2); 
+		sprintf(smb->last_error,"%d (%s) opening %s"
+			,errno,STRERROR(errno),str);
+		return(SMB_ERR_OPEN); 
 	}
 
 	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 (%s) fdopening %s (%d)"
+			,errno,STRERROR(errno),str,file);
 		close(file);
-		return(4); 
+		return(SMB_ERR_OPEN); 
 	}
 
 	if(filelength(file)>=sizeof(smbhdr_t)) {
@@ -117,29 +135,33 @@ int SMBCALL smb_open(smb_t* smb)
 		if(smb_locksmbhdr(smb)!=0) {
 			smb_close(smb);
 			/* smb_lockmsghdr set last_error */
-			return(-1); 
+			return(SMB_ERR_LOCK); 
 		}
 		memset(&hdr,0,sizeof(smbhdr_t));
 		if(fread(&hdr,sizeof(smbhdr_t),1,smb->shd_fp)!=1) {
-			sprintf(smb->last_error,"reading header");
+			sprintf(smb->last_error,"%d (%s) reading header"
+				,errno,STRERROR(errno));
 			smb_close(smb);
-			return(-10);
+			return(SMB_ERR_READ);
 		}
 		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);
-			return(-2); 
+			return(SMB_ERR_HDR_ID); 
 		}
 		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);
-			return(-3); 
+			return(SMB_ERR_HDR_VER); 
 		}
 		if(fread(&(smb->status),1,sizeof(smbstatus_t),smb->shd_fp)
 			!=sizeof(smbstatus_t)) {
-			sprintf(smb->last_error,"failed to read status");
+			sprintf(smb->last_error,"%d (%s) reading status"
+				,errno,STRERROR(errno));
 			smb_close(smb);
-			return(-4); 
+			return(SMB_ERR_READ); 
 		}
 		smb_unlocksmbhdr(smb);
 		rewind(smb->shd_fp); 
@@ -149,37 +171,41 @@ int SMBCALL smb_open(smb_t* smb)
 
 	sprintf(str,"%s.sdt",smb->file);
 	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 (%s) opening %s"
+			,errno,STRERROR(errno),str);
 		smb_close(smb);
-		return(1); 
+		return(SMB_ERR_OPEN); 
 	}
 
 	if((smb->sdt_fp=fdopen(file,"r+b"))==NULL) {
-		sprintf(smb->last_error,"%d fdopening %s (%d)",errno,str,file);
+		sprintf(smb->last_error,"%d (%s) fdopening %s (%d)"
+			,errno,STRERROR(errno),str,file);
 		close(file);
 		smb_close(smb);
-		return(5);
+		return(SMB_ERR_OPEN);
 	}
 
 	setvbuf(smb->sdt_fp,NULL,_IOFBF,2*1024);
 
 	sprintf(str,"%s.sid",smb->file);
 	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 (%s) opening %s"
+			,errno,STRERROR(errno),str);
 		smb_close(smb);
-		return(3); 
+		return(SMB_ERR_OPEN); 
 	}
 
 	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 (%s) fdopening %s (%d)"
+			,errno,STRERROR(errno),str,file);
 		close(file);
 		smb_close(smb);
-		return(6); 
+		return(SMB_ERR_OPEN); 
 	}
 
 	setvbuf(smb->sid_fp,NULL,_IOFBF,2*1024);
 
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -214,8 +240,9 @@ int SMBCALL smb_open_da(smb_t* smb)
 		if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW))!=-1)
 			break;
 		if(errno!=EACCES && errno!=EAGAIN) {
-			sprintf(smb->last_error,"%d opening %s",errno,str);
-			return(-1);
+			sprintf(smb->last_error,"%d (%s) opening %s"
+				,errno,STRERROR(errno),str);
+			return(SMB_ERR_OPEN);
 		}
 		if(!start)
 			start=time(NULL);
@@ -223,17 +250,18 @@ int SMBCALL smb_open_da(smb_t* smb)
 			if(time(NULL)-start>=(time_t)smb->retry_time) {
 				sprintf(smb->last_error,"timeout opening %s (retry_time=%ld)"
 					,str,smb->retry_time);
-				return(-2); 
+				return(SMB_ERR_TIMEOUT); 
 			}
 		SLEEP(smb->retry_delay);
 	}
 	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 (%s) fdopening %s (%d)"
+			,errno,STRERROR(errno),str,file);
 		close(file);
-		return(-3); 
+		return(SMB_ERR_OPEN); 
 	}
 	setvbuf(smb->sda_fp,NULL,_IOFBF,2*1024);
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 void SMBCALL smb_close_da(smb_t* smb)
@@ -259,8 +287,9 @@ int SMBCALL smb_open_ha(smb_t* smb)
 		if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW))!=-1)
 			break;
 		if(errno!=EACCES && errno!=EAGAIN) {
-			sprintf(smb->last_error,"%d opening %s",errno,str);
-			return(-1);
+			sprintf(smb->last_error,"%d (%s) opening %s"
+				,errno,STRERROR(errno),str);
+			return(SMB_ERR_OPEN);
 		}
 		if(!start)
 			start=time(NULL);
@@ -268,17 +297,18 @@ int SMBCALL smb_open_ha(smb_t* smb)
 			if(time(NULL)-start>=(time_t)smb->retry_time) {
 				sprintf(smb->last_error,"timeout opening %s (retry_time=%ld)"
 					,str,smb->retry_time);
-				return(-2); 
+				return(SMB_ERR_TIMEOUT); 
 			}
 		SLEEP(smb->retry_delay);
 	}
 	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 (%s) fdopening %s (%d)"
+			,errno,STRERROR(errno),str,file);
 		close(file);
-		return(-3); 
+		return(SMB_ERR_OPEN); 
 	}
 	setvbuf(smb->sha_fp,NULL,_IOFBF,2*1024);
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 void SMBCALL smb_close_ha(smb_t* smb)
@@ -313,20 +343,20 @@ int SMBCALL smb_stack(smb_t* smb, int op)
 	if(op==SMB_STACK_PUSH) {
 		if(stack_idx>=SMB_STACK_LEN) {
 			sprintf(smb->last_error,"SMB stack overflow");
-			return(1);
+			return(SMB_FAILURE);
 		}
 		if(smb->shd_fp==NULL || smb->sdt_fp==NULL || smb->sid_fp==NULL)
-			return(0);	  /* Msg base not open */
+			return(SMB_ERR_NOT_OPEN);	  /* Msg base not open */
 		memcpy(&stack[stack_idx],smb,sizeof(smb_t));
 		stack_idx++;
-		return(0); 
+		return(SMB_SUCCESS); 
 	}
 	/* pop or xchng */
 	if(!stack_idx)	/* Nothing on the stack, so do nothing */
-		return(0);
+		return(SMB_SUCCESS);
 	if(op==SMB_STACK_XCHNG) {
 		if(smb->shd_fp==NULL)
-			return(0);
+			return(SMB_SUCCESS);
 		memcpy(&tmp_smb,smb,sizeof(smb_t));
 	}
 
@@ -336,7 +366,7 @@ int SMBCALL smb_stack(smb_t* smb, int op)
 		memcpy(&stack[stack_idx],&tmp_smb,sizeof(smb_t));
 		stack_idx++;
 	}
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -357,8 +387,9 @@ int SMBCALL smb_trunchdr(smb_t* smb)
 		if(!chsize(fileno(smb->shd_fp),0L))
 			break;
 		if(errno!=EACCES && errno!=EAGAIN) {
-			sprintf(smb->last_error,"%d changing header file size",errno);
-			return(-1);
+			sprintf(smb->last_error,"%d (%s) changing header file size"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE);
 		}
 		if(!start)
 			start=time(NULL);
@@ -366,11 +397,11 @@ int SMBCALL smb_trunchdr(smb_t* smb)
 			if(time(NULL)-start>=(time_t)smb->retry_time) {	 /* Time-out */
 				sprintf(smb->last_error,"timeout changing header file size (retry_time=%ld)"
 					,smb->retry_time);
-				return(-2); 
+				return(SMB_ERR_TIMEOUT); 
 			}
 		SLEEP(smb->retry_delay);
 	}
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /*********************************/
@@ -391,7 +422,7 @@ int SMBCALL smb_locksmbhdr(smb_t* smb)
 	while(1) {
 		if(lock(fileno(smb->shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))==0) {
 			smb->locked=1;	/* TRUE */
-			return(0);
+			return(SMB_SUCCESS);
 		}
 		if(!start)
 			start=time(NULL);
@@ -404,7 +435,7 @@ int SMBCALL smb_locksmbhdr(smb_t* smb)
 		SLEEP(smb->retry_delay);
 	}
 	sprintf(smb->last_error,"timeout locking header");
-	return(-1);
+	return(SMB_ERR_TIMEOUT);
 }
 
 /****************************************************************************/
@@ -420,13 +451,17 @@ int SMBCALL smb_getstatus(smb_t* smb)
 	}
 	setvbuf(smb->shd_fp,smb->shd_buf,_IONBF,SHD_BLOCK_LEN);
 	clearerr(smb->shd_fp);
-	fseek(smb->shd_fp,sizeof(smbhdr_t),SEEK_SET);
+	if(fseek(smb->shd_fp,sizeof(smbhdr_t),SEEK_SET)) {
+		sprintf(smb->last_error,"%d (%s) seeking to %u in header file"
+			,errno,STRERROR(errno),sizeof(smbhdr_t));
+		return(SMB_ERR_SEEK);
+	}
 	i=fread(&(smb->status),1,sizeof(smbstatus_t),smb->shd_fp);
 	setvbuf(smb->shd_fp,smb->shd_buf,_IOFBF,SHD_BLOCK_LEN);
 	if(i==sizeof(smbstatus_t))
-		return(0);
-	sprintf(smb->last_error,"read %d instead of %d",i,(int)sizeof(smbstatus_t));
-	return(1);
+		return(SMB_SUCCESS);
+	sprintf(smb->last_error,"%d (%s) reading status",errno,STRERROR(errno));
+	return(SMB_ERR_READ);
 }
 
 /****************************************************************************/
@@ -441,13 +476,17 @@ int SMBCALL smb_putstatus(smb_t* smb)
 		return(SMB_ERR_NOT_OPEN);
 	}
 	clearerr(smb->shd_fp);
-	fseek(smb->shd_fp,sizeof(smbhdr_t),SEEK_SET);
+	if(fseek(smb->shd_fp,sizeof(smbhdr_t),SEEK_SET)) {
+		sprintf(smb->last_error,"%d (%s) seeking to %u in header file"
+			,errno,STRERROR(errno),sizeof(smbhdr_t));
+		return(SMB_ERR_SEEK);
+	}
 	i=fwrite(&(smb->status),1,sizeof(smbstatus_t),smb->shd_fp);
 	fflush(smb->shd_fp);
 	if(i==sizeof(smbstatus_t))
-		return(0);
-	sprintf(smb->last_error,"wrote %d instead of %d",i,(int)sizeof(smbstatus_t));
-	return(1);
+		return(SMB_SUCCESS);
+	sprintf(smb->last_error,"%d (%s) writing status",errno,STRERROR(errno));
+	return(SMB_ERR_WRITE);
 }
 
 /****************************************************************************/
@@ -484,7 +523,7 @@ int SMBCALL smb_lockmsghdr(smb_t* smb, smbmsg_t* msg)
 	}
 	while(1) {
 		if(!lock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t)))
-			return(0);
+			return(SMB_SUCCESS);
 		if(!start)
 			start=time(NULL);
 		else
@@ -495,7 +534,7 @@ int SMBCALL smb_lockmsghdr(smb_t* smb, smbmsg_t* msg)
 		SLEEP(smb->retry_delay);
 	}
 	sprintf(smb->last_error,"timeout locking header");
-	return(-1);
+	return(SMB_ERR_TIMEOUT);
 }
 
 /****************************************************************************/
@@ -517,37 +556,50 @@ int SMBCALL smb_getmsgidx(smb_t* smb, smbmsg_t* msg)
 	}
 	clearerr(smb->sid_fp);
 	if(!msg->hdr.number) {
-		fseek(smb->sid_fp,msg->offset*sizeof(idxrec_t),SEEK_SET);
+		if(fseek(smb->sid_fp,msg->offset*sizeof(idxrec_t),SEEK_SET)) {
+			sprintf(smb->last_error,"%d (%s) seeking to %u in index file"
+				,errno,STRERROR(errno)
+				,(unsigned)(msg->offset*sizeof(idxrec_t)));
+			return(SMB_ERR_SEEK);
+		}
 		if(!fread(&msg->idx,sizeof(idxrec_t),1,smb->sid_fp)) {
-			sprintf(smb->last_error,"reading index");
-			return(1);
+			sprintf(smb->last_error,"%d (%s) reading index"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_READ);
 		}
-		return(0); 
+		return(SMB_SUCCESS); 
 	}
 
 	length=filelength(fileno(smb->sid_fp));
 	if(!length) {
 		sprintf(smb->last_error,"invalid index file length: %ld",length);
-		return(1);
+		return(SMB_ERR_FILE_LEN);
 	}
 	total=length/sizeof(idxrec_t);
 	if(!total) {
 		sprintf(smb->last_error,"invalid index file length: %ld",length);
-		return(1);
+		return(SMB_ERR_FILE_LEN);
 	}
 
 	bot=0;
 	top=total;
 	l=total/2; /* Start at middle index */
 	while(1) {
-		fseek(smb->sid_fp,l*sizeof(idxrec_t),SEEK_SET);
+		if(fseek(smb->sid_fp,l*sizeof(idxrec_t),SEEK_SET)) {
+			sprintf(smb->last_error,"%d (%s) seeking to %u in index file"
+				,errno,STRERROR(errno)
+				,(unsigned)(l*sizeof(idxrec_t)));
+			return(SMB_ERR_SEEK);
+		}
 		if(!fread(&idx,sizeof(idxrec_t),1,smb->sid_fp)) {
-			sprintf(smb->last_error,"reading index");
-			return(1);
+			sprintf(smb->last_error,"%d (%s) reading index"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_READ);
 		}
 		if(bot==top-1 && idx.number!=msg->hdr.number) {
-			sprintf(smb->last_error,"msg %ld not found",msg->hdr.number);
-			return(1);
+			sprintf(smb->last_error,"msg %ld not found"
+				,msg->hdr.number);
+			return(SMB_ERR_NOT_FOUND);
 		}
 		if(idx.number>msg->hdr.number) {
 			top=l;
@@ -563,7 +615,7 @@ int SMBCALL smb_getmsgidx(smb_t* smb, smbmsg_t* msg)
 	}
 	msg->idx=idx;
 	msg->offset=l;
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -576,12 +628,17 @@ int SMBCALL smb_getfirstidx(smb_t* smb, idxrec_t *idx)
 		return(SMB_ERR_NOT_OPEN);
 	}
 	clearerr(smb->sid_fp);
-	fseek(smb->sid_fp,0,SEEK_SET);
+	if(fseek(smb->sid_fp,0,SEEK_SET)) {
+		sprintf(smb->last_error,"%d (%s) seeking to beginning of index file"
+			,errno,STRERROR(errno));
+		return(SMB_ERR_SEEK);
+	}
 	if(!fread(idx,sizeof(idxrec_t),1,smb->sid_fp)) {
-		sprintf(smb->last_error,"reading index");
-		return(-2);
+		sprintf(smb->last_error,"%d (%s) reading index"
+			,errno,STRERROR(errno));
+		return(SMB_ERR_READ);
 	}
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -599,14 +656,19 @@ int SMBCALL smb_getlastidx(smb_t* smb, idxrec_t *idx)
 	length=filelength(fileno(smb->sid_fp));
 	if(length<sizeof(idxrec_t)) {
 		sprintf(smb->last_error,"invalid index file length: %ld",length);
-		return(-1);
+		return(SMB_ERR_FILE_LEN);
+	}
+	if(fseek(smb->sid_fp,length-sizeof(idxrec_t),SEEK_SET)) {
+		sprintf(smb->last_error,"%d (%s) seeking to %u in index file"
+			,errno,STRERROR(errno)
+			,(unsigned)(length-sizeof(idxrec_t)));
+		return(SMB_ERR_SEEK);
 	}
-	fseek(smb->sid_fp,length-sizeof(idxrec_t),SEEK_SET);
 	if(!fread(idx,sizeof(idxrec_t),1,smb->sid_fp)) {
-		sprintf(smb->last_error,"reading index");
-		return(-2);
+		sprintf(smb->last_error,"%d (%s) reading index",errno,STRERROR(errno));
+		return(SMB_ERR_READ);
 	}
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -806,23 +868,32 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 		return(SMB_ERR_NOT_OPEN);
 	}
 	rewind(smb->shd_fp);
-	fseek(smb->shd_fp,msg->idx.offset,SEEK_SET);
+	if(fseek(smb->shd_fp,msg->idx.offset,SEEK_SET)) {
+		sprintf(smb->last_error,"%d (%s) seeking to %u in header"
+			,errno,STRERROR(errno)
+			,(unsigned)msg->idx.offset);
+		return(SMB_ERR_SEEK);
+	}
+
 	idx=msg->idx;
 	offset=msg->offset;
 	memset(msg,0,sizeof(smbmsg_t));
 	msg->idx=idx;
 	msg->offset=offset;
 	if(!fread(&msg->hdr,sizeof(msghdr_t),1,smb->shd_fp)) {
-		sprintf(smb->last_error,"reading msg header");
-		return(-1);
+		sprintf(smb->last_error,"%d (%s) reading msg header"
+			,errno,STRERROR(errno));
+		return(SMB_ERR_READ);
 	}
 	if(memcmp(msg->hdr.id,SHD_HEADER_ID,LEN_HEADER_ID)) {
-		sprintf(smb->last_error,"corrupt message header ID: %.*s",LEN_HEADER_ID,msg->hdr.id);
-		return(-2);
+		sprintf(smb->last_error,"corrupt message header ID: %.*s"
+			,LEN_HEADER_ID,msg->hdr.id);
+		return(SMB_ERR_HDR_ID);
 	}
 	if(msg->hdr.version<0x110) {
-		sprintf(smb->last_error,"insufficient header version: %X",msg->hdr.version);
-		return(-9);
+		sprintf(smb->last_error,"insufficient header version: %X"
+			,msg->hdr.version);
+		return(SMB_ERR_HDR_VER);
 	}
 	l=sizeof(msghdr_t);
 	if(msg->hdr.total_dfields && (msg->dfield
@@ -830,14 +901,15 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 		smb_freemsgmem(msg);
 		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);
-		return(-3); 
+		return(SMB_ERR_MEM); 
 	}
 	i=0;
 	while(i<msg->hdr.total_dfields && l<msg->hdr.length) {
 		if(!fread(&msg->dfield[i],sizeof(dfield_t),1,smb->shd_fp)) {
 			smb_freemsgmem(msg);
-			sprintf(smb->last_error,"reading data field %d",i);
-			return(-4); 
+			sprintf(smb->last_error,"%d (%s) reading data field %d"
+				,errno,STRERROR(errno),i);
+			return(SMB_ERR_READ); 
 		}
 		i++;
 		l+=sizeof(dfield_t); 
@@ -846,7 +918,7 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 		smb_freemsgmem(msg);
 		sprintf(smb->last_error,"insufficient data fields read (%d instead of %d)"
 			,i,msg->hdr.total_dfields);
-		return(-8); 
+		return(SMB_ERR_READ); 
 	}
 	while(l<msg->hdr.length) {
 		i=msg->total_hfields;
@@ -855,7 +927,7 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 			sprintf(smb->last_error
 				,"realloc failure of %d bytes for header field data"
 				,(int)sizeof(void*)*(i+1));
-			return(-3); 
+			return(SMB_ERR_MEM); 
 		}
 		msg->hfield_dat=vpp;
 		if((vp=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1)))==NULL) {
@@ -863,14 +935,15 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 			sprintf(smb->last_error
 				,"realloc failure of %d bytes for header fields"
 				,(int)sizeof(hfield_t)*(i+1));
-			return(-3); 
+			return(SMB_ERR_MEM); 
 		}
 		msg->hfield=vp;
 		msg->total_hfields++;
 		if(!fread(&msg->hfield[i],sizeof(hfield_t),1,smb->shd_fp)) {
 			smb_freemsgmem(msg);
-			sprintf(smb->last_error,"reading header field");
-			return(-5); 
+			sprintf(smb->last_error,"%d (%s) reading header field"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_READ); 
 		}
 		l+=sizeof(hfield_t);
 		if((msg->hfield_dat[i]=(char*)MALLOC(msg->hfield[i].length+1))
@@ -879,14 +952,15 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 				,"malloc failure of %d bytes for header field %d"
 				,msg->hfield[i].length+1, i);
 			smb_freemsgmem(msg);  /* or 0 length field */
-			return(-3); 
+			return(SMB_ERR_MEM); 
 		}
 		memset(msg->hfield_dat[i],0,msg->hfield[i].length+1);  /* init to NULL */
 		if(msg->hfield[i].length
 			&& !fread(msg->hfield_dat[i],msg->hfield[i].length,1,smb->shd_fp)) {
 			smb_freemsgmem(msg);
-			sprintf(smb->last_error,"reading header field data");
-			return(-6); 
+			sprintf(smb->last_error,"%d (%s) reading header field data"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_READ); 
 		}
 		set_convenience_ptr(msg,msg->hfield[i].type,msg->hfield_dat[i]);
 
@@ -896,14 +970,14 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 	if(!msg->from || !msg->to || !msg->subj) {
 		sprintf(smb->last_error,"missing required header field (from/to/subj)");
 		smb_freemsgmem(msg);
-		return(-7); 
+		return(SMB_ERR_HDR_FIELD); 
 	}
 
 	/* If no reverse path specified, use sender's address */
 	if(msg->reverse_path == NULL)
 		msg->reverse_path = msg->from_net.addr;
 
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -954,25 +1028,25 @@ int SMBCALL smb_copymsgmem(smbmsg_t* msg, smbmsg_t* srcmsg)
 
 	/* data field types/lengths */
 	if((msg->dfield=(dfield_t *)MALLOC(msg->hdr.total_dfields*sizeof(dfield_t)))==NULL)
-		return(1);
+		return(SMB_ERR_MEM);
 	memcpy(msg->dfield,srcmsg->dfield,msg->hdr.total_dfields*sizeof(dfield_t));
 
 	/* header field types/lengths */
 	if((msg->hfield=(hfield_t *)MALLOC(msg->total_hfields*sizeof(hfield_t)))==NULL)
-		return(2);
+		return(SMB_ERR_MEM);
 	memcpy(msg->hfield,srcmsg->hfield,msg->total_hfields*sizeof(hfield_t));
 
 	/* header field data */
 	if((msg->hfield_dat=(void**)MALLOC(msg->total_hfields*sizeof(void*)))==NULL)
-		return(3);
+		return(SMB_ERR_MEM);
 
 	for(i=0;i<msg->total_hfields;i++) {
 		if((msg->hfield_dat[i]=(void*)MALLOC(msg->hfield[i].length))==NULL)
-			return(4);
+			return(SMB_ERR_MEM);
 		memcpy(msg->hfield_dat[i],srcmsg->hfield_dat[i],msg->hfield[i].length);
 	}
 
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -1005,11 +1079,11 @@ int SMBCALL smb_hfield(smbmsg_t* msg, ushort type, size_t length, void* data)
 
 	i=msg->total_hfields;
 	if((hp=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1)))==NULL) 
-		return(1);
+		return(SMB_ERR_MEM);
 
 	msg->hfield=hp;
 	if((vpp=(void* *)REALLOC(msg->hfield_dat,sizeof(void* )*(i+1)))==NULL) 
-		return(2);
+		return(SMB_ERR_MEM);
 	
 	msg->hfield_dat=vpp;
 	msg->total_hfields++;
@@ -1017,7 +1091,7 @@ int SMBCALL smb_hfield(smbmsg_t* msg, ushort type, size_t length, void* data)
 	msg->hfield[i].length=length;
 	if(length) {
 		if((msg->hfield_dat[i]=(void* )MALLOC(length+1))==NULL) 
-			return(4);	/* Allocate 1 extra for ASCIIZ terminator */
+			return(SMB_ERR_MEM);	/* Allocate 1 extra for ASCIIZ terminator */
 		memset(msg->hfield_dat[i],0,length+1);
 		memcpy(msg->hfield_dat[i],data,length); 
 		set_convenience_ptr(msg,type,msg->hfield_dat[i]);
@@ -1028,7 +1102,7 @@ int SMBCALL smb_hfield(smbmsg_t* msg, ushort type, size_t length, void* data)
 	/* Maintain hdr.length so we don't exceed SMB_MAX_HDR_LEN */
 	msg->hdr.length+=sizeof(hfield_t);
 	msg->hdr.length+=length;
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -1060,7 +1134,7 @@ int SMBCALL smb_dfield(smbmsg_t* msg, ushort type, ulong length)
 
 	i=msg->hdr.total_dfields;
 	if((dp=(dfield_t *)REALLOC(msg->dfield,sizeof(dfield_t)*(i+1)))==NULL) 
-		return(1);
+		return(SMB_ERR_MEM);
 	
 	msg->dfield=dp;
 	msg->hdr.total_dfields++;
@@ -1068,7 +1142,7 @@ int SMBCALL smb_dfield(smbmsg_t* msg, ushort type, ulong length)
 	msg->dfield[i].length=length;
 	for(j=msg->dfield[i].offset=0;j<i;j++)
 		msg->dfield[i].offset+=msg->dfield[j].length;
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -1084,15 +1158,16 @@ int SMBCALL smb_addcrc(smb_t* smb, ulong crc)
 	time_t	start=0;
 
 	if(!smb->status.max_crcs)
-		return(0);
+		return(SMB_SUCCESS);
 
 	sprintf(str,"%s.sch",smb->file);
 	while(1) {
 		if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW))!=-1)
 			break;
 		if(errno!=EACCES && errno!=EAGAIN) {
-			sprintf(smb->last_error,"%d opening %s", errno, str);
-			return(-1);
+			sprintf(smb->last_error,"%d (%s) opening %s"
+				,errno,STRERROR(errno),str);
+			return(SMB_ERR_OPEN);
 		}
 		if(!start)
 			start=time(NULL);
@@ -1100,7 +1175,7 @@ int SMBCALL smb_addcrc(smb_t* smb, ulong crc)
 			if(time(NULL)-start>=(time_t)smb->retry_time) {
 				sprintf(smb->last_error,"timeout opening %s (retry_time=%ld)"
 					,str,smb->retry_time);
-				return(-2); 
+				return(SMB_ERR_TIMEOUT); 
 			}
 		SLEEP(smb->retry_delay);
 	}
@@ -1109,14 +1184,14 @@ int SMBCALL smb_addcrc(smb_t* smb, ulong crc)
 	if(length<0L) {
 		close(file);
 		sprintf(smb->last_error,"invalid file length: %ld", length);
-		return(-4); 
+		return(SMB_ERR_FILE_LEN); 
 	}
 	if((buf=(ulong*)MALLOC(smb->status.max_crcs*4))==NULL) {
 		close(file);
 		sprintf(smb->last_error
 			,"malloc failure of %ld bytes"
 			,smb->status.max_crcs*4);
-		return(-3); 
+		return(SMB_ERR_MEM); 
 	}
 	if((ulong)length>=smb->status.max_crcs*4L) { /* Reached or exceeds max crcs */
 		read(file,buf,smb->status.max_crcs*4);
@@ -1128,7 +1203,7 @@ int SMBCALL smb_addcrc(smb_t* smb, ulong crc)
 			FREE(buf);
 			sprintf(smb->last_error
 				,"duplicate message detected");
-			return(1); 
+			return(SMB_DUPE_MSG);
 		}
 		chsize(file,0L);				/* truncate it */
 		lseek(file,0L,SEEK_SET);
@@ -1145,7 +1220,7 @@ int SMBCALL smb_addcrc(smb_t* smb, ulong crc)
 			FREE(buf);
 			sprintf(smb->last_error
 				,"duplicate message detected");
-			return(1); 
+			return(SMB_DUPE_MSG);
 		} 
 	}
 
@@ -1153,7 +1228,7 @@ int SMBCALL smb_addcrc(smb_t* smb, ulong crc)
 	write(file,&crc,sizeof(crc)); 			   /* Write to the end */
 	FREE(buf);
 	close(file);
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -1178,10 +1253,10 @@ int SMBCALL smb_addmsghdr(smb_t* smb, smbmsg_t* msg, int storage)
 	}
 
 	if(!smb->locked && smb_locksmbhdr(smb))
-		return(1);
-	if(smb_getstatus(smb)) {
+		return(SMB_ERR_LOCK);
+	if((i=smb_getstatus(smb))!=0) {
 		smb_unlocksmbhdr(smb);
-		return(2);
+		return(i);
 	}
 
 	if(storage!=SMB_HYPERALLOC && (i=smb_open_ha(smb))!=0) {
@@ -1198,9 +1273,9 @@ int SMBCALL smb_addmsghdr(smb_t* smb, smbmsg_t* msg, int storage)
 		l=smb_allochdr(smb,msg->hdr.length);
 	if(storage!=SMB_HYPERALLOC)
 		smb_close_ha(smb);
-	if(l==-1L) {
+	if(l<0) {
 		smb_unlocksmbhdr(smb);
-		return(-1); 
+		return(l); 
 	}
 
 	msg->idx.number=msg->hdr.number=smb->status.last_msg+1;
@@ -1244,13 +1319,18 @@ int SMBCALL smb_putmsgidx(smb_t* smb, smbmsg_t* msg)
 		return(SMB_ERR_NOT_OPEN);
 	}
 	clearerr(smb->sid_fp);
-	fseek(smb->sid_fp,msg->offset*sizeof(idxrec_t),SEEK_SET);
+	if(fseek(smb->sid_fp,msg->offset*sizeof(idxrec_t),SEEK_SET)) {
+		sprintf(smb->last_error,"%d (%s) seeking to %u in header"
+			,errno,STRERROR(errno)
+			,(unsigned)(msg->offset*sizeof(idxrec_t)));
+		return(SMB_ERR_SEEK);
+	}
 	if(!fwrite(&msg->idx,sizeof(idxrec_t),1,smb->sid_fp)) {
-		sprintf(smb->last_error,"writing index");
-		return(1);
+		sprintf(smb->last_error,"%d (%s) writing index",errno,STRERROR(errno));
+		return(SMB_ERR_WRITE);
 	}
 	fflush(smb->sid_fp);
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -1272,12 +1352,13 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
 	if(msg->idx.offset<sizeof(smbhdr_t)+sizeof(smbstatus_t) 
 		|| msg->idx.offset<smb->status.header_offset) {
 		sprintf(smb->last_error,"invalid header offset: %ld",msg->idx.offset);
-		return(-7);
+		return(SMB_ERR_HDR_OFFSET);
 	}
 	clearerr(smb->shd_fp);
 	if(fseek(smb->shd_fp,msg->idx.offset,SEEK_SET)) {
-		sprintf(smb->last_error,"seeking to %ld in index",msg->idx.offset);
-		return(-1);
+		sprintf(smb->last_error,"%d (%s) seeking to %ld in index"
+			,errno,STRERROR(errno),msg->idx.offset);
+		return(SMB_ERR_SEEK);
 	}
 
 	/* Verify that the number of blocks required to stored the actual 
@@ -1294,7 +1375,7 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
 			"%lu (%lu blocks) vs %hu (%lu blocks)"
 			,hdrlen, smb_hdrblocks(hdrlen)
 			,msg->hdr.length, smb_hdrblocks(msg->hdr.length));
-		return(-8);
+		return(SMB_ERR_HDR_LEN);
 	}
 	msg->hdr.length=(ushort)hdrlen; /* store the actual header length */
 
@@ -1307,8 +1388,9 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
 	/* Write the fixed portion of the header record */
 	/************************************************/
 	if(!fwrite(&msg->hdr,sizeof(msghdr_t),1,smb->shd_fp)) {
-		sprintf(smb->last_error,"writing fixed portion of header record");
-		return(-2);
+		sprintf(smb->last_error,"%d (%s) writing fixed portion of header record"
+			,errno,STRERROR(errno));
+		return(SMB_ERR_WRITE);
 	}
 
 	/************************************************/
@@ -1316,8 +1398,9 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
 	/************************************************/
 	for(i=0;i<msg->hdr.total_dfields;i++)
 		if(!fwrite(&msg->dfield[i],sizeof(dfield_t),1,smb->shd_fp)) {
-			sprintf(smb->last_error,"writing data field");
-			return(-3);
+			sprintf(smb->last_error,"%d (%s) writing data field"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE);
 		}
 
 	/*******************************************/
@@ -1325,25 +1408,28 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg)
 	/*******************************************/
 	for(i=0;i<msg->total_hfields;i++) {
 		if(!fwrite(&msg->hfield[i],sizeof(hfield_t),1,smb->shd_fp)) {
-			sprintf(smb->last_error,"writing header field");
-			return(-4);
+			sprintf(smb->last_error,"%d (%s) writing header field"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE);
 		}
 		if(msg->hfield[i].length					 /* more then 0 bytes long */
 			&& !fwrite(msg->hfield_dat[i],msg->hfield[i].length,1,smb->shd_fp)) {
-			sprintf(smb->last_error,"writing header field data");
-			return(-5); 
+			sprintf(smb->last_error,"%d (%s) writing header field data"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE); 
 		}
 	}
 
 	while(hdrlen%SHD_BLOCK_LEN) {
 		if(fputc(0,smb->shd_fp)==EOF) {
-			sprintf(smb->last_error,"padding header block");
-			return(-6); 			   /* pad block with NULL */
+			sprintf(smb->last_error,"%d (%s) padding header block"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE); 			   /* pad block with NULL */
 		}
 		hdrlen++; 
 	}
 	fflush(smb->shd_fp);
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -1361,7 +1447,7 @@ int SMBCALL smb_create(smb_t* smb)
 	}
 	if(filelength(fileno(smb->shd_fp))>=sizeof(smbhdr_t)+sizeof(smbstatus_t)
 		&& smb_locksmbhdr(smb))  /* header exists, so lock it */
-		return(1);
+		return(SMB_ERR_LOCK);
 	memset(&hdr,0,sizeof(smbhdr_t));
 	memcpy(hdr.id,SMB_HEADER_ID,LEN_HEADER_ID);     
 	hdr.version=SMB_VERSION;
@@ -1387,7 +1473,7 @@ int SMBCALL smb_create(smb_t* smb)
 	sprintf(str,"%s.sch",smb->file);
 	remove(str);
 	smb_unlocksmbhdr(smb);
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -1450,11 +1536,14 @@ long SMBCALL smb_allocdat(smb_t* smb, ulong length, ushort headers)
 		} 
 	}
 	clearerr(smb->sda_fp);
-	fseek(smb->sda_fp,(offset/SDT_BLOCK_LEN)*2L,SEEK_SET);
+	if(fseek(smb->sda_fp,(offset/SDT_BLOCK_LEN)*2L,SEEK_SET)) {
+		return(SMB_ERR_SEEK);
+	}
 	for(l=0;l<blocks;l++)
 		if(!fwrite(&headers,2,1,smb->sda_fp)) {
-			sprintf(smb->last_error,"writing allocation bytes");
-			return(-1);
+			sprintf(smb->last_error,"%d (%s) writing allocation bytes"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE);
 		}
 	fflush(smb->sda_fp);
 	return(offset);
@@ -1475,15 +1564,18 @@ long SMBCALL smb_fallocdat(smb_t* smb, ulong length, ushort headers)
 	fflush(smb->sda_fp);
 	clearerr(smb->sda_fp);
 	blocks=smb_datblocks(length);
-	fseek(smb->sda_fp,0L,SEEK_END);
+	if(fseek(smb->sda_fp,0L,SEEK_END)) {
+		return(SMB_ERR_SEEK);
+	}
 	offset=(ftell(smb->sda_fp)/2L)*SDT_BLOCK_LEN;
 	for(l=0;l<blocks;l++)
 		if(!fwrite(&headers,2,1,smb->sda_fp))
 			break;
 	fflush(smb->sda_fp);
 	if(l<blocks) {
-		sprintf(smb->last_error,"writing allocation bytes");
-		return(-1L);
+		sprintf(smb->last_error,"%d (%s) writing allocation bytes"
+			,errno,STRERROR(errno));
+		return(SMB_ERR_WRITE);
 	}
 	return(offset);
 }
@@ -1501,7 +1593,7 @@ int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length
 	ulong	l,blocks;
 
 	if(smb->status.attr&SMB_HYPERALLOC)	/* do nothing */
-		return(0);
+		return(SMB_SUCCESS);
 
 	blocks=smb_datblocks(length);
 
@@ -1515,14 +1607,16 @@ int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length
 	for(l=0;l<blocks;l++) {
 		if(fseek(smb->sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET)) {
 			sprintf(smb->last_error
-				,"seeking to %ld of allocation file"
+				,"%d (%s) seeking to %ld of allocation file"
+				,errno,STRERROR(errno)
 				,((offset/SDT_BLOCK_LEN)+l)*2L);
-			retval=1;
+			retval=SMB_ERR_SEEK;
 			break;
 		}
 		if(!fread(&i,2,1,smb->sda_fp)) {
-			sprintf(smb->last_error,"reading allocation bytes");
-			retval=2;
+			sprintf(smb->last_error,"%d (%s) reading allocation bytes"
+				,errno,STRERROR(errno));
+			retval=SMB_ERR_READ;
 			break;
 		}
 		if(!headers || headers>i)
@@ -1530,13 +1624,15 @@ int SMBCALL smb_freemsgdat(smb_t* smb, ulong offset, ulong length
 		else
 			i-=headers;
 		if(fseek(smb->sda_fp,-2L,SEEK_CUR)) {
-			sprintf(smb->last_error,"seeking backwards 2 bytes in allocation file");
-			retval=3;
+			sprintf(smb->last_error,"%d (%s) seeking backwards 2 bytes in allocation file"
+				,errno,STRERROR(errno));
+			retval=SMB_ERR_SEEK;
 			break;
 		}
 		if(!fwrite(&i,2,1,smb->sda_fp)) {
-			sprintf(smb->last_error,"writing allocation bytes");
-			retval=4; 
+			sprintf(smb->last_error,"%d (%s) writing allocation bytes"
+				,errno,STRERROR(errno));
+			retval=SMB_ERR_WRITE; 
 			break;
 		}
 	}
@@ -1562,20 +1658,26 @@ int SMBCALL smb_incdat(smb_t* smb, ulong offset, ulong length, ushort headers)
 	clearerr(smb->sda_fp);
 	blocks=smb_datblocks(length);
 	for(l=0;l<blocks;l++) {
-		fseek(smb->sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET);
+		if(fseek(smb->sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET)) {
+			return(SMB_ERR_SEEK);
+		}
 		if(!fread(&i,2,1,smb->sda_fp)) {
-			sprintf(smb->last_error,"reading allocation record");			
-			return(1);
+			sprintf(smb->last_error,"%d (%s) reading allocation record"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_READ);
 		}
 		i+=headers;
-		fseek(smb->sda_fp,-2L,SEEK_CUR);
+		if(fseek(smb->sda_fp,-2L,SEEK_CUR)) {
+			return(SMB_ERR_SEEK);
+		}
 		if(!fwrite(&i,2,1,smb->sda_fp)) {
-			sprintf(smb->last_error,"writing allocation record");
-			return(2); 
+			sprintf(smb->last_error,"%d (%s) writing allocation record"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE); 
 		}
 	}
 	fflush(smb->sda_fp);
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -1590,7 +1692,7 @@ int SMBCALL smb_incmsg(smb_t* smb, smbmsg_t* msg)
 	ushort	x;
 
 	if(smb->status.attr&SMB_HYPERALLOC)  /* Nothing to do */
-		return(0);
+		return(SMB_SUCCESS);
 
 	if(smb->sda_fp==NULL) {
 		if((i=smb_open_da(smb))!=0)
@@ -1624,14 +1726,16 @@ int SMBCALL smb_freemsghdr(smb_t* smb, ulong offset, ulong length)
 	}
 	clearerr(smb->sha_fp);
 	blocks=smb_hdrblocks(length);
-	fseek(smb->sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET);
+	if(fseek(smb->sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET))
+		return(SMB_ERR_SEEK);
 	for(l=0;l<blocks;l++)
 		if(!fwrite(&c,1,1,smb->sha_fp)) {
-			sprintf(smb->last_error,"writing allocation record");
-			return(1);
+			sprintf(smb->last_error,"%d (%s) writing allocation record"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE);
 		}
 	fflush(smb->sha_fp);
-	return(0);
+	return(SMB_SUCCESS);
 }
 
 /****************************************************************************/
@@ -1643,7 +1747,7 @@ int SMBCALL smb_freemsg(smb_t* smb, smbmsg_t* msg)
 	ushort	x;
 
 	if(smb->status.attr&SMB_HYPERALLOC)  /* Nothing to do */
-		return(0);
+		return(SMB_SUCCESS);
 
 	for(x=0;x<msg->hdr.total_dfields;x++) {
 		if((i=smb_freemsgdat(smb,msg->hdr.offset+msg->dfield[x].offset
@@ -1661,7 +1765,7 @@ int SMBCALL smb_freemsg(smb_t* smb, smbmsg_t* msg)
 /* Returns offset to beginning of header (in bytes, not blocks) 			*/
 /* Assumes smb_open_ha() has been called									*/
 /* smb_close_ha() should be called after									*/
-/* Returns -1L on error 													*/
+/* Returns negative value on error 											*/
 /****************************************************************************/
 long SMBCALL smb_allochdr(smb_t* smb, ulong length)
 {
@@ -1689,12 +1793,14 @@ long SMBCALL smb_allochdr(smb_t* smb, ulong length)
 		} 
 	}
 	clearerr(smb->sha_fp);
-	fseek(smb->sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET);
+	if(fseek(smb->sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET))
+		return(SMB_ERR_SEEK);
 	c=1;
 	for(l=0;l<blocks;l++)
 		if(!fwrite(&c,1,1,smb->sha_fp)) {
-			sprintf(smb->last_error,"writing allocation record");
-			return(-1L);
+			sprintf(smb->last_error,"%d (%s) writing allocation record"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE);
 		}
 	fflush(smb->sha_fp);
 	return(offset);
@@ -1702,7 +1808,7 @@ long SMBCALL smb_allochdr(smb_t* smb, ulong length)
 
 /****************************************************************************/
 /* Allocates space for index, but doesn't search for unused blocks          */
-/* Returns -1L on error 													*/
+/* Returns negative value on error 												*/
 /****************************************************************************/
 long SMBCALL smb_fallochdr(smb_t* smb, ulong length)
 {
@@ -1716,12 +1822,14 @@ long SMBCALL smb_fallochdr(smb_t* smb, ulong length)
 	blocks=smb_hdrblocks(length);
 	fflush(smb->sha_fp);
 	clearerr(smb->sha_fp);
-	fseek(smb->sha_fp,0L,SEEK_END);
+	if(fseek(smb->sha_fp,0L,SEEK_END))
+		return(SMB_ERR_SEEK);
 	offset=ftell(smb->sha_fp)*SHD_BLOCK_LEN;
 	for(l=0;l<blocks;l++)
 		if(!fwrite(&c,1,1,smb->sha_fp)) {
-			sprintf(smb->last_error,"writing allocation record");
-			return(-1L);
+			sprintf(smb->last_error,"%d (%s) writing allocation record"
+				,errno,STRERROR(errno));
+			return(SMB_ERR_WRITE);
 		}
 	fflush(smb->sha_fp);
 	return(offset);
@@ -1741,7 +1849,8 @@ long SMBCALL smb_hallochdr(smb_t* smb)
 		return(SMB_ERR_NOT_OPEN);
 	}
 	fflush(smb->shd_fp);
-	fseek(smb->shd_fp,0L,SEEK_END);
+	if(fseek(smb->shd_fp,0L,SEEK_END))
+		return(SMB_ERR_SEEK);
 	l=ftell(smb->shd_fp);
 	if(l<smb->status.header_offset) 			 /* Header file truncated?!? */
 		return(smb->status.header_offset);
@@ -1765,7 +1874,8 @@ long SMBCALL smb_hallocdat(smb_t* smb)
 		return(SMB_ERR_NOT_OPEN);
 	}
 	fflush(smb->sdt_fp);
-	fseek(smb->sdt_fp,0L,SEEK_END);
+	if(fseek(smb->sdt_fp,0L,SEEK_END))
+		return(SMB_ERR_SEEK);
 	l=ftell(smb->sdt_fp);
 	if(l<=0)
 		return(l);