lookip: Disconnect asynchronously to avoid dead-locking watcher unregistration
[strongswan.git] / src / libstrongswan / networking / streams / stream.h
index 17e5a94..3516d91 100644 (file)
@@ -39,9 +39,8 @@ typedef stream_t*(*stream_constructor_t)(char *uri);
 /**
  * Callback function prototype, called when stream is ready.
  *
- * It is not allowed to destroy the stream during the callback, this would
- * deadlock. Instead, return FALSE to destroy the stream. It is not allowed
- * to call on_read()/on_write() during this callback.
+ * It is not allowed to destroy the stream nor to call on_read()/on_write/()
+ * during the callback.
  *
  * As select() may return even if a read()/write() would actually block, it is
  * recommended to use the non-blocking calls and handle return values
@@ -49,7 +48,7 @@ typedef stream_t*(*stream_constructor_t)(char *uri);
  *
  * @param data                 data passed during callback registration
  * @param stream               associated stream
- * @return                             FALSE to destroy the stream
+ * @return                             FALSE unregisters the invoked callback, TRUE keeps it
  */
 typedef bool (*stream_cb_t)(void *data, stream_t *stream);
 
@@ -72,6 +71,19 @@ struct stream_t {
        ssize_t (*read)(stream_t *this, void *buf, size_t len, bool block);
 
        /**
+        * Read data from the stream, avoiding short reads.
+        *
+        * This call is always blocking, and reads until len has been read
+        * completely. If the connection is closed before enough bytes could be
+        * returned, errno is set to ECONNRESET.
+        *
+        * @param buf           data buffer to read into
+        * @param len           number of bytes to read
+        * @return                      TRUE if len bytes read, FALSE on error
+        */
+       bool (*read_all)(stream_t *this, void *buf, size_t len);
+
+       /**
         * Register a callback to invoke when stream has data to read.
         *
         * @param cb            callback function, NULL to unregister
@@ -93,6 +105,18 @@ struct stream_t {
        ssize_t (*write)(stream_t *this, void *buf, size_t len, bool block);
 
        /**
+        * Write data to the stream, avoiding short writes.
+        *
+        * This call is always blocking, and writes until len bytes has been
+        * written.
+        *
+        * @param buf           data buffer to write
+        * @param len           number of bytes to write
+        * @return                      TRUE if len bytes written, FALSE on error
+        */
+       bool (*write_all)(stream_t *this, void *buf, size_t len);
+
+       /**
         * Register a callback to invoke when a write would not block.
         *
         * @param cb            callback function, NULL to unregister