]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Initialize plugin in director
authorEric Bollengier <eric@eb.homelinux.org>
Wed, 12 Nov 2008 16:13:10 +0000 (16:13 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Wed, 12 Nov 2008 16:13:10 +0000 (16:13 +0000)
     Fix a couple of segfaults

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@8043 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/dird/dir_plugins.c
bacula/src/dird/dir_plugins.h
bacula/src/dird/job.c
bacula/src/dird/ua_purge.c
bacula/src/filed/fd_plugins.c
bacula/src/plugins/fd/example-plugin-fd.c

index b2487543da872f460a64cd23e05ecb4dc7bdc5d8..4f0dc71503ec7fd1d7d50f6db16ff8408855fbb5 100644 (file)
@@ -74,7 +74,7 @@ void generate_plugin_event(JCR *jcr, bEventType eventType, void *value)
    Plugin *plugin;
    int i = 0;
 
-   if (!plugin_list) {
+   if (!plugin_list || !jcr || !jcr->plugin_ctx_list) {
       return;
    }
 
@@ -158,7 +158,7 @@ void free_plugins(JCR *jcr)
    Plugin *plugin;
    int i = 0;
 
-   if (!plugin_list) {
+   if (!plugin_list || !jcr->plugin_ctx_list) {
       return;
    }
 
@@ -180,9 +180,14 @@ void free_plugins(JCR *jcr)
  */
 static bRC baculaGetValue(bpContext *ctx, brVariable var, void *value)
 {
+   bRC ret=bRC_OK;
+
+   if (!ctx) {
+      return bRC_Error;
+   }
    JCR *jcr = (JCR *)(ctx->bContext);
 // Dmsg1(dbglvl, "bacula: baculaGetValue var=%d\n", var);
-   if (!value) {
+   if (!jcr || !value) {
       return bRC_Error;
    }
 // Dmsg1(dbglvl, "Bacula: jcr=%p\n", jcr); 
@@ -191,10 +196,15 @@ static bRC baculaGetValue(bpContext *ctx, brVariable var, void *value)
       *((int *)value) = jcr->JobId;
       Dmsg1(dbglvl, "Bacula: return bVarJobId=%d\n", jcr->JobId);
       break;
+   case bVarJobName:
+      *((char **)value) = jcr->Job;
+      Dmsg1(dbglvl, "Bacula: return bVarJobName=%s\n", jcr->Job);
+      break;
    default:
+      ret = bRC_Error;
       break;
    }
-   return bRC_OK;
+   return ret;
 }
 
 static bRC baculaSetValue(bpContext *ctx, bwVariable var, void *value)
index 25673fb5cbaf894d1e608493834fc469d0cd9ae5..1bf94e2a775dd265cfd0686bf04274c915d4fe5e 100644 (file)
@@ -105,7 +105,9 @@ typedef enum {
 typedef enum {
   bEventJobStart      = 1,
   bEventJobEnd        = 2,
-  bEventExit          = 3
+  bEventJobInit       = 3,
+  bEventJobRun        = 4,
+  bEventVolumePurged  = 5
 } bEventType;
 
 typedef struct s_bEvent {
index c3ab10c3b1a07fe6cf0a8ad31e50341a079c329a..b20c7af0dd3dfe6bdc1fcb40bd07c7bbb125e77d 100644 (file)
@@ -173,6 +173,8 @@ bool setup_job(JCR *jcr)
        jcr->JobId, jcr->Job, jcr->jr.JobType, jcr->jr.JobLevel);
 
    generate_daemon_event(jcr, "JobStart");
+   new_plugins(jcr);                  /* instantiate plugins for this jcr */
+   generate_plugin_event(jcr, bEventJobStart);
 
    if (job_canceled(jcr)) {
       goto bail_out;
@@ -228,6 +230,7 @@ bool setup_job(JCR *jcr)
    }
 
    generate_job_event(jcr, "JobInit");
+   generate_plugin_event(jcr, bEventJobInit);
    Dsm_check(1);
    return true;
 
@@ -300,6 +303,7 @@ static void *job_thread(void *arg)
       Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
    }
    generate_job_event(jcr, "JobRun");
+   generate_plugin_event(jcr, bEventJobRun);
 
    switch (jcr->get_JobType()) {
    case JT_BACKUP:
@@ -351,6 +355,7 @@ static void *job_thread(void *arg)
    }
 
    generate_daemon_event(jcr, "JobEnd");
+   generate_plugin_event(jcr, bEventJobEnd);
    Dmsg1(50, "======== End Job stat=%c ==========\n", jcr->JobStatus);
    sm_check(__FILE__, __LINE__, true);
    return NULL;
@@ -1018,6 +1023,8 @@ void dird_free_jcr(JCR *jcr)
       jcr->rstore_source = NULL;
    }
 
+   free_plugins(jcr);                 /* release instantiated plugins */
+
    /* Delete lists setup to hold storage pointers */
    free_rwstorage(jcr);
 
index 92b0f86efe818850c1238160aeaf670ea2f924eb..59400b5f60235bc3cd853ae150a6a39c7bf2df06 100644 (file)
@@ -505,6 +505,7 @@ bool mark_media_purged(UAContext *ua, MEDIA_DBR *mr)
       }
       pm_strcpy(jcr->VolumeName, mr->VolumeName);
       generate_job_event(jcr, "VolumePurged");
+      generate_plugin_event(jcr, bEventVolumePurged);
       /*
        * If the RecyclePool is defined, move the volume there
        */
index a7a9fe88f70620c5a964d5a3e6ff0e3e802e10c2..c21e275c1ab33ccdda823cce73a3c273590bf6f2 100644 (file)
@@ -122,7 +122,7 @@ void generate_plugin_event(JCR *jcr, bEventType eventType, void *value)
    Plugin *plugin;
    int i = 0;
 
-   if (!plugin_list || !jcr->plugin_ctx_list) {
+   if (!plugin_list || !jcr || !jcr->plugin_ctx_list) {
       return;                         /* Return if no plugins loaded */
    }
 
index 52f1d83ecbac6fb1cd28635679ebe8397c24a492..4fc93ae1a6132adb0f3fd1de7180060ed1e2cafb 100644 (file)
@@ -124,7 +124,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value)
 
    switch (event->eventType) {
    case bEventJobStart:
-      printf("plugin: JobStart=%s\n", (char *)value);
+      printf("plugin: JobStart=%s\n", NPRT((char *)value));
       break;
    case bEventJobEnd:
       printf("plugin: JobEnd\n");
@@ -136,10 +136,10 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value)
       printf("plugin: BackupEnd\n");
       break;
    case bEventLevel:
-      printf("plugin: JobLevel=%c %d\n", *(int*)value, *(int*)value);
+      printf("plugin: JobLevel=%c %d\n", (int64_t)value, (int64_t)value);
       break;
    case bEventSince:
-      printf("plugin: since=%d\n", *(int*)value);
+      printf("plugin: since=%d\n", (int64_t)value);
       break;
    case bEventStartRestoreJob:
       printf("plugin: StartRestoreJob\n");
@@ -150,11 +150,11 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value)
 
    /* Plugin command e.g. plugin = <plugin-name>:<name-space>:command */
    case bEventRestoreCommand:
-      printf("plugin: backup command=%s\n", (char *)value);
+      printf("plugin: backup command=%s\n", NPRT((char *)value));
       break;
 
    case bEventBackupCommand:
-      printf("plugin: backup command=%s\n", (char *)value);
+      printf("plugin: backup command=%s\n", NPRT((char *)value));
       break;
 
    default: