]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/bls.c
Print length if Hello to short or long
[bacula/bacula] / bacula / src / stored / bls.c
index 61da289ae277a4c388f19494c95842d4529c5b75..e0c8cfa9293798f22370cc0c5af36519abe505ff 100644 (file)
@@ -5,7 +5,7 @@
  *   Version $Id$
  */
 /*
-   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
@@ -36,11 +36,9 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess
 static void record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec);
 
 static DEVICE *dev;
-static int default_tape = FALSE;
 static int dump_label = FALSE;
 static int list_blocks = FALSE;
 static int list_jobs = FALSE;
-static int verbose = 0;
 static DEV_RECORD *rec;
 static DEV_BLOCK *block;
 static JCR *jcr;
@@ -48,6 +46,10 @@ static SESSION_LABEL sessrec;
 static uint32_t num_files = 0;
 static long record_file_index;
 
+#define CONFIG_FILE "bacula-sd.conf"
+char *configfile;
+
+
 static FF_PKT ff;
 
 static BSR *bsr = NULL;
@@ -55,18 +57,18 @@ static BSR *bsr = NULL;
 static void usage()
 {
    fprintf(stderr,
-"\nVersion: " VERSION " (" DATE ")\n\n"
+"\nVersion: " VERSION " (" BDATE ")\n\n"
 "Usage: bls [-d debug_level] <physical-device-name>\n"
 "       -b <file>       specify a bootstrap file\n"
+"       -c <file>       specify a config file\n"
 "       -d <level>      specify debug level\n"
 "       -e <file>       exclude list\n"
 "       -i <file>       include list\n"
 "       -j              list jobs\n"
 "       -k              list blocks\n"
-"       -L              list tape label\n"
 "    (none of above)    list saved files\n"
-"       -t              use default tape device\n"
 "       -v              be verbose\n"
+"       -V              specify Volume names (separated by |)\n"
 "       -?              print this message\n\n");
    exit(1);
 }
@@ -77,18 +79,27 @@ int main (int argc, char *argv[])
    int i, ch;
    FILE *fd;
    char line[1000];
+   char *VolumeName= NULL;
+   char *bsrName = NULL;
 
+   working_directory = "/tmp";
    my_name_is(argc, argv, "bls");
    init_msg(NULL, NULL);             /* initialize message handler */
 
    memset(&ff, 0, sizeof(ff));
    init_include_exclude_files(&ff);
 
