summaryrefslogtreecommitdiffstats
path: root/perl/OpenSSL.xs
blob: 6ef66ccc1eedfe10cd779d4d3f5af18bf11c10a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
**  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);