diff --git a/src/backend.c b/src/backend.c
index 667b0618fcfc004935f0919f6f0c6e8823845c6f..b846529f76f3e6baa619d150c67ef85fc221e959 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: backend.c,v 1.36 1998/07/19 14:13:06 grubba Exp $");
+RCSID("$Id: backend.c,v 1.37 1998/10/21 14:59:33 grubba Exp $");
 #include "fdlib.h"
 #include "backend.h"
 #include <errno.h>
@@ -61,6 +61,12 @@ struct selectors
 {
   my_fd_set read;
   my_fd_set write;
+#ifdef WITH_OOB
+  /* except == incoming OOB data
+   * outgoing OOB data is multiplexed on write
+   */
+  my_fd_set except;
+#endif /* WITH_OOB */
 };
 
 static struct selectors selectors;
@@ -208,6 +214,9 @@ void init_backend(void)
 #ifndef HAVE_POLL
   my_FD_ZERO(&selectors.read);
   my_FD_ZERO(&selectors.write);
+#ifdef WITH_OOB
+  my_FD_ZERO(&selectors.except);
+#endif /* WITH_OOB */
 #endif
   if(pike_make_pipe(wakeup_pipe) < 0)
     fatal("Couldn't create backend wakup pipe! errno=%d.\n",errno);
@@ -253,7 +262,7 @@ void set_read_callback(int fd,file_callback cb,void *data)
   {
 #ifdef HAVE_POLL
     if(!was_set)
-      POLL_FD_SET(fd,POLLRDNORM);
+      POLL_FD_SET(fd, POLLRDNORM);
 #else
     my_FD_SET(fd, &selectors.read);
 #endif
@@ -269,13 +278,17 @@ void set_read_callback(int fd,file_callback cb,void *data)
       {
 	while(max_fd >=0 &&
 	      !my_FD_ISSET(max_fd, &selectors.read) &&
-	      !my_FD_ISSET(max_fd, &selectors.write))
+	      !my_FD_ISSET(max_fd, &selectors.write)
+#ifdef WITH_OOB
+	      && !my_FD_ISSET(max_fd, &selectors.except)
+#endif /* WITH_OOB */
+	      )
 	  max_fd--;
       }
     }
 #else
     if(was_set)
-      POLL_FD_CLR(fd,POLLRDNORM);
+      POLL_FD_CLR(fd, POLLRDNORM);
 #endif
   }
 }
@@ -307,18 +320,33 @@ void set_write_callback(int fd,file_callback cb,void *data)
 #ifndef HAVE_POLL
     if(fd <= max_fd)
     {
-      my_FD_CLR(fd, &selectors.write);
-      if(fd == max_fd)
-      {
-	while(max_fd >=0 &&
-	      !my_FD_ISSET(max_fd, &selectors.read) &&
-	      !my_FD_ISSET(max_fd, &selectors.write))
-	  max_fd--;
+#ifdef WITH_POLL
+      if (!fds[fd].write_oob.callback) {
+#endif /* WITH_POLL */
+	my_FD_CLR(fd, &selectors.write);
+	if(fd == max_fd)
+	{
+	  while(max_fd >=0 &&
+		!my_FD_ISSET(max_fd, &selectors.read) &&
+		!my_FD_ISSET(max_fd, &selectors.write)
+#ifdef WITH_OOB
+		&& !my_FD_ISSET(max_fd, &selectors.except)
+#endif /* WITH_OOB */
+		)
+	    max_fd--;
+	}
+#ifdef WITH_POLL
       }
+#endif /* WITH_POLL */
     }
 #else
+#if POLLWRBAND == POLLOUT
+    if (was_set && !fds[fd].write_oob.callback)
+      POLL_FD_CLR(fd, POLLOUT);
+#else /* POLLWRBAND != POLLOUT */
     if(was_set)
-      POLL_FD_CLR(fd,POLLOUT);
+      POLL_FD_CLR(fd, POLLOUT);
+#endif /* POLLWRBAND == POLLOUT */
 #endif
   }
 }
