Net-SSH2
view release on metacpan or search on metacpan
SvREFCNT_dec(ss->hostname);
Safefree(ss);
void
net_ss_debug(SV*, IV debug)
CODE:
net_ss_debug_out = debug & 1; /* allow for future flags */
void
net_ss_version(...)
PPCODE:
EXTEND(SP, 3);
ST(0) = sv_2mortal(newSVpv(LIBSSH2_VERSION, 0));
if (GIMME_V != G_ARRAY)
XSRETURN(1);
#ifdef LIBSSH2_VERSION_NUM
ST(1) = sv_2mortal(newSVuv(LIBSSH2_VERSION_NUM));
#else
ST(1) = &PL_sv_undef;
#endif
ST(2) = sv_2mortal(newSVpv(LIBSSH2_SSH_DEFAULT_BANNER, 0));
RETVAL = libssh2_session_disconnect_ex(ss->session, reason, description, lang);
save_eagain(ss->session, RETVAL);
OUTPUT:
RETVAL
void
net_ss_hostkey_hash(SSH2* ss, SSH2_HOSTKEY_HASH type)
PREINIT:
const char* hash;
static STRLEN rglen[] = { 16/*MD5*/, 20/*SHA1*/ };
PPCODE:
if (type < 1 || type > countof(rglen)) {
croak("%s::hostkey: unknown hostkey hash: %d",
class, (int)type);
}
if ((hash = (const char*)libssh2_hostkey_hash(ss->session, type))) {
PUSHs(sv_2mortal(newSVpvn(hash, rglen[type-1])));
XSRETURN(1);
}
XSRETURN_EMPTY;
void
net_ss_remote_hostkey(SSH2* ss)
PREINIT:
const char *key_pv;
size_t key_len;
int type_int;
PPCODE:
if ((key_pv = libssh2_session_hostkey(ss->session, &key_len, &type_int))) {
XPUSHs(sv_2mortal(newSVpvn(key_pv, key_len)));
if (GIMME_V != G_ARRAY)
XSRETURN(1);
else {
XPUSHs(sv_2mortal(newSViv(type_int)));
XSRETURN(2);
}
}
else
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);
croak("libssh2 version 1.1 or higher required for receive_window_adjust support");
#endif
#if LIBSSH2_VERSION_NUM >= 0x010200
void
net_ch_window_write(SSH2_CHANNEL* ch)
PREINIT:
unsigned long window_size_initial = 0;
PPCODE:
XPUSHs(sv_2mortal(newSVuv(libssh2_channel_window_write_ex(ch->channel,
&window_size_initial))));
if (GIMME_V == G_ARRAY) {
XPUSHs(sv_2mortal(newSVuv(window_size_initial)));
XSRETURN(2);
}
else
XSRETURN(1);
void
net_ch_window_read(SSH2_CHANNEL *ch)
PREINIT:
unsigned long read_avail = 0;
unsigned long window_size_initial = 0;
PPCODE:
XPUSHs(sv_2mortal(newSVuv(libssh2_channel_window_read_ex(ch->channel,
&read_avail,
&window_size_initial))));
if (GIMME_V == G_ARRAY) {
XPUSHs(sv_2mortal(newSVuv(read_avail)));
XPUSHs(sv_2mortal(newSVuv(window_size_initial)));
XSRETURN(3);
}
else
XSRETURN(1);
CODE:
RETVAL = newRV_inc(sf->sv_ss);
OUTPUT:
RETVAL
void
net_sf_error(SSH2_SFTP* sf)
PREINIT:
unsigned long error;
SV *errstr;
PPCODE:
error = libssh2_sftp_last_error(sf->sftp);
ST(0) = sv_2mortal(newSVuv(error));
if (GIMME_V == G_ARRAY) {
EXTEND(SP, 2);
if ((error >= 0) && (error < countof(sftp_error)))
errstr = newSVpvf("SSH_FX_%s", sftp_error[error]);
else
errstr = newSVpvf("SSH_FX_UNKNOWN(%lu)", error);
ST(1) = sv_2mortal(errstr);
XSRETURN(2);
OUTPUT:
RETVAL
void
net_sf_stat(SSH2_SFTP* sf, SV* path, int follow = 1)
PREINIT:
const char* pv_path;
STRLEN len_path;
int error;
LIBSSH2_SFTP_ATTRIBUTES attrs;
PPCODE:
pv_path = SvPVbyte(path, len_path);
error = libssh2_sftp_stat_ex(sf->sftp, (char*)pv_path, len_path,
(follow ? LIBSSH2_SFTP_STAT : LIBSSH2_SFTP_LSTAT),
&attrs);
if (error < 0)
XSRETURN_EMPTY;
XSRETURN_STAT_ATTRS(SvREFCNT_inc(path));
SSH2_NERROR
net_sf_setstat(SSH2_SFTP* sf, SV* path, ...)
sv_utf8_downgrade(buffer, 0);
pv_buffer = SvPVbyte(buffer, len_buffer);
RETVAL = libssh2_sftp_write(fi->handle, pv_buffer, len_buffer);
OUTPUT:
RETVAL
void
net_fi_stat(SSH2_FILE* fi)
PREINIT:
LIBSSH2_SFTP_ATTRIBUTES attrs;
PPCODE:
if (libssh2_sftp_fstat(fi->handle, &attrs))
XSRETURN_EMPTY;
XSRETURN_STAT_ATTRS(NULL/*name*/);
SSH2_NERROR
net_fi_setstat(SSH2_FILE* fi, ...)
PREINIT:
LIBSSH2_SFTP_ATTRIBUTES attrs;
int i;
CODE:
SvREFCNT_dec(di->sv_sf);
Safefree(di);
void
net_di_read(SSH2_DIR* di)
PREINIT:
SV* buffer;
char* pv_buffer;
int count;
LIBSSH2_SFTP_ATTRIBUTES attrs;
PPCODE:
buffer = newSV(MAXPATHLEN + 1);
SvPOK_on(buffer);
pv_buffer = SvPVX(buffer);
count = libssh2_sftp_readdir(di->handle, pv_buffer, MAXPATHLEN, &attrs);
if (count <= 0) {
SvREFCNT_dec(buffer);
XSRETURN_EMPTY;
}
(const unsigned char *)pv_name, len_name,
(const unsigned char *)pv_blob, len_blob);
OUTPUT:
RETVAL
void
net_pk_fetch(SSH2_PUBLICKEY* pk)
PREINIT:
unsigned long keys, i, j;
libssh2_publickey_list* list = NULL;
PPCODE:
if (!libssh2_publickey_list_fetch(pk->pkey, &keys, &list) || !list)
XSRETURN_EMPTY;
if (GIMME_V == G_ARRAY) {
EXTEND(SP, keys);
for (i = 0; i < keys; ++i) {
HV* hv = newHV();
AV* av = newAV();
const-xs.inc view on Meta::CPAN
dTARGET;
#endif
STRLEN len;
int type;
IV iv = 0; /* avoid uninit var warning */
/* NV nv; Uncomment this if you need to return NVs */
/* const char *pv; Uncomment this if you need to return PVs */
INPUT:
SV * sv;
const char * s = SvPV(sv, len);
PPCODE:
/* Change this to constant(aTHX_ s, len, &iv, &nv);
if you need to return both NVs and IVs */
type = constant(aTHX_ s, len, &iv);
/* Return 1 or 2 items. First is error message, or undef if no error.
Second, if present, is found value */
switch (type) {
case PERL_constant_NOTFOUND:
sv =
sv_2mortal(newSVpvf("%s is not a valid Net::SSH2 macro", s));
PUSHs(sv);
( run in 0.722 second using v1.01-cache-2.11-cpan-5511b514fd6 )