Net-SSH2
view release on metacpan or search on metacpan
}
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 )