-Index: src/filed/job.c
+Index: src/dird/backup.c
===================================================================
---- src/filed/job.c (revision 5235)
-+++ src/filed/job.c (working copy)
-@@ -266,9 +266,6 @@
- bnet_sig(jcr->store_bsock, BNET_TERMINATE);
- }
+--- src/dird/backup.c (révision 5819)
++++ src/dird/backup.c (copie de travail)
+@@ -245,8 +245,7 @@
+ set_jcr_job_status(jcr, JS_ErrorTerminated);
+ Dmsg1(400, "wait for sd. use=%d\n", jcr->use_count());
+ /* Cancel SD */
+- cancel_storage_daemon_job(jcr);
+- wait_for_storage_daemon_termination(jcr);
++ wait_for_job_termination(jcr, 300);
+ Dmsg1(400, "after wait for sd. use=%d\n", jcr->use_count());
+ return false;
+ }
+@@ -258,7 +257,7 @@
+ * are done, we return the job status.
+ * Also used by restore.c
+ */
+-int wait_for_job_termination(JCR *jcr)
++int wait_for_job_termination(JCR *jcr, int timeout)
+ {
+ int32_t n = 0;
+ BSOCK *fd = jcr->file_bsock;
+@@ -268,8 +267,13 @@
+ uint64_t JobBytes = 0;
+ int VSS = 0;
+ int Encrypt = 0;
++ btimer_t *tid=NULL;
-- /* Run the after job */
-- run_scripts(jcr, jcr->RunScripts, "ClientAfterJob");
--
- generate_daemon_event(jcr, "JobEnd");
+ set_jcr_job_status(jcr, JS_Running);
++
++ if (timeout) {
++ tid = start_bsock_timer(fd, timeout); /* TODO: use user timeout */
++ }
+ /* Wait for Client to terminate */
+ while ((n = bget_dirmsg(fd)) >= 0) {
+ if (!fd_ok &&
+@@ -288,6 +292,9 @@
+ break;
+ }
+ }
++ if (tid) {
++ stop_bsock_timer(tid);
++ }
- dequeue_messages(jcr); /* send any queued messages */
-@@ -1321,7 +1318,25 @@
- return bnet_fsend(dir, OKstore);
- }
+ if (is_bnet_error(fd)) {
+ Jmsg(jcr, M_FATAL, 0, _("Network error with FD during %s: ERR=%s\n"),
+Index: src/dird/protos.h
+===================================================================
+--- src/dird/protos.h (révision 5819)
++++ src/dird/protos.h (copie de travail)
+@@ -52,7 +52,7 @@
+ extern bool find_recycled_volume(JCR *jcr, bool InChanger, MEDIA_DBR *mr);
-+static void job_end(JCR *jcr)
-+{
-+ char ed1[50], ed2[50];
+ /* backup.c */
+-extern int wait_for_job_termination(JCR *jcr);
++extern int wait_for_job_termination(JCR *jcr, int timeout=0);
+ extern bool do_backup_init(JCR *jcr);
+ extern bool do_backup(JCR *jcr);
+ extern void backup_cleanup(JCR *jcr, int TermCode);
+Index: src/filed/job.c
+===================================================================
+--- src/filed/job.c (révision 5856)
++++ src/filed/job.c (copie de travail)
+@@ -261,6 +261,16 @@
+ }
+ }
-+ /* Inform Storage daemon that we are done */
-+ if (jcr->store_bsock) {
-+ bnet_sig(jcr->store_bsock, BNET_TERMINATE);
++ if (jcr->JobId) {
++ char ed1[50], ed2[50];
++ /* Send termination status back to Dir */
++ bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles,
++ edit_uint64(jcr->ReadBytes, ed1),
++ edit_uint64(jcr->JobBytes, ed2), jcr->Errors, jcr->VSS,
++ jcr->pki_encrypt);
++ Dmsg1(110, "End FD msg: %s\n", dir->msg);
+ }
+
-+ /* Run the after job */
-+ run_scripts(jcr, jcr->RunScripts, "ClientAfterJob");
-+
-+ bnet_fsend(jcr->dir_bsock, EndJob, jcr->JobStatus, jcr->JobFiles,
-+ edit_uint64(jcr->ReadBytes, ed1),
-+ edit_uint64(jcr->JobBytes, ed2), jcr->Errors, (int)jcr->VSS,
-+ jcr->pki_encrypt);
-+ Dmsg1(110, "End FD msg: %s\n", jcr->dir_bsock->msg);
-+}
-+
- /*
- * Do a backup.
- */
-@@ -1331,15 +1346,13 @@
+ /* Inform Storage daemon that we are done */
+ if (jcr->store_bsock) {
+ bnet_sig(jcr->store_bsock, BNET_TERMINATE);
+@@ -1331,15 +1341,13 @@
BSOCK *sd = jcr->store_bsock;
int ok = 0;
int SDJobStatus;
/* Run only one at a time */
P(vss_mutex);
}
-@@ -1395,7 +1408,7 @@
+@@ -1395,7 +1403,7 @@
#if defined(WIN32_VSS)
/* START VSS ON WIN 32 */
if (g_pVSSClient->InitializeForBackup()) {
/* tell vss which drives to snapshot */
char szWinDriveLetters[27];
-@@ -1488,7 +1501,7 @@
+@@ -1488,7 +1496,7 @@
#if defined(WIN32_VSS)
/* STOP VSS ON WIN 32 */
/* tell vss to close the backup session */
if (g_pVSSClient->CloseBackup()) {
/* inform user about writer states */
for (int i=0; i<(int)g_pVSSClient->GetWriterCount(); i++) {
-@@ -1504,12 +1517,8 @@
+@@ -1504,12 +1512,6 @@
}
#endif
- jcr->pki_encrypt);
- Dmsg1(110, "End FD msg: %s\n", dir->msg);
-
-+ job_end(jcr);
-+
return 0; /* return and stop command loop */
}
-@@ -1585,12 +1594,7 @@
+@@ -1521,7 +1523,7 @@
+ {
+ BSOCK *dir = jcr->dir_bsock;
+ BSOCK *sd = jcr->store_bsock;
+- char level[100], ed1[50], ed2[50];
++ char level[100];
+
+ jcr->JobType = JT_VERIFY;
+ if (sscanf(dir->msg, verifycmd, level) != 1) {
+@@ -1585,15 +1587,6 @@
bnet_sig(dir, BNET_EOD);
- edit_uint64(jcr->JobBytes, ed2), jcr->Errors, 0,
- jcr->pki_encrypt);
- Dmsg1(110, "End FD msg: %s\n", dir->msg);
-+ job_end(jcr);
+-
+- /* Inform Director that we are done */
+- bnet_sig(dir, BNET_TERMINATE);
+ return 0; /* return and terminate command loop */
+ }
+
+@@ -1609,7 +1602,6 @@
+ bool use_regexwhere=false;
+ int prefix_links;
+ char replace;
+- char ed1[50], ed2[50];
- /* Inform Director that we are done */
- bnet_sig(dir, BNET_TERMINATE);
-@@ -1696,13 +1700,9 @@
+ /*
+ * Scan WHERE (base directory for restore) from command
+@@ -1696,16 +1688,7 @@
if (jcr->Errors) {
set_jcr_job_status(jcr, JS_ErrorTerminated);
}
- jcr->pki_encrypt);
- Dmsg1(110, "End FD msg: %s\n", dir->msg);
-+ job_end(jcr);
-+
- /* Inform Director that we are done */
- bnet_sig(dir, BNET_TERMINATE);
-
+- /* Inform Director that we are done */
+- bnet_sig(dir, BNET_TERMINATE);
+-
+ Dmsg0(130, "Done in job.c\n");
+ return 0; /* return and terminate command loop */
+ }
Index: src/jcr.h
===================================================================
---- src/jcr.h (revision 5235)
-+++ src/jcr.h (working copy)
-@@ -297,6 +297,7 @@
+--- src/jcr.h (révision 5856)
++++ src/jcr.h (copie de travail)
+@@ -301,6 +301,7 @@
int32_t pki_session_encoded_size; /* Size of DER-encoded pki_session */
POOLMEM *crypto_buf; /* Encryption/Decryption buffer */
DIRRES* director; /* Director resource */