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 )