stream: Generalize stream_open_block().
authorBen Pfaff <blp@nicira.com>
Thu, 18 Mar 2010 19:59:32 +0000 (12:59 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 12 Apr 2010 18:13:04 +0000 (11:13 -0700)
This change makes it possible to separate opening a stream from blocking on
connection completion.  This avoids some code redundancy in an upcoming
commit.

lib/stream.c
lib/stream.h
ovsdb/ovsdb-client.c
tests/test-jsonrpc.c
tests/test-ovsdb.c

index ed497d693300c9bfba3511700ee78552ee2231a5..7d00cafe7cac59efbb6254d24b8dc161dc46d694 100644 (file)
@@ -222,13 +222,21 @@ error:
     return error;
 }
 
+/* Blocks until a previously started stream connection attempt succeeds or
+ * fails.  'error' should be the value returned by stream_open() and 'streamp'
+ * should point to the stream pointer set by stream_open().  Returns 0 if
+ * successful, otherwise a positive errno value other than EAGAIN or
+ * EINPROGRESS.  If successful, leaves '*streamp' untouched; on error, closes
+ * '*streamp' and sets '*streamp' to null.
+ *
+ * Typical usage:
+ *   error = stream_open_block(stream_open("tcp:1.2.3.4:5", &stream), &stream);
+ */
 int
-stream_open_block(const char *name, struct stream **streamp)
+stream_open_block(int error, struct stream **streamp)
 {
-    struct stream *stream;
-    int error;
+    struct stream *stream = *streamp;
 
-    error = stream_open(name, &stream);
     while (error == EAGAIN) {
         stream_run(stream);
         stream_run_wait(stream);
index d21de2f715e1e03c098880d9c1da5dd0df7b8084..8c4e78a36711ef11f451d790f5ebc4c45e76a4ae 100644 (file)
@@ -29,7 +29,7 @@ void stream_usage(const char *name, bool active, bool passive, bool bootstrap);
 /* Bidirectional byte streams. */
 int stream_verify_name(const char *name);
 int stream_open(const char *name, struct stream **);
-int stream_open_block(const char *name, struct stream **);
+int stream_open_block(int error, struct stream **);
 void stream_close(struct stream *);
 const char *stream_get_name(const struct stream *);
 uint32_t stream_get_remote_ip(const struct stream *);
index da7faf61aa18b95451ff8e2c8b5848a3a61ed7a6..a17c5aa863530ace1bcfcfd9171b7211f148d59f 100644 (file)
@@ -224,7 +224,7 @@ open_jsonrpc(const char *server)
     struct stream *stream;
     int error;
 
-    error = stream_open_block(server, &stream);
+    error = stream_open_block(stream_open(server, &stream), &stream);
     if (error == EAFNOSUPPORT) {
         struct pstream *pstream;
 
index 06b1cf4750dc6c71a5ce6f9b688cf0098b0ec0b1..f760b3ca317e754782a01c8c2ad5957e59afd740 100644 (file)
@@ -274,7 +274,7 @@ do_request(int argc OVS_UNUSED, char *argv[])
         ovs_fatal(0, "not a valid JSON-RPC request: %s", string);
     }
 
-    error = stream_open_block(argv[1], &stream);
+    error = stream_open_block(stream_open(argv[1], &stream), &stream);
     if (error) {
         ovs_fatal(error, "could not open \"%s\"", argv[1]);
     }
@@ -313,7 +313,7 @@ do_notify(int argc OVS_UNUSED, char *argv[])
         ovs_fatal(0, "not a JSON RPC-valid notification: %s", string);
     }
 
-    error = stream_open_block(argv[1], &stream);
+    error = stream_open_block(stream_open(argv[1], &stream), &stream);
     if (error) {
         ovs_fatal(error, "could not open \"%s\"", argv[1]);
     }
index b2ab4c6005638b24237aa1b84723dd8a009babf5..8cb6c9433456d2184cbd8a6500bfb015d9c622a6 100644 (file)
@@ -1764,7 +1764,7 @@ do_idl(int argc, char *argv[])
     if (argc > 2) {
         struct stream *stream;
 
-        error = stream_open_block(argv[1], &stream);
+        error = stream_open_block(stream_open(argv[1], &stream), &stream);
         if (error) {
             ovs_fatal(error, "failed to connect to \"%s\"", argv[1]);
         }