File: SSLLookup.xs

package info (click to toggle)
libapache-ssllookup-perl 2.00-04-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 208 kB
  • ctags: 19
  • sloc: perl: 209; ansic: 10; makefile: 8; sh: 4
file content (125 lines) | stat: -rwxr-xr-x 2,838 bytes parent folder | download | duplicates (4)
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "mod_perl.h"
#include "modperl_xs_typedefs.h"

#include "mpi/MP_dTHX.h"

typedef request_rec * Apache__SSLLookup;

APR_DECLARE_OPTIONAL_FN(char *, ssl_var_lookup,
                        (apr_pool_t *, server_rec *,
                         conn_rec *, request_rec *,
                         char *));

APR_DECLARE_OPTIONAL_FN(int, ssl_is_https, (conn_rec *));

APR_DECLARE_OPTIONAL_FN(const char *, ssl_ext_lookup,
                        (apr_pool_t *p, conn_rec *c, int peer,
                         const char *oidnum));

static APR_OPTIONAL_FN_TYPE(ssl_var_lookup) *perl_ssl_lookup = NULL;
static APR_OPTIONAL_FN_TYPE(ssl_is_https)   *perl_is_https   = NULL;
static APR_OPTIONAL_FN_TYPE(ssl_ext_lookup) *perl_ext_lookup = NULL;

static int get_ssl_functions(apr_pool_t *p, apr_pool_t *plog,
                             apr_pool_t *ptemp, server_rec *s)
{

  perl_ssl_lookup = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup);
  perl_is_https   = APR_RETRIEVE_OPTIONAL_FN(ssl_is_https);
  perl_ext_lookup = APR_RETRIEVE_OPTIONAL_FN(ssl_ext_lookup);

  return OK;
}

static const char * const aszPre[] = { "mod_ssl.c", NULL };

MODULE = Apache::SSLLookup     PACKAGE = Apache::SSLLookup

PROTOTYPES: DISABLE

  BOOT:
    ap_hook_post_config(get_ssl_functions, aszPre, NULL, APR_HOOK_MIDDLE);

SV *
new(self, r)
  SV * self
  Apache2::RequestRec r

  INIT:
    MP_dTHX;      /* interpreter selection */

    SV *obj = newSV(0);
    HV *hv  = newHV();

    self = self;  /* satisfy warnings */

  CODE:
    /* bless { _r => $r }, $class */
    hv_store(hv, "_r", 2,
             modperl_ptr2obj(aTHX_ "Apache2::RequestRec", r), FALSE);
    obj = newRV_noinc((SV *)hv);
    sv_bless(obj, gv_stashpv("Apache::SSLLookup", TRUE));

    RETVAL = obj;

  OUTPUT:
    RETVAL

int
is_https(r)
  Apache::SSLLookup r

  CODE:
    RETVAL = 0;

    if (perl_is_https) {
      MP_TRACE_a(MP_FUNC, "seeing if request for %s is under SSL", r->uri);

      RETVAL = perl_is_https(r->connection);
    }

  OUTPUT:
    RETVAL

char *
ssl_lookup(r, var)
  Apache::SSLLookup r
  char *var

  CODE:
    RETVAL = Nullch;

    if (perl_ssl_lookup) {
      MP_TRACE_a(MP_FUNC, "looking for SSL variable '%s'", var);

      RETVAL = perl_ssl_lookup(r->pool, r->server, r->connection, r, var);
    }

  OUTPUT:
    RETVAL

const char *
ext_lookup(r, oid, peer = 0)
  Apache::SSLLookup r
  const char *oid
  int peer

  CODE:
    RETVAL = Nullch;

    if (perl_ext_lookup) {
      MP_TRACE_a(MP_FUNC, "retrieving SSL certificate '%s' from the %s",
                          oid, peer ? "client" : "server");

      RETVAL = perl_ext_lookup(r->pool, r->connection, peer, oid);
    }

  OUTPUT:
    RETVAL

BOOT:
    av_push(perl_get_av("Apache::SSLLookup::ISA",TRUE), newSVpv("Apache2::RequestRec",19));