| /* |
| ** OpenSSL.xs |
| */ |
| |
| #include "openssl.h" |
| |
| SV * |
| new_ref(type, obj, mort) |
| char *type; |
| char *obj; |
| { |
| SV *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; |
| |
| #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"); |
| #ifdef DEBUG |
| printf("ex_cleanup %08X %s\n", obj, argp); |
| #endif |
| if (data != NULL) |
| SvREFCNT_dec((SV *)data); |
| } |
| |
| MODULE = OpenSSL PACKAGE = OpenSSL |
| |
| PROTOTYPES: ENABLE |
| |
| BOOT: |
| 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); |
| |