Chandra
view release on metacpan or search on metacpan
include/chandra/chandra_socket_common.h view on Meta::CPAN
}
/* ---- Create IO::Socket::INET (client or server) ---- */
static SV *
_sock_tcp_connect(pTHX_ SV *host_sv, SV *port_sv)
{
dSP;
int count;
SV *sock = NULL;
load_module(PERL_LOADMOD_NOIMPORT, newSVpvs("IO::Socket::INET"), NULL);
ENTER; SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpvs("IO::Socket::INET")));
XPUSHs(sv_2mortal(newSVpvs("PeerHost")));
XPUSHs(host_sv);
XPUSHs(sv_2mortal(newSVpvs("PeerPort")));
XPUSHs(port_sv);
XPUSHs(sv_2mortal(newSVpvs("Proto")));
XPUSHs(sv_2mortal(newSVpvs("tcp")));
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count > 0) { SV *s = POPs; if (SvOK(s)) sock = newSVsv(s); }
PUTBACK;
FREETMPS; LEAVE;
return sock;
}
static SV *
_sock_tcp_listen(pTHX_ SV *host_sv, SV *port_sv)
{
dSP;
int count;
SV *sock = NULL;
load_module(PERL_LOADMOD_NOIMPORT, newSVpvs("IO::Socket::INET"), NULL);
ENTER; SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpvs("IO::Socket::INET")));
XPUSHs(sv_2mortal(newSVpvs("LocalHost")));
XPUSHs(host_sv);
XPUSHs(sv_2mortal(newSVpvs("LocalPort")));
XPUSHs(port_sv);
XPUSHs(sv_2mortal(newSVpvs("Proto")));
XPUSHs(sv_2mortal(newSVpvs("tcp")));
XPUSHs(sv_2mortal(newSVpvs("Listen")));
XPUSHs(sv_2mortal(newSViv(16)));
XPUSHs(sv_2mortal(newSVpvs("ReuseAddr")));
XPUSHs(sv_2mortal(newSViv(1)));
XPUSHs(sv_2mortal(newSVpvs("Blocking")));
XPUSHs(sv_2mortal(newSViv(0)));
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count > 0) { SV *s = POPs; if (SvOK(s)) sock = newSVsv(s); }
PUTBACK;
FREETMPS; LEAVE;
return sock;
}
/* ---- Create IO::Socket::SSL (client or server) ---- */
static SV *
_sock_tls_connect(pTHX_ SV *host_sv, SV *port_sv, SV *tls_ca_sv)
{
dSP;
int count;
SV *sock = NULL;
SV *verify_mode;
load_module(PERL_LOADMOD_NOIMPORT, newSVpvs("IO::Socket::SSL"), NULL);
/* Get verify mode constant */
{
ENTER; SAVETMPS;
PUSHMARK(SP);
PUTBACK;
count = call_pv(
(tls_ca_sv && SvOK(tls_ca_sv))
? "IO::Socket::SSL::SSL_VERIFY_PEER"
: "IO::Socket::SSL::SSL_VERIFY_NONE",
G_SCALAR);
SPAGAIN;
verify_mode = (count > 0) ? newSVsv(POPs) : newSViv(0);
PUTBACK;
FREETMPS; LEAVE;
}
{
ENTER; SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpvs("IO::Socket::SSL")));
XPUSHs(sv_2mortal(newSVpvs("PeerHost")));
XPUSHs(host_sv);
XPUSHs(sv_2mortal(newSVpvs("PeerPort")));
XPUSHs(port_sv);
XPUSHs(sv_2mortal(newSVpvs("SSL_verify_mode")));
XPUSHs(sv_2mortal(verify_mode));
if (tls_ca_sv && SvOK(tls_ca_sv)) {
XPUSHs(sv_2mortal(newSVpvs("SSL_ca_file")));
XPUSHs(tls_ca_sv);
}
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count > 0) { SV *s = POPs; if (SvOK(s)) sock = newSVsv(s); }
PUTBACK;
FREETMPS; LEAVE;
}
return sock;
}
static SV *
_sock_tls_listen(pTHX_ SV *host_sv, SV *port_sv,
SV *cert_sv, SV *key_sv)
{
dSP;
int count;
SV *sock = NULL;
load_module(PERL_LOADMOD_NOIMPORT, newSVpvs("IO::Socket::SSL"), NULL);
ENTER; SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpvs("IO::Socket::SSL")));
XPUSHs(sv_2mortal(newSVpvs("LocalHost")));
XPUSHs(host_sv);
XPUSHs(sv_2mortal(newSVpvs("LocalPort")));
XPUSHs(port_sv);
XPUSHs(sv_2mortal(newSVpvs("Proto")));
XPUSHs(sv_2mortal(newSVpvs("tcp")));
XPUSHs(sv_2mortal(newSVpvs("Listen")));
XPUSHs(sv_2mortal(newSViv(16)));
XPUSHs(sv_2mortal(newSVpvs("ReuseAddr")));
XPUSHs(sv_2mortal(newSViv(1)));
XPUSHs(sv_2mortal(newSVpvs("SSL_cert_file")));
XPUSHs(cert_sv);
XPUSHs(sv_2mortal(newSVpvs("SSL_key_file")));
XPUSHs(key_sv);
XPUSHs(sv_2mortal(newSVpvs("SSL_server")));
XPUSHs(sv_2mortal(newSViv(1)));
PUTBACK;
count = call_method("new", G_SCALAR);
SPAGAIN;
if (count > 0) { SV *s = POPs; if (SvOK(s)) sock = newSVsv(s); }
PUTBACK;
FREETMPS; LEAVE;
return sock;
}
/* ---- $listener->accept ---- */
static SV *
_sock_accept(pTHX_ SV *listener)
{
dSP;
int count;
SV *sock = NULL;
ENTER; SAVETMPS;
PUSHMARK(SP);
XPUSHs(listener);
PUTBACK;
count = call_method("accept", G_SCALAR);
SPAGAIN;
if (count > 0) { SV *s = POPs; if (SvOK(s)) sock = newSVsv(s); }
PUTBACK;
FREETMPS; LEAVE;
return sock;
}
/* ---- Chandra::Socket::Connection->new(socket => $sock, name => $name) ---- */
static SV *
_sock_connection_new(pTHX_ SV *sock, SV *name_sv)
{
dSP;
int count;
SV *conn = NULL;
ENTER; SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpvs("Chandra::Socket::Connection")));
XPUSHs(sv_2mortal(newSVpvs("socket")));
XPUSHs(sock);
if (name_sv) {
XPUSHs(sv_2mortal(newSVpvs("name")));
( run in 0.841 second using v1.01-cache-2.11-cpan-39bf76dae61 )