Perl code patch contributed by "Kurt J. Pires" <kjpires@iat.com>
[openssl.git] / perl / OpenSSL.xs
index 6a975be..6ef66cc 100644 (file)
 
 #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);