6 #define _RPMPERL_INTERNAL
10 #if defined(MODULE_EMBED)
16 #if defined(WITH_PERLEMBED)
30 #if defined(WITH_PERLEMBED)
31 static int dlopened = 0;
32 static rpmperl (*rpmperlNew_p) (
char ** av, uint32_t flags);
33 static rpmRC (*rpmperlRun_p) (
rpmperl perl,
const char * str,
const char ** resultp);
36 #define my_perl ((PerlInterpreter *)perl->I)
44 #if defined(MODULE_EMBED)
46 PL_perl_destruct_level = 1;
64 if (_rpmperlPool == NULL) {
72 #if defined(MODULE_EMBED)
73 EXTERN_C
void xs_init (PerlInterpreter * _my_perl PERL_UNUSED_DECL);
75 EXTERN_C
void boot_DynaLoader (PerlInterpreter* _my_perl, CV* cv);
78 xs_init(PerlInterpreter* _my_perl PERL_UNUSED_DECL)
80 char *
file = (
char *) __FILE__;
84 Perl_newXS(_my_perl,
"DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
88 static const char * _rpmperlI_init =
"\
91 our $io = IO::String->new;\n\
105 #if defined(WITH_PERLEMBED)
106 static void loadModule(
void) {
107 const char librpmperl[] =
"rpmperl.so";
110 h = dlopen (librpmperl, RTLD_NOW|RTLD_GLOBAL);
114 "embedded perl will not be available\n"),
115 librpmperl, dlerror());
117 else if(!((rpmperlNew_p = dlsym(h,
"rpmperlNew"))
118 && (rpmperlRun_p = dlsym(h,
"rpmperlRun")))) {
120 "embedded perl will not be available\n"),
121 librpmperl, dlerror());
132 #if defined(WITH_PERLEMBED)
133 if (!dlopened) loadModule();
134 if (dlopened)
return rpmperlNew_p(av, flags);
136 rpmperl perl = (flags & 0x80000000)
138 #if defined(MODULE_EMBED)
139 static const char * _av[] = {
"rpmperl", NULL };
140 static int initialized = 0;
145 if (av == NULL) av = (
char **) _av;
149 {
static const char _perlI_init[] =
"%{?_perlI_init}";
150 const char * s =
rpmExpand(_rpmperlI_init, _perlI_init, NULL);
163 PERL_SYS_INIT3(&argc, (
char ***)&argv, &
environ);
166 perl->I = perl_alloc();
168 PL_perl_destruct_level = 1;
172 xx = perl_parse(
my_perl, xs_init, argc, (
char **)argv, NULL);
173 PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
184 #if defined(WITH_PERLEMBED)
185 if (dlopened)
return rpmperlRun_p(perl, str, resultp);
190 fprintf(stderr,
"==> %s(%p,%s)\n", __FUNCTION__, perl, str);
192 if (perl == NULL) perl =
rpmperlI();
195 #if defined(MODULE_EMBED)
201 fprintf(stderr,
"==> FIXME #1: %d %s\n",
202 (
int)SvTRUE(ERRSV), SvPV(ERRSV, n_a));
205 retSV = Perl_eval_pv(
my_perl,
"${$io->string_ref}",
TRUE);
207 fprintf(stderr,
"==> FIXME #2: %d %s\n",
208 (
int)SvTRUE(ERRSV), SvPV(ERRSV, n_a));
210 *resultp = SvPV(retSV, n_a);