Net-SSH2

 view release on metacpan or  search on metacpan

SSH2.xs  view on Meta::CPAN

        }
        pollfd[i].events = SvIV(*events);
        pollfd[i].revents = 0;
        debug("- [%d] events %d\n", i, pollfd[i].events);
    }
        
    changed = libssh2_poll(pollfd, count, timeout);
    debug("- libssh2_poll returned %d\n", changed);

    if (changed < 0)
        count = 0;
    for (i = 0; i < count; ++i) {
        HV* hv = (HV*)SvRV(*av_fetch(event, i, 0/*lval*/));
        hv_store(hv, "revents", 7, newSViv(pollfd[i].revents), 0/*hash*/);
        debug("- [%d] revents %d\n", i, pollfd[i].revents);
    }

    Safefree(pollfd);
    if (changed < 0)
        XSRETURN_EMPTY;
    XSRETURN_IV(changed);

SSH2_SFTP*
net_ss_sftp(SSH2* ss)
CODE:
    NEW_SFTP(libssh2_sftp_init(ss->session));
OUTPUT:
    RETVAL

SSH2_PUBLICKEY*
net_ss_public_key(SSH2* ss)
CODE:
    NEW_PUBLICKEY(libssh2_publickey_init(ss->session));
OUTPUT:
    RETVAL

#undef class


MODULE = Net::SSH2		PACKAGE = Net::SSH2::Channel    PREFIX = net_ch_
PROTOTYPES: DISABLE

#define class "Net::SSH2::Channel"

void
net_ch_DESTROY(SSH2_CHANNEL* ch)
CODE:
    debug("%s::DESTROY\n", class);
    libssh2_channel_free(ch->channel);
    SvREFCNT_dec(ch->sv_ss);
    Safefree(ch);

SV *
net_ch_session(SSH2_CHANNEL* ch)
CODE:
    RETVAL = newRV_inc(ch->sv_ss);
OUTPUT:
    RETVAL

SSH2_NERROR
net_ch__setenv(SSH2_CHANNEL* ch, SV *key, SV *value)
PREINIT:
    int i, success = 0;
    const char* pv_key, * pv_value;
    STRLEN len_key, len_value;
CODE:
    pv_key = SvPVbyte(key, len_key);
    pv_value = SvPVbyte(value, len_value);
    RETVAL = libssh2_channel_setenv_ex(ch->channel,
                                       (char*)pv_key, len_key,
                                       (char*)pv_value, len_value);
    save_eagain(ch->ss->session, RETVAL);
OUTPUT:
    RETVAL

#if LIBSSH2_VERSION_NUM >= 0x010208

void
net_ch__exit_signal(SSH2_CHANNEL* ch)
PREINIT:
    char *exitsignal;
    char *errmsg;
    char *langtag;
    size_t exitsignal_len;
    size_t errmsg_len;
    size_t langtag_len;
    int retcount = 1;
PPCODE:
    if (!libssh2_channel_get_exit_signal(ch->channel,
                                         &exitsignal, &exitsignal_len,
                                         &errmsg, &errmsg_len,
                                         &langtag, &langtag_len)) {
        LIBSSH2_SESSION *session = ch->ss->session;
        libssh2_session_set_last_error(session, 0, NULL);
        if (exitsignal) {
            XPUSHs(sv_2mortal(newSVpvn(exitsignal, exitsignal_len)));
            if (GIMME_V == G_ARRAY) {
                XPUSHs(errmsg ? sv_2mortal(newSVpvn(errmsg, errmsg_len)) : &PL_sv_undef);
                XPUSHs(langtag ? sv_2mortal(newSVpvn(langtag, langtag_len)) : &PL_sv_undef);
                retcount = 3;
            }
            libssh2_free(session, exitsignal);
            if (errmsg) libssh2_free(session, errmsg);
            if (langtag) libssh2_free(session, langtag);
        }
        else
            XPUSHs(&PL_sv_no);
        XSRETURN(retcount);
    }
    else
        XSRETURN(0);

#else

void
net_ch__exit_signal(SSH2_CHANNEL* ch)
CODE:
    croak("libssh2 version 1.2.8 or higher required for exit_signal support");

#endif

SSH2_BYTES
net_ch_eof(SSH2_CHANNEL* ch)
CODE:
    RETVAL = libssh2_channel_eof(ch->channel);
    save_eagain(ch->ss->session, RETVAL);
OUTPUT:
    RETVAL



( run in 0.428 second using v1.01-cache-2.11-cpan-6aa56a78535 )