The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
TYPEMAP
    char          *   T_PV
    unsigned char *   T_PV
    const char    *   T_PV
    AV            *   T_AVREF

    time_t        T_TIME_T
    size_t        T_SIZE_T
    long          T_LONG

    SSH2          *   O_SESSION
    SSH2_CHANNEL  *   O_CHANNEL
    SSH2_LISTENER *   O_LISTENER
    SSH2_SFTP     *   O_SFTP
    SSH2_FILE     *   O_FILE
    SSH2_DIR      *   O_DIR
    SSH2_PUBLICKEY*   O_PUBLICKEY
    SSH2_KNOWNHOSTS*  O_KNOWNHOSTS

    SSH2_RC       T_SSH2_RC
    SSH2_ERROR    T_SSH2_ERROR
    SSH2_NERROR   T_SSH2_NERROR
    SSH2_BYTES    T_SSH2_BYTES
    SSH2_BYTES64  T_SSH2_BYTES64
    SSH2_BYTESU64 T_SSH2_BYTESU64
    SSH2_BOOL     T_SSH2_BOOL

    SSH2_METHOD  T_SSH2_METHOD
    SSH2_FLAG    T_SSH2_FLAG
    SSH2_CALLBACK T_SSH2_CALLBACK
    SSH2_HOSTKEY_HASH T_SSH2_HOSTKEY_HASH
    SSH2_CHANNEL_EXTENDED_DATA T_SSH2_CHANNEL_EXTENDED_DATA

    SSH2_CHARP         T_SSH2_CHARP
    SSH2_CHARP_OR_NULL T_SSH2_CHARP_OR_NULL

    SSH2_STREAM_ID     T_SSH2_STREAM_ID

OUTPUT
T_PV
    sv_setpv((SV*)$arg, $var);

T_AVREF
    $arg = newRV((SV*)$var);

T_SSH2_BYTES
    $arg = ( (($var) < 0) ? &PL_sv_undef : newSVuv($var) );

T_SSH2_BYTES64
    $arg = ( (($var) < 0) ? &PL_sv_undef : ((IVSIZE >= 8) ? newSVuv($var) : newSVnv($var)) );

T_SSH2_BYTESU64
    $arg = ((IVSIZE >= 8) ? newSVuv($var) : newSVnv($var));

T_SSH2_BOOL
    $arg = (($var) ? &PL_sv_yes : &PL_sv_no);

T_SSH2_RC
    $arg = (($var) ? &PL_sv_yes : &PL_sv_undef);

T_SSH2_ERROR
    $arg = newSViv($var);

T_SSH2_NERROR
    $arg = ( (($var) < 0) ? &PL_sv_undef : &PL_sv_yes );

T_SSH2_CHARP_OR_NULL
    $arg = ($var ? newSVpv($var, 0) : &PL_sv_undef);

O_SESSION
    sv_setref_pv($arg, "Net::SSH2", (void *)$var);

O_CHANNEL
    wrap_tied_into($arg, "Net::SSH2::Channel", (void *)$var);

O_LISTENER
    sv_setref_pv($arg, "Net::SSH2::Listener", (void *)$var);

O_SFTP
    sv_setref_pv($arg, "Net::SSH2::SFTP", (void *)$var);

O_FILE
    wrap_tied_into($arg, "Net::SSH2::File", (void *)$var);

O_DIR
    sv_setref_pv($arg, "Net::SSH2::Dir", (void *)$var);

O_PUBLICKEY
    sv_setref_pv($arg, "Net::SSH2::PublicKey", (void *)$var);

O_KNOWNHOSTS
    sv_setref_pv($arg, "Net::SSH2::KnownHosts", (void *)$var);

INPUT
T_PV
    $var = ($type)SvPV_nolen($arg)

T_AVREF
    if(SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVAV)
        $var = (AV*)SvRV($arg);
    else
        croak(\"$var is not an array reference\");

O_SESSION
    $var = INT2PTR($type, unwrap($arg, \"$Package\", \"$func_name\"));

O_CHANNEL
    $var = INT2PTR($type, unwrap_tied($arg, \"$Package\", \"$func_name\"));

O_LISTENER
    $var = INT2PTR($type, unwrap($arg, \"$Package\", \"$func_name\"));

O_SFTP
    $var = INT2PTR($type, unwrap($arg, \"$Package\", \"$func_name\"));

O_FILE
    $var = INT2PTR($type, unwrap_tied($arg, \"$Package\", \"$func_name\"));

O_DIR
    $var = INT2PTR($type, unwrap($arg, \"$Package\", \"$func_name\"));

O_PUBLICKEY
    $var = INT2PTR($type, unwrap($arg, \"$Package\", \"$func_name\"));

O_KNOWNHOSTS
    $var = INT2PTR($type, unwrap($arg, \"$Package\", \"$func_name\"));

T_SSH2_BOOL
    $var = SvTRUE($arg);

T_SSH2_METHOD
    $var = sv2iv_constant_or_croak(\"METHOD\", $arg);

T_SSH2_FLAG
    $var = sv2iv_constant_or_croak(\"FLAG\", $arg);

T_SSH2_CALLBACK
    $var = sv2iv_constant_or_croak(\"CALLBACK\", $arg);

T_SSH2_HOSTKEY_HASH
    $var = sv2iv_constant_or_croak(\"HOSTKEY_HASH\", $arg);

T_SSH2_CHANNEL_EXTENDED_DATA
    $var = sv2iv_constant_or_croak(\"CHANNEL_EXTENDED_DATA\", $arg);

T_SSH2_CHARP
    $var = SvPVbyte_nolen($arg);

T_SSH2_CHARP_OR_NULL
    $var = (SvOK($arg) ? SvPVbyte_nolen($arg) : NULL);

T_TIME_T
    $var = SV2TYPE($arg, time_t);

T_SIZE_T
    $var = SV2TYPE($arg, size_t);

T_INT
    $var = my_sv2int($arg);

T_LONG
    $var = SV2TYPE($arg, long);

T_SSH2_BYTES64
    $var = SV2TYPE($arg, SSH2_BYTES64);

T_SSH2_BYTESU64
    $var = SV2UTYPE($arg, SSH2_BYTESU64);

T_SSH2_STREAM_ID
    $var = sv2iv_constant_or_croak(\"CHANNEL_FLUSH\", $arg);