comparison libpurple/plugins/perl/perl.c @ 23665:57419367b18d

Add error handling for visiblity to why Perl plugins fail to load. Fixes #240
author Daniel Atallah <daniel.atallah@gmail.com>
date Wed, 30 Jul 2008 04:51:58 +0000
parents fb86dbeb2b15
children 6f47135f5378
comparison
equal deleted inserted replaced
23664:ece34c9599f5 23665:57419367b18d
249 probe_perl_plugin(PurplePlugin *plugin) 249 probe_perl_plugin(PurplePlugin *plugin)
250 { 250 {
251 251
252 char *args[] = {"", plugin->path }; 252 char *args[] = {"", plugin->path };
253 char **argv = args; 253 char **argv = args;
254 int argc = 2; 254 int argc = 2, ret;
255 PerlInterpreter *prober; 255 PerlInterpreter *prober;
256 gboolean status = TRUE; 256 gboolean status = TRUE;
257 HV *plugin_info; 257 HV *plugin_info;
258 258
259 PERL_SYS_INIT(&argc, &argv); 259 PERL_SYS_INIT(&argc, &argv);
283 PerlIO_close(newprlIO); 283 PerlIO_close(newprlIO);
284 } 284 }
285 } 285 }
286 #endif 286 #endif
287 287
288 perl_parse(prober, xs_init, argc, argv, NULL); 288 ret = perl_parse(prober, xs_init, argc, argv, NULL);
289 289
290 perl_run(prober); 290 if (ret != 0) {
291 STRLEN len;
292 const char * errmsg = "Unknown error";
293 if (SvTRUE(ERRSV))
294 errmsg = SvPV(ERRSV, len);
295 purple_debug_error("perl", "Unable to parse plugin %s (%d:%s)\n",
296 plugin->path, ret, errmsg);
297 goto cleanup;
298 }
299
300 ret = perl_run(prober);
301
302 if (ret != 0) {
303 STRLEN len;
304 const char * errmsg = "Unknown error";
305 if (SvTRUE(ERRSV))
306 errmsg = SvPV(ERRSV, len);
307 purple_debug_error("perl", "Unable to run perl interpreter on plugin %s (%d:%s)\n",
308 plugin->path, ret, errmsg);
309 goto cleanup;
310 }
291 311
292 plugin_info = perl_get_hv("PLUGIN_INFO", FALSE); 312 plugin_info = perl_get_hv("PLUGIN_INFO", FALSE);
293 313
294 if (plugin_info == NULL) 314 if (plugin_info == NULL)
295 status = FALSE; 315 status = FALSE;
433 453
434 status = purple_plugin_register(plugin); 454 status = purple_plugin_register(plugin);
435 } 455 }
436 } 456 }
437 457
458 cleanup:
438 PL_perl_destruct_level = 1; 459 PL_perl_destruct_level = 1;
439 PERL_SET_CONTEXT(prober); 460 PERL_SET_CONTEXT(prober);
440 perl_destruct(prober); 461 perl_destruct(prober);
441 perl_free(prober); 462 perl_free(prober);
442 return status; 463 return status;