]> git.proxmox.com Git - qemu.git/blobdiff - slirp/sbuf.c
Merge remote-tracking branch 'mjt/mjt-iov2' into staging
[qemu.git] / slirp / sbuf.c
index 04fb97ddc87cb1091ddeb9b19e1605a18dea5afc..637f8fea3d16b831dd884540c41a029ad0f8c5a4 100644 (file)
@@ -1,35 +1,29 @@
 /*
  * Copyright (c) 1995 Danny Gasparovski.
- * 
- * Please read the file COPYRIGHT for the 
+ *
+ * Please read the file COPYRIGHT for the
  * terms and conditions of the copyright.
  */
 
 #include <slirp.h>
+#include <main-loop.h>
 
-/* Done as a macro in socket.h */
-/* int
- * sbspace(struct sockbuff *sb) 
- * {
- *     return SB_DATALEN - sb->sb_cc;
- * }
- */
+static void sbappendsb(struct sbuf *sb, struct mbuf *m);
 
 void
-sbfree(sb)
-       struct sbuf *sb;
+sbfree(struct sbuf *sb)
 {
        free(sb->sb_data);
 }
 
 void
-sbdrop(sb, num)
-       struct sbuf *sb;
-       int num; 
+sbdrop(struct sbuf *sb, int num)
 {
-       /* 
+    int limit = sb->sb_datalen / 2;
+
+       /*
         * We can only drop how much we have
-        * This should never succeed 
+        * This should never succeed
         */
        if(num > sb->sb_cc)
                num = sb->sb_cc;
@@ -37,13 +31,14 @@ sbdrop(sb, num)
        sb->sb_rptr += num;
        if(sb->sb_rptr >= sb->sb_data + sb->sb_datalen)
                sb->sb_rptr -= sb->sb_datalen;
-   
+
+    if (sb->sb_cc < limit && sb->sb_cc + num >= limit) {
+        qemu_notify_event();
+    }
 }
 
 void
-sbreserve(sb, size)
-       struct sbuf *sb;
-       int size;
+sbreserve(struct sbuf *sb, int size)
 {
        if (sb->sb_data) {
                /* Already alloced, realloc if necessary */
@@ -72,23 +67,21 @@ sbreserve(sb, size)
  * (the socket is non-blocking, so we won't hang)
  */
 void
-sbappend(so, m)
-       struct socket *so;
-       struct mbuf *m;
+sbappend(struct socket *so, struct mbuf *m)
 {
        int ret = 0;
-       
+
        DEBUG_CALL("sbappend");
        DEBUG_ARG("so = %lx", (long)so);
        DEBUG_ARG("m = %lx", (long)m);
        DEBUG_ARG("m->m_len = %d", m->m_len);
-       
+
        /* Shouldn't happen, but...  e.g. foreign host closes connection */
        if (m->m_len <= 0) {
                m_free(m);
                return;
        }
-       
+
        /*
         * If there is urgent data, call sosendoob
         * if not all was sent, sowrite will take care of the rest
@@ -100,16 +93,16 @@ sbappend(so, m)
                sosendoob(so);
                return;
        }
-       
+
        /*
         * We only write if there's nothing in the buffer,
         * ottherwise it'll arrive out of order, and hence corrupt
         */
        if (!so->so_rcv.sb_cc)
-          ret = write(so->s, m->m_data, m->m_len);
-       
+          ret = slirp_send(so, m->m_data, m->m_len, 0);
+
        if (ret <= 0) {
-               /* 
+               /*
                 * Nothing was written
                 * It's possible that the socket has closed, but
                 * we don't need to check because if it has closed,
@@ -133,13 +126,11 @@ sbappend(so, m)
  * Copy the data from m into sb
  * The caller is responsible to make sure there's enough room
  */
-void
-sbappendsb(sb, m)
-        struct sbuf *sb;
-        struct mbuf *m;
+static void
+sbappendsb(struct sbuf *sb, struct mbuf *m)
 {
        int len, n,  nn;
-       
+
        len = m->m_len;
 
        if (sb->sb_wptr < sb->sb_rptr) {
@@ -173,14 +164,10 @@ sbappendsb(sb, m)
  * done in sbdrop when the data is acked
  */
 void
-sbcopy(sb, off, len, to)
-       struct sbuf *sb;
-       int off;
-       int len;
-       char *to;
+sbcopy(struct sbuf *sb, int off, int len, char *to)
 {
        char *from;
-       
+
        from = sb->sb_rptr + off;
        if (from >= sb->sb_data + sb->sb_datalen)
                from -= sb->sb_datalen;
@@ -198,4 +185,3 @@ sbcopy(sb, off, len, to)
                   memcpy(to+off,sb->sb_data,len);
        }
 }
-