3
* Copyright (C) 2003, 2004, 2005 PreludeIDS Technologies. All Rights Reserved.
4
* Author: Nicolas Delon <nicolas.delon@prelude-ids.com>
6
* This file is part of the Prelude library.
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2, or (at your option)
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
18
* You should have received a copy of the GNU General Public License
19
* along with this program; see the file COPYING. If not, write to
20
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
27
void swig_perl_raise_error(int error)
31
snprintf(buf, sizeof(buf), "Prelude error - %s: %s", prelude_strsource(error), prelude_strerror(error));
36
SV *swig_perl_string(prelude_string_t *string)
39
return newSVpv(prelude_string_get_string(string), prelude_string_get_len(string));
41
SvREFCNT_inc (& PL_sv_undef);
47
SV *swig_perl_data(idmef_data_t *data)
49
switch ( idmef_data_get_type(data) ) {
50
case IDMEF_DATA_TYPE_CHAR:
51
case IDMEF_DATA_TYPE_BYTE:
52
return newSVpv(idmef_data_get_data(data), 1);
54
case IDMEF_DATA_TYPE_CHAR_STRING:
55
return newSVpv(idmef_data_get_data(data), idmef_data_get_len(data) - 1);
57
case IDMEF_DATA_TYPE_BYTE_STRING:
58
return newSVpv(idmef_data_get_data(data), idmef_data_get_len(data));
60
case IDMEF_DATA_TYPE_UINT32:
61
return newSVpvf("%d", idmef_data_get_uint32(data));
63
case IDMEF_DATA_TYPE_UINT64:
64
return newSVpvf("%" PRELUDE_PRIu64, idmef_data_get_uint64(data));
66
case IDMEF_DATA_TYPE_FLOAT:
67
return newSVpvf("%hf", idmef_data_get_float(data));
70
SvREFCNT_inc (& PL_sv_undef);
78
/* This typemap is used to allow NULL pointers in _get_next_* functions
80
%typemap(in) SWIGTYPE *LISTEDPARAM {
81
if ( ! SvOK($input) ) {
84
if ( SWIG_ConvertPtr($input, (void **)&$1, $1_descriptor, 0) ) {
85
croak("Expected type $1_type for argument $argnum.");
92
%typemap(in) char **argv {
98
if ( ! SvROK($input) )
99
croak("Argument $argnum is not a reference.");
101
if ( SvTYPE(SvRV($input)) != SVt_PVAV )
102
croak("Argument $argnum is not an array.");
104
tempav = (AV*) SvRV($input);
105
len = av_len(tempav);
106
$1 = (char **) malloc((len+2)*sizeof(char *));
108
croak("out of memory\n");
109
for (i = 0; i <= len; i++) {
110
tv = av_fetch(tempav, i, 0);
112
$1[i] = (char *) SvPV_nolen(*tv);
119
%typemap(freearg) char **argv {
127
* Prelude specific typemaps
129
%typemap(in) (char *data, size_t len) {
130
$1 = SvPV_nolen($input);
134
%typemap(in) (const char *data, size_t len) {
135
$1 = SvPV_nolen($input);
139
%typemap(in) (unsigned char *data, size_t len) {
140
$1 = (unsigned char *) SvPV_nolen($input);
144
%typemap(in) (const unsigned char *data, size_t len) {
145
$1 = (unsigned char *) SvPV_nolen($input);
149
%typemap(in) (const void *data, size_t len) {
150
$1 = SvPV_nolen($input);
155
%typemap(in) (uint64_t *target_id, size_t size) {
160
if ( ! (SvROK($input) && SvTYPE(SvRV($input)) == SVt_PVAV) )
161
croak("Argument $argnum is not an array.");
163
av = (AV *) SvRV($input);
165
$2 = av_len(av) + 1; /* av_len returns the highest index of the array NOT the len of the array */
166
$1 = malloc($2 * sizeof (uint64_t));
167
for ( i = 0; i < $2; i++ ) {
168
sv = av_fetch(av, i, 0);
169
$1[i] = strtoull(SvPV_nolen(*sv), NULL, 0);
173
%typemap(freearg) (uint64_t *target_id, size_t size) {
178
$result = newSViv($1);
182
%typemap(out) INTPOINTER * {
184
$result = newSViv(*$1);
186
SvREFCNT_inc (& PL_sv_undef);
187
$result = &PL_sv_undef;
191
%typemap(out) UINTPOINTER * {
193
$result = newSVuv(*$1);
195
SvREFCNT_inc (& PL_sv_undef);
196
$result = &PL_sv_undef;
200
%typemap(out) INT64POINTER * {
202
$result = newSViv(*$1);
204
SvREFCNT_inc (& PL_sv_undef);
205
$result = &PL_sv_undef;
209
%typemap(out) UINT64POINTER * {
211
$result = newSVuv(*$1);
213
SvREFCNT_inc (& PL_sv_undef);
214
$result = &PL_sv_undef;
220
%typemap(argout) (uint64_t *source_id, uint32_t *request_id, void **value) {
221
int ret = SvIV($result);
223
XPUSHs(sv_2mortal(newSVpvf("%" PRELUDE_PRIu64, *$1)));
224
XPUSHs(sv_2mortal(newSVuv(*$2)));
225
XPUSHs(sv_2mortal(newSViv(ret)));
229
case PRELUDE_OPTION_REPLY_TYPE_LIST:
230
XPUSHs(sv_2mortal(SWIG_NewPointerObj((void *) * $3, SWIG_TypeQuery("prelude_option_t *"), 0)));
233
XPUSHs(sv_2mortal(newSVpv(*$3, strlen(*$3))));
237
SvREFCNT_inc (& PL_sv_undef);
238
XPUSHs(&PL_sv_undef);
243
%typemap(in) int *argc (int tmp) {
249
%typemap(in) prelude_string_t * {
254
str = SvPV($input, len);
256
ret = prelude_string_new_dup_fast(&($1), str, len);
258
swig_perl_raise_error(ret);
264
%typemap(out) prelude_string_t * {
265
$result = swig_perl_string($1);
270
%typemap(out) idmef_data_t * {
271
$result = swig_perl_data($1);
276
%typemap(out) void * idmef_value_get_object {
279
swig_type = swig_idmef_value_get_descriptor(arg1);
281
SvREFCNT_inc (& PL_sv_undef);
282
$result = &PL_sv_undef;
284
$result = SWIG_NewPointerObj($1, swig_type, 0);
291
%clear idmef_value_t **ret;
292
%typemap(argout) idmef_value_t **ret {
294
if ( ! SvROK($input) ) {
295
croak("Argument $argnum is not a reference.");
300
SvREFCNT_inc (& PL_sv_undef);
301
$result = &PL_sv_undef;
303
} else if ( result > 0 ) {
307
sv_setsv(sv, SWIG_NewPointerObj((void *) * $1, $*1_descriptor, 0));
312
%typemap(in, numinputs=0) prelude_string_t *out {
315
ret = prelude_string_new(&($1));
317
swig_perl_raise_error(ret);
323
%typemap(argout) prelude_string_t *out {
325
$result = newSVpv(prelude_string_get_string($1), prelude_string_get_len($1));
329
prelude_string_destroy($1);
333
%typemap(in) prelude_msg_t **outmsg ($*1_type tmp) {
335
$1 = ($1_ltype) &tmp;
339
%typemap(in) prelude_connection_t **outconn ($*1_type tmp) {
341
$1 = ($1_ltype) &tmp;
345
%typemap(in) SWIGTYPE **OUTPARAM ($*1_type tmp) {
346
$1 = ($1_ltype) &tmp;
351
%typemap(argout) SWIGTYPE **OUTPARAM {
355
if ( ! SvROK($input) ) {
356
croak("Argument $argnum is not a reference.");
361
sv_setsv(sv, SWIG_NewPointerObj((void *) * $1, $*1_descriptor, 0));
366
%typemap(in) SWIGTYPE *INPARAM {
367
if ( ! SvROK($input) ) {
368
croak("Argument $argnum is null.");
372
if ( SWIG_ConvertPtr($input, (void **)&arg$argnum, $1_descriptor, 0) ) {
373
croak("Expected type $1_type for argument $argnum.");