X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fbls.c;h=a86c09943cfd20de6a316e65a95185e079b4e831;hb=36b40d5c7f3ff90565ab73ac75f0dc4f6660ff37;hp=dbf0e0ff9dfe3a117e865fccafedc79785f22e29;hpb=4a216e7e8eabbbeddc03f8ddbdb91f0c750497d8;p=bacula%2Fbacula diff --git a/bacula/src/stored/bls.c b/bacula/src/stored/bls.c index dbf0e0ff9d..a86c09943c 100644 --- a/bacula/src/stored/bls.c +++ b/bacula/src/stored/bls.c @@ -1,41 +1,46 @@ /* - * - * Dumb program to do an "ls" of a Bacula 1.0 mortal file. - * - * Version $Id$ - */ -/* - Copyright (C) 2000-2005 Kern Sibbald + Bacula® - The Network Backup Solution - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. + Copyright (C) 2000-2008 Free Software Foundation Europe e.V. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of + 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 two of the GNU 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 General Public - License along with this program; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + You should have received a copy of the GNU 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. +*/ +/* + * + * Dumb program to do an "ls" of a Bacula 1.0 mortal file. + * + * Kern Sibbald, MM + * + * Version $Id$ */ #include "bacula.h" #include "stored.h" #include "findlib/find.h" -#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32) -int win32_client = 1; -#else -int win32_client = 0; -#endif - /* 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); @@ -50,11 +55,11 @@ static bool dump_label = false; static bool list_blocks = false; static bool list_jobs = false; static DEV_RECORD *rec; -static DEV_BLOCK *block; 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; @@ -70,13 +75,14 @@ static BSR *bsr = NULL; static void usage() { - fprintf(stderr, -"Copyright (C) 2000-2005 Kern Sibbald.\n" -"\nVersion: " VERSION " (" BDATE ")\n\n" + fprintf(stderr, _( +PROG_COPYRIGHT +"\nVersion: %s (%s)\n\n" "Usage: bls [options] \n" " -b specify a bootstrap file\n" -" -c specify a config file\n" -" -d specify debug level\n" +" -c specify a Storage configuration file\n" +" -d set debug level to \n" +" -dt print timestamp in debug output\n" " -e exclude list\n" " -i include list\n" " -j list jobs\n" @@ -86,7 +92,7 @@ static void usage() " -p proceed inspite of errors\n" " -v be verbose\n" " -V specify Volume names (separated by |)\n" -" -? print this message\n\n"); +" -? print this message\n\n"), 2000, VERSION, BDATE); exit(1); } @@ -100,10 +106,17 @@ int main (int argc, char *argv[]) char *bsrName = NULL; bool ignore_label_errors = false; + setlocale(LC_ALL, ""); + bindtextdomain("bacula", LOCALEDIR); + textdomain("bacula"); + init_stack_dump(); + working_directory = "/tmp"; my_name_is(argc, argv, "bls"); init_msg(NULL, NULL); /* initialize message handler */ + OSDependentInit(); + ff = init_find_files(); while ((ch = getopt(argc, argv, "b:c:d:e:i:jkLpvV:?")) != -1) { @@ -120,15 +133,21 @@ 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 */ - if ((fd = fopen(optarg, "r")) == NULL) { + if ((fd = fopen(optarg, "rb")) == NULL) { + berrno be; Pmsg2(0, _("Could not open exclude file: %s, ERR=%s\n"), - optarg, strerror(errno)); + optarg, be.bstrerror()); exit(1); } while (fgets(line, sizeof(line), fd) != NULL) { @@ -140,9 +159,10 @@ int main (int argc, char *argv[]) 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)); + if ((fd = fopen(optarg, "rb")) == NULL) { + berrno be; + Pmsg2(0, _("Could not open include file: %s, ERR=%s\n"), + optarg, be.bstrerror()); exit(1); } while (fgets(line, sizeof(line), fd) != NULL) { @@ -196,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, "/"); @@ -217,16 +238,15 @@ int main (int argc, char *argv[]) } dcr = jcr->dcr; rec = new_record(); - block = new_block(dev); - attr = new_attr(); + attr = new_attr(jcr); /* * Assume that we have already read the volume label. * If on second or subsequent volume, adjust buffer pointer */ - if (dev->VolHdr.PrevVolName[0] != 0) { /* second volume */ - Pmsg1(0, "\n" -"Warning, this Volume is a continuation of Volume %s\n", - dev->VolHdr.PrevVolName); + if (dev->VolHdr.PrevVolumeName[0] != 0) { /* second volume */ + Pmsg1(0, _("\n" + "Warning, this Volume is a continuation of Volume %s\n"), + dev->VolHdr.PrevVolumeName); } if (list_blocks) { @@ -252,18 +272,19 @@ static void do_close(JCR *jcr) release_device(jcr->dcr); free_attr(attr); free_record(rec); - free_block(block); free_jcr(jcr); - term_dev(dev); + dev->term(); } /* List just block information */ static void do_blocks(char *infname) { + DEV_BLOCK *block = dcr->block; + char buf1[100], buf2[100]; for ( ;; ) { if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) { - Dmsg1(100, "!read_block(): ERR=%s\n", dev->strerror()); + Dmsg1(100, "!read_block(): ERR=%s\n", dev->bstrerror()); if (dev->at_eot()) { if (!mount_next_read_volume(dcr)) { Jmsg(jcr, M_INFO, 0, _("Got EOM at file %u on device %s, Volume \"%s\"\n"), @@ -274,16 +295,16 @@ static void do_blocks(char *infname) DEV_RECORD *record; record = new_record(); read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK); - read_record_from_block(block, record); + read_record_from_block(dcr, block, record); get_session_record(dev, record, &sessrec); free_record(record); Jmsg(jcr, M_INFO, 0, _("Mounted Volume \"%s\".\n"), dcr->VolumeName); } else if (dev->at_eof()) { - Jmsg(jcr, M_INFO, 0, _("Got EOF at file %u on device %s, Volume \"%s\"\n"), + Jmsg(jcr, M_INFO, 0, _("End of file %u on device %s, Volume \"%s\"\n"), dev->file, dev->print_name(), dcr->VolumeName); Dmsg0(20, "read_record got eof. try again\n"); continue; - } else if (dev->state & ST_SHORT) { + } else if (dev->is_short_block()) { Jmsg(jcr, M_INFO, 0, "%s", dev->errmsg); continue; } else { @@ -302,17 +323,17 @@ static void do_blocks(char *infname) block->BlockNumber, block->block_len, block->BlockVer, block->VolSessionId, block->VolSessionTime); if (verbose == 1) { - read_record_from_block(block, rec); - Pmsg9(-1, "File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n", + read_record_from_block(dcr, block, rec); + Pmsg9(-1, _("File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n"), dev->file, dev->block_num, block->BlockNumber, block->block_len, - FI_to_ascii(rec->FileIndex), rec->VolSessionId, rec->VolSessionTime, - stream_to_ascii(rec->Stream, rec->FileIndex), rec->data_len); + FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, rec->VolSessionTime, + stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len); rec->remainder = 0; } else if (verbose > 1) { dump_block(block, ""); } else { - printf("Block: %d size=%d\n", block->BlockNumber, block->block_len); + printf(_("Block: %d size=%d\n"), block->BlockNumber, block->block_len); } } @@ -379,13 +400,16 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) if (file_is_included(ff, attr->fname) && !file_is_excluded(ff, attr->fname)) { if (verbose) { - Pmsg5(-1, "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n", + Pmsg5(-1, _("FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n"), rec->FileIndex, rec->VolSessionId, rec->VolSessionTime, rec->Stream, rec->data_len); } print_ls_output(jcr, attr); num_files++; } + } else if (rec->Stream == STREAM_PLUGIN_NAME) { + Pmsg1(000, "Plugin name: %s\n", rec->data); } + return true; } @@ -396,50 +420,61 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess memset(sessrec, 0, sizeof(sessrec)); switch (rec->FileIndex) { case PRE_LABEL: - rtype = "Fresh Volume Label"; + rtype = _("Fresh Volume Label"); break; case VOL_LABEL: - rtype = "Volume Label"; + rtype = _("Volume Label"); unser_volume_label(dev, rec); break; case SOS_LABEL: - rtype = "Begin Job Session"; + rtype = _("Begin Job Session"); unser_session_label(sessrec, rec); break; case EOS_LABEL: - rtype = "End Job Session"; + rtype = _("End Job Session"); break; + case 0: case EOM_LABEL: - rtype = "End of Medium"; + rtype = _("End of Medium"); break; default: - rtype = "Unknown"; + 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); if (verbose) { - Pmsg5(-1, "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n", + Pmsg5(-1, _("%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n"), rtype, rec->VolSessionId, rec->VolSessionTime, rec->Stream, rec->data_len); } } /* Dummies to replace askdir.c */ -bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { return 1;} bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} -bool dir_update_volume_info(DCR *dcr, bool relabel) { return 1; } +bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; } bool dir_create_jobmedia_record(DCR *dcr) { 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: ", + fprintf(stderr, _("Mount Volume \"%s\" on device %s and press return when ready: "), dcr->VolumeName, dev->print_name()); + dev->close(); getchar(); return true; } + +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->VolCatInfo.VolCatParts = find_num_dvd_parts(dcr); + Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->VolCatInfo.VolCatName, dcr->VolCatInfo.VolCatParts); + return 1; +}