Changeset: 9d7879af4bff for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9d7879af4bff
Modified Files:
        clients/mapilib/connect.c
        clients/mapilib/connect_openssl.c
        clients/mapilib/mapi.c
        clients/mapilib/mapi_intern.h
        common/stream/openssl_stream.c
Branch: monetdburl
Log Message:

Send leading NULs on the raw connection, not on the blockstream


diffs (133 lines):

diff --git a/clients/mapilib/connect.c b/clients/mapilib/connect.c
--- a/clients/mapilib/connect.c
+++ b/clients/mapilib/connect.c
@@ -178,7 +178,7 @@ wrap_socket(Mapi mid, SOCKET sock)
                goto bailout;
        }
 
-       msg = mapi_set_streams(mid, rstream, wstream);
+       msg = mapi_wrap_streams(mid, rstream, wstream);
        if (msg != MOK)
                goto bailout;
        return MOK;
@@ -275,31 +275,6 @@ connect_socket_tcp(Mapi mid)
        if (msg != MOK)
                return msg;
 
-       // Send some NUL bytes. If we're accidentally connecting to the wrong
-       // port or protocol this may cause the remote server to close the
-       // connection. If we don't do this, the connection will often hang
-       // because the server expects us to speak first and we expect the server
-       // to speak first.
-       //
-       // Note that a pair of NUL bytes is a no-op message in MAPI.
-       //
-       // Surprisingly, it seems sending these NUL bytes makes non-TLS
-       // connection setup a little faster rather than slower!
-       static const char zeroes[8] = { 0 };
-       ssize_t to_write = sizeof(zeroes);
-       while (to_write > 0) {
-               ssize_t n = mnstr_write(mid->to, zeroes, 1, to_write);
-               if (n < 0) {
-                       close_connection(mid);
-                       return mapi_printError(mid, __func__, MERROR, "could 
not send leader block: %s", mnstr_peek_error(mid->to));
-               }
-               to_write -= (size_t)n;
-       }
-       if (mnstr_flush(mid->to, MNSTR_FLUSH_DATA) != 0) {
-               close_connection(mid);
-               return mapi_printError(mid, __func__, MERROR, "could not flush 
leader block: %s", mnstr_peek_error(mid->to));
-       }
-
        return msg;
 }
 
diff --git a/clients/mapilib/connect_openssl.c 
b/clients/mapilib/connect_openssl.c
--- a/clients/mapilib/connect_openssl.c
+++ b/clients/mapilib/connect_openssl.c
@@ -205,7 +205,7 @@ wrap_tls(Mapi mid, SOCKET sock)
                return croak(mid, __func__, "openssl_wstream: %s", 
mnstr_peek_error(wstream));
        }
        // On error: free 'rstream' and 'wstream'.
-       msg = mapi_set_streams(mid, rstream, wstream);
+       msg = mapi_wrap_streams(mid, rstream, wstream);
        if (msg != MOK) {
                mnstr_close(rstream);
                mnstr_close(wstream);
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -4614,7 +4614,7 @@ mapi_get_active(Mapi mid)
 
 
 MapiMsg
-mapi_set_streams(Mapi mid, stream *rstream, stream *wstream)
+mapi_wrap_streams(Mapi mid, stream *rstream, stream *wstream)
 {
        // do not use check_stream here yet because the socket is not yet in 
'mid'
        const char *error_message;
@@ -4623,6 +4623,32 @@ mapi_set_streams(Mapi mid, stream *rstre
        assert(!isa_block_stream(rstream));
        assert(!isa_block_stream(wstream));
 
+       // First send some NUL bytes. If we're accidentally connecting to the 
wrong
+       // port or protocol this may cause the remote server to close the
+       // connection. If we don't do this, the connection will often hang
+       // because the server expects us to speak first and we expect the server
+       // to speak first.
+       //
+       // Note that a pair of NUL bytes is a no-op message in MAPI.
+       //
+       // Surprisingly, it seems sending these NUL bytes makes non-TLS
+       // connection setup a little faster rather than slower!
+       static const char zeroes[8] = { 0 };
+       ssize_t to_write = sizeof(zeroes);
+       while (to_write > 0) {
+               ssize_t n = mnstr_write(wstream, zeroes, 1, to_write);
+               if (n < 0) {
+                       close_connection(mid);
+                       return mapi_printError(mid, __func__, MERROR, "could 
not send leader block: %s", mnstr_peek_error(wstream));
+               }
+               to_write -= (size_t)n;
+       }
+       if (mnstr_flush(wstream, MNSTR_FLUSH_DATA) != 0) {
+               close_connection(mid);
+               return mapi_printError(mid, __func__, MERROR, "could not flush 
leader block: %s", mnstr_peek_error(wstream));
+       }
+
+
        stream *brstream = NULL;
        stream *bwstream = NULL;
 
diff --git a/clients/mapilib/mapi_intern.h b/clients/mapilib/mapi_intern.h
--- a/clients/mapilib/mapi_intern.h
+++ b/clients/mapilib/mapi_intern.h
@@ -303,7 +303,7 @@ extern const struct MapiStruct MapiStruc
 Mapi mapi_new(void);
 
 MapiMsg wrap_tls(Mapi mid, SOCKET sock);
-MapiMsg mapi_set_streams(Mapi mid, stream *rstream, stream *wstream);
+MapiMsg mapi_wrap_streams(Mapi mid, stream *rstream, stream *wstream);
 
 MapiMsg scan_unix_sockets(Mapi mid);
 MapiMsg connect_socket_unix(Mapi mid);
diff --git a/common/stream/openssl_stream.c b/common/stream/openssl_stream.c
--- a/common/stream/openssl_stream.c
+++ b/common/stream/openssl_stream.c
@@ -129,9 +129,13 @@ ostream_close(stream *s)
 int
 ostream_flush(stream *s, mnstr_flush_level flush_level)
 {
-       (void)s;
        (void)flush_level;
-       mnstr_set_error(s, MNSTR_WRITE_ERROR, "flush not implemented");
-       return -1;
+       BIO *bio = (BIO*) s->stream_data.p;
+       // This segfaults, I don't understand why.
+       // It seems to work without it so for the time being leave it commented 
out.
+       // if (1 != BIO_flush(bio))
+       //      return ostream_error(s, MNSTR_WRITE_ERROR);
+       (void)bio;
+       return 0;
 }
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to