]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/bls.c
update version
[bacula/bacula] / bacula / src / stored / bls.c
index 92d6fbcc95682d55a8735a5bab602deda575da35..d1281a54592f37f3f35fc9f483f9ba63f25a4210 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2010 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.
@@ -20,7 +20,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Bacula® is a registered trademark of John Walker.
+   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.
@@ -31,7 +31,6 @@
  * 
  *  Kern Sibbald, MM
  *
- *   Version $Id$
  */
 
 #include "bacula.h"
@@ -40,6 +39,7 @@
 
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
+extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
 
 static void do_blocks(char *infname);
 static void do_jobs(char *infname);
@@ -58,6 +58,7 @@ static JCR *jcr;
 static SESSION_LABEL sessrec;
 static uint32_t num_files = 0;
 static ATTR *attr;
+static CONFIG *config;
 
 #define CONFIG_FILE "bacula-sd.conf"
 char *configfile = NULL;
@@ -78,8 +79,9 @@ PROG_COPYRIGHT
 "\nVersion: %s (%s)\n\n"
 "Usage: bls [options] <device-name>\n"
 "       -b <file>       specify a bootstrap file\n"
-"       -c <file>       specify a config file\n"
-"       -d <level>      specify debug level\n"
+"       -c <file>       specify a Storage configuration file\n"
+"       -d <nn>         set debug level to <nn>\n"
+"       -dt             print timestamp in debug output\n"
 "       -e <file>       exclude list\n"
 "       -i <file>       include list\n"
 "       -j              list jobs\n"
@@ -107,6 +109,7 @@ int main (int argc, char *argv[])
    bindtextdomain("bacula", LOCALEDIR);
    textdomain("bacula");
    init_stack_dump();
+   lmgr_init_thread();
 
    working_directory = "/tmp";
    my_name_is(argc, argv, "bls");
@@ -130,9 +133,14 @@ int main (int argc, char *argv[])
          break;
 
       case 'd':                    /* debug level */
-         debug_level = atoi(optarg);
-         if (debug_level <= 0)
-            debug_level = 1;
+         if (*optarg == 't') {
+            dbg_timestamp = true;
+         } else {
+            debug_level = atoi(optarg);
+            if (debug_level <= 0) {
+               debug_level = 1;
+            }
+         }
          break;
 
       case 'e':                    /* exclude list */
@@ -208,7 +216,8 @@ int main (int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_sd_config(config, configfile, M_ERROR_TERM);
 
    if (ff->included_files_list == NULL) {
       add_fname_to_include_list(ff, 0, "/");
@@ -372,20 +381,16 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    /* File Attributes stream */
    if (rec->Stream == STREAM_UNIX_ATTRIBUTES ||
        rec->Stream == STREAM_UNIX_ATTRIBUTES_EX) {
-
-      if (!unpack_attributes_record(jcr, rec->Stream, rec->data, attr)) {
+      if (!unpack_attributes_record(jcr, rec->Stream, rec->data, rec->data_len, attr)) {
          if (!forge_on) {
             Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n"));
+         } else {
+            Emsg0(M_ERROR, 0, _("Attrib unpack error!\n"));
          }
          num_files++;
          return true;
       }
 
-      if (attr->file_index != rec->FileIndex) {
-         Emsg2(forge_on?M_WARNING:M_ERROR_TERM, 0, _("Record header file index %ld not equal record index %ld\n"),
-               rec->FileIndex, attr->file_index);
-      }
-
       attr->data_stream = decode_stat(attr->attr, &attr->statp, &attr->LinkFI);
       build_attr_output_fnames(jcr, attr);
 
@@ -397,7 +402,14 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
          print_ls_output(jcr, attr);
          num_files++;
       }
+   } else if (rec->Stream == STREAM_PLUGIN_NAME) {
+      if (strncmp("0 0", rec->data, 3) != 0) {
+         Pmsg1(000, "Plugin data: %s\n", rec->data);
+      }
+   } else if (rec->Stream == STREAM_RESTORE_OBJECT) {
+      Pmsg0(000, "Restore Object record\n");
    }
+      
    return true;
 }
 
@@ -406,6 +418,7 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess
 {
    const char *rtype;
    memset(sessrec, 0, sizeof(sessrec));
+   jcr->JobId = 0;
    switch (rec->FileIndex) {
    case PRE_LABEL:
       rtype = _("Fresh Volume Label");
@@ -417,6 +430,7 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess
    case SOS_LABEL:
       rtype = _("Begin Job Session");
       unser_session_label(sessrec, rec);
+      jcr->JobId = sessrec->JobId;
       break;
    case EOS_LABEL:
       rtype = _("End Job Session");
@@ -425,8 +439,18 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess
    case EOM_LABEL:
       rtype = _("End of Medium");
       break;
+   case EOT_LABEL:
+      rtype = _("End of Physical Medium");
+      break;
+   case SOB_LABEL:
+      rtype = _("Start of object");
+      break;
+   case EOB_LABEL:
+      rtype = _("End of object");
+      break;
    default:
       rtype = _("Unknown");
+      Dmsg1(10, "FI rtype=%d unknown\n", rec->FileIndex);     
       break;
    }
    Dmsg5(10, "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n",
@@ -440,15 +464,15 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess
 
 /* Dummies to replace askdir.c */
 bool    dir_find_next_appendable_volume(DCR *dcr) { return 1;}
-bool    dir_update_volume_info(DCR *dcr, bool relabel) { return 1; }
-bool    dir_create_jobmedia_record(DCR *dcr) { return 1; }
+bool    dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; }
+bool    dir_create_jobmedia_record(DCR *dcr, bool zero) { return 1; }
 bool    dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; }
 bool    dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;}
 bool    dir_send_job_status(JCR *jcr) {return 1;}
 int     generate_job_event(JCR *jcr, const char *event) { return 1; }
        
 
-bool dir_ask_sysop_to_mount_volume(DCR *dcr)
+bool dir_ask_sysop_to_mount_volume(DCR *dcr, int /*mode*/)
 {
    DEVICE *dev = dcr->dev;
    fprintf(stderr, _("Mount Volume \"%s\" on device %s and press return when ready: "),
@@ -461,8 +485,8 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr)
 bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw  writing)
 {
    Dmsg0(100, "Fake dir_get_volume_info\n");
-   bstrncpy(dcr->VolCatInfo.VolCatName, dcr->VolumeName, sizeof(dcr->VolCatInfo.VolCatName));
+   dcr->setVolCatName(dcr->VolumeName);
    dcr->VolCatInfo.VolCatParts = find_num_dvd_parts(dcr);
-   Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->VolCatInfo.VolCatName, dcr->VolCatInfo.VolCatParts);
+   Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->getVolCatName(), dcr->VolCatInfo.VolCatParts);
    return 1;
 }