static void ssl_close( UBuffer* pbuf ) { if( pbuf->FD > -1 ) { ssl_free( ur_ptr(SSLExt, pbuf) ); pbuf->FD = -1; } memFree( pbuf->ptr.v ); //pbuf->ptr.v = 0; // Done by port_destroy(). }
static SocketExt* _socketPort( UThread* ut, UCell* cell, const char* funcName ) { SocketExt* ext; UBuffer* pbuf = ur_buffer( cell->series.buf ); if( (pbuf->form == UR_PORT_EXT) && pbuf->ptr.v ) { ext = ur_ptr(SocketExt, pbuf); if( ext->dev == &port_socket ) return ext; } ur_error( ut, UR_ERR_SCRIPT, "%s expected socket port", funcName ); return 0; }
static int ssl_write( UThread* ut, UBuffer* port, const UCell* data ) { const void* buf; SSLExt* ext = ur_ptr(SSLExt, port); int len; int n; len = boron_sliceMem( ut, data, &buf ); if( port->FD > -1 && len ) { retry: n = mbedtls_ssl_write( &ext->sc, buf, len ); if( n < 0 ) { if( n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE ) { ssl_wait(); goto retry; } // An error occured; the ssl context must not be used again. ssl_free( ext ); port->FD = -1; return ur_error( ut, UR_ERR_ACCESS, "ssl_write %d", n ); } else if( n != len ) { if( n > 0 && n < len ) { buf = ((const char*) buf) + n; len -= n; goto retry; } return ur_error( ut, UR_ERR_ACCESS, "ssl_write only sent %d of %d bytes", n, len ); } } return UR_OK; }
static int ssl_read( UThread* ut, UBuffer* port, UCell* dest, int len ) { SSLExt* ext = ur_ptr(SSLExt, port); UBuffer* buf = ur_buffer( dest->series.buf ); int n; if( port->FD > -1 && len ) { retry: n = mbedtls_ssl_read( &ext->sc, buf->ptr.b + buf->used, len ); //printf( "KR ssl_read %d\n", n ); if( n > 0 ) { buf->used += n; } else if( n < 0 ) { if( n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE ) { ssl_wait(); goto retry; } // An error occured; the ssl context must not be used again. ssl_free( ext ); port->FD = -1; return ur_error( ut, UR_ERR_ACCESS, "ssl_read %d", n ); } else { ur_setId(dest, UT_NONE); } } return UR_OK; }