diff --git a/libraries/liblber/lber-int.h b/libraries/liblber/lber-int.h
index ff5a1577eb84be2d4cf1bece18e2f6fca1f75ae7..b65553571df8f32541862fdeb2ced0f8f654a045 100644
--- a/libraries/liblber/lber-int.h
+++ b/libraries/liblber/lber-int.h
@@ -270,5 +270,7 @@ ber_pvt_sb_udp_set_dst LDAP_P((Sockbuf *sb, void *addr ));
 LDAP_F(	void * )
 ber_pvt_sb_udp_get_src LDAP_P((Sockbuf *sb ));
 
+LDAP_F( int )
+ber_pvt_socket_set_nonblock LDAP_P(( ber_socket_t sd, int nb ));
 
 #endif /* _LBER_INT_H */
diff --git a/libraries/liblber/sockbuf.c b/libraries/liblber/sockbuf.c
index b81235b9462f76001299f14b3904d88b581499b6..52b32040814001e76cd979e07216df9b284768e3 100644
--- a/libraries/liblber/sockbuf.c
+++ b/libraries/liblber/sockbuf.c
@@ -644,6 +644,23 @@ int ber_pvt_sb_set_readahead( Sockbuf *sb, int rh )
    return 0;
 }
 
+int ber_pvt_socket_set_nonblock( ber_socket_t sd, int nb )
+{
+#if HAVE_FCNTL
+	int flags = fcntl(ber_pvt_sb_get_desc(sb), F_GETFL);
+	if( nb ) {
+		flags |= O_NONBLOCK;
+	} else {
+		flags &= ~O_NONBLOCK;
+	}
+	return fcntl( ber_pvt_sb_get_desc(sb), F_SETFL, flags );
+		
+#elif defined( FIONBIO )
+	ioctl_t status = nb ? 1 : 0;
+	return ioctl( sd, FIONBIO, &status );
+#endif
+}
+
 #define USE_NONBLOCK
 #ifdef USE_NONBLOCK
 int ber_pvt_sb_set_nonblock( Sockbuf *sb, int nb )
@@ -662,19 +679,11 @@ int ber_pvt_sb_set_nonblock( Sockbuf *sb, int nb )
       sb->sb_read_ahead = 0;
 #endif
    }
-   if (ber_pvt_sb_in_use(sb)) {
-#if HAVE_FCNTL
-		int flags = fcntl(ber_pvt_sb_get_desc(sb), F_GETFL);
-		flags |= O_NONBLOCK;
-		return fcntl(ber_pvt_sb_get_desc(sb), F_SETFL, flags);
-		
-#elif defined( FIONBIO )
-	   /* WINSOCK requires the status to be a long */
-		ioctl_t status = (nb!=0);
-		return ioctl( ber_pvt_sb_get_desc(sb), FIONBIO, &status );
-#endif /* FIONBIO */
-   }
-   return 0;
+	if (ber_pvt_sb_in_use(sb)) {
+		return ber_pvt_socket_set_nonblock(
+			ber_pvt_sb_get_desc(sb), nb );
+	}
+	return 0;
 }
 #endif