]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/fd_cmds.c
Pull compiler warning cleanup code + other from master
[bacula/bacula] / bacula / src / stored / fd_cmds.c
index 41df7eae30ba53f1c4d59041ab228dbe606c18e6..a97f832a7ad69ab031fb6ee0a73f366695962cb1 100644 (file)
@@ -1,3 +1,30 @@
+/*
+   Bacula® - The Network Backup Solution
+
+   Copyright (C) 2000-2011 Free Software Foundation Europe e.V.
+
+   The main author of Bacula is Kern Sibbald, with contributions from
+   many others, a complete list can be found in the file AUTHORS.
+   This program is Free Software; you can redistribute it and/or
+   modify it under the terms of version three of the GNU Affero General Public
+   License as published by the Free Software Foundation and included
+   in the file LICENSE.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Bacula® is a registered trademark of Kern Sibbald.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+   Switzerland, email:ftf@fsfeurope.org.
+*/
 /*
  * This file handles commands from the File daemon.
  *
@@ -9,23 +36,8 @@
  *  the File daemon, control is passed here to handle the
  *  subsequent File daemon commands.
  *
- *   Version $Id$
  *
  */
-/*
-   Copyright (C) 2000-2006 Kern Sibbald
-
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License
-   version 2 as amended with additional clauses defined in the
-   file LICENSE in the main source directory.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
-   the file LICENSE for additional details.
-
- */
 
 #include "bacula.h"
 #include "stored.h"
@@ -48,7 +60,6 @@ static bool append_end_session(JCR *jcr);
 static bool read_open_session(JCR *jcr);
 static bool read_data_cmd(JCR *jcr);
 static bool read_close_session(JCR *jcr);
-static bool bootstrap_cmd(JCR *jcr);
 
 /* Exported function */
 bool get_bootstrap_file(JCR *jcr, BSOCK *bs);
@@ -69,7 +80,6 @@ static struct s_cmds fd_cmds[] = {
    {"read open",    read_open_session},
    {"read data",    read_data_cmd},
    {"read close",   read_close_session},
-   {"bootstrap",    bootstrap_cmd},
    {NULL,           NULL}                  /* list terminator */
 };
 
@@ -82,18 +92,16 @@ 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 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";
-static char OK_bootstrap[]    = "3000 OK bootstrap\n";
-static char ERROR_bootstrap[] = "3904 Error bootstrap\n";
 
 /* Information sent to the Director */
 static char Job_start[] = "3010 Job %s start\n";
 char Job_end[]   =
