-Sat Jul 12 04:39:49 CDT 2014
+Thu Jul 17 01:07:28 CDT 2014
{
size_t r;
int sanity = 2000;
+ int ssl_err = 0;
if (wsh->ssl) {
do {
if (sanity < 2000) {
ms_sleep(1);
}
- } while (--sanity > 0 && r == -1 && SSL_get_error(wsh->ssl, r) == SSL_ERROR_WANT_WRITE);
+ if (r == -1) {
+ ssl_err = SSL_get_error(wsh->ssl, r);
+ }
+
+ } while (--sanity > 0 && r == -1 && ssl_err == SSL_ERROR_WANT_WRITE);
+
+ if (ssl_err) {
+ r = ssl_err * -1;
+ }
+
return r;
}
wsh->down = 2;
+ if (wsh->write_buffer) {
+ free(wsh->write_buffer);
+ wsh->write_buffer = NULL;
+ wsh->write_buffer_len = 0;
+ }
+
if (wsh->ssl) {
int code;
do {
{
uint8_t hdr[14] = { 0 };
size_t hlen = 2;
+ uint8_t *bp;
+ ssize_t raw_ret = 0;
if (wsh->down) {
return -1;
*u64 = htonl(bytes);
}
- if (ws_raw_write(wsh, (void *) &hdr[0], hlen) != (ssize_t)hlen) {
- return -1;
+ if (wsh->write_buffer_len < (hlen + bytes + 1)) {
+ void *tmp;
+
+ wsh->write_buffer_len = hlen + bytes + 1;
+ if ((tmp = realloc(wsh->write_buffer, wsh->write_buffer_len))) {
+ wsh->write_buffer = tmp;
+ } else {
+ abort();
+ }
}
+
+ bp = (uint8_t *) wsh->write_buffer;
+ memcpy(bp, (void *) &hdr[0], hlen);
+ memcpy(bp + hlen, data, bytes);
+
+ raw_ret = ws_raw_write(wsh, bp, (hlen + bytes));
- if (ws_raw_write(wsh, data, bytes) != (ssize_t)bytes) {
- return -2;
+ if (raw_ret != (ssize_t) (hlen + bytes)) {
+ return raw_ret;
}
return bytes;
int secure_established;
int logical_established;
int x;
+ void *write_buffer;
+ size_t write_buffer_len;
} wsh_t;
ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
{
size_t r;
int sanity = 2000;
+ int ssl_err = 0;
if (wsh->ssl) {
do {
if (sanity < 2000) {
ms_sleep(1);
}
- } while (--sanity > 0 && r == -1 && SSL_get_error(wsh->ssl, r) == SSL_ERROR_WANT_WRITE);
+ if (r == -1) {
+ ssl_err = SSL_get_error(wsh->ssl, r);
+ }
+
+ } while (--sanity > 0 && r == -1 && ssl_err == SSL_ERROR_WANT_WRITE);
+
+ if (ssl_err) {
+ r = ssl_err * -1;
+ }
+
return r;
}
wsh->down = 2;
+ if (wsh->write_buffer) {
+ free(wsh->write_buffer);
+ wsh->write_buffer = NULL;
+ wsh->write_buffer_len = 0;
+ }
+
if (wsh->ssl) {
int code;
do {
{
uint8_t hdr[14] = { 0 };
size_t hlen = 2;
+ uint8_t *bp;
+ ssize_t raw_ret = 0;
if (wsh->down) {
return -1;
*u64 = htonl(bytes);
}
- if (ws_raw_write(wsh, (void *) &hdr[0], hlen) != (ssize_t)hlen) {
- return -1;
+ if (wsh->write_buffer_len < (hlen + bytes + 1)) {
+ void *tmp;
+
+ wsh->write_buffer_len = hlen + bytes + 1;
+ if ((tmp = realloc(wsh->write_buffer, wsh->write_buffer_len))) {
+ wsh->write_buffer = tmp;
+ } else {
+ abort();
+ }
}
+
+ bp = (uint8_t *) wsh->write_buffer;
+ memcpy(bp, (void *) &hdr[0], hlen);
+ memcpy(bp + hlen, data, bytes);
+
+ raw_ret = ws_raw_write(wsh, bp, (hlen + bytes));
- if (ws_raw_write(wsh, data, bytes) != (ssize_t)bytes) {
- return -2;
+ if (raw_ret != (ssize_t) (hlen + bytes)) {
+ return raw_ret;
}
return bytes;
int secure_established;
int logical_established;
int x;
+ void *write_buffer;
+ size_t write_buffer_len;
} wsh_t;
ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);