⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 openssl_bio.xs

📁 一个用于点对点传输加密的工具包源码
💻 XS
字号:
#include "openssl.h"static int p5_bio_ex_bio_ptr = 0;static int p5_bio_ex_bio_callback = 0;static int p5_bio_ex_bio_callback_data = 0;static long p5_bio_callback(bio,state,parg,cmd,larg,ret)  BIO  *bio;  int   state;  char *parg;  int   cmd;  long  larg;  int   ret;{    int i;    SV *me,*cb;    me = (SV *)BIO_get_ex_data(bio, p5_bio_ex_bio_ptr);    cb = (SV *)BIO_get_ex_data(bio, p5_bio_ex_bio_callback);    if (cb != NULL) {        dSP;        ENTER;        SAVETMPS;        PUSHMARK(sp);        XPUSHs(sv_2mortal(newSVsv(me)));        XPUSHs(sv_2mortal(newSViv(state)));        XPUSHs(sv_2mortal(newSViv(cmd)));        if ((state == BIO_CB_READ) || (state == BIO_CB_WRITE))            XPUSHs(sv_2mortal(newSVpv(parg,larg)));        else            XPUSHs(&sv_undef);        /* ptr one */        XPUSHs(sv_2mortal(newSViv(larg)));        XPUSHs(sv_2mortal(newSViv(ret)));        PUTBACK;        i = perl_call_sv(cb,G_SCALAR);        SPAGAIN;        if (i == 1)            ret = POPi;        else            ret = 1;        PUTBACK;        FREETMPS;        LEAVE;    }    else {        croak("Internal error in p5_bio_callback");    }    return(ret);}int boot_bio(void){    p5_bio_ex_bio_ptr = BIO_get_ex_new_index(0, "OpenSSL::BIO", ex_new, NULL, ex_cleanup);    p5_bio_ex_bio_callback = BIO_get_ex_new_index(0, "bio_callback", NULL, NULL, ex_cleanup);    p5_bio_ex_bio_callback_data = BIO_get_ex_new_index(0, "bio_callback_data", NULL, NULL, ex_cleanup);    return(1);}MODULE = OpenSSL::BIO  PACKAGE = OpenSSL::BIO  PREFIX = p5_BIO_PROTOTYPES: ENABLEVERSIONCHECK: DISABLEvoidp5_BIO_new_buffer_ssl_connect(...)    PROTOTYPE: ;$    PREINIT:        SSL_CTX *ctx;        BIO *bio;        SV *arg;    PPCODE:        if (items == 1)            arg = ST(0);        else if (items == 2)            arg = ST(1);        else            arg = NULL;        if ((arg == NULL) || !(sv_derived_from(arg,"OpenSSL::SSL::CTX")))            croak("Usage: OpenSSL::BIO::new_buffer_ssl_connect(SSL_CTX)");        else {            IV tmp = SvIV((SV *)SvRV(arg));            ctx = (SSL_CTX *)tmp;        }        EXTEND(sp, 1);        bio = BIO_new_buffer_ssl_connect(ctx);        arg = (SV *)BIO_get_ex_data(bio, p5_bio_ex_bio_ptr);        PUSHs(arg);    voidp5_BIO_new_ssl_connect(...)    PROTOTYPE: ;$    PREINIT:        SSL_CTX *ctx;        BIO *bio;        SV *arg;    PPCODE:        if (items == 1)            arg = ST(0);        else if (items == 2)            arg = ST(1);        else            arg = NULL;        if ((arg == NULL) || !(sv_derived_from(arg,"OpenSSL::SSL::CTX")))            croak("Usage: OpenSSL::BIO::new_ssl_connect(SSL_CTX)");        else {            IV tmp = SvIV((SV *)SvRV(arg));            ctx = (SSL_CTX *)tmp;        }        EXTEND(sp,1);        bio = BIO_new_ssl_connect(ctx);        arg = (SV *)BIO_get_ex_data(bio,p5_bio_ex_bio_ptr);        PUSHs(arg);    voidp5_BIO_new(...)    PROTOTYPE: ;$    PREINIT:        BIO *bio;        char *type;        SV *arg;    PPCODE:        pr_name("p5_BIO_new");        if ((items == 1) && SvPOK(ST(0)))            type = SvPV(ST(0),na);        else if ((items == 2) && SvPOK(ST(1)))            type = SvPV(ST(1),na);        else            croak("Usage: OpenSSL::BIO::new(type)");        EXTEND(sp,1);        if (strcmp(type, "mem") == 0)            bio=BIO_new(BIO_s_mem());        else if (strcmp(type, "socket") == 0)            bio=BIO_new(BIO_s_socket());        else if (strcmp(type, "connect") == 0)            bio=BIO_new(BIO_s_connect());        else if (strcmp(type, "accept") == 0)            bio=BIO_new(BIO_s_accept());        else if (strcmp(type, "fd") == 0)            bio=BIO_new(BIO_s_fd());        else if (strcmp(type, "file") == 0)            bio=BIO_new(BIO_s_file());        else if (strcmp(type, "null") == 0)            bio=BIO_new(BIO_s_null());        else if (strcmp(type, "ssl") == 0)            bio=BIO_new(BIO_f_ssl());        else if (strcmp(type, "buffer") == 0)            bio=BIO_new(BIO_f_buffer());        else            croak("unknown BIO type");        arg = (SV *)BIO_get_ex_data(bio,p5_bio_ex_bio_ptr);        PUSHs(arg);intp5_BIO_hostname(bio, name)    BIO *bio;    char *name;    PROTOTYPE: $$    CODE:        RETVAL = BIO_set_conn_hostname(bio, name);    OUTPUT:        RETVALintp5_BIO_set_accept_port(bio, str)    BIO *bio;    char *str;    PROTOTYPE: $$    CODE:        RETVAL = BIO_set_accept_port(bio, str);    OUTPUT:        RETVALintp5_BIO_do_handshake(bio)    BIO *bio;    PROTOTYPE: $    CODE:        RETVAL = BIO_do_handshake(bio);    OUTPUT:        RETVALBIO *p5_BIO_push(b, bio)    BIO *b;    BIO *bio;    PROTOTYPE: $$    CODE:        /* This reference will be reduced when the reference is         * let go, and then when the BIO_free_all() is called         * inside the OpenSSL library by the BIO with this         * pushed into */        bio->references++;        RETVAL = BIO_push(b, bio);    OUTPUT:        RETVALvoidp5_BIO_pop(b)    BIO *b    PROTOTYPE: $    PREINIT:        BIO *bio;        char *type;        SV *arg;    PPCODE:        bio = BIO_pop(b);        if (bio != NULL) {            /* This BIO will either be one created in the             * perl library, in which case it will have a perl             * SV, otherwise it will have been created internally,             * inside OpenSSL.  For the 'pushed in', it needs             * the reference count decremented. */            arg = (SV *)BIO_get_ex_data(bio, p5_bio_ex_bio_ptr);            if (arg == NULL) {                arg = new_ref("OpenSSL::BIO",(char *)bio,0);                BIO_set_ex_data(bio, p5_bio_ex_bio_ptr, (char *)arg);                PUSHs(arg);            }            else {                /* it was pushed in */                SvREFCNT_inc(arg);                PUSHs(arg);            }        }intp5_BIO_sysread(bio, in, num, ...)    BIO *bio;    SV *in;    int num;    PROTOTYPE: $$$;    PREINIT:        int i,n,olen;        int offset;        char *p;    CODE:        offset = 0;        if (!SvPOK(in))            sv_setpvn(in, "", 0);        SvPV(in, olen);        if (items > 3) {            offset = SvIV(ST(3));            if (offset < 0) {                if (-offset > olen)                    croak("Offset outside string");                offset+=olen;            }        }        if ((num+offset) > olen) {            SvGROW(in, num+offset+1);            p=SvPV(in, i);            memset(&(p[olen]), 0, (num+offset)-olen+1);        }        p = SvPV(in,n);        i = BIO_read(bio, p+offset, num);        RETVAL = i;        if (i <= 0)             i = 0;        SvCUR_set(in, offset+i);    OUTPUT:        RETVALintp5_BIO_syswrite(bio, in, ...)    BIO *bio;    SV *in;    PROTOTYPE: $$;    PREINIT:        char *ptr;        int len,in_len;        int offset=0;        int n;    CODE:        ptr = SvPV(in, in_len);        if (items > 2) {            len = SvOK(ST(2)) ? SvIV(ST(2)) : in_len;            if (items > 3) {                offset = SvIV(ST(3));                if (offset < 0) {                    if (-offset > in_len)                        croak("Offset outside string");                    offset+=in_len;                }                else if ((offset >= in_len) && (in_len > 0))                    croak("Offset outside string");            }            if (len >= (in_len-offset))                len = in_len-offset;        }        else            len = in_len;        RETVAL = BIO_write(bio, ptr+offset, len);    OUTPUT:        RETVALvoidp5_BIO_getline(bio)    BIO *bio;    PROTOTYPE: $    PREINIT:        int i;        char *p;    PPCODE:        pr_name("p5_BIO_gets");        EXTEND(sp, 1);        PUSHs(sv_newmortal());        sv_setpvn(ST(0), "", 0);        SvGROW(ST(0), 1024);        p=SvPV(ST(0), na);        i = BIO_gets(bio, p, 1024);        if (i < 0)             i = 0;        SvCUR_set(ST(0), i);intp5_BIO_flush(bio)    BIO *bio;    PROTOTYPE: $    CODE:        RETVAL = BIO_flush(bio);    OUTPUT:        RETVALchar *p5_BIO_type(bio)    BIO *bio;    PROTOTYPE: $    CODE:        RETVAL = bio->method->name;    OUTPUT:        RETVALvoidp5_BIO_next_bio(b)    BIO *b    PROTOTYPE: $    PREINIT:        BIO *bio;        char *type;        SV *arg;    PPCODE:        bio = b->next_bio;        if (bio != NULL) {            arg = (SV *)BIO_get_ex_data(bio, p5_bio_ex_bio_ptr);            if (arg == NULL) {                arg = new_ref("OpenSSL::BIO", (char *)bio, 0);                BIO_set_ex_data(bio, p5_bio_ex_bio_ptr, (char *)arg);                bio->references++;                PUSHs(arg);            }            else {                SvREFCNT_inc(arg);                PUSHs(arg);            }        }intp5_BIO_puts(bio, in)    BIO *bio;    SV *in;    PROTOTYPE: $$    PREINIT:        char *ptr;    CODE:        ptr = SvPV(in,na);        RETVAL = BIO_puts(bio, ptr);    OUTPUT:        RETVALvoidp5_BIO_set_callback(bio, cb,...)    BIO *bio;    SV *cb;    PROTOTYPE: $$;    PREINIT:        SV *arg  = NULL;        SV *arg2 = NULL;    CODE:        if (items > 3)            croak("Usage: OpenSSL::BIO::set_callback(bio,callback[,arg]");        if (items == 3) {            arg2 = sv_mortalcopy(ST(2));            SvREFCNT_inc(arg2);            BIO_set_ex_data(bio, p5_bio_ex_bio_callback_data, (char *)arg2);        }        arg = sv_mortalcopy(ST(1));        SvREFCNT_inc(arg);        BIO_set_ex_data(bio, p5_bio_ex_bio_callback, (char *)arg);        /* printf("%08lx < bio_ptr\n",BIO_get_ex_data(bio,p5_bio_ex_bio_ptr)); */        BIO_set_callback(bio, p5_bio_callback);voidp5_BIO_DESTROY(bio)    BIO *bio    PROTOTYPE: $    PREINIT:        SV *sv;    PPCODE:        pr_name_d("p5_BIO_DESTROY",bio->references);        /* printf("p5_BIO_DESTROY <%s> %d\n",bio->method->name,bio->references); */        BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,NULL);        BIO_free_all(bio);intp5_BIO_set_ssl(bio, ssl)    BIO *bio;    SSL *ssl;    PROTOTYPE: $$    CODE:        pr_name("p5_BIO_set_ssl");        ssl->references++;        RETVAL = BIO_set_ssl(bio, ssl, BIO_CLOSE);    OUTPUT:        RETVALintp5_BIO_number_read(bio)    BIO *bio;    PROTOTYPE: $    CODE:        RETVAL = BIO_number_read(bio);    OUTPUT:        RETVALintp5_BIO_number_written(bio)    BIO *bio;    PROTOTYPE: $    CODE:        RETVAL = BIO_number_written(bio);    OUTPUT:        RETVALintp5_BIO_references(bio)    BIO *bio;    PROTOTYPE: $    CODE:        RETVAL = bio->references;     OUTPUT:        RETVAL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -