]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/bls.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / stored / bls.c
index e0c8cfa9293798f22370cc0c5af36519abe505ff..350d7b79110f461c3b13eff6368c88fd2e3ffcf4 100644 (file)
 #include "stored.h"
 #include "findlib/find.h"
 
+#ifdef HAVE_CYGWIN
+int win32_client = 1;
+#else
+int win32_client = 0;
+#endif
+
+
 static void do_blocks(char *infname);
 static void do_jobs(char *infname);
 static void do_ls(char *fname);
 static void do_close(JCR *jcr);
 static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sessrec);
-static void record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec);
+static int record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec);
 
 static DEVICE *dev;
 static int dump_label = FALSE;
@@ -44,7 +51,7 @@ static DEV_BLOCK *block;
 static JCR *jcr;
 static SESSION_LABEL sessrec;
 static uint32_t num_files = 0;
-static long record_file_index;
+static ATTR *attr;
 
 #define CONFIG_FILE "bacula-sd.conf"
 char *configfile;
@@ -91,77 +98,77 @@ int main (int argc, char *argv[])
 
    while ((ch = getopt(argc, argv, "b:c:d:e:i:jkLtvV:?")) != -1) {
       switch (ch) {
-         case 'b':
-           bsrName = optarg;
-           break;
+      case 'b':
+        bsrName = optarg;
+        break;
 
-         case 'c':                    /* specify config file */
-           if (configfile != NULL) {
-              free(configfile);
-           }
-           configfile = bstrdup(optarg);
-           break;
+      case 'c':                    /* specify config file */
+        if (configfile != NULL) {
+           free(configfile);
+        }
+        configfile = bstrdup(optarg);
+        break;
 
-         case 'd':                    /* debug level */
-           debug_level = atoi(optarg);
-           if (debug_level <= 0)
-              debug_level = 1; 
-           break;
+      case 'd':                    /* debug level */
+        debug_level = atoi(optarg);
+        if (debug_level <= 0)
+           debug_level = 1; 
+        break;
 
-         case 'e':                    /* exclude list */
-            if ((fd = fopen(optarg, "r")) == NULL) {
-               Pmsg2(0, _("Could not open exclude file: %s, ERR=%s\n"),
-                 optarg, strerror(errno));
-              exit(1);
-           }
-           while (fgets(line, sizeof(line), fd) != NULL) {
-              strip_trailing_junk(line);
-               Dmsg1(100, "add_exclude %s\n", line);
-              add_fname_to_exclude_list(&ff, line);
-           }
-           fclose(fd);
-           break;
+      case 'e':                    /* exclude list */
+         if ((fd = fopen(optarg, "r")) == NULL) {
+            Pmsg2(0, _("Could not open exclude file: %s, ERR=%s\n"),
+              optarg, strerror(errno));
+           exit(1);
+        }
+        while (fgets(line, sizeof(line), fd) != NULL) {
+           strip_trailing_junk(line);
+            Dmsg1(100, "add_exclude %s\n", line);
+           add_fname_to_exclude_list(&ff, line);
+        }
+        fclose(fd);
+        break;
 
-         case 'i':                    /* include list */
-            if ((fd = fopen(optarg, "r")) == NULL) {
-               Pmsg2(0, "Could not open include file: %s, ERR=%s\n",
-                 optarg, strerror(errno));
-              exit(1);
-           }
-           while (fgets(line, sizeof(line), fd) != NULL) {
-              strip_trailing_junk(line);
-               Dmsg1(100, "add_include %s\n", line);
-              add_fname_to_include_list(&ff, 0, line);
-           }
-           fclose(fd);
-           break;
+      case 'i':                    /* include list */
+         if ((fd = fopen(optarg, "r")) == NULL) {
+            Pmsg2(0, "Could not open include file: %s, ERR=%s\n",
+              optarg, strerror(errno));
+           exit(1);
+        }
+        while (fgets(line, sizeof(line), fd) != NULL) {
+           strip_trailing_junk(line);
+            Dmsg1(100, "add_include %s\n", line);
+           add_fname_to_include_list(&ff, 0, line);
+        }
+        fclose(fd);
+        break;
 
-         case 'j':
-           list_jobs = TRUE;
-           break;
+      case 'j':
+        list_jobs = TRUE;
+        break;
 
-         case 'k':
-           list_blocks = TRUE;
-           break;
+      case 'k':
+        list_blocks = TRUE;
+        break;
 
-         case 'L':
-           dump_label = TRUE;
-           break;
+      case 'L':
+        dump_label = TRUE;
+        break;
 
-         case 'v':
-           verbose++;
-           break;
+      case 'v':
+        verbose++;
+        break;
 
-         case 'V':                    /* Volume name */
-           VolumeName = optarg;
-           break;
+      case 'V':                    /* Volume name */
+        VolumeName = optarg;
+        break;
 
-         case '?':
-        default:
-           usage();
+      case '?':
+      default:
+        usage();
 
-      }  
-   }
+      } /* end switch */
+   } /* end while */
    argc -= optind;
    argv += optind;
 
@@ -191,6 +198,7 @@ int main (int argc, char *argv[])
       }
       rec = new_record();
       block = new_block(dev);
+      attr = new_attr();
       /*
        * Assume that we have already read the volume label.
        * If on second or subsequent volume, adjust buffer pointer 
@@ -220,6 +228,7 @@ Warning, this Volume is a continuation of Volume %s\n",
 static void do_close(JCR *jcr)
 {
    release_device(jcr, dev);
+   free_attr(attr);
    term_dev(dev);
    free_record(rec);
    free_block(block);
@@ -235,37 +244,46 @@ static void do_blocks(char *infname)
       rec = new_record();
    }
    for ( ;; ) {
-      if (!read_block_from_device(dev, block)) {
+      if (!read_block_from_device(jcr, dev, block, NO_BLOCK_NUMBER_CHECK)) {
          Dmsg1(100, "!read_block(): ERR=%s\n", strerror_dev(dev));
         if (dev->state & ST_EOT) {
            if (!mount_next_read_volume(jcr, dev, block)) {
-               printf("End of File on device\n");
+               Jmsg(jcr, M_INFO, 0, _("Got EOM at file %u on device %s, Volume \"%s\"\n"), 
+                 dev->file, dev_name(dev), jcr->VolumeName);
               break;
            }
+           /* Read and discard Volume label */
            DEV_RECORD *record;
            record = new_record();
-           read_block_from_device(dev, block);
+           read_block_from_device(jcr, dev, block, NO_BLOCK_NUMBER_CHECK);
            read_record_from_block(block, record);
            get_session_record(dev, record, &sessrec);
            free_record(record);
-            printf("Volume %s mounted.\n", jcr->VolumeName);
-           continue;
-        }
-        if (dev->state & ST_EOF) {
-            Emsg1(M_INFO, 0, "Got EOF on device %s\n", dev_name(dev));
+            Jmsg(jcr, M_INFO, 0, _("Mounted Volume \"%s\".\n"), jcr->VolumeName);
+           
+        } else if (dev->state & ST_EOF) {
+            Jmsg(jcr, M_INFO, 0, _("Got EOF at file %u on device %s, Volume \"%s\"\n"), 
+              dev->file, dev_name(dev), jcr->VolumeName);
             Dmsg0(20, "read_record got eof. try again\n");
            continue;
-        }
-        if (dev->state & ST_SHORT) {
-           Emsg0(M_INFO, 0, dev->errmsg);
+        } else if (dev->state & ST_SHORT) {
+            Jmsg(jcr, M_INFO, 0, "%s", dev->errmsg);
            continue;
+        } else {
+           /* I/O error */
+           display_tape_error_status(jcr, dev);
+           break;
         }
-        display_error_status(dev);
-        break;
+      }
+      if (!match_bsr_block(bsr, block)) {
+         Dmsg5(100, "reject Blk=%u blen=%u bVer=%d SessId=%u SessTim=%u\n",
+           block->BlockNumber, block->block_len, block->BlockVer,
+           block->VolSessionId, block->VolSessionTime);
+        continue;
       }
       Dmsg5(100, "Blk=%u blen=%u bVer=%d SessId=%u SessTim=%u\n",
-        block->BlockNumber, block->block_len, block->BlockVer,
-        block->VolSessionId, block->VolSessionTime);
+       block->BlockNumber, block->block_len, block->BlockVer,
+       block->VolSessionId, block->VolSessionTime);
       if (verbose == 1) {
         read_record_from_block(block, rec);
          Pmsg7(-1, "Block: %u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n",
@@ -286,12 +304,13 @@ static void do_blocks(char *infname)
 /*
  * We are only looking for labels or in particula Job Session records
  */
-static void jobs_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec)
+static int jobs_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec)
 {
    if (rec->FileIndex < 0) {
       dump_label_record(dev, rec, verbose);
    }
    rec->remainder = 0;
+   return 1;
 }
 
 /* Do list job records */
@@ -314,49 +333,34 @@ static void do_ls(char *infname)
 /*
  * Called here for each record from read_records()
  */