-   "3099 Job %s end JobStatus=%d JobFiles=%d JobBytes=%s\n";
+   "3099 Job %s end JobStatus=%d JobFiles=%d JobBytes=%s JobErrors=%u\n";
 
 /*
  * Run a File daemon Job -- File daemon already authorized
+ *  Director sends us this command.
  *
  * Basic task here is:
  * - Read a command from the File daemon
@@ -102,26 +110,43 @@ char Job_end[]   =
  */
 void run_job(JCR *jcr)
 {
-   int i;
-   bool found, quit;
-   BSOCK *fd = jcr->file_bsock;
    BSOCK *dir = jcr->dir_bsock;
    char ec1[30];
 
-
-   fd->jcr = jcr;
-   dir->jcr = jcr;
+   dir->set_jcr(jcr);
    Dmsg1(120, "Start run Job=%s\n", jcr->Job);
-   bnet_fsend(dir, Job_start, jcr->Job);
+   dir->fsend(Job_start, jcr->Job);
    jcr->start_time = time(NULL);
    jcr->run_time = jcr->start_time;
-   set_jcr_job_status(jcr, JS_Running);
-   dir_send_job_status(jcr);          /* update director */
+   jcr->sendJobStatus(JS_Running);
+   do_fd_commands(jcr);
+   jcr->end_time = time(NULL);
+   dequeue_messages(jcr);             /* send any queued messages */
+   jcr->setJobStatus(JS_Terminated);
+   generate_daemon_event(jcr, "JobEnd");
+   generate_plugin_event(jcr, bsdEventJobEnd);
+   dir->fsend(Job_end, jcr->Job, jcr->JobStatus, jcr->JobFiles,
+      edit_uint64(jcr->JobBytes, ec1), jcr->JobErrors);
+   dir->signal(BNET_EOD);             /* send EOD to Director daemon */
+   free_plugins(jcr);                 /* release instantiated plugins */
+   return;
+}
+
+/*
+ * Now talk to the FD and do what he says
+ */
+void do_fd_commands(JCR *jcr)
+{
+   int i;
+   bool found, quit;
+   BSOCK *fd = jcr->file_bsock;
+
+   fd->set_jcr(jcr);
    for (quit=false; !quit;) {
       int stat;
 
       /* Read command coming from the File daemon */
-      stat = bnet_recv(fd);
+      stat = fd->recv();
       if (is_bnet_stop(fd)) {         /* hardeof or error */
          break;                       /* connection terminated */
       }
@@ -133,31 +158,35 @@ void run_job(JCR *jcr)
       for (i=0; fd_cmds[i].cmd; i++) {
          if (strncmp(fd_cmds[i].cmd, fd->msg, strlen(fd_cmds[i].cmd)) == 0) {
             found = true;               /* indicate command found */
-            if (!fd_cmds[i].func(jcr) || job_canceled(jcr)) {    /* do command */
-               set_jcr_job_status(jcr, JS_ErrorTerminated);
+            jcr->errmsg[0] = 0;
+            if (!fd_cmds[i].func(jcr)) {    /* do command */
+               /* Note fd->msg command may be destroyed by comm activity */
+               if (!job_canceled(jcr)) {
+                  if (jcr->errmsg[0]) {
+                     Jmsg1(jcr, M_FATAL, 0, _("Command error with FD, hanging up. %s\n"),
+                           jcr->errmsg);
+                  } else {
+                     Jmsg0(jcr, M_FATAL, 0, _("Command error with FD, hanging up.\n"));
+                  }
+                  jcr->setJobStatus(JS_ErrorTerminated);
+               }
                quit = true;
             }
             break;
          }
       }
       if (!found) {                   /* command not found */
-         Dmsg1(110, "<filed: Command not found: %s\n", fd->msg);
-         bnet_fsend(fd, ferrmsg);
+         if (!job_canceled(jcr)) {
+            Jmsg1(jcr, M_FATAL, 0, _("FD command not found: %s\n"), fd->msg);
+            Dmsg1(110, "<filed: Command not found: %s\n", fd->msg);
+         }
+         fd->fsend(ferrmsg);
          break;
       }
    }
-   bnet_sig(fd, BNET_TERMINATE);      /* signal to FD job is done */
-   jcr->end_time = time(NULL);
-   dequeue_messages(jcr);             /* send any queued messages */
-   set_jcr_job_status(jcr, JS_Terminated);
-   generate_daemon_event(jcr, "JobEnd");
-   bnet_fsend(dir, Job_end, jcr->Job, jcr->JobStatus, jcr->JobFiles,
-      edit_uint64(jcr->JobBytes, ec1));
-   bnet_sig(dir, BNET_EOD);           /* send EOD to Director daemon */
-   return;
+   fd->signal(BNET_TERMINATE);        /* signal to FD job is done */
 }
 
-
 /*
  *   Append Data command
  *     Open Data Channel and receive Data for archiving
@@ -170,15 +199,17 @@ static bool append_data_cmd(JCR *jcr)
    Dmsg1(120, "Append data: %s", fd->msg);
    if (jcr->session_opened) {
       Dmsg1(110, "<bfiled: %s", fd->msg);
-      jcr->JobType = JT_BACKUP;
+      jcr->setJobType(JT_BACKUP);
       if (do_append_data(jcr)) {
-         return bnet_fsend(fd, OK_append);
+         return true;
       } else {
+         pm_strcpy(jcr->errmsg, _("Append data error.\n"));
          bnet_suppress_error_messages(fd, 1); /* ignore errors at this point */
-         bnet_fsend(fd, ERROR_append);
+         fd->fsend(ERROR_append);
       }
    } else {
-      bnet_fsend(fd, NOT_opened);
+      pm_strcpy(jcr->errmsg, _("Attempt to append on non-open session.\n"));
+      fd->fsend(NOT_opened);
    }
    return false;
 }
@@ -189,11 +220,11 @@ static bool append_end_session(JCR *jcr)
 
    Dmsg1(120, "store<file: %s", fd->msg);
    if (!jcr->session_opened) {
-      bnet_fsend(fd, NOT_opened);
+      pm_strcpy(jcr->errmsg, _("Attempt to close non-open session.\n"));
+      fd->fsend(NOT_opened);
       return false;
    }
-   set_jcr_job_status(jcr, JS_Terminated);
-   return bnet_fsend(fd, OK_end);
+   return fd->fsend(OK_end);
 }
 
 
@@ -207,14 +238,15 @@ static bool append_open_session(JCR *jcr)
 
    Dmsg1(120, "Append open session: %s", fd->msg);
    if (jcr->session_opened) {
-      bnet_fsend(fd, NO_open);
+      pm_strcpy(jcr->errmsg, _("Attempt to open already open session.\n"));
+      fd->fsend(NO_open);
       return false;
    }
 
    jcr->session_opened = true;
 
    /* Send "Ticket" to File Daemon */
-   bnet_fsend(fd, OK_open, jcr->VolSessionId);
+   fd->fsend(OK_open, jcr->VolSessionId);
    Dmsg1(110, ">filed: %s", fd->msg);
 
    return true;
@@ -231,14 +263,15 @@ static bool append_close_session(JCR *jcr)
 
    Dmsg1(120, "<filed: %s", fd->msg);
    if (!jcr->session_opened) {
-      bnet_fsend(fd, NOT_opened);
+      pm_strcpy(jcr->errmsg, _("Attempt to close non-open session.\n"));
+      fd->fsend(NOT_opened);
       return false;
    }
    /* Send final statistics to File daemon */
-   bnet_fsend(fd, OK_close, jcr->JobStatus);
+   fd->fsend(OK_close, jcr->JobStatus);
    Dmsg1(120, ">filed: %s", fd->msg);
 
