<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Mar 17, 2014 at 2:20 PM, Christophe Fergeau <span dir="ltr"><<a href="mailto:cfergeau@redhat.com" target="_blank">cfergeau@redhat.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This will allow to make RedsStream::async_read private<br>
---<br>
 server/reds_stream.c | 77 +++++++++++++++++++++++-----------------------------<br>
 server/reds_stream.h |  2 ++<br>
 2 files changed, 36 insertions(+), 43 deletions(-)<br>
<br>
diff --git a/server/reds_stream.c b/server/reds_stream.c<br>
index 873b953..57eb1d1 100644<br>
--- a/server/reds_stream.c<br>
+++ b/server/reds_stream.c<br>
@@ -310,8 +310,6 @@ RedsStream *reds_stream_new(int socket)<br>
     stream->priv->write = stream_write_cb;<br>
     stream->priv->writev = stream_writev_cb;<br>
<br>
-    stream->priv->async_read.stream = stream;<br>
-<br>
     return stream;<br>
 }<br>
<br>
@@ -396,11 +394,10 @@ void async_read_set_error_handler(AsyncRead *async,<br>
<br>
 static inline void async_read_clear_handlers(AsyncRead *obj)<br>
 {<br>
-    if (!obj->stream->watch) {<br>
-        return;<br>
+    if (obj->stream->watch) {<br>
+        reds_stream_remove_watch(obj->stream);<br>
     }<br>
-<br>
-    reds_stream_remove_watch(obj->stream);<br>
+    obj->stream = NULL;<br>
 }<br>
<br>
 void async_read_handler(int fd, int event, void *data)<br>
@@ -449,6 +446,23 @@ void async_read_handler(int fd, int event, void *data)<br>
     }<br>
 }<br>