-static void record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec)
+static int record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec)
 {
-   char fname[2000];
-   struct stat statp;
-   int type;
-
    if (rec->FileIndex < 0) {
       get_session_record(dev, rec, &sessrec);
-      return;
+      return 1;
    }
    /* File Attributes stream */
-   if (rec->Stream == STREAM_UNIX_ATTRIBUTES || rec->Stream == STREAM_WIN32_ATTRIBUTES) {
-      char *ap, *fp;
-      uint32_t LinkFI;
-
-      sscanf(rec->data, "%ld %d", &record_file_index, &type);
-      if (record_file_index != rec->FileIndex) {
-         Emsg2(M_ERROR_TERM, 0, "Record header file index %ld not equal record index %ld\n",
-           rec->FileIndex, record_file_index);
+   if (rec->Stream == STREAM_UNIX_ATTRIBUTES || 
+       rec->Stream == STREAM_UNIX_ATTRIBUTES_EX) {
+
+      if (!unpack_attributes_record(jcr, rec->Stream, rec->data, attr)) {
+         Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n"));
       }
-      ap = rec->data;
-
-      while (*ap++ != ' ')         /* skip record file index */
-        ;
-      while (*ap++ != ' ')         /* skip type */
-        ;
-      /* Save filename and position to attributes */
-      fp = fname;
-      while (*ap != 0) {
-        *fp++  = *ap++;
+
+      if (attr->file_index != rec->FileIndex) {
+         Emsg2(M_ERROR_TERM, 0, _("Record header file index %ld not equal record index %ld\n"),
+           rec->FileIndex, attr->file_index);
       }
-      *fp = *ap++;                /* terminate filename & point to attribs */
-
-      decode_stat(ap, &statp, &LinkFI);
-      /* Skip to link name */  
-      while (*ap++ != 0)
-        ;
-      if (file_is_included(&ff, fname) && !file_is_excluded(&ff, fname)) {
-        print_ls_output(fname, ap, type, &statp);
+
+      attr->data_stream = decode_stat(attr->attr, &attr->statp, &attr->LinkFI);
+      build_attr_output_fnames(jcr, attr);
+
+      if (file_is_included(&ff, attr->fname) && !file_is_excluded(&ff, attr->fname)) {
+        print_ls_output(jcr, attr);
         num_files++;
       }
    }
-   return;
+   return 1;
 }
 
 
@@ -365,26 +369,26 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess
    char *rtype;
    memset(sessrec, 0, sizeof(sessrec));
    switch (rec->FileIndex) {
-      case PRE_LABEL:
-         rtype = "Fresh Volume Label";   
-        break;
-      case VOL_LABEL:
-         rtype = "Volume Label";
-        unser_volume_label(dev, rec);
-        break;
-      case SOS_LABEL:
-         rtype = "Begin Session";
-        unser_session_label(sessrec, rec);
-        break;
-      case EOS_LABEL:
-         rtype = "End Session";
-        break;
-      case EOM_LABEL:
-         rtype = "End of Media";
-        break;
-      default:
-         rtype = "Unknown";
-        break;
+   case PRE_LABEL:
+      rtype = "Fresh Volume Label";   
+      break;
+   case VOL_LABEL:
+      rtype = "Volume Label";
+      unser_volume_label(dev, rec);
+      break;
+   case SOS_LABEL:
+      rtype = "Begin Session";
+      unser_session_label(sessrec, rec);
+      break;
+   case EOS_LABEL:
+      rtype = "End Session";
+      break;
+   case EOM_LABEL:
+      rtype = "End of Medium";
+      break;
+   default:
+      rtype = "Unknown";
+      break;
    }
    Dmsg5(10, "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n",
         rtype, rec->VolSessionId, rec->VolSessionTime, rec->Stream, rec->data_len);
@@ -392,9 +396,9 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess
 
 
 /* Dummies to replace askdir.c */
-int    dir_get_volume_info(JCR *jcr, int writing) { return 1;}
+int    dir_get_volume_info(JCR *jcr, enum get_vol_info_rw  writing) { return 1;}
 int    dir_find_next_appendable_volume(JCR *jcr) { return 1;}
-int    dir_update_volume_info(JCR *jcr, VOLUME_CAT_INFO *vol, int relabel) { return 1; }
+int    dir_update_volume_info(JCR *jcr, DEVICE *dev, int relabel) { return 1; }
 int    dir_create_jobmedia_record(JCR *jcr) { return 1; }
 int    dir_ask_sysop_to_mount_next_volume(JCR *jcr, DEVICE *dev) { return 1; }
 int    dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) { return 1;}