-   bnet_sig(fd, BNET_EOD);            /* send EOD to File daemon */
+   fd->signal(BNET_EOD);              /* send EOD to File daemon */
 
    jcr->session_opened = false;
    return true;
@@ -259,7 +292,8 @@ static bool read_data_cmd(JCR *jcr)
       Dmsg1(120, "<bfiled: %s", fd->msg);
       return do_read_data(jcr);
    } else {
-      bnet_fsend(fd, NOT_opened);
+      pm_strcpy(jcr->errmsg, _("Attempt to read on non-open session.\n"));
+      fd->fsend(NOT_opened);
       return false;
    }
 }
@@ -276,7 +310,8 @@ static bool read_open_session(JCR *jcr)
 
    Dmsg1(120, "%s\n", fd->msg);
    if (jcr->session_opened) {
-      bnet_fsend(fd, NO_open);
+      pm_strcpy(jcr->errmsg, _("Attempt to open read on non-open session.\n"));
+      fd->fsend(NO_open);
       return false;
    }
 
@@ -284,7 +319,8 @@ static bool read_open_session(JCR *jcr)
          &jcr->read_VolSessionTime, &jcr->read_StartFile, &jcr->read_EndFile,
          &jcr->read_StartBlock, &jcr->read_EndBlock) == 7) {
       if (jcr->session_opened) {
-         bnet_fsend(fd, NOT_opened);
+         pm_strcpy(jcr->errmsg, _("Attempt to open read on non-open session.\n"));
+         fd->fsend(NOT_opened);
          return false;
       }
       Dmsg4(100, "read_open_session got: JobId=%d Vol=%s VolSessId=%ld VolSessT=%ld\n",
@@ -296,67 +332,15 @@ static bool read_open_session(JCR *jcr)
    }
 
    jcr->session_opened = true;
-   jcr->JobType = JT_RESTORE;
+   jcr->setJobType(JT_RESTORE);
 
    /* Send "Ticket" to File Daemon */
-   bnet_fsend(fd, OK_open, jcr->VolSessionId);
+   fd->fsend(OK_open, jcr->VolSessionId);
    Dmsg1(110, ">filed: %s", fd->msg);
 
    return true;
 }
 
-static bool bootstrap_cmd(JCR *jcr)
-{
-   return get_bootstrap_file(jcr, jcr->file_bsock);
-}
-
-bool get_bootstrap_file(JCR *jcr, BSOCK *sock)
-{
-   POOLMEM *fname = get_pool_memory(PM_FNAME);
-   FILE *bs;
-   bool ok = false;
-
-   if (jcr->RestoreBootstrap) {
-      unlink(jcr->RestoreBootstrap);
-      free_pool_memory(jcr->RestoreBootstrap);
-   }
-   Mmsg(fname, "%s/%s.%s.bootstrap", me->working_directory, me->hdr.name,
-      jcr->Job);
-   Dmsg1(400, "bootstrap=%s\n", fname);
-   jcr->RestoreBootstrap = fname;
-   bs = fopen(fname, "a+");           /* create file */
-   if (!bs) {
-      Jmsg(jcr, M_FATAL, 0, _("Could not create bootstrap file %s: ERR=%s\n"),
-         jcr->RestoreBootstrap, strerror(errno));
-      goto bail_out;
-   }
-   while (bnet_recv(sock) >= 0) {
-       Dmsg1(400, "stored<filed: bootstrap file %s", sock->msg);
-       fputs(sock->msg, bs);
-   }
-   fclose(bs);
-   jcr->bsr = parse_bsr(jcr, jcr->RestoreBootstrap);
-   if (!jcr->bsr) {
-      Jmsg(jcr, M_FATAL, 0, _("Error parsing bootstrap file.\n"));
-      goto bail_out;
-   }
-   if (debug_level > 20) {
-      dump_bsr(jcr->bsr, true);
-   }
-   ok = true;
-
-bail_out:
-   unlink(jcr->RestoreBootstrap);
-   free_pool_memory(jcr->RestoreBootstrap);
-   jcr->RestoreBootstrap = NULL;
-   if (!ok) {
-      bnet_fsend(sock, ERROR_bootstrap);
-      return false;
-   }
-   return bnet_fsend(sock, OK_bootstrap);
-}
-
-
 /*
  *   Read Close session command
  *      Close the read session
@@ -367,14 +351,14 @@ static bool read_close_session(JCR *jcr)
 
    Dmsg1(120, "Read close session: %s\n", fd->msg);
    if (!jcr->session_opened) {
-      bnet_fsend(fd, NOT_opened);
+      fd->fsend(NOT_opened);
       return false;
    }
-   /* Send final statistics to File daemon */
-   bnet_fsend(fd, OK_close);
+   /* Send final close msg to File daemon */
+   fd->fsend(OK_close, jcr->JobStatus);
    Dmsg1(160, ">filed: %s\n", fd->msg);
 
-   bnet_sig(fd, BNET_EOD);          /* send EOD to File daemon */
+   fd->signal(BNET_EOD);            /* send EOD to File daemon */
 
    jcr->session_opened = false;
    return true;