lookip: Disconnect asynchronously to avoid dead-locking watcher unregistration
[strongswan.git] / src / libstrongswan / networking / streams / stream.h
index 842ad8e..3516d91 100644 (file)
@@ -26,6 +26,7 @@ typedef struct stream_t stream_t;
 #include <library.h>
 
 #include <sys/un.h>
+#include <sys/socket.h>
 
 /**
  * Constructor function prototype for stream_t.
@@ -38,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
@@ -48,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);
 
@@ -71,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
@@ -92,30 +105,31 @@ struct stream_t {
        ssize_t (*write)(stream_t *this, void *buf, size_t len, bool block);
 
        /**
-        * Register a callback to invoke when a write would not block.
+        * Write data to the stream, avoiding short writes.
         *
-        * @param cb            callback function, NULL to unregister
-        * @param data          data to pass to callback
+        * 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
         */
-       void (*on_write)(stream_t *this, stream_cb_t cb, void *data);
+       bool (*write_all)(stream_t *this, void *buf, size_t len);
 
        /**
-        * printf() convenience function for this stream.
+        * Register a callback to invoke when a write would not block.
         *
-        * @param format        printf format string
-        * @param ...           argument list for format string
-        * @return                      number of characters written, negative on error
+        * @param cb            callback function, NULL to unregister
+        * @param data          data to pass to callback
         */
-       int (*print)(stream_t *this, char *format, ...);
+       void (*on_write)(stream_t *this, stream_cb_t cb, void *data);
 
        /**
-        * vprintf() convenience function for this stream.
+        * Get a FILE reference for this stream.
         *
-        * @param format        printf format string
-        * @param ap            argument list for format string
-        * @return                      number of characters written, negative on error
+        * @return                      FILE*, must be fclose()d, NULL on error
         */
-       int (*vprint)(stream_t *this, char *format, va_list ap);
+       FILE* (*get_file)(stream_t *this);
 
        /**
         * Destroy a stream_t.
@@ -146,6 +160,32 @@ stream_t *stream_create_unix(char *uri);
 int stream_parse_uri_unix(char *uri, struct sockaddr_un *addr);
 
 /**
+ * Create a stream for TCP sockets.
+ *
+ * TCP URIs start with tcp://, followed by a hostname (FQDN or IP), followed
+ * by a colon separated port. A full TCP uri looks something like:
+ *
+ *   tcp://srv.example.com:5555
+ *   tcp://0.0.0.0:1234
+ *   tcp://[fec2::1]:7654
+ *
+ * There is no default port, so a colon after tcp:// is mandatory.
+ *
+ * @param uri          TCP socket specific URI, must start with "tcp://"
+ * @return                     stream instance, NULL on failure
+ */
+stream_t *stream_create_tcp(char *uri);
+
+/**
+ * Helper function to parse a tcp:// URI to a sockaddr
+ *
+ * @param uri          URI
+ * @param addr         sockaddr, large enough for URI
+ * @return                     length of sockaddr, -1 on error
+ */
+int stream_parse_uri_tcp(char *uri, struct sockaddr *addr);
+
+/**
  * Create a stream from a file descriptor.
  *
  * The file descriptor MUST be a socket for non-blocking operation.