]> git.sur5r.net Git - bacula/bacula/commitdiff
Add vss_close_backup_session after find_files + add object_name to restore object
authorKern Sibbald <kern@sibbald.com>
Wed, 14 Apr 2010 10:44:43 +0000 (12:44 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 2 Aug 2010 14:50:32 +0000 (16:50 +0200)
bacula/src/filed/backup.c
bacula/src/filed/fd_plugins.c
bacula/src/filed/fd_plugins.h
bacula/src/filed/job.c
bacula/src/plugins/fd/test-plugin-fd.c

index 580dd7d4c8a6516e10e9ddc47e502ac59a0bc3e9..3456446064d377ea8bb8eb60cd8240c6349b0751 100644 (file)
@@ -61,6 +61,7 @@ bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream);
 static bool crypto_session_start(JCR *jcr);
 static void crypto_session_end(JCR *jcr);
 static bool crypto_session_send(JCR *jcr, BSOCK *sd);
+static void close_vss_backup_session(JCR *jcr);
 
 /**
  * Find all the requested files and send them
@@ -172,6 +173,8 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
            jcr->xattr_data->nr_errors);
    }
 
+   close_vss_backup_session(jcr);
+
    accurate_finish(jcr);              /* send deleted or base file list to SD */
 
    stop_heartbeat_monitor(jcr);
@@ -1317,3 +1320,24 @@ void unstrip_path(FF_PKT *ff_pkt)
       sm_check(__FILE__, __LINE__, true);
    }
 }
+
+static void close_vss_backup_session(JCR *jcr)
+{
+#if defined(WIN32_VSS)
+   /* STOP VSS ON WIN32 */
+   /* tell vss to close the backup session */
+   if (jcr->VSS) {
+      if (g_pVSSClient->CloseBackup()) {             
+         /* inform user about writer states */
+         for (int i=0; i<(int)g_pVSSClient->GetWriterCount(); i++) {
+            int msg_type = M_INFO;
+            if (g_pVSSClient->GetWriterState(i) < 1) {
+               msg_type = M_WARNING;
+               jcr->JobErrors++;
+            }
+            Jmsg(jcr, msg_type, 0, _("VSS Writer (BackupComplete): %s\n"), g_pVSSClient->GetWriterInfo(i));
+         }
+      }
+   }
+#endif
+}
index 4f4f93a90d211e7b0daf94a61a25d46e76cfb884..8e100671f0fee3133af56b6ce5ce7eab68881a9e 100644 (file)
@@ -276,8 +276,8 @@ int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
          if (plug_func(plugin)->startBackupFile(jcr->plugin_ctx, &sp) != bRC_OK) {
             goto bail_out;
          }
-         if (sp.type == 0 || sp.fname == NULL) {
-            Jmsg1(jcr, M_FATAL, 0, _("Command plugin \"%s\" returned bad startBackupFile packet.\n"),
+         if (sp.type == 0) {
+            Jmsg1(jcr, M_FATAL, 0, _("Command plugin \"%s\": no type in startBackupFile packet.\n"),
                cmd);
             goto bail_out;
          }
@@ -287,16 +287,30 @@ int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
           * Copy fname and link because save_file() zaps them.  This 
           *  avoids zaping the plugin's strings.
           */
-         pm_strcpy(fname, sp.fname);
-         pm_strcpy(link, sp.link);
-         ff_pkt->fname = fname.c_str();
-         ff_pkt->link = link.c_str();
          ff_pkt->type = sp.type;
          if (sp.type == FT_RESTORE_FIRST) {
+            if (!sp.object_name) {
+               Jmsg1(jcr, M_FATAL, 0, _("Command plugin \"%s\": no object_name in startBackupFile packet.\n"),
+                  cmd);
+               goto bail_out;
+            }
+            pm_strcpy(fname, sp.object_name);
+            ff_pkt->fname = fname.c_str();
             ff_pkt->LinkFI = sp.index;     /* restore object index */
             ff_pkt->object = sp.object;
             ff_pkt->object_len = sp.object_len;
+         } else {
+            if (!sp.fname) {
+               Jmsg1(jcr, M_FATAL, 0, _("Command plugin \"%s\": no fname in startBackupFile packet.\n"),
+                  cmd);
+               goto bail_out;
+            }
+            pm_strcpy(fname, sp.fname);
+            pm_strcpy(link, sp.link);
+            ff_pkt->fname = fname.c_str();
+            ff_pkt->link = link.c_str();
          }
+
          memcpy(&ff_pkt->statp, &sp.statp, sizeof(ff_pkt->statp));
          Dmsg2(dbglvl, "startBackup returned type=%d, fname=%s\n", sp.type, sp.fname);
          if (sp.object) {
index 963451b4b497356188d83386901e1af7b44ea76a..adf82df4c50f68f17306ce368f581c886ccacce0 100644 (file)
@@ -99,6 +99,7 @@ struct save_pkt {
    uint32_t flags;                    /* Bacula internal flags */
    bool portable;                     /* set if data format is portable */
    char *cmd;                         /* command */
+   char *object_name;                 /* Object name to create */
    char *object;                      /* restore object data to save */
    int32_t object_len;                /* restore object length */
    int32_t index;                     /* restore object index */
index b11466128a62cb906df6df8793faaedc46730244..c4b203ecd1350f9a11de75e8e0df7d7a27dea2a4 100644 (file)
@@ -1760,20 +1760,7 @@ static int backup_cmd(JCR *jcr)
 
 cleanup:
 #if defined(WIN32_VSS)
-   /* STOP VSS ON WIN32 */
-   /* tell vss to close the backup session */
    if (jcr->VSS) {
-      if (g_pVSSClient->CloseBackup()) {             
-         /* inform user about writer states */
-         for (int i=0; i<(int)g_pVSSClient->GetWriterCount(); i++) {
-            int msg_type = M_INFO;
-            if (g_pVSSClient->GetWriterState(i) < 1) {
-               msg_type = M_WARNING;
-               jcr->JobErrors++;
-            }
-            Jmsg(jcr, msg_type, 0, _("VSS Writer (BackupComplete): %s\n"), g_pVSSClient->GetWriterInfo(i));
-         }
-      }
       Win32ConvCleanupCache();
       V(vss_mutex);
    }
index 8a239e8b95669b88393d4e1b677232f598742330..13ccd501fc590cec9cd4061ca595443c1bb3ac6b 100644 (file)
@@ -290,7 +290,7 @@ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp)
       return bRC_Error;
    }
    time_t now = time(NULL);
-   sp->fname = (char *)"james.xml";
+   sp->object_name = (char *)"james.xml";
    sp->object = (char *)"This is test data for the restore object.";
    sp->object_len = strlen(sp->object);
    sp->index = 2;