-   while ((ch = getopt(argc, argv, "b:d:e:i:jkLtv?")) != -1) {
+   while ((ch = getopt(argc, argv, "b:c:d:e:i:jkLtvV:?")) != -1) {
       switch (ch) {
          case 'b':
-           bsr = parse_bsr(NULL, optarg);
-//         dump_bsr(bsr);
+           bsrName = optarg;
+           break;
+
+         case 'c':                    /* specify config file */
+           if (configfile != NULL) {
+              free(configfile);
+           }
+           configfile = bstrdup(optarg);
            break;
 
          case 'd':                    /* debug level */
@@ -99,7 +110,7 @@ int main (int argc, char *argv[])
 
          case 'e':                    /* exclude list */
             if ((fd = fopen(optarg, "r")) == NULL) {
-               Pmsg2(0, "Could not open exclude file: %s, ERR=%s\n",
+               Pmsg2(0, _("Could not open exclude file: %s, ERR=%s\n"),
                  optarg, strerror(errno));
               exit(1);
            }
@@ -137,14 +148,14 @@ int main (int argc, char *argv[])
            dump_label = TRUE;
            break;
 
-         case 't':
-           default_tape = TRUE;
-           break;
-
          case 'v':
            verbose++;
            break;
 
+         case 'V':                    /* Volume name */
+           VolumeName = optarg;
+           break;
+
          case '?':
         default:
            usage();
@@ -154,24 +165,27 @@ int main (int argc, char *argv[])
    argc -= optind;
    argv += optind;
 
-   if (!argc && !default_tape) {
-      Pmsg0(0, "No archive name specified\n");
+   if (!argc) {
+      Pmsg0(0, _("No archive name specified\n"));
       usage();
    }
 
-   if (ff.included_files_list == NULL) {
-      add_fname_to_include_list(&ff, 0, "/");
+   if (configfile == NULL) {
+      configfile = bstrdup(CONFIG_FILE);
    }
 
-   /* Try default device */
-   if (default_tape) {
-      do_ls(DEFAULT_TAPE_DRIVE);
-      return 0;
+   parse_config(configfile);
+
+   if (ff.included_files_list == NULL) {
+      add_fname_to_include_list(&ff, 0, "/");
    }
 
    for (i=0; i < argc; i++) {
-      jcr = setup_jcr("bls", argv[i], bsr);
-      dev = setup_to_read_device(jcr);
+      if (bsrName) {
+        bsr = parse_bsr(NULL, bsrName);
+      }
+      jcr = setup_jcr("bls", argv[i], bsr, VolumeName);
+      dev = setup_to_access_device(jcr, 1);   /* acquire for read */
       if (!dev) {
         exit(1);
       }
@@ -216,10 +230,8 @@ static void do_close(JCR *jcr)
 /* List just block information */
 static void do_blocks(char *infname)
 {
-
-   dump_volume_label(dev);
-
    if (verbose) {
+      dump_volume_label(dev);
       rec = new_record();
    }
    for ( ;; ) {
@@ -251,15 +263,15 @@ static void do_blocks(char *infname)
         display_error_status(dev);
         break;
       }
-      Dmsg5(100, "Blk=%u blen=%u bVer=%d SessId=%d SessTim=%d\n",
+      Dmsg5(100, "Blk=%u blen=%u bVer=%d SessId=%u SessTim=%u\n",
         block->BlockNumber, block->block_len, block->BlockVer,
         block->VolSessionId, block->VolSessionTime);
       if (verbose == 1) {
         read_record_from_block(block, rec);
-         Pmsg6(-1, "Block: %u blen=%u First rec FI=%s SessId=%d Strm=%s rlen=%d\n",
+         Pmsg7(-1, "Block: %u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n",
              block->BlockNumber, block->block_len,
-             FI_to_ascii(rec->FileIndex), rec->VolSessionId, 
-             stream_to_ascii(rec->Stream), rec->data_len);
+             FI_to_ascii(rec->FileIndex), rec->VolSessionId, rec->VolSessionTime,
+             stream_to_ascii(rec->Stream, rec->FileIndex), rec->data_len);
         rec->remainder = 0;
       } else if (verbose > 1) {
          dump_block(block, "");
@@ -295,8 +307,8 @@ static void do_ls(char *infname)
       dump_volume_label(dev);
       return;
    }
-
    read_records(jcr, dev, record_cb, mount_next_read_volume);
+   printf("%u files found.\n", num_files);
 }
 
 /*
@@ -313,8 +325,10 @@ static void record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec)
       return;
    }
    /* File Attributes stream */
-   if (rec->Stream == STREAM_UNIX_ATTRIBUTES) {
+   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",
@@ -333,7 +347,7 @@ static void record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec)
       }
       *fp = *ap++;                /* terminate filename & point to attribs */
 
-      decode_stat(ap, &statp);
+      decode_stat(ap, &statp, &LinkFI);
       /* Skip to link name */  
       while (*ap++ != 0)
         ;
@@ -342,9 +356,6 @@ static void record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec)
         num_files++;
       }
    }
-   if (verbose) {
-      printf("%u files found.\n", num_files);
-   }
    return;
 }
 
@@ -392,7 +403,7 @@ int dir_send_job_status(JCR *jcr) {return 1;}
 
 int dir_ask_sysop_to_mount_volume(JCR *jcr, DEVICE *dev)
 {
-   fprintf(stderr, "Mount Volume %s on device %s and press return when ready: ",
+   fprintf(stderr, "Mount Volume \"%s\" on device %s and press return when ready: ",
       jcr->VolumeName, dev_name(dev));
    getchar();  
    return 1;