#include "filed.h"
extern CLIENT *me;
-extern char *exepath;
+extern DLL_IMP_EXP char *exepath;
const int dbglvl = 150;
#ifdef HAVE_WIN32
bEvent event;
Plugin *plugin;
int i = 0;
- char *name=NULL;
- int len;
+ char *name = NULL;
+ int len = 0;
+ bool call_if_canceled = false;
bRC rc;
- if (!plugin_list || !jcr || !jcr->plugin_ctx_list || jcr->is_job_canceled()) {
+ if (!plugin_list || !jcr || !jcr->plugin_ctx_list) {
return; /* Return if no plugins loaded */
}
- /* Some events are sent to only a particular plugin */
+ /*
+ * Some events are sent to only a particular plugin or must be
+ * called even if the job is canceled
+ */
switch(eventType) {
case bEventPluginCommand:
name = (char *)value;
return;
}
break;
+ case bEventEndBackupJob:
+ case bEventEndVerifyJob:
+ call_if_canceled = true;
+ break;
+ case bEventEndRestoreJob:
+ call_if_canceled = true;
+ if (jcr->plugin && jcr->plugin->restoreFileStarted) {
+ plug_func(jcr->plugin)->endRestoreFile(jcr->plugin_ctx);
+ jcr->plugin->restoreFileStarted = false;
+ }
+ break;
default:
break;
}
+ if (!call_if_canceled && jcr->is_job_canceled()) {
+ return;
+ }
+
bpContext *plugin_ctx_list = (bpContext *)jcr->plugin_ctx_list;
event.eventType = eventType;
sp.pkt_size = sizeof(sp);
sp.pkt_end = sizeof(sp);
sp.portable = true;
+ sp.flags = 0;
sp.cmd = cmd;
Dmsg3(dbglvl, "startBackup st_size=%p st_blocks=%p sp=%p\n", &sp.statp.st_size, &sp.statp.st_blocks,
&sp);
pm_strcpy(link, sp.link);
ff_pkt->fname = fname.c_str();
ff_pkt->link = link.c_str();
+ ff_pkt->delta_seq = sp.delta_seq;
+ if (sp.flags & FO_DELTA) {
+ ff_pkt->flags |= FO_DELTA;
+ ff_pkt->delta_seq++; /* make new delta sequence number */
+ } else {
+ ff_pkt->flags &= ~FO_DELTA; /* clean delta sequence number */
+ ff_pkt->delta_seq = 0;
+ }
}
memcpy(&ff_pkt->statp, &sp.statp, sizeof(ff_pkt->statp));
continue;
}
goto bail_out;
- }
+ } /* end while loop */
goto bail_out;
- }
+ } /* end loop over all plugins */
Jmsg1(jcr, M_FATAL, 0, "Command plugin \"%s\" not found.\n", cmd);
bail_out:
* End of plugin data, notify plugin, then clear flags
*/
Dmsg2(dbglvl, "End plugin data plugin=%p ctx=%p\n", jcr->plugin, jcr->plugin_ctx);
- if (jcr->plugin) {
+ if (jcr->plugin && jcr->plugin->restoreFileStarted) {
plug_func(jcr->plugin)->endRestoreFile(jcr->plugin_ctx);
+ jcr->plugin->restoreFileStarted = false;
}
jcr->plugin_ctx = NULL;
jcr->plugin = NULL;
goto bail_out;
}
/* ***FIXME**** check error code */
+ if (plugin->restoreFileStarted) {
+ plug_func(jcr->plugin)->endRestoreFile(jcr->plugin_ctx);
+ }
plug_func(plugin)->startRestoreFile((bpContext *)jcr->plugin_ctx, cmd);
+ plugin->restoreFileStarted = true;
goto bail_out;
}
Jmsg1(jcr, M_WARNING, 0, _("Plugin=%s not found.\n"), cmd);
static bRC baculaGetValue(bpContext *ctx, bVariable var, void *value)
{
JCR *jcr;
- if (!value || !ctx) {
+ if (!value) {
return bRC_Error;
}
-// Dmsg1(dbglvl, "bacula: baculaGetValue var=%d\n", var);
+
+ switch (var) { /* General variables, no need of ctx */
+ case bVarFDName:
+ *((char **)value) = my_name;
+ break;
+ case bVarWorkingDir:
+ *(void **)value = me->working_directory;
+ break;
+ case bVarExePath:
+ *(char **)value = exepath;
+ break;
+ default:
+ break;
+ }
+
+ if (!ctx) { /* Other variables need context */
+ return bRC_Error;
+ }
+
jcr = ((bacula_ctx *)ctx->bContext)->jcr;
if (!jcr) {
return bRC_Error;
}
-// Dmsg1(dbglvl, "Bacula: jcr=%p\n", jcr);
+
switch (var) {
case bVarJobId:
*((int *)value) = jcr->JobId;
Dmsg1(dbglvl, "Bacula: return bVarJobId=%d\n", jcr->JobId);
break;
- case bVarFDName:
- *((char **)value) = my_name;
- Dmsg1(dbglvl, "Bacula: return my_name=%s\n", my_name);
- break;
case bVarLevel:
*((int *)value) = jcr->getJobLevel();
Dmsg1(dbglvl, "Bacula: return bVarJobLevel=%d\n", jcr->getJobLevel());
}
#endif
return bRC_Error;
- case bVarWorkingDir:
- *(void **)value = me->working_directory;
- break;
case bVarWhere:
*(char **)value = jcr->where;
break;
case bVarRegexWhere:
*(char **)value = jcr->RegexWhere;
break;
+
+ case bVarFDName: /* get warning with g++ if we missed one */
+ case bVarWorkingDir:
case bVarExePath:
- *(char **)value = exepath;
break;
}
return bRC_OK;
ret = bRC_Seen;
}
+ /* check_changes() can update delta sequence number, return it to the
+ * plugin
+ */
+ sp->delta_seq = ff_pkt->delta_seq;
+
bail_out:
Dmsg1(100, "checkChanges=%i\n", ret);
return ret;