diff --git a/src/sbbs3/ringbuf.c b/src/sbbs3/ringbuf.c
index d38d6048cac7c818eaf0ce26933f95af29e331ea..cb0a29487b138ec508e85de1866f3bd1f6d2fbca 100644
--- a/src/sbbs3/ringbuf.c
+++ b/src/sbbs3/ringbuf.c
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -96,6 +96,7 @@ int RINGBUFCALL RingBufInit( RingBuf* rb, DWORD size
     rb->size=size;
 #ifdef RINGBUF_SEM
 	sem_init(&rb->sem,0,0);
+	sem_init(&rb->empty_sem,0,0);
 	sem_init(&rb->highwater_sem,0,0);
 #endif
 #ifdef RINGBUF_MUTEX
@@ -109,8 +110,10 @@ void RINGBUFCALL RingBufDispose( RingBuf* rb)
     if(rb->pStart!=NULL)
 		os_free(rb->pStart);
 #ifdef RINGBUF_SEM
-	sem_post(&rb->sem);		/* just incase someone's waiting */
+	sem_post(&rb->sem);			/* just incase someone's waiting */
+	sem_post(&rb->empty_sem);	/* just incase someone's waiting */
 	sem_destroy(&rb->sem);
+	sem_destroy(&rb->empty_sem);
 	sem_destroy(&rb->highwater_sem);
 #endif
 #ifdef RINGBUF_MUTEX
@@ -133,7 +136,7 @@ DWORD RINGBUFCALL RingBufFull( RingBuf* rb )
 	if(head >= tail)
 		retval = head - tail;
 	else
-		retval = rb->size - (tail - head);
+		retval = rb->size - (tail - (head + 1));
 
 #ifdef RINGBUF_MUTEX
 	pthread_mutex_unlock(&rb->mutex);
@@ -196,6 +199,9 @@ DWORD RINGBUFCALL RingBufWrite( RingBuf* rb, BYTE* src,  DWORD cnt )
 	sem_post(&rb->sem);
 	if(rb->highwater_mark!=0 && RingBufFull(rb)>=rb->highwater_mark)
 		sem_post(&rb->highwater_sem);
+/*	do we need this here?
+	sem_reset(&rb->empty_sem); 
+*/
 #endif
 #ifdef RINGBUF_MUTEX
 	pthread_mutex_unlock(&rb->mutex);
@@ -248,9 +254,11 @@ DWORD RINGBUFCALL RingBufRead( RingBuf* rb, BYTE* dst,  DWORD cnt )
     if(rb->pTail > rb->pEnd)
 		rb->pTail = rb->pStart;
 
-#ifdef RINGBUF_SEM		/* clear semaphores, if appropriate */
-	if(len-cnt==0)	/* empty */
+#ifdef RINGBUF_SEM		/* clear/signal semaphores, if appropriate */
+	if(len-cnt==0) {	/* empty */
+		sem_post(&rb->empty_sem);
 		sem_reset(&rb->sem);
+	}
 	if(len-cnt<rb->highwater_mark)
 		sem_reset(&rb->highwater_sem);
 #endif
@@ -311,6 +319,7 @@ void RINGBUFCALL RingBufReInit(RingBuf* rb)
 	rb->pHead = rb->pTail = rb->pStart;
 #ifdef RINGBUF_SEM
 	sem_reset(&rb->sem);
+	sem_reset(&rb->empty_sem);
 	sem_reset(&rb->highwater_sem);
 #endif
 #ifdef RINGBUF_MUTEX
diff --git a/src/sbbs3/ringbuf.h b/src/sbbs3/ringbuf.h
index 41b283b1fe146e96fe56491a8cdab0f9511edf60..d343b2ad5fe229dc0d348154ebb0942e5d432ff1 100644
--- a/src/sbbs3/ringbuf.h
+++ b/src/sbbs3/ringbuf.h
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -83,6 +83,7 @@ typedef struct {
     DWORD	size;
 #ifdef RINGBUF_SEM
 	sem_t	sem;			/* semaphore used to signal data waiting */
+	sem_t	empty_sem;		/* semaphore used to signal empty buffer */
 	sem_t	highwater_sem;	/* semaphore used to signal highwater mark reached */
 	DWORD	highwater_mark;
 #endif