]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/fd_cmds.c
Mult Vols + fix restore hard links + file permissions
[bacula/bacula] / bacula / src / stored / fd_cmds.c
index dc18e709988e1917d4590f8160f619f12d8e75d0..84c52b5e4ddbb04de4a46bffb0f86e464a8f0fd9 100644 (file)
@@ -11,7 +11,7 @@
  * 
  */
 /*
-   Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+   Copyright (C) 2000-2003 Kern Sibbald and John Walker
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -83,7 +83,7 @@ static char read_open[]       = "read open session = %s %ld %ld %ld %ld %ld %ld\
 static char NO_open[]         = "3901 Error session already open\n";
 static char NOT_opened[]      = "3902 Error session not opened\n";
 static char OK_end[]          = "3000 OK end\n";
-static char OK_close[]        = "3000 OK close Volumes = %d\n";
+static char OK_close[]        = "3000 OK close Status = %d\n";
 static char OK_open[]         = "3000 OK open ticket = %d\n";
 static char OK_append[]       = "3000 OK append data\n";
 static char ERROR_append[]    = "3903 Error append data\n";
@@ -115,23 +115,28 @@ void run_job(JCR *jcr)
    dir->jcr = (void *)jcr;
    Dmsg1(120, "Start run Job=%s\n", jcr->Job);
    bnet_fsend(dir, Job_start, jcr->Job); 
-   time(&jcr->start_time);
+   jcr->start_time = time(NULL);
    jcr->run_time = jcr->start_time;
-   jcr->JobStatus = JS_Running;
+   set_jcr_job_status(jcr, JS_Running);
    dir_send_job_status(jcr);         /* update director */
    for (quit=0; !quit;) {
+      int stat;
 
       /* Read command coming from the File daemon */
-      if (bnet_recv(fd) <= 0) {
+      stat = bnet_recv(fd);
+      if (is_bnet_stop(fd)) {        /* hardeof or error */
         break;                       /* connection terminated */
       }
+      if (stat <= 0) {
+        continue;                    /* ignore signals and zero length msgs */
+      }
       Dmsg1(110, "<filed: %s", fd->msg);
       found = 0;
       for (i=0; fd_cmds[i].cmd; i++) {
         if (strncmp(fd_cmds[i].cmd, fd->msg, strlen(fd_cmds[i].cmd)) == 0) {
            found = 1;               /* indicate command found */
            if (!fd_cmds[i].func(jcr)) {    /* do command */
-              jcr->JobStatus = JS_ErrorTerminated;
+              set_jcr_job_status(jcr, JS_ErrorTerminated);
               quit = 1;
            }
            break;
@@ -143,10 +148,9 @@ void run_job(JCR *jcr)
         break;
       }
    }
-   time(&jcr->end_time);
-   if (!job_cancelled(jcr)) {
-      jcr->JobStatus = JS_Terminated;
-   }
+   bnet_sig(fd, BNET_TERMINATE);      /* signal to FD job is done */
+   jcr->end_time = time(NULL);
+   set_jcr_job_status(jcr, JS_Terminated);
    bnet_fsend(dir, Job_end, jcr->Job, jcr->JobStatus, jcr->JobFiles,
       edit_uint64(jcr->JobBytes, ec1));
 
@@ -172,6 +176,7 @@ static int append_data_cmd(JCR *jcr)
         jcr->JobType = JT_BACKUP;
         return 1;
       } else {
+        bnet_suppress_error_messages(fd, 1); /* ignore errors at this point */
         bnet_fsend(fd, ERROR_append);
         return 0;
       }
@@ -233,16 +238,13 @@ static int append_close_session(JCR *jcr)
       return 0;
    }
    /* Send final statistics to File daemon */
-   bnet_fsend(fd, OK_close, jcr->NumVolumes);
+   bnet_fsend(fd, OK_close, jcr->JobStatus);
    Dmsg1(160, ">filed: %s\n", fd->msg);
 
    bnet_sig(fd, BNET_EOD);           /* send EOD to File daemon */
        
    Dmsg1(110, "Append close session: %s\n", dev_name(jcr->device->dev));
 
-   if (jcr->JobStatus != JS_ErrorTerminated) {
-      jcr->JobStatus = JS_Terminated;
-   }
    jcr->session_opened = FALSE;
    return 1;
 }
@@ -330,7 +332,7 @@ static int bootstrap_cmd(JCR *jcr)
         jcr->RestoreBootstrap, strerror(errno));
       goto bail_out;
    }
-   while (bnet_recv(fd) > 0) {
+   while (bnet_recv(fd) >= 0) {
        Dmsg1(400, "stored<filed: bootstrap file %s\n", fd->msg);
        fputs(fd->msg, bs);
    }