<br>
+void reds_stream_async_read(RedsStream *stream,<br>
+                            uint8_t *data, size_t size,<br>
+                            AsyncReadDone read_done_cb,<br>
+                            void *opaque)<br>
+{<br>
+    AsyncRead *obj = &stream->priv->async_read;<br>
+<br></blockquote><div><br></div><div>s/obj/ async or op ?<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    g_assert(!obj->stream);<br></blockquote><div><br></div><div>Safer spice_return_if_fail() ?<br><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    obj->stream = stream;<br>
+    obj->now = data;<br>
+    obj->end = obj->now + size;<br>
+    obj->done = read_done_cb;<br>
+    obj->opaque = opaque;<br>
+    async_read_handler(0, 0, obj);<br>
+<br>
+}<br>
+<br>
 #if HAVE_SASL<br>
 bool reds_stream_write_u8(RedsStream *s, uint8_t n)<br>
 {<br>
@@ -638,7 +652,6 @@ RedsSaslError reds_sasl_handle_auth_step(RedsStream *stream, AsyncReadDone read_<br>
     char *clientdata = NULL;<br>
     RedsSASL *sasl = &stream->priv->sasl;<br>
     uint32_t datalen = sasl->len;<br>
-    AsyncRead *obj = &stream->priv->async_read;<br>
<br>
     /* NB, distinction of NULL vs "" is *critical* in SASL */<br>
     if (datalen) {<br>
@@ -683,10 +696,8 @@ RedsSaslError reds_sasl_handle_auth_step(RedsStream *stream, AsyncReadDone read_<br>
     if (err == SASL_CONTINUE) {<br>
         spice_info("%s", "Authentication must continue (step)");<br>
         /* Wait for step length */<br>
-        obj->now = (uint8_t *)&sasl->len;<br>
-        obj->end = obj->now + sizeof(uint32_t);<br>
-        obj->done = read_cb;<br>
-        async_read_handler(0, 0, &stream->priv->async_read);<br>
+        reds_stream_async_read(stream, (uint8_t *)&sasl->len, sizeof(uint32_t),<br>
+                               read_cb, opaque);<br>
         return REDS_SASL_ERROR_CONTINUE;<br>
     } else {<br>
         int ssf;<br>
@@ -718,7 +729,6 @@ authreject:<br>
<br>
 RedsSaslError reds_sasl_handle_auth_steplen(RedsStream *stream, AsyncReadDone read_cb, void *opaque)<br>
 {<br>
-    AsyncRead *obj = &stream->priv->async_read;<br>
     RedsSASL *sasl = &stream->priv->sasl;<br>
<br>
     spice_info("Got steplen %d", sasl->len);<br>
@@ -735,11 +745,8 @@ RedsSaslError reds_sasl_handle_auth_steplen(RedsStream *stream, AsyncReadDone re<br>
          * treatment */<br>
         return REDS_SASL_ERROR_OK;<br>
     } else {<br>
-        sasl->data = spice_realloc(sasl->data, sasl->len);<br>
-        obj->now = (uint8_t *)sasl->data;<br>
-        obj->end = obj->now + sasl->len;<br>
-        obj->done = read_cb;<br>
-        async_read_handler(0, 0, obj);<br>
+        reds_stream_async_read(stream, (uint8_t *)sasl->data, sasl->len,<br>
+                               read_cb, opaque);<br>
         return REDS_SASL_ERROR_OK;<br>
     }<br>
 }<br>
@@ -761,7 +768,6 @@ RedsSaslError reds_sasl_handle_auth_steplen(RedsStream *stream, AsyncReadDone re<br>
<br>
 RedsSaslError reds_sasl_handle_auth_start(RedsStream *stream, AsyncReadDone read_cb, void *opaque)<br>
 {<br>
-    AsyncRead *obj = &stream->priv->async_read;<br>
     const char *serverout;<br>
     unsigned int serveroutlen;<br>
     int err;<br>
@@ -813,10 +819,8 @@ RedsSaslError reds_sasl_handle_auth_start(RedsStream *stream, AsyncReadDone read<br>
     if (err == SASL_CONTINUE) {<br>
         spice_info("%s", "Authentication must continue (start)");<br>
         /* Wait for step length */<br>
-        obj->now = (uint8_t *)&sasl->len;<br>
-        obj->end = obj->now + sizeof(uint32_t);<br>
-        obj->done = read_cb;<br>
-        async_read_handler(0, 0, &stream->priv->async_read);<br>
+        reds_stream_async_read(stream, (uint8_t *)&sasl->len, sizeof(uint32_t),<br>
+                               read_cb, opaque);<br>
         return REDS_SASL_ERROR_CONTINUE;<br>
     } else {<br>
         int ssf;<br>
@@ -847,7 +851,6 @@ authreject:<br>
<br>
 RedsSaslError reds_sasl_handle_auth_startlen(RedsStream *stream, AsyncReadDone read_cb, void *opaque)<br>
 {<br>
-    AsyncRead *obj = &stream->priv->async_read;<br>
     RedsSASL *sasl = &stream->priv->sasl;<br>
<br>
     spice_info("Got client start len %d", sasl->len);<br>
@@ -861,17 +864,14 @@ RedsSaslError reds_sasl_handle_auth_startlen(RedsStream *stream, AsyncReadDone r<br>
     }<br>
<br>
     sasl->data = spice_realloc(sasl->data, sasl->len);<br>
-    obj->now = (uint8_t *)sasl->data;<br>
-    obj->end = obj->now + sasl->len;<br>
-    obj->done = read_cb;<br>
-    async_read_handler(0, 0, obj);<br>
+    reds_stream_async_read(stream, (uint8_t *)sasl->data, sasl->len,<br>
+                           read_cb, opaque);<br>
<br>
     return REDS_SASL_ERROR_OK;<br>
 }<br>
<br>
 bool reds_sasl_handle_auth_mechname(RedsStream *stream, AsyncReadDone read_cb, void *opaque)<br>
 {<br>
-    AsyncRead *obj = &stream->priv->async_read;<br>
     RedsSASL *sasl = &stream->priv->sasl;<br>
<br>
     sasl->mechname[sasl->len] = '\0';<br>
@@ -903,17 +903,14 @@ bool reds_sasl_handle_auth_mechname(RedsStream *stream, AsyncReadDone read_cb, v<br>
<br>
     spice_info("Validated mechname '%s'", sasl->mechname);<br>
<br>
-    obj->now = (uint8_t *)&sasl->len;<br>
-    obj->end = obj->now + sizeof(uint32_t);<br>
-    obj->done = read_cb;<br>
-    async_read_handler(0, 0, &stream->priv->async_read);<br>
+    reds_stream_async_read(stream, (uint8_t *)&sasl->len, sizeof(uint32_t),<br>
+                           read_cb, opaque);<br>
<br>
     return TRUE;<br>
 }<br>
<br>
 bool reds_sasl_handle_auth_mechlen(RedsStream *stream, AsyncReadDone read_cb, void *opaque)<br>
 {<br>
-    AsyncRead *obj = &stream->priv->async_read;<br>
     RedsSASL *sasl = &stream->priv->sasl;<br>
<br>
     if (sasl->len < 1 || sasl->len > 100) {<br>
@@ -924,10 +921,8 @@ bool reds_sasl_handle_auth_mechlen(RedsStream *stream, AsyncReadDone read_cb, vo<br>
     sasl->mechname = spice_malloc(sasl->len + 1);<br>
<br>
     spice_info("Wait for client mechname");<br>
-    obj->now = (uint8_t *)sasl->mechname;<br>
-    obj->end = obj->now + sasl->len;<br>
-    obj->done = read_cb;<br>
-    async_read_handler(0, 0, &stream->priv->async_read);<br>
+    reds_stream_async_read(stream, (uint8_t *)sasl->mechname, sasl->len,<br>
+                           read_cb, opaque);<br>
<br>
     return TRUE;<br>
 }<br>
@@ -939,7 +934,6 @@ bool reds_sasl_start_auth(RedsStream *stream, AsyncReadDone read_cb, void *opaqu<br>
     int err;<br>
     char *localAddr, *remoteAddr;<br>
     int mechlistlen;<br>
-    AsyncRead *obj = &stream->priv->async_read;<br>
     RedsSASL *sasl = &stream->priv->sasl;<br>
<br>
     if (!(localAddr = reds_stream_get_local_address(stream))) {<br>
@@ -1036,11 +1030,8 @@ bool reds_sasl_start_auth(RedsStream *stream, AsyncReadDone read_cb, void *opaqu<br>
     }<br>
<br>
     spice_info("Wait for client mechname length");<br>
-    obj->now = (uint8_t *)&sasl->len;<br>
-    obj->end = obj->now + sizeof(uint32_t);<br>
-    obj->done = read_cb;<br>
-    obj->opaque = opaque;<br>
-    async_read_handler(0, 0, obj);<br>
+    reds_stream_async_read(stream, (uint8_t *)&sasl->len, sizeof(uint32_t),<br>
+                           read_cb, opaque);<br>
<br>
     return TRUE;<br>
<br>
diff --git a/server/reds_stream.h b/server/reds_stream.h<br>
index ae3403a..866679a 100644<br>
--- a/server/reds_stream.h<br>
+++ b/server/reds_stream.h<br>
@@ -65,6 +65,8 @@ typedef enum {<br>
<br>
 /* any thread */<br>
 ssize_t reds_stream_read(RedsStream *s, void *buf, size_t nbyte);<br>
+void reds_stream_async_read(RedsStream *stream, uint8_t *data, size_t size,<br>
+                            AsyncReadDone read_done_cb, void *opaque);<br>
 ssize_t reds_stream_write(RedsStream *s, const void *buf, size_t nbyte);<br>
 ssize_t reds_stream_writev(RedsStream *s, const struct iovec *iov, int iovcnt);<br>
 bool reds_stream_write_all(RedsStream *stream, const void *in_buf, size_t n);<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.5.3<br>
<br>
_______________________________________________<br>
Spice-devel mailing list<br>
<a href="mailto:Spice-devel@lists.freedesktop.org">Spice-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/spice-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/spice-devel</a><br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br>Marc-André Lureau
</div></div>