Crypt-SSLeay
view release on metacpan or search on metacpan
*/
while (keep_trying_to_write)
{
int n = SSL_write(ssl, buf+offset, len);
int x = SSL_get_error(ssl, n);
if ( n >= 0 )
{
keep_trying_to_write = 0;
RETVAL = newSViv(n);
}
else
{
if
(
(x != SSL_ERROR_WANT_READ) &&
(x != SSL_ERROR_WANT_WRITE)
)
{
keep_trying_to_write = 0;
RETVAL = &PL_sv_undef;
}
}
}
OUTPUT:
RETVAL
SV*
SSL_read(ssl, buf, len,...)
SSL* ssl
int len
PREINIT:
char *buf;
STRLEN blen;
int offset = 0;
int keep_trying_to_read = 1;
INPUT:
SV* sv = ST(1);
CODE:
buf = SvPV_force(sv, blen);
if (items > 3) {
offset = SvIV(ST(3));
if (offset < 0) {
if (-offset > blen)
croak("Offset outside string");
offset += blen;
}
/* this is not a very efficient method of appending
* (offset - blen) NUL bytes, but it will probably
* seldom happen.
*/
while (offset > blen) {
sv_catpvn(sv, "\0", 1);
blen++;
}
}
if (len < 0)
croak("Negative length");
SvGROW(sv, offset + len + 1);
buf = SvPVX(sv); /* it might have been relocated */
/* try to handle incomplete writes properly
* see RT bug #64054 and RT bug #78695
* 2012/08/02: Stop trying to distinguish between good & bad
* zero returns from underlying SSL_read/SSL_write
*/
while (keep_trying_to_read) {
int n = SSL_read(ssl, buf+offset, len);
int x = SSL_get_error(ssl, n);
if ( n >= 0 )
{
SvCUR_set(sv, offset + n);
buf[offset + n] = '\0';
keep_trying_to_read = 0;
RETVAL = newSViv(n);
}
else
{
if
(
(x != SSL_ERROR_WANT_READ) &&
(x != SSL_ERROR_WANT_WRITE)
)
{
keep_trying_to_read = 0;
RETVAL = &PL_sv_undef;
}
}
}
OUTPUT:
RETVAL
X509*
SSL_get_peer_certificate(ssl)
SSL* ssl
SV*
SSL_get_verify_result(ssl)
SSL* ssl
CODE:
RETVAL = newSViv((SSL_get_verify_result(ssl) == X509_V_OK) ? 1 : 0);
OUTPUT:
RETVAL
#define CRYPT_SSLEAY_SHARED_CIPHERS_BUFSIZE 512
char*
SSL_get_shared_ciphers(ssl)
SSL* ssl
PREINIT:
char buf[ CRYPT_SSLEAY_SHARED_CIPHERS_BUFSIZE ];
CODE:
RETVAL = SSL_get_shared_ciphers(
ssl, buf, CRYPT_SSLEAY_SHARED_CIPHERS_BUFSIZE
);
OUTPUT:
RETVAL
char*
( run in 0.895 second using v1.01-cache-2.11-cpan-71847e10f99 )