+#ifndef MSG_MORE
+#define MSG_MORE 0x8000
+#endif
+
+#ifndef MSG_DONTWAIT
+#define MSG_DONTWAIT 0x40
+#endif
+
+/* -------------------------
+ * we don't use a circular buffer.
+*/
+void dsi_buffer(DSI *dsi)
+{
+ fd_set readfds, writefds;
+ int len;
+ int maxfd;
+
+ FD_ZERO(&readfds);
+ FD_ZERO(&writefds);
+ FD_SET( dsi->socket, &readfds);
+ FD_SET( dsi->socket, &writefds);
+ maxfd = dsi->socket +1;
+ while (1) {
+ FD_SET( dsi->socket, &readfds);
+ FD_SET( dsi->socket, &writefds);
+ if (select( maxfd, &readfds, &writefds, NULL, NULL) <= 0)
+ return;
+
+ if ( !FD_ISSET(dsi->socket, &readfds)) {
+ /* nothing waiting in the read queue */
+ return;
+ }
+ if (!dsi->buffer) {
+ /* XXX config options */
+ dsi->maxsize = 6 * dsi->server_quantum;
+ if (!dsi->maxsize)
+ dsi->maxsize = 6 * DSI_SERVQUANT_DEF;
+ dsi->buffer = malloc(dsi->maxsize);
+ if (!dsi->buffer) {
+ /* fall back to blocking IO */
+ dsi_block(dsi, 0);
+ return;
+ }
+ dsi->start = dsi->buffer;
+ dsi->eof = dsi->buffer;
+ dsi->end = dsi->buffer + dsi->maxsize;
+ }
+ len = dsi->end - dsi->eof;
+
+ if (len <= 0) {
+ /* ouch, our buffer is full !
+ * fall back to blocking IO
+ * could block and disconnect but it's better than a cpu hog
+ */
+ dsi_block(dsi, 0);
+ return;
+ }
+
+ len = read(dsi->socket, dsi->eof, len);
+ if (len <= 0)
+ return;
+ dsi->eof += len;
+ if ( FD_ISSET(dsi->socket, &writefds)) {
+ return;
+ }
+ }
+}