X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=perl%2FOpenSSL.xs;h=6ef66ccc1eedfe10cd779d4d3f5af18bf11c10a5;hb=b4f682d32fb8bf375fd0c8edce6d113dfdf1c6ba;hp=6a975be515e1cec329be707fa708aa4d0596dc11;hpb=8073036dd62848b616c6a817c155c3255074ec83;p=oweals%2Fopenssl.git diff --git a/perl/OpenSSL.xs b/perl/OpenSSL.xs index 6a975be515..6ef66ccc1e 100644 --- a/perl/OpenSSL.xs +++ b/perl/OpenSSL.xs @@ -4,66 +4,106 @@ #include "openssl.h" -SV *new_ref(type,obj,mort) -char *type; -char *obj; - { - SV *ret; +SV * +new_ref(type, obj, mort) + char *type; + char *obj; +{ + SV *ret; - if (mort) - ret=sv_newmortal(); - else - ret=newSViv(0); -printf(">new_ref %d\n",type); - sv_setref_pv(ret,type,(void *)obj); - return(ret); - } + if (mort) + ret = sv_newmortal(); + else + ret = newSViv(0); +#ifdef DEBUG + printf(">new_ref %d\n",type); +#endif + sv_setref_pv(ret, type, (void *)obj); + return(ret); +} -int ex_new(obj,data,ad,idx,argl,argp) -char *obj; -SV *data; -CRYPTO_EX_DATA *ad; -int idx; -long argl; -char *argp; - { - SV *sv; +int +ex_new(obj, data, ad, idx, argl, argp) + char *obj; + SV *data; + CRYPTO_EX_DATA *ad; + int idx; + long argl; + char *argp; +{ + SV *sv; -fprintf(stderr,"ex_new %08X %s\n",obj,argp); - sv=sv_newmortal(); - sv_setref_pv(sv,argp,(void *)obj); -printf("%d>new_ref '%s'\n",sv,argp); - CRYPTO_set_ex_data(ad,idx,(char *)sv); - return(1); - } +#ifdef DEBUG + printf("ex_new %08X %s\n",obj,argp); +#endif + sv = sv_newmortal(); + sv_setref_pv(sv, argp, (void *)obj); +#ifdef DEBUG + printf("%d>new_ref '%s'\n", sv, argp); +#endif + CRYPTO_set_ex_data(ad, idx, (char *)sv); + return(1); +} -void ex_cleanup(obj,data,ad,idx,argl,argp) -char *obj; -SV *data; -CRYPTO_EX_DATA *ad; -int idx; -long argl; -char *argp; - { - pr_name("ex_cleanup"); -fprintf(stderr,"ex_cleanup %08X %s\n",obj,argp); - if (data != NULL) - SvREFCNT_dec((SV *)data); - } +void +ex_cleanup(obj, data, ad, idx, argl, argp) + char *obj; + SV *data; + CRYPTO_EX_DATA *ad; + int idx; + long argl; + char *argp; +{ + pr_name("ex_cleanup"); +#ifdef DEBUG + printf("ex_cleanup %08X %s\n", obj, argp); +#endif + if (data != NULL) + SvREFCNT_dec((SV *)data); +} + +MODULE = OpenSSL PACKAGE = OpenSSL -MODULE = OpenSSL PACKAGE = OpenSSL +PROTOTYPES: ENABLE BOOT: - boot_bio(); - boot_cipher(); - boot_digest(); - boot_err(); - boot_ssl(); - boot_OpenSSL__BN(); - boot_OpenSSL__BIO(); - boot_OpenSSL__Cipher(); - boot_OpenSSL__MD(); - boot_OpenSSL__ERR(); - boot_OpenSSL__SSL(); - boot_OpenSSL__X509(); + boot_bio(); + boot_cipher(); + boot_digest(); + boot_err(); + boot_ssl(); + + /* */ + /* The next macro is the completely correct way to call a C */ + /* function that uses perl calling conventions but is not */ + /* registered with perl. */ + /* */ + /* The second macro seems to work for this context. (We just */ + /* need a mark for the called function since we don't have */ + /* any local variables and what-not.) */ + /* */ + /* Unfortunately, we need to do this because these boot_* */ + /* functions are auto-generated by xsubpp and are normally */ + /* called from DyncLoader, but we're pulling them in here. */ + /* */ +#define FULL_callBootFunc(func) { \ + dSP; \ + ENTER; \ + SAVETMPS; \ + PUSHMARK(SP); \ + func(); \ + FREETMPS; \ + LEAVE; \ + } +#define callBootFunc(func) { \ + PUSHMARK(SP); \ + func(); \ + } + callBootFunc(boot_OpenSSL__BN); + callBootFunc(boot_OpenSSL__BIO); + callBootFunc(boot_OpenSSL__Cipher); + callBootFunc(boot_OpenSSL__MD); + callBootFunc(boot_OpenSSL__ERR); + callBootFunc(boot_OpenSSL__SSL); + callBootFunc(boot_OpenSSL__X509);