@@ -339,30 +367,30 @@ void set_read_oob_callback(int fd,file_callback cb,void *data)
   if(cb)
   {
 #ifdef HAVE_POLL
-    POLL_FD_SET(fd,POLLRDBAND);
+    POLL_FD_SET(fd, POLLRDBAND);
 #else
-    my_FD_SET(fd, &selectors.read);	/* FIXME:? */
+    my_FD_SET(fd, &selectors.except);
 #endif
     if(max_fd < fd) max_fd = fd;
     wake_up_backend();
   }else{
 #ifndef HAVE_POLL
-    /* FIXME:? */
     if(fd <= max_fd)
     {
-      my_FD_CLR(fd, &selectors.read);
+      my_FD_CLR(fd, &selectors.except);
 
       if(fd == max_fd)
       {
 	while(max_fd >=0 &&
 	      !my_FD_ISSET(max_fd, &selectors.read) &&
-	      !my_FD_ISSET(max_fd, &selectors.write))
+	      !my_FD_ISSET(max_fd, &selectors.write) &&
+	      !my_FD_ISSET(max_fd, &selectors.except))
 	  max_fd--;
       }
     }
 #else
     if(was_set)
-      POLL_FD_CLR(fd,POLLRDBAND);
+      POLL_FD_CLR(fd, POLLRDBAND);
 #endif
   }
 }
@@ -394,13 +422,16 @@ void set_write_oob_callback(int fd,file_callback cb,void *data)
     /* FIXME:? */
     if(fd <= max_fd)
     {
-      my_FD_CLR(fd, &selectors.write);
-      if(fd == max_fd)
-      {
-	while(max_fd >=0 &&
-	      !my_FD_ISSET(max_fd, &selectors.read) &&
-	      !my_FD_ISSET(max_fd, &selectors.write))
-	  max_fd--;
+      if (!fds[fd].write.callback) {
+	my_FD_CLR(fd, &selectors.write);
+	if(fd == max_fd)
+	{
+	  while(max_fd >=0 &&
+		!my_FD_ISSET(max_fd, &selectors.read) &&
+		!my_FD_ISSET(max_fd, &selectors.write) &&
+		!my_FD_ISSET(max_fd, &selectors.except))
+	    max_fd--;
+	}
       }
     }
 #else
@@ -529,11 +560,15 @@ void do_debug(void)
 #ifndef HAVE_POLL
   for(e=0;e<=max_fd;e++)
   {
-    if(my_FD_ISSET(e,&selectors.read) || my_FD_ISSET(e,&selectors.write))
+    if(my_FD_ISSET(e, &selectors.read) || my_FD_ISSET(e, &selectors.write)
+#ifdef WITH_OOB
+       || my_FD_ISSET(e, &selectors.except)
+#endif /* WITH_OOB */
+       )
     {
       int ret;
       do {
-	ret=fd_fstat(e, &tmp);
+	ret = fd_fstat(e, &tmp);
       }while(ret < 0 && errno == EINTR);
 
       if(ret<0)
@@ -581,8 +616,13 @@ void backend(void)
 {
   JMP_BUF back;
   int i, delay;
+#ifndef HAVE_POLL
   fd_set rset;
   fd_set wset;
+#ifdef WITH_OOB
+  fd_set eset;
+#endif /* WITH_OOB */
+#endif /* !HAVE_POLL */
 
   if(SETJMP(back))
   {
@@ -609,6 +649,9 @@ void backend(void)
     /* FIXME: OOB? */
     fd_copy_my_fd_set_to_fd_set(&rset, &selectors.read, max_fd+1);
     fd_copy_my_fd_set_to_fd_set(&wset, &selectors.write, max_fd+1);
+#ifdef WITH_OOB
+    fd_copy_my_fd_set_to_fd_set(&eset, &selectors.except, max_fd+1);
+#endif /* WITH_OOB */
 #else
     switch_poll_set();
 #endif
@@ -632,11 +675,17 @@ void backend(void)
 #ifdef HAVE_POLL
     {
       int msec = (next_timeout.tv_sec*1000) + next_timeout.tv_usec/1000;
-      i=poll(active_poll_fds, active_num_in_poll, msec);
+      i = poll(active_poll_fds, active_num_in_poll, msec);
     }
 #else
     /* FIXME: OOB? */
-    i=fd_select(max_fd+1, &rset, &wset, 0, &next_timeout);
+    i = fd_select(max_fd+1, &rset, &wset, 
+#ifdef WITH_OOB
+		  &eset,
+#else /* !WITH_OOB */
+		  0, 
+#endif /* WITH_OOB */
+		  &next_timeout);
 #endif
     THREADS_DISALLOW();
     may_need_wakeup=0;
@@ -652,11 +701,24 @@ void backend(void)
       /* FIXME: OOB? */
       for(i=0; i<max_fd+1; i++)
       {
+#ifdef WITH_OOB
+	if(fd_FD_ISSET(i, &eset) && fds[i].read_oob.callback)
+	  (*(fds[i].read_oob.callback))(i, fds[i].read_oob.data);
+#endif /* WITH_OOB */
+
 	if(fd_FD_ISSET(i, &rset) && fds[i].read.callback)
-	  (*(fds[i].read.callback))(i,fds[i].read.data);
+	  (*(fds[i].read.callback))(i, fds[i].read.data);
 
-	if(fd_FD_ISSET(i, &wset) && fds[i].write.callback)
-	  (*(fds[i].write.callback))(i,fds[i].write.data);
+	if(fd_FD_ISSET(i, &wset)) {
+#ifdef WITH_OOB
+	  if (fds[i].write_oob.callback) {
+	    (*(fds[i].write_oob.callback))(i, fds[i].write_oob.data);
+	  } else
+#endif /* WITH_OOB */
+	    if (fds[i].write.callback) {
+	      (*(fds[i].write.callback))(i, fds[i].write.data);
+	    }
+	}
       }
 #else
       for(i=0; i<active_num_in_poll; i++)
@@ -739,7 +801,7 @@ void backend(void)
 
 	if(active_poll_fds[i].revents & POLLOUT) {
 	  if (fds[fd].write.callback) {
-	    (*(fds[fd].write.callback))(fd,fds[fd].write.data);
+	    (*(fds[fd].write.callback))(fd, fds[fd].write.data);
 	  } else {
 	    POLL_FD_CLR(fd, POLLOUT);
 	  }
@@ -799,9 +861,18 @@ void backend(void)
 	/* FIXME: OOB? */
 	fd_copy_my_fd_set_to_fd_set(&rset, &selectors.read, max_fd+1);
 	fd_copy_my_fd_set_to_fd_set(&wset, &selectors.write, max_fd+1);
+#ifdef WITH_OOB
+	fd_copy_my_fd_set_to_fd_set(&eset, &selectors.except, max_fd+1);
+#endif /* WITH_OOB */
 	next_timeout.tv_usec=0;
 	next_timeout.tv_sec=0;
-	if(fd_select(max_fd+1, &rset, &wset, 0, &next_timeout) < 0)
+	if(fd_select(max_fd+1, &rset, &wset,
+#ifdef WITH_OOB
+		     &eset,
+#else /* !WITH_OOB */
+		     0,
+#endif /* WITH_OOB */
+		     &next_timeout) < 0)
 	{
 	  switch(errno)
 	  {
@@ -816,19 +887,36 @@ void backend(void)
 	      int i;
 	      for(i=0;i<MAX_OPEN_FILEDESCRIPTORS;i++)
 	      {
-		if(!my_FD_ISSET(i, &selectors.read) && !my_FD_ISSET(i,&selectors.write))
+		if(!my_FD_ISSET(i, &selectors.read) &&
+		   !my_FD_ISSET(i, &selectors.write)
+#ifdef WITH_OOB
+		   && !my_FD_ISSET(i, &selectors.except)
+#endif /* WITH_OOB */
+		   )
 		  continue;
 		
 		fd_FD_ZERO(& rset);
 		fd_FD_ZERO(& wset);
+#ifdef WITH_OOB
+		fd_FD_ZERO(& eset);
+#endif /* WITH_OOB */
 		
 		if(my_FD_ISSET(i, &selectors.read))  fd_FD_SET(i, &rset);
 		if(my_FD_ISSET(i, &selectors.write)) fd_FD_SET(i, &wset);
+#ifdef WITH_OOB
+		if(my_FD_ISSET(i, &selectors.except)) fd_FD_SET(i, &eset);
+#endif /* WITH_OOB */
 		
 		next_timeout.tv_usec=0;
 		next_timeout.tv_sec=0;
 		
-		if(fd_select(max_fd+1, &rset, &wset, 0, &next_timeout) < 0)
+		if(fd_select(max_fd+1, &rset, &wset,
+#ifdef WITH_OOB
+			     &eset,
+#else /* !WITH_OOB */
+			     0,
+#endif /* WITH_OOB */
+			     &next_timeout) < 0)
 		{
 		  switch(errno)
 		  {