aboutsummaryrefslogtreecommitdiff
path: root/tools/mini_epn.c
diff options
context:
space:
mode:
authorGravatar Subhendu Ghosh <sghosh@users.sourceforge.net> 2002-05-02 16:22:13 +0000
committerGravatar Subhendu Ghosh <sghosh@users.sourceforge.net> 2002-05-02 16:22:13 +0000
commitbbcaeb1db1666c606a3578d3d24f1618f8c9947c (patch)
treee1b3be175b6c37a1e8d832c479afd4f27234ca28 /tools/mini_epn.c
parentff24e93b11c5bc695cee7af29a15d20ed3a85643 (diff)
downloadmonitoring-plugins-bbcaeb1db1666c606a3578d3d24f1618f8c9947c.tar.gz
updated mini_epn and p1.pl added to plugins distribution
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@20 f882894a-f735-0410-b71e-b25c423dba1c
Diffstat (limited to 'tools/mini_epn.c')
-rw-r--r--tools/mini_epn.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/tools/mini_epn.c b/tools/mini_epn.c
new file mode 100644
index 00000000..cd675389
--- /dev/null
+++ b/tools/mini_epn.c
@@ -0,0 +1,153 @@
+/*
+ *
+ * MINI_EPN.C - Mini Embedded Perl Nagios
+ * Contributed by Stanley Hopcroft
+ * Modified by Douglas Warner
+ * Last Modified: 05/02/2002
+ *
+ * $Id$
+ *
+ * This is a sample mini embedded Perl interpreter (hacked out checks.c and
+ * perlembed) for use in testing Perl plugins.
+ *
+ * It can be compiled with the following command (see 'man perlembed' for
+ * more info):
+ *
+ * gcc -omini_epn mini_epn.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+ *
+ * NOTES: The compiled binary needs to be in the same directory as the p1.pl
+ * file supplied with Nagios (or vice versa)
+ * When using mini_epn to test perl scripts, you must place positional
+ * arguments immediately after the file/script and before any arguments
+ * processed by Getopt
+ *
+ */
+
+
+#include <EXTERN.h>
+#include <perl.h>
+#include <fcntl.h>
+#include <string.h>
+
+/* include PERL xs_init code for module and C library support */
+
+#if defined(__cplusplus)
+#define is_cplusplus
+#endif
+
+#ifdef is_cplusplus
+extern "C" {
+#endif
+
+#define NO_XSLOCKS
+#include <XSUB.h>
+
+#ifdef is_cplusplus
+}
+# ifndef EXTERN_C
+# define EXTERN_C extern "C"
+# endif
+#else
+# ifndef EXTERN_C
+# define EXTERN_C extern
+# endif
+#endif
+
+
+EXTERN_C void xs_init _((void));
+
+EXTERN_C void boot_DynaLoader _((CV* cv));
+
+EXTERN_C void xs_init(void)
+{
+ char *file = __FILE__;
+ dXSUB_SYS;
+
+ /* DynaLoader is a special case */
+ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
+}
+
+
+static PerlInterpreter *perl = NULL;
+
+
+int main(int argc, char **argv, char **env)
+{
+ char *embedding[] = { "", "p1.pl" };
+ char plugin_output[1024];
+ char buffer[512];
+ char tmpfname[32];
+ char fname[32];
+ char *args[] = {"","0", "", "", NULL };
+ FILE *fp;
+
+ const int command_line_size = 160;
+ char command_line[command_line_size];
+ char *ap ;
+ int exitstatus;
+ int pclose_result;
+#ifdef THREADEDPERL
+ dTHX;
+#endif
+ dSP;
+
+ if ((perl=perl_alloc())==NULL) {
+ snprintf(buffer,sizeof(buffer),"Error: Could not allocate memory for embedded Perl interpreter!\n");
+ buffer[sizeof(buffer)-1]='\x0';
+ printf("%s\n", buffer);
+ exit(1);
+ }
+ perl_construct(perl);
+ exitstatus=perl_parse(perl,xs_init,2,embedding,NULL);
+ if (!exitstatus) {
+
+ exitstatus=perl_run(perl);
+
+ while(printf("Enter file name: ") && fgets(command_line, command_line_size, stdin)) {
+
+ /* call the subroutine, passing it the filename as an argument */
+
+ command_line[strlen(command_line) -1] = '\0';
+
+ strncpy(fname,command_line,strcspn(command_line," "));
+ fname[strcspn(command_line," ")] = '\x0';
+ args[0] = fname ;
+ args[3] = command_line + strlen(fname) + 1 ;
+
+ /* generate a temporary filename to which stdout can be redirected. */
+ sprintf(tmpfname,"/tmp/embedded%d",getpid());
+ args[2] = tmpfname;
+
+ /* call our perl interpreter to compile and optionally cache the command */
+ perl_call_argv("Embed::Persistent::eval_file", G_DISCARD | G_EVAL, args);
+
+ perl_call_argv("Embed::Persistent::run_package", G_DISCARD | G_EVAL, args);
+
+ /* check return status */
+ if(SvTRUE(ERRSV)){
+ pclose_result=-2;
+ printf("embedded perl ran %s with error %s\n",fname,SvPV(ERRSV,PL_na));
+ }
+
+ /* read back stdout from script */
+ fp=fopen(tmpfname, "r");
+
+ /* default return string in case nothing was returned */
+ strcpy(plugin_output,"(No output!)");
+
+ fgets(plugin_output,sizeof(plugin_output)-1,fp);
+ plugin_output[sizeof(plugin_output)-1]='\x0';
+ fclose(fp);
+ unlink(tmpfname);
+ printf("embedded perl plugin output was %d,%s\n",pclose_result, plugin_output);
+
+ }
+
+ }
+
+
+ PL_perl_destruct_level = 0;
+ perl_destruct(perl);
+ perl_free(perl);
+ exit(exitstatus);
+}