]> git.sur5r.net Git - bacula/bacula/commitdiff
This commit was manufactured by cvs2svn to create tag Release-1.38.9
author(no author) <(no author)@91ce42f0-d328-0410-95d8-f526ca767f89>
Sat, 6 May 2006 22:59:12 +0000 (22:59 +0000)
committer(no author) <(no author)@91ce42f0-d328-0410-95d8-f526ca767f89>
Sat, 6 May 2006 22:59:12 +0000 (22:59 +0000)
'Release-1.38.9'.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/tags/Release-1.38.9@3012 91ce42f0-d328-0410-95d8-f526ca767f89

359 files changed:
bacula/ChangeLog
bacula/LICENSE
bacula/Makefile.in
bacula/ReleaseNotes
bacula/autoconf/bacula-macros/db.m4
bacula/autoconf/config.h.in
bacula/autoconf/configure.in
bacula/configure
bacula/examples/python/DirStartUp.py
bacula/examples/python/FDStartUp.py
bacula/examples/python/SDStartUp.py
bacula/examples/recover.pl [new file with mode: 0755]
bacula/kernstodo
bacula/kes-1.38
bacula/kes-1.39 [deleted file]
bacula/nb-1.37 [new file with mode: 0644]
bacula/nb-1.38 [deleted file]
bacula/patches/1.38.6-script.patch [new file with mode: 0644]
bacula/patches/1.38.7-mysql.patch [new file with mode: 0644]
bacula/platforms/mandrake/bacula.spec.in
bacula/platforms/redhat/bacula.spec.in
bacula/platforms/suse/bacula.spec.in
bacula/po/LINGUAS
bacula/po/POTFILES.in
bacula/po/bacula.pot
bacula/po/de.gmo
bacula/po/de.po
bacula/po/es.gmo [new file with mode: 0644]
bacula/po/es.po [new file with mode: 0644]
bacula/po/es_AR.po [new file with mode: 0644]
bacula/po/fr.gmo
bacula/po/fr.po
bacula/po/it.gmo
bacula/po/it.po
bacula/scripts/.cvsignore
bacula/scripts/Makefile.in
bacula/scripts/bacula-ctl-dir.in [new file with mode: 0644]
bacula/scripts/bacula-ctl-fd.in [new file with mode: 0644]
bacula/scripts/bacula-ctl-sd.in [new file with mode: 0644]
bacula/scripts/bacula.in
bacula/scripts/mtx-changer.in
bacula/src/baconfig.h
bacula/src/bacula.h
bacula/src/cats/bdb_update.c
bacula/src/cats/cats.h
bacula/src/cats/create_postgresql_database.in
bacula/src/cats/make_mysql_tables.in
bacula/src/cats/make_postgresql_tables.in
bacula/src/cats/make_sqlite3_tables.in
bacula/src/cats/make_sqlite_tables.in
bacula/src/cats/mysql.c
bacula/src/cats/postgresql.c
bacula/src/cats/protos.h
bacula/src/cats/sql_create.c
bacula/src/cats/sql_find.c
bacula/src/cats/sql_get.c
bacula/src/cats/sql_list.c
bacula/src/cats/sql_update.c
bacula/src/cats/update_mysql_tables.in
bacula/src/cats/update_postgresql_tables.in
bacula/src/cats/update_sqlite3_tables.in
bacula/src/cats/update_sqlite_tables.in
bacula/src/cl
bacula/src/console/Makefile.in
bacula/src/console/conio.c
bacula/src/console/console.c
bacula/src/console/console_conf.c
bacula/src/console2.glade
bacula/src/dird/autoprune.c
bacula/src/dird/backup.c
bacula/src/dird/bsr.c
bacula/src/dird/catreq.c
bacula/src/dird/dird.c
bacula/src/dird/dird_conf.c
bacula/src/dird/dird_conf.h
bacula/src/dird/fd_cmds.c
bacula/src/dird/getmsg.c
bacula/src/dird/inc_conf.c
bacula/src/dird/job.c
bacula/src/dird/jobq.c
bacula/src/dird/mac.c
bacula/src/dird/msgchan.c
bacula/src/dird/newvol.c
bacula/src/dird/next_vol.c
bacula/src/dird/protos.h
bacula/src/dird/pythondir.c
bacula/src/dird/restore.c
bacula/src/dird/sql_cmds.c
bacula/src/dird/ua_cmds.c
bacula/src/dird/ua_dotcmds.c
bacula/src/dird/ua_label.c
bacula/src/dird/ua_output.c
bacula/src/dird/ua_prune.c
bacula/src/dird/ua_purge.c
bacula/src/dird/ua_restore.c
bacula/src/dird/ua_run.c
bacula/src/dird/ua_select.c
bacula/src/dird/ua_status.c
bacula/src/dird/ua_tree.c
bacula/src/dird/ua_update.c
bacula/src/dird/verify.c
bacula/src/filed/Makefile.in
bacula/src/filed/backup.c
bacula/src/filed/bacula-fd.conf.in
bacula/src/filed/chksum.c [new file with mode: 0644]
bacula/src/filed/chksum.h [new file with mode: 0644]
bacula/src/filed/filed.c
bacula/src/filed/filed.h
bacula/src/filed/filed_conf.c
bacula/src/filed/filed_conf.h
bacula/src/filed/job.c
bacula/src/filed/protos.h
bacula/src/filed/pythonfd.c
bacula/src/filed/restore.c
bacula/src/filed/status.c
bacula/src/filed/verify.c
bacula/src/filed/verify_vol.c
bacula/src/filed/win32/winres.rc
bacula/src/findlib/attribs.c
bacula/src/findlib/bfile.c
bacula/src/findlib/bfile.h
bacula/src/findlib/create_file.c
bacula/src/findlib/find.c
bacula/src/findlib/find.h
bacula/src/gnome2-console/.cvsignore
bacula/src/gnome2-console/Makefile.in
bacula/src/gnome2-console/callbacks.c
bacula/src/gnome2-console/callbacks.h
bacula/src/gnome2-console/console.c
bacula/src/gnome2-console/console_conf.c
bacula/src/gnome2-console/interface.c
bacula/src/gnome2-console/support.c
bacula/src/gnome2-console/support.h
bacula/src/gnome2-console/test-gnome-console.conf
bacula/src/jcr.h
bacula/src/lib/Makefile.in
bacula/src/lib/alist.h
bacula/src/lib/attr.c
bacula/src/lib/base64.c
bacula/src/lib/bnet_pkt.c [new file with mode: 0644]
bacula/src/lib/bpipe.c
bacula/src/lib/bregex.c [new file with mode: 0644]
bacula/src/lib/bregex.h
bacula/src/lib/bsnprintf.c [deleted file]
bacula/src/lib/btree.c [deleted file]
bacula/src/lib/btree.h [deleted file]
bacula/src/lib/crypto.c [deleted file]
bacula/src/lib/crypto.h
bacula/src/lib/dlist.h
bacula/src/lib/edit.c
bacula/src/lib/jcr.c
bacula/src/lib/lib.h
bacula/src/lib/openssl.c [deleted file]
bacula/src/lib/openssl.h [deleted file]
bacula/src/lib/parse_conf.c
bacula/src/lib/parse_conf.h
bacula/src/lib/protos.h
bacula/src/lib/pythonlib.c
bacula/src/lib/regex.c [deleted file]
bacula/src/lib/rwlock.c
bacula/src/lib/rwlock.h
bacula/src/lib/scan.c
bacula/src/lib/smartall.c
bacula/src/lib/tls.c
bacula/src/lib/tls.h
bacula/src/lib/util.c
bacula/src/stored/Makefile.in
bacula/src/stored/acquire.c
bacula/src/stored/append.c
bacula/src/stored/askdir.c
bacula/src/stored/autochanger.c
bacula/src/stored/bcopy.c
bacula/src/stored/bextract.c
bacula/src/stored/block.c
bacula/src/stored/bls.c
bacula/src/stored/bscan.c
bacula/src/stored/btape.c
bacula/src/stored/butil.c
bacula/src/stored/dev.c
bacula/src/stored/dev.h
bacula/src/stored/device.c
bacula/src/stored/dircmd.c
bacula/src/stored/dvd.c
bacula/src/stored/fd_cmds.c
bacula/src/stored/job.c
bacula/src/stored/label.c
bacula/src/stored/mac.c [deleted file]
bacula/src/stored/mount.c
bacula/src/stored/protos.h
bacula/src/stored/pythonsd.c
bacula/src/stored/read.c
bacula/src/stored/read_record.c
bacula/src/stored/record.c
bacula/src/stored/reserve.c
bacula/src/stored/scan.c [deleted file]
bacula/src/stored/spool.c
bacula/src/stored/status.c
bacula/src/stored/stored.c
bacula/src/stored/stored_conf.c
bacula/src/stored/stored_conf.h
bacula/src/stored/wait.c
bacula/src/tools/.cvsignore
bacula/src/tools/Makefile.in
bacula/src/tools/bregex.c [new file with mode: 0644]
bacula/src/tools/bsmtp.c
bacula/src/tools/bwild.c [new file with mode: 0644]
bacula/src/tray-monitor/tray_conf.c
bacula/src/version.h
bacula/src/win32/License.txt [deleted file]
bacula/src/win32/baculafd/baculafd.mak
bacula/src/win32/baculafd/baculanovssfd.mak
bacula/src/win32/compat/vss_generic.cpp
bacula/src/win32/console/console.mak
bacula/src/win32/filed/chksum.cpp [new file with mode: 0644]
bacula/src/win32/lib/bregex.cpp [new file with mode: 0644]
bacula/src/win32/lib/crypto.cpp [deleted file]
bacula/src/win32/lib/regex.cpp [deleted file]
bacula/src/win32/pebuilder/Makefile.in
bacula/src/win32/winbacula.nsi.in
bacula/src/win32/wx-console/filelist
bacula/src/win32/wx-console/wx-console.mak
bacula/src/wx-console/Makefile.in
bacula/src/wx-console/console_conf.c
bacula/src/wx-console/console_thread.h
gui/autoconf/configure.in
gui/bacula-gui.spec.in [new file with mode: 0644]
gui/bimagemgr/README
gui/bimagemgr/bacula-bimagemgr.spec.in [deleted file]
gui/configure
regress/.cvsignore [deleted file]
regress/Makefile.in [deleted file]
regress/README [deleted file]
regress/all-non-root-2tape-tests [deleted file]
regress/all-non-root-tape-tests [deleted file]
regress/all-non-root-tests [deleted file]
regress/all-root-tests [deleted file]
regress/all-tape-and-file-tests [deleted file]
regress/all-tests [deleted file]
regress/config [deleted file]
regress/do_all [deleted file]
regress/do_all_tapes [deleted file]
regress/do_file [deleted file]
regress/endtime [deleted file]
regress/file [deleted file]
regress/freebsd.conf [deleted file]
regress/kern.conf [deleted file]
regress/misc-tests [deleted file]
regress/prototype.conf [deleted file]
regress/run [deleted file]
regress/scripts/.cvsignore [deleted file]
regress/scripts/bacula-dir-tape.conf.in [deleted file]
regress/scripts/bacula-dir-win32-tape.conf.in [deleted file]
regress/scripts/bacula-sd-2disk-drive.conf [deleted file]
regress/scripts/bacula-sd-2disk-drive.conf.in [deleted file]
regress/scripts/bacula-sd-2disk.conf [deleted file]
regress/scripts/bacula-sd-2disk.conf.in [deleted file]
regress/scripts/bacula-sd-2drive.conf.in [deleted file]
regress/scripts/bacula-sd-2tape.conf.in [deleted file]
regress/scripts/bacula-sd-tape.conf.in [deleted file]
regress/scripts/bacula-sd.conf.in [deleted file]
regress/scripts/check_for_zombie_jobs [deleted file]
regress/scripts/cleanup [deleted file]
regress/scripts/cleanup-2drive.in [deleted file]
regress/scripts/cleanup-2tape.in [deleted file]
regress/scripts/cleanup-tape.in [deleted file]
regress/scripts/copy-2disk-confs [deleted file]
regress/scripts/copy-2disk-drive-confs [deleted file]
regress/scripts/copy-2drive-confs [deleted file]
regress/scripts/copy-2tape-confs [deleted file]
regress/scripts/copy-confs [deleted file]
regress/scripts/copy-crypto-confs [deleted file]
regress/scripts/copy-tape-confs [deleted file]
regress/scripts/copy-test-confs [deleted file]
regress/scripts/copy-testa-confs [deleted file]
regress/scripts/copy-win32-confs [deleted file]
regress/scripts/crypto-bacula-fd.conf.in [deleted file]
regress/scripts/cryptokeypair.pem [deleted file]
regress/scripts/do_sed [deleted file]
regress/scripts/exclude-dev-test [deleted file]
regress/scripts/exclude-etc-test [deleted file]
regress/scripts/exclude-lib-test [deleted file]
regress/scripts/flist [deleted file]
regress/scripts/freebsd_tape_options [deleted file]
regress/scripts/linux_osst_tape_options [deleted file]
regress/scripts/linux_tape_options [deleted file]
regress/scripts/new-test-bacula-dir.conf.in [deleted file]
regress/scripts/prepare-two-disks [deleted file]
regress/scripts/prepare-two-tapes.in [deleted file]
regress/scripts/regress-config [deleted file]
regress/scripts/setup [deleted file]
regress/scripts/test-bacula-dir.conf.in [deleted file]
regress/scripts/test-bacula-fd.conf.in [deleted file]
regress/scripts/test-bacula-sd.conf.in [deleted file]
regress/scripts/test-console.conf.in [deleted file]
regress/scripts/testa-bacula-dir.conf.in [deleted file]
regress/scripts/win32-bacula-dir-tape.conf.in [deleted file]
regress/scripts/win32-bacula-fd.conf [deleted file]
regress/scripts/win32-bacula-sd-tape.conf [deleted file]
regress/starttime [deleted file]
regress/tape [deleted file]
regress/tests/.cvsignore [deleted file]
regress/tests/2drive-incremental-2disk [deleted file]
regress/tests/2drive-incremental-2tape [deleted file]
regress/tests/auto-label-test [deleted file]
regress/tests/backup-bacula-tape [deleted file]
regress/tests/backup-bacula-test [deleted file]
regress/tests/backup-win32-tape [deleted file]
regress/tests/bextract-test [deleted file]
regress/tests/bscan-tape [deleted file]
regress/tests/bscan-test [deleted file]
regress/tests/bsr-opt-test [deleted file]
regress/tests/btape-fill-full-tape [deleted file]
regress/tests/btape-fill-tape [deleted file]
regress/tests/compressed-test [deleted file]
regress/tests/concurrent-jobs-test [deleted file]
regress/tests/dev-test-root [deleted file]
regress/tests/differential-test [deleted file]
regress/tests/eot-fail-tape [deleted file]
regress/tests/etc-test-root [deleted file]
regress/tests/filed-crypto-test [deleted file]
regress/tests/fixed-block-size-tape [deleted file]
regress/tests/four-concurrent-jobs-tape [deleted file]
regress/tests/four-concurrent-jobs-test [deleted file]
regress/tests/four-jobs-tape [deleted file]
regress/tests/four-jobs-test [deleted file]
regress/tests/incremental-2disk [deleted file]
regress/tests/incremental-2tape [deleted file]
regress/tests/incremental-tape [deleted file]
regress/tests/incremental-test [deleted file]
regress/tests/lib-tape-root [deleted file]
regress/tests/lib-test-root [deleted file]
regress/tests/query-test [deleted file]
regress/tests/recycle-test [deleted file]
regress/tests/relabel-tape [deleted file]
regress/tests/restore-by-file-tape [deleted file]
regress/tests/restore-by-file-test [deleted file]
regress/tests/restore-disk-seek-test [deleted file]
regress/tests/restore2-by-file-test [deleted file]
regress/tests/scratch-pool-test [deleted file]
regress/tests/six-vol-test [deleted file]
regress/tests/small-file-size-tape [deleted file]
regress/tests/span-vol-test [deleted file]
regress/tests/sparse-compressed-test [deleted file]
regress/tests/sparse-test [deleted file]
regress/tests/test0 [deleted file]
regress/tests/truncate-bug-tape [deleted file]
regress/tests/two-jobs-test [deleted file]
regress/tests/two-pool-tape [deleted file]
regress/tests/two-pool-test [deleted file]
regress/tests/two-vol-test [deleted file]
regress/tests/two-volume-tape [deleted file]
regress/tests/two-volume-test [deleted file]
regress/tests/usr-tape-root [deleted file]
regress/tests/verify-vol-test [deleted file]
regress/tests/weird-files-test [deleted file]
regress/tests/weird-files2-test [deleted file]
regress/tests/win32-backup-tape [deleted file]
regress/tests/win32-to-linux-tape [deleted file]
regress/weird-files.tar.gz [deleted file]

index 5825c672d311df487e3311a646a10b8b1f899303..fa110a38bb29cf4437de5b410f3caa1e55b48196 100644 (file)
@@ -1,5 +1,256 @@
 
-Release 1.38.4 16Jan06 released 17 Jan 06:
+Release 1.38.8 (02May06)
+02May06
+- Added code to strip backslashes from Windows filenames during
+  a restore.
+- Corrected Win32 License to use the correct LICENSE file.
+- Corrected the buffer count and bytes reported in the heap 
+  statistics.
+26Apr06
+- Implement an NT_() macro to indicate that text should NOT
+  be translated.
+- Fix a number of incorrect strings marked for translation, when
+  they should not be (e.g. commands).
+- Fix StartTime bug reported for ClientRunBeforeJob and RunBeforeJob
+  Patches supplied by user in bugs #608 and #599.
+- Use most recent of st_ctime and st_mtime in restore tree DIR
+  listing. This fixes some problems with Win32 printing incorrect
+  values.
+- Correct the clock shift comm time calculation between the DIR
+  and the FD. It was added rather than subtracted.
+- Strip all backslashes in filenames to be restored on Win32
+  machines -- the names should all be in Unix format, and if
+  there are any backslashes it is most likely due to an improper
+  FileSet definition, and the files will not otherwise be 
+  restorable.
+- Remove lib/regex.c (replaced by bregex.c).
+- Delete src/win32/License.txt
+- Modify installer to install LICENSE
+25Apr06
+- Add back ua_label barcode fix from Rufolf Cejka.
+23Apr06
+- Add 'Dir Status' button to the gnome console.
+- Display heap stats in Storage daemon without debug level.
+22Apr06
+- Integrate most of the MinGW changes -- more to do.
+21Apr06
+- Implement using pg_config for finding PostgreSQL files.
+  Fixes bug #600. Patch supplied by user.
+- Remove -t option from mktemp in mtx_changer.in and use
+  working directory. Fixes bug #578.
+- Update job start time after the any run before job so that
+  files created by the script are only backed up once. Fixes
+  bug #599.
+- Strip trailing newline only from filenames entered in
+  the restore command when reading a file. This permits
+  the user to enter filenames with trailing spaces. Fixes
+  bug #549. The user supplied a patch that I modified slightly.
+- Use the most recent time (st_mtime, st_ctime) in the dir
+  command in restore. This gives the user a better idea of what
+  the newest file really is. This fixes bug #574. The fix
+  was suggested by the user.
+18Apr06
+- Remove the -f option from the chown in Makefile.in for more
+  portability.
+- Change setting the group in Makefile.in to use chgrp for
+  more portability.
+- Implement a Bacula read/write lock for Python rather
+  than using the Python lock to avoid recursive problems.
+- Correct the uninstall directory names in filed/Makefile.in
+  as reported by a user.
+
+Release 1.38.8 (14Apr06)               
+14Apr06
+- Correct Makefile for Solaris /bin/sh
+- Correct mtx-changer.in for Solaris /bin/sh
+- Abort if a conf resource does not have a Name =
+12Apr06
+- Change the name of the regex program to bregex.
+- Add the bwild program to the tools directory. It is similar
+  to the bregex program.
+- Implement create bregex.h and bregex.c in src/lib from the
+  Python regexp program.  
+- Use the new bregex.c to implement Regex expressions on Win32.
+11Apr06
+- Modify Makefile to change the permissions on Working Directory
+  to 770 if the directory is created.
+- Do not fail the Makefile if changing the permissions or 
+  owner/group on WorkingDir fails.
+- Correct the old recycling algorithm so that Scratch Volumes
+  are selected when looking for a Volume in the changer.
+- Correct a typo in the Verify SQL reported by Joe Park.
+10Apr06
+- Remove automatic case folding on Windows FDs. You must
+  explictly use the 'Ignore Case = yes' option.
+- Remove the code added to 1.38.6 and 1.38.7 that pulls a
+  scratch volume in an Autochanger early in the 'recycling'
+  algorithm.  
+08Apr06
+- Tweak license to include Microsoft restrictions.
+- Move mysql.reconnect to after real_connect().  Thanks to
+  Frank Sweetser for the patch.
+- Disallow a backslash in a File = directive (Windows junk)
+  unless the string is quoted.
+- Apply Eric's patch to ua_label.c so that daemon protocol
+  is not translated.
+
+Release 1.38.7 (06Apr06) released 07Apr06 
+- Remove timed wait for VSS on Win2K3 as it is not yet
+  implemented.
+- Correct bacula.in script to reference bacula-ctl-xx in the
+  sysconfig directory rather than the bin directory.
+
+Release 1.38.6 (28Mar06) released 29Mar06
+28Mar06
+- Back port from 1.39 fixes to lib/jcr.c to use foreach_jcr() 
+  and new jcr chain locking.
+26Mar06
+- Fix a long standing bug in the bacula start/stop scripts.
+- Attempt to add the new bacula-ctl-* files to the rpm.
+- Switch to using typeof() for list traversing to avoid
+  as many FC5 g++ compiler warnings as possible.
+25Mar06
+- Split the bacula start/start script into four files:
+   bacula         -- starts and stops calling other scripts
+   bacula-ctl-dir -- starts/stops the director
+   bacula-ctl-fd  -- starts/stops the File daemon
+   bacula-ctl-sd  -- starts/stops the Storage daemon
+24Mar06
+- Create datestyle fix for PostgreSQL. Fixes bug #574.
+- Correct editing of JobId from int to int64 in fd_cmds.c
+- Eliminate FileSet name race with bash_spaces() and multiple
+  threads by bashing in a local.
+- Fix error return from 'use storage' to print a correct error
+  message rather than nothing.
+- Correct false re-read last block error message when two jobs 
+  are simultaneously writing at the end of a tape.
+- Simplify exit conditions in the reserve.c code to avoid  
+  possible non-release of reservation_lock().
+- Suffle lock order in reserve to avoid deadlock between
+  reservation lock and device mutex.
+- Add Thorsten's VSS timeout code to 1.38 branch.
+21Mar06
+- Initialize jcr mutex before first use. Thanks to Thorsten for
+  tracking this down for me !!!! as it broke the Win32 build.
+20Mar06
+- Integrate addition of line count limitation to bsmtp -l from
+  Sebastian Stark <stark at tuebingen.mpg.de>
+17Mar06
+- Implement regex test program in tools directory.
+- Attempt to fix time problem with bsmtp with foreign langs.
+- Add strip_trailing_newline() submitted by user.
+
+Release 1.38.6 beta6
+16Mar06
+- Fix bug #537 to allow arbitrary time to mount a volume for
+  restore, if polling is turned on.     
+- Disallow multiple storage specifications for a job. Should fix Arno's
+  problem.
+- Add back a missing store of poolid in jr.poolid.    
+- If dir_user or dir-group is specified in ./configure apply it to
+  the working-dir. Fixes bug #533.
+- If rescheduling a job cancel the previous incarnation with the SD.
+  Fixes bugs #566 and 557.
+- Fix bug #567 do_message() definition type conflict.
+
+Release 1.38.6 beta5
+14Mar06
+- Add more jcr methods and make mutex and use_count private.
+- Create lock/unlock methods for jcr.
+- Fix PostgreSQL bug doing sql_data_seeek() by explicitly reading
+  records to get to seek position.
+- Integrate patch from bug #561 to correct conio.c signal definitions.
+- Fix Rescheduling failed Jobs. Ensure that SD message thread 
+  terminates correctly by doing pthread_kill(). Do not destroy
+  SD cond wait variable between executions of the job. Use local
+  mutex for cond variable to avoid blocking jcr chain. Fix poor 
+  use of jcr use count in jobq.c for restarted jobs.
+- Fix obsolete usage of foreach_dlist() to use foreach_jcr() in
+  lib/jcr.c -- prevents locking the jcr chaing.
+- Apply patch from bug #564, which corrects listing volumes with
+  multiple autochangers. Apply same fix to next volume list.
+- Fix bug #562 where restore bootstrap file is not unique.
+- Use new routine lock_reservations() to lock the reservations
+  system, and call it while looking for a volume in askdir.c.
+  This could possibly fix bug #543.
+- Stop SD command loop if job is canceled.
+
+Beta4 attached to a bug report but not distributed.
+04Mar06
+- Fix new sql_use_result() code to properly release the
+  buffers in all cases.
+- Convert to using new Python class definitons with (object).
+- Use the keyword ujobid to mean the unique job id; job or jobname
+  to mean the Job name given on the Name directive, and jobid to
+  be the numeric (non-unique) job id.
+- Allow listing by any of the above.
+- Add the user friendly job report code for reporting job elapsed time
+  and rates with suffexes.
+- Add Priority and JobLevel as Python settable items.
+- Use TEMPORARY table creation where the table is created by
+  Bacula.
+- Add new code submitted by Eric for waiting on specific jobid.
+- Add ACL checking for the dot commands.
+- Fix restore of writable FIFOs.
+- Fix a bug in bpipe where the string was freed too early.
+
+26Feb06
+- Fix bug reported by Arno listing blocks with bls
+- Update the po files at Eric's request.
+
+Release 1.38.6-beta2 25Feb06
+25Feb06
+- Add sql_use_result() define.
+
+Release 1.38.6 beta1 24Feb06
+24Feb06
+- Don't open default catalog if not in ACL.
+22Feb06
+- Add virtual disk autochanger code.
+- Add user supplied bug fix to make two autochangers work
+  correctly using StorageId with InChanger checks.
+- Correct new/old_jcr confusion in copy_storage().
+- Remove & from Job during scan in msgchan.c -- probably
+  trashed the stack.
+- When getting the next Volume if no Volume in Append mode   
+  exists and we are dealing with an Autochanger, search
+  for a Scratch Volume.  
+- Check for missing value in dot commands -- bug fix.
+- Fix bug in update barcodes command line scanning.
+- Make sure Pool Max Vols is respected.
+- Check that user supplied a value before referencing
+  it in restore -- pointed out by Karl Hakimian. 
+- Add Karl Hakimian's table insert code.
+- Don't ask user to select a specific Volume when
+  updating all volumes in a Pool.
+- Remove reservation if set for read when removing dcr.
+- Lock code that requests next appendable volume so that
+  two jobs to get the same Volume at the same time.
+- Add new Device Type = xxx code. Values are file, tape,
+  dvd, and fifo.
+- Preserve certain modes (ST_LABEL|ST_APPEND|ST_READ) across
+  a re-open to change read/write permission on a device.
+- Correct a misplaced double quote in certain autochanger  
+  scripts.
+- Make make_catalog_backup.in a bit more portable.
+- Implement Karl Hakimian's sql_use_result(), which speeds
+  up restore tree building and reduces the memory load.
+- Correct a number of minor bugs in getting a Volume from  
+  the Scratch Pool.
+- Implement additional command line options for update Volume.
+- Don't require user to enter a Volume name when updating
+  all Volumes in a pool.
+
+Release 1.38.5 released 19Jan06:
+19Jan06
+- Apply label barcodes fix supplied by Rudolf Cejka.
+18Jan06
+- Modify standard rpm installation to set SD group to disk
+  so that SD will by default have access to tape drives.
+- Allow users to specify user/group and start options
+  for each daemon in /etc/sysconf/bacula file.
+
+Release 1.38.4 14Jan06 released 17 Jan 06:
 16Jan06
 - Add two new queries to query.sql provided by Arno. One
   list volumes known to the Storage device, and the other
@@ -71,7 +322,7 @@ Beta release 23Dec05:
   volume so that it can handle multiple returns from the wait
   code.
 - Modify the wait code to permit multiple returns.
-- Return a zero when "autochanger drives" is called and
+- Return a zero when 'autochanger drives' is called and
   it is not an autochanger.
 - Make rewind_dev() a method taking a DCR as an argument.
   This permits closing and reopening the drive if the
@@ -183,9 +434,9 @@ Beta release 20Dec05:
 04Dec05
 - Apply days keyword patch from Alexander.Bergolth at wu-wien.ac.at 
   If this patch is applied, the number of days can be specified with
-  "list nextvol days=xx"
+  'list nextvol days=xx'
   or
-  "status dir days=xx"
+  'status dir days=xx'
   My use case is to be able to preview the next scheduled job (and the 
   next tape to be used) on fridays if there are no scheduled jobs during 
   the weekend.
@@ -237,7 +488,7 @@ Changes to 1.38.1: 15 November 2005
   the user.
 - Add Solaris ACL detection in configure.in as supplied by
   Attila Fulop. 
-- Implement "autochanger drives" protocol so that Dir knows
+- Implement 'autochanger drives' protocol so that Dir knows
   how many drives an autochanger has.
 - Do not request drive number in label, ... if only one drive.
 - Turn off debug code.
@@ -411,7 +662,7 @@ Changes to 1.37.39:
 - Make new_volume walk through all Vols looking for dev 
   to release.
 16Sep05
-- Make "quit" command in console always allowed.
+- Make 'quit' command in console always allowed.
 - Remove the storage list between each console command to
   keep Dir from remembering a previously selected SD.
 - Add code to reservation VOLRES subroutines to try to ensure
@@ -422,7 +673,7 @@ Changes to 1.37.39:
 - Apply Nicolas' dvd-freespace.in patch.
 - Make sure SQL table names are not translated.
 - Eliminate incorrect message saying barcodes not
-  found in "label barcodes" -- fixes bug report.
+  found in 'label barcodes' -- fixes bug report.
 
 Changes to 1.37.38:
 07Sep05
@@ -447,7 +698,7 @@ Changes to 1.37.37:
 - Correct ssize_t problem in build of Win32
 - Add code to llprint pools and volumes to debug next item.
 - From bug report, fix resetting Pool defaults in Volume. It
-  was a typo "Max" was missing in several places.
+  was a typo 'Max' was missing in several places.
 - Don't allow translation of database Volume Status values.
 
 Changes to 1.37.37 released 26 Aug 05
@@ -484,7 +735,7 @@ Changes to 1.37.36 released 22 Aug 05
   other searches.
 - Fix picking up drive in Dir so that it is not done in
   the status command.
-- Eliminate double check on "loaded" for autochanger.
+- Eliminate double check on 'loaded' for autochanger.
 17Aug05
 - Start coding better reservation algorithm
 - Always look for slot for label command.
@@ -543,7 +794,7 @@ Changes to 1.37.34:
   search to avoid two threads competing for the same
   resource.
 - Correct a return code in find_suitable_device_for_job()
-  Possibly cause of "busy writing to another volume".
+  Possibly cause of 'busy writing to another volume'.
 03Aug05
 - Modify open() for tape so nonblocking really works.  
 - Use fcntl() to reset blocking status rather than close()
@@ -672,7 +923,7 @@ Changes to 1.37.31:
    been adapted.
  - Remove set_exit_on_error function
 07Apr05
- - Fix "unknown device type" problem with DVD devices.
+ - Fix 'unknown device type' problem with DVD devices.
  - Fix crash when there is no media in the DVD drive.
 09Jan05
  - Update the documentation and ReleaseNotes.
@@ -705,12 +956,12 @@ Changes to 1.37.31:
 29Dec04
  - Add VolParts field in Media table
  - Add MaximumPartSize directive in Device (SD configuration file)
- - File Volumes can now be splitted in multiple files ("parts")
- - Fix SQL error in sql_list while doing "llist jobmedia"
+ - File Volumes can now be splitted in multiple files ('parts')
+ - Fix SQL error in sql_list while doing 'llist jobmedia'
 
 Changes to 1.37.30 released 16 July 2005:
 14Jul05
-- Fix "dir" command scanning field misalignment in
+- Fix 'dir' command scanning field misalignment in
   wx-console.
 - Switch to using the wxWidgets Unicode library.
 - Include msvcr71.dll in distribution.
@@ -790,7 +1041,7 @@ Changes to 1.37.28:
   file sizes for restore and dir of catalog, otherwise
   GB sizes are truncated -- fixes bug report.
 - Modify wx-console to know about 10 character widths.
-- Allow decending into top level directory if "recurse=no"
+- Allow decending into top level directory if 'recurse=no'
   is set.  Fixes a bug report.
 - Install pthreadVCE.dll when installing console or wx-console
   on Win32 systems. Fixes bug report.
@@ -808,12 +1059,12 @@ Changes to 1.37.28:
 30Jun05
 - Detect device mounted for DVD and suppress be sure to 
   mount message after label.
-- Set Cleaning tape status to "Cleaning" and force no
+- Set Cleaning tape status to 'Cleaning' and force no
   MediaType.
 - Get DVD writing working with new standard Bacula open()
   code.
 - Rename get_filename() to make more sense.
-- Detect "is already mounted on" on mount command so to avoid
+- Detect 'is already mounted on' on mount command so to avoid
   error if device is already mounted.
 - Eliminated guess_name() code. It may be necessary to
   add it back later.
@@ -904,7 +1155,7 @@ Changes from Nicolas Boichat:
    been adapted.
  - Remove set_exit_on_error function
 07Apr05
- - Fix "unknown device type" problem with DVD devices.
+ - Fix 'unknown device type' problem with DVD devices.
  - Fix crash when there is no media in the DVD drive.
 09Jan05
  - Update the documentation and ReleaseNotes.
@@ -937,8 +1188,8 @@ Changes from Nicolas Boichat:
 29Dec04
  - Add VolParts field in Media table
  - Add MaximumPartSize directive in Device (SD configuration file)
- - File Volumes can now be splitted in multiple files ("parts")
- - Fix SQL error in sql_list while doing "llist jobmedia"
+ - File Volumes can now be splitted in multiple files ('parts')
+ - Fix SQL error in sql_list while doing 'llist jobmedia'
 
 Changes to 1.37.23:
 - Renamed to make unique version for open_next_part()
@@ -1038,7 +1289,7 @@ Changes to 1.37.19:
 - Make restore.bsr have unique name.
 - Allow user to define bsr filename on restore command line
   with bootstrap=xxx.bsr
-- Add limit=nnn to "list jobs" command.
+- Add limit=nnn to 'list jobs' command.
 - Remove old restore code that did not use .bsr file.
 - unlink automatically generated bsr file.
 - Cleanup heartbeat code so that duped fd is almost sure
@@ -1178,7 +1429,7 @@ Changes to 1.37.14:
   by a user.
 26Apr05
 - Apply Tru64 patch supplied by Pascal Pederiva <freebsd@paped.com>
-- Apply Unicode fixes for Win32 from "Thorsten Engel" 
+- Apply Unicode fixes for Win32 from 'Thorsten Engel' 
   <thorsten.engel@matrix-computer.com>
 - More work on Python read feature in FD.
 22Apr05
@@ -1346,21 +1597,21 @@ Changes to 1.37.6:
 - Fix scanf of PoolId in catreq to handle 64 bit Ids.
 10Mar05
 - Add new ua_update.c file and move update_cmd there.
-- Modify "update slots" to obtain actual number of slots.
+- Modify 'update slots' to obtain actual number of slots.
 - Tweak autochanger code to handle new slots request.
 - Modify autochanger code to lock/unlock around slots and
   update slots code.
 09Mar05
 - Patch the FD so that it does not issue an error message if
   it attempts to restore the permissions on a Win32 drive.
-- Edit "Resource-name" (physical-name) for the device name
+- Edit 'Resource-name' (physical-name) for the device name
   everywhere in the SD.
 - Remove .linked.tex files in preparation for cutover to
   using .tex in place of .wml.
 08Mar05
 - Copy latest config.sub and config.guess from autoconf.
 - Try new way of identifying drives with:
-   "resource-name" (physical-name)
+   'resource-name' (physical-name)
   More work need to a complete conversion.
 07Mar05
 - Rework some of the autochanger data so that the DIR has   
@@ -1375,7 +1626,7 @@ Changes to 1.37.6:
 - Force all the Media Type records of all devices in an Autochanger
   to be the same.
 06Mar05
-- Add new "run" command to Job resource in DIR. This permits
+- Add new 'run' command to Job resource in DIR. This permits
   cloning a job as many times as you want.
 - Pass PoolId to SD on Query request. It is now used in the
   Find_media catalog request.
@@ -1441,7 +1692,7 @@ Changes to 1.37.4:
   attempt to fix a bug report.
 23Feb05
 - Corrected SunOs to SunOS in btraceback (user submitted).
-- Applied patch from Roger HaaÂ¥kansson <hson@ludd.luth.se>
+- Applied patch from Roger Haakansson <hson@ludd.luth.se>
   to warn the user of defective AWKs during ./configure.
 20Feb05
 - Add some changes submitted by a user for HP client build.
@@ -1496,7 +1747,7 @@ Changes to 1.37.3:
 15Feb05
 - Fix Media LabelDate and FirstWritten to be correctly set.
 - Fix deadlock in multiple simultaneous jobs.
-- Fix tape "truncation"/"number of files" after restore bug.
+- Fix tape 'truncation'/'number of files' after restore bug.
 10Feb05
 - Ensure that correct error messages are returned when
   reading an ANSI label.
@@ -1552,7 +1803,7 @@ Changes to 1.37.3:
   boot correctly.
 - Implement ANSI labels -- not yet tested.
   This required changes to DB format. No upgrade script yet.
-  Note, more work needed to modify "update" command to handle
+  Note, more work needed to modify 'update' command to handle
   changing label types, also must restrict volume name lengths
   to 6 characters.
 - Add new Device, Storage, and MediaType records to DB. No
@@ -1568,7 +1819,7 @@ Changes to 1.37.3:
   a single alist, and imply sending data to each Storage daemon 
   simultaneously.
 - Implement Device query command between DIR and SD.
-- Allow DIR to "reserve" a Device. It will then be acquired
+- Allow DIR to 'reserve' a Device. It will then be acquired
   when the FD connects to the SD.
 - Turn all DIR resources into classes, and implement a few class
   methods -- more to come.
@@ -1698,7 +1949,7 @@ Changes to 1.37.2:
 - Remove duplicate code from chksum.h (mentioned by Preben).
 13Dec04
 - Integrate Tim Oberfoell <oberfoell@web.de> patch to ACLs
-  to handle both the "standard" and "default" ACLs.
+  to handle both the 'standard' and 'default' ACLs.
 12Dec04
 - Integrated Preben 'Peppe' Guldberg <peppe@wielders.org>
   three cleanup patches (btest, verify, find).
@@ -1751,7 +2002,7 @@ Changes to 1.37.2:
 - Add python 2.3 to config search list (user submitted patch)
 - Add JobStatus to Python variables.
 28Nov04
-- Add "python restart" command in Console.
+- Add 'python restart' command in Console.
 - Make built-in variables table driven.
 - First cut of Python Events for Bacula. Director only.
   StartJob, EndJob, NewVolume events.
@@ -1768,7 +2019,7 @@ Changes to 1.37.*:
 19Oct05
  - configure: add check for dd, remove check for df
  - block.c:do_dvd_size_checks: Check we are writing to a dvd before doing tests
-   (reported by David Raine on the list, "[Bacula-users] LTO drive - End Of Volume error").
+   (reported by David Raine on the list, '[Bacula-users] LTO drive - End Of Volume error').
  - Update bacula-sd.conf.in to use dvd-handler correctly.
  - dvd.c:dvd_write_part: Increase timeout when writing the first part (see the code for
    more details).
@@ -1782,7 +2033,7 @@ Changes to 1.37.*:
 16Oct05
  - Remove scripts/dvd-freespace and scripts/dvd-writepart, as they are now
    merged into scripts/dvd-handler. Note: Documentation needs to be updated.
- - scripts/dvd-handler: "zero" brand-new DVD+/-RW to fix a problem with some
+ - scripts/dvd-handler: 'zero' brand-new DVD+/-RW to fix a problem with some
    DVD-writers, thanks to Arno Lehmann for reporting this, and providing the
    way to fix it.
  - new scripts/dvd-handler. Note: it also needs a patched version of dvd+rw-tools.
@@ -1815,7 +2066,7 @@ Changes to 1.37.*:
    been adapted.
  - Remove set_exit_on_error function
 07Apr05
- - Fix "unknown device type" problem with DVD devices.
+ - Fix 'unknown device type' problem with DVD devices.
  - Fix crash when there is no media in the DVD drive.
 09Jan05
  - Update the documentation and ReleaseNotes.
@@ -1848,5 +2099,5 @@ Changes to 1.37.*:
 29Dec04
  - Add VolParts field in Media table
  - Add MaximumPartSize directive in Device (SD configuration file)
- - File Volumes can now be splitted in multiple files ("parts")
- - Fix SQL error in sql_list while doing "llist jobmedia"
+ - File Volumes can now be splitted in multiple files ('parts')
+ - Fix SQL error in sql_list while doing 'llist jobmedia'
index 029ef03d390b4f493dec6021780fdbab2fa8f1a5..d0b2ced278f1c04d42711addeb58a7efc3188e2b 100644 (file)
@@ -7,7 +7,7 @@ License:
 For the most part, Bacula is licensed under the GPL version 2         
 and any code that is Copyright Kern Sibbald and John Walker or
 Copyright Kern Sibbald (after November 2004) with the GPL
-indication is so licensed, but with the following four additions:
+indication is so licensed, but with the following five additions:
 
 Linking: 
 Bacula may be linked with any libraries permitted under the GPL,
@@ -51,7 +51,7 @@ the copyright license set forth in this Agreement.
 
 Code falling under the above conditions will be marked as follows:
 
-   Copyright (C) 2000-2005 Kern Sibbald
+   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 as
@@ -68,11 +68,25 @@ Code falling under the above conditions will be marked as follows:
    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
    MA 02111-1307, USA.
 
+Windows:
+Certain source code used to build the Windows version of the Bacula
+File daemon is copyrighted and or trademarked by Microsoft and may
+contain Microsoft intellectual property (examples: Microsoft VC++, the
+source to the VSS libraries, the Microsoft C runtime libraries).  As
+such we cannot and do not distribute that software. The compiler is
+available for purchase, and Microsoft provides a free version of the
+compiler. The source code and libraries are available for download from
+Microsoft public Web servers.  We have documented in the src/win32
+directory how we build the Windows File daemon and many users have
+succeeded in doing so themselves.  Our intention is to respect as
+closely as possible Open Source practices while maintaining full
+respect for proprietary and copyrighted code.
+
 =====================================
 
 The entire GPL is reproduced in the manuals distributed with the
-Bacula documentation and can also be found online on the GNU web site as well
-as at www.bacula.org.
+Bacula documentation and can also be found online on the GNU web site
+as well as at www.bacula.org.
 
 Certain parts of the Bacula software are licensed by their
 copyright holder(s) undert the GPL with no modifications.  These
index 64042e8390ab841cdf3f66e9c1500883d7627919..f61df8d3695536b58e2363df560f7f2734efa21d 100755 (executable)
@@ -4,6 +4,8 @@
 @MCOMMON@
 
 working_dir=@working_dir@
+dir_group=@dir_group@
+dir_user=@dir_user@
 
 srcdir =       @srcdir@
 VPATH =        @srcdir@
@@ -68,7 +70,7 @@ old-configure: autoconf/configure.in autoconf/aclocal.m4 autoconf/acconfig.h
        cd $(srcdir);
        ${RMF} -f config.cache config.log config.out config.status src/config.h
        autoconf --include=$(srcdir)/autoconf \
-       autoconf/configure.in > configure
+           autoconf/configure.in > configure
        chmod 755 configure
        @rm -f config.cache
 
@@ -87,7 +89,16 @@ installdirs:
        $(MKDIR) $(DESTDIR)$(sbindir)
        $(MKDIR) $(DESTDIR)$(sysconfdir)
        $(MKDIR) $(DESTDIR)$(scriptdir)
-       $(MKDIR) $(DESTDIR)$(working_dir)
+       -if test ! -d $(DESTDIR)$(working_dir) ; then \
+          $(MKDIR) $(DESTDIR)$(working_dir); \
+          chmod 770 $(DESTDIR)$(working_dir); \
+       fi
+       -if test "x$(dir_user)" != "x" ; then \
+          chown $(dir_user) $(DESTDIR)$(working_dir); \
+       fi
+       -if test "x$(dir_group)" != "x" ; then \
+          chgrp $(dir_group) $(DESTDIR)$(working_dir); \
+       fi
 #      $(MKDIR) $(DESTDIR)$(mandir)
 
 gnomedirs:
@@ -166,18 +177,16 @@ Makefile: Makefile.in
 Makefiles:
        $(SHELL) config.status
        (cd scripts; \
-       chmod 755 startmysql stopmysql bacula startit stopit btraceback; \
-       chmod 755 mtx-changer bconsole gconsole devel_bacula; \
-       chmod 755 dvd-handler)
+        chmod 755 startmysql stopmysql bacula startit stopit btraceback; \
+        chmod 755 mtx-changer bconsole gconsole devel_bacula; \
+        chmod 755 dvd-handler)
 
        (cd src/cats; \
-       chmod 755 create_bacula_database      update_bacula_tables     make_bacula_tables; \
-       chmod 755 grant_bacula_privileges     drop_bacula_tables       drop_bacula_database; \
-          \
-       chmod 755 create_@DB_NAME@_database   update_@DB_NAME@_tables  make_@DB_NAME@_tables; \
-       chmod 755 grant_@DB_NAME@_privileges  drop_@DB_NAME@_tables    drop_@DB_NAME@_database; \
-          \
-       chmod 755 make_catalog_backup delete_catalog_backup)
+        chmod 755 create_bacula_database      update_bacula_tables     make_bacula_tables; \
+        chmod 755 grant_bacula_privileges     drop_bacula_tables       drop_bacula_database; \
+        chmod 755 create_@DB_NAME@_database   update_@DB_NAME@_tables  make_@DB_NAME@_tables; \
+        chmod 755 grant_@DB_NAME@_privileges  drop_@DB_NAME@_tables    drop_@DB_NAME@_database; \
+        chmod 755 make_catalog_backup delete_catalog_backup)
 
 clean:
        @for I in ${all_subdirs}; \
index e4346a291a58fb4677cfde3ff9229a2a199111a8..cd988ac36948ba628c768cfc1c57176fb7deb575 100644 (file)
 
-          Release Notes for Bacula 1.38.3
+          Release Notes for Bacula 1.38.9
 
-  Bacula code: Total files = 424 Total lines = 140,955 (*.h *.c *.in)
+  Bacula code: Total files = 419 Total lines = 137,078 (*.h *.c *.in)
       20,440 additional lines of code since version 1.36.3
 
-Changes to 1.38.3:
+Warning for version 1.38.8 and greater:
+- The Windows FD no longer automatically folds the case
+  in wild-card comparions. To get the same behavior as before,
+  you must explicitly use "Ignore Case = yes" in your FileSet.
+- Backslashes are no longer permitted in File directives
+  (typical error for Windows users), unless the string is
+  enclosed in double quotes, in which case, the backslashes
+  must be doubled.   
+- The new algorithm for selecting Volumes from the Scratch
+  pool that was implemented in 1.38.6 and 1.38.7 is abandoned 
+  in favor of a corrected version of the 1.38.5 algorithm.
+
+New features for 1.38.9:
+- A "Dir Status" button in the Gnome console.
+    
+Fixes:
+This is mainly a bug fix release containing a collection of
+  minor fixes for 1.38.8.
+- Added code to strip backslashes from Windows filenames during
+  a restore.
+- Corrected Win32 License to use the correct LICENSE file.
+- Corrected the buffer count and bytes reported in the heap
+  statistics.
+- Fix a number of incorrect strings marked for translation, when
+  they should not be (e.g. commands).
+- Fix StartTime bug reported for ClientRunBeforeJob and RunBeforeJob
+  Patches supplied by user in bugs #608 and #599.
+- Use most recent of st_ctime and st_mtime in restore tree DIR
+  listing. This fixes some problems with Win32 printing incorrect
+  values.
+- Correct the clock shift comm time calculation between the DIR
+  and the FD. It was added rather than subtracted.
+- Strip all backslashes in filenames to be restored on Win32
+  machines -- the names should all be in Unix format, and if
+  there are any backslashes it is most likely due to an improper
+  FileSet definition, and the files will not otherwise be
+  restorable.
+- Delete src/win32/License.txt
+- Modify installer to install LICENSE
+- Add back ua_label barcode fix from Rufolf Cejka.
+- Add 'Dir Status' button to the gnome console.
+- Display heap stats in Storage daemon without debug level.
+- Implement using pg_config for finding PostgreSQL files.
+  Fixes bug #600. Patch supplied by user.
+- Remove -t option from mktemp in mtx_changer.in and use
+  working directory. Fixes bug #578.
+- Update job start time after the any run before job so that
+  files created by the script are only backed up once. Fixes
+  bug #599.
+- Strip trailing newline only from filenames entered in
+  the restore command when reading a file. This permits
+  the user to enter filenames with trailing spaces. Fixes
+  bug #549. The user supplied a patch that I modified slightly.
+- Use the most recent time (st_mtime, st_ctime) in the dir
+  command in restore. This gives the user a better idea of what
+  the newest file really is. This fixes bug #574. The fix
+  was suggested by the user.
+- Remove the -f option from the chown in Makefile.in for more
+  portability.
+- Change setting the group in Makefile.in to use chgrp for
+  more portability.
+- Implement a Bacula read/write lock for Python rather
+  than using the Python lock to avoid recursive problems.
+- Correct the uninstall directory names in filed/Makefile.in
+  as reported by a user.
+
+!!!! Important !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+  In Bacula version 1.38.5 and prior, there was apparently a
+  compiler bug that caused the Storage daemon to seg fault.
+  I have applied a workaround in version 1.38.6 and greater that
+  seems to work.  If you experience problems, follow the instructions
+  below.
+
+  If you are compiling for a 64 bit machine, you need to ensure
+  that the code is compiled with the -O0 (- oh zero) option otherwise
+  the SD will crash on most all operations -- apparently due to
+  a compiler bug in gcc's 64 bit code generation.
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+New features for 1.38.8:
+- Regex, RegexFile, and RegexDir are now implemented in the
+  Win32 FD.  However, this is new experimental code that is
+  largely untested. It may not work, it may cause memory 
+  leaks, or it may even crash the FD. Please test carefully
+  before using.
+- On Linux/Unix systems there are two new programs, bregex
+  and bwild that allow you to test regular expressions and
+  wild-cards. These programs are installed with the other   
+  binaries. They are not available on Win32 systems.
+
+Fixes: 
+- See below.
+
+New Features from pre-1.38.8 releases:
+- For autochanger get Scratch tape if in autochanger if
+  no appendable Volumes are available.
+- New virtual disk autochanger.  See scripts/disk-changer for
+  documentation.
+- New optional Device resource directive in SD.  'Device Type =',
+  which may have types: File, DVD, Tape, or FIFO.  This can
+  be useful for writing DVDs on FreeBSD where Bacula cannot
+  correctly detect the DVD.
+- Faster restore tree building and uses less memory.
+- The command line keyword job (or jobname) now refers to the
+  name of the job specified in the Job resource; jobid refers
+  as before to the non-unique numeric jobid; and ujobid refers
+  to the unique job identification that Bacula creates for each
+  job.  
+- The job report for Backups has a few more user friendly ways
+  of displaying the information.
+- The wait command can now be made to wait for jobids.
+- New command line keywords are permitted in update volume. They
+  are Inchanger=yes/no, slot=nn.      
+- Add two new console commands: enable job=<job-name> and 
+  disable job=<job-name>. When a job is disabled, it will not
+  be started by the scheduler.  If you disable a job and restart
+  Bacula or reload the .conf file, the job will be re-enabled.
+- Add a new Job resource directive "enable = yes|no".
+- There is a new program named regex in the tools directory that
+  allows you to try regular expressions on your system.
+Major bug fixes:
+- Fix race condition in multiple-drive autochangers where
+  both drives want the same Volume.
+- Do not allow opening default catalog for restricted console
+  if it is not in ACL.
+- Writable FIFOs now work for restore.
+- ACLs are now checked in all dot commands.
+- Multiple drive autochangers and multiple different autochangers
+  should now work correctly (no race conditions for Volume names, 
+  update slots use correct StorageId).
+- Fix bug where drive was always reserved if a restore job failed
+  while in the reservation process.
+   
+
+Minor bug fixes:
+- See below:
+
+Release 1.38.8 (14Apr06)               
+14Apr06
+- Correct Makefile for Solaris /bin/sh
+- Correct mtx-changer.in for Solaris /bin/sh
+- Abort if a conf resource does not have a Name =
+12Apr06
+- Change the name of the regex program to bregex.
+- Add the bwild program to the tools directory. It is similar
+  to the bregex program.
+- Implement create bregex.h and bregex.c in src/lib from the
+  Python regexp program.  
+- Use the new bregex.c to implement Regex expressions on Win32.
+11Apr06
+- Modify Makefile to change the permissions on Working Directory
+  to 770 if the directory is created.
+- Do not fail the Makefile if changing the permissions or 
+  owner/group on WorkingDir fails.
+- Correct the old recycling algorithm so that Scratch Volumes
+  are selected when looking for a Volume in the changer.
+- Correct a typo in the Verify SQL reported by Joe Park.
+10Apr06
+- Remove automatic case folding on Windows FDs. You must
+  explictly use the 'Ignore Case = yes' option.
+- Remove the code added to 1.38.6 and 1.38.7 that pulls a
+  scratch volume in an Autochanger early in the 'recycling'
+  algorithm.  
+08Apr06
+- Tweak license to include Microsoft restrictions.
+- Move mysql.reconnect to after real_connect().  Thanks to
+  Frank Sweetser for the patch.
+- Disallow a backslash in a File = directive (Windows junk)
+  unless the string is quoted.
+- Apply Eric's patch to ua_label.c so that daemon protocol
+  is not translated.
+
+Release 1.38.7 (06Apr06) released 07Apr06
+06Apr06
+- Remove timed wait for VSS on Win2K3 as it is not yet
+  implemented.
+- Correct bacula.in script to reference bacula-ctl-xx in the
+  sysconfig directory rather than the bin directory.
+
+Release 1.38.6 (28Mar06) released 29Mar06
+28Mar06
+- Back port from 1.39 fixes to lib/jcr.c to use foreach_jcr() 
+  and new jcr chain locking.
+26Mar06
+- Fix a long standing bug in the bacula start/stop scripts.
+- Attempt to add the new bacula-ctl-* files to the rpm.
+- Switch to using typeof() for list traversing to avoid
+  as many FC5 g++ compiler warnings as possible.
+25Mar06
+- Split the bacula start/start script into four files:
+   bacula         -- starts and stops calling other scripts
+   bacula-ctl-dir -- starts/stops the director
+   bacula-ctl-fd  -- starts/stops the File daemon
+   bacula-ctl-sd  -- starts/stops the Storage daemon
+- Create datestyle fix for PostgreSQL. Fixes bug #574.
+- Correct editing of JobId from int to int64 in fd_cmds.c
+- Eliminate FileSet name race with bash_spaces() and multiple
+  threads by bashing in a local.
+- Fix error return from 'use storage' to print a correct error
+  message rather than nothing.
+- Correct false re-read last block error message when two jobs 
+  are simultaneously writing at the end of a tape.
+- Simplify exit conditions in the reserve.c code to avoid  
+  possible non-release of reservation_lock().
+- Suffle lock order in reserve to avoid deadlock between
+  reservation lock and device mutex.
+- Add Thorsten's VSS timeout code to 1.38 branch.
+- Initialize jcr mutex before first use. Thanks to Thorsten for
+  tracking this down for me !!!! as it broke the Win32 build.
+- Integrate addition of line count limitation to bsmtp -l from
+  Sebastian Stark <stark at tuebingen.mpg.de>
+- Implement regex test program in tools directory.
+- Attempt to fix time problem with bsmtp with foreign langs.
+- Add strip_trailing_newline() submitted by user.
+
+Release 1.38.6 beta6 16Mar06
+- Fix bug #537 to allow arbitrary time to mount a volume for
+  restore, if polling is turned on.     
+- Disallow multiple storage specifications for a job. Should fix Arno's
+  problem.
+- Add back a missing store of poolid in jr.poolid.    
+- If dir_user or dir-group is specified in ./configure apply it to
+  the working-dir. Fixes bug #533.
+- If rescheduling a job cancel the previous incarnation with the SD.
+  Fixes bugs #566 and 557.
+- Fix bug #567 do_message() definition type conflict.
+
+Release 1.38.6 beta5 14Mar06
+- Add more jcr methods and make mutex and use_count private.
+- Create lock/unlock methods for jcr.
+- Fix PostgreSQL bug doing sql_data_seeek() by explicitly reading
+  records to get to seek position.
+- Integrate patch from bug #561 to correct conio.c signal definitions.
+- Fix Rescheduling failed Jobs. Ensure that SD message thread 
+  terminates correctly by doing pthread_kill(). Do not destroy
+  SD cond wait variable between executions of the job. Use local
+  mutex for cond variable to avoid blocking jcr chain. Fix poor 
+  use of jcr use count in jobq.c for restarted jobs.
+- Fix obsolete usage of foreach_dlist() to use foreach_jcr() in
+  lib/jcr.c -- prevents locking the jcr chaing.
+- Apply patch from bug #564, which corrects listing volumes with
+  multiple autochangers. Apply same fix to next volume list.
+- Fix bug #562 where restore bootstrap file is not unique.
+- Use new routine lock_reservations() to lock the reservations
+  system, and call it while looking for a volume in askdir.c.
+  This could possibly fix bug #543.
+- Stop SD command loop if job is canceled.
+
+Release 1.38.6 beta3 4Mar06
+04Mar06
+- The po files should now be current.
+- Fix new sql_use_result() code to properly release the
+  buffers in all cases.
+- Convert to using new Python class definitons with (object).
+- Use the keyword ujobid to mean the unique job id; job or jobname
+  to mean the Job name given on the Name directive, and jobid to
+  be the numeric (non-unique) job id.
+- Allow listing by any of the above.
+- Add the user friendly job report code for reporting job elapsed time
+  and rates with suffexes.
+- Add Priority and JobLevel as Python settable items.
+- Use TEMPORARY table creation where the table is created by
+  Bacula.
+- Add new code submitted by Eric for waiting on specific jobid.
+- Add ACL checking for the dot commands.
+- Fix restore of writable FIFOs.
+- Fix a bug in bpipe where the string was freed too early.
+
+26Feb06
+- Fix bug reported by Arno listing blocks with bls
+- Update the po files at Eric's request.
+
+Release 1.38.6-beta2 25Feb06
+25Feb06
+- Add sql_use_result() define.
+
+Changes to 1.38.6-beta1
+- Don't open default catalog if not in ACL.
+- Add virtual disk autochanger code.
+- Add user supplied bug fix to make two autochangers work
+  correctly using StorageId with InChanger checks.
+- Correct new/old_jcr confusion in copy_storage().
+- Remove & from Job during scan in msgchan.c -- probably
+  trashed the stack.
+- When getting the next Volume if no Volume in Append mode   
+  exists and we are dealing with an Autochanger, search
+  for a Scratch Volume.  
+- Check for missing value in dot commands -- bug fix.
+- Fix bug in update barcodes command line scanning.
+- Make sure Pool Max Vols is respected.
+- Check that user supplied a value before referencing
+  it in restore -- pointed out by Karl Hakimian. 
+- Add Karl Hakimian's table insert code.
+- Don't ask user to select a specific Volume when
+  updating all volumes in a Pool.
+- Remove reservation if set for read when removing dcr.
+- Lock code that requests next appendable volume so that
+  two jobs to get the same Volume at the same time.
+- Add new Device Type = xxx code. Values are file, tape,
+  dvd, and fifo.
+- Preserve certain modes (ST_LABEL|ST_APPEND|ST_READ) across
+  a re-open to change read/write permission on a device.
+- Correct a misplaced double quote in certain autochanger  
+  scripts.
+- Make make_catalog_backup.in a bit more portable.
+- Implement Karl Hakimian's sql_use_result(), which speeds
+  up restore tree building and reduces the memory load.
+- Correct a number of minor bugs in getting a Volume from  
+  the Scratch Pool.
+- Implement additional command line options for update Volume.
+- Don't require user to enter a Volume name when updating
+  all Volumes in a pool.
+
+Release 1.38.5 released 19Jan06:
+- Apply label barcodes fix supplied by Rudolf Cejka.
+- Modify standard rpm installation to set SD group to disk
+  so that SD will by default have access to tape drives.
+- Allow users to specify user/group and start options
+  for each daemon in /etc/sysconf/bacula file.
+
+Changes to 1.38.4 released 17Jan06:
+- The main changes are to the Director and the Storage daemon,
+  thus there is no need to update your File daemons. Just the
+  same, I do recommend running with the release 1.38.3 Win32
+  FD or later.
+- Add two new queries to query.sql provided by Arno. One
+  list volumes known to the Storage device, and the other
+  lists volumes possibly needing replacement (error, ...).
+- Add periodic (every 24 hours) garbage collection of memory 
+  pool by releasing free buffers.
+- Correct bug counting sized (for display only) in smartall.c
+- Print FD mempool stats if debug > 0 rather than 5.
+- Correct bug in alist.c that re-allocated the list if the
+  number of items goes to zero.
+- Move the reservation system thread locking to the top level
+  so that one job at a time tries all possible drives before
+  waiting.
+- Implement a reservation 'fail' message queue that is built         
+  and destroyed on each pass through the reservation system.
+  These messages are displayed in a 'Jobs waiting to reserve
+  a drive' list during a 'status storage='.  Note, multiple
+  messages will generally print for each JobId because they
+  represent the different problems with either the same drive
+  or different drives.  If this output proves too confusing
+  of voluminous, I will display it only when debug level 1
+  or greater is enabled in the SD.
+- Add enable/disable job=<job-name>.  This command prevents
+  the specified job from being scheduled. Even when disabled,
+  the job can be manually started from the console.
+- During 'update slots' clear all InChanger flags where the
+  StorageId is zero (old Media records).
+- Fix autochanger code to strip leading spaces from returned
+  slots number. Remove bc from chio-changer.
+- Back port a bit of 1.39 crypto code to reduce diffs.
+- Fix first call to autochanger that missed close()ing the
+  drive. Put close() just before each run_program().  Fixes
+  Arno's changer bug.
+- Add PoolId to Job record when updating it at job start time.
+- Pull in more code from 1.39 so that there are fewer file
+  differences (the new ua_dotcmds.c, base64.h, crypto.h
+  hmac.c jcr.c (dird and lib) lib.h md5.h parse_conf.c
+  util.c. Aside from ua_dotcmds.c these are mostly crypto
+  upgrades.
+- Implement new method of walking the jcr chain. The
+  incr/dec of the use_count is done within the walking
+  routines.  This should prevent a jcr from being freed
+  from under the walk routines.
+
+
+Changes to 1.38.3 released 05Jan06:
 - This is mainly a bug release fix. In addition, the multiple drive
   reservation algorithm has been rewritten.
 - In addition, the method of handling waiting for tapes to be
@@ -13,7 +384,7 @@ Changes to 1.38.3:
 - Simplify code in askdir.c that waits for creating an appendable
   volume so that it can handle multiple returns from the wait code.
 - Modify the wait code to permit multiple returns.
-- Return a zero when "autochanger drives" is called and
+- Return a zero when 'autochanger drives' is called and
   it is not an autochanger.
 - Make rewind_dev() a method taking a DCR as an argument.
   This permits closing and reopening the drive if the
@@ -88,9 +459,9 @@ Changes to 1.38.3:
   at the same time.
 - Apply days keyword patch from Alexander.Bergolth at wu-wien.ac.at 
   If this patch is applied, the number of days can be specified with
-  "list nextvol days=xx"
+  'list nextvol days=xx'
   or
-  "status dir days=xx"
+  'status dir days=xx'
   My use case is to be able to preview the next scheduled job (and the 
   next tape to be used) on fridays if there are no scheduled jobs during 
   the weekend.
@@ -183,7 +554,7 @@ Major Changes in 1.38:
 - Volume Shadow Copy support for Win32 thus the capability to
   backup exclusively opened files (thanks to Thorsten Engel).
   A VSS enabled Win32 FD is available.  You must explicitly
-  turn on VSS with "Enable VSS = yes" in your FileSet resource.
+  turn on VSS with 'Enable VSS = yes' in your FileSet resource.
 - New manual format with an index (thanks to Karl Cunningham).
 - New Web site format (thanks to Michael Scherer).
 - SQLite3 support.
@@ -194,13 +565,13 @@ Major Changes in 1.38:
   in native languages.  Thanks to Nicolas Boichat.
 
 New Directives:
-- New Job directive "Prefer Mounted Volumes = yes|no" causes the
+- New Job directive 'Prefer Mounted Volumes = yes|no' causes the
   SD to select either an Autochanger or a drive with a valid 
   Volume already mounted in preference. If none is available,
   it will select the first available drive.
 - New Run directive in Job resource of DIR. It permits
   cloning of jobs.  To clone a copy of the current job, use
-     Run = "job-name level=%l since=\"%s\""
+     Run = 'job-name level=%l since=\'%s\''
   Note, job-name is normally the same name as the job that
   is running but there is no restriction on what you put. If you
   want to start the job by hand and use job overrides such as       
@@ -288,7 +659,7 @@ New Directives:
   of the manual.
 
 New Commands:
-- "python restart" restarts the Python interpreter. Rather brutal, make
+- 'python restart' restarts the Python interpreter. Rather brutal, make
    sure no Python scripts are running. This permits you to change
    a Python script and get Bacula to use the new script.
 
@@ -302,11 +673,11 @@ Items to note!!!
 - The Storage daemon now keeps track of what tapes it is using
   (was not the case in 1.36.x). This means that you must be much
   more careful when removing tapes and putting up a new one. In
-  general, you should always do a "unmount" prior to removing a
-  tape, and a "mount" after putting a new one into the drive.
+  general, you should always do a 'unmount' prior to removing a
+  tape, and a 'mount' after putting a new one into the drive.
 - If you use an Autochanger, you MUST update your SD conf file
   to use the new Autochanger resource.  Otherwise, certain commands
-  such as "update slots" may not work.
+  such as 'update slots' may not work.
 - You must add --with-python=[DIR] to the configure command line
   if you want Python support.  Python 2.2, 2.3 and 2.4 should be 
   automatically detected if in the standard place.
@@ -340,7 +711,7 @@ Items to note!!!
   compiling.
 
 
-Other Items:
+Other Items Fixed:
 - Security fixes for temp files created in mtx-changer, during
   ./configure, and during making of Rescue disk.
 - A new script, dvd-handler, in the scripts directory,
@@ -351,7 +722,7 @@ Other Items:
   <bacula-source>/patches/dvd+rw-tools-5.21.4.10.8.bacula.patch
   You must have Python installed to run the scripts.
 - Part files support: File volumes can now be split into multiple
-  files, called "parts".
+  files, called 'parts'.
 - For the details of the Python scripting support, please see the new
   Python Scripting chapter in the manual.
 - The default user/group for the Director and Storage daemon installed
index 8428ab8a8887c8400d1044709392caeabc72c099..f3cc016021680109d0e1e7a784c9ec4924854aaf 100644 (file)
@@ -288,7 +288,12 @@ AC_ARG_WITH(postgresql,
           AC_MSG_ERROR("You can configure for only one database.");
       fi
       if test "$withval" = "yes"; then
-          if test -f /usr/local/include/libpq-fe.h; then
+          PG_CONFIG=`which pg_config`
+          if test -n "$PG_CONFIG";then
+              POSTGRESQL_INCDIR=`"$PG_CONFIG" --includedir`
+              POSTGRESQL_LIBDIR=`"$PG_CONFIG" --libdir`
+              POSTGRESQL_BINDIR=`"$PG_CONFIG" --bindir`
+          elif test -f /usr/local/include/libpq-fe.h; then
               POSTGRESQL_INCDIR=/usr/local/include
               POSTGRESQL_LIBDIR=/usr/local/lib
               POSTGRESQL_BINDIR=/usr/local/bin
index 87af24d6afea49f4cb7c6e9a39cc895575ddd463..89a173a3921e9336c808b6a65c7ad5666a82f465 100644 (file)
 /* Set if Bacula conio support enabled */
 #undef HAVE_CONIO
 
-/* Define if encryption support should be enabled */
-#undef HAVE_CRYPTO
-
 /* Define to 1 if you have the <curses.h> header file. */
 #undef HAVE_CURSES_H
 
 /* Define to 1 if you have the `setsid' function. */
 #undef HAVE_SETSID
 
-/* Define if the SHA-2 family of digest algorithms is available */
-#undef HAVE_SHA2
-
 /* Define to 1 if you have the `signal' function. */
 #undef HAVE_SIGNAL
 
index 984b356e95af71b25d2dd7001469674a47eef438..4a0ca2197b73a5878349fd69fe6600b7f6be7fd4 100644 (file)
@@ -193,7 +193,6 @@ support_conio=yes
 support_gnome=no
 support_wx_console=no
 support_tls=no
-support_crypto=no
 gnome_version=
 wx_version=
 support_static_tools=no
@@ -752,34 +751,19 @@ if test "x$with_openssl_directory" != "x"; then
 
        AC_TRY_LINK([ #include <openssl/ssl.h> ],
                [ CRYPTO_set_id_callback(NULL); ],
-               [
-                       support_tls="yes"
-                       support_crypto="yes"
-               ],
+               [ support_tls="yes" ],
                [ support_tls="no" ]
        )
 
-       AC_TRY_LINK([ #include <openssl/evp.h> ],
-               [ EVP_sha512(); ],
-               [ ac_cv_openssl_sha2="yes" ],
-               [ ac_cv_openssl_sha2="no" ]
-       )
-
        LIBS="$saved_LIBS"
        CFLAGS="$saved_CFLAGS"
 
        if test "$support_tls" = "yes"; then
                AC_DEFINE(HAVE_OPENSSL, 1, [Define if OpenSSL library is available])
                AC_DEFINE(HAVE_TLS, 1, [Define if TLS support should be enabled])
-               AC_DEFINE(HAVE_CRYPTO, 1, [Define if encryption support should be enabled])
-       fi
-
-       if test "$ac_cv_openssl_sha2" = "yes"; then
-               AC_DEFINE(HAVE_SHA2, 1, [Define if the SHA-2 family of digest algorithms is available])
        fi
 else
        support_tls="no"
-       support_crypto="no"
        OPENSSL_LIBS=""
        OPENSSL_INC=""
 fi
@@ -1921,6 +1905,9 @@ AC_OUTPUT([autoconf/Make.common \
           scripts/bconsole \
           scripts/gconsole \
           scripts/bacula \
+          scripts/bacula-ctl-dir \
+          scripts/bacula-ctl-fd \
+          scripts/bacula-ctl-sd \
           scripts/devel_bacula \
           scripts/Makefile \
           scripts/logrotate \
@@ -1997,7 +1984,6 @@ AC_OUTPUT([autoconf/Make.common \
           src/cats/drop_bacula_tables \
           src/cats/drop_bacula_database \
           src/findlib/Makefile \
-          src/pygtk-console/Makefile \
           src/tools/Makefile \
           src/win32/winbacula.nsi \
           src/win32/baculafd/bacula-fd.conf \
@@ -2132,7 +2118,6 @@ Configuration on `date`:
   readline support:          ${got_readline} ${PRTREADLINE_SRC}
   TCP Wrappers support:       ${TCPW_MSG} ${WRAPLIBS}
   TLS support:               ${support_tls}
-  Encryption support:        ${support_crypto} 
   ZLIB support:              ${have_zlib}
   enable-smartalloc:         ${support_smartalloc} 
   enable-gnome:              ${support_gnome} ${gnome_version}
index 6adc9896dea1f78d226bdacdd31d6af47afd838e..68d7f60b0692a9c99b6ee8d0d8771fe2b6a92f22 100755 (executable)
@@ -12770,7 +12770,6 @@ support_conio=yes
 support_gnome=no
 support_wx_console=no
 support_tls=no
-support_crypto=no
 gnome_version=
 wx_version=
 support_static_tools=no
@@ -15881,64 +15880,13 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-
-                       support_tls="yes"
-                       support_crypto="yes"
-
+   support_tls="yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
  support_tls="no"
 
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-
-       cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
- #include <openssl/evp.h>
-int
-main ()
-{
- EVP_sha512();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-        { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-   ac_cv_openssl_sha2="yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_cv_openssl_sha2="no"
-
 fi
 rm -f conftest.err conftest.$ac_objext \
       conftest$ac_exeext conftest.$ac_ext
@@ -15957,23 +15905,9 @@ cat >>confdefs.h <<\_ACEOF
 #define HAVE_TLS 1
 _ACEOF
 
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_CRYPTO 1
-_ACEOF
-
-       fi
-
-       if test "$ac_cv_openssl_sha2" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_SHA2 1
-_ACEOF
-
        fi
 else
        support_tls="no"
-       support_crypto="no"
        OPENSSL_LIBS=""
        OPENSSL_INC=""
 fi
@@ -29834,7 +29768,7 @@ if test "x${subsysdir}" = "x${sbindir}" ; then
    exit 1
 fi
 
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ac_config_files="$ac_config_files autoconf/Make.common Makefile scripts/startmysql scripts/stopmysql scripts/btraceback scripts/startit scripts/stopit scripts/bconsole scripts/gconsole scripts/bacula scripts/devel_bacula scripts/Makefile scripts/logrotate scripts/bacula.desktop.gnome1 scripts/bacula.desktop.gnome2 scripts/bacula.desktop.gnome1.consolehelper scripts/bacula.desktop.gnome2.consolehelper scripts/bacula.desktop.gnome1.xsu scripts/bacula.desktop.gnome2.xsu scripts/gnome-console.console_apps scripts/mtx-changer scripts/disk-changer scripts/dvd-handler scripts/bacula-tray-monitor.desktop scripts/logwatch/Makefile scripts/logwatch/logfile.bacula.conf src/Makefile src/host.h src/console/Makefile src/console/bconsole.conf src/gnome2-console/Makefile src/gnome2-console/gnome-console.conf src/wx-console/Makefile src/wx-console/wx-console.conf src/tray-monitor/Makefile src/tray-monitor/tray-monitor.conf src/dird/Makefile src/dird/bacula-dir.conf src/lib/Makefile src/stored/Makefile src/stored/bacula-sd.conf src/filed/Makefile src/filed/bacula-fd.conf src/filed/win32/Makefile src/cats/Makefile src/cats/make_catalog_backup src/cats/delete_catalog_backup src/cats/create_postgresql_database src/cats/update_postgresql_tables src/cats/make_postgresql_tables src/cats/grant_postgresql_privileges src/cats/drop_postgresql_tables src/cats/drop_postgresql_database src/cats/create_mysql_database src/cats/update_mysql_tables src/cats/make_mysql_tables src/cats/grant_mysql_privileges src/cats/drop_mysql_tables src/cats/drop_mysql_database src/cats/create_sqlite_database src/cats/update_sqlite_tables src/cats/make_sqlite_tables src/cats/grant_sqlite_privileges src/cats/drop_sqlite_tables src/cats/drop_sqlite_database src/cats/create_sqlite3_database src/cats/update_sqlite3_tables src/cats/make_sqlite3_tables src/cats/grant_sqlite3_privileges src/cats/drop_sqlite3_tables src/cats/drop_sqlite3_database src/cats/sqlite src/cats/mysql src/cats/create_bdb_database src/cats/update_bdb_tables src/cats/make_bdb_tables src/cats/grant_bdb_privileges src/cats/drop_bdb_tables src/cats/drop_bdb_database src/cats/create_bacula_database src/cats/update_bacula_tables src/cats/grant_bacula_privileges src/cats/make_bacula_tables src/cats/drop_bacula_tables src/cats/drop_bacula_database src/findlib/Makefile src/pygtk-console/Makefile src/tools/Makefile src/win32/winbacula.nsi src/win32/baculafd/bacula-fd.conf src/win32/Makefile src/win32/console/bconsole.conf src/win32/wx-console/wx-console.conf src/win32/pebuilder/Makefile po/Makefile.in $PFILES"
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ac_config_files="$ac_config_files autoconf/Make.common Makefile scripts/startmysql scripts/stopmysql scripts/btraceback scripts/startit scripts/stopit scripts/bconsole scripts/gconsole scripts/bacula scripts/bacula-ctl-dir scripts/bacula-ctl-fd scripts/bacula-ctl-sd scripts/devel_bacula scripts/Makefile scripts/logrotate scripts/bacula.desktop.gnome1 scripts/bacula.desktop.gnome2 scripts/bacula.desktop.gnome1.consolehelper scripts/bacula.desktop.gnome2.consolehelper scripts/bacula.desktop.gnome1.xsu scripts/bacula.desktop.gnome2.xsu scripts/gnome-console.console_apps scripts/mtx-changer scripts/disk-changer scripts/dvd-handler scripts/bacula-tray-monitor.desktop scripts/logwatch/Makefile scripts/logwatch/logfile.bacula.conf src/Makefile src/host.h src/console/Makefile src/console/bconsole.conf src/gnome2-console/Makefile src/gnome2-console/gnome-console.conf src/wx-console/Makefile src/wx-console/wx-console.conf src/tray-monitor/Makefile src/tray-monitor/tray-monitor.conf src/dird/Makefile src/dird/bacula-dir.conf src/lib/Makefile src/stored/Makefile src/stored/bacula-sd.conf src/filed/Makefile src/filed/bacula-fd.conf src/filed/win32/Makefile src/cats/Makefile src/cats/make_catalog_backup src/cats/delete_catalog_backup src/cats/create_postgresql_database src/cats/update_postgresql_tables src/cats/make_postgresql_tables src/cats/grant_postgresql_privileges src/cats/drop_postgresql_tables src/cats/drop_postgresql_database src/cats/create_mysql_database src/cats/update_mysql_tables src/cats/make_mysql_tables src/cats/grant_mysql_privileges src/cats/drop_mysql_tables src/cats/drop_mysql_database src/cats/create_sqlite_database src/cats/update_sqlite_tables src/cats/make_sqlite_tables src/cats/grant_sqlite_privileges src/cats/drop_sqlite_tables src/cats/drop_sqlite_database src/cats/create_sqlite3_database src/cats/update_sqlite3_tables src/cats/make_sqlite3_tables src/cats/grant_sqlite3_privileges src/cats/drop_sqlite3_tables src/cats/drop_sqlite3_database src/cats/sqlite src/cats/mysql src/cats/create_bdb_database src/cats/update_bdb_tables src/cats/make_bdb_tables src/cats/grant_bdb_privileges src/cats/drop_bdb_tables src/cats/drop_bdb_database src/cats/create_bacula_database src/cats/update_bacula_tables src/cats/grant_bacula_privileges src/cats/make_bacula_tables src/cats/drop_bacula_tables src/cats/drop_bacula_database src/findlib/Makefile src/tools/Makefile src/win32/winbacula.nsi src/win32/baculafd/bacula-fd.conf src/win32/Makefile src/win32/console/bconsole.conf src/win32/wx-console/wx-console.conf src/win32/pebuilder/Makefile po/Makefile.in $PFILES"
           ac_config_commands="$ac_config_commands default"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -30387,6 +30321,9 @@ do
   "scripts/bconsole" ) CONFIG_FILES="$CONFIG_FILES scripts/bconsole" ;;
   "scripts/gconsole" ) CONFIG_FILES="$CONFIG_FILES scripts/gconsole" ;;
   "scripts/bacula" ) CONFIG_FILES="$CONFIG_FILES scripts/bacula" ;;
+  "scripts/bacula-ctl-dir" ) CONFIG_FILES="$CONFIG_FILES scripts/bacula-ctl-dir" ;;
+  "scripts/bacula-ctl-fd" ) CONFIG_FILES="$CONFIG_FILES scripts/bacula-ctl-fd" ;;
+  "scripts/bacula-ctl-sd" ) CONFIG_FILES="$CONFIG_FILES scripts/bacula-ctl-sd" ;;
   "scripts/devel_bacula" ) CONFIG_FILES="$CONFIG_FILES scripts/devel_bacula" ;;
   "scripts/Makefile" ) CONFIG_FILES="$CONFIG_FILES scripts/Makefile" ;;
   "scripts/logrotate" ) CONFIG_FILES="$CONFIG_FILES scripts/logrotate" ;;
@@ -30463,7 +30400,6 @@ do
   "src/cats/drop_bacula_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/drop_bacula_tables" ;;
   "src/cats/drop_bacula_database" ) CONFIG_FILES="$CONFIG_FILES src/cats/drop_bacula_database" ;;
   "src/findlib/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/findlib/Makefile" ;;
-  "src/pygtk-console/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/pygtk-console/Makefile" ;;
   "src/tools/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/tools/Makefile" ;;
   "src/win32/winbacula.nsi" ) CONFIG_FILES="$CONFIG_FILES src/win32/winbacula.nsi" ;;
   "src/win32/baculafd/bacula-fd.conf" ) CONFIG_FILES="$CONFIG_FILES src/win32/baculafd/bacula-fd.conf" ;;
@@ -31606,7 +31542,6 @@ Configuration on `date`:
   readline support:          ${got_readline} ${PRTREADLINE_SRC}
   TCP Wrappers support:       ${TCPW_MSG} ${WRAPLIBS}
   TLS support:               ${support_tls}
-  Encryption support:        ${support_crypto}
   ZLIB support:              ${have_zlib}
   enable-smartalloc:         ${support_smartalloc}
   enable-gnome:              ${support_gnome} ${gnome_version}
index 5433ad8b872c32981b43abcd5258e7e0feebf015..a6f39956007980a710c1a980e1fabddb2c3ff654 100644 (file)
@@ -7,7 +7,7 @@ import sys, bacula
 
 # This is the list of Bacula daemon events that you
 #  can receive.
-class BaculaEvents:
+class BaculaEvents(object):
   def __init__(self):
      # Called here when a new Bacula Events class is
      #  is created. Normally not used 
@@ -43,7 +43,7 @@ bacula.set_events(BaculaEvents()) # register daemon events desired
 """
   There are the Job events that you can receive.
 """
-class JobEvents:
+class JobEvents(object):
   def __init__(self):
      # Called here when you instantiate the Job. Not
      # normally used
index 0c274c8c0fe668f19d761cb9cd5b92d1938fd83a..4d53e33bfc987463154dc79803fb72d6aea8673f 100644 (file)
@@ -6,7 +6,7 @@ import sys, bacula
 
 # This is the list of Bacula daemon events that you
 #  can receive.
-class BaculaEvents:
+class BaculaEvents(object):
   def __init__(self):
      # Called here when a new Bacula Events class is
      #  is created. Normally not used 
@@ -44,7 +44,7 @@ bacula.set_events(BaculaEvents()) # register daemon events desired
 """
   There are the Job events that you can receive.
 """
-class JobEvents:
+class JobEvents(object):
   def __init__(self):
      # Called here when you instantiate the Job. Not
      # normally used
index 8430e4f1ceec5f3ccc128f438973c4e30816a4bd..1f08beda4ca6cd17443106b4f0489b9f755a66e2 100644 (file)
@@ -6,7 +6,7 @@ import sys, bacula
 
 # This is the list of Bacula daemon events that you
 #  can receive.
-class BaculaEvents:
+class BaculaEvents(object):
   def __init__(self):
      # Called here when a new Bacula Events class is
      #  is created. Normally not used 
@@ -45,7 +45,7 @@ bacula.set_events(BaculaEvents()) # register daemon events desired
 """
   There are the Job events that you can receive.
 """
-class JobEvents:
+class JobEvents(object):
   def __init__(self):
      # Called here when you instantiate the Job. Not
      # normally used
diff --git a/bacula/examples/recover.pl b/bacula/examples/recover.pl
new file mode 100755 (executable)
index 0000000..fe6e946
--- /dev/null
@@ -0,0 +1,2886 @@
+#!/usr/bin/perl -w
+
+=head1 NAME
+
+recover.pl - a script to provide an interface for restore files similar
+to Legatto Networker's recover program.
+
+=cut
+
+use strict;
+use Getopt::Std;
+use DBI;
+use Term::ReadKey;
+use Term::ReadLine;
+use Fcntl ':mode';
+use Time::ParseDate;
+use Date::Format;
+use Text::ParseWords;
+
+# Location of config file.
+my $CONF_FILE = "$ENV{HOME}/.recoverrc"; 
+my $HIST_FILE = "$ENV{HOME}/.recover.hist";
+
+########################################################################
+### Queries needed to gather files from directory.
+########################################################################
+
+my %queries = (
+       'postgres' => {
+               'dir' =>
+                       "(
+                               select
+                                       distinct on (name)
+                                       Filename.name,
+                                       Path.path,
+                                       File.lstat,
+                                       File.fileid,
+                                       File.fileindex,
+                                       Job.jobtdate - ? as visible,
+                                       Job.jobid
+                               from
+                                       Path,
+                                       File,
+                                       Filename,
+                                       Job
+                               where
+                                       clientid = ? and
+                                       Job.name = ? and
+                                       Job.jobtdate <= ? and
+                                       Path.path = ? and
+                                       File.pathid = Path.pathid and
+                                       Filename.filenameid = File.filenameid and
+                                       Filename.name != '' and
+                                       File.jobid = Job.jobid
+                               order by
+                                       name,
+                                       jobid desc
+                       )
+                       union
+                       (
+                               select
+                                       distinct on (name)
+                                       substring(Path.path from ? + 1) as name,
+                                       substring(Path.path from 1 for ?) as path,
+                                       File.lstat,
+                                       File.fileid,
+                                       File.fileindex,
+                                       Job.jobtdate - ? as visible,
+                                       Job.jobid
+                               from
+                                       Path,
+                                       File,
+                                       Filename,
+                                       Job
+                               where
+                                       clientid = ? and
+                                       Job.name = ? and
+                                       Job.jobtdate <= ? and
+                                       File.jobid = Job.jobid and
+                                       Filename.name = '' and
+                                       Filename.filenameid = File.filenameid and
+                                       File.pathid = Path.pathid and
+                                       Path.path ~ ('^' || ? || '[^/]*/\$')
+                               order by
+                                       name,
+                                       jobid desc
+                       )
+                       order by
+                               name
+               ",
+               'sel' =>
+                       "(
+                               select
+                                       distinct on (name)
+                                       Path.path || Filename.name as name,
+                                       File.fileid,
+                                       File.lstat,
+                                       File.fileindex,
+                                       Job.jobid
+                               from
+                                       Path,
+                                       File,
+                                       Filename,
+                                       Job
+                               where
+                                       clientid = ? and
+                                       Job.name = ? and
+                                       Job.jobtdate <= ? and
+                                       Job.jobtdate >= ? and
+                                       Path.path like ? || '%' and
+                                       File.pathid = Path.pathid and
+                                       Filename.filenameid = File.filenameid and
+                                       Filename.name != '' and
+                                       File.jobid = Job.jobid
+                               order by
+                                       name, jobid desc
+                       )
+                       union
+                       (
+                               select
+                                       distinct on (name)
+                                       Path.path as name,
+                                       File.fileid,
+                                       File.lstat,
+                                       File.fileindex,
+                                       Job.jobid
+                               from
+                                       Path,
+                                       File,
+                                       Filename,
+                                       Job
+                               where
+                                       clientid = ? and
+                                       Job.name = ? and
+                                       Job.jobtdate <= ? and
+                                       Job.jobtdate >= ? and
+                                       File.jobid = Job.jobid and
+                                       Filename.name = '' and
+                                       Filename.filenameid = File.filenameid and
+                                       File.pathid = Path.pathid and
+                                       Path.path like ? || '%'
+                               order by
+                                       name, jobid desc
+                       )
+               ",
+               'cache' =>
+                       "select
+                               distinct on (path, name)
+                               Path.path,
+                               Filename.name,
+                               File.fileid,
+                               File.lstat,
+                               File.fileindex,
+                               Job.jobtdate - ? as visible,
+                               Job.jobid
+                       from
+                               Path,
+                               File,
+                               Filename,
+                               Job
+                       where
+                               clientid = ? and
+                               Job.name = ? and
+                               Job.jobtdate <= ? and
+                               Job.jobtdate >= ? and
+                               File.pathid = Path.pathid and
+                               File.filenameid = Filename.filenameid and
+                               File.jobid = Job.jobid
+                       order by
+                               path, name, jobid desc
+               ",
+               'ver' =>
+                       "select
+                               Path.path,
+                               Filename.name,
+                               File.fileid,
+                               File.fileindex,
+                               File.lstat,
+                               Job.jobtdate,
+                               Job.jobid,
+                               Job.jobtdate - ? as visible,
+                               Media.volumename
+                       from
+                               Job, Path, Filename, File, JobMedia, Media
+                       where
+                               File.pathid = Path.pathid and
+                               File.filenameid = Filename.filenameid and
+                               File.jobid = Job.jobid and
+                               File.Jobid = JobMedia.jobid and
+                               File.fileindex >= JobMedia.firstindex and
+                               File.fileindex <= JobMedia.lastindex and
+                               Job.jobtdate <= ? and
+                               JobMedia.mediaid = Media.mediaid and
+                               Path.path = ? and
+                               Filename.name = ? and
+                               Job.clientid = ? and
+                               Job.name = ?
+                       order by job
+               "
+       },
+       'mysql' => {
+               'dir' =>
+                       "
+                       (
+                               select
+                                       distinct(Filename.name),
+                                       Path.path,
+                                       File.lstat,
+                                       File.fileid,
+                                       File.fileindex,
+                                       Job.jobtdate - ? as visible,
+                                       Job.jobid
+                               from
+                                       Path,
+                                       File,
+                                       Filename,
+                                       Job
+                               where
+                                       clientid = ? and
+                                       Job.name = ? and
+                                       Job.jobtdate <= ? and
+                                       Path.path = ? and
+                                       File.pathid = Path.pathid and
+                                       Filename.filenameid = File.filenameid and
+                                       Filename.name != '' and
+                                       File.jobid = Job.jobid
+                               group by
+                                       name
+                               order by
+                                       name,
+                                       jobid desc
+                       )
+                       union
+                       (
+                               select
+                                       distinct(substring(Path.path from ? + 1)) as name,
+                                       substring(Path.path from 1 for ?) as path,
+                                       File.lstat,
+                                       File.fileid,
+                                       File.fileindex,
+                                       Job.jobtdate - ? as visible,
+                                       Job.jobid
+                               from
+                                       Path,
+                                       File,
+                                       Filename,
+                                       Job
+                               where
+                                       clientid = ? and
+                                       Job.name = ? and
+                                       Job.jobtdate <= ? and
+                                       File.jobid = Job.jobid and
+                                       Filename.name = '' and
+                                       Filename.filenameid = File.filenameid and
+                                       File.pathid = Path.pathid and
+                                       Path.path rlike concat('^', ?, '[^/]*/\$')
+                               group by
+                                       name
+                               order by
+                                       name,
+                                       jobid desc
+                       )
+                       order by
+                               name
+               ",
+               'sel' =>
+                       "
+                       (
+                       select
+                               distinct(concat(Path.path, Filename.name)) as name,
+                               File.fileid,
+                               File.lstat,
+                               File.fileindex,
+                               Job.jobid
+                       from
+                               Path,
+                               File,
+                               Filename,
+                               Job
+                       where
+                               Job.clientid = ? and
+                               Job.name = ? and
+                               Job.jobtdate <= ? and
+                               Job.jobtdate >= ? and
+                               Path.path like concat(?, '%') and
+                               File.pathid = Path.pathid and
+                               Filename.filenameid = File.filenameid and
+                               Filename.name != '' and
+                               File.jobid = Job.jobid
+                       group by
+                               path, name
+                       order by
+                               name,
+                               jobid desc
+                       )
+                       union
+                       (
+                       select
+                               distinct(Path.path) as name,
+                               File.fileid,
+                               File.lstat,
+                               File.fileindex,
+                               Job.jobid
+                       from
+                               Path,
+                               File,
+                               Filename,
+                               Job
+                       where
+                               Job.clientid = ? and
+                               Job.name = ? and
+                               Job.jobtdate <= ? and
+                               Job.jobtdate >= ? and
+                               File.jobid = Job.jobid and
+                               Filename.name = '' and
+                               Filename.filenameid = File.filenameid and
+                               File.pathid = Path.pathid and
+                               Path.path like concat(?, '%')
+                       group by
+                               path
+                       order by
+                               name,
+                               jobid desc
+                       )
+               ",
+               'cache' =>
+                       "select
+                               distinct path,
+                               Filename.name,
+                               File.fileid,
+                               File.lstat,
+                               File.fileindex,
+                               Job.jobtdate - ? as visible,
+                               Job.jobid
+                       from
+                               Path,
+                               File,
+                               Filename,
+                               Job
+                       where
+                               clientid = ? and
+                               Job.name = ? and
+                               Job.jobtdate <= ? and
+                               Job.jobtdate >= ? and
+                               File.pathid = Path.pathid and
+                               File.filenameid = Filename.filenameid and
+                               File.jobid = Job.jobid
+                       group by
+                               path, name
+                       order by
+                               path, name, jobid desc
+               ",
+               'ver' =>
+                       "select
+                               Path.path,
+                               Filename.name,
+                               File.fileid,
+                               File.fileindex,
+                               File.lstat,
+                               Job.jobtdate,
+                               Job.jobid,
+                               Job.jobtdate - ? as visible,
+                               Media.volumename
+                       from
+                               Job, Path, Filename, File, JobMedia, Media
+                       where
+                               File.pathid = Path.pathid and
+                               File.filenameid = Filename.filenameid and
+                               File.jobid = Job.jobid and
+                               File.Jobid = JobMedia.jobid and
+                               File.fileindex >= JobMedia.firstindex and
+                               File.fileindex <= JobMedia.lastindex and
+                               Job.jobtdate <= ? and
+                               JobMedia.mediaid = Media.mediaid and
+                               Path.path = ? and
+                               Filename.name = ? and
+                               Job.clientid = ? and
+                               Job.name = ?
+                       order by job
+               "
+       }
+);
+
+############################################################################
+### Command lists for help and file completion
+############################################################################
+
+my %COMMANDS = (
+       'add' => '(add files) - Add files recursively to restore list',
+       'bootstrap' => 'print bootstrap file',
+       'cd' => '(cd dir) - Change working directory',
+       'changetime', '(changetime date/time) - Change database view to date',
+       'client' => '(client client-name) - change client to view',
+       'debug' => 'toggle debug flag',
+       'delete' => 'Remove files from restore list.',
+       'help' => 'Display this list',
+       'history', 'Print command history',
+       'info', '(info files) - Print stat and tape information about files',
+       'ls' => '(ls [opts] files) - List files in current directory',
+       'pwd' => 'Print current working directory',
+       'quit' => 'Exit program',
+       'recover', 'Create table for bconsole to use in recover',
+       'relocate', '(relocate dir) - specify new location for recovered files',
+       'show', '(show item) - Display information about item',
+       'verbose' => 'toggle verbose flag',
+       'versions', '(versions files) - Show all versions of file on tape',
+       'volumes', 'Show volumes needed for restore.'
+);
+
+my %SHOW = (
+       'cache' => 'Display cached directories',
+       'catalog' => 'Display name of current catalog from config file',
+       'client' => 'Display current client',
+       'clients' => 'Display clients available in this catalog',
+       'restore' => 'Display information about pending restore',
+       'volumes' => 'Show volumes needed for restore.'
+);
+
+##############################################################################
+### Read config and command line.
+##############################################################################
+
+my %catalogs;
+my $catalog;   # Current catalog
+
+## Globals
+
+my %restore;
+my $rnum = 0;
+my $rbytes = 0;
+my $debug = 0;
+my $verbose = 0;
+my $rtime;
+my $cwd;
+my $lwd;
+my $files;
+my $restore_to = '/';
+my $start_dir;
+my $preload;
+my $dircache = {};
+my $usecache = 1;
+
+=head1 SYNTAX
+
+B<recover.pl> [B<-b> I<db connect string>] [B<-c> I<client> B<-j> I<jobname>]
+[B<-i> I<initial diretory>] [B<-p>] [B<-t> I<timespec>]
+
+B<recover.pl> [B<-h>]
+
+Most of the command line arguments can be specified in the init file
+B<$HOME/.recoverrc> (see CONFIG FILE FORMAT below). The command
+line arguments will override the options in the init file. If no
+I<catalogname> is specified, the first one found in the init file will
+be used.
+
+=head1 DESCRIPTION
+
+B<recover.pl> will read the specified catalog and provide a shell like
+environment from which a time based view of the specified client/jobname
+and be exampled and selected for restoration.
+
+The command line option B<-b> specified the DBI compatible connect
+script to use when connecting to the catalog database. The B<-c> and
+B<-j> options specify the client and jobname respectively to view from
+the catalog database. The B<-i> option will set the initial directory
+you are viewing to the specified directory. if B<-i> is not specified,
+it will default to /. You can set the initial time to view the catalog
+from using the B<-t> option.
+
+The B<-p> option will pre-load the entire catalog into memory. This
+could take a lot of memory, so use it with caution.
+
+The B<-d> option turns on debugging and the B<-v> option turns on
+verbose output.
+
+By specifying a I<catalogname>, the default options for connecting to
+the catalog database will be taken from the section of the inti file
+specified by that name.
+
+The B<-h> option will display this document.
+
+In order for this program to have a chance of not being painfully slow,
+the following indexs should be added to your database.
+
+B<CREATE INDEX file_pathid_idx on file(pathid);>
+
+B<CREATE INDEX file_filenameid_idx on file(filenameid);>
+
+=cut
+
+my $vars = {};
+getopts("c:b:hi:j:pt:vd", $vars) || die "Usage: bad arguments\n";
+
+if ($vars->{'h'}) {
+       system("perldoc $0");
+       exit;
+}
+
+$preload = $vars->{'p'} if ($vars->{'p'});
+$debug = $vars->{'d'} if ($vars->{'d'});
+$verbose = $vars->{'v'} if ($vars->{'v'});
+
+# Set initial time to view the catalog
+
+if ($vars->{'t'}) {
+       $rtime = parsedate($vars->{'t'}, FUZZY => 1, PREFER_PAST => 1);
+}
+else {
+       $rtime = time();
+}
+
+my $dbconnect;
+my $username = "";
+my $password = "";
+my $db;
+my $client;
+my $jobname;
+my $jobs;
+my $ftime;
+
+my $cstr;
+
+# Read config file (if available).
+
+&read_config($CONF_FILE);
+
+# Set defaults
+
+$catalog = $ARGV[0] if (@ARGV);
+
+if ($catalog) {
+       $cstr = ${catalogs{$catalog}}->{'client'}
+               if (${catalogs{$catalog}}->{'client'});
+
+       $jobname = $catalogs{$catalog}->{'jobname'}
+               if ($catalogs{$catalog}->{'jobname'});
+
+       $dbconnect = $catalogs{$catalog}->{'dbconnect'}
+               if ($catalogs{$catalog}->{'dbconnect'});
+
+       $username = $catalogs{$catalog}->{'username'}
+               if ($catalogs{$catalog}->{'username'});
+
+       $password = $catalogs{$catalog}->{'password'}
+               if ($catalogs{$catalog}->{'password'});
+
+       $start_dir = $catalogs{$catalog}->{'cd'}
+               if ($catalogs{$catalog}->{'cd'});
+
+       $preload = $catalogs{$catalog}->{'preload'}
+               if ($catalogs{$catalog}->{'preload'} && !defined($vars->{'p'}));
+
+       $verbose = $catalogs{$catalog}->{'verbose'}
+               if ($catalogs{$catalog}->{'verbose'} && !defined($vars->{'v'}));
+
+       $debug = $catalogs{$catalog}->{'debug'}
+               if ($catalogs{$catalog}->{'debug'} && !defined($vars->{'d'}));
+}
+
+#### Command line overries config file
+
+$start_dir = $vars->{'i'} if ($vars->{'i'});
+$start_dir = '/' if (!$start_dir);
+
+$start_dir .= '/' if (substr($start_dir, length($start_dir) - 1, 1) ne '/');
+
+if ($vars->{'b'}) {
+       $dbconnect = $vars->{'b'};
+}
+
+die "You must supply a db connect string.\n" if (!defined($dbconnect));
+
+if ($dbconnect =~ /^dbi:Pg/) {
+       $db = 'postgres';
+}
+elsif ($dbconnect =~ /^dbi:mysql/) {
+       $db = 'mysql';
+}
+else {
+       die "Unknown database type specified in $dbconnect\n";
+}
+
+# Initialize database connection
+
+print STDERR "DBG: Connect using: $dbconnect\n" if ($debug);
+
+my $dbh = DBI->connect($dbconnect, $username, $password) ||
+        die "Can't open bacula database\nDatabase connect string '$dbconnect'";
+
+die "Client id required.\n" if (!($cstr || $vars->{'c'}));
+
+$cstr = $vars->{'c'} if ($vars->{'c'});
+$client = &lookup_client($cstr);
+
+# Set job information
+$jobname = $vars->{'j'} if ($vars->{'j'});
+
+die "You need to specify a job name.\n" if (!$jobname);
+
+&setjob;
+
+die "Failed to set client\n" if (!$client);
+
+# Prepare our query
+my $dir_sth = $dbh->prepare($queries{$db}->{'dir'})
+       || die "Can't prepare $queries{$db}->{'dir'}\n";
+
+my $sel_sth = $dbh->prepare($queries{$db}->{'sel'})
+       || die "Can't prepare $queries{$db}->{'sel'}\n";
+
+my $ver_sth = $dbh->prepare($queries{$db}->{'ver'})
+       || die "Can't prepare $queries{$db}->{'ver'}\n";
+
+my $clients;
+
+# Initialize readline.
+my $term = new Term::ReadLine('Bacula Recover');
+$term->ornaments(0);
+
+my $readline = $term->ReadLine;
+my $tty_attribs = $term->Attribs;
+
+# Needed for base64 decode
+
+my @base64_digits = (
+       'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+       'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+       'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+       'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+       '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
+);
+my @base64_map = (0) x 128;
+
+for (my $i=0; $i<64; $i++) {
+       $base64_map[ord($base64_digits[$i])] = $i;
+}
+
+##############################################################################
+### Support routines
+##############################################################################
+
+=head1 FILES
+
+B<$HOME/.recoverrc> Configuration file for B<recover.pl>.
+
+=head1 CONFIG FILE FORMAT
+
+The config file will allow you to specify the defaults for your
+catalog(s). Each catalog definition starts with B<[>I<catalogname>B<]>.
+Blank lines and lines starting with # are ignored.
+
+The first catalog specified will be used as the default catalog.
+
+All values are specified in I<item> B<=> I<value> format. You can
+specify the following I<item>s for each catalog.
+
+=cut
+
+sub read_config {
+       my $conf_file = shift;
+       my $c;
+
+       # No nothing if config file can't be read.
+
+       if (-r $conf_file) {
+               open(CONF, "<$conf_file") || die "$!: Can't open $conf_file\n";
+
+               while (<CONF>) {
+                       chomp;
+                       # Skip comments and blank links
+                       next if (/^\s*#/);
+                       next if (/^\s*$/);
+
+                       if (/^\[(\w+)\]$/) {
+                               $c = $1;
+                               $catalog = $c if (!$catalog);
+
+                               if ($catalogs{$c}) {
+                                       die "Duplicate catalog definition in $conf_file\n";
+                               }
+
+                               $catalogs{$c} = {};
+                       }
+                       elsif (!$c) {
+                               die "Conf file must start with catalog definition [catname]\n";
+                       }
+                       else {
+
+                               if (/^(\w+)\s*=\s*(.*)/) {
+                                       my $item = $1;
+                                       my $value = $2;
+
+=head2 client
+
+The name of the default client to view when connecting to this
+catalog. This can be changed later with the B<client> command.
+
+=cut
+
+                                       if ($item eq 'client') {
+                                               $catalogs{$c}->{'client'} = $value;
+                                       }
+
+=head2 dbconnect
+
+The DBI compatible database string to use to connect to this catalog.
+
+=over 4
+
+=item B<example:>
+
+dbi:Pg:dbname=bacula;host=backuphost
+
+=back
+
+=cut
+                                       elsif ($item eq 'dbconnect') {
+                                               $catalogs{$c}->{'dbconnect'} = $value;
+                                       }
+
+=head2 jobname
+
+The name of the default job to view when connecting to the catalog. This
+can be changed later with the B<client> command.
+
+=cut
+                                       elsif ($item eq 'jobname') {
+                                               $catalogs{$c}->{'jobname'} = $value;
+                                       }
+
+=head2 password
+
+The password to use when connecing to the catalog database.
+
+=cut
+                                       elsif ($item eq 'password') {
+                                               $catalogs{$c}->{'password'} = $value;
+                                       }
+
+=head2 preload
+
+Set the preload flag. A preload flag of 1 or on will load the entire
+catalog when recover.pl is start. This is a memory hog, so use with
+caution.
+
+=cut
+                                       elsif ($item eq 'preload') {
+
+                                               if ($value =~ /^(1|on)$/i) {
+                                                       $catalogs{$c}->{'preload'} = 1;
+                                               }
+                                               elsif ($value =~ /^(0|off)$/i) {
+                                                       $catalogs{$c}->{'preload'} = 0;
+                                               }
+                                               else {
+                                                       die "$value: Unknown value for preload.\n";
+                                               }
+
+                                       }
+
+=head2 username
+
+The username to use when connecing to the catalog database.
+
+=cut
+                                       elsif ($item eq 'username') {
+                                               $catalogs{$c}->{'username'} = $value;
+                                       }
+                                       else {
+                                               die "Unknown opton $item in $conf_file.\n";
+                                       }
+
+                               }
+                               else {
+                                       die "Bad line $_ in $conf_file.\n";
+                               }
+
+                       }
+
+               }
+
+               close(CONF);
+       }
+
+}
+
+sub create_file_entry {
+       my $name = shift;
+       my $fileid = shift;
+       my $fileindex = shift;
+       my $jobid = shift;
+       my $visible = shift;
+       my $lstat = shift;
+
+       print STDERR "DBG: name = $name\n" if ($debug);
+       print STDERR "DBG: fileid = $fileid\n" if ($debug);
+       print STDERR "DBG: fileindex = $fileindex\n" if ($debug);
+       print STDERR "DBG: jobid = $jobid\n" if ($debug);
+       print STDERR "DBG: visible = $visible\n" if ($debug);
+       print STDERR "DBG: lstat = $lstat\n" if ($debug);
+
+       my $data = {
+               fileid => $fileid,
+               fileindex => $fileindex,
+               jobid => $jobid,
+               visible => ($visible >= 0) ? 1 : 0
+       };
+
+       # decode file stat
+       my @stat = ();
+
+       foreach my $s (split(' ', $lstat)) {
+               print STDERR "DBG: Add $s to stat array.\n" if ($debug);
+               push(@stat, from_base64($s));
+       }
+
+       $data->{'lstat'} = {
+               'st_dev' => $stat[0],
+               'st_ino' => $stat[1],
+               'st_mode' => $stat[2],
+               'st_nlink' => $stat[3],
+               'st_uid' => $stat[4],
+               'st_gid' => $stat[5],
+               'st_rdev' => $stat[6],
+               'st_size' => $stat[7],
+               'st_blksize' => $stat[8],
+               'st_blocks' => $stat[9],
+               'st_atime' => $stat[10],
+               'st_mtime' => $stat[11],
+               'st_ctime' => $stat[12],
+               'LinkFI' => $stat[13],
+               'st_flags' => $stat[14],
+               'data_stream' => $stat[15]
+       };
+
+       # Create mode string.
+       my $sstr = &mode2str($stat[2]);
+       $data->{'lstat'}->{'statstr'} = $sstr;
+       return $data;
+}
+# Read directory data, return hash reference.
+
+sub fetch_dir {
+       my $dir = shift;
+
+       return $dircache->{$dir} if ($dircache->{$dir});
+
+       print "$dir not cached, fetching from database.\n" if ($verbose);
+       my $data = {};
+       my $fmax = 0;
+
+       my $dl = length($dir);
+
+       print STDERR "? - 1: ftime = $ftime\n" if ($debug);
+       print STDERR "? - 2: client = $client\n" if ($debug);
+       print STDERR "? - 3: jobname = $jobname\n" if ($debug);
+       print STDERR "? - 4: rtime = $rtime\n" if ($debug);
+       print STDERR "? - 5: dir = $dir\n" if ($debug);
+       print STDERR "? - 6, 7: dl = $dl, $dl\n" if ($debug);
+       print STDERR "? - 8: ftime = $ftime\n" if ($debug);
+       print STDERR "? - 9: client = $client\n" if ($debug);
+       print STDERR "? - 10: jobname = $jobname\n" if ($debug);
+       print STDERR "? - 11: rtime = $rtime\n" if ($debug);
+       print STDERR "? - 12: dir = $dir\n" if ($debug);
+
+       print STDERR "DBG: Execute - $queries{$db}->{'dir'}\n" if ($debug);
+       $dir_sth->execute(
+               $ftime,
+               $client,
+               $jobname,
+               $rtime,
+               $dir,
+               $dl, $dl,
+               $ftime,
+               $client,
+               $jobname,
+               $rtime,
+               $dir
+       ) || die "Can't execute $queries{$db}->{'dir'}\n";
+
+       while (my $ref = $dir_sth->fetchrow_hashref) {
+               my $file = $$ref{name};
+               print STDERR "DBG: File $file found in database.\n" if ($debug);
+               my $l = length($file);
+               $fmax = $l if ($l > $fmax);
+
+               $data->{$file} = &create_file_entry(
+                       $file,
+                       $ref->{'fileid'},
+                       $ref->{'fileindex'},
+                       $ref->{'jobid'},
+                       $ref->{'visible'},
+                       $ref->{'lstat'}
+               );
+       }
+
+       return undef if (!$fmax);
+
+       $dircache->{$dir} = $data if ($usecache);
+       return $data;
+}
+
+sub cache_catalog {
+       print "Loading entire catalog, please wait...\n";
+       my $sth = $dbh->prepare($queries{$db}->{'cache'})
+               || die "Can't prepare $queries{$db}->{'cache'}\n";
+       print STDERR "DBG: Execute - $queries{$db}->{'cache'}\n" if ($debug);
+       $sth->execute($ftime, $client, $jobname, $rtime, $ftime)
+               || die "Can't execute $queries{$db}->{'cache'}\n";
+
+       print "Query complete, building catalog cache...\n" if ($verbose);
+
+       while (my $ref = $sth->fetchrow_hashref) {
+               my $dir = $ref->{path};
+               my $file = $ref->{name};
+               print STDERR "DBG: File $dir$file found in database.\n" if ($debug);
+
+               next if ($dir eq '/' and $file eq '');  # Skip data for /
+
+               # Rearrange directory
+
+               if ($file eq '' and $dir =~ m|(.*/)([^/]+/)$|) {
+                       $dir = $1;
+                       $file = $2;
+               }
+
+               my $data = &create_file_entry(
+                       $file,
+                       $ref->{'fileid'},
+                       $ref->{'fileindex'},
+                       $ref->{'jobid'},
+                       $ref->{'visible'},
+                       $ref->{'lstat'}
+               );
+
+               $dircache->{$dir} = {} if (!$dircache->{$dir});
+               $dircache->{$dir}->{$file} = $data;
+       }
+
+       $sth->finish();
+}
+
+# Break a path up into dir and file.
+
+sub path_parts {
+       my $path = shift;
+       my $fqdir;
+       my $dir;
+       my $file;
+
+       if (substr($path, 0, 1) eq '/') {
+
+               # Find dir vs. file
+               if ($path =~ m|^(/.*/)([^/]*$)|) {
+                       $fqdir = $dir = $1;
+                       $file = $2;
+               }
+               else { # Must be in /
+                       $fqdir = $dir = '/';
+                       $file = substr($path, 1);
+               }
+
+               print STDERR "DBG: / Dir - $dir; file = $file\n" if ($debug);
+       }
+       # relative path
+       elsif ($path =~ m|^(.*/)([^/]*)$|) {
+               $fqdir = "$cwd$1";
+               $dir = $1;
+               $file = $2;
+               print STDERR "DBG: Dir - $dir; file = $file\n" if ($debug);
+       }
+       # File is in our current directory.
+       else {
+               $fqdir = $cwd;
+               $dir = '';
+               $file = $path;
+               print STDERR "DBG: Set dir to $dir\n" if ($debug);
+       }
+       
+       return ($fqdir, $dir, $file);
+}
+
+sub lookup_client {
+       my $c = shift;
+
+       if (!$clients) {
+               $clients = {};
+               my $query = "select clientid, name from Client";
+               my $sth = $dbh->prepare($query) || die "Can't prepare $query\n";
+               $sth->execute || die "Can't execute $query\n";
+
+               while (my $ref = $sth->fetchrow_hashref) {
+                       $clients->{$ref->{'name'}} = $ref->{'clientid'};
+               }
+
+               $sth->finish;
+       }
+
+       if ($c !~ /^\d+$/) {
+
+               if ($clients->{$c}) {
+                       $c = $clients->{$c};
+               }
+               else {
+                       warn "Could not find client $c\n";
+                       $c = $client;
+               }
+
+       }
+
+       return $c;
+}
+
+sub setjob {
+
+       if (!$jobs) {
+               $jobs = {};
+               my $query = "select distinct name from Job order by name";
+               my $sth = $dbh->prepare($query) || die "Can't prepare $query\n";
+               $sth->execute || die "Can't execute $query\n";
+
+               while (my $ref = $sth->fetchrow_hashref) {
+                       $jobs->{$$ref{'name'}} = $$ref{'name'};
+               }
+
+               $sth->finish;
+       }
+
+       my $query = "select
+               jobtdate
+       from
+               Job
+       where
+               jobtdate <= $rtime and
+               name = '$jobname' and
+               level = 'F'
+       order by jobtdate desc
+       limit 1
+       ";
+
+       my $sth = $dbh->prepare($query) || die "Can't prepare $query\n";
+       $sth->execute || die "Can't execute $query\n";
+
+       if ($sth->rows == 1) {  
+               my $ref = $sth->fetchrow_hashref;
+               $ftime = $$ref{jobtdate};
+       }
+       else {
+               warn "Could not find full backup. Setting full time to 0.\n";
+               $ftime = 0;
+       }
+
+       $sth->finish;
+}
+
+sub select_files {
+       my $mark = shift;
+       my $opts = shift;
+       my $dir = shift;
+       my @flist = @_;
+
+       if (!@flist) {
+
+               if ($cwd eq '/') {
+                       my $finfo = &fetch_dir('/');
+                       @flist = keys %$finfo;
+               }
+               else {
+                       @flist = ($cwd);
+               }
+
+       }
+
+       foreach my $f (@flist) {
+               $f =~ s|/+$||;
+               my $path = (substr($f, 0, 1) eq '/') ? $f : "$dir$f";
+               my ($fqdir, $dir, $file) = &path_parts($path);
+               my $finfo = &fetch_dir($fqdir);
+
+               if (!$finfo->{$file}) {
+
+                       if (!$finfo->{"$file/"}) {
+                               warn "$f: File not found.\n";
+                               next;
+                       }
+
+                       $file .= '/';
+               }
+
+               my $info = $finfo->{$file};
+
+               my $fid = $info->{'fileid'};
+               my $fidx = $info->{'fileindex'};
+               my $jid = $info->{'jobid'};
+               my $size = $info->{'lstat'}->{'st_size'};
+
+               if ($opts->{'all'} || $info->{'visible'}) {
+                       print STDERR "DBG: $file - $size bytes\n"
+                               if ($debug);
+
+                       if ($mark) {
+
+                               if (!$restore{$fid}) {
+                                       print "Adding $fqdir$file\n" if (!$opts->{'quiet'});
+                                       $restore{$fid} = [$jid, $fidx];
+                                       $rnum++;
+                                       $rbytes += $size;
+                               }
+
+                       }
+                       else {
+
+                               if ($restore{$fid}) {
+                                       print "Removing $fqdir$file\n" if (!$opts->{'quiet'});
+                                       delete $restore{$fid};
+                                       $rnum--;
+                                       $rbytes -= $size;
+                               }
+
+                       }
+
+                       if ($file =~ m|/$|) {
+
+                               # Use preloaded files if we already retrieved them.
+                               if ($preload) {
+                                       my $newdir = "$dir$file";
+                                       my $finfo = &fetch_dir($newdir);
+                                       &select_files($mark, $opts, $newdir, keys %$finfo);
+                                       next;
+                               }
+                               else {
+                                       my $newdir = "$fqdir$file";
+                                       my $begin = ($opts->{'all'}) ? 0 : $ftime;
+
+                                       print STDERR "DBG: Execute - $queries{$db}->{'sel'}\n"
+                                               if ($debug);
+
+                                       $sel_sth->execute(
+                                               $client,
+                                               $jobname,
+                                               $rtime,
+                                               $begin,
+                                               $newdir,
+                                               $client,
+                                               $jobname,
+                                               $rtime,
+                                               $begin,
+                                               $newdir
+                                       ) || die "Can't execute $queries{$db}->{'sel'}\n";
+
+                                       while (my $ref = $sel_sth->fetchrow_hashref) {
+                                               my $file = $$ref{'name'};
+                                               my $fid = $$ref{'fileid'};
+                                               my $fidx = $$ref{'fileindex'};
+                                               my $jid = $$ref{'jobid'};
+                                               my @stat_enc = split(' ', $$ref{'lstat'});
+                                               my $size = &from_base64($stat_enc[7]);
+
+                                               if ($mark) {
+
+                                                       if (!$restore{$fid}) {
+                                                               print "Adding $file\n" if (!$opts->{'quiet'});
+                                                               $restore{$fid} = [$jid, $fidx];
+                                                               $rnum++;
+                                                               $rbytes += $size;
+                                                       }
+
+                                               }
+                                               else {
+
+                                                       if ($restore{$fid}) {
+                                                               print "Removing $file\n" if (!$opts->{'quiet'});
+                                                               delete $restore{$fid};
+                                                               $rnum--;
+                                                               $rbytes -= $size;
+                                                       }
+
+                                               }
+
+                                       }
+
+                               }
+
+                       }
+
+               }
+
+       }
+
+}
+
+# Expand shell wildcards
+
+sub expand_files {
+       my $path = shift;
+       my ($fqdir, $dir, $file) = &path_parts($path);
+       my $finfo = &fetch_dir($fqdir);
+       return ($path) if (!$finfo);
+
+       my $pat = "^$file\$";
+
+       # Add / for dir match
+       my $dpat = $file;
+       $dpat =~ s|/+$||;
+       $dpat = "^$dpat/\$";
+
+       my @match;
+
+       $pat =~ s/\./\\./g;
+       $dpat =~ s/\./\\./g;
+       $pat =~ s/\?/./g;
+       $dpat =~ s/\?/./g;
+       $pat =~ s/\*/.*/g;
+       $dpat =~ s/\*/.*/g;
+
+       foreach my $f (sort keys %$finfo) {
+
+               if ($f =~ /$pat/) {
+                       push (@match, ($fqdir eq $cwd) ? $f : "$fqdir$f");
+               }
+               elsif ($f =~ /$dpat/) {
+                       push (@match, ($fqdir eq $cwd) ? $f : "$fqdir$f");
+               }
+
+       }
+
+       return ($path) if (!@match);
+       return @match;
+}
+
+sub expand_dirs {
+       my $path = shift;
+       my ($fqdir, $dir, $file) = &path_parts($path, 1);
+
+       print STDERR "Expand $path\n" if ($debug);
+
+       my $finfo = &fetch_dir($fqdir);
+       return ($path) if (!$finfo);
+
+       $file =~ s|/+$||;
+
+       my $pat = "^$file/\$";
+       my @match;
+
+       $pat =~ s/\./\\./g;
+       $pat =~ s/\?/./g;
+       $pat =~ s/\*/.*/g;
+
+       foreach my $f (sort keys %$finfo) {
+               print STDERR "Match $f to $pat\n" if ($debug);
+               push (@match, ($fqdir eq $cwd) ? $f : "$fqdir$f") if ($f =~ /$pat/);
+       }
+
+       return ($path) if (!@match);
+       return @match;
+}
+
+sub mode2str {
+       my $mode = shift;
+       my $sstr = '';
+
+       if (S_ISDIR($mode)) {
+               $sstr = 'd';
+       }
+       elsif (S_ISCHR($mode)) {
+               $sstr = 'c';
+       }
+       elsif (S_ISBLK($mode)) {
+               $sstr = 'b';
+       }
+       elsif (S_ISREG($mode)) {
+               $sstr = '-';
+       }
+       elsif (S_ISFIFO($mode)) {
+               $sstr = 'f';
+       }
+       elsif (S_ISLNK($mode)) {
+               $sstr = 'l';
+       }
+       elsif (S_ISSOCK($mode)) {
+               $sstr = 's';
+       }
+       else {
+               $sstr = '?';
+       }
+
+       $sstr .= ($mode&S_IRUSR) ? 'r' : '-';
+       $sstr .= ($mode&S_IWUSR) ? 'w' : '-';
+       $sstr .= ($mode&S_IXUSR) ?
+               (($mode&S_ISUID) ? 's' : 'x') :
+               (($mode&S_ISUID) ? 'S' : '-');
+       $sstr .= ($mode&S_IRGRP) ? 'r' : '-';
+       $sstr .= ($mode&S_IWGRP) ? 'w' : '-';
+       $sstr .= ($mode&S_IXGRP) ?
+               (($mode&S_ISGID) ? 's' : 'x') :
+               (($mode&S_ISGID) ? 'S' : '-');
+       $sstr .= ($mode&S_IROTH) ? 'r' : '-';
+       $sstr .= ($mode&S_IWOTH) ? 'w' : '-';
+       $sstr .= ($mode&S_IXOTH) ?
+               (($mode&S_ISVTX) ? 't' : 'x') :
+               (($mode&S_ISVTX) ? 'T' : '-');
+
+       return $sstr;
+}
+
+# Base 64 decoder
+# Algorithm copied from bacula source
+
+sub from_base64 {
+       my $where = shift;
+       my $val = 0;
+       my $i = 0;
+       my $neg = 0;
+
+       if (substr($where, 0, 1) eq '-') {
+               $neg = 1;
+               $where = substr($where, 1);
+       }
+
+       while ($where ne '') {
+               $val <<= 6;
+               my $d = substr($where, 0, 1);
+               #print STDERR "\n$d - " . ord($d) . " - " . $base64_map[ord($d)] . "\n";
+               $val += $base64_map[ord(substr($where, 0, 1))];
+               $where = substr($where, 1);
+       }
+
+       return $val;
+}
+
+### Command completion code
+
+sub get_match {
+       my @m = @_;
+       my $r = '';
+
+       for (my $i = 0, my $matched = 1; $i < length($m[0]) && $matched; $i++) {
+               my $c = substr($m[0], $i, 1);
+
+               for (my $j = 1; $j < @m; $j++) {
+
+                       if ($c ne substr($m[$j], $i, 1)) {
+                               $matched = 0;
+                               last;
+                       }
+
+               }
+
+               $r .= $c if ($matched);
+       }
+
+       return $r;
+}
+
+sub complete {
+       my $text = shift;
+       my $line = shift;
+       my $start = shift;
+       my $end = shift;
+
+       $tty_attribs->{'completion_append_character'} = ' ';
+       $tty_attribs->{completion_entry_function} = \&nocomplete;
+       print STDERR "\nDBG: text - $text; line - $line; start - $start; end = $end\n"
+               if ($debug);
+
+       # Complete command if we are at start of line.
+
+       if ($start == 0 || substr($line, 0, $start) =~ /^\s*$/) {
+               my @list = grep (/^$text/, sort keys %COMMANDS);
+               return () if (!@list);
+               my $match = (@list > 1) ? &get_match(@list) : '';
+               return $match, @list;
+       }
+       else {
+               # Count arguments
+               my $cstr = $line;
+               $cstr =~ s/^\s+//;      # Remove leading spaces
+
+               my ($cmd, @args) = shellwords($cstr);
+               return () if (!defined($cmd));
+
+               # Complete dirs for cd
+               if ($cmd eq 'cd') {
+                       return () if (@args > 1);
+                       return &complete_files($text, 1);
+               }
+               # Complete files/dirs for info and ls
+               elsif ($cmd =~ /^(add|delete|info|ls|mark|unmark|versions)$/) {
+                       return &complete_files($text, 0);
+               }
+               # Complete clients for client
+               elsif ($cmd eq 'client') {
+                       return () if (@args > 2);
+                       my $pat = $text;
+                       $pat =~ s/\./\\./g;
+                       my @flist;
+
+                       print STDERR "DBG: " . (@args) . " arguments found.\n" if ($debug);
+
+                       if (@args < 1 || (@args == 1 and $line =~ /[^\s]$/)) {
+                               @flist = grep (/^$pat/, sort keys %$clients);
+                       }
+                       else {
+                               @flist = grep (/^$pat/, sort keys %$jobs);
+                       }
+
+                       return () if (!@flist);
+                       my $match = (@flist > 1) ? &get_match(@flist) : '';
+
+                       #return $match, map {s/ /\\ /g; $_} @flist;
+                       return $match, @flist;
+               }
+               # Complete show options for show
+               elsif ($cmd eq 'show') {
+                       return () if (@args > 1);
+                       # attempt to suggest match.
+                       my @list = grep (/^$text/, sort keys %SHOW);
+                       return () if (!@list);
+                       my $match = (@list > 1) ? &get_match(@list) : '';
+                       return $match, @list;
+               }
+               elsif ($cmd =~ /^(bsr|bootstrap|relocate)$/) {
+                       $tty_attribs->{completion_entry_function} =
+                               $tty_attribs->{filename_completion_function};
+               }
+
+       }
+
+       return ();
+}
+
+sub complete_files {
+       my $path = shift;
+       my $dironly = shift;
+       my $finfo;
+       my @flist;
+
+       my ($fqdir, $dir, $pat) = &path_parts($path, 1);
+
+       $pat =~ s/([.\[\]\\])/\\$1/g;
+       # First check for absolute name.
+
+       $finfo = &fetch_dir($fqdir);
+       print STDERR "DBG: " . join(', ', keys %$finfo) . "\n" if ($debug);
+       return () if (!$finfo);         # Nothing if dir not found.
+
+       if ($dironly) {
+               @flist = grep (m|^$pat.*/$|, sort keys %$finfo);
+       }
+       else {
+               @flist = grep (/^$pat/, sort keys %$finfo);
+       }
+
+       return undef if (!@flist);
+
+       print STDERR "DBG: Files found\n" if ($debug);
+
+       if (@flist == 1 && $flist[0] =~ m|/$|) {
+               $tty_attribs->{'completion_append_character'} = '';
+       }
+
+       @flist = map {s/ /\\ /g; ($fqdir eq $cwd) ? $_ : "$dir$_"} @flist;
+       my $match = (@flist > 1) ? &get_match(@flist) : '';
+
+       print STDERR "DBG: Dir - $dir; cwd - $cwd\n" if ($debug);
+       # Fill in dir if necessary.
+       return $match, @flist;
+}
+
+sub nocomplete {
+       return ();
+}
+
+# subroutine to create printf format for long listing of ls
+
+sub long_fmt {
+       my $flist = shift;
+       my $fmax = 0;
+       my $lmax = 0;
+       my $umax = 0;
+       my $gmax = 0;
+       my $smax = 0;
+
+       foreach my $f (@$flist) {
+               my $file = $f->[0];
+               my $info = $f->[1];
+               my $lstat = $info->{'lstat'};
+
+               my $l = length($file);
+               $fmax = $l if ($l > $fmax);
+
+               $l = length($lstat->{'st_nlink'});
+               $lmax = $l if ($l > $lmax);
+               $l = length($lstat->{'st_uid'});
+               $umax = $l if ($l > $umax);
+               $l = length($lstat->{'st_gid'});
+               $gmax = $l if ($l > $gmax);
+               $l = length($lstat->{'st_size'});
+               $smax = $l if ($l > $smax);
+       }
+
+       return "%s %${lmax}d %${umax}d %${gmax}d %${smax}d %s %s\n";
+}
+
+sub print_by_cols {
+       my @list = @_;
+       my $l = @list;
+       my $w = $term->get_screen_size;
+       my @wds = (1);
+       my $m = $w/3 + 1;
+       my $max_cols = ($m < @list) ? $w : @list;
+       my $fpc = 1;
+       my $cols = 1;
+
+       print STDERR "Need to print $l files\n" if ($debug);
+
+       while($max_cols > 1) {
+               my $used = 0;
+
+               # Initialize array of widths
+               @wds = 0 x $max_cols;
+
+               for ($cols = 0; $cols < $max_cols && $used < $w; $cols++) {
+                       my $cw = 0;
+
+                       for (my $j = $cols*$fpc; $j < ($cols + 1)*$fpc && $j < $l; $j++ ) {
+                               my $fl = length($list[$j]->[0]);
+                               $cw = $fl if ($fl > $cw);
+                       }
+
+                       $wds[$cols] = $cw;
+                       $used += $cw;
+                       print STDERR "DBG: Total so far is $used\n" if ($debug);
+
+                       if ($used >= $w) {
+                               $cols++;
+                               last;
+                       }
+
+                       $used += 3;
+               }
+
+               print STDERR "DBG: $cols of $max_cols columns uses $used space.\n"
+                       if ($debug);
+
+               print STDERR "DBG: Print $fpc files per column\n"
+                       if ($debug);
+
+               last if ($used <= $w && $cols == $max_cols);
+               $fpc = int($l/$cols);
+               $fpc++ if ($l % $cols);
+               $max_cols = $cols - 1;
+       }
+
+       if ($max_cols == 1) {
+               $cols = 1;
+               $fpc = $l;
+       }
+
+       print STDERR "Print out $fpc rows with $cols columns\n"
+               if ($debug);
+
+       for (my $i = 0; $i < $fpc; $i++) {
+
+               for (my $j = $i; $j < $fpc*$cols; $j += $fpc) {
+                       my $cw = $wds[($j - $i)/$fpc];
+                       my $fmt = "%s%-${cw}s";
+                       my $file;
+                       my $r;
+
+                       if ($j < @list) {
+                               $file = $list[$j]->[0];
+                               my $fdata = $list[$j]->[1];
+                               $r = ($restore{$fdata->{'fileid'}}) ? '+' : ' ';
+                       }
+                       else {
+                               $file = '';
+                               $r = ' ';
+                       }
+
+                       print '  ' if ($i != $j);
+                       printf $fmt, $r, $file;
+               }
+
+               print "\n";
+       }
+
+}
+
+sub ls_date {
+       my $seconds = shift;
+       my $date;
+
+       if (abs(time() - $seconds) > 15724800) {
+               $date = time2str('%b %e  %Y', $seconds);
+       }
+       else {
+               $date = time2str('%b %e %R', $seconds);
+       }
+
+       return $date;
+}
+
+# subroutine to load entire bacula database.
+=head1 SHELL
+
+Once running, B<recover.pl> will present the user with a shell like
+environment where file can be exampled and selected for recover. The
+shell will provide command history and editing and if you have the
+Gnu readline module installed on your system, it will also provide
+command completion. When interacting with files, wildcards should work
+as expected.
+
+The following commands are understood.
+
+=cut
+
+sub parse_command {
+       my $cstr = shift;
+       my @command;
+       my $cmd;
+       my @args;
+
+       # Nop on blank or commented lines
+       return ('nop') if ($cstr =~ /^\s*$/);
+       return ('nop') if ($cstr =~ /^\s*#/);
+
+       # Get rid of leading white space to make shellwords work better
+       $cstr =~ s/^\s*//;
+
+       ($cmd, @args) = shellwords($cstr);
+
+       if (!defined($cmd)) {
+               warn "Could not warse $cstr\n";
+               return ('nop');
+       }
+
+=head2 add [I<filelist>]
+
+Mark I<filelist> for recovery. If I<filelist> is not specified, mark all
+files in the current directory. B<mark> is an alias for this command.
+
+=cut
+       elsif ($cmd eq 'add' || $cmd eq 'mark') {
+               my $options = {};
+               @ARGV = @args;
+
+               # Parse ls options
+               my $vars = {};
+               getopts("aq", $vars) || return ('error', 'Add: Usage add [-q|-a] files');
+               $options->{'all'} = $vars->{'a'};
+               $options->{'quiet'} =$vars->{'q'}; 
+
+
+               @command = ('add', $options);
+
+               foreach my $a (@ARGV) {
+                       push(@command, &expand_files($a));
+               }
+
+       }
+
+=head2 bootstrap I<bootstrapfile>
+
+Create a bootstrap file suitable for use with the bacula B<bextract>
+command. B<bsr> is an alias for this command.
+
+=cut
+       elsif ($cmd eq 'bootstrap' || $cmd eq 'bsr') {
+               return ('error', 'bootstrap takes single argument (file to write to)')
+                       if (@args != 1);
+               @command = ('bootstrap', $args[0]);
+       }
+
+=head2 cd I<directory>
+
+Allows you to set your current directory. This command understands . for
+the current directory and .. for the parent. Also, cd - will change you
+back to the previous directory you were in.
+
+=cut
+       elsif ($cmd eq 'cd') {
+               # Cd with no args goes to /
+               @args = ('/') if (!@args);
+
+               if (@args != 1) {
+                       return ('error', 'Bad cd. cd requires 1 and only 1 argument.');
+               }
+
+               my $todir = $args[0];
+
+               # cd - should cd to previous directory. It is handled later.
+               return ('cd', '-') if ($todir eq '-');
+
+               # Expand wilecards
+               my @e = expand_dirs($todir);
+
+               if (@e > 1) {
+                       return ('error', 'Bad cd. Wildcard expands to more than 1 dir.');
+               }
+
+               $todir = $e[0];
+
+               print STDERR "Initial target is $todir\n" if ($debug);
+
+               # remove prepended .
+
+               while ($todir =~ m|^\./(.*)|) {
+                       $todir = $1;
+                       $todir = '.' if (!$todir);
+               }
+
+               # If only . is left, replace with current directory.
+               $todir = $cwd if ($todir eq '.');
+               print STDERR "target after . processing is $todir\n" if ($debug);
+
+               # Now deal with ..
+               my $prefix = $cwd;
+
+               while ($todir =~ m|^\.\./(.*)|) {
+                       $todir = $1;
+                       print STDERR "DBG: ../ found, new todir - $todir\n" if ($debug);
+                       $prefix =~ s|/[^/]*/$|/|;
+               }
+
+               if ($todir eq '..') {
+                       $prefix =~ s|/[^/]*/$|/|;
+                       $todir = '';
+               }
+
+               print STDERR "target after .. processing is $todir\n" if ($debug);
+               print STDERR "DBG: Final prefix - $prefix\n" if ($debug);
+
+               $todir = "$prefix$todir" if ($prefix ne $cwd);
+
+               print STDERR "DBG: todir after .. handling - $todir\n" if ($debug);
+
+               # Turn relative directories into absolute directories.
+
+               if (substr($todir, 0, 1) ne '/') {
+                       print STDERR "DBG: $todir has no leading /, prepend $cwd\n" if ($debug);
+                       $todir = "$cwd$todir";
+               }
+
+               # Make sure we have a trailing /
+
+               if (substr($todir, length($todir) - 1) ne '/') {
+                       print STDERR "DBG: No trailing /, append /\n" if ($debug);
+                       $todir .= '/';
+               }
+
+               @command = ('cd', $todir);
+       }
+
+=head2 changetime I<timespec>
+
+This command changes the time used in generating the view of the
+filesystem. Files that were backed up before the specified time
+(optionally until the next full backup) will be the only files seen.
+
+The time can be specifed in almost any reasonable way. Here are a few
+examples:
+
+=over 4
+
+=item 1/1/2006
+
+=item yesterday
+
+=item sunday
+
+=item 5 days ago
+
+=item last month
+
+=back
+
+=cut
+       elsif ($cmd eq 'changetime') {
+               @command = ($cmd, join(' ', @args));
+       }
+
+=head2 client I<clientname> I<jobname>
+
+Specify the client and jobname to view.
+
+=cut
+       elsif ($cmd eq 'client') {
+
+               if (@args != 2) {
+                       return ('error', 'client takes a two arguments client-name job-name');
+               }
+
+               @command = ('client', @args);
+       }
+
+=head2 debug
+
+Toggle debug flag.
+
+=cut
+       elsif ($cmd eq 'debug') {
+               @command = ('debug');
+       }
+
+=head2 delete [I<filelist>]
+
+Un-mark file that were previous marked for recovery.  If I<filelist> is
+not specified, mark all files in the current directory. B<unmark> is an
+alias for this command.
+
+=cut
+       elsif ($cmd eq 'delete' || $cmd eq 'unmark') {
+               @command = ('delete');
+
+               foreach my $a (@args) {
+                       push(@command, &expand_files($a));
+               }
+
+       }
+
+=head2 help
+
+Show list of command with brief description of what they do.
+
+=cut
+       elsif ($cmd eq 'help') {
+               @command = ('help');
+       }
+
+=head2 history
+
+Display command line history. B<h> is an alias for this command.
+
+=cut
+       elsif ($cmd eq 'h' || $cmd eq 'history') {
+               @command = ('history');
+       }
+
+=head2 info [I<filelist>]
+
+Display information about the specified files. The format of the
+information provided is reminiscent of the bootstrap file.
+
+=cut
+       elsif ($cmd eq 'info') {
+               push(@command, 'info');
+
+               foreach my $a (@args) {
+                       push(@command, &expand_files($a));
+               }
+
+       }
+
+=head2 ls [I<filelist>]
+
+This command will list the specified files (defaults to all files in
+the current directory). Files are sorted alphabetically be default. It
+understand the following options.
+
+=over 4
+
+=item -a
+
+Causes ls to list files even if they are only on backups preceding the
+closest full backup to the currently selected date/time.
+
+=item -l
+
+List files in long format (like unix ls command).
+
+=item -r
+
+reverse direction of sort.
+
+=item -S
+
+Sort files by size.
+
+=item -t
+
+Sort files by time
+
+=back
+
+=cut
+       elsif ($cmd eq 'ls' || $cmd eq 'dir' || $cmd eq 'll') {
+               my $options = {};
+               @ARGV = @args;
+
+               # Parse ls options
+               my $vars = {};
+               getopts("altSr", $vars) || return ('error', 'Bad ls usage.');
+               $options->{'all'} = $vars->{'a'};
+               $options->{'long'} = $vars->{'l'};
+               $options->{'long'} = 1 if ($cmd eq 'dir' || $cmd eq 'll');
+
+               $options->{'sort'} = 'time' if ($vars->{'t'});
+
+               return ('error', 'Only one sort at a time allowed.')
+                       if ($options->{'sort'} && ($vars->{'S'}));
+
+               $options->{'sort'} = 'size' if ($vars->{'S'});
+               $options->{'sort'} = 'alpha' if (!$options->{'sort'});
+
+               $options->{'sort'} = 'r' . $options->{'sort'} if ($vars->{'r'});
+
+               @command = ('ls', $options);
+
+               foreach my $a (@ARGV) {
+                       push(@command, &expand_files($a));
+               }
+
+       }
+
+=head2 pwd
+
+Show current directory.
+
+=cut
+       elsif ($cmd eq 'pwd') {
+               @command = ('pwd');
+       }
+
+=head2 quit
+
+Exit program.
+
+B<q>, B<exit> and B<x> are all aliases for this command.
+
+=cut
+       elsif ($cmd eq 'quit' || $cmd eq 'q' || $cmd eq 'exit' || $cmd eq 'x') {
+               @command = ('quit');
+       }
+
+=head2 recover
+
+This command creates a table in the bacula catalog that case be used to
+restore the selected files. It will also display the command to enter
+into bconsole to start the restore.
+
+=cut
+       elsif ($cmd eq 'recover') {
+               @command = ('recover');
+       }
+
+=head2 relocate I<directory>
+
+Specify the directory to restore files to. Defaults to /.
+
+=cut
+       elsif ($cmd eq 'relocate') {
+               return ('error', 'relocate required a single directory to relocate to')
+                       if (@args != 1);
+
+               my $todir = $args[0];
+               $todir = `pwd` . $todir if (substr($todir, 0, 1) ne '/');
+               @command = ('relocate', $todir);
+       }
+
+=head2 show I<item>
+
+Show various information about B<recover.pl>. The following items can be specified.
+
+=over 4
+
+=item cache
+
+Display's a list of cached directories.
+
+=item catalog
+
+Displays the name of the catalog we are talking to.
+
+=item client
+
+Display current client and job named that are being viewed.
+
+=item restore
+
+Display the number of files and size to be restored.
+
+=item volumes
+
+Display the volumes that will be required to perform a restore on the
+selected files.
+
+=back
+
+=cut
+       elsif ($cmd eq 'show') {
+               return ('error', 'show takes a single argument') if (@args != 1);
+               @command = ('show', $args[0]);
+       }
+
+=head2 verbose
+
+Toggle verbose flag.
+
+=cut
+       elsif ($cmd eq 'verbose') {
+               @command = ('verbose');
+       }
+
+=head2 versions [I<filelist>]
+
+View all version of specified files available from the current
+time. B<ver> is an alias for this command.
+
+=cut
+       elsif ($cmd eq 'versions' || $cmd eq 'ver') {
+               push(@command, 'versions');
+
+               foreach my $a (@args) {
+                       push(@command, &expand_files($a));
+               }
+
+       }
+
+=head2 volumes
+
+Display the volumes that will be required to perform a restore on the
+selected files.
+
+=cut
+       elsif ($cmd eq 'volumes') {
+               @command = ('volumes');
+       }
+       else {
+               @command = ('error', "$cmd: Unknown command");
+       }
+
+       return @command;
+}
+
+##############################################################################
+### Command processing
+##############################################################################
+
+# Add files to restore list.
+
+sub cmd_add {
+       my $opts = shift;
+       my @flist = @_;
+
+       my $save_rnum = $rnum;
+       &select_files(1, $opts, $cwd, @flist);
+       print "" . ($rnum - $save_rnum) . " files marked for restore\n";
+}
+
+sub cmd_bootstrap {
+       my $bsrfile = shift;
+       my %jobs;
+       my @media;
+       my %bootstrap;
+
+       # Get list of job ids to restore from.
+
+       foreach my $fid (keys %restore) {
+               $jobs{$restore{$fid}->[0]} = 1;
+       }
+
+       my $jlist = join(', ', sort keys %jobs);
+
+       if (!$jlist) {
+               print "Nothing to restore.\n";
+               return;
+       }
+
+       # Read in media info
+
+       my $query = "select
+               Job.jobid,
+               volumename,
+               mediatype,
+               volsessionid,
+               volsessiontime,
+               firstindex,
+               lastindex,
+               startfile as volfile,
+               JobMedia.startblock,
+               JobMedia.endblock,
+               volindex
+       from
+               Job,
+               Media,
+               JobMedia
+       where
+               Job.jobid in ($jlist) and
+               Job.jobid = JobMedia.jobid and
+               JobMedia.mediaid = Media.mediaid
+       order by
+               volumename,
+               volsessionid,
+               volindex
+       ";
+
+       my $sth = $dbh->prepare($query) || die "Can't prepare $query\n";
+       $sth->execute || die "Can't execute $query\n";
+
+       while (my $ref = $sth->fetchrow_hashref) {
+               push(@media, {
+                       'jobid' => $ref->{'jobid'},
+                       'volumename' => $ref->{'volumename'},
+                       'mediatype' => $ref->{'mediatype'},
+                       'volsessionid' => $ref->{'volsessionid'},
+                       'volsessiontime' => $ref->{'volsessiontime'},
+                       'firstindex' => $ref->{'firstindex'},
+                       'lastindex' => $ref->{'lastindex'},
+                       'volfile' => $ref->{'volfile'},
+                       'startblock' => $ref->{'startblock'},
+                       'endblock' => $ref->{'endblock'},
+                       'volindex' => $ref->{'volindex'}
+               });
+       }
+
+# Gather bootstrap info
+#
+#  key - jobid.volumename.volumesession.volindex
+#     job
+#     name
+#     type
+#     session
+#     time
+#     file
+#     startblock
+#     endblock
+#     array of file indexes.
+
+       for my $info (values %restore) {
+               my $jobid = $info->[0];
+               my $fidx = $info->[1];
+
+               foreach my $m (@media) {
+
+                       if ($jobid == $m->{'jobid'} && $fidx >= $m->{'firstindex'} && $fidx <= $m->{'lastindex'}) {
+                               my $key = "$jobid.";
+                               $key .= "$m->{volumename}.$m->{volsessionid}.$m->{volindex}";
+
+                               $bootstrap{$key} = {
+                                       'job' => $jobid,
+                                       'name' => $m->{'volumename'},
+                                       'type' => $m->{'mediatype'},
+                                       'session' => $m->{'volsessionid'},
+                                       'index' => $m->{'volindex'},
+                                       'time' => $m->{'volsessiontime'},
+                                       'file' => $m->{'volfile'},
+                                       'startblock' => $m->{'startblock'},
+                                       'endblock' => $m->{'endblock'}
+                               }
+                               if (!$bootstrap{$key});
+
+                               $bootstrap{$key}->{'files'} = []
+                                       if (!$bootstrap{$key}->{'files'});
+                               push(@{$bootstrap{$key}->{'files'}}, $fidx);
+                       }
+
+               }
+
+       }
+
+       # print bootstrap
+
+       print STDERR "DBG: Keys = " . join(', ', keys %bootstrap) . "\n"
+               if ($debug);
+
+       my @keys = sort {
+               return $bootstrap{$a}->{'time'} <=> $bootstrap{$b}->{'time'}
+                       if ($bootstrap{$a}->{'time'} != $bootstrap{$b}->{'time'});
+               return $bootstrap{$a}->{'name'} cmp $bootstrap{$b}->{'name'}
+                       if ($bootstrap{$a}->{'name'} ne $bootstrap{$b}->{'name'});
+               return $bootstrap{$a}->{'session'} <=> $bootstrap{$b}->{'session'}
+                       if ($bootstrap{$a}->{'session'} != $bootstrap{$b}->{'session'});
+               return $bootstrap{$a}->{'index'} <=> $bootstrap{$b}->{'index'};
+       } keys %bootstrap;
+
+       if (!open(BSR, ">$bsrfile")) {
+               warn "$bsrfile: $|\n";
+               return;
+       }
+
+       foreach my $key (@keys) {
+               my $info = $bootstrap{$key};
+               print BSR "Volume=\"$info->{name}\"\n";
+               print BSR "MediaType=\"$info->{type}\"\n";
+               print BSR "VolSessionId=$info->{session}\n";
+               print BSR "VolSessionTime=$info->{time}\n";
+               print BSR "VolFile=$info->{file}\n";
+               print BSR "VolBlock=$info->{startblock}-$info->{endblock}\n";
+
+               my @fids = sort { $a <=> $b} @{$bootstrap{$key}->{'files'}};
+               my $first;
+               my $prev;
+
+               for (my $i = 0; $i < @fids; $i++) {
+                       $first = $fids[$i] if (!$first);
+
+                       if ($prev) {
+
+                               if ($fids[$i] != $prev + 1) {
+                                       print BSR "FileIndex=$first";
+                                       print BSR "-$prev" if ($first != $prev);
+                                       print BSR "\n";
+                                       $first = $fids[$i];
+                               }
+
+                       }
+
+                       $prev = $fids[$i];
+               }
+
+               print BSR "FileIndex=$first";
+               print BSR "-$prev" if ($first != $prev);
+               print BSR "\n";
+               print BSR "Count=" . (@fids) . "\n";
+       }
+
+       close(BSR);
+}
+
+# Change directory
+
+sub cmd_cd {
+       my $dir = shift;
+
+       my $save = $files;
+
+       $dir = $lwd if ($dir eq '-' && defined($lwd));
+
+       if ($dir ne '-') {
+               $files = &fetch_dir($dir);
+       }
+       else {
+               warn "Previous director not defined.\n";
+       }
+
+       if ($files) {
+               $lwd = $cwd;
+               $cwd = $dir;
+       }
+       else {
+               print STDERR "Could not locate directory $dir\n";
+               $files = $save;
+       }
+
+       $cwd = '/' if (!$cwd);
+}
+
+sub cmd_changetime {
+       my $tstr = shift;
+
+       if (!$tstr) {
+               print "Time currently set to " . localtime($rtime) . "\n";
+               return;
+       }
+
+       my $newtime = parsedate($tstr, FUZZY => 1, PREFER_PAST => 1);
+
+       if (defined($newtime)) {
+               print STDERR "Time evaluated to $newtime\n" if ($debug);
+               $rtime = $newtime;
+               print "Setting date/time to " . localtime($rtime) . "\n";
+               &setjob;
+
+               # Clean cache.
+               $dircache = {};
+               &cache_catalog if ($preload);
+
+               # Get directory based on new time.
+               $files = &fetch_dir($cwd);
+       }
+       else {
+               print STDERR "Could not parse $tstr as date/time\n";
+       }
+
+}
+
+# Change client
+
+sub cmd_client {
+       my $c = shift;
+       $jobname = shift;               # Set global job name
+
+       # Lookup client id.
+       $client = &lookup_client($c);
+
+       # Clear cache, we changed machines/jobs
+       $dircache = {};
+       &cache_catalog if ($preload);
+
+       # Find last full backup time.
+       &setjob;
+
+       # Get current directory on new client.
+       $files = &fetch_dir($cwd);
+
+       # Clear restore info
+       $rnum = 0;
+       $rbytes = 0;
+       %restore = ();
+}
+
+sub cmd_debug {
+       $debug = 1 - $debug;
+}
+
+sub cmd_delete {
+       my @flist = @_;
+       my $opts = {quiet=>1};
+
+       my $save_rnum = $rnum;
+       &select_files(0, $opts, $cwd, @flist);
+       print "" . ($save_rnum - $rnum) . " files un-marked for restore\n";
+}
+
+sub cmd_help {
+
+       foreach my $h (sort keys %COMMANDS) {
+               printf "%-12s %s\n", $h, $COMMANDS{$h};
+       }
+
+}
+
+sub cmd_history {
+
+       foreach my $h ($term->GetHistory) {
+               print "$h\n";
+       }
+
+}
+
+# Print catalog/tape info about files
+
+sub cmd_info {
+       my @flist = @_;
+       @flist = ($cwd) if (!@flist);
+
+       foreach my $f (@flist) {
+               $f =~ s|/+$||;
+               my ($fqdir, $dir, $file) = &path_parts($f);
+               my $finfo = &fetch_dir($fqdir);
+
+               if (!$finfo->{$file}) {
+
+                       if (!$finfo->{"$file/"}) {
+                               warn "$f: File not found.\n";
+                               next;
+                       }
+
+                       $file .= '/';
+               }
+
+               my $fileid = $finfo->{$file}->{fileid};
+               my $fileindex = $finfo->{$file}->{fileindex};
+               my $jobid = $finfo->{$file}->{jobid};
+
+               print "#$f -\n";
+               print "#FileID   : $finfo->{$file}->{fileid}\n";
+               print "#JobID    : $jobid\n";
+               print "#Visible  : $finfo->{$file}->{visible}\n";
+
+               my $query = "select
+                       volumename,
+                       mediatype,
+                       volsessionid,
+                       volsessiontime,
+                       startfile,
+                       JobMedia.startblock,
+                       JobMedia.endblock
+               from
+                       Job,
+                       Media,
+                       JobMedia
+               where
+                       Job.jobid = $jobid and
+                       Job.jobid = JobMedia.jobid and
+                       $fileindex >= firstindex and
+                       $fileindex <= lastindex and
+                       JobMedia.mediaid = Media.mediaid
+               ";
+
+               my $sth = $dbh->prepare($query) || die "Can't prepare $query\n";
+               $sth->execute || die "Can't execute $query\n";
+
+               while (my $ref = $sth->fetchrow_hashref) {
+                       print "Volume=\"$ref->{volumename}\"\n";
+                       print "MediaType=\"$ref->{mediatype}\"\n";
+                       print "VolSessionId=$ref->{volsessionid}\n";
+                       print "VolSessionTime=$ref->{volsessiontime}\n";
+                       print "VolFile=$ref->{startfile}\n";
+                       print "VolBlock=$ref->{startblock}-$ref->{endblock}\n";
+                       print "FileIndex=$finfo->{$file}->{fileindex}\n";
+                       print "Count=1\n";
+               }
+
+               $sth->finish;
+       }
+
+}
+
+# List files.
+
+sub cmd_ls {
+       my $opts = shift;
+       my @flist = @_;
+       my @keys;
+
+       print STDERR "DBG: " . (@flist) . " files to list.\n" if ($debug);
+
+       if (!@flist) {
+               @flist = keys %$files;
+       }
+
+       # Sort files as specified.
+
+       if ($opts->{sort} eq 'alpha') {
+               print STDERR "DBG: Sort by alpha\n" if ($debug);
+               @keys = sort @flist;
+       }
+       elsif ($opts->{sort} eq 'ralpha') {
+               print STDERR "DBG: Sort by reverse alpha\n" if ($debug);
+               @keys = sort {$b cmp $a} @flist;
+       }
+       elsif ($opts->{sort} eq 'time') {
+               print STDERR "DBG: Sort by time\n" if ($debug);
+               @keys = sort {
+                       return $a cmp $b
+                               if ($files->{$b}->{'lstat'}->{'st_mtime'} ==
+                                       $files->{$a}->{'lstat'}->{'st_mtime'});
+                       $files->{$b}->{'lstat'}->{'st_mtime'} <=>
+                       $files->{$a}->{'lstat'}->{'st_mtime'}
+               } @flist;
+       }
+       elsif ($opts->{sort} eq 'rtime') {
+               print STDERR "DBG: Sort by reverse time\n" if ($debug);
+               @keys = sort {
+                       return $b cmp $a
+                               if ($files->{$a}->{'lstat'}->{'st_mtime'} ==
+                                       $files->{$b}->{'lstat'}->{'st_mtime'});
+                       $files->{$a}->{'lstat'}->{'st_mtime'} <=>
+                       $files->{$b}->{'lstat'}->{'st_mtime'}
+               } @flist;
+       }
+       elsif ($opts->{sort} eq 'size') {
+               print STDERR "DBG: Sort by size\n" if ($debug);
+               @keys = sort {
+                       return $a cmp $b
+                               if ($files->{$a}->{'lstat'}->{'st_size'} ==
+                                       $files->{$b}->{'lstat'}->{'st_size'});
+                       $files->{$b}->{'lstat'}->{'st_size'} <=>
+                       $files->{$a}->{'lstat'}->{'st_size'}
+               } @flist;
+       }
+       elsif ($opts->{sort} eq 'rsize') {
+               print STDERR "DBG: Sort by reverse size\n" if ($debug);
+               @keys = sort {
+                       return $b cmp $a
+                               if ($files->{$a}->{'lstat'}->{'st_size'} ==
+                                       $files->{$b}->{'lstat'}->{'st_size'});
+                       $files->{$a}->{'lstat'}->{'st_size'} <=>
+                       $files->{$b}->{'lstat'}->{'st_size'}
+               } @flist;
+       }
+       else {
+               print STDERR "DBG: $opts->{sort}, no sort\n" if ($debug);
+               @keys = @flist;
+       }
+
+       @flist = ();
+
+       foreach my $f (@keys) {
+               print STDERR "DBG: list $f\n" if ($debug);
+               $f =~ s|/+$||;
+               my ($fqdir, $dir, $file) = &path_parts($f);
+               my $finfo = &fetch_dir($fqdir);
+
+               if (!$finfo->{$file}) {
+
+                       if (!$finfo->{"$file/"}) {
+                               warn "$f: File not found.\n";
+                               next;
+                       }
+
+                       $file .= '/';
+               }
+
+               my $fdata = $finfo->{$file};
+
+               if ($opts->{'all'} || $fdata->{'visible'}) {
+                       push(@flist, ["$dir$file", $fdata]);
+               }
+
+       }
+
+       if ($opts->{'long'}) {
+               my $lfmt = &long_fmt(\@flist) if ($opts->{'long'});
+
+               foreach my $f (@flist) {
+                       my $file = $f->[0];
+                       my $fdata = $f->[1];
+                       my $r = ($restore{$fdata->{'fileid'}}) ? '+' : ' ';
+                       my $lstat = $fdata->{'lstat'};
+
+                       printf $lfmt, $lstat->{'statstr'}, $lstat->{'st_nlink'},
+                               $lstat->{'st_uid'}, $lstat->{'st_gid'}, $lstat->{'st_size'},
+                               ls_date($lstat->{'st_mtime'}), "$r$file";
+               }
+       }
+       else {
+               &print_by_cols(@flist);
+       }
+
+}
+
+sub cmd_pwd {
+       print "$cwd\n";
+}
+
+# Create restore data for bconsole
+
+sub cmd_recover {
+       my $query = "create table recover (jobid int, fileindex int)";
+
+       $dbh->do($query)
+               || warn "Could not create recover table. Hope it's already there.\n";
+
+       if ($db eq 'postgres') {
+               $query = "COPY recover FROM STDIN";
+
+               $dbh->do($query) || die "Can't execute $query\n";
+
+               foreach my $finfo (values %restore) {
+                       $dbh->pg_putline("$finfo->[0]\t$finfo->[1]\n");
+               }
+
+               $dbh->pg_endcopy;
+       }
+       else {
+
+               foreach my $finfo (values %restore) {
+                       $query = "insert into recover (
+                               'jobid', 'fileindex'
+                       )
+                       values (
+                               $finfo->[0], $finfo->[1]
+                       )";
+                       $dbh->do($query) || die "Can't execute $query\n";
+               }
+
+       }
+
+       $query = "GRANT all on recover to bacula";
+       $dbh->do($query) || die "Can't execute $query\n";
+
+       $query = "select name from Client where clientid = $client";
+       my $sth = $dbh->prepare($query) || die "Can't prepare $query\n";
+       $sth->execute || die "Can't execute $query\n";
+
+       my $ref = $sth->fetchrow_hashref;
+       print "Restore prepared. Run bconsole and enter the following command\n";
+       print "restore client=$$ref{name} where=$restore_to file=\?recover\n";
+       $sth->finish;
+}
+
+sub cmd_relocate {
+       $restore_to = shift;
+}
+
+# Display information about recover's state
+
+sub cmd_show {
+       my $what = shift;
+
+       if ($what eq 'clients') {
+
+               foreach my $c (sort keys %$clients) {
+                       print "$c\n";
+               }
+
+       }
+       elsif ($what eq 'catalog') {
+               print "$catalog\n";
+       }
+       elsif ($what eq 'client') {
+               my $query = "select name from Client where clientid = $client";
+               my $sth = $dbh->prepare($query) || die "Can't prepare $query\n";
+               $sth->execute || die "Can't execute $query\n";
+
+               my $ref = $sth->fetchrow_hashref;
+               print "$$ref{name}; $jobname\n";
+               $sth->finish;
+       }
+       elsif ($what eq 'cache') {
+               print "The following directories are cached\n";
+
+               foreach my $d (sort keys %$dircache) {
+                       print "$d\n";
+               }
+
+       }
+       elsif ($what eq 'restore') {
+               print "There are $rnum files marked for restore.\n";
+
+               print STDERR "DBG: Bytes = $rbytes\n" if ($debug);
+
+               if ($rbytes < 1024) {
+                       print "The restore will require $rbytes bytes.\n";
+               }
+               elsif ($rbytes < 1024*1024) {
+                       my $rk = $rbytes/1024;
+                       printf "The restore will require %.2f KB.\n", $rk;
+               }
+               elsif ($rbytes < 1024*1024*1024) {
+                       my $rm = $rbytes/1024/1024;
+                       printf "The restore will require %.2f MB.\n", $rm;
+               }
+               else {
+                       my $rg = $rbytes/1024/1024/1024;
+                       printf "The restore will require %.2f GB.\n", $rg;
+               }
+
+               print "Restores will be placed in $restore_to\n";
+       }
+       elsif ($what eq 'volumes') {
+               &cmd_volumes;
+       }
+       elsif ($what eq 'qinfo') {
+               my $dl = length($cwd);
+               print "? - 1: ftime = $ftime\n";
+               print "? - 2: client = $client\n";
+               print "? - 3: jobname = $jobname\n";
+               print "? - 4: rtime = $rtime\n";
+               print "? - 5: dir = $cwd\n";
+               print "? - 6, 7: dl = $dl\n";
+               print "? - 8: ftime = $ftime\n";
+               print "? - 9: client = $client\n";
+               print "? - 10: jobname = $jobname\n";
+               print "? - 11: rtime = $rtime\n";
+               print "? - 12: dir = $cwd\n";
+       }
+       else {
+               warn "Don't know how to show $what\n";
+       }
+
+}
+
+sub cmd_verbose {
+       $verbose = 1 - $verbose;
+}
+
+sub cmd_versions {
+       my @flist = @_;
+
+       @flist = ($cwd) if (!@flist);
+
+       foreach my $f (@flist) {
+               my $path;
+               my $data = {};
+
+               print STDERR "DBG: Get versions for $f\n" if ($debug);
+
+               $f =~ s|/+$||;
+               my ($fqdir, $dir, $file) = &path_parts($f);
+               my $finfo = &fetch_dir($fqdir);
+
+               if (!$finfo->{$file}) {
+
+                       if (!$finfo->{"$file/"}) {
+                               warn "$f: File not found.\n";
+                               next;
+                       }
+
+                       $file .= '/';
+               }
+
+               if ($file =~ m|/$|) {
+                       $path = "$fqdir$file";
+                       $file = '';
+               }
+               else {
+                       $path = $fqdir;
+               }
+
+               print STDERR "DBG: Use $ftime, $path, $file, $client, $jobname\n"
+                       if ($debug);
+
+               $ver_sth->execute($ftime, $rtime, $path, $file, $client, $jobname)
+                       || die "Can't execute $queries{$db}->{'ver'}\n";
+
+               # Gather stats
+
+               while (my $ref = $ver_sth->fetchrow_hashref) {
+                       my $f = "$ref->{name};$ref->{jobtdate}";
+                       $data->{$f} = &create_file_entry(
+                               $f,
+                               $ref->{'fileid'},
+                               $ref->{'fileindex'},
+                               $ref->{'jobid'},
+                               $ref->{'visible'},
+                               $ref->{'lstat'}
+                       );
+
+                       $data->{$f}->{'jobtdate'} = $ref->{'jobtdate'};
+                       $data->{$f}->{'volume'} = $ref->{'volumename'};
+               }
+
+               my @keys = sort {
+                       $data->{$a}->{'jobtdate'} <=>
+                       $data->{$b}->{'jobtdate'}
+               } keys %$data;
+
+               my @list = ();
+
+               foreach my $f (@keys) {
+                       push(@list, [$file, $data->{$f}]);
+               }
+
+               my $lfmt = &long_fmt(\@list);
+               print "\nVersions of \`$path$file' earlier than ";
+               print localtime($rtime) . ":\n\n";
+
+               foreach my $f (@keys) {
+                       my $lstat = $data->{$f}->{'lstat'};
+                       printf $lfmt, $lstat->{'statstr'}, $lstat->{'st_nlink'},
+                               $lstat->{'st_uid'}, $lstat->{'st_gid'}, $lstat->{'st_size'},
+                               time2str('%c', $lstat->{'st_mtime'}), $file;
+                       print "save time: " . localtime($data->{$f}->{'jobtdate'}) . "\n";
+                       print " location: $data->{$f}->{volume}\n\n";
+               }
+
+       }
+
+}
+
+# List volumes needed for restore.
+
+sub cmd_volumes {
+       my %media;
+       my @jobmedia;
+       my %volumes;
+
+       # Get media.
+       my $query = "select mediaid, volumename from Media";
+       my $sth = $dbh->prepare($query) || die "Can't prepare $query\n";
+
+       $sth->execute || die "Can't execute $query\n";
+
+       while (my $ref = $sth->fetchrow_hashref) {
+               $media{$$ref{'mediaid'}} = $$ref{'volumename'};
+       }
+
+       $sth->finish();
+
+       # Get media usage.
+       $query = "select mediaid, jobid, firstindex, lastindex from JobMedia";
+       $sth = $dbh->prepare($query) || die "Can't prepare $query\n";
+
+       $sth->execute || die "Can't execute $query\n";
+
+       while (my $ref = $sth->fetchrow_hashref) {
+               push(@jobmedia, {
+                       'mediaid' => $$ref{'mediaid'},
+                       'jobid' => $$ref{'jobid'},
+                       'firstindex' => $$ref{'firstindex'},
+                       'lastindex' => $$ref{'lastindex'}
+               });
+       }
+
+       $sth->finish();
+
+       # Find needed volumes
+
+       foreach my $fileid (keys %restore) {
+               my ($jobid, $idx) = @{$restore{$fileid}};
+
+               foreach my $jm (@jobmedia) {
+                       next if ($jm->{'jobid'}) != $jobid;
+
+                       if ($idx >= $jm->{'firstindex'} && $idx <= $jm->{'lastindex'}) {
+                               $volumes{$media{$jm->{'mediaid'}}} = 1;
+                       }
+
+               }
+
+       }
+
+       print "The following volumes are needed for restore.\n";
+
+       foreach my $v (sort keys %volumes) {
+               print "$v\n";
+       }
+
+}
+
+sub cmd_error {
+       my $msg = shift;
+       print STDERR "$msg\n";
+}
+
+##############################################################################
+### Start of program
+##############################################################################
+
+&cache_catalog if ($preload);
+
+print "Using $readline for command processing\n" if ($verbose);
+
+# Initialize command completion
+
+# Add binding for Perl readline. Issue warning.
+if ($readline eq 'Term::ReadLine::Gnu') {
+       $term->ReadHistory($HIST_FILE);
+       print STDERR "DBG: FCD - $tty_attribs->{filename_completion_desired}\n"
+               if ($debug);
+       $tty_attribs->{attempted_completion_function} = \&complete;
+       $tty_attribs->{attempted_completion_function} = \&complete;
+       print STDERR "DBG: Quote chars = '$tty_attribs->{filename_quote_characters}'\n" if ($debug);
+}
+elsif ($readline eq 'Term::ReadLine::Perl') {
+       readline::rl_bind('TAB', 'ViComplete');
+       warn "Command completion disabled. $readline is seriously broken\n";
+}
+else {
+       warn "Can't deal with $readline, Command completion disabled.\n";
+}
+
+&cmd_cd($start_dir);
+
+while (defined($cstr = $term->readline('recover> '))) {
+       print "\n" if ($readline eq 'Term::ReadLine::Perl');
+       my @command = parse_command($cstr);
+       last if ($command[0] eq 'quit');
+       next if ($command[0] eq 'nop');
+
+       print STDERR "Execute $command[0] command.\n" if ($debug);
+
+       my $cmd = \&{"cmd_$command[0]"};
+
+       # The following line will call the subroutine named cmd_ prepended to
+       # the name of the command returned by parse_command.
+
+       &$cmd(@command[1..$#command]);
+};
+
+$dir_sth->finish();
+$sel_sth->finish();
+$ver_sth->finish();
+$dbh->disconnect();
+
+print "\n" if (!defined($cstr));
+
+$term->WriteHistory($HIST_FILE) if ($readline eq 'Term::ReadLine::Gnu');
+
+=head1 DEPENDENCIES
+
+The following CPAN modules are required to run this program.
+
+DBI, Term::ReadKey, Time::ParseDate, Date::Format, Text::ParseWords
+
+Additionally, you will only get command line completion if you also have
+
+Term::ReadLine::Gnu
+
+=head1 AUTHOR
+
+Karl Hakimian <hakimian@aha.com>
+
+=head1 LICENSE
+
+Copyright (C) 2006 Karl Hakimian
+
+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.
+
+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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+=cut
index 99ad0fb52a7dbb3098abcaab8429504b487560b0..a857ee2233856893db9307f1830194dde3796d78 100644 (file)
@@ -1,5 +1,5 @@
                     Kern's ToDo List
-                     22 February 2006
+                     11 January 2006
 
 Major development:      
 Project                     Developer
@@ -15,18 +15,14 @@ Document:
 - %d and %v only valid on Director, not for ClientRunBefore/After.
 
 Priority:
+- Implement a way to disable a drive (so you can use the second
+  drive of an autochanger, and the first one will not be used or
+  even defined).
 - Implement code that makes the Dir aware that a drive is an             
   autochanger (so the user doesn't need to use the Autochanger = yes 
   directive).
 
 For 1.39:
-- Does Bacula backup Windows shortcuts?
-- Add recycle count to Media record.
-- Add initial write date to Media record.
-- Job retention period in a Pool (and hence Volume).  The job would
-  then be migrated.
-- Detect resource deadlock in Migrate when same job wants to read
-  and write the same device.
 - Make hardlink code at line 240 of find_one.c use binary search.
 - Queue warning/error messages during restore so that they
   are reported at the end of the report rather than being
@@ -1280,9 +1276,3 @@ Block Position: 0
   integers.
 - Implement status that shows why a job is being held in reserve, or
   rather why none of the drives are suitable.
-- Implement a way to disable a drive (so you can use the second
-  drive of an autochanger, and the first one will not be used or
-  even defined).
-- Make sure Maximum Volumes is respected in Pools when adding
-  Volumes (e.g. when pulling a Scratch volume).
-- Keep same dcr when switching device ...
index 2de8cb1522b60ccdf0e50ddbcee13871097e6aac..4f75cdd8a6a7a8ae47365af6d0d3dabece810cf2 100644 (file)
@@ -2,6 +2,258 @@
                         Kern Sibbald
 
 General:
+02May06
+- Added code to strip backslashes from Windows filenames during
+  a restore.
+- Corrected Win32 License to use the correct LICENSE file.
+- Corrected the buffer count and bytes reported in the heap 
+  statistics.
+26Apr06
+- Implement an NT_() macro to indicate that text should NOT
+  be translated.
+- Fix a number of incorrect strings marked for translation, when
+  they should not be (e.g. commands).
+- Fix StartTime bug reported for ClientRunBeforeJob and RunBeforeJob
+  Patches supplied by user in bugs #608 and #599.
+- Use most recent of st_ctime and st_mtime in restore tree DIR
+  listing. This fixes some problems with Win32 printing incorrect
+  values.
+- Correct the clock shift comm time calculation between the DIR
+  and the FD. It was added rather than subtracted.
+- Strip all backslashes in filenames to be restored on Win32
+  machines -- the names should all be in Unix format, and if
+  there are any backslashes it is most likely due to an improper
+  FileSet definition, and the files will not otherwise be 
+  restorable.
+- Remove lib/regex.c (replaced by bregex.c).
+- Delete src/win32/License.txt
+- Modify installer to install LICENSE
+25Apr06
+- Add back ua_label barcode fix from Rufolf Cejka.
+23Apr06
+- Add 'Dir Status' button to the gnome console.
+- Display heap stats in Storage daemon without debug level.
+22Apr06
+- Integrate most of the MinGW changes -- more to do.
+21Apr06
+- Implement using pg_config for finding PostgreSQL files.
+  Fixes bug #600. Patch supplied by user.
+- Remove -t option from mktemp in mtx_changer.in and use
+  working directory. Fixes bug #578.
+- Update job start time after the any run before job so that
+  files created by the script are only backed up once. Fixes
+  bug #599.
+- Strip trailing newline only from filenames entered in
+  the restore command when reading a file. This permits
+  the user to enter filenames with trailing spaces. Fixes
+  bug #549. The user supplied a patch that I modified slightly.
+- Use the most recent time (st_mtime, st_ctime) in the dir
+  command in restore. This gives the user a better idea of what
+  the newest file really is. This fixes bug #574. The fix
+  was suggested by the user.
+18Apr06
+- Remove the -f option from the chown in Makefile.in for more
+  portability.
+- Change setting the group in Makefile.in to use chgrp for
+  more portability.
+- Implement a Bacula read/write lock for Python rather
+  than using the Python lock to avoid recursive problems.
+- Correct the uninstall directory names in filed/Makefile.in
+  as reported by a user.
+
+Release 1.38.8 (14Apr06) released 14Apr06
+15Apr06
+- Correct Makefile bug found by Dan Langille.
+14Apr06
+- Correct Makefile for Solaris /bin/sh
+- Correct mtx-changer.in for Solaris /bin/sh
+- Abort if a conf resource does not have a Name =
+12Apr06
+- Change the name of the regex program to bregex.
+- Add the bwild program to the tools directory. It is similar
+  to the bregex program.
+- Implement create bregex.h and bregex.c in src/lib from the
+  Python regexp program.  
+- Use the new bregex.c to implement Regex expressions on Win32.
+11Apr06
+- Modify Makefile to change the permissions on Working Directory
+  to 770 if the directory is created.
+- Do not fail the Makefile if changing the permissions or 
+  owner/group on WorkingDir fails.
+- Correct the old recycling algorithm so that Scratch Volumes
+  are selected when looking for a Volume in the changer.
+- Correct a typo in the Verify SQL reported by Joe Park.
+10Apr06
+- Remove automatic case folding on Windows FDs. You must
+  explictly use the 'Ignore Case = yes' option.
+- Remove the code added to 1.38.6 and 1.38.7 that pulls a
+  scratch volume in an Autochanger early in the 'recycling'
+  algorithm.  
+08Apr06
+- Tweak license to include Microsoft restrictions.
+- Move mysql.reconnect to after real_connect().  Thanks to
+  Frank Sweetser for the patch.
+- Disallow a backslash in a File = directive (Windows junk)
+  unless the string is quoted.
+- Apply Eric's patch to ua_label.c so that daemon protocol
+  is not translated.
+
+Release 1.38.7 (06Apr06) released 07Apr06
+06Apr06
+- Remove timed wait for VSS on Win2K3 as it is not yet
+  implemented.
+- Correct bacula.in script to reference bacula-ctl-xx in the
+  sysconfig directory rather than the bin directory.
+
+Release 1.38.6 (28Mar06) released 29Mar06
+28Mar06
+- Back port from 1.39 fixes to lib/jcr.c to use foreach_jcr() 
+  and new jcr chain locking.
+26Mar06
+- Fix a long standing bug in the bacula start/stop scripts.
+- Attempt to add the new bacula-ctl-* files to the rpm.
+- Switch to using typeof() for list traversing to avoid
+  as many FC5 g++ compiler warnings as possible.
+25Mar06
+- Split the bacula start/start script into four files:
+   bacula         -- starts and stops calling other scripts
+   bacula-ctl-dir -- starts/stops the director
+   bacula-ctl-fd  -- starts/stops the File daemon
+   bacula-ctl-sd  -- starts/stops the Storage daemon
+24Mar06
+- Create datestyle fix for PostgreSQL. Fixes bug #574.
+- Correct editing of JobId from int to int64 in fd_cmds.c
+- Eliminate FileSet name race with bash_spaces() and multiple
+  threads by bashing in a local.
+- Fix error return from 'use storage' to print a correct error
+  message rather than nothing.
+- Correct false re-read last block error message when two jobs 
+  are simultaneously writing at the end of a tape.
+- Simplify exit conditions in the reserve.c code to avoid  
+  possible non-release of reservation_lock().
+- Suffle lock order in reserve to avoid deadlock between
+  reservation lock and device mutex.
+- Add Thorsten's VSS timeout code to 1.38 branch.
+21Mar06
+- Initialize jcr mutex before first use. Thanks to Thorsten for
+  tracking this down for me !!!! as it broke the Win32 build.
+20Mar06
+- Integrate addition of line count limitation to bsmtp -l from
+  Sebastian Stark <stark at tuebingen.mpg.de>
+17Mar06
+- Implement regex test program in tools directory.
+- Attempt to fix time problem with bsmtp with foreign langs.
+- Add strip_trailing_newline() submitted by user.
+
+16Mar06
+- Fix bug #537 to allow arbitrary time to mount a volume for
+  restore, if polling is turned on.     
+- Disallow multiple storage specifications for a job. Should fix Arno's
+  problem.
+- Add back a missing store of poolid in jr.poolid.    
+- If dir_user or dir-group is specified in ./configure apply it to
+  the working-dir. Fixes bug #533.
+- If rescheduling a job cancel the previous incarnation with the SD.
+  Fixes bugs #566 and 557.
+- Fix bug #567 do_message() definition type conflict.
+
+
+14Mar06
+- Add more jcr methods and make mutex and use_count private.
+- Create lock/unlock methods for jcr.
+- Fix PostgreSQL bug doing sql_data_seeek() by explicitly reading
+  records to get to seek position.
+- Integrate patch from bug #561 to correct conio.c signal definitions.
+- Fix Rescheduling failed Jobs. Ensure that SD message thread 
+  terminates correctly by doing pthread_kill(). Do not destroy
+  SD cond wait variable between executions of the job. Use local
+  mutex for cond variable to avoid blocking jcr chain. Fix poor 
+  use of jcr use count in jobq.c for restarted jobs.
+- Fix obsolete usage of foreach_dlist() to use foreach_jcr() in
+  lib/jcr.c -- prevents locking the jcr chaing.
+- Apply patch from bug #564, which corrects listing volumes with
+  multiple autochangers. Apply same fix to next volume list.
+- Fix bug #562 where restore bootstrap file is not unique.
+- Use new routine lock_reservations() to lock the reservations
+  system, and call it while looking for a volume in askdir.c.
+  This could possibly fix bug #543.
+- Stop SD command loop if job is canceled.
+
+09Mar06
+- Use John Kodis' edit_with_suffix code to edit VolBytes.
+- Backport some fixes for acquire.c. Most importantly, to explicitly
+  have a reserved_device flag for acquire_for_read().  Hopefully
+  this will correct the remaining issues with failed restores holding
+  a drive.
+- Add a job_canceled() check in SD command loop.
+
+Release 1.38.6 beta3 4Mar06
+04Mar06
+- The po files should now be current.
+- Fix new sql_use_result() code to properly release the
+  buffers in all cases.
+- Convert to using new Python class definitons with (object).
+- Use the keyword ujobid to mean the unique job id; job or jobname
+  to mean the Job name given on the Name directive, and jobid to
+  be the numeric (non-unique) job id.
+- Allow listing by any of the above.
+- Add the user friendly job report code for reporting job elapsed time
+  and rates with suffexes from John Kodis <kodis at comcast.net>.
+- Add Priority and JobLevel as Python settable items.
+- Use TEMPORARY table creation where the table is created by
+  Bacula.
+- Add new code submitted by Eric for waiting on specific jobid.
+- Add ACL checking for the dot commands.
+- Fix restore of writable FIFOs.
+- Fix a bug in bpipe where the string was freed too early.
+
+26Feb06
+- Fix bug reported by Arno listing blocks with bls
+- Update the po files at Eric's request.
+
+Release 1.38.6-beta2 25Feb06
+25Feb06
+- Add sql_use_result() define.
+
+Release 1.38.6 beta1 24Feb06
+24Feb06
+- Don't open default catalog if not in ACL.
+
+22Feb06
+- Add virtual disk autochanger code.
+- Add user supplied bug fix to make two autochangers work
+  correctly using StorageId with InChanger checks.
+- Correct new/old_jcr confusion in copy_storage().
+- Remove & from Job during scan in msgchan.c -- probably
+  trashed the stack.
+- When getting the next Volume if no Volume in Append mode   
+  exists and we are dealing with an Autochanger, search
+  for a Scratch Volume.  
+- Check for missing value in dot commands -- bug fix.
+- Fix bug in update barcodes command line scanning.
+- Make sure Pool Max Vols is respected.
+- Check that user supplied a value before referencing
+  it in restore -- pointed out by Karl Hakimian. 
+- Add Karl Hakimian's table insert code.
+- Don't ask user to select a specific Volume when
+  updating all volumes in a Pool.
+- Remove reservation if set for read when removing dcr.
+- Lock code that requests next appendable volume so that
+  two jobs to get the same Volume at the same time.
+- Add new Device Type = xxx code. Values are file, tape,
+  dvd, and fifo.
+- Preserve certain modes (ST_LABEL|ST_APPEND|ST_READ) across
+  a re-open to change read/write permission on a device.
+- Correct a misplaced double quote in certain autochanger  
+  scripts.
+- Make make_catalog_backup.in a bit more portable.
+- Implement Karl Hakimian's sql_use_result(), which speeds
+  up restore tree building and reduces the memory load.
+- Correct a number of minor bugs in getting a Volume from  
+  the Scratch Pool.
+- Implement additional command line options for update Volume.
+- Don't require user to enter a Volume name when updating
+  all Volumes in a pool.
 
 Release 1.38.5 released 19Jan06:
 19Jan06
diff --git a/bacula/kes-1.39 b/bacula/kes-1.39
deleted file mode 100644 (file)
index 6af5911..0000000
+++ /dev/null
@@ -1,375 +0,0 @@
-              Technical notes on version 1.39  
-                        Kern Sibbald
-
-General:
-
-Changes to 1.39.6
-23Feb06
-- Add Rudolf Cejka's new rc-chio-changer.
-- Implement pulling Volume from Scratch Pool if the
-  Volume is in the autochanger.
-- Implement additional command arguments for update Volume.
-
-Changes to 1.39.5 
-22Feb06
-- Back port changes to 1.38.5
-- Fix recycle SQL for StorageId.
-- Fix misplaced quote in mtx-changer script.
-20Feb06
-- Note. Your database must be updated, or you must create 
-  a new database. I have not yet incremented the database level.
-- Add Location table. 
-- Add LocationId, DeviceId, and MediaTypeId to Media record.
-18Feb06
-- Implement create/get mac record in database for adding extended
-  Migration data to the job record.
-- Add new MAC table to update/make database scripts.
-- Return Storage name used when getting VolumeNames for a job.
-- Change bsr file keyword Storage to Device, which is more accurate.
-- Ensure that Mac records are pruned/purged.
-- Tweak SD tools to deal with changing media type.
-- Integrate more dev.c subroutines as methods (e.g. strerror, bsr, ...)
-- Pass pointer to dcr pointer to acquire_device_for_read() so
-  that the subroutine can switch devices, and hence dcrs.
-- Modify the multiple MediaType read code to re-use the same
-  dcr when switching devices. This makes the code much more
-  robust.
-- Integrate patch from Karl Hakimian that reads JobIds, FileIndexes
-  from a table for restore.
-- Add Storage name to VolParams, but it really should be Device.
-14Feb06
-- Add disk-changer to scripts directory + configure/Makefile
-- Eliminate PoolId from jcr -- it is in jcr->jr.PoolId
-- Implement store_bit scanner to replace store_yesno.  Mostly done.
-- Implement new store_bool that stores in a bool. 
-- Add true/false to yes/no conf directives.
-- Make first cut at changing appropriate store_yesno to store_bool.
-- Complete implementation of Pool storage devices.
-- Move starting clones to job.c
-- Move create_restore_bootstrap_file() to job.c
-- Make copy_storage() more general to be able to handle
-  Pool storage.
-- Cleanup a lot of migration code for manual running, including
-  using Pool storage.
-- Move getting a scratch Volume into a subroutine.
-- Make all places a Volume that is added to a pool to 
-  respect max vols.
-- Fix bug in autochanger recycle code (improper edit 64 bit).
-- Fix segfault in restore command when no value specified.
-- Start adding code to handle multiple MediaTypes in restore.
-- Eliminate race condition in getting Volume name for
-  two drive autochanger.
-- More debug code in autochanger.
-- Add storage keyword to bootstrap file, add parsing.
-- Move slot in bsr file into Volume record as there will be
-  a different slot for each Volume.
-- Create reserve.h
-07Feb06
-- Implement Pool storage overrides.
-06Feb06
-- Implement first cut of Migration.
-- Implement mysql_use_result() from patch by Karl Hakimian.
-  This reduces significantly the memory consumption during
-  the restore tree building, and hence runs faster too.
-- Implement StorageId patch supplied by user (reggie) in bug
-  #536.  This should permit Bacula to work correctly with two
-  autochangers.
-- Implement Job listing variations suggested by a user.
-- Move updating bootstrap code in backup.c to subroutine
-  update_bootstrap_file().
-- Add new job status elapsed time and bytes written user
-  friendly job report output patch sent by a user.
-- Implement a storage list in Pools.
-- Separate out setup_job() code from run_job().
-- Get migration working -- lots of changes in mac.c in both
-  DIR and SD.
-- Apply patch from user (Eric Bollinger I think) that fixes a  
-  DIR crash when no arguments are supplied to a dot command.
-- Fix typo (strcpy->strcmp) in ua_prune.c as reported by Martin.
-- Fix command arg name->volume in label command of gnome-console.
-- Fix SD acquire.c to release correct DCR by explicitly testing
-  on the dcr address rather than trying to devine if it is a read
-  or write dcr.  This failed in error conditions when the device was
-  not fully setup.
-30Jan06
-- Apply user supplied patch for more readable rate output
-  in job report.
-- Continue implementing migration.
-- Implement support for removable filesystems in SD.
-- Ensure that btraceback scripts can be read by anyone.
-- Replace dvd-freespace and dvd-writepart by dvd-handler.
-- Correct bug where canceling restore before the FD contacts
-  the SD causes the drive to be left in read mode.
-- Move ofline_or_rewind into DEVICE::close().
-- Eliminate close_device.
-- Convert several dev subroutines to methods (e.g. bsf,
-  eod, ...)
-- Eliminate force_close_device().
-- Implement Device Type directive in Device resource that
-  can have values File, Tape, Fifo, DVD, or Prog.
-- Add has_cap() method to Device.
-Changes to 1.39.4
-17Jan06
-- Add patch from bug #527 to allow RedHat user to specify
-  options/user/group for starting each daemon in      
-  /etc/sysconf/bacula.
-16Jan06
-- Add two new queries to query.sql provided by Arno. One
-  list volumes known to the Storage device, and the other
-  lists volumes possibly needing replacement (error, ...).
-15Jan06
-- Add periodic (every 24 hours) garbage collection of memory 
-  pool by releasing free buffers.
-14Jan06
-- Correct bug counting sized (for display only) in smartall.c
-- Print FD mempool stats if debug > 0 rather than 5.
-12Jan06
-- Make db_lock() mutex error fail the job rather than abort
-  Bacula.  Canceling the job caused the mutex to fail.
-- Correct bug in alist.c that re-allocated the list if the
-  number of items goes to zero.
-- Move the reservation system thread locking to the top level
-  so that one job at a time tries all possible drives before
-  waiting.
-- Implement a reservation 'fail' message queue that is built         
-  and destroyed on each pass through the reservation system.
-  These messages are displayed in a 'Jobs waiting to reserve
-  a drive' list during a 'status storage='.  Note, multiple
-  messages will generally print for each JobId because they
-  represent the different problems with either the same drive
-  or different drives.  If this output proves too confusing
-  of voluminous, I will display it only when debug level 1
-  or greater is enabled in the SD.
-11Jan06
-- Add enable/disable job=<job-name>.  This command prevents
-  the specified job from being scheduled. Even when disabled,
-  the job can be manually started from the console.
-- During 'update slots' clear all InChanger flags where the
-  StorageId is zero (old Media records).
-
-Beta release 1.38.4:
-09Jan06
-- Fix autochanger code to strip leading spaces from returned
-  slots number. Remove bc from chio-changer.
-- Back port a bit of 1.39 crypto code to reduce diffs.
-- Fix first call to autochanger that missed close()ing the
-  drive. Put close() just before each run_program().  Fixes
-  Arno's changer bug.
-07Jan06
-- Add PoolId to Job record when updating it at job start time.
-06Jan06
-- Pull in more code from 1.39 so that there are fewer file
-  differences (the new ua_dotcmds.c, base64.h, crypto.h
-  hmac.c jcr.c (dird and lib) lib.h md5.h parse_conf.c 
-  util.c. Aside from ua_dotcmds.c these are mostly crypto
-  upgrades.
-- Implement new method of walking the jcr chain. The
-  incr/dec of the use_count is done within the walking
-  routines.  This should prevent a jcr from being freed
-  from under the walk routines.
-
-
-Changes to 1.39.3:
-04Jan06
-- Start implementing Verify list output.
-- Move the suitable_drive flag to a better place to prevent
-  premature termination of the reservation if all drives
-  are busy -- should fix Arno's diff/inc pool failures.
-26Dec05
-- Add mutex to single thread VSS code in Win32.
-22Dec05
-- Simplify code in askdir.c that waits for creating an appendable
-  volume so that it can handle multiple returns from the wait
-  code.
-- Modify the wait code to permit multiple returns.
-- Return a zero when "autochanger drives" is called and
-  it is not an autochanger.
-- Make rewind_dev() a method taking a DCR as an argument.
-  This permits closing and reopening the drive if the
-  rewind fails as happens if the drive was loaded while the
-  file descriptor was open. This refreshes the file descriptor.
-- Remove the ST_OPENED flag and always rely on fd < 0 for knowing
-  if the device is open or not.  This should eliminate
-  Arnos problem.
-- Return error if reserve cannot find at least one suitable device.
-- Make wait_for_sysop() return correct state information.
-- Fix Win32 state file problem. write was not using compat
-  code. This should fix bug #500.
-21Dec05
-- Modify gui on command to set only GUI mode and not batch.
-- Modify .messages command to always print messages regardless
-  of the mode.
-- If GUI mode is on, suppress automatic printing of 
-  You have messages. 
-- Delete old bnet packet code.
-- Ignore new BNET_START_SELECT and BNET_END_SELECT signals in
-  wx-console.
-- Modify restore command in wx-console to set gui on and to use
-  only .messages instead of messages.  Hopefully this fixes bug
-  #514.
-- Fix seg fault in exit of acquire when canceling a job --
-  reported by Wolfgang Denk
-- Pull in latest reservation system changes from 1.38
-- Make .messages command always print messages regardless
-  of the automessages flag.
-17Dec05
-- Fix seg fault if user labels a drive directory bug #513
-- Remove quotes around Version as it breaks things.
-16Dec05
-- Merge in Aleksandar Milivojevic's mods to the spec file.
-- Apply sparse code fix for raw drives and fifos. Bug 506
-- Thorsten fixed Unicode cd problem with wx-console bug 505.
-14Dec05
-- Correct reservation system to do a last ditch try
-  for any mounted volume, then anyone anywhere.
-- Add quotes around table Version because of
-  error in MySQL 4.1.15 -- bug report submitted.
-- Correct some minor problems with btape in the fill
-  command.
-- Updates to ssh-tunnel from Joshua Kugler.
-- Added a report.pl program from Jonas Bjorklund.            
-- Simplify the O_NONBLOCK open() code for tape drives,
-  and always open nonblocking.
-- Do not wait for open() if EIO returned (shouldn't happen).
-- Eliminate 3 argument to tape open().
-- Correct the slot # edited in the 3995 Bad autochanger unload
-  message.
-- With -S on bscan (show progress) do not divide by zero.
-13Dec05
-- Make cancel pthread_cond_signal() pthread_cond_broadcast().
-- When dcr is freed, also broadcast dev->wait_next_vol signal.
-- Remove unused code in wait_for_device.  
-- Make wait_for_device() always return after 60 seconds of wait.
-
-Changes to 1.39.2:
-13Dec05
-- Add stubs for non-crypto build.
-12Dec05
-- Use localhost if no network configured
-11Dec05
-- Eliminated duplicate MaxVolBytes in cat update -- bug 509.
-- Remove debug print.
-- Add bail_out in error during state file reading.
-10Dec05
-- Merge changes made to 1.38.3 into HEAD
-- Add stubs for pygtk-console code
-- Create Makefile.in for pygtk-console code
-09Dec05
-- Merge updates into 1.38 branch
-- Update specs to include mysql4 define.
-- Fix when attributes are sent, must be after binit().
-- Stop read_record() if status not ok in second loop.
-- Return rec->FileIndex in dcr->VolLastIndex for normal
-  and partial records in read_record().  This allows bscan
-  to get FileIndex at EOT correct.
-- Fix butil.c to correctly set dcr -- fixes seg fault in bls.
-08Dec05
-- Fix Win32 built to work with new crypto code.
-- Apply patch supplied by user (slightly modified) to fix
-  correct detection of holes in block devices and FIFOs. 
-  Bug # 506.
-- Apply patch supplied by user (slightly modified) 
-  to fix SD hang with multiple pools and bad client
-  IP. Fixes bug # 508.
-07Dec05
-- Add nagios plugin to the examples directory. Submitted by
-  Christian Masopust.
-- Remove warning message about multiple saves of hardlinked files
-  from find_one.c as it can generate too many warning messages.
-- Modify most restore error messages to be queued so that they
-  appear at the end of the job rather than mixted with the restore
-  listing where they could be "lost".
-06Dec05
-- Reset timeout values before select() per patch from 
-  Frank Sweetser for problems with non-blocking sockets.
-- Unlink the state file if either reading or writing it gets
-  errors.  Hopefully this will fix Win32 exit problems.
-- Add sanity check in append.c to ensure that dcr is not NULL.
-  This can happen if multiple drive autochanger SCSI control
-  channel and drive indicies do not correspond.
-05Dec05
-- Get next volume from Scratch pool before creating a volume.
-- Set new Pool defaults in Vol when moved from Scratch Pool.
-- Remove argument from create_bacula_database for SQLite as it
-  caused an error.
-- Add back index code so that two drive autochangers can get
-  a second tape.
-- Change a bunch of debug levels to aid debugging autochangers.
-- Fix reservation so that mutexes are properly applied.
-- Rework reservation algorithm so that two drives can be used
-  at the same time.
-04Dec05
-- Landon merged his data encription changes into the HEAD
-- Apply days keyword patch from Alexander.Bergolth at wu-wien.ac.at 
-  If this patch is applied, the number of days can be specified with
-  "list nextvol days=xx"
-  or
-  "status dir days=xx"
-  My use case is to be able to preview the next scheduled job (and the 
-  next tape to be used) on fridays if there are no scheduled jobs during 
-  the weekend.
-Changes to 1.39.1:
-03Dec05
-- Fix font code in gnome2 console user patch. Fixes bug #501.
-- Fix malformatted bnet error message that caused seg fault
-  fixes bug 502
-- Applied user patch to improve README.vc8 in src/win32.
-29Nov05
-- Add Migrate, Copy, Archive Job types (some where there)
-- Correct some more editing of JobId's (for 64 bit compatibility).
-- Ensure that StorageId is stored in Media record when ever possible.
-- Add Migration Job to Job.
-- Add Migration Time, Migration High Bytes, Migration Low Bytes
-  Next Pool to Pool resource.
-- Add more code to mac.c (migration archive copy).
-- Change Start Storage daemon job to require read and write storage
-  pointers.
-- Pass read storage data to SD as well as write storage data.
-- Remove old code from winservice.cpp
-- Break on error in scan.
-- Fix typo in signal.c
-- Separate read/write DCR in SD.  Add jcr->read_dcr.
-- Cleanup how find_device() works.
-- Add read output to Status in SD.
-Changes to 1.39.0:
-23Nov05
-- Add red-black btree routines
-21Nov05
-- Remove abs() in bfile.c so that it compiles on Solaris. 
-  Bug #491.
-20Nov05
-- Fix crash in tray-monitor when daemon disconnects. Bug #479.
-- Fix bnet-server bug found on OpenBSD. Bug #486
-- Fix cancel failure bug. Bug #481
-- Fix failure when Pool name has spaces. Bug #487   
-- Fix SD crash in autochanger code. Mutex failure. Bug #488
-- Fix a couple of free()s in src/filed/acl.c
-- Fix memory overrun in bfile.c in building OS X resource
-  fork filename. Bug #489 
-- Add Pool name to SD status output.
-14Nov05
-- Apply SunOS patch for ACLs submitted by David Duchscher.                  
-- Make sure to set storage before trying to set drive.
-- Add bacula_mail_summary.sh to examples directory. It makes
-  a single email summary of any number of jobs. Submitted
-  by Adrew J. Millar.
-- Make sure when we do a mount to unblock the device even
-  if the drive could not be opened.  
-13Nov05
-- Remove the USE_WIN32STREAMEXTRACTION #defines (always on)
-  and correct a few minor problems to make it build on Linux.
-10Nov05
-- Remove delete of CVS from all Makefiles
-- Fix seg fault when clicking on Add button in wx-console
-  restore panel.  Bug #470.
-- Fix copyright date and URL typo -- bug #468.
-- Change autostart install for FreeBSD to look for rc.conf  
-  rather than rc.local as suggested fix for bug #466.
-- Apply patch supplied by Eric Bollinger to fix PostgreSQL    
-  grant on status. Bug #465
-- Apply patch supplied by Eric Bollinger to fix PostgreSQL
-  update script. Bug #464
-- Tweak #ifdefing a bit in new Win32 stream code.
-- Fix #ifdeffing for FD_NO_SEND_TEST.
-- Add documentation of performance #defines
diff --git a/bacula/nb-1.37 b/bacula/nb-1.37
new file mode 100644 (file)
index 0000000..b9bcce6
--- /dev/null
@@ -0,0 +1,93 @@
+              Technical notes on version 1.37  
+                      Nicolas Boichat
+
+General:
+
+Changes to 1.37.*:
+26Oct05
+ - dvd.c: update VolParts when writing the last part.
+19Oct05
+ - configure: add check for dd, remove check for df
+ - block.c:do_dvd_size_checks: Check we are writing to a dvd before doing tests
+   (reported by David Raine on the list, "[Bacula-users] LTO drive - End Of Volume error").
+ - Update bacula-sd.conf.in to use dvd-handler correctly.
+ - dvd.c:dvd_write_part: Increase timeout when writing the first part (see the code for
+   more details).
+18Oct05
+ - Modify .backups command to get a fileset parameter (fix bug #444).
+17Oct05
+ - Fix bug when recycling DVD devices (append flag was removed).
+ - Add tests for dvd+rw-format in configure script.
+ - scripts/dvd-handler: Reformat DVD-RW when needed. This needs dvd+rw-format.
+ - Add patch for dvd+rw-tools in patches dir (this should probably be elsewhere).
+16Oct05
+ - Remove scripts/dvd-freespace and scripts/dvd-writepart, as they are now
+   merged into scripts/dvd-handler. Note: Documentation needs to be updated.
+ - scripts/dvd-handler: "zero" brand-new DVD+/-RW to fix a problem with some
+   DVD-writers, thanks to Arno Lehmann for reporting this, and providing the
+   way to fix it.
+ - new scripts/dvd-handler. Note: it also needs a patched version of dvd+rw-tools.
+ - new scripts/dvd-freespace. Note: it needs a patched version of dvd+rw-tools.
+ - dvd.c:dvd_write_part: Don't write empty part. (Fix 4GB crossing bug reported by Arno Lehmann)
+14Oct05
+ - dvd.c:dvd_write_part: Use part_size and not max_part_size when setting write timeout.
+ - dvd.c:do_mount_dev: When checking if the DVD is mounted, do not count ., .. and .keep (needed on Gentoo).
+15Aug05
+ - Convert dvd-writepart to Python.
+ - Increase delay from 3 seconds to 5 seconds between SIGTERM and SIGKILL when
+   killing external programs.
+13Aug05
+ - Add gettext macros in autoconf/gettext-macros.
+ - Modify how localedir is set in configure.in.
+ - Remove setlocale check (useless).
+10Aug05
+ - Mark translatable strings in all source files.
+08Aug05
+ - Create French and Italian translation files (fr.po, it.po).
+ - Add support for translation in configure and Makefiles.
+ - Update autoconf/aclocal.m4 so it is automatically created with aclocal
+   (Note: autoconf/gnome-macros is not used anymore, it may be removed).
+30Jul05
+ - Fix src/lib/bpipe.c:run_program and run_program_full_output to detect if the watchdog
+   killed the program, and return an error if it is the case.
+26Apr05
+ - Modify parse_config to get a LEX_ERROR_HANDLER as a parameter 
+ - lex_open_file now returns NULL if the file can't be opened. All calling functions have
+   been adapted.
+ - Remove set_exit_on_error function
+07Apr05
+ - Fix "unknown device type" problem with DVD devices.
+ - Fix crash when there is no media in the DVD drive.
+09Jan05
+ - Update the documentation and ReleaseNotes.
+05Jan05
+ - Add FreeSpaceCommand in Device (SD configuration file) and implement it.
+ - Some modifications (again) on how guessed volume names are handled (now it should work).
+ - Part files on the hard disk are removed if they are empty.
+04Jan05
+ - Major fixes on how guessed volume names are handled.
+ - Minor fix in src/stored/append.c.
+ - Replace, when possible, POOLMEM by POOL_MEM in the new code of src/stored/dev.c.
+ - New script, scripts/dvd-freespace, which gets the free space available on a writable DVD.
+03Jan05
+ - Add WritePartAfterJob directive in Job resource (Director)
+ - Add WritePartAfterJob directive in Schedule Resource (Director)
+ - Implement these new directives
+02Jan05
+ - New function, open_guess_name_dev in src/stored/dev.c, which tries to guess the volume
+   name of a mounted device, so the label can be read.  
+ - New script, scripts/dvd-writepart, which write parts to DVD+/-R(W).
+ - Removed WriteFirstPartCommand directive in Device (SD configuration file).
+ - Use readdir_r instead of readdir (src/stored/dev.c:open_guess_name_dev).
+01Jan05
+ - Add RequiresMount, MountPoint, MountCommand, UnmountCommand directives in Device (SD configuration file).
+ - Implement these directives (volumes can now be restored from a manually written DVD). 
+ - Add WriteFirstPartCommand, WritePartCommand directives in Device (SD configuration file).
+ - Implement these directives (DVD writing now works).
+ - New function run_program_full_output in src/lib/bpipe.c.
+ - Lots of bugfixes and cleanups in the new code.
+29Dec04
+ - Add VolParts field in Media table
+ - Add MaximumPartSize directive in Device (SD configuration file)
+ - File Volumes can now be splitted in multiple files ("parts")
+ - Fix SQL error in sql_list while doing "llist jobmedia"
diff --git a/bacula/nb-1.38 b/bacula/nb-1.38
deleted file mode 100644 (file)
index b12fa90..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-              Technical notes on version 1.38  
-                      Nicolas Boichat
-
-General:
-
-Release 1.38.0: 31 October 2005
diff --git a/bacula/patches/1.38.6-script.patch b/bacula/patches/1.38.6-script.patch
new file mode 100644 (file)
index 0000000..7bce5fd
--- /dev/null
@@ -0,0 +1,63 @@
+
+ This patch fixes a bug in the bacula start/stop script where
+ the binary directory is used rather than the scripts directory.
+ Apply the patch to version 1.38.6 with:
+
+ cd <bacula-source>
+ patch -p0 <1.38.6-script.patch
+ make Makefiles
+ make install
+ ...
+
+Index: scripts/bacula.in
+===================================================================
+RCS file: /cvsroot/bacula/bacula/scripts/bacula.in,v
+retrieving revision 1.13.2.3
+diff -u -r1.13.2.3 bacula.in
+--- scripts/bacula.in  28 Mar 2006 16:42:19 -0000      1.13.2.3
++++ scripts/bacula.in  29 Mar 2006 16:24:51 -0000
+@@ -13,25 +13,22 @@
+ #  easier to "steal" this code for the development 
+ #  environment where they are different.
+ #  
+-BACFDBIN=@sbindir@
+ BACFDCFG=@sysconfdir@
+-BACSDBIN=@sbindir@
+ BACSDCFG=@sysconfdir@
+-BACDIRBIN=@sbindir@
+ BACDIRCFG=@sysconfdir@
+ case "$1" in
+    start)
+-      [ -x ${BACSDBIN}/bacula-ctl-sd ] && ${BACSDBIN}/bacula-ctl-sd $1 $2
+-      [ -x ${BACFDBIN}/bacula-ctl-fd ] && ${BACFDBIN}/bacula-ctl-fd $1 $2
+-      [ -x ${BACDIRBIN}/bacula-ctl-dir ] && ${BACDIRBIN}/bacula-ctl-dir $1 $2
++      [ -x ${BACSDCFG}/bacula-ctl-sd ] && ${BACSDCFG}/bacula-ctl-sd $1 $2
++      [ -x ${BACFDCFG}/bacula-ctl-fd ] && ${BACFDCFG}/bacula-ctl-fd $1 $2
++      [ -x ${BACDIRCFG}/bacula-ctl-dir ] && ${BACDIRCFG}/bacula-ctl-dir $1 $2
+       ;;
+    stop)
+       # Stop the FD first so that SD will fail jobs and update catalog
+-      [ -x ${BACFDBIN}/bacula-ctl-fd ] && ${BACFDBIN}/bacula-ctl-fd $1 $2
+-      [ -x ${BACSDBIN}/bacula-ctl-sd ] && ${BACSDBIN}/bacula-ctl-sd $1 $2
+-      [ -x ${BACDIRBIN}/bacula-ctl-dir ] && ${BACDIRBIN}/bacula-ctl-dir $1 $2
++      [ -x ${BACFDCFG}/bacula-ctl-fd ] && ${BACFDCFG}/bacula-ctl-fd $1 $2
++      [ -x ${BACSDCFG}/bacula-ctl-sd ] && ${BACSDCFG}/bacula-ctl-sd $1 $2
++      [ -x ${BACDIRCFG}/bacula-ctl-dir ] && ${BACDIRCFG}/bacula-ctl-dir $1 $2
+       echo
+       sleep 6
+       ;;
+@@ -42,9 +39,9 @@
+       ;;
+    status)
+-      [ -x ${BACSDBIN}/bacula-ctl-sd ] && ${BACSDBIN}/bacula-ctl-sd status
+-      [ -x ${BACFDBIN}/bacula-ctl-fd ] && ${BACFDBIN}/bacula-ctl-fd status
+-      [ -x ${BACDIRBIN}/bacula-ctl-dir ] && ${BACDIRBIN}/bacula-ctl-dir status
++      [ -x ${BACSDCFG}/bacula-ctl-sd ] && ${BACSDCFG}/bacula-ctl-sd status
++      [ -x ${BACFDCFG}/bacula-ctl-fd ] && ${BACFDCFG}/bacula-ctl-fd status
++      [ -x ${BACDIRCFG}/bacula-ctl-dir ] && ${BACDIRCFG}/bacula-ctl-dir status
+       ;;
+    *)
diff --git a/bacula/patches/1.38.7-mysql.patch b/bacula/patches/1.38.7-mysql.patch
new file mode 100644 (file)
index 0000000..43e18a1
--- /dev/null
@@ -0,0 +1,34 @@
+
+This patch (thanks to Frank Sweetser) should fix the timeout problem
+users are experiencing with MySQL versions greater than 5.0.13.  
+It can be applied to Bacula version 1.38.7 (and possibly 1.38.5 and 1.38.6)
+with:
+
+  cd <bacula-source>
+  patch -p0 <1.38.7-mysql.patch
+  make
+  make install
+
+Index: src/cats/mysql.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/cats/mysql.c,v
+retrieving revision 1.37.2.2
+diff -u -r1.37.2.2 mysql.c
+--- src/cats/mysql.c   4 Mar 2006 11:10:17 -0000       1.37.2.2
++++ src/cats/mysql.c   7 Apr 2006 14:10:23 -0000
+@@ -132,7 +132,6 @@
+    mysql_server_init(0, NULL, NULL);
+ #endif
+    mysql_init(&(mdb->mysql));
+-   mdb->mysql.reconnect = 1;             /* so connection does not timeout */
+    Dmsg0(50, "mysql_init done\n");
+    /* If connection fails, try at 5 sec intervals for 30 seconds. */
+    for (int retry=0; retry < 6; retry++) {
+@@ -153,6 +152,7 @@
+       bmicrosleep(5,0);
+    }
++   mdb->mysql.reconnect = 1;             /* so connection does not timeout */
+    Dmsg0(50, "mysql_real_connect done\n");
+    Dmsg3(50, "db_user=%s db_name=%s db_password=%s\n", mdb->db_user, mdb->db_name,
+             mdb->db_password==NULL?"(NULL)":mdb->db_password);
index f6a1730653edf5f31f3e94ff505540070866de73..f0fa1a5dfa8b4a77555df21ff292a6c9ea4e7e4a 100644 (file)
@@ -5,7 +5,7 @@
 
 # basic defines for every build
 %define depkgs ../depkgs
-%define depkgs_version 22Jun05
+%define depkgs_version 28Mar06
 %define sqlite_bindir /usr/lib/bacula/sqlite
 %define working_dir /var/bacula
 %define director_daemon_user bacula
@@ -18,7 +18,8 @@
 %define group_file /etc/group
 %define useradd /usr/sbin/useradd
 %define groupadd /usr/sbin/groupadd
-%define _rescuever 1.8.2
+%define usermod /usr/sbin/usermod
+%define _rescuever 1.8.3
 
 # platform defines - set one below or define the build_xxx on the command line
 # RedHat builds
@@ -121,7 +122,7 @@ exit 1
 %define _dist %(grep -i SuSE /etc/SuSE-release)
 %endif
 %if %{mdk}
-%define _dist %(grep Mandrake /etc/mandrake-release)
+%define _dist %(grep Mand /etc/mandrake-release)
 %endif
 
 # Should we build gconsole, possible only if gnome >= 2.0 available
@@ -130,6 +131,8 @@ exit 1
 %else
 %define gconsole 1
 %endif
+# specifically disallow gconsole if desired
+%{?nobuild_gconsole:%define gconsole 0}
 
 Summary: Bacula - The Network Backup Solution
 Name: bacula
@@ -142,6 +145,8 @@ Source1:http://www.prdownloads.sourceforge.net/bacula/depkgs-%{depkgs_version}.t
 Source2: Release_Notes-%{version}-%{release}.tar.gz
 Source3:http://www.prdownloads.sourceforge.net/bacula/%{name}-docs-%{version}.tar.gz
 Source4:http://www.prdownloads.sourceforge.net/bacula/%{name}-rescue-%{_rescuever}.tar.gz
+Patch0: bacula-1.38.6-script.patch
+Patch1: bacula-1.38.6-makefile.patch
 BuildRoot: %{_tmppath}/%{name}-root
 URL: http://www.bacula.org/
 Vendor: The Bacula Team
@@ -152,19 +157,23 @@ Packager: D. Scott Barninger <barninger@fairfieldcomputers.com>
 %define _rescuesrc ../%{name}-rescue-%{_rescuever}
 
 BuildRequires: atk-devel, ncurses-devel, pango-devel, perl
-BuildRequires: libstdc++-devel, libxml2-devel, zlib-devel, pkgconfig
+BuildRequires: libstdc++-devel, libxml2-devel, zlib-devel
 BuildRequires: openssl-devel
+%if %{gconsole}
+BuildRequires: pkgconfig
+%endif
 %if %{rh7}
 BuildRequires: libtermcap-devel
 BuildRequires: glibc-devel >= 2.2
-BuildRequires: ORBit-devel
 %endif
 %if %{su9}
 BuildRequires: termcap
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{su9} && %{gconsole}
 BuildRequires: libgnome >= 2.0
 BuildRequires: gtk2-devel >= 2.0
 BuildRequires: libgnomeui-devel >= 2.0
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.0
 BuildRequires: libbonobo-devel >= 2.0
@@ -176,10 +185,12 @@ BuildRequires: freetype2-devel
 %endif
 %if %{su10}
 BuildRequires: termcap
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{su10} && %{gconsole}
 BuildRequires: libgnome >= 2.12
 BuildRequires: gtk2-devel >= 2.8
 BuildRequires: libgnomeui-devel >= 2.12
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.3
 BuildRequires: libbonobo-devel >= 2.10
@@ -194,24 +205,28 @@ BuildRequires: libpng-devel
 %endif
 %if %{mdk}
 BuildRequires: libtermcap-devel
+BuildRequires: libstdc++-static-devel
+BuildRequires: glibc-static-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{mdk} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.0
 BuildRequires: libgnomeui2-devel >= 2.0
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: libORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.0
 BuildRequires: libbonobo2_0-devel
 BuildRequires: libbonoboui2_0-devel
 BuildRequires: libbonobo-activation-devel
 BuildRequires: libGConf2-devel
-BuildRequires: libstdc++-static-devel
-BuildRequires: glibc-static-devel
 BuildRequires: freetype2-devel
 %endif
 %if %{fc3}
 BuildRequires: libtermcap-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{fc3} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.4
 BuildRequires: libgnomeui-devel >= 2.8
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.3
 BuildRequires: libbonobo-devel >= 2.8
@@ -222,9 +237,11 @@ BuildRequires: freetype-devel
 %endif
 %if %{fc4}
 BuildRequires: libtermcap-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{fc4} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.6
 BuildRequires: libgnomeui-devel >= 2.10
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.3
 BuildRequires: libbonobo-devel >= 2.8
@@ -235,9 +252,11 @@ BuildRequires: freetype-devel
 %endif
 %if ! %{rh7} && ! %{su9} && ! %{su10} && ! %{mdk} && ! %{fc3} && ! %{fc4}
 BuildRequires: libtermcap-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if ! %{rh7} && ! %{su9} && ! %{su10} && ! %{mdk} && ! %{fc3} && ! %{fc4} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.0
 BuildRequires: libgnomeui-devel >= 2.0
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.0
 BuildRequires: libbonobo-devel >= 2.0
@@ -560,6 +579,9 @@ server packages.
 %setup -T -D -b 3
 %setup -T -D -b 4
 
+%patch0
+%patch1 -p1
+
 %build
 
 %if %{su9} || %{su10}
@@ -613,9 +635,9 @@ export LDFLAGS=-L/usr/lib64/mysql
         --with-scriptdir=/etc/bacula \
         --enable-smartalloc \
         --enable-client-only \
-       %if %{mdk}
-       --disable-nls \
-       %endif
+        %if %{mdk}
+        --disable-nls \
+        %endif
         --enable-static-fd
 
 make
@@ -715,6 +737,11 @@ rm -f $RPM_BUILD_ROOT/etc/bacula/startmysql
 rm -f $RPM_BUILD_ROOT/etc/bacula/stopmysql
 %endif
 
+# fixme - make installs gconsole script for build without gconsole
+%if ! %{gconsole}
+rm -f $RPM_BUILD_ROOT/etc/bacula/gconsole
+%endif
+
 rm -f $RPM_BUILD_ROOT/usr/sbin/static-bacula-fd
 
 # install the init scripts
@@ -863,6 +890,10 @@ chmod 644 $RPM_BUILD_ROOT/etc/bacula/tray-monitor.conf
 %attr(-, root, %{daemon_group}) /etc/bacula/btraceback.dbx
 %attr(-, root, %{daemon_group}) /etc/bacula/btraceback.gdb
 %attr(-, root, %{daemon_group}) /etc/bacula/rescue
+%attr(-, root, %{daemon_group}) /etc/bacula/disk-changer
+%attr(-, root, %{daemon_group}) /etc/bacula/bacula-ctl-dir
+%attr(-, root, %{daemon_group}) /etc/bacula/bacula-ctl-fd
+%attr(-, root, %{daemon_group}) /etc/bacula/bacula-ctl-sd
 %attr(-, root, %{daemon_group}) /etc/init.d/bacula-dir
 %attr(-, root, %{daemon_group}) /etc/init.d/bacula-fd
 %attr(-, root, %{storage_daemon_group}) /etc/bacula/dvd-handler
@@ -934,7 +965,8 @@ if [ -s /etc/bacula/console.conf ];then
         cp -p /etc/bacula/console.conf /etc/bacula/bconsole.conf
 fi
 
-# create the daemon user and group
+# create the daemon users and groups
+# first create the groups if they don't exist
 HAVE_BACULA=`grep %{daemon_group} %{group_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
         %{groupadd} -r %{daemon_group} > /dev/null 2>&1
@@ -947,24 +979,41 @@ if [ -z "$HAVE_BACULA" ]; then
         echo "The group %{storage_daemon_group} has been added to %{group_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# now create the users if they do not exist
+# we do not use the -g option allowing the primary group to be set to system default
+# this will be a unique group on redhat type systems or the group users on some systems
 HAVE_BACULA=`grep %{storage_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{storage_daemon_group} -M -n -s /sbin/nologin %{storage_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{storage_daemon_user} > /dev/null 2>&1
         echo "The user %{storage_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
 HAVE_BACULA=`grep %{director_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{daemon_group} -M -n -s /sbin/nologin %{director_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{director_daemon_user} > /dev/null 2>&1
         echo "The user %{director_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
 HAVE_BACULA=`grep %{file_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{daemon_group} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
         echo "The user %{file_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# now we add the supplementary groups, this is ok to call even if the users already exist
+# we only do this if the user is NOT root
+IS_ROOT=%{director_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{director_daemon_user} -G %{daemon_group}
+fi
+IS_ROOT=%{storage_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{storage_daemon_user} -G %{daemon_group},%{storage_daemon_group}
+fi
+IS_ROOT=%{file_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{file_daemon_user} -G %{daemon_group}
+fi
 
 %if %{mysql}
 %post mysql
@@ -1133,12 +1182,20 @@ if [ -z "$HAVE_BACULA" ]; then
         echo "The group %{daemon_group} has been added to %{group_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# we do not use the -g option allowing the primary group to be set to system default
+# this will be a unique group on redhat type systems or the group users on some systems
 HAVE_BACULA=`grep %{file_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{daemon_group} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
         echo "The user %{file_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# now we add the supplementary group, this is ok to call even if the user already exists
+# we only do this if the user is NOT root
+IS_ROOT=%{file_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{file_daemon_user} -G %{daemon_group}
+fi
 
 %post client
 # add our link
@@ -1239,6 +1296,10 @@ fi
 %endif
 
 %changelog
+* Sun Apr 02 2006 D. Scott Barninger <barninger@fairfieldcomputers.com>
+- 1.38.6 release
+- fix problem specifying more than one primary group for user bacula
+- add build switch to not build gconsole regardless of platform
 * Sun Jan 29 2006 D. Scott Barninger <barninger@fairfieldcomputers.com>
 - add centos3 build tag
 - fix link error of static-fd on Mandrake with --disable-nls
index f6a1730653edf5f31f3e94ff505540070866de73..f0fa1a5dfa8b4a77555df21ff292a6c9ea4e7e4a 100644 (file)
@@ -5,7 +5,7 @@
 
 # basic defines for every build
 %define depkgs ../depkgs
-%define depkgs_version 22Jun05
+%define depkgs_version 28Mar06
 %define sqlite_bindir /usr/lib/bacula/sqlite
 %define working_dir /var/bacula
 %define director_daemon_user bacula
@@ -18,7 +18,8 @@
 %define group_file /etc/group
 %define useradd /usr/sbin/useradd
 %define groupadd /usr/sbin/groupadd
-%define _rescuever 1.8.2
+%define usermod /usr/sbin/usermod
+%define _rescuever 1.8.3
 
 # platform defines - set one below or define the build_xxx on the command line
 # RedHat builds
@@ -121,7 +122,7 @@ exit 1
 %define _dist %(grep -i SuSE /etc/SuSE-release)
 %endif
 %if %{mdk}
-%define _dist %(grep Mandrake /etc/mandrake-release)
+%define _dist %(grep Mand /etc/mandrake-release)
 %endif
 
 # Should we build gconsole, possible only if gnome >= 2.0 available
@@ -130,6 +131,8 @@ exit 1
 %else
 %define gconsole 1
 %endif
+# specifically disallow gconsole if desired
+%{?nobuild_gconsole:%define gconsole 0}
 
 Summary: Bacula - The Network Backup Solution
 Name: bacula
@@ -142,6 +145,8 @@ Source1:http://www.prdownloads.sourceforge.net/bacula/depkgs-%{depkgs_version}.t
 Source2: Release_Notes-%{version}-%{release}.tar.gz
 Source3:http://www.prdownloads.sourceforge.net/bacula/%{name}-docs-%{version}.tar.gz
 Source4:http://www.prdownloads.sourceforge.net/bacula/%{name}-rescue-%{_rescuever}.tar.gz
+Patch0: bacula-1.38.6-script.patch
+Patch1: bacula-1.38.6-makefile.patch
 BuildRoot: %{_tmppath}/%{name}-root
 URL: http://www.bacula.org/
 Vendor: The Bacula Team
@@ -152,19 +157,23 @@ Packager: D. Scott Barninger <barninger@fairfieldcomputers.com>
 %define _rescuesrc ../%{name}-rescue-%{_rescuever}
 
 BuildRequires: atk-devel, ncurses-devel, pango-devel, perl
-BuildRequires: libstdc++-devel, libxml2-devel, zlib-devel, pkgconfig
+BuildRequires: libstdc++-devel, libxml2-devel, zlib-devel
 BuildRequires: openssl-devel
+%if %{gconsole}
+BuildRequires: pkgconfig
+%endif
 %if %{rh7}
 BuildRequires: libtermcap-devel
 BuildRequires: glibc-devel >= 2.2
-BuildRequires: ORBit-devel
 %endif
 %if %{su9}
 BuildRequires: termcap
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{su9} && %{gconsole}
 BuildRequires: libgnome >= 2.0
 BuildRequires: gtk2-devel >= 2.0
 BuildRequires: libgnomeui-devel >= 2.0
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.0
 BuildRequires: libbonobo-devel >= 2.0
@@ -176,10 +185,12 @@ BuildRequires: freetype2-devel
 %endif
 %if %{su10}
 BuildRequires: termcap
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{su10} && %{gconsole}
 BuildRequires: libgnome >= 2.12
 BuildRequires: gtk2-devel >= 2.8
 BuildRequires: libgnomeui-devel >= 2.12
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.3
 BuildRequires: libbonobo-devel >= 2.10
@@ -194,24 +205,28 @@ BuildRequires: libpng-devel
 %endif
 %if %{mdk}
 BuildRequires: libtermcap-devel
+BuildRequires: libstdc++-static-devel
+BuildRequires: glibc-static-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{mdk} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.0
 BuildRequires: libgnomeui2-devel >= 2.0
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: libORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.0
 BuildRequires: libbonobo2_0-devel
 BuildRequires: libbonoboui2_0-devel
 BuildRequires: libbonobo-activation-devel
 BuildRequires: libGConf2-devel
-BuildRequires: libstdc++-static-devel
-BuildRequires: glibc-static-devel
 BuildRequires: freetype2-devel
 %endif
 %if %{fc3}
 BuildRequires: libtermcap-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{fc3} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.4
 BuildRequires: libgnomeui-devel >= 2.8
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.3
 BuildRequires: libbonobo-devel >= 2.8
@@ -222,9 +237,11 @@ BuildRequires: freetype-devel
 %endif
 %if %{fc4}
 BuildRequires: libtermcap-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{fc4} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.6
 BuildRequires: libgnomeui-devel >= 2.10
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.3
 BuildRequires: libbonobo-devel >= 2.8
@@ -235,9 +252,11 @@ BuildRequires: freetype-devel
 %endif
 %if ! %{rh7} && ! %{su9} && ! %{su10} && ! %{mdk} && ! %{fc3} && ! %{fc4}
 BuildRequires: libtermcap-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if ! %{rh7} && ! %{su9} && ! %{su10} && ! %{mdk} && ! %{fc3} && ! %{fc4} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.0
 BuildRequires: libgnomeui-devel >= 2.0
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.0
 BuildRequires: libbonobo-devel >= 2.0
@@ -560,6 +579,9 @@ server packages.
 %setup -T -D -b 3
 %setup -T -D -b 4
 
+%patch0
+%patch1 -p1
+
 %build
 
 %if %{su9} || %{su10}
@@ -613,9 +635,9 @@ export LDFLAGS=-L/usr/lib64/mysql
         --with-scriptdir=/etc/bacula \
         --enable-smartalloc \
         --enable-client-only \
-       %if %{mdk}
-       --disable-nls \
-       %endif
+        %if %{mdk}
+        --disable-nls \
+        %endif
         --enable-static-fd
 
 make
@@ -715,6 +737,11 @@ rm -f $RPM_BUILD_ROOT/etc/bacula/startmysql
 rm -f $RPM_BUILD_ROOT/etc/bacula/stopmysql
 %endif
 
+# fixme - make installs gconsole script for build without gconsole
+%if ! %{gconsole}
+rm -f $RPM_BUILD_ROOT/etc/bacula/gconsole
+%endif
+
 rm -f $RPM_BUILD_ROOT/usr/sbin/static-bacula-fd
 
 # install the init scripts
@@ -863,6 +890,10 @@ chmod 644 $RPM_BUILD_ROOT/etc/bacula/tray-monitor.conf
 %attr(-, root, %{daemon_group}) /etc/bacula/btraceback.dbx
 %attr(-, root, %{daemon_group}) /etc/bacula/btraceback.gdb
 %attr(-, root, %{daemon_group}) /etc/bacula/rescue
+%attr(-, root, %{daemon_group}) /etc/bacula/disk-changer
+%attr(-, root, %{daemon_group}) /etc/bacula/bacula-ctl-dir
+%attr(-, root, %{daemon_group}) /etc/bacula/bacula-ctl-fd
+%attr(-, root, %{daemon_group}) /etc/bacula/bacula-ctl-sd
 %attr(-, root, %{daemon_group}) /etc/init.d/bacula-dir
 %attr(-, root, %{daemon_group}) /etc/init.d/bacula-fd
 %attr(-, root, %{storage_daemon_group}) /etc/bacula/dvd-handler
@@ -934,7 +965,8 @@ if [ -s /etc/bacula/console.conf ];then
         cp -p /etc/bacula/console.conf /etc/bacula/bconsole.conf
 fi
 
-# create the daemon user and group
+# create the daemon users and groups
+# first create the groups if they don't exist
 HAVE_BACULA=`grep %{daemon_group} %{group_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
         %{groupadd} -r %{daemon_group} > /dev/null 2>&1
@@ -947,24 +979,41 @@ if [ -z "$HAVE_BACULA" ]; then
         echo "The group %{storage_daemon_group} has been added to %{group_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# now create the users if they do not exist
+# we do not use the -g option allowing the primary group to be set to system default
+# this will be a unique group on redhat type systems or the group users on some systems
 HAVE_BACULA=`grep %{storage_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{storage_daemon_group} -M -n -s /sbin/nologin %{storage_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{storage_daemon_user} > /dev/null 2>&1
         echo "The user %{storage_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
 HAVE_BACULA=`grep %{director_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{daemon_group} -M -n -s /sbin/nologin %{director_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{director_daemon_user} > /dev/null 2>&1
         echo "The user %{director_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
 HAVE_BACULA=`grep %{file_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{daemon_group} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
         echo "The user %{file_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# now we add the supplementary groups, this is ok to call even if the users already exist
+# we only do this if the user is NOT root
+IS_ROOT=%{director_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{director_daemon_user} -G %{daemon_group}
+fi
+IS_ROOT=%{storage_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{storage_daemon_user} -G %{daemon_group},%{storage_daemon_group}
+fi
+IS_ROOT=%{file_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{file_daemon_user} -G %{daemon_group}
+fi
 
 %if %{mysql}
 %post mysql
@@ -1133,12 +1182,20 @@ if [ -z "$HAVE_BACULA" ]; then
         echo "The group %{daemon_group} has been added to %{group_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# we do not use the -g option allowing the primary group to be set to system default
+# this will be a unique group on redhat type systems or the group users on some systems
 HAVE_BACULA=`grep %{file_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{daemon_group} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
         echo "The user %{file_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# now we add the supplementary group, this is ok to call even if the user already exists
+# we only do this if the user is NOT root
+IS_ROOT=%{file_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{file_daemon_user} -G %{daemon_group}
+fi
 
 %post client
 # add our link
@@ -1239,6 +1296,10 @@ fi
 %endif
 
 %changelog
+* Sun Apr 02 2006 D. Scott Barninger <barninger@fairfieldcomputers.com>
+- 1.38.6 release
+- fix problem specifying more than one primary group for user bacula
+- add build switch to not build gconsole regardless of platform
 * Sun Jan 29 2006 D. Scott Barninger <barninger@fairfieldcomputers.com>
 - add centos3 build tag
 - fix link error of static-fd on Mandrake with --disable-nls
index f6a1730653edf5f31f3e94ff505540070866de73..f0fa1a5dfa8b4a77555df21ff292a6c9ea4e7e4a 100644 (file)
@@ -5,7 +5,7 @@
 
 # basic defines for every build
 %define depkgs ../depkgs
-%define depkgs_version 22Jun05
+%define depkgs_version 28Mar06
 %define sqlite_bindir /usr/lib/bacula/sqlite
 %define working_dir /var/bacula
 %define director_daemon_user bacula
@@ -18,7 +18,8 @@
 %define group_file /etc/group
 %define useradd /usr/sbin/useradd
 %define groupadd /usr/sbin/groupadd
-%define _rescuever 1.8.2
+%define usermod /usr/sbin/usermod
+%define _rescuever 1.8.3
 
 # platform defines - set one below or define the build_xxx on the command line
 # RedHat builds
@@ -121,7 +122,7 @@ exit 1
 %define _dist %(grep -i SuSE /etc/SuSE-release)
 %endif
 %if %{mdk}
-%define _dist %(grep Mandrake /etc/mandrake-release)
+%define _dist %(grep Mand /etc/mandrake-release)
 %endif
 
 # Should we build gconsole, possible only if gnome >= 2.0 available
@@ -130,6 +131,8 @@ exit 1
 %else
 %define gconsole 1
 %endif
+# specifically disallow gconsole if desired
+%{?nobuild_gconsole:%define gconsole 0}
 
 Summary: Bacula - The Network Backup Solution
 Name: bacula
@@ -142,6 +145,8 @@ Source1:http://www.prdownloads.sourceforge.net/bacula/depkgs-%{depkgs_version}.t
 Source2: Release_Notes-%{version}-%{release}.tar.gz
 Source3:http://www.prdownloads.sourceforge.net/bacula/%{name}-docs-%{version}.tar.gz
 Source4:http://www.prdownloads.sourceforge.net/bacula/%{name}-rescue-%{_rescuever}.tar.gz
+Patch0: bacula-1.38.6-script.patch
+Patch1: bacula-1.38.6-makefile.patch
 BuildRoot: %{_tmppath}/%{name}-root
 URL: http://www.bacula.org/
 Vendor: The Bacula Team
@@ -152,19 +157,23 @@ Packager: D. Scott Barninger <barninger@fairfieldcomputers.com>
 %define _rescuesrc ../%{name}-rescue-%{_rescuever}
 
 BuildRequires: atk-devel, ncurses-devel, pango-devel, perl
-BuildRequires: libstdc++-devel, libxml2-devel, zlib-devel, pkgconfig
+BuildRequires: libstdc++-devel, libxml2-devel, zlib-devel
 BuildRequires: openssl-devel
+%if %{gconsole}
+BuildRequires: pkgconfig
+%endif
 %if %{rh7}
 BuildRequires: libtermcap-devel
 BuildRequires: glibc-devel >= 2.2
-BuildRequires: ORBit-devel
 %endif
 %if %{su9}
 BuildRequires: termcap
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{su9} && %{gconsole}
 BuildRequires: libgnome >= 2.0
 BuildRequires: gtk2-devel >= 2.0
 BuildRequires: libgnomeui-devel >= 2.0
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.0
 BuildRequires: libbonobo-devel >= 2.0
@@ -176,10 +185,12 @@ BuildRequires: freetype2-devel
 %endif
 %if %{su10}
 BuildRequires: termcap
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{su10} && %{gconsole}
 BuildRequires: libgnome >= 2.12
 BuildRequires: gtk2-devel >= 2.8
 BuildRequires: libgnomeui-devel >= 2.12
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.3
 BuildRequires: libbonobo-devel >= 2.10
@@ -194,24 +205,28 @@ BuildRequires: libpng-devel
 %endif
 %if %{mdk}
 BuildRequires: libtermcap-devel
+BuildRequires: libstdc++-static-devel
+BuildRequires: glibc-static-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{mdk} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.0
 BuildRequires: libgnomeui2-devel >= 2.0
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: libORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.0
 BuildRequires: libbonobo2_0-devel
 BuildRequires: libbonoboui2_0-devel
 BuildRequires: libbonobo-activation-devel
 BuildRequires: libGConf2-devel
-BuildRequires: libstdc++-static-devel
-BuildRequires: glibc-static-devel
 BuildRequires: freetype2-devel
 %endif
 %if %{fc3}
 BuildRequires: libtermcap-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{fc3} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.4
 BuildRequires: libgnomeui-devel >= 2.8
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.3
 BuildRequires: libbonobo-devel >= 2.8
@@ -222,9 +237,11 @@ BuildRequires: freetype-devel
 %endif
 %if %{fc4}
 BuildRequires: libtermcap-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if %{fc4} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.6
 BuildRequires: libgnomeui-devel >= 2.10
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.3
 BuildRequires: libbonobo-devel >= 2.8
@@ -235,9 +252,11 @@ BuildRequires: freetype-devel
 %endif
 %if ! %{rh7} && ! %{su9} && ! %{su10} && ! %{mdk} && ! %{fc3} && ! %{fc4}
 BuildRequires: libtermcap-devel
+BuildRequires: glibc-devel >= 2.3
+%endif
+%if ! %{rh7} && ! %{su9} && ! %{su10} && ! %{mdk} && ! %{fc3} && ! %{fc4} && %{gconsole}
 BuildRequires: gtk2-devel >= 2.0
 BuildRequires: libgnomeui-devel >= 2.0
-BuildRequires: glibc-devel >= 2.3
 BuildRequires: ORBit2-devel
 BuildRequires: libart_lgpl-devel >= 2.0
 BuildRequires: libbonobo-devel >= 2.0
@@ -560,6 +579,9 @@ server packages.
 %setup -T -D -b 3
 %setup -T -D -b 4
 
+%patch0
+%patch1 -p1
+
 %build
 
 %if %{su9} || %{su10}
@@ -613,9 +635,9 @@ export LDFLAGS=-L/usr/lib64/mysql
         --with-scriptdir=/etc/bacula \
         --enable-smartalloc \
         --enable-client-only \
-       %if %{mdk}
-       --disable-nls \
-       %endif
+        %if %{mdk}
+        --disable-nls \
+        %endif
         --enable-static-fd
 
 make
@@ -715,6 +737,11 @@ rm -f $RPM_BUILD_ROOT/etc/bacula/startmysql
 rm -f $RPM_BUILD_ROOT/etc/bacula/stopmysql
 %endif
 
+# fixme - make installs gconsole script for build without gconsole
+%if ! %{gconsole}
+rm -f $RPM_BUILD_ROOT/etc/bacula/gconsole
+%endif
+
 rm -f $RPM_BUILD_ROOT/usr/sbin/static-bacula-fd
 
 # install the init scripts
@@ -863,6 +890,10 @@ chmod 644 $RPM_BUILD_ROOT/etc/bacula/tray-monitor.conf
 %attr(-, root, %{daemon_group}) /etc/bacula/btraceback.dbx
 %attr(-, root, %{daemon_group}) /etc/bacula/btraceback.gdb
 %attr(-, root, %{daemon_group}) /etc/bacula/rescue
+%attr(-, root, %{daemon_group}) /etc/bacula/disk-changer
+%attr(-, root, %{daemon_group}) /etc/bacula/bacula-ctl-dir
+%attr(-, root, %{daemon_group}) /etc/bacula/bacula-ctl-fd
+%attr(-, root, %{daemon_group}) /etc/bacula/bacula-ctl-sd
 %attr(-, root, %{daemon_group}) /etc/init.d/bacula-dir
 %attr(-, root, %{daemon_group}) /etc/init.d/bacula-fd
 %attr(-, root, %{storage_daemon_group}) /etc/bacula/dvd-handler
@@ -934,7 +965,8 @@ if [ -s /etc/bacula/console.conf ];then
         cp -p /etc/bacula/console.conf /etc/bacula/bconsole.conf
 fi
 
-# create the daemon user and group
+# create the daemon users and groups
+# first create the groups if they don't exist
 HAVE_BACULA=`grep %{daemon_group} %{group_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
         %{groupadd} -r %{daemon_group} > /dev/null 2>&1
@@ -947,24 +979,41 @@ if [ -z "$HAVE_BACULA" ]; then
         echo "The group %{storage_daemon_group} has been added to %{group_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# now create the users if they do not exist
+# we do not use the -g option allowing the primary group to be set to system default
+# this will be a unique group on redhat type systems or the group users on some systems
 HAVE_BACULA=`grep %{storage_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{storage_daemon_group} -M -n -s /sbin/nologin %{storage_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{storage_daemon_user} > /dev/null 2>&1
         echo "The user %{storage_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
 HAVE_BACULA=`grep %{director_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{daemon_group} -M -n -s /sbin/nologin %{director_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{director_daemon_user} > /dev/null 2>&1
         echo "The user %{director_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
 HAVE_BACULA=`grep %{file_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{daemon_group} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
         echo "The user %{file_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# now we add the supplementary groups, this is ok to call even if the users already exist
+# we only do this if the user is NOT root
+IS_ROOT=%{director_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{director_daemon_user} -G %{daemon_group}
+fi
+IS_ROOT=%{storage_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{storage_daemon_user} -G %{daemon_group},%{storage_daemon_group}
+fi
+IS_ROOT=%{file_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{file_daemon_user} -G %{daemon_group}
+fi
 
 %if %{mysql}
 %post mysql
@@ -1133,12 +1182,20 @@ if [ -z "$HAVE_BACULA" ]; then
         echo "The group %{daemon_group} has been added to %{group_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# we do not use the -g option allowing the primary group to be set to system default
+# this will be a unique group on redhat type systems or the group users on some systems
 HAVE_BACULA=`grep %{file_daemon_user} %{user_file} 2>/dev/null`
 if [ -z "$HAVE_BACULA" ]; then
-        %{useradd} -r -c "Bacula" -d %{working_dir} -g %{daemon_group} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
+        %{useradd} -r -c "Bacula" -d %{working_dir} -M -n -s /sbin/nologin %{file_daemon_user} > /dev/null 2>&1
         echo "The user %{file_daemon_user} has been added to %{user_file}."
         echo "See the manual chapter \"Running Bacula\" for details."
 fi
+# now we add the supplementary group, this is ok to call even if the user already exists
+# we only do this if the user is NOT root
+IS_ROOT=%{file_daemon_user}
+if [ "$IS_ROOT" != "root" ]; then
+%{usermod} %{file_daemon_user} -G %{daemon_group}
+fi
 
 %post client
 # add our link
@@ -1239,6 +1296,10 @@ fi
 %endif
 
 %changelog
+* Sun Apr 02 2006 D. Scott Barninger <barninger@fairfieldcomputers.com>
+- 1.38.6 release
+- fix problem specifying more than one primary group for user bacula
+- add build switch to not build gconsole regardless of platform
 * Sun Jan 29 2006 D. Scott Barninger <barninger@fairfieldcomputers.com>
 - add centos3 build tag
 - fix link error of static-fd on Mandrake with --disable-nls
index 289778ec8a337895200d857eaf84a20c5dc98968..fc01a1cb3fd7d68e02ae7b141802facbb1bec751 100644 (file)
@@ -1,3 +1,4 @@
 fr
 it
 de
+es
index 1feb607bda05b1b029cabde948139f8d059aa475..f7d020f6fbffded46c017dcc07732248b6bcfc6b 100644 (file)
@@ -41,6 +41,7 @@
 ./src/dird/msgchan.c
 ./src/dird/newvol.c
 ./src/dird/next_vol.c
+./src/dird/pythondir.c
 ./src/dird/recycle.c
 ./src/dird/restore.c
 ./src/dird/run_conf.c
 ./src/dird/ua_server.c
 ./src/dird/ua_status.c
 ./src/dird/ua_tree.c
-./src/dird/verify.c
 ./src/dird/ua_update.c
-./src/dird/pythondir.c
+./src/dird/verify.c
 ./src/filed/win32/popup.c
+./src/filed/acl.c
 ./src/filed/authenticate.c
 ./src/filed/backup.c
+./src/filed/chksum.c
 ./src/filed/estimate.c
 ./src/filed/filed.c
 ./src/filed/filed_conf.c
 ./src/filed/heartbeat.c
 ./src/filed/job.c
+./src/filed/pythonfd.c
 ./src/filed/restore.c
 ./src/filed/status.c
 ./src/filed/verify.c
 ./src/filed/verify_vol.c
-./src/filed/acl.c
-./src/filed/chksum.c
-./src/filed/pythonfd.c
 ./src/findlib/attribs.c
 ./src/findlib/bfile.c
 ./src/findlib/create_file.c
 ./src/findlib/enable_priv.c
 ./src/findlib/find.c
 ./src/findlib/find_one.c
+./src/findlib/fstype.c
 ./src/findlib/makepath.c
 ./src/findlib/match.c
 ./src/findlib/save-cwd.c
-./src/findlib/fstype.c
 ./src/gnome2-console/authenticate.c
 ./src/gnome2-console/callbacks.c
 ./src/gnome2-console/console.c
@@ -96,6 +96,7 @@
 ./src/gnome2-console/interface.c
 ./src/gnome2-console/restore.c
 ./src/gnome2-console/support.c
+./src/lib/tls.c
 ./src/lib/address_conf.c
 ./src/lib/alist.c
 ./src/lib/alloc.c
 ./src/lib/bnet_pkt.c
 ./src/lib/bnet_server.c
 ./src/lib/bpipe.c
+./src/lib/bregex.c
 ./src/lib/bshm.c
 ./src/lib/bsys.c
 ./src/lib/btime.c
 ./src/lib/mem_pool.c
 ./src/lib/message.c
 ./src/lib/parse_conf.c
-./src/lib/regex.c
+./src/lib/pythonlib.c
 ./src/lib/queue.c
+./src/lib/res.c
 ./src/lib/rwlock.c
 ./src/lib/scan.c
 ./src/lib/semlock.c
 ./src/lib/util.c
 ./src/lib/var.c
 ./src/lib/watchdog.c
-./src/lib/workq.c
-./src/lib/pythonlib.c
-./src/lib/res.c
-./src/lib/tls.c
 ./src/lib/winapi.c
+./src/lib/workq.c
 ./src/stored/acquire.c
+./src/stored/ansi_label.c
 ./src/stored/append.c
 ./src/stored/askdir.c
 ./src/stored/authenticate.c
 ./src/stored/dev.c
 ./src/stored/device.c
 ./src/stored/dircmd.c
+./src/stored/dvd.c
+./src/stored/ebcdic.c
 ./src/stored/fd_cmds.c
 ./src/stored/job.c
 ./src/stored/label.c
 ./src/stored/match_bsr.c
 ./src/stored/mount.c
 ./src/stored/parse_bsr.c
+./src/stored/pythonsd.c
 ./src/stored/read.c
 ./src/stored/read_record.c
 ./src/stored/record.c
+./src/stored/reserve.c
 ./src/stored/spool.c
 ./src/stored/status.c
 ./src/stored/stored.c
 ./src/stored/stored_conf.c
-./src/stored/ansi_label.c
-./src/stored/dvd.c
-./src/stored/ebcdic.c
 ./src/stored/wait.c
-./src/stored/pythonsd.c
-./src/stored/reserve.c
 ./src/tools/bsmtp.c
 ./src/tools/dbcheck.c
+./src/tools/fstype.c
 ./src/tools/testfind.c
 ./src/tools/testls.c
-./src/tools/fstype.c
+./src/tools/bwild.c
+./src/tools/bregex.c
 ./src/tray-monitor/authenticate.c
 ./src/tray-monitor/eggmarshalers.c
 ./src/tray-monitor/eggstatusicon.c
 ./src/win32/compat/getopt.c
 ./src/wx-console/authenticate.c
 ./src/wx-console/console_conf.c
-./autoconf/confdefs.h
 ./autoconf/acconfig.h
+./autoconf/confdefs.h
 ./src/baconfig.h
 ./src/bacula.h
 ./src/bc_types.h
 ./src/filed/win32/winservice.h
 ./src/filed/win32/winstat.h
 ./src/filed/win32/wintray.h
+./src/filed/acl.h
+./src/filed/chksum.h
 ./src/filed/filed.h
 ./src/filed/filed_conf.h
 ./src/filed/protos.h
-./src/filed/acl.h
-./src/filed/chksum.h
 ./src/findlib/bfile.h
 ./src/findlib/find.h
 ./src/findlib/protos.h
 ./src/findlib/save-cwd.h
+./src/host.h
 ./src/gnome2-console/callbacks.h
 ./src/gnome2-console/console.h
 ./src/gnome2-console/console_conf.h
 ./src/lib/parse_conf.h
 ./src/lib/protos.h
 ./src/lib/queue.h
+./src/lib/bregex.h
 ./src/lib/rwlock.h
 ./src/lib/semlock.h
 ./src/lib/serial.h
 ./src/lib/sha1.h
 ./src/lib/smartall.h
 ./src/lib/tcpd.h
+./src/lib/crypto.h
+./src/lib/tls.h
 ./src/lib/tree.h
 ./src/lib/var.h
 ./src/lib/waitq.h
 ./src/lib/watchdog.h
-./src/lib/workq.h
-./src/lib/bregex.h
-./src/lib/tls.h
 ./src/lib/winapi.h
+./src/lib/workq.h
+./src/lib/base64.h
 ./src/stored/block.h
 ./src/stored/bsr.h
 ./src/stored/dev.h
 ./src/stored/record.h
 ./src/stored/stored.h
 ./src/stored/stored_conf.h
-./src/host.h
+./src/stored/reserve.h
 ./src/tray-monitor/eggmarshalers.h
 ./src/tray-monitor/eggstatusicon.h
 ./src/tray-monitor/eggtrayicon.h
 ./src/win32/compat/strings.h
 ./src/win32/compat/syslog.h
 ./src/win32/compat/unistd.h
+./src/win32/compat/vss.h
 ./src/win32/compat/winconfig.h
 ./src/win32/compat/winhost.h
 ./src/win32/compat/winsock.h
 ./src/win32/compat/netinet/in.h
-./src/win32/compat/vss.h
 ./src/win32/console/StdAfx.h
 ./src/win32/wx-console/w32api.h
 ./src/wx-console/console_conf.h
 ./src/win32/baculafd/StdAfx.cpp
 ./src/win32/compat/compat.cpp
 ./src/win32/compat/print.cpp
-./src/win32/compat/vss_W2K3.cpp
 ./src/win32/compat/vss.cpp
+./src/win32/compat/vss_W2K3.cpp
 ./src/win32/compat/vss_XP.cpp
 ./src/win32/compat/vss_generic.cpp
 ./src/win32/console/StdAfx.cpp
 ./src/win32/console/console_conf.cpp
 ./src/win32/filed/authenticate.cpp
 ./src/win32/filed/backup.cpp
+./src/win32/filed/chksum.cpp
 ./src/win32/filed/estimate.cpp
 ./src/win32/filed/filed.cpp
 ./src/win32/filed/filed_conf.cpp
 ./src/win32/filed/status.cpp
 ./src/win32/filed/verify.cpp
 ./src/win32/filed/verify_vol.cpp
-./src/win32/filed/chksum.cpp
 ./src/win32/findlib/attribs.cpp
 ./src/win32/findlib/bfile.cpp
 ./src/win32/findlib/create_file.cpp
 ./src/win32/findlib/enable_priv.cpp
 ./src/win32/findlib/find.cpp
 ./src/win32/findlib/find_one.cpp
+./src/win32/findlib/fstype.cpp
 ./src/win32/findlib/makepath.cpp
 ./src/win32/findlib/match.cpp
 ./src/win32/findlib/save-cwd.cpp
 ./src/win32/findlib/winapi.cpp
-./src/win32/findlib/fstype.cpp
 ./src/win32/lib/address_conf.cpp
 ./src/win32/lib/alist.cpp
 ./src/win32/lib/alloc.cpp
 ./src/win32/lib/bnet_pkt.cpp
 ./src/win32/lib/bnet_server.cpp
 ./src/win32/lib/bpipe.cpp
+./src/win32/lib/bregex.cpp
 ./src/win32/lib/bshm.cpp
 ./src/win32/lib/bsys.cpp
 ./src/win32/lib/btime.cpp
 ./src/win32/lib/mem_pool.cpp
 ./src/win32/lib/message.cpp
 ./src/win32/lib/parse_conf.cpp
+./src/win32/lib/pythonlib.cpp
 ./src/win32/lib/queue.cpp
+./src/win32/lib/res.cpp
 ./src/win32/lib/rwlock.cpp
 ./src/win32/lib/scan.cpp
 ./src/win32/lib/semlock.cpp
 ./src/win32/lib/sha1.cpp
 ./src/win32/lib/signal.cpp
 ./src/win32/lib/smartall.cpp
+./src/win32/lib/tls.cpp
 ./src/win32/lib/tree.cpp
 ./src/win32/lib/util.cpp
 ./src/win32/lib/var.cpp
 ./src/win32/lib/watchdog.cpp
-./src/win32/lib/workq.cpp
-./src/win32/lib/pythonlib.cpp
-./src/win32/lib/regex.cpp
-./src/win32/lib/res.cpp
-./src/win32/lib/tls.cpp
 ./src/win32/lib/winapi.cpp
+./src/win32/lib/workq.cpp
+./src/win32/lib/bregex.cpp
 ./src/win32/wx-console/authenticate.cpp
 ./src/win32/wx-console/console_conf.cpp
 ./src/wx-console/console_thread.cpp
 ./src/wx-console/wxbconfigpanel.cpp
 ./src/wx-console/wxbhistorytextctrl.cpp
 ./src/wx-console/wxblistctrl.cpp
+./src/wx-console/wxbmainframe.cpp
 ./src/wx-console/wxbrestorepanel.cpp
 ./src/wx-console/wxbtableparser.cpp
 ./src/wx-console/wxbtreectrl.cpp
 ./src/wx-console/wxbutils.cpp
-./src/wx-console/wxbmainframe.cpp
index 2a781f46cd581dd941131e909c888ec9c9e3b0dd..ddb9d2d6389f4acd782576145319256f784f5821 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2005-08-19 11:20+0200\n"
+"POT-Creation-Date: 2006-05-02 16:47+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,35 +16,35 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/cats/bdb.c:135
+#: src/cats/bdb.c:128
 msgid "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
 msgstr ""
 
-#: src/cats/bdb.c:136
+#: src/cats/bdb.c:129
 msgid "WARNING!!!! The Internal Database is NOT OPERATIONAL!\n"
 msgstr ""
 
-#: src/cats/bdb.c:137
+#: src/cats/bdb.c:130
 msgid "You should use SQLite, PostgreSQL, or MySQL\n"
 msgstr ""
 
-#: src/cats/bdb.c:159 src/cats/mysql.c:130 src/cats/postgresql.c:128
+#: src/cats/bdb.c:152 src/cats/mysql.c:124 src/cats/postgresql.c:128
 #: src/cats/sqlite.c:122
 #, c-format
 msgid "Unable to initialize DB lock. ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:169
+#: src/cats/bdb.c:162
 #, c-format
 msgid "Unable to open Catalog DB control file %s: ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:224
+#: src/cats/bdb.c:217
 #, c-format
 msgid "Error reading catalog DB control file. ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:227
+#: src/cats/bdb.c:220
 #, c-format
 msgid ""
 "Error, catalog DB control file wrong version. Wanted %d, got %d\n"
@@ -61,11 +61,11 @@ msgstr ""
 msgid "Error updating DB Media file. ERR=%s\n"
 msgstr ""
 
-#: src/cats/mysql.c:66
+#: src/cats/mysql.c:60
 msgid "A user name for MySQL must be supplied.\n"
 msgstr ""
 
-#: src/cats/mysql.c:167
+#: src/cats/mysql.c:161
 #, c-format
 msgid ""
 "Unable to connect to MySQL server. \n"
@@ -73,7 +73,7 @@ msgid ""
 "It is probably not running or your password is incorrect.\n"
 msgstr ""
 
-#: src/cats/mysql.c:326 src/cats/postgresql.c:264 src/cats/sqlite.c:323
+#: src/cats/mysql.c:321 src/cats/postgresql.c:266 src/cats/sqlite.c:323
 #, c-format
 msgid "Query failed: %s: ERR=%s\n"
 msgstr ""
@@ -90,7 +90,7 @@ msgid ""
 "It is probably not running or your password is incorrect.\n"
 msgstr ""
 
-#: src/cats/postgresql.c:506
+#: src/cats/postgresql.c:508
 #, c-format
 msgid "error fetching currval: %s\n"
 msgstr ""
@@ -133,15 +133,15 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:772
-#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:563
-#: src/cats/sql_get.c:638 src/cats/sql_get.c:865
+#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:773
+#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:564
+#: src/cats/sql_get.c:639 src/cats/sql_get.c:866
 #, c-format
 msgid "error fetching row: %s\n"
 msgstr ""
 
-#: src/cats/sql.c:326 src/dird/catreq.c:360 src/dird/catreq.c:392
-#: src/dird/catreq.c:417
+#: src/cats/sql.c:326 src/dird/catreq.c:367 src/dird/catreq.c:399
+#: src/dird/catreq.c:424
 #, c-format
 msgid "Attribute create error. %s"
 msgstr ""
@@ -160,215 +160,141 @@ msgstr ""
 msgid "Create DB Job record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:91 src/dird/dird_conf.c:532 src/dird/ua_cmds.c:422
-#: src/dird/ua_prune.c:454 src/dird/ua_run.c:643 src/dird/ua_select.c:228
-#: src/dird/ua_select.c:249
-msgid "Job"
-msgstr ""
-
-#: src/cats/sql_create.c:131
+#: src/cats/sql_create.c:132
 #, c-format
 msgid "Create JobMedia record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:140
+#: src/cats/sql_create.c:141
 #, c-format
 msgid "Update Media record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:170
+#: src/cats/sql_create.c:171
 #, c-format
 msgid "pool record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:196
+#: src/cats/sql_create.c:197
 #, c-format
 msgid "Create db Pool record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:201 src/dird/ua_run.c:650 src/dird/ua_select.c:464
-#: src/dird/ua_select.c:554 src/dird/ua_update.c:356 src/dird/ua_update.c:426
-#: src/wx-console/wxbrestorepanel.cpp:362
-#: src/wx-console/wxbrestorepanel.cpp:548
-#: src/wx-console/wxbrestorepanel.cpp:558
-#: src/wx-console/wxbrestorepanel.cpp:1754
-msgid "Pool"
-msgstr ""
-
-#: src/cats/sql_create.c:227
+#: src/cats/sql_create.c:228
 #, c-format
 msgid "Device record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:243
+#: src/cats/sql_create.c:244
 #, c-format
 msgid "Create db Device record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:248
-msgid "Device"
-msgstr ""
-
-#: src/cats/sql_create.c:276
+#: src/cats/sql_create.c:277
 #, c-format
 msgid "More than one Storage record!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:281
+#: src/cats/sql_create.c:282
 #, c-format
 msgid "error fetching Storage row: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:301
+#: src/cats/sql_create.c:302
 #, c-format
 msgid "Create DB Storage record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:306 src/dird/ua_run.c:642 src/dird/ua_select.c:152
-#: src/wx-console/wxbrestorepanel.cpp:363
-#: src/wx-console/wxbrestorepanel.cpp:379
-#: src/wx-console/wxbrestorepanel.cpp:500
-#: src/wx-console/wxbrestorepanel.cpp:501
-#: src/wx-console/wxbrestorepanel.cpp:511
-#: src/wx-console/wxbrestorepanel.cpp:512
-#: src/wx-console/wxbrestorepanel.cpp:1116
-#: src/wx-console/wxbrestorepanel.cpp:1765
-#: src/wx-console/wxbrestorepanel.cpp:1831
-msgid "Storage"
-msgstr ""
-
-#: src/cats/sql_create.c:333
+#: src/cats/sql_create.c:334
 #, c-format
 msgid "mediatype record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:349
+#: src/cats/sql_create.c:350
 #, c-format
 msgid "Create db mediatype record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:354
-msgid "MediaType"
-msgstr ""
-
-#: src/cats/sql_create.c:383
+#: src/cats/sql_create.c:384
 #, c-format
 msgid "Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/cats/sql_create.c:421
+#: src/cats/sql_create.c:422
 #, c-format
 msgid "Create DB Media record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:425
-msgid "Media"
-msgstr ""
-
-#: src/cats/sql_create.c:469
+#: src/cats/sql_create.c:470
 #, c-format
 msgid "More than one Client!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:474
+#: src/cats/sql_create.c:475
 #, c-format
 msgid "error fetching Client row: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:501
+#: src/cats/sql_create.c:502
 #, c-format
 msgid "Create DB Client record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:507 src/dird/ua_run.c:645 src/dird/ua_select.c:272
-#: src/dird/ua_select.c:379 src/wx-console/wxbrestorepanel.cpp:360
-#: src/wx-console/wxbrestorepanel.cpp:378
-#: src/wx-console/wxbrestorepanel.cpp:452
-#: src/wx-console/wxbrestorepanel.cpp:453
-#: src/wx-console/wxbrestorepanel.cpp:463
-#: src/wx-console/wxbrestorepanel.cpp:464
-#: src/wx-console/wxbrestorepanel.cpp:707
-#: src/wx-console/wxbrestorepanel.cpp:1086
-#: src/wx-console/wxbrestorepanel.cpp:1173
-#: src/wx-console/wxbrestorepanel.cpp:1758
-#: src/wx-console/wxbrestorepanel.cpp:1760
-#: src/wx-console/wxbrestorepanel.cpp:1829
-#: src/wx-console/wxbrestorepanel.cpp:1884
-msgid "Client"
-msgstr ""
-
-#: src/cats/sql_create.c:544
+#: src/cats/sql_create.c:545
 #, c-format
 msgid "Create DB Counters record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:577
+#: src/cats/sql_create.c:578
 #, c-format
 msgid "More than one FileSet!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:582
+#: src/cats/sql_create.c:583
 #, c-format
 msgid "error fetching FileSet row: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:612
+#: src/cats/sql_create.c:613
 #, c-format
 msgid "Create DB FileSet record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:618 src/dird/ua_restore.c:1035 src/dird/ua_run.c:644
-#: src/dird/ua_select.c:173
-msgid "FileSet"
-msgstr ""
-
-#: src/cats/sql_create.c:669
+#: src/cats/sql_create.c:670
 #, c-format
 msgid "Attempt to put non-attributes into catalog. Stream=%d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:732
+#: src/cats/sql_create.c:733
 #, c-format
 msgid "Create db File record %s failed. ERR=%s"
 msgstr ""
 
-#: src/cats/sql_create.c:738 src/gnome2-console/restore.c:121
-msgid "File"
-msgstr ""
-
-#: src/cats/sql_create.c:765 src/cats/sql_get.c:224
+#: src/cats/sql_create.c:766 src/cats/sql_get.c:224
 #, c-format
 msgid "More than one Path!: %s for path: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:796
+#: src/cats/sql_create.c:797
 #, c-format
 msgid "Create db Path record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:802
-msgid "Path"
-msgstr ""
-
-#: src/cats/sql_create.c:829
+#: src/cats/sql_create.c:830
 #, c-format
 msgid "More than one Filename! %s for file: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:835
+#: src/cats/sql_create.c:836
 #, c-format
 msgid "Error fetching row for file=%s: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:851
+#: src/cats/sql_create.c:852
 #, c-format
 msgid "Create db Filename record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:856 src/wx-console/wxbrestorepanel.cpp:314
-msgid "Filename"
-msgstr ""
-
 #: src/cats/sql_delete.c:79
 #, c-format
 msgid "No pool record %s exists\n"
@@ -407,27 +333,27 @@ msgid ""
 "CMD=%s\n"
 msgstr ""
 
-#: src/cats/sql_find.c:222
+#: src/cats/sql_find.c:224
 #, c-format
-msgid "Unknown Job level=%c\n"
+msgid "Unknown Job level=%d\n"
 msgstr ""
 
-#: src/cats/sql_find.c:232
+#: src/cats/sql_find.c:234
 #, c-format
 msgid "No Job found for: %s.\n"
 msgstr ""
 
-#: src/cats/sql_find.c:243
+#: src/cats/sql_find.c:245
 #, c-format
 msgid "No Job found for: %s\n"
 msgstr ""
 
-#: src/cats/sql_find.c:312
+#: src/cats/sql_find.c:317
 #, c-format
-msgid "Request for Volume item %d greater than max %d\n"
+msgid "Request for Volume item %d greater than max %d or less than 1.\n"
 msgstr ""
 
-#: src/cats/sql_find.c:324
+#: src/cats/sql_find.c:331
 #, c-format
 msgid "No Volume record found for item %d.\n"
 msgstr ""
@@ -491,104 +417,104 @@ msgstr ""
 msgid "No Job found for JobId %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:343 src/cats/sql_get.c:398
+#: src/cats/sql_get.c:344 src/cats/sql_get.c:399
 #, c-format
 msgid "No volumes found for JobId=%d\n"
 msgstr ""
 
-#: src/cats/sql_get.c:349 src/cats/sql_get.c:407
+#: src/cats/sql_get.c:350 src/cats/sql_get.c:408
 #, c-format
 msgid "Error fetching row %d: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:363
+#: src/cats/sql_get.c:364
 #, c-format
 msgid "No Volume for JobId %d found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:479
+#: src/cats/sql_get.c:480
 #, c-format
 msgid "Pool id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:516
+#: src/cats/sql_get.c:517
 #, c-format
 msgid "Client id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:558
+#: src/cats/sql_get.c:559
 #, c-format
 msgid "More than one Pool!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:599
+#: src/cats/sql_get.c:600
 msgid "Pool record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:633
+#: src/cats/sql_get.c:634
 #, c-format
 msgid "More than one Client!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:650 src/cats/sql_get.c:654
+#: src/cats/sql_get.c:651 src/cats/sql_get.c:655
 msgid "Client record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:679
+#: src/cats/sql_get.c:680
 #, c-format
 msgid "More than one Counter!: %d\n"
 msgstr ""
 
-#: src/cats/sql_get.c:684
+#: src/cats/sql_get.c:685
 #, c-format
 msgid "error fetching Counter row: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:704
+#: src/cats/sql_get.c:705
 #, c-format
 msgid "Counter record: %s not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:740
+#: src/cats/sql_get.c:741
 #, c-format
 msgid "Error got %s FileSets but expected only one!\n"
 msgstr ""
 
-#: src/cats/sql_get.c:745
+#: src/cats/sql_get.c:746
 #, c-format
 msgid "FileSet record \"%s\" not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:755
+#: src/cats/sql_get.c:756
 msgid "FileSet record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:812
+#: src/cats/sql_get.c:813
 #, c-format
 msgid "Media id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:860
+#: src/cats/sql_get.c:861
 #, c-format
 msgid "More than one Volume!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:905
+#: src/cats/sql_get.c:906
 #, c-format
 msgid "Media record MediaId=%s not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:908
+#: src/cats/sql_get.c:909
 #, c-format
 msgid "Media record for Volume \"%s\" not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:915
+#: src/cats/sql_get.c:916
 #, c-format
 msgid "Media record for MediaId=%u not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:918
+#: src/cats/sql_get.c:919
 #, c-format
 msgid "Media record for Vol=%s not found in Catalog.\n"
 msgstr ""
@@ -608,7 +534,7 @@ msgstr ""
 msgid "Unable to open Database=%s. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sqlite.c:162 src/lib/bnet_server.c:372
+#: src/cats/sqlite.c:162 src/lib/bnet_server.c:371
 msgid "unknown"
 msgstr ""
 
@@ -627,38 +553,38 @@ msgstr ""
 msgid "next_index update error: ERR=%s\n"
 msgstr ""
 
-#: src/console/authenticate.c:104 src/dird/authenticate.c:106
-#: src/dird/authenticate.c:206 src/filed/authenticate.c:124
-#: src/filed/authenticate.c:220 src/stored/authenticate.c:128
-#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:101
+#: src/console/authenticate.c:100 src/dird/authenticate.c:106
+#: src/dird/authenticate.c:206 src/filed/authenticate.c:119
+#: src/filed/authenticate.c:215 src/stored/authenticate.c:128
+#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:106
 msgid ""
 "Authorization problem: Remote server did not advertise required TLS "
 "support.\n"
 msgstr ""
 
-#: src/console/authenticate.c:111 src/dird/authenticate.c:113
-#: src/dird/authenticate.c:213 src/filed/authenticate.c:132
-#: src/filed/authenticate.c:228 src/stored/authenticate.c:136
-#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:108
+#: src/console/authenticate.c:107 src/dird/authenticate.c:113
+#: src/dird/authenticate.c:213 src/filed/authenticate.c:127
+#: src/filed/authenticate.c:223 src/stored/authenticate.c:136
+#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:112
 msgid "Authorization problem: Remote server requires TLS.\n"
 msgstr ""
 
-#: src/console/authenticate.c:121 src/wx-console/authenticate.c:118
+#: src/console/authenticate.c:117 src/wx-console/authenticate.c:121
 msgid "TLS negotiation failed\n"
 msgstr ""
 
-#: src/console/authenticate.c:133 src/gnome2-console/authenticate.c:85
+#: src/console/authenticate.c:129 src/gnome2-console/authenticate.c:85
 #: src/tray-monitor/authenticate.c:87
 #, c-format
 msgid "Bad response to Hello command: ERR=%s\n"
 msgstr ""
 
-#: src/console/authenticate.c:140 src/gnome2-console/authenticate.c:95
-#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:133
+#: src/console/authenticate.c:136 src/gnome2-console/authenticate.c:95
+#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:136
 msgid "Director rejected Hello command\n"
 msgstr ""
 
-#: src/console/authenticate.c:150 src/wx-console/authenticate.c:143
+#: src/console/authenticate.c:146 src/wx-console/authenticate.c:146
 msgid ""
 "Director authorization problem.\n"
 "Most likely the passwords do not agree.\n"
@@ -703,7 +629,7 @@ msgstr ""
 msgid "output to file"
 msgstr ""
 
-#: src/console/console.c:152 src/dird/ua_cmds.c:106
+#: src/console/console.c:152 src/dird/ua_cmds.c:110
 msgid "quit"
 msgstr ""
 
@@ -715,7 +641,7 @@ msgstr ""
 msgid "sleep specified time"
 msgstr ""
 
-#: src/console/console.c:155 src/dird/ua_cmds.c:118
+#: src/console/console.c:155 src/dird/ua_cmds.c:122
 msgid "print current time"
 msgstr ""
 
@@ -723,7 +649,7 @@ msgstr ""
 msgid "print Console's version"
 msgstr ""
 
-#: src/console/console.c:157 src/dird/ua_cmds.c:95
+#: src/console/console.c:157 src/dird/ua_cmds.c:99
 msgid "exit = quit"
 msgstr ""
 
@@ -731,13 +657,12 @@ msgstr ""
 msgid "zed_keys = use zed keys instead of bash keys"
 msgstr ""
 
-#: src/console/console.c:191 src/dird/ua_dotcmds.c:106
+#: src/console/console.c:191 src/dird/ua_dotcmds.c:108
 msgid ": is an illegal command\n"
 msgstr ""
 
-#: src/console/console.c:400 src/dird/dird.c:196 src/filed/filed.c:183
-#: src/gnome2-console/console.c:271 src/stored/stored.c:189
-#: src/wx-console/console_thread.cpp:233
+#: src/console/console.c:400 src/filed/filed.c:183
+#: src/gnome2-console/console.c:271
 msgid "TLS library initialization failed.\n"
 msgstr ""
 
@@ -771,14 +696,14 @@ msgstr ""
 msgid "Connecting to Director %s:%d\n"
 msgstr ""
 
-#: src/console/console.c:471 src/gnome2-console/console.c:508
-#: src/wx-console/console_thread.cpp:367
+#: src/console/console.c:471 src/gnome2-console/console.c:504
+#: src/wx-console/console_thread.cpp:370
 #, c-format
 msgid "Failed to initialize TLS context for Console \"%s\".\n"
 msgstr ""
 
-#: src/console/console.c:492 src/gnome2-console/console.c:530
-#: src/wx-console/console_thread.cpp:388
+#: src/console/console.c:492 src/gnome2-console/console.c:526
+#: src/wx-console/console_thread.cpp:391
 #, c-format
 msgid "Failed to initialize TLS context for Director \"%s\".\n"
 msgstr ""
@@ -791,8 +716,8 @@ msgstr ""
 #: src/dird/dird.c:711 src/dird/dird.c:777 src/dird/dird.c:829
 #: src/filed/filed.c:302 src/filed/filed.c:348
 #: src/gnome2-console/console.c:140 src/gnome2-console/console.c:169
-#: src/stored/stored.c:310 src/wx-console/console_thread.cpp:96
-#: src/wx-console/console_thread.cpp:125
+#: src/stored/stored.c:311 src/wx-console/console_thread.cpp:94
+#: src/wx-console/console_thread.cpp:120
 msgid "TLS required but not configured in Bacula.\n"
 msgstr ""
 
@@ -840,18 +765,18 @@ msgid "Cannot open file %s for output. ERR=%s\n"
 msgstr ""
 
 #: src/console/console_conf.c:123 src/gnome2-console/console_conf.c:122
-#: src/wx-console/console_conf.c:124
+#: src/wx-console/console_conf.c:128
 #, c-format
 msgid "No record for %d %s\n"
 msgstr ""
 
-#: src/console/console_conf.c:132 src/wx-console/console_conf.c:133
+#: src/console/console_conf.c:132 src/wx-console/console_conf.c:137
 #, c-format
 msgid "Console: name=%s rcfile=%s histfile=%s\n"
 msgstr ""
 
 #: src/console/console_conf.c:136 src/gnome2-console/console_conf.c:131
-#: src/wx-console/console_conf.c:137
+#: src/wx-console/console_conf.c:141
 #, c-format
 msgid "Director: name=%s address=%s DIRport=%d\n"
 msgstr ""
@@ -861,25 +786,25 @@ msgstr ""
 #: src/filed/filed_conf.c:268 src/filed/filed_conf.c:327
 #: src/filed/filed_conf.c:357 src/gnome2-console/console_conf.c:142
 #: src/gnome2-console/console_conf.c:220 src/gnome2-console/console_conf.c:268
-#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:467
-#: src/stored/stored_conf.c:555 src/stored/stored_conf.c:590
-#: src/wx-console/console_conf.c:141 src/wx-console/console_conf.c:216
-#: src/wx-console/console_conf.c:261 src/wx-console/console_conf.c:288
+#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:510
+#: src/stored/stored_conf.c:598 src/stored/stored_conf.c:633
+#: src/wx-console/console_conf.c:145 src/wx-console/console_conf.c:220
+#: src/wx-console/console_conf.c:265 src/wx-console/console_conf.c:292
 #, c-format
 msgid "Unknown resource type %d\n"
 msgstr ""
 
-#: src/console/console_conf.c:242 src/dird/dird_conf.c:1109
-#: src/dird/dird_conf.c:1124 src/filed/filed_conf.c:296
+#: src/console/console_conf.c:242 src/dird/dird_conf.c:1112
+#: src/dird/dird_conf.c:1127 src/filed/filed_conf.c:296
 #: src/gnome2-console/console_conf.c:246 src/tray-monitor/tray_conf.c:262
-#: src/wx-console/console_conf.c:242
+#: src/wx-console/console_conf.c:246
 #, c-format
 msgid "%s item is required in %s resource, but not found.\n"
 msgstr ""
 
-#: src/console/console_conf.c:304 src/dird/dird_conf.c:1296
+#: src/console/console_conf.c:304 src/dird/dird_conf.c:1299
 #: src/filed/filed_conf.c:374 src/gnome2-console/console_conf.c:314
-#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:304
+#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:308
 #, c-format
 msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n"
 msgstr ""
@@ -889,7 +814,7 @@ msgstr ""
 msgid "Start Admin JobId %d, Job=%s\n"
 msgstr ""
 
-#: src/dird/admin.c:82 src/dird/backup.c:339 src/dird/mac.c:228
+#: src/dird/admin.c:82 src/dird/backup.c:372 src/dird/mac.c:280
 #, c-format
 msgid "Error getting job record for stats: %s"
 msgstr ""
@@ -906,8 +831,8 @@ msgstr ""
 msgid "Admin Canceled"
 msgstr ""
 
-#: src/dird/admin.c:102 src/dird/backup.c:451 src/dird/mac.c:330
-#: src/dird/restore.c:258
+#: src/dird/admin.c:102 src/dird/backup.c:423 src/dird/mac.c:382
+#: src/dird/restore.c:250
 #, c-format
 msgid "Inappropriate term code: %c\n"
 msgstr ""
@@ -940,7 +865,7 @@ msgstr ""
 
 #: src/dird/authenticate.c:95
 msgid ""
-"Unable to authenticate with Storage daemon. Possible causes:\n"
+"Director unable to authenticate with Storage daemon. Possible causes:\n"
 "Passwords or names not the same or\n"
 "Maximum Concurrent Jobs exceeded on the SD or\n"
 "SD networking messed up (restart daemon).\n"
@@ -949,8 +874,8 @@ msgid ""
 msgstr ""
 
 #: src/dird/authenticate.c:123 src/dird/authenticate.c:223
-#: src/dird/authenticate.c:356 src/filed/authenticate.c:141
-#: src/filed/authenticate.c:237 src/stored/authenticate.c:145
+#: src/dird/authenticate.c:356 src/filed/authenticate.c:136
+#: src/filed/authenticate.c:232 src/stored/authenticate.c:145
 #: src/stored/authenticate.c:249
 msgid "TLS negotiation failed.\n"
 msgstr ""
@@ -1039,84 +964,72 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:92
-#: src/dird/ua_output.c:609
+#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:124
+#: src/dird/ua_output.c:623
 #, c-format
 msgid "Pool %s not in database. %s"
 msgstr ""
 
-#: src/dird/backup.c:92 src/dird/mac.c:96 src/dird/ua_output.c:617
+#: src/dird/backup.c:92 src/dird/mac.c:128 src/dird/ua_output.c:631
 #, c-format
 msgid "Pool %s created in database.\n"
 msgstr ""
 
-#: src/dird/backup.c:117
+#: src/dird/backup.c:120
 msgid "Could not start clone job.\n"
 msgstr ""
 
-#: src/dird/backup.c:119
+#: src/dird/backup.c:122
 #, c-format
 msgid "Clone JobId %d started.\n"
 msgstr ""
 
-#: src/dird/backup.c:144
+#: src/dird/backup.c:148
 #, c-format
-msgid "Start Backup JobId %u, Job=%s\n"
+msgid "Start Backup JobId %s, Job=%s\n"
 msgstr ""
 
-#: src/dird/backup.c:272
+#: src/dird/backup.c:304
 #, c-format
 msgid "Unexpected Client Job message: %s\n"
 msgstr ""
 
-#: src/dird/backup.c:280
+#: src/dird/backup.c:312
 #, c-format
 msgid "Network error with FD during %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/backup.c:296
+#: src/dird/backup.c:328
 msgid "No Job status returned from FD.\n"
 msgstr ""
 
-#: src/dird/backup.c:346
+#: src/dird/backup.c:379
 #, c-format
 msgid "Error getting client record for stats: %s"
 msgstr ""
 
-#: src/dird/backup.c:352 src/dird/mac.c:235
+#: src/dird/backup.c:385 src/dird/mac.c:287
 #, c-format
 msgid "Error getting Media record for Volume \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/backup.c:380 src/dird/mac.c:263
-#, c-format
-msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
-msgstr ""
-
-#: src/dird/backup.c:414 src/dird/mac.c:293
-#, c-format
-msgid ""
-"Could not open WriteBootstrap file:\n"
-"%s: ERR=%s\n"
-msgstr ""
-
-#: src/dird/backup.c:424 src/dird/mac.c:303
+#: src/dird/backup.c:396 src/dird/mac.c:355
 msgid "Backup OK -- with warnings"
 msgstr ""
 
-#: src/dird/backup.c:426 src/dird/mac.c:305 src/stored/bscan.c:1054
+#: src/dird/backup.c:398 src/dird/mac.c:357 src/stored/bscan.c:1060
 msgid "Backup OK"
 msgstr ""
 
-#: src/dird/backup.c:431 src/dird/mac.c:310 src/stored/bscan.c:1058
+#: src/dird/backup.c:403 src/dird/mac.c:362 src/stored/bscan.c:1064
 msgid "*** Backup Error ***"
 msgstr ""
 
-#: src/dird/backup.c:441 src/dird/mac.c:320 src/stored/bscan.c:1061
+#: src/dird/backup.c:413 src/dird/mac.c:372 src/stored/bscan.c:1067
 msgid "Backup Canceled"
 msgstr ""
 
-#: src/dird/backup.c:491
+#: src/dird/backup.c:463
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -1130,17 +1043,18 @@ msgid ""
 "  Scheduled time:         %s\n"
 "  Start time:             %s\n"
 "  End time:               %s\n"
+"  Elapsed time:           %s\n"
 "  Priority:               %d\n"
 "  FD Files Written:       %s\n"
 "  SD Files Written:       %s\n"
-"  FD Bytes Written:       %s\n"
-"  SD Bytes Written:       %s\n"
+"  FD Bytes Written:       %s (%sB)\n"
+"  SD Bytes Written:       %s (%sB)\n"
 "  Rate:                   %.1f KB/s\n"
 "  Software Compression:   %s\n"
 "  Volume name(s):         %s\n"
 "  Volume Session Id:      %d\n"
 "  Volume Session Time:    %d\n"
-"  Last Volume Bytes:      %s\n"
+"  Last Volume Bytes:      %s (%sB)\n"
 "  Non-fatal FD errors:    %d\n"
 "  SD Errors:              %d\n"
 "  FD termination status:  %s\n"
@@ -1149,6 +1063,18 @@ msgid ""
 "\n"
 msgstr ""
 
+#: src/dird/backup.c:554 src/dird/mac.c:315
+#, c-format
+msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:588 src/dird/mac.c:345
+#, c-format
+msgid ""
+"Could not open WriteBootstrap file:\n"
+"%s: ERR=%s\n"
+msgstr ""
+
 #: src/dird/bsr.c:155
 #, c-format
 msgid "Unable to get Job record. ERR=%s\n"
@@ -1159,29 +1085,29 @@ msgstr ""
 msgid "Unable to get Job Volume Parameters. ERR=%s\n"
 msgstr ""
 
-#: src/dird/bsr.c:201
+#: src/dird/bsr.c:212
 #, c-format
 msgid "Unable to create bootstrap file %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/bsr.c:210
+#: src/dird/bsr.c:221
 msgid "Error writing bsr file.\n"
 msgstr ""
 
-#: src/dird/bsr.c:216
+#: src/dird/bsr.c:227
 #, c-format
 msgid "Bootstrap records written to %s\n"
 msgstr ""
 
-#: src/dird/bsr.c:220
+#: src/dird/bsr.c:231
 msgid "The job will require the following Volumes:\n"
 msgstr ""
 
-#: src/dird/bsr.c:235
+#: src/dird/bsr.c:263
 msgid "No Volumes found to restore.\n"
 msgstr ""
 
-#: src/dird/catreq.c:109 src/dird/catreq.c:298
+#: src/dird/catreq.c:109 src/dird/catreq.c:295
 #, c-format
 msgid "1990 Invalid Catalog Request: %s"
 msgstr ""
@@ -1191,72 +1117,87 @@ msgstr ""
 msgid "Invalid Catalog request; DB not open: %s"
 msgstr ""
 
-#: src/dird/catreq.c:131
+#: src/dird/catreq.c:133
 msgid "1901 No Media.\n"
 msgstr ""
 
-#: src/dird/catreq.c:159
+#: src/dird/catreq.c:161
 msgid "not in Pool"
 msgstr ""
 
-#: src/dird/catreq.c:161
+#: src/dird/catreq.c:163
 msgid "not correct MediaType"
 msgstr ""
 
-#: src/dird/catreq.c:187
+#: src/dird/catreq.c:179
 #, c-format
 msgid "1998 Volume \"%s\" status is %s, %s.\n"
 msgstr ""
 
-#: src/dird/catreq.c:192
+#: src/dird/catreq.c:184
 #, c-format
 msgid "1997 Volume \"%s\" not in catalog.\n"
 msgstr ""
 
-#: src/dird/catreq.c:213
+#: src/dird/catreq.c:205
 #, c-format
 msgid "Unable to get Media record for Volume %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/catreq.c:215
+#: src/dird/catreq.c:207
 #, c-format
 msgid "1991 Catalog Request for vol=%s failed: %s"
 msgstr ""
 
-#: src/dird/catreq.c:235
+#: src/dird/catreq.c:227
 #, c-format
 msgid ""
 "Volume Files at %u being set to %u for Volume \"%s\". This is incorrect.\n"
 msgstr ""
 
-#: src/dird/catreq.c:238 src/dird/catreq.c:270
-msgid "1992 Update Media error\n"
+#: src/dird/catreq.c:230
+#, c-format
+msgid "1992 Update Media error. VolFiles=%u, CatFiles=%u\n"
 msgstr ""
 
-#: src/dird/catreq.c:268
+#: src/dird/catreq.c:262
 #, c-format
 msgid "Catalog error updating Media record. %s"
 msgstr ""
 
-#: src/dird/catreq.c:287
+#: src/dird/catreq.c:264
+msgid "1993 Update Media error\n"
+msgstr ""
+
+#: src/dird/catreq.c:284
 #, c-format
 msgid "Catalog error creating JobMedia record. %s"
 msgstr ""
 
-#: src/dird/catreq.c:289
+#: src/dird/catreq.c:286
 msgid "1991 Update JobMedia error\n"
 msgstr ""
 
-#: src/dird/catreq.c:299
+#: src/dird/catreq.c:296
 #, c-format
 msgid "Invalid Catalog request: %s"
 msgstr ""
 
-#: src/dird/catreq.c:398
+#: src/dird/catreq.c:330
+#, c-format
+msgid "1991 Invalid Catalog Update: %s"
+msgstr ""
+
+#: src/dird/catreq.c:331
+#, c-format
+msgid "Invalid Catalog Update; DB not open: %s"
+msgstr ""
+
+#: src/dird/catreq.c:405
 msgid "Got MD5/SHA1 but not same File as attributes\n"
 msgstr ""
 
-#: src/dird/catreq.c:422
+#: src/dird/catreq.c:429
 #, c-format
 msgid "Catalog error updating MD5/SHA1. %s"
 msgstr ""
@@ -1282,6 +1223,10 @@ msgid ""
 "\n"
 msgstr ""
 
+#: src/dird/dird.c:196 src/stored/stored.c:189
+msgid "Cryptography library initialization failed.\n"
+msgstr ""
+
 #: src/dird/dird.c:396
 msgid "Too many open reload requests. Request ignored.\n"
 msgstr ""
@@ -1311,17 +1256,17 @@ msgstr ""
 msgid "Only one Director resource permitted in %s\n"
 msgstr ""
 
-#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:362
+#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:363
 #, c-format
 msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:368
+#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:369
 #, c-format
 msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:374
+#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:375
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
@@ -1329,7 +1274,7 @@ msgid ""
 "using \"TLS Verify Peer\".\n"
 msgstr ""
 
-#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:393
+#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:394
 #, c-format
 msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n"
 msgstr ""
@@ -1353,8 +1298,8 @@ msgstr ""
 msgid "Too many items in Job resource\n"
 msgstr ""
 
-#: src/dird/dird.c:672 src/dird/job.c:101 src/dird/ua_cmds.c:1425
-#: src/dird/ua_output.c:598
+#: src/dird/dird.c:672 src/dird/job.c:104 src/dird/ua_cmds.c:1621
+#: src/dird/ua_output.c:612
 #, c-format
 msgid "Could not open database \"%s\".\n"
 msgstr ""
@@ -1371,7 +1316,7 @@ msgid ""
 "Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:733 src/stored/stored.c:348
+#: src/dird/dird.c:733 src/stored/stored.c:349
 #, c-format
 msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n"
 msgstr ""
@@ -1406,55 +1351,55 @@ msgid ""
 "File daemon \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:441 src/tray-monitor/tray_conf.c:152
+#: src/dird/dird_conf.c:443 src/tray-monitor/tray_conf.c:152
 #, c-format
 msgid "No %s resource defined\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:450
+#: src/dird/dird_conf.c:452
 #, c-format
 msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:455
+#: src/dird/dird_conf.c:457
 #, c-format
 msgid "   query_file=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:458 src/dird/dird_conf.c:483 src/dird/dird_conf.c:497
-#: src/dird/dird_conf.c:541 src/dird/dird_conf.c:545 src/dird/dird_conf.c:549
-#: src/dird/dird_conf.c:573 src/dird/dird_conf.c:578 src/dird/dird_conf.c:582
-#: src/dird/dird_conf.c:586 src/dird/dird_conf.c:590 src/dird/dird_conf.c:594
-#: src/dird/dird_conf.c:604
+#: src/dird/dird_conf.c:460 src/dird/dird_conf.c:485 src/dird/dird_conf.c:499
+#: src/dird/dird_conf.c:544 src/dird/dird_conf.c:548 src/dird/dird_conf.c:552
+#: src/dird/dird_conf.c:576 src/dird/dird_conf.c:581 src/dird/dird_conf.c:585
+#: src/dird/dird_conf.c:589 src/dird/dird_conf.c:593 src/dird/dird_conf.c:597
+#: src/dird/dird_conf.c:607
 msgid "  --> "
 msgstr ""
 
-#: src/dird/dird_conf.c:464 src/dird/dird_conf.c:467
+#: src/dird/dird_conf.c:466 src/dird/dird_conf.c:469
 #, c-format
 msgid "Console: name=%s SSL=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:473
+#: src/dird/dird_conf.c:475
 #, c-format
 msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:478
+#: src/dird/dird_conf.c:480
 #, c-format
 msgid "Counter: name=%s min=%d max=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:489
+#: src/dird/dird_conf.c:491
 #, c-format
 msgid "Client: name=%s address=%s FDport=%d MaxJobs=%u\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:492
+#: src/dird/dird_conf.c:494
 #, c-format
 msgid "      JobRetention=%s FileRetention=%s AutoPrune=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:504
+#: src/dird/dird_conf.c:506
 #, c-format
 msgid ""
 "Device: name=%s ok=%d num_writers=%d max_writers=%d\n"
@@ -1463,245 +1408,252 @@ msgid ""
 "      poolid=%s volname=%s MediaType=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:514
+#: src/dird/dird_conf.c:516
 #, c-format
 msgid ""
 "Storage: name=%s address=%s SDport=%d MaxJobs=%u\n"
 "      DeviceName=%s MediaType=%s StorageId=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:523
+#: src/dird/dird_conf.c:525
 #, c-format
 msgid ""
 "Catalog: name=%s address=%s DBport=%d db_name=%s\n"
 "      db_user=%s MutliDBConn=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:531
+#: src/dird/dird_conf.c:533
 #, c-format
-msgid "%s: name=%s JobType=%d level=%s Priority=%d MaxJobs=%u\n"
+msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:534 src/dird/ua_cmds.c:441 src/dird/ua_prune.c:454
+#: src/dird/ua_run.c:643 src/dird/ua_select.c:234 src/dird/ua_select.c:257
+msgid "Job"
 msgstr ""
 
-#: src/dird/dird_conf.c:532
+#: src/dird/dird_conf.c:534
 msgid "JobDefs"
 msgstr ""
 
-#: src/dird/dird_conf.c:536
+#: src/dird/dird_conf.c:538
 #, c-format
-msgid "     Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%d\n"
+msgid ""
+"     MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%"
+"d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:553
+#: src/dird/dird_conf.c:556
 #, c-format
 msgid "  --> Where=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:556
+#: src/dird/dird_conf.c:559
 #, c-format
 msgid "  --> Bootstrap=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:559
+#: src/dird/dird_conf.c:562
 #, c-format
 msgid "  --> RunBefore=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:562
+#: src/dird/dird_conf.c:565
 #, c-format
 msgid "  --> RunAfter=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:565
+#: src/dird/dird_conf.c:568
 #, c-format
 msgid "  --> RunAfterFailed=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:568
+#: src/dird/dird_conf.c:571
 #, c-format
 msgid "  --> WriteBootstrap=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:600
+#: src/dird/dird_conf.c:603
 #, c-format
 msgid "  --> Run=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:611
+#: src/dird/dird_conf.c:614
 #, c-format
 msgid "FileSet: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:673 src/dird/dird_conf.c:752
+#: src/dird/dird_conf.c:676 src/dird/dird_conf.c:755
 #, c-format
 msgid "Schedule: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:678
+#: src/dird/dird_conf.c:681
 #, c-format
 msgid "  --> Run Level=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:679
+#: src/dird/dird_conf.c:682
 msgid "      hour="
 msgstr ""
 
-#: src/dird/dird_conf.c:688
+#: src/dird/dird_conf.c:691
 msgid "      mday="
 msgstr ""
 
-#: src/dird/dird_conf.c:697
+#: src/dird/dird_conf.c:700
 msgid "      month="
 msgstr ""
 
-#: src/dird/dird_conf.c:706
+#: src/dird/dird_conf.c:709
 msgid "      wday="
 msgstr ""
 
-#: src/dird/dird_conf.c:715
+#: src/dird/dird_conf.c:718
 msgid "      wom="
 msgstr ""
 
-#: src/dird/dird_conf.c:724
+#: src/dird/dird_conf.c:727
 msgid "      woy="
 msgstr ""
 
-#: src/dird/dird_conf.c:733
+#: src/dird/dird_conf.c:736
 #, c-format
 msgid "      mins=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:735 src/dird/dird_conf.c:739 src/dird/dird_conf.c:743
+#: src/dird/dird_conf.c:738 src/dird/dird_conf.c:742 src/dird/dird_conf.c:746
 msgid "     --> "
 msgstr ""
 
-#: src/dird/dird_conf.c:756
+#: src/dird/dird_conf.c:759
 #, c-format
 msgid "Pool: name=%s PoolType=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:758
+#: src/dird/dird_conf.c:761
 #, c-format
 msgid "      use_cat=%d use_once=%d acpt_any=%d cat_files=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:761
+#: src/dird/dird_conf.c:764
 #, c-format
 msgid "      max_vols=%d auto_prune=%d VolRetention=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:764
+#: src/dird/dird_conf.c:767
 #, c-format
 msgid "      VolUse=%s recycle=%d LabelFormat=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:768
+#: src/dird/dird_conf.c:771
 #, c-format
 msgid "      CleaningPrefix=%s LabelType=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:770
+#: src/dird/dird_conf.c:773
 #, c-format
 msgid "      RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:776
+#: src/dird/dird_conf.c:779
 #, c-format
 msgid "Messages: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:778
+#: src/dird/dird_conf.c:781
 #, c-format
 msgid "      mailcmd=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:780
+#: src/dird/dird_conf.c:783
 #, c-format
 msgid "      opcmd=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:783 src/tray-monitor/tray_conf.c:179
+#: src/dird/dird_conf.c:786 src/tray-monitor/tray_conf.c:179
 #, c-format
 msgid "Unknown resource type %d in dump_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1077 src/tray-monitor/tray_conf.c:232
+#: src/dird/dird_conf.c:1080 src/tray-monitor/tray_conf.c:232
 #, c-format
 msgid "Unknown resource type %d in free_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1115 src/lib/parse_conf.c:211
+#: src/dird/dird_conf.c:1118 src/lib/parse_conf.c:211
 #: src/tray-monitor/tray_conf.c:268
 #, c-format
 msgid "Too many items in %s resource\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1149
+#: src/dird/dird_conf.c:1152
 #, c-format
 msgid "Cannot find Console resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1155 src/filed/filed_conf.c:316
-#: src/stored/stored_conf.c:523
+#: src/dird/dird_conf.c:1158 src/filed/filed_conf.c:316
+#: src/stored/stored_conf.c:566
 #, c-format
 msgid "Cannot find Director resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1162 src/stored/stored_conf.c:529
+#: src/dird/dird_conf.c:1165 src/stored/stored_conf.c:572
 #, c-format
 msgid "Cannot find Storage resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1171
+#: src/dird/dird_conf.c:1174
 #, c-format
 msgid "Cannot find Job resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1189
+#: src/dird/dird_conf.c:1192
 #, c-format
 msgid "Cannot find Counter resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1197 src/filed/filed_conf.c:322
+#: src/dird/dird_conf.c:1200 src/filed/filed_conf.c:322
 #, c-format
 msgid "Cannot find Client resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1209
+#: src/dird/dird_conf.c:1212
 #, c-format
 msgid "Cannot find Schedule resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1214 src/tray-monitor/tray_conf.c:287
+#: src/dird/dird_conf.c:1217 src/tray-monitor/tray_conf.c:287
 #, c-format
 msgid "Unknown resource type %d in save_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1274 src/tray-monitor/tray_conf.c:322
+#: src/dird/dird_conf.c:1277 src/tray-monitor/tray_conf.c:322
 #, c-format
 msgid "Unknown resource type %d in save_resrouce.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1289
+#: src/dird/dird_conf.c:1292
 #, c-format
 msgid "Name item is required in %s resource, but not found.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1301
+#: src/dird/dird_conf.c:1304
 #, c-format
 msgid "Inserting %s res: %s index=%d pass=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1374
+#: src/dird/dird_conf.c:1377
 #, c-format
 msgid "Expected a Job Type keyword, got: %s"
 msgstr ""
 
-#: src/dird/dird_conf.c:1398
+#: src/dird/dird_conf.c:1401
 #, c-format
 msgid "Expected a Job Level keyword, got: %s"
 msgstr ""
 
-#: src/dird/dird_conf.c:1418
+#: src/dird/dird_conf.c:1421
 #, c-format
 msgid "Expected a Restore replacement option, got: %s"
 msgstr ""
@@ -1741,174 +1693,179 @@ msgstr ""
 msgid "Cannot destroy var context: ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:73 src/tray-monitor/tray-monitor.c:867
+#: src/dird/fd_cmds.c:74 src/tray-monitor/tray-monitor.c:867
 msgid "File daemon"
 msgstr ""
 
-#: src/dird/fd_cmds.c:104
+#: src/dird/fd_cmds.c:105
 #, c-format
 msgid "File daemon \"%s\" rejected Job command: %s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:117
+#: src/dird/fd_cmds.c:118
 #, c-format
 msgid "Error updating Client record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:122
+#: src/dird/fd_cmds.c:123
 #, c-format
 msgid "FD gave bad response to JobId command: %s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:144 src/dird/fd_cmds.c:180
+#: src/dird/fd_cmds.c:145 src/dird/fd_cmds.c:181
 msgid ", since="
 msgstr ""
 
-#: src/dird/fd_cmds.c:164
+#: src/dird/fd_cmds.c:165
 msgid "No prior or suitable Full backup found. Doing FULL backup.\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:165 src/dird/fd_cmds.c:173
+#: src/dird/fd_cmds.c:166 src/dird/fd_cmds.c:174
 #, c-format
 msgid " (upgraded from %s)"
 msgstr ""
 
-#: src/dird/fd_cmds.c:171
+#: src/dird/fd_cmds.c:172
 #, c-format
 msgid "Prior failed job found. Upgrading to %s.\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:196
+#: src/dird/fd_cmds.c:197
 msgid "since_utime "
 msgstr ""
 
-#: src/dird/fd_cmds.c:232
+#: src/dird/fd_cmds.c:233
 #, c-format
 msgid "Unimplemented backup level %d %c\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:320 src/filed/job.c:565
+#: src/dird/fd_cmds.c:321 src/filed/job.c:559
 #, c-format
 msgid "Cannot run program: %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:331 src/dird/fd_cmds.c:356 src/dird/fd_cmds.c:370
+#: src/dird/fd_cmds.c:332 src/dird/fd_cmds.c:357 src/dird/fd_cmds.c:371
 msgid ">filed: write error on socket\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:337
+#: src/dird/fd_cmds.c:338
 #, c-format
 msgid "Error running program: %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:346
+#: src/dird/fd_cmds.c:347
 #, c-format
 msgid "Cannot open included file: %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:441 src/filed/job.c:1617
+#: src/dird/fd_cmds.c:442 src/filed/job.c:1637
 #, c-format
 msgid "Could not open bootstrap file %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:526
+#: src/dird/fd_cmds.c:527
 #, c-format
 msgid ""
 "<filed: bad attributes, expected 3 fields got %d\n"
 "msglen=%d msg=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:571 src/dird/verify.c:696
+#: src/dird/fd_cmds.c:572 src/dird/verify.c:697
 #, c-format
 msgid "MD5/SHA1 index %d not same as attributes %d\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:588
+#: src/dird/fd_cmds.c:589
 #, c-format
 msgid "<filed: Network error getting attributes. ERR=%s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:135
+#: src/dird/getmsg.c:130
 #, c-format
 msgid "bget_dirmsg: unknown bnet signal %d\n"
 msgstr ""
 
-#: src/dird/getmsg.c:153 src/dird/getmsg.c:166 src/dird/getmsg.c:178
-#: src/dird/getmsg.c:225 src/dird/getmsg.c:249
+#: src/dird/getmsg.c:148 src/dird/getmsg.c:161 src/dird/getmsg.c:173
+#: src/dird/getmsg.c:220 src/dird/getmsg.c:244
 #, c-format
 msgid "Malformed message: %s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:159
+#: src/dird/getmsg.c:154
 #, c-format
 msgid "Job not found: %s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:318
+#: src/dird/getmsg.c:313
 #, c-format
 msgid "Bad response to %s command: wanted %s, got %s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:323
+#: src/dird/getmsg.c:318
 #, c-format
 msgid "Socket error on %s command: ERR=%s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:249
+#: src/dird/inc_conf.c:251
 #, c-format
 msgid "Expected a FileSet option keyword, got:%s:"
 msgstr ""
 
-#: src/dird/inc_conf.c:282
+#: src/dird/inc_conf.c:284
 msgid "Old style Include/Exclude not supported\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:310 src/dird/inc_conf.c:577
+#: src/dird/inc_conf.c:312 src/dird/inc_conf.c:584
 #, c-format
 msgid "Expecting keyword, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:318 src/dird/inc_conf.c:583 src/lib/parse_conf.c:819
+#: src/dird/inc_conf.c:320 src/dird/inc_conf.c:590 src/lib/parse_conf.c:819
 #, c-format
 msgid "expected an equals, got: %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:328 src/dird/inc_conf.c:592
+#: src/dird/inc_conf.c:330 src/dird/inc_conf.c:599
 #, c-format
 msgid "Keyword %s not permitted in this resource"
 msgstr ""
 
-#: src/dird/inc_conf.c:381
+#: src/dird/inc_conf.c:383
 #, c-format
 msgid "Regex compile error. ERR=%s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:402
+#: src/dird/inc_conf.c:404
 #, c-format
 msgid "Expected a regex string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:488
+#: src/dird/inc_conf.c:490
 #, c-format
 msgid "Expected a wild-card string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:511
+#: src/dird/inc_conf.c:513
 #, c-format
 msgid "Expected an fstype string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:546
+#: src/dird/inc_conf.c:537
+#, c-format
+msgid "Backslash found. Use forward slashes or quote the string.: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:552
 #, c-format
 msgid "Expected a filename, got: %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:562
+#: src/dird/inc_conf.c:569
 #, c-format
 msgid "Expecting open brace. Got %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:617
+#: src/dird/inc_conf.c:624
 #, c-format
 msgid "Expected a FileSet keyword, got: %s"
 msgstr ""
@@ -1918,159 +1875,174 @@ msgstr ""
 msgid "Could not init job queue: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:488
+#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:449
 #, c-format
 msgid "Unable to init job cond variable: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:139
+#: src/dird/job.c:140
 #, c-format
 msgid "Could not add job queue: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:178
+#: src/dird/job.c:177
 msgid "Job canceled because max start delay time exceeded.\n"
 msgstr ""
 
-#: src/dird/job.c:229 src/dird/job.c:307
+#: src/dird/job.c:228 src/dird/job.c:321
 #, c-format
 msgid "Unimplemented job type: %d\n"
 msgstr ""
 
-#: src/dird/job.c:254
+#: src/dird/job.c:253
 #, c-format
 msgid "RunBefore: %s"
 msgstr ""
 
-#: src/dird/job.c:259
+#: src/dird/job.c:258
 #, c-format
 msgid "RunBeforeJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:325
+#: src/dird/job.c:339
 #, c-format
 msgid "RunAfter: %s"
 msgstr ""
 
-#: src/dird/job.c:335
+#: src/dird/job.c:349
 #, c-format
 msgid "RunAfterJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:337
+#: src/dird/job.c:351
 #, c-format
 msgid "RunAfterFailedJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:376
+#: src/dird/job.c:390
 #, c-format
 msgid "JobId %d, Job %s marked to be canceled.\n"
 msgstr ""
 
-#: src/dird/job.c:387
+#: src/dird/job.c:401
 msgid "Failed to connect to File daemon.\n"
 msgstr ""
 
-#: src/dird/job.c:409 src/dird/ua_cmds.c:619 src/dird/ua_cmds.c:1266
-#: src/dird/ua_label.c:691
+#: src/dird/job.c:423 src/dird/ua_cmds.c:680 src/dird/ua_cmds.c:1327
+#: src/dird/ua_label.c:712
 msgid "Failed to connect to Storage daemon.\n"
 msgstr ""
 
-#: src/dird/job.c:545 src/dird/job.c:593
+#: src/dird/job.c:557 src/dird/job.c:605
 #, c-format
 msgid "Unhandled job status code %d\n"
 msgstr ""
 
-#: src/dird/job.c:621 src/stored/bscan.c:902
+#: src/dird/job.c:633 src/stored/bscan.c:908
 #, c-format
 msgid "Could not create Client record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:653
+#: src/dird/job.c:665
 msgid "FileSet MD5 signature not found.\n"
 msgstr ""
 
-#: src/dird/job.c:658
+#: src/dird/job.c:670
 #, c-format
 msgid "Could not create FileSet \"%s\" record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:697
+#: src/dird/job.c:709
 #, c-format
 msgid "Error updating job record. %s"
 msgstr ""
 
-#: src/dird/jobq.c:67
+#: src/dird/jobq.c:62
 #, c-format
 msgid "pthread_attr_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:76
+#: src/dird/jobq.c:71
 #, c-format
 msgid "pthread_mutex_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:82
+#: src/dird/jobq.c:77
 #, c-format
 msgid "pthread_cond_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:115 src/dird/jobq.c:242 src/dird/jobq.c:307
-#: src/dird/jobq.c:388
+#: src/dird/jobq.c:110 src/dird/jobq.c:234 src/dird/jobq.c:299
+#: src/dird/jobq.c:380
 #, c-format
 msgid "pthread_mutex_lock: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:128
+#: src/dird/jobq.c:123
 #, c-format
 msgid "pthread_cond_broadcast: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:136
+#: src/dird/jobq.c:131
 #, c-format
 msgid "pthread_cond_wait: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:144
+#: src/dird/jobq.c:139
 #, c-format
 msgid "pthread_mutex_unlock: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:180
+#: src/dird/jobq.c:175
 #, c-format
 msgid "Job %s waiting %d seconds for scheduled start time.\n"
 msgstr ""
 
-#: src/dird/jobq.c:235
+#: src/dird/jobq.c:227
 #, c-format
 msgid "pthread_thread_create: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:353
+#: src/dird/jobq.c:345
 #, c-format
 msgid "pthread_cond_signal: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:362
+#: src/dird/jobq.c:354
 #, c-format
 msgid "pthread_create: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:487
+#: src/dird/jobq.c:481
 #, c-format
 msgid "Rescheduled Job %s at %s to re-run in %d seconds.\n"
 msgstr ""
 
-#: src/dird/mac.c:59 src/dird/verify.c:92
+#: src/dird/mac.c:77 src/dird/verify.c:92
 msgid "Unable to find JobId of previous Job for this client.\n"
 msgstr ""
 
-#: src/dird/mac.c:133
+#: src/dird/mac.c:85 src/dird/verify.c:108
+#, c-format
+msgid "Could not get job record for previous Job. ERR=%s"
+msgstr ""
+
+#: src/dird/mac.c:90 src/dird/verify.c:113
+#, c-format
+msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
+msgstr ""
+
+#: src/dird/mac.c:94
+#, c-format
+msgid "%s using JobId=%d Job=%s\n"
+msgstr ""
+
+#: src/dird/mac.c:185
 #, c-format
-msgid "Start %s JobId %u, Job=%s\n"
+msgid "Start %s JobId %s, Job=%s\n"
 msgstr ""
 
-#: src/dird/mac.c:369
+#: src/dird/mac.c:421
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -2100,22 +2072,22 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/msgchan.c:78 src/filed/job.c:1128
+#: src/dird/msgchan.c:80 src/filed/job.c:1125
 #: src/tray-monitor/tray-monitor.c:874
 msgid "Storage daemon"
 msgstr ""
 
-#: src/dird/msgchan.c:157
+#: src/dird/msgchan.c:171
 #, c-format
 msgid "Storage daemon rejected Job command: %s\n"
 msgstr ""
 
-#: src/dird/msgchan.c:164
+#: src/dird/msgchan.c:178
 #, c-format
 msgid "<stored: bad response to Job command: %s\n"
 msgstr ""
 
-#: src/dird/msgchan.c:211
+#: src/dird/msgchan.c:262
 #, c-format
 msgid ""
 "\n"
@@ -2123,7 +2095,14 @@ msgid ""
 "     %s"
 msgstr ""
 
-#: src/dird/msgchan.c:241 src/dird/msgchan.c:382
+#: src/dird/msgchan.c:266
+#, c-format
+msgid ""
+"\n"
+"     Storage daemon didn't accept Device \"%s\" command.\n"
+msgstr ""
+
+#: src/dird/msgchan.c:289 src/dird/msgchan.c:434
 #, c-format
 msgid "Cannot create message thread: %s\n"
 msgstr ""
@@ -2147,85 +2126,137 @@ msgstr ""
 msgid "Too many failures. Giving up creating Volume name.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:124
-#, c-format
-msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
-msgstr ""
-
-#: src/dird/next_vol.c:150
+#: src/dird/next_vol.c:128
 #, c-format
 msgid "Purging oldest volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:156
+#: src/dird/next_vol.c:134
 #, c-format
 msgid "Pruning oldest volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:175
+#: src/dird/next_vol.c:153
 msgid "We seem to be looping trying to find the next volume. I give up.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:200
+#: src/dird/next_vol.c:178
 #, c-format
 msgid "Max Volume bytes exceeded. Marking Volume \"%s\" as Full.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:207
+#: src/dird/next_vol.c:185
 #, c-format
 msgid "Volume used once. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:214
+#: src/dird/next_vol.c:192
 #, c-format
 msgid "Max Volume jobs exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:221
+#: src/dird/next_vol.c:199
 #, c-format
 msgid "Max Volume files exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:231
+#: src/dird/next_vol.c:209
 #, c-format
 msgid "Max configured use duration exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:241
+#: src/dird/next_vol.c:219
 #, c-format
 msgid "Catalog error updating volume \"%s\". ERR=%s"
 msgstr ""
 
-#: src/dird/next_vol.c:262
+#: src/dird/next_vol.c:240
 msgid "volume has expired"
 msgstr ""
 
-#: src/dird/next_vol.c:280 src/dird/next_vol.c:316
+#: src/dird/next_vol.c:258 src/dird/next_vol.c:294
 #, c-format
 msgid "Recycled current volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:285
+#: src/dird/next_vol.c:263
 msgid "and recycling of current volume failed"
 msgstr ""
 
-#: src/dird/next_vol.c:291
+#: src/dird/next_vol.c:269
 msgid "but should be Append, Purged or Recycle"
 msgstr ""
 
-#: src/dird/next_vol.c:319
+#: src/dird/next_vol.c:297
 msgid ""
 "but should be Append, Purged or Recycle (recycling of the current volume "
 "failed)"
 msgstr ""
 
-#: src/dird/next_vol.c:323
+#: src/dird/next_vol.c:301
 msgid ""
 "but should be Append, Purged or Recycle (cannot automatically recycle "
-"current volume, as it still contains unpruned data)"
+"current volume, as it still contains unpruned data or the Volume Retention "
+"time has not expired.)"
+msgstr ""
+
+#: src/dird/next_vol.c:342
+#, c-format
+msgid "Unable to get Pool record: ERR=%s"
+msgstr ""
+
+#: src/dird/next_vol.c:347
+#, c-format
+msgid "Unable add Scratch Volume, Pool \"%s\" full MaxVols=%d\n"
+msgstr ""
+
+#: src/dird/next_vol.c:360
+#, c-format
+msgid "Failed to move Scratch Volume. ERR=%s\n"
+msgstr ""
+
+#: src/dird/next_vol.c:364
+#, c-format
+msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:372
+#, c-format
+msgid "Unable to update Volume record: ERR=%s"
+msgstr ""
+
+#: src/dird/pythondir.c:107 src/filed/pythonfd.c:96 src/filed/pythonfd.c:150
+#: src/filed/pythonfd.c:214 src/stored/pythonsd.c:90 src/stored/pythonsd.c:155
+msgid "Job pointer not found."
+msgstr ""
+
+#: src/dird/pythondir.c:139
+msgid "Pool record not found."
+msgstr ""
+
+#: src/dird/pythondir.c:168 src/filed/pythonfd.c:127 src/stored/pythonsd.c:132
+#, c-format
+msgid "Attribute %s not found."
+msgstr ""
+
+#: src/dird/pythondir.c:211 src/dird/pythondir.c:217 src/filed/pythonfd.c:169
+#: src/stored/pythonsd.c:172
+msgid "Read-only attribute"
+msgstr ""
+
+#: src/dird/pythondir.c:243
+msgid "Priority must be 1-100"
+msgstr ""
+
+#: src/dird/pythondir.c:248
+msgid "Job Level can be set only during JobInit"
 msgstr ""
 
-#: src/dird/recycle.c:102
+#: src/dird/pythondir.c:259
+msgid "Bad JobLevel string"
+msgstr ""
+
+#: src/dird/recycle.c:99
 #, c-format
 msgid "Recycled volume \"%s\"\n"
 msgstr ""
@@ -2239,23 +2270,23 @@ msgstr ""
 msgid "Start Restore Job %s\n"
 msgstr ""
 
-#: src/dird/restore.c:231
+#: src/dird/restore.c:223
 msgid "Restore OK -- warning file count mismatch"
 msgstr ""
 
-#: src/dird/restore.c:233
+#: src/dird/restore.c:225
 msgid "Restore OK"
 msgstr ""
 
-#: src/dird/restore.c:238
+#: src/dird/restore.c:230
 msgid "*** Restore Error ***"
 msgstr ""
 
-#: src/dird/restore.c:248
+#: src/dird/restore.c:240
 msgid "Restore Canceled"
 msgstr ""
 
-#: src/dird/restore.c:275
+#: src/dird/restore.c:267
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -2365,15 +2396,15 @@ msgstr ""
 msgid "Job %s not found\n"
 msgstr ""
 
-#: src/dird/scheduler.c:102
+#: src/dird/scheduler.c:103
 msgid "Walk queue"
 msgstr ""
 
-#: src/dird/scheduler.c:112
+#: src/dird/scheduler.c:113
 msgid "Dequeued job"
 msgstr ""
 
-#: src/dird/scheduler.c:115
+#: src/dird/scheduler.c:116
 msgid "Scheduler logic error\n"
 msgstr ""
 
@@ -2381,170 +2412,180 @@ msgstr ""
 msgid "Run job"
 msgstr ""
 
-#: src/dird/scheduler.c:345
+#: src/dird/scheduler.c:349
 msgid "Inserted job"
 msgstr ""
 
-#: src/dird/scheduler.c:353
+#: src/dird/scheduler.c:357
 msgid "Appended job"
 msgstr ""
 
-#: src/dird/scheduler.c:357
+#: src/dird/scheduler.c:361
 msgid "Run queue"
 msgstr ""
 
-#: src/dird/ua_cmds.c:88
+#: src/dird/ua_cmds.c:90
 msgid "add media to a pool"
 msgstr ""
 
-#: src/dird/ua_cmds.c:89
+#: src/dird/ua_cmds.c:91
 msgid "autodisplay [on|off] -- console messages"
 msgstr ""
 
-#: src/dird/ua_cmds.c:90
+#: src/dird/ua_cmds.c:92
 msgid "automount [on|off] -- after label"
 msgstr ""
 
-#: src/dird/ua_cmds.c:91
+#: src/dird/ua_cmds.c:93
 msgid "cancel [<jobid=nnn> | <job=name>] -- cancel a job"
 msgstr ""
 
-#: src/dird/ua_cmds.c:92
+#: src/dird/ua_cmds.c:94
 msgid "create DB Pool from resource"
 msgstr ""
 
-#: src/dird/ua_cmds.c:93
+#: src/dird/ua_cmds.c:95
 msgid "delete [pool=<pool-name> | media volume=<volume-name>]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:94
+#: src/dird/ua_cmds.c:96
+msgid "disable <job=name> -- disable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:97
+msgid "enable <job=name> -- enable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:98
 msgid "performs FileSet estimate, listing gives full listing"
 msgstr ""
 
-#: src/dird/ua_cmds.c:96
+#: src/dird/ua_cmds.c:100
 msgid "gui [on|off] -- non-interactive gui mode"
 msgstr ""
 
-#: src/dird/ua_cmds.c:97 src/stored/btape.c:2533
+#: src/dird/ua_cmds.c:101 src/stored/btape.c:2540
 msgid "print this command"
 msgstr ""
 
-#: src/dird/ua_cmds.c:98
+#: src/dird/ua_cmds.c:102
 msgid ""
 "list [pools | jobs | jobtotals | media <pool=pool-name> | files <jobid=nn>]; "
 "from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:99
+#: src/dird/ua_cmds.c:103
 msgid "label a tape"
 msgstr ""
 
-#: src/dird/ua_cmds.c:100
+#: src/dird/ua_cmds.c:104
 msgid "full or long list like list command"
 msgstr ""
 
-#: src/dird/ua_cmds.c:101
+#: src/dird/ua_cmds.c:105
 msgid "messages"
 msgstr ""
 
-#: src/dird/ua_cmds.c:102
+#: src/dird/ua_cmds.c:106
 msgid "mount <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:103
+#: src/dird/ua_cmds.c:107
 msgid "prune expired records from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:104
+#: src/dird/ua_cmds.c:108
 msgid "purge records from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:105
+#: src/dird/ua_cmds.c:109
 msgid "python control commands"
 msgstr ""
 
-#: src/dird/ua_cmds.c:107
+#: src/dird/ua_cmds.c:111
 msgid "query catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:108
+#: src/dird/ua_cmds.c:112
 msgid "restore files"
 msgstr ""
 
-#: src/dird/ua_cmds.c:109
+#: src/dird/ua_cmds.c:113
 msgid "relabel a tape"
 msgstr ""
 
-#: src/dird/ua_cmds.c:110
+#: src/dird/ua_cmds.c:114
 msgid "release <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:111
+#: src/dird/ua_cmds.c:115
 msgid "reload conf file"
 msgstr ""
 
-#: src/dird/ua_cmds.c:112
+#: src/dird/ua_cmds.c:116
 msgid "run <job-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:113
+#: src/dird/ua_cmds.c:117
 msgid "status [storage | client]=<name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:114
+#: src/dird/ua_cmds.c:118
 msgid "sets debug level"
 msgstr ""
 
-#: src/dird/ua_cmds.c:115
+#: src/dird/ua_cmds.c:119
 msgid "sets new client address -- if authorized"
 msgstr ""
 
-#: src/dird/ua_cmds.c:116
+#: src/dird/ua_cmds.c:120
 msgid "show (resource records) [jobs | pools | ... | all]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:117
+#: src/dird/ua_cmds.c:121
 msgid "use SQL to query catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:119
+#: src/dird/ua_cmds.c:123
 msgid "turn on/off trace to file"
 msgstr ""
 
-#: src/dird/ua_cmds.c:120
+#: src/dird/ua_cmds.c:124
 msgid "unmount <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:121
+#: src/dird/ua_cmds.c:125
 msgid "umount <storage-name> for old-time Unix guys"
 msgstr ""
 
-#: src/dird/ua_cmds.c:122
+#: src/dird/ua_cmds.c:126
 msgid "update Volume, Pool or slots"
 msgstr ""
 
-#: src/dird/ua_cmds.c:123
+#: src/dird/ua_cmds.c:127
 msgid "use catalog xxx"
 msgstr ""
 
-#: src/dird/ua_cmds.c:124
+#: src/dird/ua_cmds.c:128
 msgid "does variable expansion"
 msgstr ""
 
-#: src/dird/ua_cmds.c:125
+#: src/dird/ua_cmds.c:129
 msgid "print Director version"
 msgstr ""
 
-#: src/dird/ua_cmds.c:126
-msgid "wait until no jobs are running"
+#: src/dird/ua_cmds.c:130
+msgid ""
+"wait until no jobs are running [<jobname=name> | <jobid=nnn> | "
+"<ujobid=complete_name>]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:158
+#: src/dird/ua_cmds.c:168
 #, c-format
 msgid "%s: is an illegal command.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:196
+#: src/dird/ua_cmds.c:206
 msgid ""
 "You probably don't want to be using this command since it\n"
 "creates database records without labeling the Volumes.\n"
@@ -2552,220 +2593,234 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:215
+#: src/dird/ua_cmds.c:225
 #, c-format
-msgid "Pool already has maximum volumes = %d\n"
+msgid "Pool already has maximum volumes=%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:217
+#: src/dird/ua_cmds.c:227
 msgid "Enter new maximum (zero for unlimited): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:238
+#: src/dird/ua_cmds.c:248
 #, c-format
 msgid "Enter number of Volumes to create. 0=>fixed name. Max=%d: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:244
+#: src/dird/ua_cmds.c:254
 #, c-format
 msgid "The number must be between 0 and %d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:251
+#: src/dird/ua_cmds.c:261
 msgid "Enter Volume name: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:255
+#: src/dird/ua_cmds.c:265
 msgid "Enter base volume name: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:264 src/dird/ua_label.c:590
+#: src/dird/ua_cmds.c:274 src/dird/ua_label.c:609
 msgid "Volume name too long.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:268 src/dird/ua_label.c:596 src/lib/edit.c:413
+#: src/dird/ua_cmds.c:278 src/dird/ua_label.c:615 src/lib/edit.c:446
 msgid "Volume name must be at least one character long.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:277
+#: src/dird/ua_cmds.c:287
 msgid "Enter the starting number: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:282
+#: src/dird/ua_cmds.c:292
 msgid "Start number must be greater than zero.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:293
+#: src/dird/ua_cmds.c:303
 msgid "Enter slot (0 for none): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:297
+#: src/dird/ua_cmds.c:307
 msgid "InChanger? yes/no: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:324
+#: src/dird/ua_cmds.c:334
 #, c-format
 msgid "%d Volumes created in pool %s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:340 src/dird/ua_cmds.c:866
+#: src/dird/ua_cmds.c:350 src/dird/ua_cmds.c:927
 msgid "Turn on or off? "
 msgstr ""
 
-#: src/dird/ua_cmds.c:348 src/dird/ua_cmds.c:874
+#: src/dird/ua_cmds.c:358 src/dird/ua_cmds.c:935
 msgid "off"
 msgstr ""
 
-#: src/dird/ua_cmds.c:368
+#: src/dird/ua_cmds.c:378
 msgid "jobid"
 msgstr ""
 
-#: src/dird/ua_cmds.c:375
+#: src/dird/ua_cmds.c:385
 #, c-format
 msgid "JobId %s is not running. Use Job name to cancel inactive jobs.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:379
+#: src/dird/ua_cmds.c:389
 msgid "job"
 msgstr ""
 
-#: src/dird/ua_cmds.c:384
+#: src/dird/ua_cmds.c:394 src/dird/ua_cmds.c:404
 #, c-format
 msgid "Warning Job %s is not running. Continuing anyway ...\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:407 src/filed/status.c:193 src/stored/status.c:315
+#: src/dird/ua_cmds.c:399
+msgid "ujobid"
+msgstr ""
+
+#: src/dird/ua_cmds.c:427 src/filed/status.c:195 src/stored/status.c:343
 msgid "No Jobs running.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:410
+#: src/dird/ua_cmds.c:430
 msgid "Select Job:\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:417
+#: src/dird/ua_cmds.c:436
 #, c-format
 msgid "JobId=%s Job=%s"
 msgstr ""
 
-#: src/dird/ua_cmds.c:422
+#: src/dird/ua_cmds.c:441
 msgid "Choose Job to cancel"
 msgstr ""
 
-#: src/dird/ua_cmds.c:426
+#: src/dird/ua_cmds.c:445
 msgid "Confirm cancel (yes/no): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:434
+#: src/dird/ua_cmds.c:452
 #, c-format
 msgid "Job %s not found.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:539
+#: src/dird/ua_cmds.c:557
 #, c-format
 msgid ""
 "Error: Pool %s already exists.\n"
 "Use update to change it.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:550
+#: src/dird/ua_cmds.c:568
 #, c-format
 msgid "Pool %s created.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:563
+#: src/dird/ua_cmds.c:581
 msgid "restart"
 msgstr ""
 
-#: src/dird/ua_cmds.c:567
+#: src/dird/ua_cmds.c:585
 msgid "Python interpreter restarted.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:569 src/dird/ua_cmds.c:1094
+#: src/dird/ua_cmds.c:587 src/dird/ua_cmds.c:1155
 msgid "Nothing done.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:585
+#: src/dird/ua_cmds.c:603 src/dird/ua_cmds.c:649
 msgid "Illegal command from this console.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:592 src/dird/ua_run.c:353
+#: src/dird/ua_cmds.c:610 src/dird/ua_run.c:353
 #, c-format
 msgid "Client \"%s\" not found.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:601
+#: src/dird/ua_cmds.c:619
 #, c-format
 msgid "Client \"%s\" address set to %s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:616 src/dird/ua_status.c:286
+#: src/dird/ua_cmds.c:644
+#, c-format
+msgid "Job \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:653
+#, c-format
+msgid "Job \"%s\" %sabled\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:677 src/dird/ua_status.c:286
 #, c-format
 msgid "Connecting to Storage daemon %s at %s:%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:622 src/dird/ua_status.c:297
+#: src/dird/ua_cmds.c:683 src/dird/ua_status.c:297
 msgid "Connected to storage daemon\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:642 src/dird/ua_cmds.c:981 src/dird/ua_status.c:324
+#: src/dird/ua_cmds.c:703 src/dird/ua_cmds.c:1042 src/dird/ua_status.c:324
 #, c-format
 msgid "Connecting to Client %s at %s:%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:645 src/dird/ua_cmds.c:984
+#: src/dird/ua_cmds.c:706 src/dird/ua_cmds.c:1045
 msgid "Failed to connect to Client.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:761
+#: src/dird/ua_cmds.c:822
 msgid "Enter new debug level: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:827
+#: src/dird/ua_cmds.c:888
 msgid "Available daemons are: \n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:832
+#: src/dird/ua_cmds.c:893
 msgid "Select daemon type to set debug level"
 msgstr ""
 
-#: src/dird/ua_cmds.c:936 src/dird/ua_run.c:478
+#: src/dird/ua_cmds.c:997 src/dird/ua_run.c:478
 #, c-format
 msgid "Level %s not valid.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:949
+#: src/dird/ua_cmds.c:1010
 msgid "No job specified.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:989
+#: src/dird/ua_cmds.c:1050
 msgid "Error sending include list.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:994
+#: src/dird/ua_cmds.c:1055
 msgid "Error sending exclude list.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1080
+#: src/dird/ua_cmds.c:1141
 msgid ""
 "In general it is not a good idea to delete either a\n"
 "Pool or a Volume since they may contain data.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1083
+#: src/dird/ua_cmds.c:1144
 msgid "Choose catalog item to delete"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1151
+#: src/dird/ua_cmds.c:1212
 msgid "Enter JobId to delete: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:1194
+#: src/dird/ua_cmds.c:1255
 #, c-format
 msgid "Job %s and associated records deleted from the catalog.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1207
+#: src/dird/ua_cmds.c:1268
 #, c-format
 msgid ""
 "\n"
@@ -2773,58 +2828,70 @@ msgid ""
 "and all Jobs saved on that volume from the Catalog\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1211
+#: src/dird/ua_cmds.c:1272
 msgid "Are you sure you want to delete this Volume? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:1232
+#: src/dird/ua_cmds.c:1293
 msgid "Are you sure you want to delete this Pool? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:1329
+#: src/dird/ua_cmds.c:1390
 #, c-format
 msgid "Using Catalog name=%s DB=%s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1370 src/dird/ua_tree.c:594 src/stored/btape.c:2580
+#: src/dird/ua_cmds.c:1450
+msgid "ERR: Can't open db\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1486
+msgid "ERR: Job was not found\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1562 src/dird/ua_tree.c:629 src/stored/btape.c:2587
 #, c-format
 msgid ""
 "  Command    Description\n"
 "  =======    ===========\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1372
+#: src/dird/ua_cmds.c:1564
 #, c-format
 msgid "  %-10s %s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1374
+#: src/dird/ua_cmds.c:1566
 msgid ""
 "\n"
 "When at a prompt, entering a period cancels the command.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1390
+#: src/dird/ua_cmds.c:1582
 #, c-format
 msgid "%s Version: %s (%s)\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1409
+#: src/dird/ua_cmds.c:1601
 msgid "Could not find a Catalog resource\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1412
+#: src/dird/ua_cmds.c:1604
+msgid "You must specify a \"use <catalog-name>\" command before continuing.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1608
 #, c-format
 msgid "Using default Catalog name=%s DB=%s\n"
 msgstr ""
 
-#: src/dird/ua_dotcmds.c:121
+#: src/dird/ua_dotcmds.c:131
 msgid "The Director will segment fault.\n"
 msgstr ""
 
-#: src/dird/ua_dotcmds.c:221 src/dird/ua_restore.c:747
-#: src/dird/ua_restore.c:785
+#: src/dird/ua_dotcmds.c:245 src/dird/ua_restore.c:737
+#: src/dird/ua_restore.c:775 src/dird/ua_restore.c:806
 #, c-format
 msgid "Query failed: %s. ERR=%s\n"
 msgstr ""
@@ -2838,15 +2905,16 @@ msgstr ""
 msgid "Expected a positive integer, got: %s\n"
 msgstr ""
 
-#: src/dird/ua_input.c:120 src/dird/ua_run.c:860 src/dird/ua_select.c:54
-#: src/dird/ua_update.c:232 src/dird/ua_update.c:247 src/dird/ua_update.c:495
-#: src/stored/parse_bsr.c:741 src/tools/dbcheck.c:1098
+#: src/dird/ua_input.c:120 src/dird/ua_run.c:862 src/dird/ua_select.c:54
+#: src/dird/ua_update.c:223 src/dird/ua_update.c:237 src/dird/ua_update.c:247
+#: src/dird/ua_update.c:261 src/dird/ua_update.c:552
+#: src/stored/parse_bsr.c:770 src/tools/dbcheck.c:1098
 msgid "yes"
 msgstr ""
 
-#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:234
-#: src/dird/ua_update.c:247 src/dird/ua_update.c:495
-#: src/stored/parse_bsr.c:741
+#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:225
+#: src/dird/ua_update.c:237 src/dird/ua_update.c:249 src/dird/ua_update.c:261
+#: src/dird/ua_update.c:552 src/stored/parse_bsr.c:770
 msgid "no"
 msgstr ""
 
@@ -2854,220 +2922,210 @@ msgstr ""
 msgid "Invalid response. You must answer yes or no.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:88
+#: src/dird/ua_label.c:89
 msgid "Negative numbers not permitted\n"
 msgstr ""
 
-#: src/dird/ua_label.c:94
+#: src/dird/ua_label.c:95
 msgid "Range end is not integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:99
+#: src/dird/ua_label.c:100
 msgid "Range start is not an integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:105
+#: src/dird/ua_label.c:106
 msgid "Range end not bigger than start.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:111
+#: src/dird/ua_label.c:112
 msgid "Input value is not an integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:117
+#: src/dird/ua_label.c:118
 msgid "Values must be be greater than zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:121
+#: src/dird/ua_label.c:122
 msgid "Slot too large.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:176 src/dird/ua_label.c:463
+#: src/dird/ua_label.c:176 src/dird/ua_label.c:477
 msgid "No slots in changer to scan.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:188 src/dird/ua_label.c:474
+#: src/dird/ua_label.c:188 src/dird/ua_label.c:488
 msgid "No Volumes found to label, or no barcodes.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:195
+#: src/dird/ua_label.c:198
 #, c-format
-msgid "Slot %d larger than max %d ignored.\n"
+msgid "Slot %d greater than max %d ignored.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:224
+#: src/dird/ua_label.c:227
 #, c-format
-msgid "No VolName for Slot=%d set InChanger to zero.\n"
+msgid "No VolName for Slot=%d InChanger set to zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:239
+#: src/dird/ua_label.c:242
 #, c-format
 msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:243
+#: src/dird/ua_label.c:246
 #, c-format
 msgid "Catalog record for Volume \"%s\" is up to date.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:249
+#: src/dird/ua_label.c:252
 #, c-format
-msgid "Record for Volume \"%s\" not found in catalog.\n"
+msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:334
+#: src/dird/ua_label.c:348
 #, c-format
 msgid ""
 "Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before "
 "relabeling.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:350
+#: src/dird/ua_label.c:364
 msgid "Enter new Volume name: "
 msgstr ""
 
-#: src/dird/ua_label.c:363
+#: src/dird/ua_label.c:377
 #, c-format
 msgid "Media record for new Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:378
+#: src/dird/ua_label.c:392
 msgid "Enter slot (0 or Enter for none): "
 msgstr ""
 
-#: src/dird/ua_label.c:403
+#: src/dird/ua_label.c:417
 #, c-format
 msgid "Delete of Volume \"%s\" failed. ERR=%s"
 msgstr ""
 
-#: src/dird/ua_label.c:406
+#: src/dird/ua_label.c:420
 #, c-format
 msgid "Old volume \"%s\" deleted from catalog.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:417
+#: src/dird/ua_label.c:431
 #, c-format
 msgid "Requesting to mount %s ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:439
+#: src/dird/ua_label.c:453
 msgid "Do not forget to mount the drive!!!\n"
 msgstr ""
 
-#: src/dird/ua_label.c:479
+#: src/dird/ua_label.c:493
 msgid ""
 "The following Volumes will be labeled:\n"
 "Slot  Volume\n"
 "==============\n"
 msgstr ""
 
-#: src/dird/ua_label.c:488 src/stored/btape.c:608
+#: src/dird/ua_label.c:502 src/stored/btape.c:606
 msgid "Do you want to continue? (y/n): "
 msgstr ""
 
-#: src/dird/ua_label.c:509
+#: src/dird/ua_label.c:523
 #, c-format
 msgid "Media record for Slot %d Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:515
+#: src/dird/ua_label.c:529
 #, c-format
 msgid "Error setting InChanger: ERR=%s"
 msgstr ""
 
-#: src/dird/ua_label.c:540
+#: src/dird/ua_label.c:552
+#, c-format
+msgid "Maximum pool Volumes=%d reached.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:559
 #, c-format
 msgid "Catalog record for cleaning tape \"%s\" successfully created.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:547
+#: src/dird/ua_label.c:566
 #, c-format
 msgid "Catalog error on cleaning tape: %s"
 msgstr ""
 
-#: src/dird/ua_label.c:583
+#: src/dird/ua_label.c:602
 #, c-format
 msgid "Illegal character \"%c\" in a volume name.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:628
+#: src/dird/ua_label.c:647
 #, c-format
 msgid "Sending relabel command from \"%s\" to \"%s\" ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:635
+#: src/dird/ua_label.c:654
 #, c-format
 msgid "Sending label command for Volume \"%s\" Slot %d ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:665
+#: src/dird/ua_label.c:686
 #, c-format
 msgid "Catalog record for Volume \"%s\", Slot %d  successfully created.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:678
+#: src/dird/ua_label.c:699
 #, c-format
 msgid "Label command failed for Volume %s.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:688
+#: src/dird/ua_label.c:709
 #, c-format
 msgid "Connecting to Storage daemon %s at %s:%d ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:716
+#: src/dird/ua_label.c:737
 msgid "Could not open SD socket.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:722
-#, c-format
-msgid "readlabel %s Slot=%d drive=%d\n"
-msgstr ""
-
-#: src/dird/ua_label.c:764
-#, c-format
-msgid "autochanger list %s \n"
-msgstr ""
-
-#: src/dird/ua_label.c:788 src/dird/ua_label.c:798
+#: src/dird/ua_label.c:809 src/dird/ua_label.c:819
 #, c-format
 msgid "Invalid Slot number: %s\n"
 msgstr ""
 
-#: src/dird/ua_label.c:807
+#: src/dird/ua_label.c:828
 #, c-format
 msgid "Invalid Volume name: %s\n"
 msgstr ""
 
-#: src/dird/ua_label.c:876
-#, c-format
-msgid "autochanger slots %s \n"
-msgstr ""
-
-#: src/dird/ua_label.c:886
+#: src/dird/ua_label.c:907
 #, c-format
 msgid "Device \"%s\" has %d slots.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:902
+#: src/dird/ua_label.c:956
 #, c-format
 msgid "Pool \"%s\" resource not found!\n"
 msgstr ""
 
-#: src/dird/ua_output.c:64 src/dird/ua_output.c:90
+#: src/dird/ua_output.c:64 src/dird/ua_output.c:88
 msgid "ON or OFF keyword missing.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:178
+#: src/dird/ua_output.c:176
 msgid "Keywords for the show command are:\n"
 msgstr ""
 
-#: src/dird/ua_output.c:184
+#: src/dird/ua_output.c:182
 #, c-format
 msgid "%s resource %s not found.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:187
+#: src/dird/ua_output.c:185
 #, c-format
 msgid "Resource %s not found\n"
 msgstr ""
@@ -3076,49 +3134,55 @@ msgstr ""
 msgid "Hey! DB is NULL\n"
 msgstr ""
 
-#: src/dird/ua_output.c:353
+#: src/dird/ua_output.c:367
 #, c-format
 msgid "Jobid %d used %d Volume(s): %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:365
+#: src/dird/ua_output.c:385
 msgid "No Pool specified.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:375 src/dird/ua_select.c:446
+#: src/dird/ua_output.c:396 src/dird/ua_select.c:458
 #, c-format
 msgid "Error obtaining pool ids. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:385
+#: src/dird/ua_output.c:406
 #, c-format
 msgid "Pool: %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:396
-msgid "No Volume Name specified.\n"
+#: src/dird/ua_output.c:422 src/dird/ua_status.c:455
+msgid "Ignoring illegal value for days.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:409
+#: src/dird/ua_output.c:431
 #, c-format
 msgid "Unknown list keyword: %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:434
+#: src/dird/ua_output.c:457
 #, c-format
 msgid "%s is not a job name.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:450 src/dird/ua_output.c:462
-msgid "Could not find next Volume.\n"
+#: src/dird/ua_output.c:481
+#, c-format
+msgid "Could not find next Volume for Job %s (%s, %s).\n"
+msgstr ""
+
+#: src/dird/ua_output.c:485
+#, c-format
+msgid "The next Volume to be used by Job \"%s\" (%s, %s) will be %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:452
+#: src/dird/ua_output.c:495
 #, c-format
-msgid "The next Volume to be used by Job \"%s\" will be %s\n"
+msgid "Could not find next Volume for Job %s.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:671
+#: src/dird/ua_output.c:685
 msgid "You have no messages.\n"
 msgstr ""
 
@@ -3278,32 +3342,32 @@ msgstr ""
 msgid "End query mode.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:151
+#: src/dird/ua_restore.c:115
 msgid ""
 "No Restore Job Resource found in bacula-dir.conf.\n"
 "You must create at least one before running this command.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:167
+#: src/dird/ua_restore.c:131
 msgid "Restore not done.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:178
+#: src/dird/ua_restore.c:142
 msgid "Unable to construct a valid BSR. Cannot continue.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:182 src/dird/ua_restore.c:196
+#: src/dird/ua_restore.c:146 src/dird/ua_restore.c:160
 msgid "No files selected to be restored.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:190
+#: src/dird/ua_restore.c:154
 msgid ""
 "\n"
 "1 file selected to be restored.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:193
+#: src/dird/ua_restore.c:157
 #, c-format
 msgid ""
 "\n"
@@ -3311,80 +3375,85 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:211
+#: src/dird/ua_restore.c:175
 msgid "No Restore Job resource found!\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:309
+#: src/dird/ua_restore.c:234
+#, c-format
+msgid "Missing value for keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:283
 msgid "List last 20 Jobs run"
 msgstr ""
 
-#: src/dird/ua_restore.c:310
+#: src/dird/ua_restore.c:284
 msgid "List Jobs where a given File is saved"
 msgstr ""
 
-#: src/dird/ua_restore.c:311
+#: src/dird/ua_restore.c:285
 msgid "Enter list of comma separated JobIds to select"
 msgstr ""
 
-#: src/dird/ua_restore.c:312
+#: src/dird/ua_restore.c:286
 msgid "Enter SQL list command"
 msgstr ""
 
-#: src/dird/ua_restore.c:313
+#: src/dird/ua_restore.c:287
 msgid "Select the most recent backup for a client"
 msgstr ""
 
-#: src/dird/ua_restore.c:314
+#: src/dird/ua_restore.c:288
 msgid "Select backup for a client before a specified time"
 msgstr ""
 
-#: src/dird/ua_restore.c:315
+#: src/dird/ua_restore.c:289
 msgid "Enter a list of files to restore"
 msgstr ""
 
-#: src/dird/ua_restore.c:316
+#: src/dird/ua_restore.c:290
 msgid "Enter a list of files to restore before a specified time"
 msgstr ""
 
-#: src/dird/ua_restore.c:317
+#: src/dird/ua_restore.c:291
 msgid "Find the JobIds of the most recent backup for a client"
 msgstr ""
 
-#: src/dird/ua_restore.c:318
+#: src/dird/ua_restore.c:292
 msgid "Find the JobIds for a backup for a client before a specified time"
 msgstr ""
 
-#: src/dird/ua_restore.c:319
+#: src/dird/ua_restore.c:293
 msgid "Enter a list of directories to restore for found JobIds"
 msgstr ""
 
-#: src/dird/ua_restore.c:320 src/dird/ua_status.c:702 src/filed/status.c:249
-#: src/stored/status.c:367 src/wx-console/wxbconfigpanel.cpp:191
+#: src/dird/ua_restore.c:294 src/dird/ua_status.c:722 src/filed/status.c:251
+#: src/stored/status.c:412 src/wx-console/wxbconfigpanel.cpp:191
 msgid "Cancel"
 msgstr ""
 
-#: src/dird/ua_restore.c:356
+#: src/dird/ua_restore.c:330
 #, c-format
 msgid "Unknown keyword: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:374
+#: src/dird/ua_restore.c:354
 #, c-format
 msgid "Improper date format: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:408 src/dird/ua_select.c:576
+#: src/dird/ua_restore.c:394 src/dird/ua_select.c:590
 #, c-format
 msgid "Error: Pool resource \"%s\" does not exist.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:413
+#: src/dird/ua_restore.c:399
 #, c-format
 msgid "Error: Pool resource \"%s\" access not allowed.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:432
+#: src/dird/ua_restore.c:418
 msgid ""
 "\n"
 "First you select one or more JobIds that contain files\n"
@@ -3394,217 +3463,226 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:444
+#: src/dird/ua_restore.c:430
 msgid "To select the JobIds, you have the following choices:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:449
+#: src/dird/ua_restore.c:435
 msgid "Select item: "
 msgstr ""
 
-#: src/dird/ua_restore.c:463
+#: src/dird/ua_restore.c:449
 msgid "Enter Filename (no path):"
 msgstr ""
 
-#: src/dird/ua_restore.c:478 src/dird/ua_restore.c:578
+#: src/dird/ua_restore.c:464 src/dird/ua_restore.c:564
 msgid "Enter JobId(s), comma separated, to restore: "
 msgstr ""
 
-#: src/dird/ua_restore.c:484
+#: src/dird/ua_restore.c:470
 msgid "Enter SQL list command: "
 msgstr ""
 
-#: src/dird/ua_restore.c:512 src/dird/ua_restore.c:537
+#: src/dird/ua_restore.c:498 src/dird/ua_restore.c:523
 msgid ""
 "Enter file names with paths, or < to enter a filename\n"
-"containg a list of file names with paths, and terminate\n"
+"containing a list of file names with paths, and terminate\n"
 "them with a blank line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:516 src/dird/ua_restore.c:541
+#: src/dird/ua_restore.c:502 src/dird/ua_restore.c:527
 msgid "Enter full filename: "
 msgstr ""
 
-#: src/dird/ua_restore.c:576
+#: src/dird/ua_restore.c:562
 #, c-format
 msgid "You have already seleted the following JobIds: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:591
+#: src/dird/ua_restore.c:577
 msgid ""
 "Enter full directory names or start the name\n"
-"with a < to indicate it is a filename containg a list\n"
+"with a < to indicate it is a filename containing a list\n"
 "of directories and terminate them with a blank line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:595
+#: src/dird/ua_restore.c:581
 msgid "Enter directory name: "
 msgstr ""
 
-#: src/dird/ua_restore.c:620
+#: src/dird/ua_restore.c:606
 msgid "No Jobs selected.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:624
+#: src/dird/ua_restore.c:610
 #, c-format
 msgid "You have selected the following JobIds: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:627
+#: src/dird/ua_restore.c:613
 #, c-format
 msgid "You have selected the following JobId: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:636
+#: src/dird/ua_restore.c:621
 msgid "Invalid JobId in list.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:648
+#: src/dird/ua_restore.c:634
 #, c-format
 msgid "Unable to get Job record for JobId=%s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:653
+#: src/dird/ua_restore.c:639
 #, c-format
 msgid "No authorization. Job \"%s\" not selected.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:667
+#: src/dird/ua_restore.c:653
 msgid ""
 "The restored files will the most current backup\n"
 "BEFORE the date you specify below.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:670
+#: src/dird/ua_restore.c:656
 msgid "Enter date as YYYY-MM-DD HH:MM:SS :"
 msgstr ""
 
-#: src/dird/ua_restore.c:676
+#: src/dird/ua_restore.c:662
 msgid "Improper date format.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:697
+#: src/dird/ua_restore.c:683
 #, c-format
 msgid "Cannot open file %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:705 src/dird/ua_restore.c:709
+#: src/dird/ua_restore.c:691 src/dird/ua_restore.c:695
 #, c-format
 msgid "Error occurred on line %d of %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:751 src/dird/ua_restore.c:789
+#: src/dird/ua_restore.c:741 src/dird/ua_restore.c:779
 #, c-format
 msgid "No database record found for: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:776
+#: src/dird/ua_restore.c:766
 msgid "No JobId specified cannot continue.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:895
+#: src/dird/ua_restore.c:810
+#, c-format
+msgid "No table found: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:915
 #, c-format
 msgid ""
 "\n"
 "Building directory tree for JobId %s ...  "
 msgstr ""
 
-#: src/dird/ua_restore.c:914
+#: src/dird/ua_restore.c:934
 msgid ""
 "\n"
 "There were no files inserted into the tree, so file selection\n"
 "is not possible.Most likely your retention policy pruned the files\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:916
+#: src/dird/ua_restore.c:936
 msgid ""
 "\n"
 "Do you want to restore all the files? (yes|no): "
 msgstr ""
 
-#: src/dird/ua_restore.c:932
+#: src/dird/ua_restore.c:952
 #, c-format
 msgid ""
 "\n"
 "1 Job, %s files inserted into the tree and marked for extraction.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:936
+#: src/dird/ua_restore.c:956
 #, c-format
 msgid ""
 "\n"
 "1 Job, %s files inserted into the tree.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:942
+#: src/dird/ua_restore.c:962
 #, c-format
 msgid ""
 "\n"
 "%d Jobs, %s files inserted into the tree and marked for extraction.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:946
+#: src/dird/ua_restore.c:966
 #, c-format
 msgid ""
 "\n"
 "%d Jobs, %s files inserted into the tree.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1023
+#: src/dird/ua_restore.c:1043
 #, c-format
 msgid "Error getting FileSet \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1031 src/dird/ua_select.c:165
+#: src/dird/ua_restore.c:1051 src/dird/ua_select.c:167
 msgid "The defined FileSet resources are:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1035 src/dird/ua_select.c:173
+#: src/dird/ua_restore.c:1055 src/dird/ua_run.c:644 src/dird/ua_select.c:175
+msgid "FileSet"
+msgstr ""
+
+#: src/dird/ua_restore.c:1055 src/dird/ua_select.c:175
 msgid "Select FileSet resource"
 msgstr ""
 
-#: src/dird/ua_restore.c:1042
+#: src/dird/ua_restore.c:1062
 #, c-format
 msgid "Error getting FileSet record: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1043
+#: src/dird/ua_restore.c:1063
 msgid ""
 "This probably means you modified the FileSet.\n"
 "Continuing anyway.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1058
+#: src/dird/ua_restore.c:1078
 #, c-format
 msgid "Pool \"%s\" not found, using any pool.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1084 src/dird/ua_restore.c:1100
+#: src/dird/ua_restore.c:1104 src/dird/ua_restore.c:1120
 #, c-format
 msgid "No Full backup before %s found.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1123
+#: src/dird/ua_restore.c:1143
 msgid "No jobs found.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1289
+#: src/dird/ua_restore.c:1316
 msgid ""
 "Warning, the JobIds that you selected refer to more than one MediaType.\n"
 "Restore is not possible. The MediaTypes used are:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1297
+#: src/dird/ua_restore.c:1324
 msgid "No MediaType found for your JobIds.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1329
+#: src/dird/ua_restore.c:1356
 #, c-format
 msgid "Warning default storage overridden by %s on command line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1340
+#: src/dird/ua_restore.c:1367
 #, c-format
 msgid ""
 "\n"
@@ -3759,7 +3837,7 @@ msgid ""
 "Priority: %d\n"
 msgstr ""
 
-#: src/dird/ua_run.c:507 src/lib/util.c:301
+#: src/dird/ua_run.c:507 src/lib/util.c:295
 msgid "Admin"
 msgstr ""
 
@@ -3777,7 +3855,7 @@ msgid ""
 "Priority: %d\n"
 msgstr ""
 
-#: src/dird/ua_run.c:528 src/lib/util.c:292
+#: src/dird/ua_run.c:528 src/lib/util.c:286
 msgid "Backup"
 msgstr ""
 
@@ -3796,7 +3874,7 @@ msgid ""
 "Priority:    %d\n"
 msgstr ""
 
-#: src/dird/ua_run.c:554 src/lib/util.c:295
+#: src/dird/ua_run.c:554 src/lib/util.c:289
 msgid "Verify"
 msgstr ""
 
@@ -3849,7 +3927,7 @@ msgstr ""
 msgid "mod"
 msgstr ""
 
-#: src/dird/ua_run.c:640 src/dird/ua_update.c:415
+#: src/dird/ua_run.c:640 src/dird/ua_update.c:463
 msgid "Parameters to modify:\n"
 msgstr ""
 
@@ -3857,40 +3935,79 @@ msgstr ""
 msgid "Level"
 msgstr ""
 
-#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:380
-#: src/wx-console/wxbrestorepanel.cpp:808
-#: src/wx-console/wxbrestorepanel.cpp:1833
+#: src/dird/ua_run.c:642 src/dird/ua_select.c:152
+#: src/wx-console/wxbrestorepanel.cpp:321
+#: src/wx-console/wxbrestorepanel.cpp:337
+#: src/wx-console/wxbrestorepanel.cpp:458
+#: src/wx-console/wxbrestorepanel.cpp:459
+#: src/wx-console/wxbrestorepanel.cpp:469
+#: src/wx-console/wxbrestorepanel.cpp:470
+#: src/wx-console/wxbrestorepanel.cpp:1133
+#: src/wx-console/wxbrestorepanel.cpp:1794
+#: src/wx-console/wxbrestorepanel.cpp:1865
+msgid "Storage"
+msgstr ""
+
+#: src/dird/ua_run.c:645 src/dird/ua_select.c:282 src/dird/ua_select.c:391
+#: src/wx-console/wxbrestorepanel.cpp:318
+#: src/wx-console/wxbrestorepanel.cpp:336
+#: src/wx-console/wxbrestorepanel.cpp:410
+#: src/wx-console/wxbrestorepanel.cpp:411
+#: src/wx-console/wxbrestorepanel.cpp:421
+#: src/wx-console/wxbrestorepanel.cpp:422
+#: src/wx-console/wxbrestorepanel.cpp:669
+#: src/wx-console/wxbrestorepanel.cpp:1103
+#: src/wx-console/wxbrestorepanel.cpp:1190
+#: src/wx-console/wxbrestorepanel.cpp:1787
+#: src/wx-console/wxbrestorepanel.cpp:1789
+#: src/wx-console/wxbrestorepanel.cpp:1863
+#: src/wx-console/wxbrestorepanel.cpp:1918
+msgid "Client"
+msgstr ""
+
+#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:338
+#: src/wx-console/wxbrestorepanel.cpp:823
+#: src/wx-console/wxbrestorepanel.cpp:1867
 msgid "When"
 msgstr ""
 
-#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:381
-#: src/wx-console/wxbrestorepanel.cpp:1079
-#: src/wx-console/wxbrestorepanel.cpp:1835
+#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:339
+#: src/wx-console/wxbrestorepanel.cpp:1096
+#: src/wx-console/wxbrestorepanel.cpp:1869
 msgid "Priority"
 msgstr ""
 
+#: src/dird/ua_run.c:650 src/dird/ua_select.c:476 src/dird/ua_select.c:566
+#: src/dird/ua_update.c:400 src/dird/ua_update.c:474
+#: src/wx-console/wxbrestorepanel.cpp:320
+#: src/wx-console/wxbrestorepanel.cpp:506
+#: src/wx-console/wxbrestorepanel.cpp:516
+#: src/wx-console/wxbrestorepanel.cpp:1783
+msgid "Pool"
+msgstr ""
+
 #: src/dird/ua_run.c:652
 msgid "Verify Job"
 msgstr ""
 
-#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:373
-#: src/wx-console/wxbrestorepanel.cpp:1814
+#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:331
+#: src/wx-console/wxbrestorepanel.cpp:1848
 msgid "Bootstrap"
 msgstr ""
 
-#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:374
-#: src/wx-console/wxbrestorepanel.cpp:1055
-#: src/wx-console/wxbrestorepanel.cpp:1816
+#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:332
+#: src/wx-console/wxbrestorepanel.cpp:1072
+#: src/wx-console/wxbrestorepanel.cpp:1850
 msgid "Where"
 msgstr ""
 
-#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:376
-#: src/wx-console/wxbrestorepanel.cpp:1063
-#: src/wx-console/wxbrestorepanel.cpp:1820
-#: src/wx-console/wxbrestorepanel.cpp:1821
-#: src/wx-console/wxbrestorepanel.cpp:1822
-#: src/wx-console/wxbrestorepanel.cpp:1823
-#: src/wx-console/wxbrestorepanel.cpp:1824
+#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:334
+#: src/wx-console/wxbrestorepanel.cpp:1080
+#: src/wx-console/wxbrestorepanel.cpp:1854
+#: src/wx-console/wxbrestorepanel.cpp:1855
+#: src/wx-console/wxbrestorepanel.cpp:1856
+#: src/wx-console/wxbrestorepanel.cpp:1857
+#: src/wx-console/wxbrestorepanel.cpp:1858
 msgid "Replace"
 msgstr ""
 
@@ -3898,7 +4015,7 @@ msgstr ""
 msgid "JobId"
 msgstr ""
 
-#: src/dird/ua_run.c:660 src/dird/ua_update.c:430
+#: src/dird/ua_run.c:660 src/dird/ua_update.c:478
 msgid "Select parameter to modify"
 msgstr ""
 
@@ -3907,27 +4024,27 @@ msgid "Levels:\n"
 msgstr ""
 
 #: src/dird/ua_run.c:665 src/filed/status.c:368 src/lib/util.c:319
-#: src/stored/status.c:406
+#: src/stored/status.c:451
 msgid "Base"
 msgstr ""
 
-#: src/dird/ua_run.c:666 src/dird/ua_update.c:106 src/dird/ua_update.c:438
-#: src/filed/status.c:370 src/lib/util.c:321 src/stored/status.c:408
+#: src/dird/ua_run.c:666 src/filed/status.c:370 src/lib/util.c:321
+#: src/stored/status.c:453
 msgid "Full"
 msgstr ""
 
 #: src/dird/ua_run.c:667 src/filed/status.c:373 src/lib/util.c:324
-#: src/stored/status.c:411
+#: src/stored/status.c:456
 msgid "Incremental"
 msgstr ""
 
 #: src/dird/ua_run.c:668 src/filed/status.c:376 src/lib/util.c:327
-#: src/stored/status.c:414
+#: src/stored/status.c:459
 msgid "Differential"
 msgstr ""
 
 #: src/dird/ua_run.c:669 src/filed/status.c:379 src/lib/util.c:330
-#: src/stored/status.c:417
+#: src/stored/status.c:462
 msgid "Since"
 msgstr ""
 
@@ -3940,7 +4057,7 @@ msgid "Initialize Catalog"
 msgstr ""
 
 #: src/dird/ua_run.c:693 src/filed/status.c:382 src/lib/util.c:333
-#: src/stored/status.c:420
+#: src/stored/status.c:465
 msgid "Verify Catalog"
 msgstr ""
 
@@ -3999,16 +4116,16 @@ msgid ""
 "You must set the bootstrap file to NULL to be able to specify a JobId.\n"
 msgstr ""
 
-#: src/dird/ua_run.c:867
+#: src/dird/ua_run.c:869
 msgid "Job failed.\n"
 msgstr ""
 
-#: src/dird/ua_run.c:870
+#: src/dird/ua_run.c:872
 #, c-format
 msgid "Job started. JobId=%s\n"
 msgstr ""
 
-#: src/dird/ua_run.c:876
+#: src/dird/ua_run.c:878
 msgid "Job not run.\n"
 msgstr ""
 
@@ -4041,199 +4158,204 @@ msgstr ""
 msgid "Select Storage resource"
 msgstr ""
 
-#: src/dird/ua_select.c:189
+#: src/dird/ua_select.c:193
 msgid "catalog"
 msgstr ""
 
-#: src/dird/ua_select.c:197
+#: src/dird/ua_select.c:201
 msgid "The defined Catalog resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:205
+#: src/dird/ua_select.c:209
 msgid "Catalog"
 msgstr ""
 
-#: src/dird/ua_select.c:205
+#: src/dird/ua_select.c:209
 msgid "Select Catalog resource"
 msgstr ""
 
-#: src/dird/ua_select.c:220
+#: src/dird/ua_select.c:226
 msgid "The defined Job resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:228
+#: src/dird/ua_select.c:234
 msgid "Select Job resource"
 msgstr ""
 
-#: src/dird/ua_select.c:241
+#: src/dird/ua_select.c:249
 msgid "The defined Restore Job resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:249
+#: src/dird/ua_select.c:257
 msgid "Select Restore Job"
 msgstr ""
 
-#: src/dird/ua_select.c:264
+#: src/dird/ua_select.c:274
 msgid "The defined Client resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:272
+#: src/dird/ua_select.c:282
 msgid "Select Client (File daemon) resource"
 msgstr ""
 
-#: src/dird/ua_select.c:297
+#: src/dird/ua_select.c:309
 #, c-format
 msgid "Error: Client resource %s does not exist.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:322
+#: src/dird/ua_select.c:334
 #, c-format
 msgid "Could not find Client %s: ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:325 src/lib/bnet_server.c:285
-#: src/lib/bnet_server.c:379
+#: src/dird/ua_select.c:337 src/lib/bnet_server.c:284
+#: src/lib/bnet_server.c:378
 msgid "client"
 msgstr ""
 
-#: src/dird/ua_select.c:326
+#: src/dird/ua_select.c:338
 msgid "fd"
 msgstr ""
 
-#: src/dird/ua_select.c:332 src/dird/ua_select.c:386
+#: src/dird/ua_select.c:344 src/dird/ua_select.c:398
 #, c-format
 msgid "Could not find Client \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:361
+#: src/dird/ua_select.c:373
 #, c-format
 msgid "Error obtaining client ids. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:365
+#: src/dird/ua_select.c:377
 msgid "No clients defined. You must run a job before using this command.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:369
+#: src/dird/ua_select.c:381
 msgid "Defined Clients:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:379
+#: src/dird/ua_select.c:391
 msgid "Select the Client"
 msgstr ""
 
-#: src/dird/ua_select.c:412 src/dird/ua_select.c:435 src/dird/ua_select.c:471
+#: src/dird/ua_select.c:424 src/dird/ua_select.c:447 src/dird/ua_select.c:483
 #, c-format
 msgid "Could not find Pool \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:450
+#: src/dird/ua_select.c:462
 msgid "No pools defined. Use the \"create\" command to create one.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:454
+#: src/dird/ua_select.c:466
 msgid "Defined Pools:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:464
+#: src/dird/ua_select.c:476
 msgid "Select the Pool"
 msgstr ""
 
-#: src/dird/ua_select.c:494
+#: src/dird/ua_select.c:506
 #, c-format
 msgid "No access to Pool \"%s\"\n"
 msgstr ""
 
-#: src/dird/ua_select.c:520
+#: src/dird/ua_select.c:532
 msgid "Enter MediaId or Volume name: "
 msgstr ""
 
-#: src/dird/ua_select.c:546
+#: src/dird/ua_select.c:558
 msgid "The defined Pool resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:554
+#: src/dird/ua_select.c:566
 msgid "Select Pool resource"
 msgstr ""
 
-#: src/dird/ua_select.c:587
+#: src/dird/ua_select.c:601
 msgid "Enter the JobId to select: "
 msgstr ""
 
-#: src/dird/ua_select.c:624
+#: src/dird/ua_select.c:639
 #, c-format
 msgid "Could not find Job \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:687
+#: src/dird/ua_select.c:717
 #, c-format
 msgid "Automatically selected %s: %s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:692
+#: src/dird/ua_select.c:722
 #, c-format
 msgid "Cannot select %s in batch mode.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:708
+#: src/dird/ua_select.c:736
 msgid "Selection is empty!\n"
 msgstr ""
 
-#: src/dird/ua_select.c:714
+#: src/dird/ua_select.c:742
 msgid "Item 1 selected automatically.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:725
+#: src/dird/ua_select.c:753
 msgid "Selection aborted, nothing done.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:730
+#: src/dird/ua_select.c:758
 #, c-format
 msgid "Please enter a number between 1 and %d\n"
 msgstr ""
 
-#: src/dird/ua_select.c:778
+#: src/dird/ua_select.c:807
 msgid "Storage name given twice.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:795
+#: src/dird/ua_select.c:824
 #, c-format
 msgid "Expecting jobid=nn command, got: %s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:799
+#: src/dird/ua_select.c:828
 #, c-format
 msgid "JobId %s is not running.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:808
+#: src/dird/ua_select.c:838
 #, c-format
 msgid "Expecting job=xxx, got: %s.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:812
+#: src/dird/ua_select.c:842 src/dird/ua_select.c:854
 #, c-format
 msgid "Job \"%s\" is not running.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:828
+#: src/dird/ua_select.c:850
+#, c-format
+msgid "Expecting ujobid=xxx, got: %s.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:870
 #, c-format
 msgid "Storage resource \"%s\": not found\n"
 msgstr ""
 
-#: src/dird/ua_select.c:850
+#: src/dird/ua_select.c:902
 msgid "Enter autochanger drive[0]: "
 msgstr ""
 
-#: src/dird/ua_select.c:879
+#: src/dird/ua_select.c:932
 msgid "Media Types defined in conf file:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:885
+#: src/dird/ua_select.c:938
 msgid "Media Type"
 msgstr ""
 
-#: src/dird/ua_select.c:885
+#: src/dird/ua_select.c:938
 msgid "Select the Media Type"
 msgstr ""
 
@@ -4259,24 +4381,24 @@ msgstr ""
 msgid "%s Version: %s (%s) %s %s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:249 src/stored/status.c:70
+#: src/dird/ua_status.c:249 src/stored/status.c:71
 #, c-format
 msgid "Daemon started %s, 1 Job run since started.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:252 src/stored/status.c:73
+#: src/dird/ua_status.c:252 src/stored/status.c:74
 #, c-format
 msgid "Daemon started %s, %d Jobs run since started.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:257 src/filed/status.c:119 src/stored/status.c:77
+#: src/dird/ua_status.c:257 src/filed/status.c:121 src/stored/status.c:78
 #, c-format
 msgid " Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:277 src/dird/ua_status.c:482 src/dird/ua_status.c:644
-#: src/filed/status.c:196 src/filed/status.c:275 src/stored/status.c:317
-#: src/stored/status.c:393
+#: src/dird/ua_status.c:277 src/dird/ua_status.c:502 src/dird/ua_status.c:664
+#: src/filed/status.c:198 src/filed/status.c:277 src/stored/status.c:345
+#: src/stored/status.c:361 src/stored/status.c:438
 msgid "====\n"
 msgstr ""
 
@@ -4314,249 +4436,249 @@ msgstr ""
 msgid "===================================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:399
+#: src/dird/ua_status.c:401
 #, c-format
 msgid "%-14s %-8s %3d  %-18s %-18s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:480
+#: src/dird/ua_status.c:500
 msgid "No Scheduled Jobs.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:497 src/stored/status.c:269
+#: src/dird/ua_status.c:517 src/stored/status.c:277
 msgid ""
 "\n"
 "Running Jobs:\n"
 msgstr ""
 
-#: src/dird/ua_status.c:506
+#: src/dird/ua_status.c:525
 #, c-format
 msgid "Console connected at %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:514
+#: src/dird/ua_status.c:535
 msgid ""
 "No Jobs running.\n"
 "====\n"
 msgstr ""
 
-#: src/dird/ua_status.c:519
+#: src/dird/ua_status.c:540
 msgid " JobId Level   Name                       Status\n"
 msgstr ""
 
-#: src/dird/ua_status.c:520 src/filed/status.c:219 src/stored/status.c:337
+#: src/dird/ua_status.c:541 src/filed/status.c:221 src/stored/status.c:382
 msgid "======================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:529
+#: src/dird/ua_status.c:549
 msgid "is waiting execution"
 msgstr ""
 
-#: src/dird/ua_status.c:532
+#: src/dird/ua_status.c:552
 msgid "is running"
 msgstr ""
 
-#: src/dird/ua_status.c:535
+#: src/dird/ua_status.c:555
 msgid "is blocked"
 msgstr ""
 
-#: src/dird/ua_status.c:538
+#: src/dird/ua_status.c:558
 msgid "has terminated"
 msgstr ""
 
-#: src/dird/ua_status.c:541
+#: src/dird/ua_status.c:561
 msgid "has erred"
 msgstr ""
 
-#: src/dird/ua_status.c:544
+#: src/dird/ua_status.c:564
 msgid "has errors"
 msgstr ""
 
-#: src/dird/ua_status.c:547
+#: src/dird/ua_status.c:567
 msgid "has a fatal error"
 msgstr ""
 
-#: src/dird/ua_status.c:550
+#: src/dird/ua_status.c:570
 msgid "has verify differences"
 msgstr ""
 
-#: src/dird/ua_status.c:553
+#: src/dird/ua_status.c:573
 msgid "has been canceled"
 msgstr ""
 
-#: src/dird/ua_status.c:557
+#: src/dird/ua_status.c:577
 #, c-format
 msgid "is waiting on Client %s"
 msgstr ""
 
-#: src/dird/ua_status.c:563
+#: src/dird/ua_status.c:583
 #, c-format
 msgid "is waiting on Storage %s"
 msgstr ""
 
-#: src/dird/ua_status.c:568
+#: src/dird/ua_status.c:588
 msgid "is waiting on max Storage jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:571
+#: src/dird/ua_status.c:591
 msgid "is waiting on max Client jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:574
+#: src/dird/ua_status.c:594
 msgid "is waiting on max Job jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:577
+#: src/dird/ua_status.c:597
 msgid "is waiting on max total jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:580
+#: src/dird/ua_status.c:600
 msgid "is waiting for its start time"
 msgstr ""
 
-#: src/dird/ua_status.c:583
+#: src/dird/ua_status.c:603
 msgid "is waiting for higher priority jobs to finish"
 msgstr ""
 
-#: src/dird/ua_status.c:588
+#: src/dird/ua_status.c:608
 #, c-format
 msgid "is in unknown state %c"
 msgstr ""
 
-#: src/dird/ua_status.c:602
+#: src/dird/ua_status.c:622
 msgid "is waiting for a mount request"
 msgstr ""
 
-#: src/dird/ua_status.c:609
+#: src/dird/ua_status.c:629
 msgid "is waiting for an appendable Volume"
 msgstr ""
 
-#: src/dird/ua_status.c:616
+#: src/dird/ua_status.c:636
 #, c-format
 msgid "is waiting for Client %s to connect to Storage %s"
 msgstr ""
 
-#: src/dird/ua_status.c:632
+#: src/dird/ua_status.c:652
 #, c-format
 msgid "%6d %-6s  %-20s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:654 src/filed/status.c:209 src/stored/status.c:328
+#: src/dird/ua_status.c:674 src/filed/status.c:211 src/stored/status.c:373
 msgid "No Terminated Jobs.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:659 src/stored/status.c:333
+#: src/dird/ua_status.c:679 src/stored/status.c:378
 msgid ""
 "\n"
 "Terminated Jobs:\n"
 msgstr ""
 
-#: src/dird/ua_status.c:660
+#: src/dird/ua_status.c:680
 msgid " JobId  Level     Files      Bytes     Status   Finished        Name \n"
 msgstr ""
 
-#: src/dird/ua_status.c:661
+#: src/dird/ua_status.c:681
 msgid "========================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:692 src/filed/status.c:239 src/lib/util.c:184
-#: src/stored/status.c:357
+#: src/dird/ua_status.c:712 src/filed/status.c:241 src/lib/util.c:178
+#: src/stored/status.c:402
 msgid "Created"
 msgstr ""
 
-#: src/dird/ua_status.c:696 src/filed/status.c:243 src/lib/util.c:197
-#: src/lib/util.c:264 src/stored/status.c:361
+#: src/dird/ua_status.c:716 src/filed/status.c:245 src/lib/util.c:191
+#: src/lib/util.c:258 src/stored/status.c:406
 msgid "Error"
 msgstr ""
 
-#: src/dird/ua_status.c:699 src/filed/status.c:246 src/stored/status.c:364
+#: src/dird/ua_status.c:719 src/filed/status.c:248 src/stored/status.c:409
 msgid "Diffs"
 msgstr ""
 
-#: src/dird/ua_status.c:705 src/filed/status.c:252 src/lib/util.c:193
-#: src/lib/util.c:260 src/stored/btape.c:1160 src/stored/status.c:370
+#: src/dird/ua_status.c:725 src/filed/status.c:254 src/lib/util.c:187
+#: src/lib/util.c:254 src/stored/btape.c:1158 src/stored/status.c:415
 #: src/wx-console/wxbconfigpanel.cpp:180
 msgid "OK"
 msgstr ""
 
-#: src/dird/ua_status.c:708 src/filed/status.c:255 src/stored/status.c:373
+#: src/dird/ua_status.c:728 src/filed/status.c:257 src/stored/status.c:418
 msgid "Other"
 msgstr ""
 
-#: src/dird/ua_status.c:711 src/filed/status.c:266 src/stored/status.c:384
+#: src/dird/ua_status.c:731 src/filed/status.c:268 src/stored/status.c:429
 #, c-format
 msgid "%6d  %-6s %8s %14s %-7s  %-8s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:719 src/stored/btape.c:180
+#: src/dird/ua_status.c:739 src/stored/btape.c:180
 msgid "\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:57
+#: src/dird/ua_tree.c:58
 msgid "change current directory"
 msgstr ""
 
-#: src/dird/ua_tree.c:58
+#: src/dird/ua_tree.c:59
 msgid "count marked files in and below the cd"
 msgstr ""
 
-#: src/dird/ua_tree.c:59
+#: src/dird/ua_tree.c:60 src/dird/ua_tree.c:61
 msgid "long list current directory, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:60
+#: src/dird/ua_tree.c:62
 msgid "leave file selection mode"
 msgstr ""
 
-#: src/dird/ua_tree.c:61
+#: src/dird/ua_tree.c:63
 msgid "estimate restore size"
 msgstr ""
 
-#: src/dird/ua_tree.c:62
+#: src/dird/ua_tree.c:64
 msgid "same as done command"
 msgstr ""
 
-#: src/dird/ua_tree.c:63
+#: src/dird/ua_tree.c:65
 msgid "find files, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:64 src/dird/ua_tree.c:73
+#: src/dird/ua_tree.c:66 src/dird/ua_tree.c:75
 msgid "print help"
 msgstr ""
 
-#: src/dird/ua_tree.c:65
+#: src/dird/ua_tree.c:67
 msgid "list current directory, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:66
+#: src/dird/ua_tree.c:68
 msgid "list the marked files in and below the cd"
 msgstr ""
 
-#: src/dird/ua_tree.c:67
-msgid "mark dir/file to be restored recursively in dirs"
+#: src/dird/ua_tree.c:69
+msgid "mark dir/file to be restored recursively, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:68
+#: src/dird/ua_tree.c:70
 msgid "mark directory name to be restored (no files)"
 msgstr ""
 
-#: src/dird/ua_tree.c:69
+#: src/dird/ua_tree.c:71
 msgid "print current working directory"
 msgstr ""
 
-#: src/dird/ua_tree.c:70
+#: src/dird/ua_tree.c:72
 msgid "unmark dir/file to be restored recursively in dir"
 msgstr ""
 
-#: src/dird/ua_tree.c:71
+#: src/dird/ua_tree.c:73
 msgid "unmark directory name only no recursion"
 msgstr ""
 
-#: src/dird/ua_tree.c:72
+#: src/dird/ua_tree.c:74
 msgid "quit and do not do restore"
 msgstr ""
 
-#: src/dird/ua_tree.c:92
+#: src/dird/ua_tree.c:94
 msgid ""
 "\n"
 "You are now entering file selection mode where you add (mark) and\n"
@@ -4566,705 +4688,657 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:102 src/dird/ua_tree.c:633 src/dird/ua_tree.c:641
+#: src/dird/ua_tree.c:104 src/dird/ua_tree.c:671 src/dird/ua_tree.c:679
 #, c-format
 msgid "cwd is: %s\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:123
+#: src/dird/ua_tree.c:125
 msgid "Illegal command. Enter \"done\" to exit.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:296 src/dird/ua_tree.c:307 src/dird/ua_tree.c:324
+#: src/dird/ua_tree.c:298 src/dird/ua_tree.c:309 src/dird/ua_tree.c:326
 msgid "No files marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:309
+#: src/dird/ua_tree.c:311
 msgid "1 file marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:311
+#: src/dird/ua_tree.c:313
 #, c-format
 msgid "%s files marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:338
+#: src/dird/ua_tree.c:340
 msgid "No directories marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:340
+#: src/dird/ua_tree.c:342
 msgid "1 directory marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:342
+#: src/dird/ua_tree.c:344
 #, c-format
 msgid "%s directories marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:363
+#: src/dird/ua_tree.c:365
 #, c-format
 msgid "%s total files/dirs. %s marked to be restored.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:374
+#: src/dird/ua_tree.c:376
 msgid "No file specification given.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:502
+#: src/dird/ua_tree.c:527
 #, c-format
 msgid "Node %s has no children.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:583
+#: src/dird/ua_tree.c:618
 #, c-format
 msgid "%d total files; %d marked to be restored; %s bytes.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:625
+#: src/dird/ua_tree.c:663
 msgid "Invalid path given.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:652 src/dird/ua_tree.c:663
+#: src/dird/ua_tree.c:690 src/dird/ua_tree.c:701
 msgid "No files unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:665
+#: src/dird/ua_tree.c:703
 msgid "1 file unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:667
+#: src/dird/ua_tree.c:705
 #, c-format
 msgid "%d files unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:678 src/dird/ua_tree.c:694
+#: src/dird/ua_tree.c:716 src/dird/ua_tree.c:732
 msgid "No directories unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:696
+#: src/dird/ua_tree.c:734
 msgid "1 directory unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:698
+#: src/dird/ua_tree.c:736
 #, c-format
 msgid "%d directories unmarked.\n"
 msgstr ""
 
-#: src/dird/verify.c:87
-msgid ""
-"Unable to find JobId of previous InitCatalog Job.\n"
-"Please run a Verify with Level=InitCatalog before\n"
-"running the current Job.\n"
+#: src/dird/ua_update.c:79
+msgid "Update choice:\n"
 msgstr ""
 
-#: src/dird/verify.c:108
-#, c-format
-msgid "Could not get job record for previous Job. ERR=%s"
+#: src/dird/ua_update.c:80
+msgid "Volume parameters"
 msgstr ""
 
-#: src/dird/verify.c:113
-#, c-format
-msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
+#: src/dird/ua_update.c:81
+msgid "Pool from resource"
 msgstr ""
 
-#: src/dird/verify.c:117
-#, c-format
-msgid "Verifying against JobId=%d Job=%s\n"
+#: src/dird/ua_update.c:82
+msgid "Slots from autochanger"
 msgstr ""
 
-#: src/dird/verify.c:183
-#, c-format
-msgid "Start Verify JobId=%d Level=%s Job=%s\n"
+#: src/dird/ua_update.c:83
+msgid "item"
 msgstr ""
 
-#: src/dird/verify.c:262
-msgid "Deprecated feature ... use bootstrap.\n"
+#: src/dird/ua_update.c:83
+msgid "Choose catalog item to update"
 msgstr ""
 
-#: src/dird/verify.c:275
+#: src/dird/ua_update.c:122
 #, c-format
-msgid "Unimplemented Verify level %d(%c)\n"
+msgid "Invalid VolStatus specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:327
+#: src/dird/ua_update.c:131
 #, c-format
-msgid "Unimplemented verify level %d\n"
+msgid "New Volume status is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:382
-msgid "Verify OK"
+#: src/dird/ua_update.c:141
+#, c-format
+msgid "Invalid retention period specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:386
-msgid "*** Verify Error ***"
+#: src/dird/ua_update.c:149
+#, c-format
+msgid "New retention period is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:390
-msgid "Verify warnings"
+#: src/dird/ua_update.c:160
+#, c-format
+msgid "Invalid use duration specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:393
-msgid "Verify Canceled"
+#: src/dird/ua_update.c:168
+#, c-format
+msgid "New use duration is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:396
-msgid "Verify Differences"
+#: src/dird/ua_update.c:182
+#, c-format
+msgid "New max jobs is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:401
+#: src/dird/ua_update.c:195
 #, c-format
-msgid "Inappropriate term code: %d %c\n"
+msgid "New max files is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:415
+#: src/dird/ua_update.c:206
 #, c-format
-msgid ""
-"Bacula %s (%s): %s\n"
-"  JobId:                  %d\n"
-"  Job:                    %s\n"
-"  FileSet:                %s\n"
-"  Verify Level:           %s\n"
-"  Client:                 %s\n"
-"  Verify JobId:           %d\n"
-"  Verify Job:             %s\n"
-"  Start time:             %s\n"
-"  End time:               %s\n"
-"  Files Expected:         %s\n"
-"  Files Examined:         %s\n"
-"  Non-fatal FD errors:    %d\n"
-"  FD termination status:  %s\n"
-"  SD termination status:  %s\n"
-"  Termination:            %s\n"
-"\n"
+msgid "Invalid max. bytes specification: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:450
+#: src/dird/ua_update.c:214
 #, c-format
-msgid ""
-"Bacula %s (%s): %s\n"
-"  JobId:                  %d\n"
-"  Job:                    %s\n"
-"  FileSet:                %s\n"
-"  Verify Level:           %s\n"
-"  Client:                 %s\n"
-"  Verify JobId:           %d\n"
-"  Verify Job:             %s\n"
-"  Start time:             %s\n"
-"  End time:               %s\n"
-"  Files Examined:         %s\n"
-"  Non-fatal FD errors:    %d\n"
-"  FD termination status:  %s\n"
-"  Termination:            %s\n"
-"\n"
+msgid "New Max bytes is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:526
-#, c-format
-msgid ""
-"bird<filed: bad attributes, expected 3 fields got %d\n"
-" mslen=%d msg=%s\n"
+#: src/dird/ua_update.c:228 src/dird/ua_update.c:252
+msgid "Invalid value. It must be yes or no.\n"
 msgstr ""
 
-#: src/dird/verify.c:570
+#: src/dird/ua_update.c:236
 #, c-format
-msgid "New file: %s\n"
+msgid "New Recycle flag is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:571
+#: src/dird/ua_update.c:260
 #, c-format
-msgid "File not in catalog: %s\n"
+msgid "New InChanger flag is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:595
+#: src/dird/ua_update.c:278
 #, c-format
-msgid "      st_ino   differ. Cat: %s File: %s\n"
+msgid "Invalid slot, it must be between 0 and MaxVols=%d\n"
 msgstr ""
 
-#: src/dird/verify.c:604
+#: src/dird/ua_update.c:287 src/dird/ua_update.c:578
 #, c-format
-msgid "      st_mode  differ. Cat: %x File: %x\n"
+msgid "Error updating media record Slot: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:612
+#: src/dird/ua_update.c:289
 #, c-format
-msgid "      st_nlink differ. Cat: %d File: %d\n"
+msgid "New Slot is: %d\n"
 msgstr ""
 
-#: src/dird/verify.c:620
+#: src/dird/ua_update.c:316
 #, c-format
-msgid "      st_uid   differ. Cat: %u File: %u\n"
+msgid "New Pool is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:628
+#: src/dird/ua_update.c:345
 #, c-format
-msgid "      st_gid   differ. Cat: %u File: %u\n"
+msgid "Error updating Volume record: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:636
+#: src/dird/ua_update.c:347
 #, c-format
-msgid "      st_size  differ. Cat: %s File: %s\n"
+msgid "Volume defaults updated from \"%s\" Pool record.\n"
 msgstr ""
 
-#: src/dird/verify.c:645
-msgid "      st_atime differs\n"
+#: src/dird/ua_update.c:369
+#, c-format
+msgid "Error updating Volume records: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:652
-msgid "      st_mtime differs\n"
+#: src/dird/ua_update.c:371
+msgid "All Volume defaults updated from Pool record.\n"
 msgstr ""
 
-#: src/dird/verify.c:659
-msgid "      st_ctime differs\n"
+#: src/dird/ua_update.c:391
+msgid "VolStatus"
 msgstr ""
 
-#: src/dird/verify.c:666
-#, c-format
-msgid "      st_size  decrease. Cat: %s File: %s\n"
+#: src/dird/ua_update.c:392
+msgid "VolRetention"
 msgstr ""
 
-#: src/dird/verify.c:705
-#, c-format
-msgid "      %s not same. File=%s Cat=%s\n"
+#: src/dird/ua_update.c:393
+msgid "VolUse"
 msgstr ""
 
-#: src/dird/verify.c:708
-#, c-format
-msgid "      %s differs.\n"
+#: src/dird/ua_update.c:394
+msgid "MaxVolJobs"
 msgstr ""
 
-#: src/dird/verify.c:720
-#, c-format
-msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
+#: src/dird/ua_update.c:395
+msgid "MaxVolFiles"
 msgstr ""
 
-#: src/dird/verify.c:757
-msgid "The following files are missing:\n"
+#: src/dird/ua_update.c:396
+msgid "MaxVolBytes"
 msgstr ""
 
-#: src/dird/verify.c:771 src/tools/testfind.c:338
-#, c-format
-msgid "File: %s\n"
+#: src/dird/ua_update.c:397
+msgid "Recycle"
 msgstr ""
 
-#: src/dird/ua_update.c:79
-msgid "Update choice:\n"
+#: src/dird/ua_update.c:398
+msgid "InChanger"
 msgstr ""
 
-#: src/dird/ua_update.c:80
-msgid "Volume parameters"
+#: src/dird/ua_update.c:399 src/dird/ua_update.c:471
+msgid "Slot"
 msgstr ""
 
-#: src/dird/ua_update.c:81
-msgid "Pool from resource"
+#: src/dird/ua_update.c:401
+msgid "FromPool"
 msgstr ""
 
-#: src/dird/ua_update.c:82
-msgid "Slots from autochanger"
+#: src/dird/ua_update.c:402
+msgid "AllFromPool"
 msgstr ""
 
-#: src/dird/ua_update.c:83
-msgid "item"
+#: src/dird/ua_update.c:464
+msgid "Volume Status"
 msgstr ""
 
-#: src/dird/ua_update.c:83
-msgid "Choose catalog item to update"
+#: src/dird/ua_update.c:465
+msgid "Volume Retention Period"
 msgstr ""
 
-#: src/dird/ua_update.c:103 src/dird/ua_update.c:435
-msgid "Append"
+#: src/dird/ua_update.c:466
+msgid "Volume Use Duration"
 msgstr ""
 
-#: src/dird/ua_update.c:104 src/dird/ua_update.c:436
-msgid "Archive"
+#: src/dird/ua_update.c:467
+msgid "Maximum Volume Jobs"
 msgstr ""
 
-#: src/dird/ua_update.c:105 src/dird/ua_update.c:437
-msgid "Disabled"
+#: src/dird/ua_update.c:468
+msgid "Maximum Volume Files"
 msgstr ""
 
-#: src/dird/ua_update.c:107 src/dird/ua_update.c:439
-msgid "Used"
+#: src/dird/ua_update.c:469
+msgid "Maximum Volume Bytes"
 msgstr ""
 
-#: src/dird/ua_update.c:108 src/dird/ua_update.c:440
-msgid "Cleaning"
+#: src/dird/ua_update.c:470
+msgid "Recycle Flag"
 msgstr ""
 
-#: src/dird/ua_update.c:109 src/dird/ua_update.c:355 src/dird/ua_update.c:442
-msgid "Recycle"
+#: src/dird/ua_update.c:472
+msgid "InChanger Flag"
 msgstr ""
 
-#: src/dird/ua_update.c:110 src/dird/ua_update.c:444
-msgid "Read-Only"
+#: src/dird/ua_update.c:473
+msgid "Volume Files"
 msgstr ""
 
-#: src/dird/ua_update.c:122
-#, c-format
-msgid "Invalid VolStatus specified: %s\n"
+#: src/dird/ua_update.c:475
+msgid "Volume from Pool"
 msgstr ""
 
-#: src/dird/ua_update.c:131
-#, c-format
-msgid "New Volume status is: %s\n"
+#: src/dird/ua_update.c:476
+msgid "All Volumes from Pool"
 msgstr ""
 
-#: src/dird/ua_update.c:142
-#, c-format
-msgid "Invalid retention period specified: %s\n"
+#: src/dird/ua_update.c:477
+msgid "Done"
 msgstr ""
 
-#: src/dird/ua_update.c:151
+#: src/dird/ua_update.c:485
 #, c-format
-msgid "New retention period is: %s\n"
+msgid "Updating Volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:163
+#: src/dird/ua_update.c:490
 #, c-format
-msgid "Invalid use duration specified: %s\n"
+msgid "Current Volume status is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:172
-#, c-format
-msgid "New use duration is: %s\n"
+#: src/dird/ua_update.c:491
+msgid "Possible Values are:\n"
 msgstr ""
 
-#: src/dird/ua_update.c:187
-#, c-format
-msgid "New max jobs is: %s\n"
+#: src/dird/ua_update.c:502
+msgid "Choose new Volume Status"
 msgstr ""
 
-#: src/dird/ua_update.c:201
+#: src/dird/ua_update.c:508
 #, c-format
-msgid "New max files is: %s\n"
+msgid "Current retention period is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:213
-#, c-format
-msgid "Invalid max. bytes specification: %s\n"
+#: src/dird/ua_update.c:510
+msgid "Enter Volume Retention period: "
 msgstr ""
 
-#: src/dird/ua_update.c:222
+#: src/dird/ua_update.c:517
 #, c-format
-msgid "New Max bytes is: %s\n"
+msgid "Current use duration is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:237
-msgid "Invalid value. It must by yes or no.\n"
+#: src/dird/ua_update.c:519
+msgid "Enter Volume Use Duration: "
 msgstr ""
 
-#: src/dird/ua_update.c:246
+#: src/dird/ua_update.c:526
 #, c-format
-msgid "New Recycle flag is: %s\n"
+msgid "Current max jobs is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:275
-#, c-format
-msgid "New Pool is: %s\n"
+#: src/dird/ua_update.c:527
+msgid "Enter new Maximum Jobs: "
 msgstr ""
 
-#: src/dird/ua_update.c:304
+#: src/dird/ua_update.c:534
 #, c-format
-msgid "Error updating Volume record: ERR=%s"
+msgid "Current max files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:306
-#, c-format
-msgid "Volume defaults updated from \"%s\" Pool record.\n"
+#: src/dird/ua_update.c:535
+msgid "Enter new Maximum Files: "
 msgstr ""
 
-#: src/dird/ua_update.c:328
+#: src/dird/ua_update.c:542
 #, c-format
-msgid "Error updating Volume records: ERR=%s"
-msgstr ""
-
-#: src/dird/ua_update.c:330
-msgid "All Volume defaults updated from Pool record.\n"
-msgstr ""
-
-#: src/dird/ua_update.c:349
-msgid "VolStatus"
-msgstr ""
-
-#: src/dird/ua_update.c:350
-msgid "VolRetention"
-msgstr ""
-
-#: src/dird/ua_update.c:351
-msgid "VolUse"
-msgstr ""
-
-#: src/dird/ua_update.c:352
-msgid "MaxVolJobs"
-msgstr ""
-
-#: src/dird/ua_update.c:353
-msgid "MaxVolFiles"
+msgid "Current value is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:354
-msgid "MaxVolBytes"
+#: src/dird/ua_update.c:543
+msgid "Enter new Maximum Bytes: "
 msgstr ""
 
-#: src/dird/ua_update.c:357
-msgid "FromPool"
+#: src/dird/ua_update.c:551
+#, c-format
+msgid "Current recycle flag is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:358
-msgid "AllFromPool"
+#: src/dird/ua_update.c:553
+msgid "Enter new Recycle status: "
 msgstr ""
 
-#: src/dird/ua_update.c:414
+#: src/dird/ua_update.c:560
 #, c-format
-msgid "Updating Volume \"%s\"\n"
+msgid "Current Slot is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:416
-msgid "Volume Status"
+#: src/dird/ua_update.c:561
+msgid "Enter new Slot: "
 msgstr ""
 
-#: src/dird/ua_update.c:417
-msgid "Volume Retention Period"
+#: src/dird/ua_update.c:568
+#, c-format
+msgid "Current InChanger flag is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:418
-msgid "Volume Use Duration"
+#: src/dird/ua_update.c:569
+msgid "Set InChanger flag? yes/no: "
 msgstr ""
 
-#: src/dird/ua_update.c:419
-msgid "Maximum Volume Jobs"
+#: src/dird/ua_update.c:580
+#, c-format
+msgid "New InChanger flag is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:420
-msgid "Maximum Volume Files"
+#: src/dird/ua_update.c:587
+msgid ""
+"Warning changing Volume Files can result\n"
+"in loss of data on your Volume\n"
+"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:421
-msgid "Maximum Volume Bytes"
+#: src/dird/ua_update.c:589
+#, c-format
+msgid "Current Volume Files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:422
-msgid "Recycle Flag"
+#: src/dird/ua_update.c:590
+msgid "Enter new number of Files for Volume: "
 msgstr ""
 
-#: src/dird/ua_update.c:423
-msgid "Slot"
+#: src/dird/ua_update.c:595
+msgid "Normally, you should only increase Volume Files by one!\n"
 msgstr ""
 
-#: src/dird/ua_update.c:424
-msgid "InChanger Flag"
+#: src/dird/ua_update.c:596
+msgid "Continue? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_update.c:425
-msgid "Volume Files"
+#: src/dird/ua_update.c:606
+#, c-format
+msgid "New Volume Files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:427
-msgid "Volume from Pool"
+#: src/dird/ua_update.c:618
+#, c-format
+msgid "Current Pool is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:428
-msgid "All Volumes from Pool"
+#: src/dird/ua_update.c:619
+msgid "Enter new Pool name: "
 msgstr ""
 
-#: src/dird/ua_update.c:429
-msgid "Done"
+#: src/dird/ua_update.c:632
+msgid "Selection terminated.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:433
+#: src/dird/ua_update.c:665
 #, c-format
-msgid "Current Volume status is: %s\n"
+msgid "db_update_pool_record returned %d. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:434
-msgid "Possible Values are:\n"
+#: src/dird/ua_update.c:672
+msgid "Pool DB record updated from resource.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:441
-msgid "Purged"
+#: src/dird/verify.c:87
+msgid ""
+"Unable to find JobId of previous InitCatalog Job.\n"
+"Please run a Verify with Level=InitCatalog before\n"
+"running the current Job.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:445
-msgid "Choose new Volume Status"
+#: src/dird/verify.c:117
+#, c-format
+msgid "Verifying against JobId=%d Job=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:451
+#: src/dird/verify.c:180
 #, c-format
-msgid "Current retention period is: %s\n"
+msgid "Start Verify JobId=%s Level=%s Job=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:453
-msgid "Enter Volume Retention period: "
+#: src/dird/verify.c:263
+msgid "Deprecated feature ... use bootstrap.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:460
+#: src/dird/verify.c:276
 #, c-format
-msgid "Current use duration is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:462
-msgid "Enter Volume Use Duration: "
+msgid "Unimplemented Verify level %d(%c)\n"
 msgstr ""
 
-#: src/dird/ua_update.c:469
+#: src/dird/verify.c:328
 #, c-format
-msgid "Current max jobs is: %u\n"
+msgid "Unimplemented verify level %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:470
-msgid "Enter new Maximum Jobs: "
+#: src/dird/verify.c:383
+msgid "Verify OK"
 msgstr ""
 
-#: src/dird/ua_update.c:477
-#, c-format
-msgid "Current max files is: %u\n"
+#: src/dird/verify.c:387
+msgid "*** Verify Error ***"
 msgstr ""
 
-#: src/dird/ua_update.c:478
-msgid "Enter new Maximum Files: "
+#: src/dird/verify.c:391
+msgid "Verify warnings"
 msgstr ""
 
-#: src/dird/ua_update.c:485
-#, c-format
-msgid "Current value is: %s\n"
+#: src/dird/verify.c:394
+msgid "Verify Canceled"
 msgstr ""
 
-#: src/dird/ua_update.c:486
-msgid "Enter new Maximum Bytes: "
+#: src/dird/verify.c:397
+msgid "Verify Differences"
 msgstr ""
 
-#: src/dird/ua_update.c:494
+#: src/dird/verify.c:402
 #, c-format
-msgid "Current recycle flag is: %s\n"
+msgid "Inappropriate term code: %d %c\n"
 msgstr ""
 
-#: src/dird/ua_update.c:496
-msgid "Enter new Recycle status: "
+#: src/dird/verify.c:416
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Expected:         %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:511
+#: src/dird/verify.c:451
 #, c-format
-msgid "Current Slot is: %d\n"
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:512
-msgid "Enter new Slot: "
+#: src/dird/verify.c:527
+#, c-format
+msgid ""
+"bird<filed: bad attributes, expected 3 fields got %d\n"
+" mslen=%d msg=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:517
+#: src/dird/verify.c:571
 #, c-format
-msgid "Invalid slot, it must be between 0 and %d\n"
+msgid "New file: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:527 src/dird/ua_update.c:544
+#: src/dird/verify.c:572
 #, c-format
-msgid "Error updating media record Slot: ERR=%s"
+msgid "File not in catalog: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:529
+#: src/dird/verify.c:596
 #, c-format
-msgid "New Slot is: %d\n"
+msgid "      st_ino   differ. Cat: %s File: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:534
+#: src/dird/verify.c:605
 #, c-format
-msgid "Current InChanger flag is: %d\n"
+msgid "      st_mode  differ. Cat: %x File: %x\n"
 msgstr ""
 
-#: src/dird/ua_update.c:535
-msgid "Set InChanger flag? yes/no: "
+#: src/dird/verify.c:613
+#, c-format
+msgid "      st_nlink differ. Cat: %d File: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:546
+#: src/dird/verify.c:621
 #, c-format
-msgid "New InChanger flag is: %d\n"
+msgid "      st_uid   differ. Cat: %u File: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:553
-msgid ""
-"Warning changing Volume Files can result\n"
-"in loss of data on your Volume\n"
-"\n"
+#: src/dird/verify.c:629
+#, c-format
+msgid "      st_gid   differ. Cat: %u File: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:555
+#: src/dird/verify.c:637
 #, c-format
-msgid "Current Volume Files is: %u\n"
+msgid "      st_size  differ. Cat: %s File: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:556
-msgid "Enter new number of Files for Volume: "
+#: src/dird/verify.c:646
+msgid "      st_atime differs\n"
 msgstr ""
 
-#: src/dird/ua_update.c:561
-msgid "Normally, you should only increase Volume Files by one!\n"
+#: src/dird/verify.c:653
+msgid "      st_mtime differs\n"
 msgstr ""
 
-#: src/dird/ua_update.c:562
-msgid "Continue? (yes/no): "
+#: src/dird/verify.c:660
+msgid "      st_ctime differs\n"
 msgstr ""
 
-#: src/dird/ua_update.c:572
+#: src/dird/verify.c:667
 #, c-format
-msgid "New Volume Files is: %u\n"
+msgid "      st_size  decrease. Cat: %s File: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:584
+#: src/dird/verify.c:706
 #, c-format
-msgid "Current Pool is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:585
-msgid "Enter new Pool name: "
-msgstr ""
-
-#: src/dird/ua_update.c:598
-msgid "Selection done.\n"
+msgid "      %s not same. File=%s Cat=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:631
+#: src/dird/verify.c:709
 #, c-format
-msgid "db_update_pool_record returned %d. ERR=%s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:638
-msgid "Pool DB record updated from resource.\n"
+msgid "      %s differs.\n"
 msgstr ""
 
-#: src/dird/pythondir.c:105 src/filed/pythonfd.c:102 src/filed/pythonfd.c:156
-#: src/filed/pythonfd.c:220 src/stored/pythonsd.c:95 src/stored/pythonsd.c:160
-msgid "Job pointer not found."
+#: src/dird/verify.c:721
+#, c-format
+msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
 msgstr ""
 
-#: src/dird/pythondir.c:137
-msgid "Pool record not found."
+#: src/dird/verify.c:758
+msgid "The following files are missing:\n"
 msgstr ""
 
-#: src/dird/pythondir.c:166 src/filed/pythonfd.c:133 src/stored/pythonsd.c:137
+#: src/dird/verify.c:772 src/tools/testfind.c:338
 #, c-format
-msgid "Attribute %s not found."
-msgstr ""
-
-#: src/dird/pythondir.c:209 src/dird/pythondir.c:215 src/filed/pythonfd.c:175
-#: src/stored/pythonsd.c:177
-msgid "Read-only attribute"
+msgid "File: %s\n"
 msgstr ""
 
-#: src/filed/authenticate.c:50
+#: src/filed/authenticate.c:45
 #, c-format
 msgid "I only authenticate directors, not %d\n"
 msgstr ""
 
-#: src/filed/authenticate.c:56 src/stored/authenticate.c:59
+#: src/filed/authenticate.c:51 src/stored/authenticate.c:59
 #, c-format
 msgid "Bad Hello command from Director at %s. Len=%d.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:68 src/stored/authenticate.c:70
+#: src/filed/authenticate.c:63 src/stored/authenticate.c:70
 #, c-format
 msgid "Bad Hello command from Director at %s: %s\n"
 msgstr ""
 
-#: src/filed/authenticate.c:82 src/stored/authenticate.c:85
+#: src/filed/authenticate.c:77 src/stored/authenticate.c:85
 #, c-format
 msgid ""
 "Connection from unknown Director %s at %s rejected.\n"
@@ -5272,7 +5346,7 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:115
+#: src/filed/authenticate.c:110
 #, c-format
 msgid ""
 "Incorrect password given by Director at %s.\n"
@@ -5280,11 +5354,11 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:169 src/stored/dircmd.c:184
+#: src/filed/authenticate.c:164 src/stored/dircmd.c:184
 msgid "Unable to authenticate Director\n"
 msgstr ""
 
-#: src/filed/authenticate.c:213
+#: src/filed/authenticate.c:208
 msgid ""
 "Authorization key rejected by Storage daemon.\n"
 "Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
@@ -5345,48 +5419,48 @@ msgstr ""
 msgid "     Unknown file type %d; not saved: %s\n"
 msgstr ""
 
-#: src/filed/backup.c:243
+#: src/filed/backup.c:240
 #, c-format
 msgid "Python reader program \"%s\" not found.\n"
 msgstr ""
 
-#: src/filed/backup.c:268 src/filed/verify.c:214
+#: src/filed/backup.c:269 src/filed/verify.c:214
 #, c-format
 msgid "     Cannot open %s: ERR=%s.\n"
 msgstr ""
 
-#: src/filed/backup.c:297 src/filed/verify.c:229
+#: src/filed/backup.c:298 src/filed/verify.c:229
 #, c-format
 msgid "     Cannot open resource fork for %s: ERR=%s.\n"
 msgstr ""
 
-#: src/filed/backup.c:348
+#: src/filed/backup.c:349
 #, c-format
 msgid "Unknown signature type %i.\n"
 msgstr ""
 
-#: src/filed/backup.c:410 src/filed/backup.c:493 src/filed/backup.c:519
-#: src/filed/backup.c:548 src/filed/backup.c:561 src/filed/backup.c:569
-#: src/filed/backup.c:610 src/filed/backup.c:644
+#: src/filed/backup.c:414 src/filed/backup.c:499 src/filed/backup.c:525
+#: src/filed/backup.c:557 src/filed/backup.c:570 src/filed/backup.c:578
+#: src/filed/backup.c:619 src/filed/backup.c:653
 #, c-format
 msgid "Network send error to SD. ERR=%s\n"
 msgstr ""
 
-#: src/filed/backup.c:473
+#: src/filed/backup.c:479
 #, c-format
 msgid "Compression error: %d\n"
 msgstr ""
 
-#: src/filed/backup.c:510
+#: src/filed/backup.c:516
 #, c-format
 msgid "Read error on file %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/backup.c:513
+#: src/filed/backup.c:519
 msgid "Too many errors.\n"
 msgstr ""
 
-#: src/filed/backup.c:539
+#: src/filed/backup.c:548
 #, c-format
 msgid "Error reading ACL of %s\n"
 msgstr ""
@@ -5436,224 +5510,239 @@ msgstr ""
 msgid "No Director resource defined in %s\n"
 msgstr ""
 
-#: src/filed/job.c:323
+#: src/filed/job.c:324
 #, c-format
 msgid "2901 Job %s not found.\n"
 msgstr ""
 
-#: src/filed/job.c:339
+#: src/filed/job.c:333
 #, c-format
 msgid "2001 Job %s marked to be canceled.\n"
 msgstr ""
 
-#: src/filed/job.c:342
+#: src/filed/job.c:336
 msgid "2902 Error scanning cancel command.\n"
 msgstr ""
 
-#: src/filed/job.c:361
+#: src/filed/job.c:355
 #, c-format
 msgid "2991 Bad setdebug command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:377
+#: src/filed/job.c:371
 #, c-format
 msgid "Bad estimate command: %s"
 msgstr ""
 
-#: src/filed/job.c:378
+#: src/filed/job.c:372
 msgid "2992 Bad estimate command.\n"
 msgstr ""
 
-#: src/filed/job.c:401
+#: src/filed/job.c:395
 #, c-format
 msgid "Bad Job Command: %s"
 msgstr ""
 
-#: src/filed/job.c:421
+#: src/filed/job.c:415
 #, c-format
 msgid "Bad RunBeforeJob command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:422 src/filed/job.c:435
+#: src/filed/job.c:416 src/filed/job.c:429
 msgid "2905 Bad RunBeforeJob command.\n"
 msgstr ""
 
-#: src/filed/job.c:448
+#: src/filed/job.c:442
 #, c-format
 msgid "Bad RunAfter command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:449
+#: src/filed/job.c:443
 msgid "2905 Bad RunAfterJob command.\n"
 msgstr ""
 
-#: src/filed/job.c:475
+#: src/filed/job.c:469
 #, c-format
 msgid "%s could not execute. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:484
+#: src/filed/job.c:478
 #, c-format
 msgid "%s: %s\n"
 msgstr ""
 
-#: src/filed/job.c:489
+#: src/filed/job.c:483
 #, c-format
 msgid "%s returned non-zero status=%d. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:574
+#: src/filed/job.c:568
 #, c-format
 msgid "Error running program: %s. RtnStat=%d ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:584
+#: src/filed/job.c:578
 #, c-format
 msgid "Cannot open FileSet input file: %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:678
+#: src/filed/job.c:672
 #, c-format
 msgid "REGEX %s compile error. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:732
+#: src/filed/job.c:726
 #, c-format
 msgid "Invalid FileSet command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:901 src/findlib/match.c:184
+#: src/filed/job.c:895 src/findlib/match.c:184
 #, c-format
 msgid "Unknown include/exclude option: %c\n"
 msgstr ""
 
-#: src/filed/job.c:961 src/stored/fd_cmds.c:329
+#: src/filed/job.c:955 src/stored/fd_cmds.c:329
 #, c-format
 msgid "Could not create bootstrap file %s: ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1060
+#: src/filed/job.c:1057
 #, c-format
 msgid "DIR and FD clocks differ by %d seconds, FD automatically adjusting.\n"
 msgstr ""
 
-#: src/filed/job.c:1068
+#: src/filed/job.c:1065
 #, c-format
 msgid "Unknown backup level: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1080
+#: src/filed/job.c:1077
 #, c-format
 msgid "Bad level command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1101
+#: src/filed/job.c:1098
 #, c-format
 msgid "Bad session command: %s"
 msgstr ""
 
-#: src/filed/job.c:1122
+#: src/filed/job.c:1119
 #, c-format
 msgid "Bad storage command: %s"
 msgstr ""
 
-#: src/filed/job.c:1131
+#: src/filed/job.c:1128
 #, c-format
 msgid "Failed to connect to Storage daemon: %s:%d\n"
 msgstr ""
 
-#: src/filed/job.c:1143
+#: src/filed/job.c:1140
 msgid "Failed to authenticate Storage daemon.\n"
 msgstr ""
 
-#: src/filed/job.c:1169
+#: src/filed/job.c:1178
 msgid "Cannot contact Storage daemon\n"
 msgstr ""
 
-#: src/filed/job.c:1187
+#: src/filed/job.c:1196
 #, c-format
 msgid "Bad response to append open: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1192
+#: src/filed/job.c:1201
 msgid "Bad response from stored to open command\n"
 msgstr ""
 
-#: src/filed/job.c:1219
+#: src/filed/job.c:1228
 #, c-format
 msgid "Generate VSS snapshots. Driver=\"%s\", Drive(s)=\"%s\"\n"
 msgstr ""
 
-#: src/filed/job.c:1222
-#, c-format
-msgid "Generate VSS snapshots failed. ERR=%s\n"
+#: src/filed/job.c:1230
+msgid "Generate VSS snapshots failed.\n"
 msgstr ""
 
-#: src/filed/job.c:1229
+#: src/filed/job.c:1237
 #, c-format
 msgid "Generate VSS snapshot of drive \"%c:\\\" failed\n"
 msgstr ""
 
-#: src/filed/job.c:1238
+#: src/filed/job.c:1244
 #, c-format
-msgid "VSS Writer: %s\n"
+msgid "VSS Writer (PrepareForBackup): %s\n"
 msgstr ""
 
-#: src/filed/job.c:1242
+#: src/filed/job.c:1249
 msgid "No drive letters found for generating VSS snapshots.\n"
 msgstr ""
 
-#: src/filed/job.c:1245
-msgid "VSS was not initialized properly. VSS support is disabled.\n"
+#: src/filed/job.c:1253
+#, c-format
+msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1294
+#: src/filed/job.c:1302
 msgid "Append Close with SD failed.\n"
 msgstr ""
 
-#: src/filed/job.c:1298
+#: src/filed/job.c:1306
 #, c-format
 msgid "Bad status %d returned from Storage Daemon.\n"
 msgstr ""
 
-#: src/filed/job.c:1331
+#: src/filed/job.c:1324
+#, c-format
+msgid "VSS Writer (BackupComplete): %s\n"
+msgstr ""
+
+#: src/filed/job.c:1351
 #, c-format
 msgid "2994 Bad verify command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1346 src/filed/job.c:1385
+#: src/filed/job.c:1366 src/filed/job.c:1405
 #, c-format
 msgid "2994 Bad verify level: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1425
+#: src/filed/job.c:1445
 #, c-format
 msgid "Bad replace command. CMD=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1502
+#: src/filed/job.c:1522
 msgid "Improper calling sequence.\n"
 msgstr ""
 
-#: src/filed/job.c:1522
+#: src/filed/job.c:1542
 #, c-format
 msgid "Bad response to SD read open: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1527
+#: src/filed/job.c:1547
 msgid "Bad response from stored to read open command\n"
 msgstr ""
 
-#: src/filed/job.c:1593
+#: src/filed/job.c:1613
 #, c-format
 msgid "Comm error with SD. bad response to %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1596
+#: src/filed/job.c:1616
 #, c-format
 msgid "Bad response to %s command. Wanted %s, got %s\n"
 msgstr ""
 
+#: src/filed/pythonfd.c:144 src/stored/pythonsd.c:149
+#, c-format
+msgid "Cannot delete attribute %s"
+msgstr ""
+
+#: src/filed/pythonfd.c:162 src/filed/pythonfd.c:178 src/stored/pythonsd.c:182
+#, c-format
+msgid "Cannot find attribute %s"
+msgstr ""
+
 #: src/filed/restore.c:55
 #, c-format
 msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n"
@@ -5683,7 +5772,7 @@ msgid "Logic error: output file should not be open\n"
 msgstr ""
 
 #: src/filed/restore.c:218 src/filed/verify_vol.c:142
-#: src/stored/bextract.c:289 src/stored/bls.c:372 src/stored/bscan.c:649
+#: src/stored/bextract.c:289 src/stored/bls.c:371 src/stored/bscan.c:651
 #, c-format
 msgid "Record header file index %ld not equal record index %ld\n"
 msgstr ""
@@ -5718,7 +5807,7 @@ msgstr ""
 msgid "Can't restore default ACL of %s\n"
 msgstr ""
 
-#: src/filed/restore.c:391 src/stored/bextract.c:449
+#: src/filed/restore.c:391 src/stored/bextract.c:455
 #, c-format
 msgid "Unknown stream=%d ignored. This shouldn't happen!\n"
 msgstr ""
@@ -5807,64 +5896,64 @@ msgstr ""
 msgid "Daemon started %s, %d Job%s run since started.\n"
 msgstr ""
 
-#: src/filed/status.c:125
+#: src/filed/status.c:127
 #, c-format
 msgid " Sizeof: off_t=%d size_t=%d debug=%d trace=%d\n"
 msgstr ""
 
-#: src/filed/status.c:136
+#: src/filed/status.c:138
 msgid "Running Jobs:\n"
 msgstr ""
 
-#: src/filed/status.c:147
+#: src/filed/status.c:149
 #, c-format
 msgid "Director connected at: %s\n"
 msgstr ""
 
-#: src/filed/status.c:149
+#: src/filed/status.c:151
 #, c-format
 msgid "JobId %d Job %s is running.\n"
 msgstr ""
 
-#: src/filed/status.c:152
+#: src/filed/status.c:154
 #, c-format
 msgid "    %s%s Job started: %s\n"
 msgstr ""
 
-#: src/filed/status.c:165 src/stored/status.c:296
+#: src/filed/status.c:166 src/stored/status.c:323
 #, c-format
 msgid "    Files=%s Bytes=%s Bytes/sec=%s\n"
 msgstr ""
 
-#: src/filed/status.c:170
+#: src/filed/status.c:171
 #, c-format
 msgid "    Files Examined=%s\n"
 msgstr ""
 
-#: src/filed/status.c:175
+#: src/filed/status.c:176
 #, c-format
 msgid "    Processing file: %s\n"
 msgstr ""
 
-#: src/filed/status.c:186
+#: src/filed/status.c:187
 msgid "    SDSocket closed.\n"
 msgstr ""
 
-#: src/filed/status.c:215
+#: src/filed/status.c:217
 msgid "Terminated Jobs:\n"
 msgstr ""
 
-#: src/filed/status.c:217
+#: src/filed/status.c:219
 msgid " JobId  Level     Files         Bytes  Status   Finished        Name \n"
 msgstr ""
 
-#: src/filed/status.c:321 src/filed/status.c:347 src/stored/status.c:468
-#: src/stored/status.c:493
+#: src/filed/status.c:323 src/filed/status.c:347 src/stored/status.c:513
+#: src/stored/status.c:536
 #, c-format
 msgid "Bad .status command: %s\n"
 msgstr ""
 
-#: src/filed/status.c:322
+#: src/filed/status.c:324
 msgid "2900 Bad .status command, missing argument.\n"
 msgstr ""
 
@@ -5872,23 +5961,23 @@ msgstr ""
 msgid "2900 Bad .status command, wrong argument.\n"
 msgstr ""
 
-#: src/filed/status.c:385 src/stored/status.c:423
+#: src/filed/status.c:385 src/stored/status.c:468
 msgid "Init Catalog"
 msgstr ""
 
-#: src/filed/status.c:388 src/stored/status.c:426
+#: src/filed/status.c:388 src/stored/status.c:471
 msgid "Volume to Catalog"
 msgstr ""
 
-#: src/filed/status.c:391 src/stored/status.c:429
+#: src/filed/status.c:391 src/stored/status.c:474
 msgid "Disk to Catalog"
 msgstr ""
 
-#: src/filed/status.c:394 src/stored/status.c:432
+#: src/filed/status.c:394 src/stored/status.c:477
 msgid "Data"
 msgstr ""
 
-#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:438
+#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:483
 msgid "Unknown Job Level"
 msgstr ""
 
@@ -5956,47 +6045,37 @@ msgstr ""
 msgid "Error scanning record header: %s\n"
 msgstr ""
 
-#: src/filed/pythonfd.c:150 src/stored/pythonsd.c:154
-#, c-format
-msgid "Cannot delete attribute %s"
-msgstr ""
-
-#: src/filed/pythonfd.c:168 src/filed/pythonfd.c:184 src/stored/pythonsd.c:187
-#, c-format
-msgid "Cannot find attribute %s"
-msgstr ""
-
-#: src/findlib/attribs.c:340
+#: src/findlib/attribs.c:335
 #, c-format
 msgid "File size of restored file %s not correct. Original %s, restored %s.\n"
 msgstr ""
 
-#: src/findlib/attribs.c:358 src/findlib/attribs.c:365
+#: src/findlib/attribs.c:353 src/findlib/attribs.c:360
 #, c-format
 msgid "Unable to set file owner %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:371
+#: src/findlib/attribs.c:366
 #, c-format
 msgid "Unable to set file modes %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:381
+#: src/findlib/attribs.c:376
 #, c-format
 msgid "Unable to set file times %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:395
+#: src/findlib/attribs.c:390
 #, c-format
 msgid "Unable to set file flags %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:640
+#: src/findlib/attribs.c:635
 #, c-format
 msgid "Error in %s file %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:657
+#: src/findlib/attribs.c:652
 #, c-format
 msgid "Error in %s: ERR=%s\n"
 msgstr ""
@@ -6127,7 +6206,7 @@ msgstr ""
 msgid "Unknown file type %d; not restored: %s\n"
 msgstr ""
 
-#: src/findlib/create_file.c:392
+#: src/findlib/create_file.c:402
 #, c-format
 msgid "Zero length filename: %s\n"
 msgstr ""
@@ -6141,11 +6220,6 @@ msgstr ""
 msgid "Top level directory \"%s\" has an unlisted fstype\n"
 msgstr ""
 
-#: src/findlib/find_one.c:241
-#, c-format
-msgid "Attempt to backup hard linked file %s twice ignored.\n"
-msgstr ""
-
 #: src/findlib/makepath.c:117
 #, c-format
 msgid "Cannot create directory %s: ERR=%s\n"
@@ -6253,54 +6327,54 @@ msgstr ""
 msgid "Pthread cond init error = %s\n"
 msgstr ""
 
-#: src/gnome2-console/console.c:361
+#: src/gnome2-console/console.c:357
 msgid " Not Connected"
 msgstr ""
 
-#: src/gnome2-console/console.c:482
+#: src/gnome2-console/console.c:478
 #, c-format
 msgid " Connecting to Director %s:%d"
 msgstr ""
 
-#: src/gnome2-console/console.c:483
+#: src/gnome2-console/console.c:479
 #, c-format
 msgid ""
 "Connecting to Director %s:%d\n"
 "\n"
 msgstr ""
 
-#: src/gnome2-console/console.c:498 src/wx-console/console_thread.cpp:357
+#: src/gnome2-console/console.c:494 src/wx-console/console_thread.cpp:360
 #, c-format
 msgid "Passphrase for Console \"%s\" TLS private key: "
 msgstr ""
 
-#: src/gnome2-console/console.c:520 src/wx-console/console_thread.cpp:378
+#: src/gnome2-console/console.c:516 src/wx-console/console_thread.cpp:381
 #, c-format
 msgid "Passphrase for Director \"%s\" TLS private key: "
 msgstr ""
 
-#: src/gnome2-console/console.c:539 src/tray-monitor/tray-monitor.c:860
-#: src/wx-console/console_thread.cpp:396
+#: src/gnome2-console/console.c:535 src/tray-monitor/tray-monitor.c:860
+#: src/wx-console/console_thread.cpp:399
 msgid "Director daemon"
 msgstr ""
 
-#: src/gnome2-console/console.c:551
+#: src/gnome2-console/console.c:547
 msgid " Initializing ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:587
+#: src/gnome2-console/console.c:583
 msgid " Connected"
 msgstr ""
 
-#: src/gnome2-console/console.c:595
+#: src/gnome2-console/console.c:591
 msgid " Processing command ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:630
+#: src/gnome2-console/console.c:626
 msgid " At prompt waiting for input ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:750
+#: src/gnome2-console/console.c:746
 msgid " Ready"
 msgstr ""
 
@@ -6314,218 +6388,204 @@ msgstr ""
 msgid "ConsoleFont: name=%s font face=%s\n"
 msgstr ""
 
-#: src/gnome2-console/interface.c:32
-msgid "_Connect"
+#: src/gnome2-console/interface.c:202
+msgid "Bacula Console"
+msgstr ""
+
+#: src/gnome2-console/interface.c:235 src/wx-console/wxbmainframe.cpp:229
+#: src/wx-console/wxbmainframe.cpp:597
+msgid "Connect"
 msgstr ""
 
-#: src/gnome2-console/interface.c:33 src/gnome2-console/interface.c:232
+#: src/gnome2-console/interface.c:238
 msgid "Connect to Director"
 msgstr ""
 
-#: src/gnome2-console/interface.c:39
-msgid "_Disconnect"
+#: src/gnome2-console/interface.c:242
+msgid "Run"
 msgstr ""
 
-#: src/gnome2-console/interface.c:40
-msgid "Disconnect from Director"
+#: src/gnome2-console/interface.c:245 src/gnome2-console/interface.c:683
+#: src/gnome2-console/interface.c:697
+msgid "Run a Job"
 msgstr ""
 
-#: src/gnome2-console/interface.c:93
-msgid "_Display Messages"
+#: src/gnome2-console/interface.c:249
+msgid "Dir Status"
 msgstr ""
 
-#: src/gnome2-console/interface.c:129
-msgid "_File"
+#: src/gnome2-console/interface.c:255 src/lib/util.c:292
+#: src/wx-console/wxbrestorepanel.cpp:384
+#: src/wx-console/wxbrestorepanel.cpp:1949
+msgid "Restore"
 msgstr ""
 
-#: src/gnome2-console/interface.c:136
-msgid "_Edit"
+#: src/gnome2-console/interface.c:261
+msgid "Label"
 msgstr ""
 
-#: src/gnome2-console/interface.c:143
-msgid "_View"
+#: src/gnome2-console/interface.c:267
+msgid "Msgs"
 msgstr ""
 
-#: src/gnome2-console/interface.c:144 src/gnome2-console/interface.c:252
+#: src/gnome2-console/interface.c:270
 msgid "Display Messages"
 msgstr ""
 
-#: src/gnome2-console/interface.c:150
-msgid "_Settings"
+#: src/gnome2-console/interface.c:294
+msgid " Command: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:157
-msgid "_Help"
+#: src/gnome2-console/interface.c:303
+msgid "Enter Commands Here"
 msgstr ""
 
-#: src/gnome2-console/interface.c:197
-msgid "Bacula Console"
+#: src/gnome2-console/interface.c:314
+msgid " Status: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:231 src/wx-console/wxbmainframe.cpp:229
-#: src/wx-console/wxbmainframe.cpp:590
-msgid "Connect"
-msgstr ""
-
-#: src/gnome2-console/interface.c:241
-msgid "Run"
-msgstr ""
-
-#: src/gnome2-console/interface.c:242 src/gnome2-console/interface.c:677
-#: src/gnome2-console/interface.c:690
-msgid "Run a Job"
-msgstr ""
-
-#: src/gnome2-console/interface.c:251
-msgid "Msgs"
-msgstr ""
-
-#: src/gnome2-console/interface.c:261 src/lib/util.c:298
-#: src/wx-console/wxbrestorepanel.cpp:426
-#: src/wx-console/wxbrestorepanel.cpp:1915
-msgid "Restore"
-msgstr ""
-
-#: src/gnome2-console/interface.c:271
-msgid "Label"
-msgstr ""
-
-#: src/gnome2-console/interface.c:299
-msgid " Command: "
-msgstr ""
-
-#: src/gnome2-console/interface.c:307
-msgid "Enter Commands Here"
-msgstr ""
-
-#: src/gnome2-console/interface.c:318
-msgid " Status: "
-msgstr ""
-
-#: src/gnome2-console/interface.c:326
+#: src/gnome2-console/interface.c:323 src/gnome2-console/interface.c:1716
 msgid "  "
 msgstr ""
 
-#: src/gnome2-console/interface.c:422
+#: src/gnome2-console/interface.c:424
 msgid "About Bacula Console"
 msgstr ""
 
-#: src/gnome2-console/interface.c:436
+#: src/gnome2-console/interface.c:439
 msgid "Bacula Console\n"
 msgstr ""
 
-#: src/gnome2-console/interface.c:444
+#: src/gnome2-console/interface.c:448
 msgid "Copyright (c) 2000 - 2004, Kern Sibbald and John Walker"
 msgstr ""
 
-#: src/gnome2-console/interface.c:450
+#: src/gnome2-console/interface.c:453
 msgid "Authors: Kern Sibbald and John Walker"
 msgstr ""
 
-#: src/gnome2-console/interface.c:456
+#: src/gnome2-console/interface.c:458
 msgid "It comes by night and sucks the essence from your computers"
 msgstr ""
 
-#: src/gnome2-console/interface.c:521 src/gnome2-console/interface.c:536
+#: src/gnome2-console/interface.c:523 src/gnome2-console/interface.c:540
 msgid "Select Director"
 msgstr ""
 
-#: src/gnome2-console/interface.c:708 src/gnome2-console/interface.c:1616
+#: src/gnome2-console/interface.c:570
+msgid "         "
+msgstr ""
+
+#: src/gnome2-console/interface.c:716 src/gnome2-console/interface.c:1638
 msgid "Job:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:728
+#: src/gnome2-console/interface.c:736
 msgid "   Type:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:757 src/gnome2-console/interface.c:1644
-#: src/wx-console/wxbrestorepanel.cpp:1828
+#: src/gnome2-console/interface.c:756 src/gnome2-console/interface.c:785
+#: src/gnome2-console/interface.c:1291 src/gnome2-console/interface.c:1687
+msgid " "
+msgstr ""
+
+#: src/gnome2-console/interface.c:765 src/gnome2-console/interface.c:1667
+#: src/wx-console/wxbrestorepanel.cpp:1862
 msgid "Client:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:787 src/gnome2-console/interface.c:1672
+#: src/gnome2-console/interface.c:796 src/gnome2-console/interface.c:1696
 msgid "FileSet: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:813 src/wx-console/wxbrestorepanel.cpp:1834
+#: src/gnome2-console/interface.c:821 src/wx-console/wxbrestorepanel.cpp:1868
 msgid "Priority:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:836
+#: src/gnome2-console/interface.c:842
 msgid "Level:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:866 src/gnome2-console/interface.c:1418
-#: src/gnome2-console/interface.c:1700
+#: src/gnome2-console/interface.c:863
+msgid "             "
+msgstr ""
+
+#: src/gnome2-console/interface.c:873 src/gnome2-console/interface.c:1440
+#: src/gnome2-console/interface.c:1725
 msgid "Pool:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:895 src/gnome2-console/interface.c:1393
-#: src/gnome2-console/interface.c:1728 src/wx-console/wxbrestorepanel.cpp:1830
+#: src/gnome2-console/interface.c:894 src/gnome2-console/interface.c:925
+#: src/gnome2-console/interface.c:955 src/gnome2-console/interface.c:975
+#: src/gnome2-console/interface.c:995 src/gnome2-console/interface.c:1015
+#: src/gnome2-console/interface.c:1020 src/gnome2-console/interface.c:1490
+#: src/gnome2-console/interface.c:1746 src/gnome2-console/interface.c:1776
+#: src/gnome2-console/interface.c:1795 src/gnome2-console/interface.c:1800
+msgid "   "
+msgstr ""
+
+#: src/gnome2-console/interface.c:904 src/gnome2-console/interface.c:1414
+#: src/gnome2-console/interface.c:1755 src/wx-console/wxbrestorepanel.cpp:1864
 msgid "Storage:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:924
+#: src/gnome2-console/interface.c:935
 msgid "Messages:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:952
+#: src/gnome2-console/interface.c:965
 msgid "Where: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:970 src/wx-console/wxbrestorepanel.cpp:1832
+#: src/gnome2-console/interface.c:985 src/wx-console/wxbrestorepanel.cpp:1866
 msgid "When:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:988 src/wx-console/wxbrestorepanel.cpp:1813
+#: src/gnome2-console/interface.c:1005 src/wx-console/wxbrestorepanel.cpp:1847
 msgid "Bootstrap:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1108
-msgid "_New"
-msgstr ""
-
-#: src/gnome2-console/interface.c:1177
+#: src/gnome2-console/interface.c:1201
 msgid "Restore File Selection"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1226
+#: src/gnome2-console/interface.c:1245
 msgid "Current dir:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1252
+#: src/gnome2-console/interface.c:1272
 msgid "Files Selected: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:1373 src/gnome2-console/interface.c:1383
+#: src/gnome2-console/interface.c:1392 src/gnome2-console/interface.c:1403
 msgid "Label a Volume"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1444
+#: src/gnome2-console/interface.c:1465
 msgid "Volume Name:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1459
+#: src/gnome2-console/interface.c:1479
 msgid "Slot:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1585
+#: src/gnome2-console/interface.c:1605
 msgid "Restore Files Dialog"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1599
+#: src/gnome2-console/interface.c:1620
 msgid "Restore Files"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1756
+#: src/gnome2-console/interface.c:1785
 msgid "Before:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1799
+#: src/gnome2-console/interface.c:1831
 msgid "Select Files"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1883
+#: src/gnome2-console/interface.c:1914
 msgid "Progress"
 msgstr ""
 
@@ -6533,162 +6593,253 @@ msgstr ""
 msgid "Mark"
 msgstr ""
 
+#: src/gnome2-console/restore.c:121
+msgid "File"
+msgstr ""
+
 #: src/gnome2-console/restore.c:121
 msgid "Mode"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:330
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:288
 msgid "User"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:334
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:292
 msgid "Group"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:318
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:276
 msgid "Size"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:322
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:280
 msgid "Date"
 msgstr ""
 
-#: src/gnome2-console/support.c:41
+#: src/gnome2-console/support.c:60 src/gnome2-console/support.c:85
 #, c-format
-msgid "Widget not found: %s"
+msgid "Couldn't find pixmap file: %s"
 msgstr ""
 
-#: src/gnome2-console/support.c:60 src/gnome2-console/support.c:85
+#: src/lib/tls.c:105
 #, c-format
-msgid "Couldn't find pixmap file: %s"
+msgid ""
+"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
+msgstr ""
+
+#: src/lib/tls.c:152
+msgid "Error initializing SSL context"
+msgstr ""
+
+#: src/lib/tls.c:173
+msgid "Error loading certificate verification stores"
+msgstr ""
+
+#: src/lib/tls.c:178
+msgid ""
+"Either a certificate file or a directory must be specified as a verification "
+"store\n"
+msgstr ""
+
+#: src/lib/tls.c:189
+msgid "Error loading certificate file"
+msgstr ""
+
+#: src/lib/tls.c:197
+msgid "Error loading private key"
 msgstr ""
 
-#: src/gnome2-console/support.c:92
+#: src/lib/tls.c:205
+msgid "Unable to open DH parameters file"
+msgstr ""
+
+#: src/lib/tls.c:211
+msgid "Unable to load DH parameters from specified file"
+msgstr ""
+
+#: src/lib/tls.c:215
+msgid "Failed to set TLS Diffie-Hellman parameters"
+msgstr ""
+
+#: src/lib/tls.c:224
+msgid "Error setting cipher list, no valid ciphers available\n"
+msgstr ""
+
+#: src/lib/tls.c:272
+msgid "Peer failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:314
+#, c-format
+msgid "Peer %s failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:417
+msgid "Error creating file descriptor-based BIO"
+msgstr ""
+
+#: src/lib/tls.c:428
+msgid "Error creating new SSL object"
+msgstr ""
+
+#: src/lib/tls.c:492 src/lib/tls.c:515
+msgid "Connect failure"
+msgstr ""
+
+#: src/lib/tls.c:592 src/lib/tls.c:596
+msgid "TLS shutdown failure."
+msgstr ""
+
+#: src/lib/tls.c:645 src/lib/tls.c:665
+msgid "TLS read/write failure."
+msgstr ""
+
+#: src/lib/tls.c:723 src/lib/tls.c:780 src/stored/dev.c:209
+#: src/stored/dev.c:227 src/stored/dev.c:233 src/stored/stored_conf.c:593
+#, c-format
+msgid "Unable to init mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:743 src/lib/tls.c:812
+#, c-format
+msgid "Unable to destroy mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:877
 #, c-format
-msgid "Failed to load pixbuf file: %s: %s\n"
+msgid "Unable to init OpenSSL threading: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:887
+msgid "Failed to seed OpenSSL PRNG\n"
+msgstr ""
+
+#: src/lib/tls.c:913
+msgid "Failed to save OpenSSL PRNG\n"
 msgstr ""
 
-#: src/lib/address_conf.c:55
+#: src/lib/address_conf.c:50
 #, c-format
 msgid "Only ipv4 and ipv6 are supported (%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:59
+#: src/lib/address_conf.c:54
 #, c-format
 msgid "Only ipv4 is supported (%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:167
+#: src/lib/address_conf.c:163
 #, c-format
 msgid "It was tried to assign a ipv6 address to a ipv4(%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:176
+#: src/lib/address_conf.c:172
 #, c-format
 msgid "It was tried to assign a ipv4 address to a ipv6(%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:255
+#: src/lib/address_conf.c:251
 #, c-format
 msgid "Can't add default address (%s)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:285
+#: src/lib/address_conf.c:281
 msgid "the old style addresses cannot be mixed with new style"
 msgstr ""
 
-#: src/lib/address_conf.c:308
+#: src/lib/address_conf.c:304
 #, c-format
 msgid "can't resolve service(%s)"
 msgstr ""
 
-#: src/lib/address_conf.c:318
+#: src/lib/address_conf.c:314
 #, c-format
 msgid "can't resolve hostname(%s) %s"
 msgstr ""
 
-#: src/lib/address_conf.c:407
+#: src/lib/address_conf.c:403
 #, c-format
 msgid "Expected a block begin { , got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:412
+#: src/lib/address_conf.c:408
 msgid "Empty addr block is not allowed"
 msgstr ""
 
-#: src/lib/address_conf.c:416
+#: src/lib/address_conf.c:412
 #, c-format
 msgid "Expected a string, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:425
+#: src/lib/address_conf.c:421
 #, c-format
 msgid "Expected a string [ip|ipv4|ipv6], got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:429
+#: src/lib/address_conf.c:425
 #, c-format
 msgid "Expected a string [ip|ipv4], got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:434 src/lib/address_conf.c:464
+#: src/lib/address_conf.c:430 src/lib/address_conf.c:460
 #, c-format
 msgid "Expected a equal =, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:438
+#: src/lib/address_conf.c:434
 #, c-format
 msgid "Expected a block beginn { , got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:445 src/lib/address_conf.c:460
+#: src/lib/address_conf.c:441 src/lib/address_conf.c:456
 #, c-format
 msgid "Expected a identifier [addr|port], got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:450
+#: src/lib/address_conf.c:446
 msgid "Only one port per address block"
 msgstr ""
 
-#: src/lib/address_conf.c:456
+#: src/lib/address_conf.c:452
 msgid "Only one addr per address block"
 msgstr ""
 
-#: src/lib/address_conf.c:472
+#: src/lib/address_conf.c:468
 #, c-format
 msgid "Expected a number or a string, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:478
+#: src/lib/address_conf.c:474
 #, c-format
 msgid "Expected an IP number or a hostname, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:484
+#: src/lib/address_conf.c:480
 msgid "State machine missmatch"
 msgstr ""
 
-#: src/lib/address_conf.c:490 src/lib/address_conf.c:503
+#: src/lib/address_conf.c:486 src/lib/address_conf.c:499
 #, c-format
 msgid "Expected a end of block }, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:496
+#: src/lib/address_conf.c:492
 #, c-format
 msgid "Can't add hostname(%s) and port(%s) to addrlist (%s)"
 msgstr ""
 
-#: src/lib/address_conf.c:512
+#: src/lib/address_conf.c:508
 #, c-format
 msgid "Expected a hostname or IP nummer, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:517 src/lib/address_conf.c:531
+#: src/lib/address_conf.c:513 src/lib/address_conf.c:527
 #, c-format
 msgid "can't add port (%s) to (%s)"
 msgstr ""
 
-#: src/lib/address_conf.c:526
+#: src/lib/address_conf.c:522
 #, c-format
 msgid "Expected a port number or string, got: %s"
 msgstr ""
@@ -6698,25 +6849,25 @@ msgstr ""
 msgid "Error scanning attributes: %s\n"
 msgstr ""
 
-#: src/lib/berrno.c:66
+#: src/lib/berrno.c:48
 msgid "Child exited normally."
 msgstr ""
 
-#: src/lib/berrno.c:73
+#: src/lib/berrno.c:55
 msgid "Unknown error during program execvp"
 msgstr ""
 
-#: src/lib/berrno.c:76
+#: src/lib/berrno.c:58
 #, c-format
 msgid "Child exited with code %d"
 msgstr ""
 
-#: src/lib/berrno.c:84
+#: src/lib/berrno.c:66
 #, c-format
 msgid "Child died from signal %d: %s"
 msgstr ""
 
-#: src/lib/berrno.c:90
+#: src/lib/berrno.c:72
 msgid "Invalid errno. No error message possible."
 msgstr ""
 
@@ -6734,148 +6885,148 @@ msgstr ""
 msgid "Attr spool write error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:207 src/lib/bnet.c:264
+#: src/lib/bnet.c:209 src/lib/bnet.c:266
 #, c-format
 msgid "Read expected %d got %d from %s:%s:%d\n"
 msgstr ""
 
-#: src/lib/bnet.c:225
+#: src/lib/bnet.c:227
 #, c-format
 msgid "Packet size too big from \"%s:%s:%d. Terminating connection.\n"
 msgstr ""
 
-#: src/lib/bnet.c:254
+#: src/lib/bnet.c:256
 #, c-format
 msgid "Read error from %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:330 src/lib/bnet.c:346
+#: src/lib/bnet.c:332 src/lib/bnet.c:348
 #, c-format
 msgid "fread attr spool error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:390
+#: src/lib/bnet.c:392
 #, c-format
 msgid "Write error sending len to %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:395 src/lib/bnet.c:427
+#: src/lib/bnet.c:397 src/lib/bnet.c:430
 #, c-format
 msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"
 msgstr ""
 
-#: src/lib/bnet.c:421
+#: src/lib/bnet.c:424
 #, c-format
 msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:447 src/lib/bnet.c:487
+#: src/lib/bnet.c:450 src/lib/bnet.c:490
 msgid "TLS connection initialization failed.\n"
 msgstr ""
 
-#: src/lib/bnet.c:455
+#: src/lib/bnet.c:458
 msgid "TLS Negotiation failed.\n"
 msgstr ""
 
-#: src/lib/bnet.c:461
+#: src/lib/bnet.c:464
 msgid ""
 "TLS certificate verification failed. Peer certificate did not match a "
 "required commonName\n"
 msgstr ""
 
-#: src/lib/bnet.c:499
+#: src/lib/bnet.c:502
 #, c-format
 msgid ""
 "TLS host certificate verification failed. Host %s did not match presented "
 "certificate\n"
 msgstr ""
 
-#: src/lib/bnet.c:513 src/lib/bnet.c:518
+#: src/lib/bnet.c:516 src/lib/bnet.c:521
 msgid "TLS not configured.\n"
 msgstr ""
 
-#: src/lib/bnet.c:614
+#: src/lib/bnet.c:617
 msgid "No problem."
 msgstr ""
 
-#: src/lib/bnet.c:617
+#: src/lib/bnet.c:620
 msgid "Authoritative answer for host not found."
 msgstr ""
 
-#: src/lib/bnet.c:620
+#: src/lib/bnet.c:623
 msgid "Non-authoritative for host not found, or ServerFail."
 msgstr ""
 
-#: src/lib/bnet.c:623
+#: src/lib/bnet.c:626
 msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP."
 msgstr ""
 
-#: src/lib/bnet.c:626
+#: src/lib/bnet.c:629
 msgid "Valid name, no data record of resquested type."
 msgstr ""
 
-#: src/lib/bnet.c:629
+#: src/lib/bnet.c:632
 msgid "Unknown error."
 msgstr ""
 
-#: src/lib/bnet.c:764
+#: src/lib/bnet.c:767
 #, c-format
 msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:784
+#: src/lib/bnet.c:787
 #, c-format
 msgid "Socket open error. proto=%d port=%d. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:793 src/lib/bnet.c:818 src/lib/bnet_server.c:194
-#: src/lib/bnet_server.c:352
+#: src/lib/bnet.c:796 src/lib/bnet.c:821 src/lib/bnet_server.c:193
+#: src/lib/bnet_server.c:351
 #, c-format
 msgid "Cannot set SO_KEEPALIVE on socket: %s\n"
 msgstr ""
 
-#: src/lib/bnet.c:849
+#: src/lib/bnet.c:852
 #, c-format
 msgid ""
 "Could not connect to %s on %s:%d. ERR=%s\n"
 "Retrying ...\n"
 msgstr ""
 
-#: src/lib/bnet.c:855
+#: src/lib/bnet.c:858
 #, c-format
 msgid "Unable to connect to %s on %s:%d. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:933
+#: src/lib/bnet.c:936
 msgid "Could not malloc BSOCK data buffer\n"
 msgstr ""
 
-#: src/lib/bnet.c:940 src/lib/bnet.c:964
+#: src/lib/bnet.c:943 src/lib/bnet.c:967
 #, c-format
 msgid "sockopt error: %s\n"
 msgstr ""
 
-#: src/lib/bnet.c:946 src/lib/bnet.c:970
+#: src/lib/bnet.c:949 src/lib/bnet.c:973
 #, c-format
 msgid "Warning network buffer = %d bytes not max size.\n"
 msgstr ""
 
-#: src/lib/bnet.c:950 src/lib/bnet.c:974
+#: src/lib/bnet.c:953 src/lib/bnet.c:977
 #, c-format
 msgid "Network buffer size %d not multiple of tape block size.\n"
 msgstr ""
 
-#: src/lib/bnet.c:994 src/lib/bnet.c:1028
+#: src/lib/bnet.c:997 src/lib/bnet.c:1031
 #, c-format
 msgid "fcntl F_GETFL error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:1000 src/lib/bnet.c:1034 src/lib/bnet.c:1059
+#: src/lib/bnet.c:1003 src/lib/bnet.c:1037 src/lib/bnet.c:1062
 #, c-format
 msgid "fcntl F_SETFL error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:1113
+#: src/lib/bnet.c:1116
 #, c-format
 msgid "Unknown sig %d"
 msgstr ""
@@ -6890,7 +7041,7 @@ msgstr ""
 msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:259
+#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:258
 #, c-format
 msgid "Cannot set SO_REUSEADDR on socket: %s\n"
 msgstr ""
@@ -6910,50 +7061,50 @@ msgstr ""
 msgid "Could not init client queue: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:158 src/lib/bnet_server.c:321
+#: src/lib/bnet_server.c:157 src/lib/bnet_server.c:320
 #, c-format
 msgid "Error in select: %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:179 src/lib/bnet_server.c:340
+#: src/lib/bnet_server.c:178 src/lib/bnet_server.c:339
 #, c-format
 msgid "Connection from %s:%d refused by hosts.access\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:205
+#: src/lib/bnet_server.c:204
 msgid "Could not create client BSOCK.\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:212
+#: src/lib/bnet_server.c:211
 #, c-format
 msgid "Could not add job to client queue: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:223
+#: src/lib/bnet_server.c:222
 #, c-format
 msgid "Could not destroy client queue: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:250
+#: src/lib/bnet_server.c:249
 #, c-format
 msgid "Cannot open stream socket: %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:279
+#: src/lib/bnet_server.c:278
 #, c-format
 msgid "Cannot bind port %d: ERR=%s: retrying ...\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:285
+#: src/lib/bnet_server.c:284
 msgid "Server socket"
 msgstr ""
 
-#: src/lib/bnet_server.c:367
+#: src/lib/bnet_server.c:366
 #, c-format
 msgid "Socket accept error for %s. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bpipe.c:282 src/lib/bpipe.c:357
+#: src/lib/bpipe.c:283 src/lib/bpipe.c:362
 msgid "Program killed by Bacula watchdog (timeout)\n"
 msgstr ""
 
@@ -6987,85 +7138,85 @@ msgstr ""
 msgid "Out of memory: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:254
+#: src/lib/bsys.c:256
 msgid "Buffer overflow.\n"
 msgstr ""
 
-#: src/lib/bsys.c:319
+#: src/lib/bsys.c:322
 msgid "Bad errno"
 msgstr ""
 
-#: src/lib/bsys.c:336
+#: src/lib/bsys.c:339
 msgid "Possible mutex deadlock.\n"
 msgstr ""
 
-#: src/lib/bsys.c:340 src/lib/bsys.c:372
+#: src/lib/bsys.c:343 src/lib/bsys.c:375
 #, c-format
 msgid "Mutex lock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:343
+#: src/lib/bsys.c:346
 msgid "Possible mutex deadlock resolved.\n"
 msgstr ""
 
-#: src/lib/bsys.c:355
+#: src/lib/bsys.c:358
 #, c-format
 msgid "Mutex unlock not locked. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:360 src/lib/bsys.c:382
+#: src/lib/bsys.c:363 src/lib/bsys.c:385
 #, c-format
 msgid "Mutex unlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:396
+#: src/lib/bsys.c:399
 #, c-format
 msgid "Memset for %d bytes at %s:%d\n"
 msgstr ""
 
-#: src/lib/bsys.c:425
+#: src/lib/bsys.c:428
 #, c-format
 msgid "Cannot open pid file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:429
+#: src/lib/bsys.c:432
 #, c-format
 msgid ""
 "%s is already running. pid=%d\n"
 "Check file %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:442
+#: src/lib/bsys.c:445
 #, c-format
 msgid "Could not open pid file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:536
+#: src/lib/bsys.c:565
 #, c-format
 msgid "Could not create state file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:552
+#: src/lib/bsys.c:584
 #, c-format
 msgid "Write final hdr error: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:574
+#: src/lib/bsys.c:611
 #, c-format
 msgid "Could not find specified group: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:577 src/lib/bsys.c:581
+#: src/lib/bsys.c:614 src/lib/bsys.c:618
 #, c-format
 msgid "Could not set specified group: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:590
+#: src/lib/bsys.c:627
 #, c-format
 msgid "Could not find specified userid: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:593
+#: src/lib/bsys.c:630
 #, c-format
 msgid "Could not set specified userid: %s\n"
 msgstr ""
@@ -7074,21 +7225,21 @@ msgstr ""
 msgid "stop_btimer called with NULL btimer_id\n"
 msgstr ""
 
-#: src/lib/cram-md5.c:80 src/lib/cram-md5.c:105
+#: src/lib/cram-md5.c:76 src/lib/cram-md5.c:101
 msgid "1999 Authorization failed.\n"
 msgstr ""
 
-#: src/lib/daemon.c:58
+#: src/lib/daemon.c:53
 #, c-format
 msgid "Cannot fork to become daemon: %s\n"
 msgstr ""
 
-#: src/lib/edit.c:400
+#: src/lib/edit.c:433
 #, c-format
 msgid "Illegal character \"%c\" in name.\n"
 msgstr ""
 
-#: src/lib/edit.c:407
+#: src/lib/edit.c:440
 msgid "Name too long.\n"
 msgstr ""
 
@@ -7096,40 +7247,40 @@ msgstr ""
 msgid "Events not available"
 msgstr ""
 
-#: src/lib/jcr.c:277
+#: src/lib/jcr.c:279
 msgid "NULL jcr.\n"
 msgstr ""
 
-#: src/lib/jcr.c:396
+#: src/lib/jcr.c:400
 #, c-format
 msgid "JCR use_count=%d JobId=%d\n"
 msgstr ""
 
-#: src/lib/jcr.c:625
+#: src/lib/jcr.c:678
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading Storage "
 "daemon.\n"
 msgstr ""
 
-#: src/lib/jcr.c:637
+#: src/lib/jcr.c:690
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading File daemon.\n"
 msgstr ""
 
-#: src/lib/jcr.c:649
+#: src/lib/jcr.c:702
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading Director.\n"
 msgstr ""
 
-#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:192
+#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:186
 #, c-format
 msgid "Problem probably begins at line %d.\n"
 msgstr ""
 
-#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:197
+#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:191
 #, c-format
 msgid ""
 "Config error: %s\n"
@@ -7224,14 +7375,14 @@ msgstr ""
 msgid "expected a string, got %s: %s"
 msgstr ""
 
-#: src/lib/mem_pool.c:100
+#: src/lib/mem_pool.c:95
 #, c-format
 msgid "MemPool index %d larger than max %d\n"
 msgstr ""
 
-#: src/lib/mem_pool.c:118 src/lib/mem_pool.c:138 src/lib/mem_pool.c:173
-#: src/lib/mem_pool.c:244 src/lib/mem_pool.c:264 src/lib/mem_pool.c:302
-#: src/lib/mem_pool.c:521
+#: src/lib/mem_pool.c:113 src/lib/mem_pool.c:133 src/lib/mem_pool.c:168
+#: src/lib/mem_pool.c:239 src/lib/mem_pool.c:259 src/lib/mem_pool.c:297
+#: src/lib/mem_pool.c:550
 #, c-format
 msgid "Out of memory requesting %d bytes\n"
 msgstr ""
@@ -7466,177 +7617,156 @@ msgid ""
 "Perhaps you left the trailing brace off of the previous resource."
 msgstr ""
 
-#: src/lib/parse_conf.c:850
+#: src/lib/parse_conf.c:844
+msgid "Name not specified for resource"
+msgstr ""
+
+#: src/lib/parse_conf.c:853
 #, c-format
 msgid "unexpected token %d %s in resource definition"
 msgstr ""
 
-#: src/lib/parse_conf.c:856
+#: src/lib/parse_conf.c:859
 #, c-format
 msgid "Unknown parser state %d\n"
 msgstr ""
 
-#: src/lib/parse_conf.c:861
+#: src/lib/parse_conf.c:864
 msgid "End of conf file reached with unclosed resource."
 msgstr ""
 
-#: src/lib/regex.c:1040
-msgid "Success"
-msgstr ""
-
-#: src/lib/regex.c:1043
-msgid "No match"
-msgstr ""
-
-#: src/lib/regex.c:1046
-msgid "Invalid regular expression"
-msgstr ""
-
-#: src/lib/regex.c:1049
-msgid "Invalid collation character"
-msgstr ""
-
-#: src/lib/regex.c:1052
-msgid "Invalid character class name"
-msgstr ""
-
-#: src/lib/regex.c:1055
-msgid "Trailing backslash"
-msgstr ""
-
-#: src/lib/regex.c:1058
-msgid "Invalid back reference"
-msgstr ""
-
-#: src/lib/regex.c:1061
-msgid "Unmatched [ or [^"
-msgstr ""
-
-#: src/lib/regex.c:1064
-msgid "Unmatched ( or \\("
+#: src/lib/pythonlib.c:114
+msgid "Could not initialize Python\n"
 msgstr ""
 
-#: src/lib/regex.c:1067
-msgid "Unmatched \\{"
+#: src/lib/pythonlib.c:119
+#, c-format
+msgid "Could not Run Python string %s\n"
 msgstr ""
 
-#: src/lib/regex.c:1070
-msgid "Invalid content of \\{\\}"
+#: src/lib/pythonlib.c:131
+msgid "Could not initialize Python Job type.\n"
 msgstr ""
 
-#: src/lib/regex.c:1073
-msgid "Invalid range end"
+#: src/lib/pythonlib.c:136
+#, c-format
+msgid "Could not import Python script %s/%s. Python disabled.\n"
 msgstr ""
 
-#: src/lib/regex.c:1076
-msgid "Memory exhausted"
+#: src/lib/pythonlib.c:239
+msgid "Could not create Python Job Object.\n"
 msgstr ""
 
-#: src/lib/regex.c:1079
-msgid "Invalid preceding regular expression"
+#: src/lib/pythonlib.c:252 src/lib/pythonlib.c:276
+#, c-format
+msgid "Python function \"%s\" not found.\n"
 msgstr ""
 
-#: src/lib/regex.c:1082
-msgid "Premature end of regular expression"
+#: src/lib/pythonlib.c:291
+#, c-format
+msgid "Unknown Python daemon event %s\n"
 msgstr ""
 
-#: src/lib/regex.c:1085
-msgid "Regular expression too big"
+#: src/lib/pythonlib.c:316
+#, c-format
+msgid "Unable to initialize the Python lock. ERR=%s\n"
 msgstr ""
 
-#: src/lib/regex.c:1088
-msgid "Unmatched ) or \\)"
+#: src/lib/res.c:66
+#, c-format
+msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
 msgstr ""
 
-#: src/lib/regex.c:5874
-msgid "No previous regular expression"
+#: src/lib/res.c:76
+#, c-format
+msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:289
+#: src/lib/rwlock.c:284
 msgid "rwl_writeunlock called too many times.\n"
 msgstr ""
 
-#: src/lib/rwlock.c:293
+#: src/lib/rwlock.c:288
 msgid "rwl_writeunlock by non-owner.\n"
 msgstr ""
 
-#: src/lib/rwlock.c:358 src/lib/semlock.c:248
+#: src/lib/rwlock.c:353 src/lib/semlock.c:248
 #, c-format
 msgid "Write lock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:365 src/lib/semlock.c:255
+#: src/lib/rwlock.c:360 src/lib/semlock.c:255
 #, c-format
 msgid "Write unlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:375 src/lib/semlock.c:265
+#: src/lib/rwlock.c:370 src/lib/semlock.c:265
 #, c-format
 msgid "Read lock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:382 src/lib/semlock.c:272
+#: src/lib/rwlock.c:377 src/lib/semlock.c:272
 #, c-format
 msgid "Read unlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:391 src/lib/semlock.c:281
+#: src/lib/rwlock.c:386 src/lib/semlock.c:281
 #, c-format
 msgid "Thread %d found unchanged elements %d times\n"
 msgstr ""
 
-#: src/lib/rwlock.c:423 src/lib/semlock.c:313
+#: src/lib/rwlock.c:418 src/lib/semlock.c:313
 #, c-format
 msgid "Init rwlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:438 src/lib/semlock.c:328
+#: src/lib/rwlock.c:433 src/lib/semlock.c:328
 #, c-format
 msgid "Create thread failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:449 src/lib/semlock.c:339
+#: src/lib/rwlock.c:444 src/lib/semlock.c:339
 #, c-format
 msgid "Join thread failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:452 src/lib/semlock.c:342
+#: src/lib/rwlock.c:447 src/lib/semlock.c:342
 #, c-format
 msgid "%02d: interval %d, writes %d, reads %d\n"
 msgstr ""
 
-#: src/lib/rwlock.c:462 src/lib/semlock.c:352
+#: src/lib/rwlock.c:457 src/lib/semlock.c:352
 #, c-format
 msgid "data %02d: value %d, %d writes\n"
 msgstr ""
 
-#: src/lib/rwlock.c:467 src/lib/semlock.c:357
+#: src/lib/rwlock.c:462 src/lib/semlock.c:357
 #, c-format
 msgid "Total: %d thread writes, %d data writes\n"
 msgstr ""
 
-#: src/lib/rwlock.c:539 src/lib/semlock.c:429
+#: src/lib/rwlock.c:534 src/lib/semlock.c:429
 msgid "Try write lock"
 msgstr ""
 
-#: src/lib/rwlock.c:545 src/lib/semlock.c:435
+#: src/lib/rwlock.c:540 src/lib/semlock.c:435
 msgid "Try read lock"
 msgstr ""
 
-#: src/lib/rwlock.c:600 src/lib/semlock.c:490
+#: src/lib/rwlock.c:595 src/lib/semlock.c:490
 msgid "Create thread"
 msgstr ""
 
-#: src/lib/rwlock.c:610 src/lib/semlock.c:500
+#: src/lib/rwlock.c:605 src/lib/semlock.c:500
 msgid "Join thread"
 msgstr ""
 
-#: src/lib/rwlock.c:612 src/lib/semlock.c:502
+#: src/lib/rwlock.c:607 src/lib/semlock.c:502
 #, c-format
 msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n"
 msgstr ""
 
-#: src/lib/rwlock.c:624 src/lib/semlock.c:514
+#: src/lib/rwlock.c:619 src/lib/semlock.c:514
 #, c-format
 msgid "data %02d: value %d, %d updates\n"
 msgstr ""
@@ -7850,41 +7980,41 @@ msgstr ""
 msgid "Resource Lost (e.g. record-lock lost)"
 msgstr ""
 
-#: src/lib/smartall.c:137 src/lib/smartall.c:228 src/lib/smartall.c:243
+#: src/lib/smartall.c:132 src/lib/smartall.c:225 src/lib/smartall.c:240
 msgid "Out of memory\n"
 msgstr ""
 
-#: src/lib/smartall.c:165
+#: src/lib/smartall.c:160
 #, c-format
 msgid "Attempt to free NULL called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:181
+#: src/lib/smartall.c:176
 #, c-format
 msgid "qp->qnext->qprev != qp called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:185
+#: src/lib/smartall.c:180
 #, c-format
 msgid "qp->qprev->qnext != qp called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:194
+#: src/lib/smartall.c:189
 #, c-format
 msgid "Buffer overrun called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:265
+#: src/lib/smartall.c:262
 #, c-format
 msgid "sm_realloc size: %d\n"
 msgstr ""
 
-#: src/lib/smartall.c:306
+#: src/lib/smartall.c:303
 #, c-format
 msgid "sm_realloc %d at %x from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:368
+#: src/lib/smartall.c:365
 #, c-format
 msgid ""
 "\n"
@@ -7893,125 +8023,133 @@ msgid ""
 "  Buffer address with bad links: %lx\n"
 msgstr ""
 
-#: src/lib/smartall.c:379
+#: src/lib/smartall.c:376
 #, c-format
 msgid "Orphaned buffer:  %6u bytes allocated at line %d of %s %s\n"
 msgstr ""
 
-#: src/lib/smartall.c:415
+#: src/lib/smartall.c:412
 #, c-format
 msgid "Damaged buffer found. Called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:445
+#: src/lib/smartall.c:442
 #, c-format
 msgid ""
 "\n"
 "Damaged buffers found at %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:448
+#: src/lib/smartall.c:445
 #, c-format
 msgid "  discovery of bad prev link.\n"
 msgstr ""
 
-#: src/lib/smartall.c:451
+#: src/lib/smartall.c:448
 #, c-format
 msgid "  discovery of bad next link.\n"
 msgstr ""
 
-#: src/lib/smartall.c:454
+#: src/lib/smartall.c:451
 #, c-format
 msgid "  discovery of data overrun.\n"
 msgstr ""
 
-#: src/lib/smartall.c:457
+#: src/lib/smartall.c:454
 #, c-format
 msgid "  Buffer address: %lx\n"
 msgstr ""
 
-#: src/lib/smartall.c:464
+#: src/lib/smartall.c:461
 #, c-format
 msgid "Damaged buffer:  %6u bytes allocated at line %d of %s %s\n"
 msgstr ""
 
-#: src/lib/util.c:187
+#: src/lib/util.c:181
 msgid "Running"
 msgstr ""
 
-#: src/lib/util.c:190
+#: src/lib/util.c:184
 msgid "Blocked"
 msgstr ""
 
-#: src/lib/util.c:200
+#: src/lib/util.c:194
 msgid "Non-fatal error"
 msgstr ""
 
-#: src/lib/util.c:203 src/lib/util.c:270
+#: src/lib/util.c:197 src/lib/util.c:264
 msgid "Canceled"
 msgstr ""
 
-#: src/lib/util.c:206
+#: src/lib/util.c:200
 msgid "Verify differences"
 msgstr ""
 
-#: src/lib/util.c:209
+#: src/lib/util.c:203
 msgid "Waiting on FD"
 msgstr ""
 
-#: src/lib/util.c:212
+#: src/lib/util.c:206
 msgid "Wait on SD"
 msgstr ""
 
-#: src/lib/util.c:215
+#: src/lib/util.c:209
 msgid "Wait for new Volume"
 msgstr ""
 
-#: src/lib/util.c:218
+#: src/lib/util.c:212
 msgid "Waiting for mount"
 msgstr ""
 
-#: src/lib/util.c:221
+#: src/lib/util.c:215
 msgid "Waiting for Storage resource"
 msgstr ""
 
-#: src/lib/util.c:224
+#: src/lib/util.c:218
 msgid "Waiting for Job resource"
 msgstr ""
 
-#: src/lib/util.c:227
+#: src/lib/util.c:221
 msgid "Waiting for Client resource"
 msgstr ""
 
-#: src/lib/util.c:230
+#: src/lib/util.c:224
 msgid "Waiting on Max Jobs"
 msgstr ""
 
-#: src/lib/util.c:233
+#: src/lib/util.c:227
 msgid "Waiting for Start Time"
 msgstr ""
 
-#: src/lib/util.c:236
+#: src/lib/util.c:230
 msgid "Waiting on Priority"
 msgstr ""
 
-#: src/lib/util.c:243
+#: src/lib/util.c:237
 #, c-format
 msgid "Unknown Job termination status=%d"
 msgstr ""
 
-#: src/lib/util.c:267
+#: src/lib/util.c:261
 msgid "Fatal Error"
 msgstr ""
 
-#: src/lib/util.c:273
+#: src/lib/util.c:267
 msgid "Differences"
 msgstr ""
 
-#: src/lib/util.c:276
+#: src/lib/util.c:270
 msgid "Unknown term code"
 msgstr ""
 
+#: src/lib/util.c:298
+msgid "Migrate"
+msgstr ""
+
+#: src/lib/util.c:301
+msgid "Copy"
+msgstr ""
+
 #: src/lib/util.c:304
 msgid "Unknown Type"
 msgstr ""
@@ -8226,311 +8364,247 @@ msgstr ""
 msgid "unknown error"
 msgstr ""
 
-#: src/lib/watchdog.c:74
+#: src/lib/watchdog.c:69
 #, c-format
 msgid "Unable to initialize watchdog lock. ERR=%s\n"
 msgstr ""
 
-#: src/lib/watchdog.c:170
+#: src/lib/watchdog.c:165
 msgid "BUG! register_watchdog called before start_watchdog\n"
 msgstr ""
 
-#: src/lib/watchdog.c:173
+#: src/lib/watchdog.c:168
 #, c-format
 msgid "BUG! Watchdog %p has NULL callback\n"
 msgstr ""
 
-#: src/lib/watchdog.c:176
+#: src/lib/watchdog.c:171
 #, c-format
 msgid "BUG! Watchdog %p has zero interval\n"
 msgstr ""
 
-#: src/lib/watchdog.c:196
+#: src/lib/watchdog.c:191
 msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n"
 msgstr ""
 
-#: src/lib/watchdog.c:313
+#: src/lib/watchdog.c:309
 #, c-format
 msgid "rwl_writelock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/watchdog.c:327
+#: src/lib/watchdog.c:323
 #, c-format
 msgid "rwl_writeunlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:108
-msgid "Could not initialize Python\n"
+#: src/stored/acquire.c:52
+#, c-format
+msgid "Num_writers=%d not zero. Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:113
+#: src/stored/acquire.c:60
 #, c-format
-msgid "Could not Run Python string %s\n"
+msgid "No volumes specified. Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:125
-msgid "Could not initialize Python Job type.\n"
+#: src/stored/acquire.c:92 src/stored/mount.c:73
+#, c-format
+msgid "Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:130
+#: src/stored/acquire.c:103
 #, c-format
-msgid "Could not import Python script %s/%s. Python disabled.\n"
+msgid "Read open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:230
-msgid "Could not create Python Job Object.\n"
+#: src/stored/acquire.c:108
+#, c-format
+msgid "Read open device %s Volume \"%s\" failed: ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:243 src/lib/pythonlib.c:267
+#: src/stored/acquire.c:179 src/stored/mount.c:67
 #, c-format
-msgid "Python function \"%s\" not found.\n"
+msgid "Too many errors trying to mount device %s.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:282
+#: src/stored/acquire.c:188
 #, c-format
-msgid "Unknown Python daemon event %s\n"
+msgid "Ready to read from volume \"%s\" on device %s.\n"
 msgstr ""
 
-#: src/lib/res.c:66
+#: src/stored/acquire.c:232
 #, c-format
-msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
+msgid "Device %s is busy reading.\n"
 msgstr ""
 
-#: src/lib/res.c:76
+#: src/stored/acquire.c:262
 #, c-format
-msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
+msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
 msgstr ""
 
-#: src/lib/tls.c:108
+#: src/stored/acquire.c:281
 #, c-format
 msgid ""
-"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
+"Cannot recycle volume \"%s\" on device %s because it is in use by another "
+"job.\n"
 msgstr ""
 
-#: src/lib/tls.c:155
-msgid "Error initializing SSL context"
+#: src/stored/acquire.c:303
+#, c-format
+msgid "Could not ready device %s for append.\n"
 msgstr ""
 
-#: src/lib/tls.c:176
-msgid "Error loading certificate verification stores"
+#: src/stored/acquire.c:380 src/stored/block.c:354 src/stored/block.c:682
+#: src/stored/block.c:751
+#, c-format
+msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
 msgstr ""
 
-#: src/lib/tls.c:181
-msgid ""
-"Either a certificate file or a directory must be specified as a verification "
-"store\n"
+#: src/stored/acquire.c:422
+#, c-format
+msgid "Alert: %s"
 msgstr ""
 
-#: src/lib/tls.c:192
-msgid "Error loading certificate file"
+#: src/stored/acquire.c:430
+#, c-format
+msgid "3997 Bad alert command: %s: ERR=%s.\n"
 msgstr ""
 
-#: src/lib/tls.c:200
-msgid "Error loading private key"
+#: src/stored/acquire.c:518
+#, c-format
+msgid "Hey! num_writers=%d!!!!\n"
 msgstr ""
 
-#: src/lib/tls.c:208
-msgid "Unable to open DH parameters file"
+#: src/stored/ansi_label.c:83
+#, c-format
+msgid "Read error on device %s in ANSI label. ERR=%s\n"
 msgstr ""
 
-#: src/lib/tls.c:214
-msgid "Unable to load DH parameters from specified file"
+#: src/stored/ansi_label.c:93
+msgid "Insane! End of tape while reading ANSI label.\n"
 msgstr ""
 
-#: src/lib/tls.c:218
-msgid "Failed to set TLS Diffie-Hellman parameters"
+#: src/stored/ansi_label.c:117
+msgid "No VOL1 label while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/lib/tls.c:227
-msgid "Error setting cipher list, no valid ciphers available\n"
+#: src/stored/ansi_label.c:137
+#, c-format
+msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
 msgstr ""
 
-#: src/lib/tls.c:275
-msgid "Peer failed to present a TLS certificate\n"
-msgstr ""
-
-#: src/lib/tls.c:317
-#, c-format
-msgid "Peer %s failed to present a TLS certificate\n"
-msgstr ""
-
-#: src/lib/tls.c:416
-msgid "Error creating file descriptor-based BIO"
-msgstr ""
-
-#: src/lib/tls.c:427
-msgid "Error creating new SSL object"
-msgstr ""
-
-#: src/lib/tls.c:493 src/lib/tls.c:510
-msgid "Connect failure"
-msgstr ""
-
-#: src/lib/tls.c:587 src/lib/tls.c:591
-msgid "TLS shutdown failure."
-msgstr ""
-
-#: src/lib/tls.c:642 src/lib/tls.c:658
-msgid "TLS read/write failure."
-msgstr ""
-
-#: src/lib/tls.c:716 src/lib/tls.c:773 src/stored/dev.c:212
-#: src/stored/dev.c:230 src/stored/dev.c:236 src/stored/stored_conf.c:550
-#, c-format
-msgid "Unable to init mutex: ERR=%s\n"
-msgstr ""
-
-#: src/lib/tls.c:736 src/lib/tls.c:805
-#, c-format
-msgid "Unable to destroy mutex: ERR=%s\n"
-msgstr ""
-
-#: src/lib/tls.c:870
-#, c-format
-msgid "Unable to init OpenSSL threading: ERR=%s\n"
-msgstr ""
-
-#: src/lib/tls.c:880
-msgid "Failed to seed OpenSSL PRNG\n"
-msgstr ""
-
-#: src/lib/tls.c:906
-msgid "Failed to save OpenSSL PRNG\n"
-msgstr ""
-
-#: src/stored/acquire.c:98
-#, c-format
-msgid "Hey! num_writers=%d!!!!\n"
-msgstr ""
-
-#: src/stored/acquire.c:146
-#, c-format
-msgid "Num_writers=%d not zero. Job %d canceled.\n"
-msgstr ""
-
-#: src/stored/acquire.c:154
-#, c-format
-msgid "No volumes specified. Job %d canceled.\n"
+#: src/stored/ansi_label.c:148
+msgid "No HDR1 label while reading ANSI label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:182 src/stored/mount.c:72
+#: src/stored/ansi_label.c:154
 #, c-format
-msgid "Job %d canceled.\n"
+msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
 msgstr ""
 
-#: src/stored/acquire.c:193
-#, c-format
-msgid "Open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
+#: src/stored/ansi_label.c:165
+msgid "No HDR2 label while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:208
-#, c-format
-msgid "Open device %s Volume \"%s\" failed: ERR=%s\n"
+#: src/stored/ansi_label.c:179
+msgid "Unknown or bad ANSI/IBM label record.\n"
 msgstr ""
 
-#: src/stored/acquire.c:273 src/stored/mount.c:66
-#, c-format
-msgid "Too many errors trying to mount device %s.\n"
+#: src/stored/ansi_label.c:186
+msgid "Too many records in while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:282
+#: src/stored/ansi_label.c:285
 #, c-format
-msgid "Ready to read from volume \"%s\" on device %s.\n"
+msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
 msgstr ""
 
-#: src/stored/acquire.c:328 src/stored/reserve.c:664
+#: src/stored/ansi_label.c:302
 #, c-format
-msgid "Device %s is busy reading.\n"
+msgid "Could not write ANSI VOL1 label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/acquire.c:358
+#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
 #, c-format
-msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
+msgid "Could not write ANSI HDR1 label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/acquire.c:377
-#, c-format
-msgid ""
-"Cannot recycle volume \"%s\" on device %s because it is in use by another "
-"job.\n"
+#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
+msgid "Could not write ANSI HDR1 label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:399
+#: src/stored/ansi_label.c:381
 #, c-format
-msgid "Could not ready device %s for append.\n"
+msgid "Error writing EOF to tape. ERR=%s"
 msgstr ""
 
-#: src/stored/acquire.c:464 src/stored/block.c:353 src/stored/block.c:676
-#: src/stored/block.c:744
-#, c-format
-msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
+#: src/stored/ansi_label.c:386
+msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
 msgstr ""
 
-#: src/stored/acquire.c:506
-#, c-format
-msgid "Alert: %s"
+#: src/stored/append.c:49
+msgid "DCR is NULL!!!\n"
 msgstr ""
 
-#: src/stored/acquire.c:514
-#, c-format
-msgid "3997 Bad alert command: %s: ERR=%s.\n"
+#: src/stored/append.c:54
+msgid "DEVICE is NULL!!!\n"
 msgstr ""
 
-#: src/stored/append.c:60
+#: src/stored/append.c:66
 msgid "Unable to set network buffer size.\n"
 msgstr ""
 
-#: src/stored/append.c:73 src/stored/append.c:82 src/stored/append.c:94
-#: src/stored/append.c:249 src/stored/append.c:264 src/stored/append.c:276
-#: src/stored/askdir.c:284 src/stored/askdir.c:285
+#: src/stored/append.c:79 src/stored/append.c:88 src/stored/append.c:100
+#: src/stored/append.c:256 src/stored/append.c:271 src/stored/append.c:283
+#: src/stored/askdir.c:291 src/stored/askdir.c:292
 msgid "NULL Volume name. This shouldn't happen!!!\n"
 msgstr ""
 
-#: src/stored/append.c:88 src/stored/btape.c:1853
+#: src/stored/append.c:94 src/stored/btape.c:1854
 #, c-format
 msgid "Write session label failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:100
+#: src/stored/append.c:106
 #, c-format
 msgid "Network send error to FD. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:137
+#: src/stored/append.c:143
 #, c-format
 msgid "Error reading data header from FD. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:159
+#: src/stored/append.c:165
 #, c-format
 msgid "Malformed data header from FD: %s\n"
 msgstr ""
 
-#: src/stored/append.c:169
+#: src/stored/append.c:175
 msgid "File index from FD not positive or sequential\n"
 msgstr ""
 
-#: src/stored/append.c:199 src/stored/append.c:269 src/stored/spool.c:247
+#: src/stored/append.c:206 src/stored/append.c:276 src/stored/spool.c:248
 #, c-format
 msgid "Fatal append error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:224
+#: src/stored/append.c:231
 #, c-format
 msgid "Error updating file attributes. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:237
+#: src/stored/append.c:244
 #, c-format
 msgid "Network error on data channel. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:258 src/stored/btape.c:1969
+#: src/stored/append.c:265 src/stored/btape.c:1976
 #, c-format
 msgid "Error writting end session label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:271
+#: src/stored/append.c:278
 msgid "Set ok=FALSE after write_block_to_device.\n"
 msgstr ""
 
@@ -8540,41 +8614,34 @@ msgstr ""
 
 #: src/stored/askdir.c:178
 #, c-format
-msgid "Error getting Volume info: %s\n"
+msgid "Error getting Volume info: %s"
 msgstr ""
 
-#: src/stored/askdir.c:289 src/stored/askdir.c:290
+#: src/stored/askdir.c:296 src/stored/askdir.c:297
 msgid "Attempt to update_volume_info in read mode!!!\n"
 msgstr ""
 
-#: src/stored/askdir.c:318
+#: src/stored/askdir.c:325
 #, c-format
 msgid "Didn't get vol info vol=%s: ERR=%s"
 msgstr ""
 
-#: src/stored/askdir.c:349
+#: src/stored/askdir.c:356
 #, c-format
 msgid "Error creating JobMedia record: ERR=%s\n"
 msgstr ""
 
-#: src/stored/askdir.c:356
+#: src/stored/askdir.c:363
 #, c-format
 msgid "Error creating JobMedia record: %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:424
+#: src/stored/askdir.c:429
 #, c-format
 msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n"
 msgstr ""
 
-#: src/stored/askdir.c:452
-#, c-format
-msgid ""
-"Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
-"Use \"mount\" command to release Job.\n"
-msgstr ""
-
-#: src/stored/askdir.c:462
+#: src/stored/askdir.c:442
 #, c-format
 msgid ""
 "Job %s waiting. Cannot find any appendable volumes.\n"
@@ -8584,45 +8651,31 @@ msgid ""
 "    Pool:         %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:486 src/stored/askdir.c:588
+#: src/stored/askdir.c:466 src/stored/askdir.c:548
 #, c-format
 msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:496 src/stored/askdir.c:503
-#, c-format
-msgid "pthread error in mount_next_volume stat=%d ERR=%s\n"
-msgstr ""
-
-#: src/stored/askdir.c:514
-#, c-format
-msgid ""
-"Someone woke me up, but I cannot find any appendable\n"
-"volumes for Job=%s.\n"
+#: src/stored/askdir.c:476
+msgid "pthread error in mount_next_volume.\n"
 msgstr ""
 
-#: src/stored/askdir.c:558
+#: src/stored/askdir.c:508
 msgid "Cannot request another volume: no volume name given.\n"
 msgstr ""
 
-#: src/stored/askdir.c:564
+#: src/stored/askdir.c:514
 #, c-format
 msgid "Job %s canceled while waiting for mount on Storage Device %s.\n"
 msgstr ""
 
-#: src/stored/askdir.c:570
+#: src/stored/askdir.c:529
 #, c-format
 msgid "Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:598
-#, c-format
-msgid "pthread error in mount_volume stat=%d ERR=%s\n"
-msgstr ""
-
-#: src/stored/askdir.c:605
-#, c-format
-msgid "pthread error in mount_next_volume stat=%d: ERR=%s\n"
+#: src/stored/askdir.c:558
+msgid "pthread error in mount_volume\n"
 msgstr ""
 
 #: src/stored/authenticate.c:53
@@ -8650,71 +8703,91 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:95
+#: src/stored/autochanger.c:53
+#, c-format
+msgid "No Changer Name given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:59
+#, c-format
+msgid "No Changer Command given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:72
+#, c-format
+msgid ""
+"Media Type not the same for all devices in changer %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:152
 #, c-format
 msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:102
+#: src/stored/autochanger.c:161
 #, c-format
 msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:108
+#: src/stored/autochanger.c:167
 #, c-format
 msgid "3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:153
+#: src/stored/autochanger.c:208
+msgid "3992 Missing Changer command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:218
 #, c-format
 msgid "3301 Issuing autochanger \"loaded drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:162
+#: src/stored/autochanger.c:227
 #, c-format
 msgid "3302 Autochanger \"loaded drive %d\", result is Slot %d.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:166
+#: src/stored/autochanger.c:231
 #, c-format
 msgid "3302 Autochanger \"loaded drive %d\", result: nothing loaded.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:173
+#: src/stored/autochanger.c:238
 #, c-format
 msgid "3991 Bad autochanger \"loaded drive %d\" command: ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:234 src/stored/autochanger.c:304
+#: src/stored/autochanger.c:297 src/stored/autochanger.c:380
 #, c-format
 msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:247 src/stored/autochanger.c:325
+#: src/stored/autochanger.c:310 src/stored/autochanger.c:401
 #, c-format
 msgid "3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:290
+#: src/stored/autochanger.c:369
 #, c-format
 msgid "Volume %s is in use by device %s\n"
 msgstr ""
 
-#: src/stored/autochanger.c:358
+#: src/stored/autochanger.c:439
 #, c-format
 msgid "3993 Device %s not an autochanger device.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:372
+#: src/stored/autochanger.c:464
 #, c-format
 msgid "3306 Issuing autochanger \"%s\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:377
+#: src/stored/autochanger.c:467
 msgid "3996 Open bpipe failed.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:401
+#: src/stored/autochanger.c:494
 #, c-format
 msgid "Autochanger error: ERR=%s\n"
 msgstr ""
@@ -8743,7 +8816,7 @@ msgstr ""
 msgid "Wrong number of arguments: \n"
 msgstr ""
 
-#: src/stored/bcopy.c:172 src/stored/btape.c:334 src/stored/device.c:273
+#: src/stored/bcopy.c:172 src/stored/btape.c:333 src/stored/device.c:266
 #, c-format
 msgid "dev open failed: %s\n"
 msgstr ""
@@ -8757,7 +8830,7 @@ msgstr ""
 msgid "%u Jobs copied. %u records copied.\n"
 msgstr ""
 
-#: src/stored/bcopy.c:205 src/stored/bscan.c:389
+#: src/stored/bcopy.c:205 src/stored/bscan.c:390
 #, c-format
 msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n"
 msgstr ""
@@ -8771,7 +8844,7 @@ msgid "Volume label not copied.\n"
 msgstr ""
 
 #: src/stored/bcopy.c:235 src/stored/bcopy.c:242 src/stored/bcopy.c:265
-#: src/stored/btape.c:2335
+#: src/stored/btape.c:2342
 #, c-format
 msgid "Cannot fixup device error. %s\n"
 msgstr ""
@@ -8784,8 +8857,8 @@ msgstr ""
 msgid "EOT label not copied.\n"
 msgstr ""
 
-#: src/stored/bcopy.c:290 src/stored/bextract.c:473 src/stored/bls.c:444
-#: src/stored/bscan.c:1227 src/stored/btape.c:2683
+#: src/stored/bcopy.c:287 src/stored/bextract.c:476 src/stored/bls.c:440
+#: src/stored/bscan.c:1231 src/stored/btape.c:2690
 #, c-format
 msgid "Mount Volume \"%s\" on device %s and press return when ready: "
 msgstr ""
@@ -8811,12 +8884,12 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bextract.c:127 src/stored/bls.c:129
+#: src/stored/bextract.c:127 src/stored/bls.c:128
 #, c-format
 msgid "Could not open exclude file: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/bextract.c:142 src/stored/bls.c:143
+#: src/stored/bextract.c:142 src/stored/bls.c:142
 #, c-format
 msgid "Could not open include file: %s, ERR=%s\n"
 msgstr ""
@@ -8846,11 +8919,11 @@ msgstr ""
 msgid "%u files restored.\n"
 msgstr ""
 
-#: src/stored/bextract.c:278 src/stored/bextract.c:444
+#: src/stored/bextract.c:278 src/stored/bextract.c:450
 msgid "Logic error output file should be open but is not.\n"
 msgstr ""
 
-#: src/stored/bextract.c:285 src/stored/bls.c:365 src/stored/bscan.c:645
+#: src/stored/bextract.c:285 src/stored/bls.c:364 src/stored/bscan.c:647
 msgid "Cannot continue.\n"
 msgstr ""
 
@@ -8868,176 +8941,178 @@ msgstr ""
 msgid "===Write error===\n"
 msgstr ""
 
-#: src/stored/bextract.c:435
+#: src/stored/bextract.c:441
 msgid "Got Program Name or Data Stream. Ignored.\n"
 msgstr ""
 
-#: src/stored/block.c:78
+#: src/stored/block.c:79
 #, c-format
 msgid ""
 "Dump block %s %x: size=%d BlkNum=%d\n"
 "               Hdrcksum=%x cksum=%x\n"
 msgstr ""
 
-#: src/stored/block.c:91
+#: src/stored/block.c:92
 #, c-format
 msgid "   Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n"
 msgstr ""
 
-#: src/stored/block.c:147
+#: src/stored/block.c:148
 #, c-format
 msgid "%d block read errors not printed.\n"
 msgstr ""
 
-#: src/stored/block.c:235 src/stored/block.c:251 src/stored/block.c:261
+#: src/stored/block.c:236 src/stored/block.c:252 src/stored/block.c:262
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer "
 "discarded.\n"
 msgstr ""
 
-#: src/stored/block.c:275
+#: src/stored/block.c:276
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Block length %u is insane (too large), probably "
 "due to a bad archive.\n"
 msgstr ""
 
-#: src/stored/block.c:301
+#: src/stored/block.c:302
 #, c-format
 msgid ""
 "Volume data error at %u:%u!\n"
 "Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n"
 msgstr ""
 
-#: src/stored/block.c:409
+#: src/stored/block.c:410
 msgid "Cannot write block. Device at EOM.\n"
 msgstr ""
 
-#: src/stored/block.c:414
+#: src/stored/block.c:415
 msgid "Attempt to write on read-only Volume.\n"
 msgstr ""
 
-#: src/stored/block.c:466
+#: src/stored/block.c:467
 #, c-format
 msgid "User defined maximum volume capacity %s exceeded on device %s.\n"
 msgstr ""
 
-#: src/stored/block.c:481
+#: src/stored/block.c:482
 #, c-format
 msgid "Unable to write EOF. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:507 src/stored/block.c:518
+#: src/stored/block.c:508 src/stored/block.c:519
 msgid "Write block header zeroed.\n"
 msgstr ""
 
-#: src/stored/block.c:536
+#: src/stored/block.c:537
 #, c-format
 msgid "Write error at %u:%u on device %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/block.c:543
+#: src/stored/block.c:544
 #, c-format
 msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"
 msgstr ""
 
-#: src/stored/block.c:618 src/stored/block.c:624
+#: src/stored/block.c:619 src/stored/block.c:625
 #, c-format
 msgid "Backspace file at EOT failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:631
+#: src/stored/block.c:632
 #, c-format
 msgid "Backspace record at EOT failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:648
+#: src/stored/block.c:649
 #, c-format
 msgid "Re-read last block at EOT failed. ERR=%s"
 msgstr ""
 
-#: src/stored/block.c:652
-msgid "Re-read of last block succeeded.\n"
+#: src/stored/block.c:659
+#, c-format
+msgid ""
+"Re-read of last block OK, but block numbers differ. Last block=%u Current "
+"block=%u.\n"
 msgstr ""
 
-#: src/stored/block.c:655
-#, c-format
-msgid "Re-read of last block failed. Last block=%u Current block=%u.\n"
+#: src/stored/block.c:662
+msgid "Re-read of last block succeeded.\n"
 msgstr ""
 
-#: src/stored/block.c:684
+#: src/stored/block.c:690
 #, c-format
 msgid ""
-"Error writing final EOF to tape. This tape may not be readable.\n"
+"Error writing final EOF to tape. This Volume may not be readable.\n"
 "%s"
 msgstr ""
 
-#: src/stored/block.c:790 src/stored/dvd.c:622
+#: src/stored/block.c:800 src/stored/dvd.c:689
 #, c-format
 msgid ""
 "Error while writing, current part number is less than the total number of "
 "parts (%d/%d, device=%s)\n"
 msgstr ""
 
-#: src/stored/block.c:798 src/stored/block.c:908
+#: src/stored/block.c:808 src/stored/block.c:918
 #, c-format
 msgid "Unable to open device next part %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:816
+#: src/stored/block.c:826
 #, c-format
 msgid ""
 "End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
 "free_space_errno=%d, errmsg=%s).\n"
 msgstr ""
 
-#: src/stored/block.c:829
+#: src/stored/block.c:839
 #, c-format
 msgid ""
 "End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
 "free_space_errno=%d).\n"
 msgstr ""
 
-#: src/stored/block.c:883
+#: src/stored/block.c:893
 #, c-format
 msgid "Block buffer size looping problem on device %s\n"
 msgstr ""
 
-#: src/stored/block.c:934
+#: src/stored/block.c:944
 #, c-format
 msgid "Read error at file:blk %u:%u on device %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/block.c:947
+#: src/stored/block.c:957
 #, c-format
 msgid "Read zero bytes at %u:%u on device %s.\n"
 msgstr ""
 
-#: src/stored/block.c:960
+#: src/stored/block.c:970
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Very short block of %d bytes on device %s "
 "discarded.\n"
 msgstr ""
 
-#: src/stored/block.c:985
+#: src/stored/block.c:995
 #, c-format
 msgid "Block length %u is greater than buffer %u. Attempting recovery.\n"
 msgstr ""
 
-#: src/stored/block.c:1004
+#: src/stored/block.c:1014
 #, c-format
 msgid "Setting block buffer size to %u bytes.\n"
 msgstr ""
 
-#: src/stored/block.c:1019
+#: src/stored/block.c:1029
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n"
 msgstr ""
 
-#: src/stored/bls.c:69
+#: src/stored/bls.c:68
 #, c-format
 msgid ""
 "Copyright (C) 2000-2005 Kern Sibbald.\n"
@@ -9061,74 +9136,74 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bls.c:190
+#: src/stored/bls.c:189
 msgid "No archive name specified\n"
 msgstr ""
 
-#: src/stored/bls.c:226
+#: src/stored/bls.c:224
 #, c-format
 msgid ""
 "\n"
 "Warning, this Volume is a continuation of Volume %s\n"
 msgstr ""
 
-#: src/stored/bls.c:268
+#: src/stored/bls.c:267
 #, c-format
 msgid "Got EOM at file %u on device %s, Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/bls.c:279
+#: src/stored/bls.c:278
 #, c-format
 msgid "Mounted Volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/bls.c:281
+#: src/stored/bls.c:280
 #, c-format
-msgid "Got EOF at file %u on device %s, Volume \"%s\"\n"
+msgid "End of file %u on device %s, Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/bls.c:305
+#: src/stored/bls.c:304
 #, c-format
 msgid ""
 "File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
 "s rlen=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:314
+#: src/stored/bls.c:313
 #, c-format
 msgid "Block: %d size=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:381
+#: src/stored/bls.c:380
 #, c-format
 msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:398 src/stored/read_record.c:321
+#: src/stored/bls.c:397 src/stored/read_record.c:322
 msgid "Fresh Volume Label"
 msgstr ""
 
-#: src/stored/bls.c:401 src/stored/read_record.c:324
+#: src/stored/bls.c:400 src/stored/read_record.c:325
 msgid "Volume Label"
 msgstr ""
 
-#: src/stored/bls.c:405 src/stored/label.c:959
+#: src/stored/bls.c:404 src/stored/label.c:969
 msgid "Begin Job Session"
 msgstr ""
 
-#: src/stored/bls.c:409 src/stored/label.c:962
+#: src/stored/bls.c:408 src/stored/label.c:972
 msgid "End Job Session"
 msgstr ""
 
-#: src/stored/bls.c:412
+#: src/stored/bls.c:411
 msgid "End of Medium"
 msgstr ""
 
-#: src/stored/bls.c:415 src/stored/label.c:971
+#: src/stored/bls.c:414 src/stored/label.c:981
 msgid "Unknown"
 msgstr ""
 
-#: src/stored/bls.c:421 src/stored/read_record.c:342
+#: src/stored/bls.c:420 src/stored/read_record.c:343
 #, c-format
 msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n"
 msgstr ""
@@ -9160,12 +9235,12 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bscan.c:234 src/stored/stored.c:266
+#: src/stored/bscan.c:234 src/stored/stored.c:267
 #, c-format
 msgid "No Storage resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/bscan.c:242 src/stored/stored.c:297
+#: src/stored/bscan.c:242 src/stored/stored.c:298
 #, c-format
 msgid "No Working Directory defined in %s. Cannot continue.\n"
 msgstr ""
@@ -9180,7 +9255,7 @@ msgstr ""
 msgid "Working Directory: %s is not a directory. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/bscan.c:268 src/stored/bscan.c:340
+#: src/stored/bscan.c:268 src/stored/bscan.c:341
 #, c-format
 msgid "First Volume Size = %sn"
 msgstr ""
@@ -9199,235 +9274,235 @@ msgstr ""
 msgid "Create JobMedia for Job %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:325
+#: src/stored/bscan.c:326
 #, c-format
 msgid "Could not create JobMedia record for Volume=%s Job=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:381
+#: src/stored/bscan.c:382
 #, c-format
 msgid "done: %d%%\n"
 msgstr ""
 
-#: src/stored/bscan.c:405
+#: src/stored/bscan.c:406
 msgid "Volume is prelabeled. This tape cannot be scanned.\n"
 msgstr ""
 
-#: src/stored/bscan.c:417
+#: src/stored/bscan.c:418
 #, c-format
 msgid "Pool record for %s found in DB.\n"
 msgstr ""
 
-#: src/stored/bscan.c:421
+#: src/stored/bscan.c:422
 #, c-format
 msgid "VOL_LABEL: Pool record not found for Pool: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:427
+#: src/stored/bscan.c:428
 #, c-format
 msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:431
+#: src/stored/bscan.c:432
 #, c-format
 msgid "Pool type \"%s\" is OK.\n"
 msgstr ""
 
-#: src/stored/bscan.c:441
+#: src/stored/bscan.c:442
 #, c-format
 msgid "Media record for %s found in DB.\n"
 msgstr ""
 
-#: src/stored/bscan.c:448
+#: src/stored/bscan.c:449
 #, c-format
 msgid "VOL_LABEL: Media record not found for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:455
+#: src/stored/bscan.c:456
 #, c-format
 msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:459
+#: src/stored/bscan.c:460
 #, c-format
 msgid "Media type \"%s\" is OK.\n"
 msgstr ""
 
-#: src/stored/bscan.c:468
+#: src/stored/bscan.c:469
 #, c-format
 msgid "VOL_LABEL: OK for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:475
+#: src/stored/bscan.c:476
 #, c-format
 msgid "%d \"errors\" ignored before first Start of Session record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:486
+#: src/stored/bscan.c:487
 #, c-format
 msgid "SOS_LABEL: Found Job record for JobId: %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:491
+#: src/stored/bscan.c:492
 #, c-format
 msgid "SOS_LABEL: Job record not found for JobId: %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:531
+#: src/stored/bscan.c:532
 #, c-format
 msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:537
+#: src/stored/bscan.c:538
 #, c-format
 msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:543
+#: src/stored/bscan.c:544
 #, c-format
 msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:561 src/stored/bscan.c:1007
+#: src/stored/bscan.c:562 src/stored/bscan.c:1013
 #, c-format
 msgid "Could not find SessId=%d SessTime=%d for EOS record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:604
+#: src/stored/bscan.c:606
 #, c-format
 msgid "Could not update job record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:615
+#: src/stored/bscan.c:617
 #, c-format
 msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:627
+#: src/stored/bscan.c:629
 #, c-format
 msgid "Could not find Job for SessId=%d SessTime=%d record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:663
+#: src/stored/bscan.c:665
 #, c-format
 msgid "%s file records. At file:blk=%s:%s bytes=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:706
+#: src/stored/bscan.c:708
 #, c-format
 msgid "Got MD5 record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:715
+#: src/stored/bscan.c:717
 #, c-format
 msgid "Got SHA1 record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:723
+#: src/stored/bscan.c:725
 #, c-format
 msgid "Got Prog Names Stream: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:729
+#: src/stored/bscan.c:731
 msgid "Got Prog Data Stream record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:733
+#: src/stored/bscan.c:735
 #, c-format
 msgid "Unknown stream type!!! stream=%d data=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:793
+#: src/stored/bscan.c:799
 #, c-format
 msgid "Could not create File Attributes record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:799
+#: src/stored/bscan.c:805
 #, c-format
 msgid "Created File record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:836
+#: src/stored/bscan.c:842
 #, c-format
 msgid "Could not create media record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:840 src/stored/bscan.c:861
+#: src/stored/bscan.c:846 src/stored/bscan.c:867
 #, c-format
 msgid "Could not update media record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:844
+#: src/stored/bscan.c:850
 #, c-format
 msgid "Created Media record for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:865
+#: src/stored/bscan.c:871
 #, c-format
 msgid "Updated Media record at end of Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:882
+#: src/stored/bscan.c:888
 #, c-format
 msgid "Could not create pool record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:886
+#: src/stored/bscan.c:892
 #, c-format
 msgid "Created Pool record for Pool: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:906
+#: src/stored/bscan.c:912
 #, c-format
 msgid "Created Client record for Client: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:923
+#: src/stored/bscan.c:929
 #, c-format
 msgid "Fileset \"%s\" already exists.\n"
 msgstr ""
 
-#: src/stored/bscan.c:927
+#: src/stored/bscan.c:933
 #, c-format
 msgid "Could not create FileSet record \"%s\". ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:932
+#: src/stored/bscan.c:938
 #, c-format
 msgid "Created FileSet record \"%s\"\n"
 msgstr ""
 
-#: src/stored/bscan.c:979
+#: src/stored/bscan.c:985
 #, c-format
 msgid "Could not create JobId record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:985
+#: src/stored/bscan.c:991
 #, c-format
 msgid "Could not update job start record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:988
+#: src/stored/bscan.c:994
 #, c-format
 msgid "Created new JobId=%u record for original JobId=%u\n"
 msgstr ""
 
-#: src/stored/bscan.c:1038
+#: src/stored/bscan.c:1044
 #, c-format
 msgid "Could not update JobId=%u record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1043
+#: src/stored/bscan.c:1049
 #, c-format
 msgid "Updated Job termination record for JobId=%u TermStat=%c\n"
 msgstr ""
 
-#: src/stored/bscan.c:1065
+#: src/stored/bscan.c:1071
 #, c-format
 msgid "Job Termination code: %d"
 msgstr ""
 
-#: src/stored/bscan.c:1070
+#: src/stored/bscan.c:1076
 #, c-format
 msgid ""
 "%s\n"
@@ -9447,27 +9522,27 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bscan.c:1134
+#: src/stored/bscan.c:1140
 #, c-format
 msgid "Could not create JobMedia record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1138
+#: src/stored/bscan.c:1144
 #, c-format
 msgid "Created JobMedia record JobId %d, MediaId %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:1154
+#: src/stored/bscan.c:1160
 #, c-format
 msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:1168
+#: src/stored/bscan.c:1174
 #, c-format
 msgid "Could not add MD5/SHA1 to File record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1173
+#: src/stored/bscan.c:1179
 msgid "Updated MD5/SHA1 record\n"
 msgstr ""
 
@@ -9518,140 +9593,140 @@ msgstr ""
 msgid "Improper number of arguments specified.\n"
 msgstr ""
 
-#: src/stored/btape.c:340
+#: src/stored/btape.c:338
 #, c-format
 msgid "open device %s: OK\n"
 msgstr ""
 
-#: src/stored/btape.c:361
+#: src/stored/btape.c:359
 msgid "Enter Volume Name: "
 msgstr ""
 
-#: src/stored/btape.c:368
+#: src/stored/btape.c:366
 #, c-format
 msgid "Device open failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:373
+#: src/stored/btape.c:371
 #, c-format
 msgid "Wrote Volume label for volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/btape.c:387
+#: src/stored/btape.c:385
 msgid "Volume has no label.\n"
 msgstr ""
 
-#: src/stored/btape.c:390
+#: src/stored/btape.c:388
 msgid "Volume label read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:393
+#: src/stored/btape.c:391
 #, c-format
 msgid "I/O error on device: ERR=%s"
 msgstr ""
 
-#: src/stored/btape.c:396
+#: src/stored/btape.c:394
 msgid "Volume name error\n"
 msgstr ""
 
-#: src/stored/btape.c:399
+#: src/stored/btape.c:397
 #, c-format
 msgid "Error creating label. ERR=%s"
 msgstr ""
 
-#: src/stored/btape.c:402
+#: src/stored/btape.c:400
 msgid "Volume version error.\n"
 msgstr ""
 
-#: src/stored/btape.c:405
+#: src/stored/btape.c:403
 msgid "Bad Volume label type.\n"
 msgstr ""
 
-#: src/stored/btape.c:408
+#: src/stored/btape.c:406
 msgid "Unknown error.\n"
 msgstr ""
 
-#: src/stored/btape.c:426
+#: src/stored/btape.c:424
 #, c-format
 msgid "Bad status from load. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:428
+#: src/stored/btape.c:426
 #, c-format
 msgid "Loaded %s\n"
 msgstr ""
 
-#: src/stored/btape.c:437 src/stored/btape.c:777 src/stored/btape.c:819
-#: src/stored/btape.c:889 src/stored/btape.c:931 src/stored/btape.c:1200
+#: src/stored/btape.c:435 src/stored/btape.c:775 src/stored/btape.c:817
+#: src/stored/btape.c:887 src/stored/btape.c:929 src/stored/btape.c:1198
 #, c-format
 msgid "Bad status from rewind. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:440 src/stored/btape.c:1208
+#: src/stored/btape.c:438 src/stored/btape.c:1206
 #, c-format
 msgid "Rewound %s\n"
 msgstr ""
 
-#: src/stored/btape.c:467 src/stored/btape.c:1212
+#: src/stored/btape.c:465 src/stored/btape.c:1210
 #, c-format
 msgid "Bad status from weof %d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:471
+#: src/stored/btape.c:469
 #, c-format
 msgid "Wrote 1 EOF to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:474
+#: src/stored/btape.c:472
 #, c-format
 msgid "Wrote %d EOFs to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:492
+#: src/stored/btape.c:490
 msgid "Moved to end of medium.\n"
 msgstr ""
 
-#: src/stored/btape.c:519
+#: src/stored/btape.c:517
 #, c-format
 msgid "Bad status from bsf. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:521
+#: src/stored/btape.c:519
 #, c-format
 msgid "Backspaced %d file%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:538
+#: src/stored/btape.c:536
 #, c-format
 msgid "Bad status from bsr. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:540
+#: src/stored/btape.c:538
 #, c-format
 msgid "Backspaced %d record%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:550 src/stored/status.c:220
+#: src/stored/btape.c:548 src/stored/status.c:227
 #, c-format
 msgid "Configured device capabilities:\n"
 msgstr ""
 
-#: src/stored/btape.c:568
+#: src/stored/btape.c:566
 #, c-format
 msgid "Device status:\n"
 msgstr ""
 
-#: src/stored/btape.c:582 src/stored/status.c:252
+#: src/stored/btape.c:580 src/stored/status.c:259
 #, c-format
 msgid "Device parameters:\n"
 msgstr ""
 
-#: src/stored/btape.c:587
+#: src/stored/btape.c:585
 #, c-format
 msgid "Status:\n"
 msgstr ""
 
-#: src/stored/btape.c:602
+#: src/stored/btape.c:600
 msgid ""
 "Test writting larger and larger records.\n"
 "This is a torture test for records.\n"
@@ -9660,20 +9735,20 @@ msgid ""
 "plus the header exceeds the block size (by default about 64K)\n"
 msgstr ""
 
-#: src/stored/btape.c:610 src/stored/btape.c:1814
+#: src/stored/btape.c:608 src/stored/btape.c:1815
 msgid "Command aborted.\n"
 msgstr ""
 
-#: src/stored/btape.c:626
+#: src/stored/btape.c:624
 #, c-format
 msgid "Block %d i=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:652
+#: src/stored/btape.c:650
 msgid "Skipping read backwards test because BSR turned off.\n"
 msgstr ""
 
-#: src/stored/btape.c:656
+#: src/stored/btape.c:654
 msgid ""
 "\n"
 "=== Write, backup, and re-read test ===\n"
@@ -9687,73 +9762,73 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:669 src/stored/btape.c:680 src/stored/btape.c:691
-#: src/stored/btape.c:789 src/stored/btape.c:805 src/stored/btape.c:901
-#: src/stored/btape.c:917 src/stored/btape.c:1526 src/stored/btape.c:2400
+#: src/stored/btape.c:667 src/stored/btape.c:678 src/stored/btape.c:689
+#: src/stored/btape.c:787 src/stored/btape.c:803 src/stored/btape.c:899
+#: src/stored/btape.c:915 src/stored/btape.c:1524 src/stored/btape.c:2407
 msgid "Error writing record to block.\n"
 msgstr ""
 
-#: src/stored/btape.c:673 src/stored/btape.c:684 src/stored/btape.c:695
-#: src/stored/btape.c:793 src/stored/btape.c:809 src/stored/btape.c:905
-#: src/stored/btape.c:921 src/stored/btape.c:1530 src/stored/btape.c:2404
+#: src/stored/btape.c:671 src/stored/btape.c:682 src/stored/btape.c:693
+#: src/stored/btape.c:791 src/stored/btape.c:807 src/stored/btape.c:903
+#: src/stored/btape.c:919 src/stored/btape.c:1528 src/stored/btape.c:2411
 msgid "Error writing block to device.\n"
 msgstr ""
 
-#: src/stored/btape.c:676
+#: src/stored/btape.c:674
 #, c-format
 msgid "Wrote first record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:687
+#: src/stored/btape.c:685
 #, c-format
 msgid "Wrote second record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:698
+#: src/stored/btape.c:696
 #, c-format
 msgid "Wrote third record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:705 src/stored/btape.c:710
+#: src/stored/btape.c:703 src/stored/btape.c:708
 #, c-format
 msgid "Backspace file failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:714
+#: src/stored/btape.c:712
 msgid "Backspaced over EOF OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:716
+#: src/stored/btape.c:714
 #, c-format
 msgid "Backspace record failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:719
+#: src/stored/btape.c:717
 msgid "Backspace record OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:722 src/stored/btape.c:728
+#: src/stored/btape.c:720 src/stored/btape.c:726
 #, c-format
 msgid "Read block failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:733
+#: src/stored/btape.c:731
 msgid "Bad data in record. Test failed!\n"
 msgstr ""
 
-#: src/stored/btape.c:737
+#: src/stored/btape.c:735
 msgid ""
 "\n"
 "Block re-read correct. Test succeeded!\n"
 msgstr ""
 
-#: src/stored/btape.c:738
+#: src/stored/btape.c:736
 msgid ""
 "=== End Write, backup, and re-read test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:745
+#: src/stored/btape.c:743
 msgid ""
 "This is not terribly serious since Bacula only uses\n"
 "this function to verify the last block written to the\n"
@@ -9765,7 +9840,7 @@ msgid ""
 "to your Storage daemon's Device resource definition.\n"
 msgstr ""
 
-#: src/stored/btape.c:769
+#: src/stored/btape.c:767
 msgid ""
 "\n"
 "=== Write, rewind, and re-read test ===\n"
@@ -9778,46 +9853,46 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:797 src/stored/btape.c:813 src/stored/btape.c:909
-#: src/stored/btape.c:925
+#: src/stored/btape.c:795 src/stored/btape.c:811 src/stored/btape.c:907
+#: src/stored/btape.c:923
 #, c-format
 msgid "Wrote 1000 blocks of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:822 src/stored/btape.c:934
+#: src/stored/btape.c:820 src/stored/btape.c:932
 msgid "Rewind OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:829 src/stored/btape.c:983
+#: src/stored/btape.c:827 src/stored/btape.c:981
 msgid "Got EOF on tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:834
+#: src/stored/btape.c:832
 #, c-format
 msgid "Read block %d failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:840
+#: src/stored/btape.c:838
 #, c-format
 msgid "Read record failed. Block %d! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:846 src/stored/btape.c:1013
+#: src/stored/btape.c:844 src/stored/btape.c:1011
 #, c-format
 msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"
 msgstr ""
 
-#: src/stored/btape.c:853
+#: src/stored/btape.c:851
 msgid "1000 blocks re-read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:856 src/stored/btape.c:1020
+#: src/stored/btape.c:854 src/stored/btape.c:1018
 msgid ""
 "=== Test Succeeded. End Write, rewind, and re-read test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:881
+#: src/stored/btape.c:879
 msgid ""
 "\n"
 "=== Write, rewind, and position test ===\n"
@@ -9830,23 +9905,23 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:974
+#: src/stored/btape.c:972
 #, c-format
 msgid "Reposition to file:block %d:%d\n"
 msgstr ""
 
-#: src/stored/btape.c:976
+#: src/stored/btape.c:974
 msgid "Reposition error.\n"
 msgstr ""
 
-#: src/stored/btape.c:989
+#: src/stored/btape.c:987
 #, c-format
 msgid ""
 "Read block %d failed! file=%d blk=%d. ERR=%s\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:991
+#: src/stored/btape.c:989
 msgid ""
 "This may be because the tape drive block size is not\n"
 " set to variable blocking as normally used by Bacula.\n"
@@ -9860,17 +9935,17 @@ msgid ""
 " in your Device resource.\n"
 msgstr ""
 
-#: src/stored/btape.c:1007
+#: src/stored/btape.c:1005
 #, c-format
 msgid "Read record failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1018
+#: src/stored/btape.c:1016
 #, c-format
 msgid "Block %d re-read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:1039
+#: src/stored/btape.c:1037
 msgid ""
 "\n"
 "\n"
@@ -9884,58 +9959,58 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1063
+#: src/stored/btape.c:1061
 msgid "Now moving to end of medium.\n"
 msgstr ""
 
-#: src/stored/btape.c:1065 src/stored/btape.c:1295
+#: src/stored/btape.c:1063 src/stored/btape.c:1293
 #, c-format
 msgid "We should be in file 3. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1066 src/stored/btape.c:1084 src/stored/btape.c:1284
-#: src/stored/btape.c:1296 src/stored/btape.c:1309 src/stored/btape.c:1326
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
 msgid "This is correct!"
 msgstr ""
 
-#: src/stored/btape.c:1066 src/stored/btape.c:1084 src/stored/btape.c:1284
-#: src/stored/btape.c:1296 src/stored/btape.c:1309 src/stored/btape.c:1326
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
 msgid "This is NOT correct!!!!"
 msgstr ""
 
-#: src/stored/btape.c:1072
+#: src/stored/btape.c:1070
 msgid ""
 "\n"
 "Now the important part, I am going to attempt to append to the tape.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1079
+#: src/stored/btape.c:1077
 msgid ""
 "Done appending, there should be no I/O errors\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1080
+#: src/stored/btape.c:1078
 msgid "Doing Bacula scan of blocks:\n"
 msgstr ""
 
-#: src/stored/btape.c:1082
+#: src/stored/btape.c:1080
 msgid "End scanning the tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:1083 src/stored/btape.c:1308
+#: src/stored/btape.c:1081 src/stored/btape.c:1306
 #, c-format
 msgid "We should be in file 4. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1108
+#: src/stored/btape.c:1106
 msgid ""
 "\n"
 "Autochanger enabled, but no name or no command device specified.\n"
 msgstr ""
 
-#: src/stored/btape.c:1112
+#: src/stored/btape.c:1110
 msgid ""
 "\n"
 "Ah, I see you have an autochanger configured.\n"
@@ -9943,13 +10018,13 @@ msgid ""
 " that I can write on in Slot 1.\n"
 msgstr ""
 
-#: src/stored/btape.c:1115
+#: src/stored/btape.c:1113
 msgid ""
 "\n"
 "Do you wish to continue with the Autochanger test? (y/n): "
 msgstr ""
 
-#: src/stored/btape.c:1122
+#: src/stored/btape.c:1120
 msgid ""
 "\n"
 "\n"
@@ -9957,74 +10032,74 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1131
+#: src/stored/btape.c:1129
 msgid "3301 Issuing autochanger \"loaded\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1140
+#: src/stored/btape.c:1138
 #, c-format
 msgid "3991 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1141
+#: src/stored/btape.c:1139
 #, c-format
 msgid "3991 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1145
+#: src/stored/btape.c:1143
 #, c-format
 msgid "Slot %d loaded. I am going to unload it.\n"
 msgstr ""
 
-#: src/stored/btape.c:1147
+#: src/stored/btape.c:1145
 msgid "Nothing loaded in the drive. OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:1155
+#: src/stored/btape.c:1153
 #, c-format
 msgid "3302 Issuing autochanger \"unload %d %d\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1160
+#: src/stored/btape.c:1158
 #, c-format
 msgid "unload status=%s %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1160
+#: src/stored/btape.c:1158
 msgid "Bad"
 msgstr ""
 
-#: src/stored/btape.c:1163
+#: src/stored/btape.c:1161
 #, c-format
 msgid "3992 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1164
+#: src/stored/btape.c:1162
 #, c-format
 msgid "3992 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1174
+#: src/stored/btape.c:1172
 #, c-format
 msgid "3303 Issuing autochanger \"load %d %d\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1182
+#: src/stored/btape.c:1180
 #, c-format
 msgid "3303 Autochanger \"load %d %d\" status is OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:1186
+#: src/stored/btape.c:1184
 #, c-format
 msgid "3993 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1187
+#: src/stored/btape.c:1185
 #, c-format
 msgid "3993 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1202
+#: src/stored/btape.c:1200
 msgid ""
 "\n"
 "The test failed, probably because you need to put\n"
@@ -10032,12 +10107,12 @@ msgid ""
 "Adding a 30 second sleep and trying again ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1215
+#: src/stored/btape.c:1213
 #, c-format
 msgid "Wrote EOF to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1219
+#: src/stored/btape.c:1217
 #, c-format
 msgid ""
 "\n"
@@ -10049,18 +10124,18 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1224
+#: src/stored/btape.c:1222
 msgid ""
 "\n"
 "The test autochanger worked!!\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1235
+#: src/stored/btape.c:1233
 msgid "You must correct this error or the Autochanger will not work.\n"
 msgstr ""
 
-#: src/stored/btape.c:1253
+#: src/stored/btape.c:1251
 msgid ""
 "\n"
 "\n"
@@ -10072,30 +10147,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1278
+#: src/stored/btape.c:1276
 msgid "Now forward spacing 1 file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1280 src/stored/btape.c:1292 src/stored/btape.c:1305
-#: src/stored/btape.c:1323 src/stored/btape.c:1492
+#: src/stored/btape.c:1278 src/stored/btape.c:1290 src/stored/btape.c:1303
+#: src/stored/btape.c:1321 src/stored/btape.c:1490
 #, c-format
 msgid "Bad status from fsr. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1283
+#: src/stored/btape.c:1281
 #, c-format
 msgid "We should be in file 1. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1290
+#: src/stored/btape.c:1288
 msgid "Now forward spacing 2 files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1303
+#: src/stored/btape.c:1301
 msgid "Now forward spacing 4 files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1315
+#: src/stored/btape.c:1313
 msgid ""
 "The test worked this time. Please add:\n"
 "\n"
@@ -10104,35 +10179,35 @@ msgid ""
 "to your Device resource for this drive.\n"
 msgstr ""
 
-#: src/stored/btape.c:1321
+#: src/stored/btape.c:1319
 msgid "Now forward spacing 1 more file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1325
+#: src/stored/btape.c:1323
 #, c-format
 msgid "We should be in file 5. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1330
+#: src/stored/btape.c:1328
 msgid ""
 "\n"
 "=== End Forward space files test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1334
+#: src/stored/btape.c:1332
 msgid ""
 "\n"
 "The forward space file test failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1336
+#: src/stored/btape.c:1334
 msgid ""
 "You have Fast Forward Space File enabled.\n"
 "I am turning it off then retrying the test.\n"
 msgstr ""
 
-#: src/stored/btape.c:1342
+#: src/stored/btape.c:1340
 msgid ""
 "You must correct this error or Bacula will not work.\n"
 "Some systems, e.g. OpenBSD, require you to set\n"
@@ -10140,7 +10215,7 @@ msgid ""
 "in your device resource. Use with caution.\n"
 msgstr ""
 
-#: src/stored/btape.c:1374
+#: src/stored/btape.c:1372
 msgid ""
 "\n"
 "Append test failed. Attempting again.\n"
@@ -10150,7 +10225,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1382
+#: src/stored/btape.c:1380
 msgid ""
 "\n"
 "\n"
@@ -10162,14 +10237,14 @@ msgid ""
 "to your Device resource in the Storage conf file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1389
+#: src/stored/btape.c:1387
 msgid ""
 "\n"
 "\n"
 "That appears *NOT* to have corrected the problem.\n"
 msgstr ""
 
-#: src/stored/btape.c:1394
+#: src/stored/btape.c:1392
 msgid ""
 "\n"
 "\n"
@@ -10177,7 +10252,7 @@ msgid ""
 "Setting \"BSF at EOM = yes\" and retrying append test.\n"
 msgstr ""
 
-#: src/stored/btape.c:1399
+#: src/stored/btape.c:1397
 msgid ""
 "\n"
 "\n"
@@ -10190,7 +10265,7 @@ msgid ""
 "to your Device resource in the Storage conf file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1410
+#: src/stored/btape.c:1408
 msgid ""
 "\n"
 "Append test failed.\n"
@@ -10217,7 +10292,7 @@ msgid ""
 "in your device resource. Use with caution.\n"
 msgstr ""
 
-#: src/stored/btape.c:1431
+#: src/stored/btape.c:1429
 msgid ""
 "\n"
 "The above Bacula scan should have output identical to what follows.\n"
@@ -10241,116 +10316,116 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1470
+#: src/stored/btape.c:1468
 #, c-format
 msgid "Bad status from fsf. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1474
+#: src/stored/btape.c:1472
 msgid "Forward spaced 1 file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1477
+#: src/stored/btape.c:1475
 #, c-format
 msgid "Forward spaced %d files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1496
+#: src/stored/btape.c:1494
 msgid "Forward spaced 1 record.\n"
 msgstr ""
 
-#: src/stored/btape.c:1499
+#: src/stored/btape.c:1497
 #, c-format
 msgid "Forward spaced %d records.\n"
 msgstr ""
 
-#: src/stored/btape.c:1533
+#: src/stored/btape.c:1531
 #, c-format
 msgid "Wrote one record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:1535
+#: src/stored/btape.c:1533
 msgid "Wrote block to device.\n"
 msgstr ""
 
-#: src/stored/btape.c:1550
+#: src/stored/btape.c:1548
 msgid "Enter length to read: "
 msgstr ""
 
-#: src/stored/btape.c:1555
+#: src/stored/btape.c:1553
 msgid "Bad length entered, using default of 1024 bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:1564
+#: src/stored/btape.c:1562
 #, c-format
 msgid "Read of %d bytes gives stat=%d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1587 src/stored/btape.c:1636
+#: src/stored/btape.c:1585 src/stored/btape.c:1634
 #, c-format
 msgid "End of tape\n"
 msgstr ""
 
-#: src/stored/btape.c:1592
+#: src/stored/btape.c:1590
 #, c-format
 msgid "Starting scan at file %u\n"
 msgstr ""
 
-#: src/stored/btape.c:1597 src/stored/dev.c:1238
+#: src/stored/btape.c:1595 src/stored/dev.c:1229
 #, c-format
 msgid "read error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:1599
+#: src/stored/btape.c:1597
 #, c-format
 msgid "Bad status from read %d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1602 src/stored/btape.c:1616 src/stored/btape.c:1679
-#: src/stored/btape.c:1691 src/stored/btape.c:1704 src/stored/btape.c:1720
+#: src/stored/btape.c:1600 src/stored/btape.c:1614 src/stored/btape.c:1678
+#: src/stored/btape.c:1690 src/stored/btape.c:1703 src/stored/btape.c:1719
 #, c-format
 msgid "1 block of %d bytes in file %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1605 src/stored/btape.c:1619 src/stored/btape.c:1682
-#: src/stored/btape.c:1694 src/stored/btape.c:1707 src/stored/btape.c:1723
+#: src/stored/btape.c:1603 src/stored/btape.c:1617 src/stored/btape.c:1681
+#: src/stored/btape.c:1693 src/stored/btape.c:1706 src/stored/btape.c:1722
 #, c-format
 msgid "%d blocks of %d bytes in file %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1627 src/stored/btape.c:1698
+#: src/stored/btape.c:1625 src/stored/btape.c:1697
 #, c-format
 msgid "End of File mark.\n"
 msgstr ""
 
-#: src/stored/btape.c:1648 src/stored/btape.c:1751
+#: src/stored/btape.c:1646 src/stored/btape.c:1750
 #, c-format
 msgid "Total files=%d, blocks=%d, bytes = %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1711
+#: src/stored/btape.c:1710
 #, c-format
 msgid "Short block read.\n"
 msgstr ""
 
-#: src/stored/btape.c:1714
+#: src/stored/btape.c:1713
 #, c-format
 msgid "Error reading block. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1738
+#: src/stored/btape.c:1737
 #, c-format
 msgid ""
 "Blk_block: %u dev_blk=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
 "s rlen=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:1760
+#: src/stored/btape.c:1759
 #, c-format
 msgid "Device status: %u. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1788
+#: src/stored/btape.c:1789
 msgid ""
 "\n"
 "This command simulates Bacula writing to a tape.\n"
@@ -10375,95 +10450,98 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1805
+#: src/stored/btape.c:1806
 msgid ""
 "Do you want to run the simplified test (s) with one tape\n"
 "or the complete multiple tape (m) test: (s/m) "
 msgstr ""
 
-#: src/stored/btape.c:1808
+#: src/stored/btape.c:1809
 msgid "Simple test (single tape) selected.\n"
 msgstr ""
 
-#: src/stored/btape.c:1811
+#: src/stored/btape.c:1812
 msgid "Multiple tape test selected.\n"
 msgstr ""
 
-#: src/stored/btape.c:1827
+#: src/stored/btape.c:1828
 msgid "Rewind failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1830
+#: src/stored/btape.c:1831
 msgid "Write EOF failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1857
+#: src/stored/btape.c:1858
 msgid "Wrote Start of Session label.\n"
 msgstr ""
 
-#: src/stored/btape.c:1886
-msgid "Begin writing Bacula records to tape ...\n"
+#: src/stored/btape.c:1889
+#, c-format
+msgid "%s Begin writing Bacula records to tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1888
-msgid "Begin writing Bacula records to first tape ...\n"
+#: src/stored/btape.c:1891
+#, c-format
+msgid "%s Begin writing Bacula records to first tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1928
+#: src/stored/btape.c:1932
 #, c-format
 msgid "Wrote blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:1935
-msgid "Flush block, write EOF\n"
+#: src/stored/btape.c:1942
+#, c-format
+msgid "%s Flush block, write EOF\n"
 msgstr ""
 
-#: src/stored/btape.c:1946
+#: src/stored/btape.c:1953
 msgid "Not OK\n"
 msgstr ""
 
-#: src/stored/btape.c:1974
+#: src/stored/btape.c:1981
 msgid "Set ok=false after write_block_to_device.\n"
 msgstr ""
 
-#: src/stored/btape.c:1977
+#: src/stored/btape.c:1984
 msgid "Wrote End of Session label.\n"
 msgstr ""
 
-#: src/stored/btape.c:2001
+#: src/stored/btape.c:2008
 #, c-format
 msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2005
+#: src/stored/btape.c:2012
 #, c-format
 msgid "Could not create state file: %s ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2010
+#: src/stored/btape.c:2020
 #, c-format
 msgid ""
 "\n"
 "\n"
-"Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
+"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2014
+#: src/stored/btape.c:2024
 #, c-format
 msgid ""
 "\n"
 "\n"
-"Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
+"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2053
+#: src/stored/btape.c:2063
 msgid ""
 "\n"
 "The state file level has changed. You must redo\n"
 "the fill command.\n"
 msgstr ""
 
-#: src/stored/btape.c:2059
+#: src/stored/btape.c:2069
 #, c-format
 msgid ""
 "\n"
@@ -10471,95 +10549,95 @@ msgid ""
 "You must redo the fill command.\n"
 msgstr ""
 
-#: src/stored/btape.c:2101
+#: src/stored/btape.c:2111
 msgid "Mount first tape. Press enter when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2125
-msgid "Reading the first 10000 records.\n"
+#: src/stored/btape.c:2131
+msgid "Rewinding.\n"
+msgstr ""
+
+#: src/stored/btape.c:2136
+#, c-format
+msgid "Reading the first 10000 records from %u:%u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2128 src/stored/btape.c:2195
+#: src/stored/btape.c:2140 src/stored/btape.c:2207
 #, c-format
 msgid "Reposition from %u:%u to %u:%u\n"
 msgstr ""
 
-#: src/stored/btape.c:2131 src/stored/btape.c:2182 src/stored/btape.c:2198
+#: src/stored/btape.c:2143 src/stored/btape.c:2194 src/stored/btape.c:2210
 #, c-format
 msgid "Reposition error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2134
+#: src/stored/btape.c:2146
 #, c-format
 msgid "Reading block %u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2136 src/stored/btape.c:2187 src/stored/btape.c:2203
+#: src/stored/btape.c:2148 src/stored/btape.c:2199 src/stored/btape.c:2215
 #, c-format
 msgid "Error reading block: ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2141
+#: src/stored/btape.c:2153
 msgid ""
 "\n"
 "The last block on the tape matches. Test succeeded.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2143
+#: src/stored/btape.c:2155
 msgid ""
 "\n"
 "The last block of the first tape matches.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2168
+#: src/stored/btape.c:2180
 msgid "Mount second tape. Press enter when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2180
+#: src/stored/btape.c:2192
 #, c-format
 msgid "Reposition from %u:%u to 0:1\n"
 msgstr ""
 
-#: src/stored/btape.c:2185 src/stored/btape.c:2201
+#: src/stored/btape.c:2197 src/stored/btape.c:2213
 #, c-format
 msgid "Reading block %d.\n"
 msgstr ""
 
-#: src/stored/btape.c:2191
+#: src/stored/btape.c:2203
 msgid ""
 "\n"
 "The first block on the second tape matches.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2207
+#: src/stored/btape.c:2219
 msgid ""
 "\n"
 "The last block on the second tape matches. Test succeeded.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2221
+#: src/stored/btape.c:2234
 #, c-format
-msgid "ERROR! device at %d:%d count=%d\n"
+msgid "10000 records read now at %d:%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2227
-#, c-format
-msgid "1000 records read now at %d:%d\n"
-msgstr ""
-
-#: src/stored/btape.c:2250 src/stored/btape.c:2261 src/stored/btape.c:2309
+#: src/stored/btape.c:2257 src/stored/btape.c:2268 src/stored/btape.c:2316
 msgid "Last block written"
 msgstr ""
 
-#: src/stored/btape.c:2252 src/stored/btape.c:2262
+#: src/stored/btape.c:2259 src/stored/btape.c:2269
 msgid "Block read back"
 msgstr ""
 
-#: src/stored/btape.c:2253
+#: src/stored/btape.c:2260
 #, c-format
 msgid ""
 "\n"
@@ -10567,7 +10645,7 @@ msgid ""
 "The blocks differ at byte %u\n"
 msgstr ""
 
-#: src/stored/btape.c:2254
+#: src/stored/btape.c:2261
 msgid ""
 "\n"
 "\n"
@@ -10577,177 +10655,177 @@ msgid ""
 "to write multi-tape Volumes.!!!!\n"
 msgstr ""
 
-#: src/stored/btape.c:2293
+#: src/stored/btape.c:2300
 #, c-format
 msgid "Last block at: %u:%u this_dev_block_num=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2307
+#: src/stored/btape.c:2314
 #, c-format
 msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n"
 msgstr ""
 
-#: src/stored/btape.c:2311
+#: src/stored/btape.c:2318
 msgid "Block not written"
 msgstr ""
 
-#: src/stored/btape.c:2326
+#: src/stored/btape.c:2333
 #, c-format
 msgid "End of tape %d:%d. VolumeCapacity=%s. Write rate = %.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:2376
+#: src/stored/btape.c:2383
 msgid "Test writing blocks of 64512 bytes to tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:2378
+#: src/stored/btape.c:2385
 msgid "How many blocks do you want to write? (1000): "
 msgstr ""
 
-#: src/stored/btape.c:2393
+#: src/stored/btape.c:2400
 #, c-format
 msgid "Begin writing %d Bacula blocks to tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2445
+#: src/stored/btape.c:2452
 #, c-format
 msgid "Begin writing raw blocks of %u bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:2465
+#: src/stored/btape.c:2472
 #, c-format
 msgid "Write failed at block %u. stat=%d ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2495
+#: src/stored/btape.c:2502
 #, c-format
 msgid "Begin writing Bacula blocks of %u bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:2514
+#: src/stored/btape.c:2521
 #, c-format
 msgid "Write failed at block %u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2521
+#: src/stored/btape.c:2528
 msgid "test autochanger"
 msgstr ""
 
-#: src/stored/btape.c:2522
+#: src/stored/btape.c:2529
 msgid "backspace file"
 msgstr ""
 
-#: src/stored/btape.c:2523
+#: src/stored/btape.c:2530
 msgid "backspace record"
 msgstr ""
 
-#: src/stored/btape.c:2524
+#: src/stored/btape.c:2531
 msgid "fill tape using Bacula writes"
 msgstr ""
 
-#: src/stored/btape.c:2525
+#: src/stored/btape.c:2532
 msgid "list device capabilities"
 msgstr ""
 
-#: src/stored/btape.c:2526
+#: src/stored/btape.c:2533
 msgid "clear tape errors"
 msgstr ""
 
-#: src/stored/btape.c:2527
+#: src/stored/btape.c:2534
 msgid "go to end of Bacula data for append"
 msgstr ""
 
-#: src/stored/btape.c:2528
+#: src/stored/btape.c:2535
 msgid "go to the physical end of medium"
 msgstr ""
 
-#: src/stored/btape.c:2529
+#: src/stored/btape.c:2536
 msgid "fill tape, write onto second volume"
 msgstr ""
 
-#: src/stored/btape.c:2530
+#: src/stored/btape.c:2537
 msgid "read filled tape"
 msgstr ""
 
-#: src/stored/btape.c:2531
+#: src/stored/btape.c:2538
 msgid "forward space a file"
 msgstr ""
 
-#: src/stored/btape.c:2532
+#: src/stored/btape.c:2539
 msgid "forward space a record"
 msgstr ""
 
-#: src/stored/btape.c:2534
+#: src/stored/btape.c:2541
 msgid "write a Bacula label to the tape"
 msgstr ""
 
-#: src/stored/btape.c:2535
+#: src/stored/btape.c:2542
 msgid "load a tape"
 msgstr ""
 
-#: src/stored/btape.c:2536
+#: src/stored/btape.c:2543
 msgid "quit btape"
 msgstr ""
 
-#: src/stored/btape.c:2537
+#: src/stored/btape.c:2544
 msgid "use write() to fill tape"
 msgstr ""
 
-#: src/stored/btape.c:2538
+#: src/stored/btape.c:2545
 msgid "read and print the Bacula tape label"
 msgstr ""
 
-#: src/stored/btape.c:2539
+#: src/stored/btape.c:2546
 msgid "test record handling functions"
 msgstr ""
 
-#: src/stored/btape.c:2540
+#: src/stored/btape.c:2547
 msgid "rewind the tape"
 msgstr ""
 
-#: src/stored/btape.c:2541
+#: src/stored/btape.c:2548
 msgid "read() tape block by block to EOT and report"
 msgstr ""
 
-#: src/stored/btape.c:2542
+#: src/stored/btape.c:2549
 msgid "Bacula read block by block to EOT and report"
 msgstr ""
 
-#: src/stored/btape.c:2543
+#: src/stored/btape.c:2550
 msgid "print tape status"
 msgstr ""
 
-#: src/stored/btape.c:2544
+#: src/stored/btape.c:2551
 msgid "General test Bacula tape functions"
 msgstr ""
 
-#: src/stored/btape.c:2545
+#: src/stored/btape.c:2552
 msgid "write an EOF on the tape"
 msgstr ""
 
-#: src/stored/btape.c:2546
+#: src/stored/btape.c:2553
 msgid "write a single Bacula block"
 msgstr ""
 
-#: src/stored/btape.c:2547
+#: src/stored/btape.c:2554
 msgid "read a single record"
 msgstr ""
 
-#: src/stored/btape.c:2548
+#: src/stored/btape.c:2555
 msgid "quick fill command"
 msgstr ""
 
-#: src/stored/btape.c:2569
+#: src/stored/btape.c:2576
 #, c-format
 msgid "%s is an illegal command\n"
 msgstr ""
 
-#: src/stored/btape.c:2579
+#: src/stored/btape.c:2586
 #, c-format
 msgid "Interactive commands:\n"
 msgstr ""
 
-#: src/stored/btape.c:2589
+#: src/stored/btape.c:2596
 #, c-format
 msgid ""
 "Copyright (C) 2000-2005 Kern Sibbald.\n"
@@ -10765,27 +10843,27 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2680
+#: src/stored/btape.c:2687
 #, c-format
 msgid "Mount second Volume on device %s and press return when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2707
+#: src/stored/btape.c:2714
 #, c-format
 msgid "Mount blank Volume on device %s and press return when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2725
+#: src/stored/btape.c:2732
 #, c-format
 msgid "End of Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/btape.c:2737
+#: src/stored/btape.c:2744
 #, c-format
 msgid "Read block=%u, VolBytes=%s rate=%.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:2752 src/stored/mount.c:493
+#: src/stored/btape.c:2759 src/stored/mount.c:501
 #, c-format
 msgid "Cannot open Dev=%s, Vol=%s\n"
 msgstr ""
@@ -10810,358 +10888,345 @@ msgstr ""
 msgid "cont,"
 msgstr ""
 
-#: src/stored/butil.c:128
+#: src/stored/butil.c:133
 msgid "Volume name or names is too long. Please use a .bsr file.\n"
 msgstr ""
 
-#: src/stored/butil.c:148
+#: src/stored/butil.c:153
 #, c-format
 msgid "Cannot find device \"%s\" in config file %s.\n"
 msgstr ""
 
-#: src/stored/butil.c:155
+#: src/stored/butil.c:160
 #, c-format
 msgid "Cannot init device %s\n"
 msgstr ""
 
-#: src/stored/butil.c:174
+#: src/stored/butil.c:181
 #, c-format
 msgid "Cannot open %s\n"
 msgstr ""
 
-#: src/stored/butil.c:253
+#: src/stored/butil.c:264
 #, c-format
 msgid "Could not find device \"%s\" in config file %s.\n"
 msgstr ""
 
-#: src/stored/butil.c:258
+#: src/stored/butil.c:269
 #, c-format
 msgid "Using device: \"%s\" for reading.\n"
 msgstr ""
 
-#: src/stored/butil.c:261
+#: src/stored/butil.c:272
 #, c-format
 msgid "Using device: \"%s\" for writing.\n"
 msgstr ""
 
-#: src/stored/butil.c:277
+#: src/stored/butil.c:288
 msgid "Unexpected End of Data\n"
 msgstr ""
 
-#: src/stored/butil.c:279
+#: src/stored/butil.c:290
 msgid "Unexpected End of Tape\n"
 msgstr ""
 
-#: src/stored/butil.c:281
+#: src/stored/butil.c:292
 msgid "Unexpected End of File\n"
 msgstr ""
 
-#: src/stored/butil.c:283
+#: src/stored/butil.c:294
 msgid "Tape Door is Open\n"
 msgstr ""
 
-#: src/stored/butil.c:285
+#: src/stored/butil.c:296
 msgid "Unexpected Tape is Off-line\n"
 msgstr ""
 
-#: src/stored/dev.c:110
+#: src/stored/dev.c:112
 #, c-format
 msgid "Unable to stat device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:125
+#: src/stored/dev.c:123
 #, c-format
 msgid ""
 "%s is an unknown device type. Must be tape or directory\n"
 " or have RequiresMount=yes for DVD. st_mode=%x\n"
 msgstr ""
 
-#: src/stored/dev.c:183
+#: src/stored/dev.c:179
 #, c-format
 msgid "Unable to stat mount point %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:188
+#: src/stored/dev.c:186
 msgid ""
 "Mount and unmount commands must defined for a device which requires mount.\n"
 msgstr ""
 
-#: src/stored/dev.c:191
+#: src/stored/dev.c:189
 msgid "Write part command must be defined for a device which requires mount.\n"
 msgstr ""
 
-#: src/stored/dev.c:197
+#: src/stored/dev.c:194
 #, c-format
 msgid "Block size %u on device %s is too large, using default %u\n"
 msgstr ""
 
-#: src/stored/dev.c:202
+#: src/stored/dev.c:199
 #, c-format
 msgid "Max block size %u not multiple of device %s block size.\n"
 msgstr ""
 
-#: src/stored/dev.c:218 src/stored/dev.c:224
+#: src/stored/dev.c:215 src/stored/dev.c:221
 #, c-format
 msgid "Unable to init cond variable: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:310
+#: src/stored/dev.c:312
 msgid "Illegal mode given to open dev.\n"
 msgstr ""
 
-#: src/stored/dev.c:376 src/stored/device.c:302
+#: src/stored/dev.c:355 src/stored/device.c:295
 #, c-format
 msgid "Unable to open device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:396
-#, c-format
-msgid "fcntl error. ERR=%s\n"
-msgstr ""
-
-#: src/stored/dev.c:434 src/stored/dev.c:493
+#: src/stored/dev.c:423 src/stored/dev.c:481
 #, c-format
 msgid "Could not open file device %s. No Volume name given.\n"
 msgstr ""
 
-#: src/stored/dev.c:459 src/stored/dev.c:573
+#: src/stored/dev.c:449 src/stored/dev.c:562
 #, c-format
 msgid "Could not open: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:518
+#: src/stored/dev.c:506
 #, c-format
 msgid ""
 "The media in the device %s is not empty, please blank it before writing "
 "anything to it.\n"
 msgstr ""
 
-#: src/stored/dev.c:534
+#: src/stored/dev.c:523
 #, c-format
 msgid "There is no valid media in the device %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:541
+#: src/stored/dev.c:530
 #, c-format
 msgid "Could not mount device %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:599
+#: src/stored/dev.c:588
 #, c-format
 msgid "Could not fstat: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:652
+#: src/stored/dev.c:631
 #, c-format
-msgid "Bad call to rewind_dev. Device %s not open\n"
+msgid "Bad call to rewind. Device %s not open\n"
 msgstr ""
 
-#: src/stored/dev.c:681
+#: src/stored/dev.c:677
 #, c-format
 msgid "Rewind error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:691 src/stored/dev.c:804 src/stored/dev.c:941
-#: src/stored/dev.c:1466
+#: src/stored/dev.c:687 src/stored/dev.c:802 src/stored/dev.c:938
+#: src/stored/dev.c:1457
 #, c-format
 msgid "lseek_dev error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:731
+#: src/stored/dev.c:727
 msgid "unknown blocked code"
 msgstr ""
 
-#: src/stored/dev.c:774
+#: src/stored/dev.c:772
 #, c-format
 msgid "Bad call to eod_dev. Device %s not open\n"
 msgstr ""
 
-#: src/stored/dev.c:840
+#: src/stored/dev.c:838
 #, c-format
 msgid "ioctl MTEOM error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:848 src/stored/dev.c:981
+#: src/stored/dev.c:846 src/stored/dev.c:978
 #, c-format
 msgid "ioctl MTIOCGET error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:927
+#: src/stored/dev.c:924
 msgid "Bad device call. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:940
+#: src/stored/dev.c:937
 #, c-format
 msgid "Seek error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:976
+#: src/stored/dev.c:973
 msgid " Bacula status:"
 msgstr ""
 
-#: src/stored/dev.c:977 src/stored/dev.c:1026 src/stored/dev.c:1028
+#: src/stored/dev.c:974 src/stored/dev.c:1023 src/stored/dev.c:1025
 #, c-format
 msgid " file=%d block=%d\n"
 msgstr ""
 
-#: src/stored/dev.c:985
+#: src/stored/dev.c:982
 msgid " Device status:"
 msgstr ""
 
-#: src/stored/dev.c:1050
+#: src/stored/dev.c:1047
 msgid "Bad call to load_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1061 src/stored/dev.c:1074
+#: src/stored/dev.c:1058 src/stored/dev.c:1071
 #, c-format
 msgid "ioctl MTLOAD error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1093
-msgid "Bad call to offline_dev. Device not open\n"
-msgstr ""
-
-#: src/stored/dev.c:1116
+#: src/stored/dev.c:1107
 #, c-format
 msgid "ioctl MTOFFL error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1157
+#: src/stored/dev.c:1148
 msgid "Bad call to fsf_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1167 src/stored/dev.c:1288
+#: src/stored/dev.c:1158 src/stored/dev.c:1279
 #, c-format
 msgid "Device %s at End of Tape.\n"
 msgstr ""
 
-#: src/stored/dev.c:1192 src/stored/dev.c:1268
+#: src/stored/dev.c:1183 src/stored/dev.c:1259
 #, c-format
 msgid "ioctl MTFSF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1317
+#: src/stored/dev.c:1308
 msgid "Bad call to bsf_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1323
+#: src/stored/dev.c:1314
 #, c-format
 msgid "Device %s cannot BSF because it is not a tape.\n"
 msgstr ""
 
-#: src/stored/dev.c:1338
+#: src/stored/dev.c:1329
 #, c-format
 msgid "ioctl MTBSF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1358
+#: src/stored/dev.c:1349
 msgid "Bad call to fsr. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1367
+#: src/stored/dev.c:1358
 #, c-format
 msgid "ioctl MTFSR not permitted on %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1395
+#: src/stored/dev.c:1386
 #, c-format
 msgid "ioctl MTFSR %d error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1415
+#: src/stored/dev.c:1406
 msgid "Bad call to bsr_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1425
+#: src/stored/dev.c:1416
 #, c-format
 msgid "ioctl MTBSR not permitted on %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1438
+#: src/stored/dev.c:1429
 #, c-format
 msgid "ioctl MTBSR error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1455
+#: src/stored/dev.c:1446
 msgid "Bad call to reposition_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1523
+#: src/stored/dev.c:1514
 msgid "Bad call to weof_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1533
+#: src/stored/dev.c:1524
 msgid "Attempt to WEOF on non-appendable Volume\n"
 msgstr ""
 
-#: src/stored/dev.c:1550
+#: src/stored/dev.c:1541
 #, c-format
 msgid "ioctl MTWEOF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1592
+#: src/stored/dev.c:1583
 msgid "Got ENOTTY on read/write!\n"
 msgstr ""
 
-#: src/stored/dev.c:1639
+#: src/stored/dev.c:1630
 #, c-format
 msgid "unknown func code %d"
 msgstr ""
 
-#: src/stored/dev.c:1645
+#: src/stored/dev.c:1636
 #, c-format
 msgid "I/O function \"%s\" not supported on this device.\n"
 msgstr ""
 
-#: src/stored/dev.c:1783 src/stored/dvd.c:668
+#: src/stored/dev.c:1761 src/stored/dvd.c:734
 #, c-format
 msgid "Unable to truncate device %s. ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:1822
+#: src/stored/dev.c:1800
 msgid "Bad call to term_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/device.c:105
+#: src/stored/device.c:100
 #, c-format
 msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n"
 msgstr ""
 
-#: src/stored/device.c:119
+#: src/stored/device.c:114
 #, c-format
 msgid "New volume \"%s\" mounted on device %s at %s.\n"
 msgstr ""
 
-#: src/stored/device.c:131
+#: src/stored/device.c:126
 #, c-format
 msgid "write_block_to_device Volume label failed. ERR=%s"
 msgstr ""
 
-#: src/stored/device.c:168
+#: src/stored/device.c:162
 #, c-format
 msgid "write_block_to_device overflow block failed. ERR=%s"
 msgstr ""
 
-#: src/stored/device.c:304
+#: src/stored/device.c:297
 #, c-format
 msgid "Unable to open archive %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:328
-msgid "Bad call to force_close_dev. Device not open\n"
-msgstr ""
-
-#: src/stored/device.c:346
+#: src/stored/device.c:332
 #, c-format
 msgid "Device write lock failure. ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:354
+#: src/stored/device.c:340
 #, c-format
 msgid "Device write unlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:373
+#: src/stored/device.c:359
 #, c-format
 msgid "pthread_cond_wait failure. ERR=%s\n"
 msgstr ""
@@ -11182,72 +11247,72 @@ msgstr ""
 
 #: src/stored/dircmd.c:262
 #, c-format
-msgid "3902 Job %s not found.\n"
+msgid "3904 Job %s not found.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:279
+#: src/stored/dircmd.c:283
 #, c-format
 msgid "3000 Job %s marked to be canceled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:283
+#: src/stored/dircmd.c:287
 msgid "3903 Error scanning cancel command.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:356 src/stored/dircmd.c:655 src/stored/dircmd.c:720
-#: src/stored/dircmd.c:779 src/stored/dircmd.c:829 src/stored/dircmd.c:869
+#: src/stored/dircmd.c:364 src/stored/dircmd.c:680 src/stored/dircmd.c:756
+#: src/stored/dircmd.c:819 src/stored/dircmd.c:874 src/stored/dircmd.c:918
 #, c-format
-msgid "3999 Device \"%s\" not found\n"
+msgid "3999 Device \"%s\" not found or could not be opened.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:361
+#: src/stored/dircmd.c:369
 #, c-format
 msgid "3903 Error scanning label command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:405
+#: src/stored/dircmd.c:412
 #, c-format
 msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:411
+#: src/stored/dircmd.c:419
 msgid "3921 Wrong volume mounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:415
+#: src/stored/dircmd.c:423
 msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:423 src/stored/dircmd.c:432
+#: src/stored/dircmd.c:431 src/stored/dircmd.c:440
 #, c-format
 msgid "3912 Failed to label Volume: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:435
+#: src/stored/dircmd.c:443
 #, c-format
 msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n"
 msgstr ""
 
-#: src/stored/dircmd.c:468
+#: src/stored/dircmd.c:476
 #, c-format
 msgid "3001 Mounted Volume: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:472 src/stored/dircmd.c:905
+#: src/stored/dircmd.c:480 src/stored/dircmd.c:954
 #, c-format
 msgid ""
 "3902 Cannot mount Volume on Storage Device %s because:\n"
 "%s"
 msgstr ""
 
-#: src/stored/dircmd.c:495 src/stored/reserve.c:554
+#: src/stored/dircmd.c:508 src/stored/reserve.c:674
 #, c-format
 msgid ""
 "\n"
 "     Device \"%s\" requested by DIR could not be opened or does not exist.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:516 src/stored/reserve.c:550
+#: src/stored/dircmd.c:529 src/stored/reserve.c:670
 #, c-format
 msgid ""
 "\n"
@@ -11255,222 +11320,283 @@ msgid ""
 "does not exist.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:575 src/stored/dircmd.c:623
+#: src/stored/dircmd.c:593 src/stored/dircmd.c:646
 #, c-format
 msgid "3901 open device failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:590 src/stored/dircmd.c:614
+#: src/stored/dircmd.c:613 src/stored/dircmd.c:637
 #, c-format
 msgid "3001 Device %s is mounted with Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:593 src/stored/dircmd.c:617 src/stored/dircmd.c:632
+#: src/stored/dircmd.c:616 src/stored/dircmd.c:640 src/stored/dircmd.c:655
 #, c-format
 msgid ""
 "3905 Device %s open but no Bacula volume is mounted.\n"
 "If this is not a blank tape, try unmounting and remounting the Volume.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:602
+#: src/stored/dircmd.c:625
 #, c-format
 msgid "3001 Device %s is doing acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:607 src/stored/dircmd.c:698
+#: src/stored/dircmd.c:630 src/stored/dircmd.c:730
 #, c-format
 msgid "3903 Device %s is being labeled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:629
+#: src/stored/dircmd.c:652
 #, c-format
 msgid "3001 Device %s is already mounted with Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:638
+#: src/stored/dircmd.c:661
 #, c-format
 msgid "3002 Device %s is mounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:641
+#: src/stored/dircmd.c:664
 #, c-format
 msgid "3907 %s"
 msgstr ""
 
-#: src/stored/dircmd.c:644
+#: src/stored/dircmd.c:667
 #, c-format
 msgid "3906 File device %s is always mounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:650
+#: src/stored/dircmd.c:673
 #, c-format
 msgid "3905 Bizarre wait state %d\n"
 msgstr ""
 
-#: src/stored/dircmd.c:659
+#: src/stored/dircmd.c:684
 #, c-format
 msgid "3909 Error scanning mount command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:681
+#: src/stored/dircmd.c:711
 #, c-format
 msgid "3901 Device %s is already unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:690
+#: src/stored/dircmd.c:722
 #, c-format
 msgid "3001 Device %s unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:694
+#: src/stored/dircmd.c:726
 #, c-format
 msgid "3902 Device %s is busy in acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:715
+#: src/stored/dircmd.c:749
 #, c-format
 msgid "3002 Device %s unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:725
+#: src/stored/dircmd.c:761
 #, c-format
 msgid "3907 Error scanning unmount command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:751
+#: src/stored/dircmd.c:789
 #, c-format
-msgid "3911 Device %s already released.\n"
+msgid "3921 Device %s already released.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:758
+#: src/stored/dircmd.c:796
 #, c-format
-msgid "3912 Device %s waiting for mount.\n"
+msgid "3922 Device %s waiting for mount.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:762
+#: src/stored/dircmd.c:800
 #, c-format
-msgid "3913 Device %s is busy in acquire.\n"
+msgid "3923 Device %s is busy in acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:766
+#: src/stored/dircmd.c:804
 #, c-format
 msgid "3914 Device %s is being labeled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:774
+#: src/stored/dircmd.c:812
 #, c-format
-msgid "3012 Device %s released.\n"
+msgid "3022 Device %s released.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:784
+#: src/stored/dircmd.c:824
 #, c-format
-msgid "3917 Error scanning release command: %s\n"
+msgid "3927 Error scanning release command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:817
+#: src/stored/dircmd.c:860
 #, c-format
 msgid "3995 Device %s is not an autochanger.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:833
+#: src/stored/dircmd.c:878
 #, c-format
-msgid "3908 Error scanning autocharger list/slots command: %s\n"
+msgid "3908 Error scanning autocharger drives/list/slots command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:873
+#: src/stored/dircmd.c:922
 #, c-format
 msgid "3909 Error scanning readlabel command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:901
+#: src/stored/dircmd.c:950
 #, c-format
 msgid "3001 Volume=%s Slot=%d\n"
 msgstr ""
 
-#: src/stored/dircmd.c:930
+#: src/stored/dircmd.c:979
 #, c-format
 msgid "3910 Unable to open device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:940
+#: src/stored/dircmd.c:991
 #, c-format
-msgid "3911 Device %s is busy reading.\n"
+msgid "3931 Device %s is BLOCKED. user unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:943
+#: src/stored/dircmd.c:995
 #, c-format
-msgid "3912 Device %s is busy with %d writer(s).\n"
+msgid ""
+"3932 Device %s is BLOCKED. user unmounted during wait for media/mount.\n"
 msgstr ""
 
-#: src/stored/fd_cmds.c:340
-msgid "Error parsing bootstrap file.\n"
+#: src/stored/dircmd.c:999
+#, c-format
+msgid "3933 Device %s is BLOCKED waiting for media.\n"
 msgstr ""
 
-#: src/stored/job.c:79
+#: src/stored/dircmd.c:1003
 #, c-format
-msgid "Bad Job Command from Director: %s\n"
+msgid "3934 Device %s is being initialized.\n"
 msgstr ""
 
-#: src/stored/job.c:189
+#: src/stored/dircmd.c:1007
 #, c-format
-msgid "Job name not found: %s\n"
+msgid "3935 Device %s is blocked labeling a Volume.\n"
 msgstr ""
 
-#: src/stored/job.c:200
+#: src/stored/dircmd.c:1011
 #, c-format
-msgid "Hey!!!! JobId %u Job %s already authenticated.\n"
+msgid "3935 Device %s is blocked for unknown reason.\n"
 msgstr ""
 
-#: src/stored/job.c:211
-msgid "Unable to authenticate File daemon\n"
+#: src/stored/dircmd.c:1016
+#, c-format
+msgid "3936 Device %s is busy reading.\n"
 msgstr ""
 
-#: src/stored/job.c:338
-msgid "In free_jcr(), but still attached to device!!!!\n"
+#: src/stored/dircmd.c:1019
+#, c-format
+msgid "3937 Device %s is busy with %d writer(s).\n"
 msgstr ""
 
-#: src/stored/label.c:74
-msgid "BAD call to read_dev_volume_label\n"
+#: src/stored/dvd.c:153
+#, c-format
+msgid "Device %s cannot be mounted. ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:79 src/stored/label.c:120 src/stored/label.c:208
+#: src/stored/dvd.c:271
 #, c-format
-msgid "Wrong Volume mounted on device %s: Wanted %s have %s\n"
+msgid "Cannot run free space command (%s)\n"
 msgstr ""
 
-#: src/stored/label.c:86 src/stored/label.c:123 src/stored/label.c:195
+#: src/stored/dvd.c:374
 #, c-format
-msgid "Too many tries: %s"
+msgid "Error while writing current part to the DVD: %s"
 msgstr ""
 
-#: src/stored/label.c:102
+#: src/stored/dvd.c:394
 #, c-format
-msgid "Couldn't rewind device %s: ERR=%s\n"
+msgid "Remaining free space %s on %s\n"
 msgstr ""
 
-#: src/stored/label.c:140
+#: src/stored/dvd.c:464
 #, c-format
-msgid ""
-"Requested Volume \"%s\" on %s is not a Bacula labeled Volume, because: ERR=%s"
+msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
 msgstr ""
 
-#: src/stored/label.c:145
-msgid "Could not read Volume label from block.\n"
+#: src/stored/dvd.c:481
+#, c-format
+msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:148
+#: src/stored/dvd.c:700
 #, c-format
-msgid "Could not unserialize Volume label: ERR=%s\n"
+msgid "Unable to write part %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:153
-#, c-format
-msgid "Volume Header Id bad: %s\n"
+#: src/stored/fd_cmds.c:340
+msgid "Error parsing bootstrap file.\n"
 msgstr ""
 
-#: src/stored/label.c:180
+#: src/stored/job.c:191
 #, c-format
-msgid "Volume on %s has wrong Bacula version. Wanted %d got %d\n"
+msgid "Job name not found: %s\n"
+msgstr ""
+
+#: src/stored/job.c:202
+#, c-format
+msgid "Hey!!!! JobId %u Job %s already authenticated.\n"
+msgstr ""
+
+#: src/stored/job.c:213
+msgid "Unable to authenticate File daemon\n"
+msgstr ""
+
+#: src/stored/job.c:334
+msgid "In free_jcr(), but still attached to device!!!!\n"
+msgstr ""
+
+#: src/stored/label.c:74
+msgid "BAD call to read_dev_volume_label\n"
+msgstr ""
+
+#: src/stored/label.c:79 src/stored/label.c:120 src/stored/label.c:208
+#, c-format
+msgid "Wrong Volume mounted on device %s: Wanted %s have %s\n"
+msgstr ""
+
+#: src/stored/label.c:86 src/stored/label.c:123 src/stored/label.c:195
+#, c-format
+msgid "Too many tries: %s"
+msgstr ""
+
+#: src/stored/label.c:102
+#, c-format
+msgid "Couldn't rewind device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:140
+#, c-format
+msgid ""
+"Requested Volume \"%s\" on %s is not a Bacula labeled Volume, because: ERR=%s"
+msgstr ""
+
+#: src/stored/label.c:145
+msgid "Could not read Volume label from block.\n"
+msgstr ""
+
+#: src/stored/label.c:148
+#, c-format
+msgid "Could not unserialize Volume label: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:153
+#, c-format
+msgid "Volume Header Id bad: %s\n"
+msgstr ""
+
+#: src/stored/label.c:180
+#, c-format
+msgid "Volume on %s has wrong Bacula version. Wanted %d got %d\n"
 msgstr ""
 
 #: src/stored/label.c:191
@@ -11483,52 +11609,52 @@ msgstr ""
 msgid "Cannot write Volume label to block for device %s\n"
 msgstr ""
 
-#: src/stored/label.c:393
+#: src/stored/label.c:400
 #, c-format
 msgid "Rewind error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:398
+#: src/stored/label.c:405
 #, c-format
 msgid "Truncate error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:420
+#: src/stored/label.c:427
 #, c-format
 msgid "Unable to write device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:448
+#: src/stored/label.c:455
 #, c-format
 msgid "Recycled volume \"%s\" on device %s, all previous data lost.\n"
 msgstr ""
 
-#: src/stored/label.c:451
+#: src/stored/label.c:458
 #, c-format
 msgid "Wrote label to prelabeled Volume \"%s\" on device %s\n"
 msgstr ""
 
-#: src/stored/label.c:648
+#: src/stored/label.c:657
 #, c-format
 msgid "Bad session label = %d\n"
 msgstr ""
 
-#: src/stored/label.c:666 src/stored/label.c:673
+#: src/stored/label.c:675 src/stored/label.c:682
 #, c-format
 msgid "Error writing Session label to %s: %s\n"
 msgstr ""
 
-#: src/stored/label.c:707
+#: src/stored/label.c:717
 #, c-format
 msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n"
 msgstr ""
 
-#: src/stored/label.c:834
+#: src/stored/label.c:844
 #, c-format
 msgid "Unknown %d"
 msgstr ""
 
-#: src/stored/label.c:838
+#: src/stored/label.c:848
 #, c-format
 msgid ""
 "\n"
@@ -11545,17 +11671,17 @@ msgid ""
 "HostName          : %s\n"
 msgstr ""
 
-#: src/stored/label.c:860
+#: src/stored/label.c:870
 #, c-format
 msgid "Date label written: %s\n"
 msgstr ""
 
-#: src/stored/label.c:866
+#: src/stored/label.c:876
 #, c-format
 msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n"
 msgstr ""
 
-#: src/stored/label.c:886
+#: src/stored/label.c:896
 #, c-format
 msgid ""
 "\n"
@@ -11568,7 +11694,7 @@ msgid ""
 "ClientName        : %s\n"
 msgstr ""
 
-#: src/stored/label.c:899
+#: src/stored/label.c:909
 #, c-format
 msgid ""
 "Job (unique name) : %s\n"
@@ -11577,7 +11703,7 @@ msgid ""
 "JobLevel          : %c\n"
 msgstr ""
 
-#: src/stored/label.c:908
+#: src/stored/label.c:918
 #, c-format
 msgid ""
 "JobFiles          : %s\n"
@@ -11590,118 +11716,132 @@ msgid ""
 "JobStatus         : %c\n"
 msgstr ""
 
-#: src/stored/label.c:929
+#: src/stored/label.c:939
 #, c-format
 msgid "Date written      : %s\n"
 msgstr ""
 
-#: src/stored/label.c:934
+#: src/stored/label.c:944
 #, c-format
 msgid "Date written      : %04d-%02d-%02d at %02d:%02d\n"
 msgstr ""
 
-#: src/stored/label.c:953
+#: src/stored/label.c:963
 msgid "Fresh Volume"
 msgstr ""
 
-#: src/stored/label.c:956
+#: src/stored/label.c:966
 msgid "Volume"
 msgstr ""
 
-#: src/stored/label.c:965 src/stored/read_record.c:335
+#: src/stored/label.c:975 src/stored/read_record.c:336
 msgid "End of Media"
 msgstr ""
 
-#: src/stored/label.c:968
+#: src/stored/label.c:978
 msgid "End of Tape"
 msgstr ""
 
-#: src/stored/label.c:988 src/stored/label.c:996 src/stored/label.c:1029
+#: src/stored/label.c:998 src/stored/label.c:1006 src/stored/label.c:1039
 #, c-format
 msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n"
 msgstr ""
 
-#: src/stored/label.c:993
+#: src/stored/label.c:1003
 msgid "End of physical tape.\n"
 msgstr ""
 
-#: src/stored/label.c:1008 src/stored/label.c:1017
+#: src/stored/label.c:1018 src/stored/label.c:1027
 #, c-format
 msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n"
 msgstr ""
 
-#: src/stored/label.c:1010
+#: src/stored/label.c:1020
 #, c-format
 msgid "   Job=%s Date=%s Level=%c Type=%c\n"
 msgstr ""
 
-#: src/stored/label.c:1019
+#: src/stored/label.c:1029
 #, c-format
 msgid "   Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n"
 msgstr ""
 
-#: src/stored/mount.c:197 src/stored/mount.c:294
+#: src/stored/mount.c:198 src/stored/mount.c:296
 #, c-format
 msgid "Volume \"%s\" not on device %s.\n"
 msgstr ""
 
-#: src/stored/mount.c:230
+#: src/stored/mount.c:225
 #, c-format
 msgid ""
-"Director wanted Volume \"%s\".\n"
+"Director wanted Volume \"%s\" for device %s.\n"
 "    Current Volume \"%s\" not acceptable because:\n"
 "    %s"
 msgstr ""
 
-#: src/stored/mount.c:284
+#: src/stored/mount.c:286
 #, c-format
 msgid "Labeled new Volume \"%s\" on device %s.\n"
 msgstr ""
 
-#: src/stored/mount.c:289
+#: src/stored/mount.c:291
 #, c-format
 msgid "Warning device %s not configured to autolabel Volumes.\n"
 msgstr ""
 
-#: src/stored/mount.c:340
+#: src/stored/mount.c:343
 #, c-format
 msgid "Volume \"%s\" previously written, moving to end of data.\n"
 msgstr ""
 
-#: src/stored/mount.c:343
+#: src/stored/mount.c:346
 #, c-format
 msgid "Unable to position to end of data on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/mount.c:355
+#: src/stored/mount.c:358
 #, c-format
 msgid "Ready to append to end of Volume \"%s\" at file=%d.\n"
 msgstr ""
 
-#: src/stored/mount.c:358
+#: src/stored/mount.c:361
 #, c-format
 msgid ""
 "I cannot write on Volume \"%s\" because:\n"
 "The number of files mismatch! Volume=%u Catalog=%u\n"
 msgstr ""
 
-#: src/stored/mount.c:411
+#: src/stored/mount.c:389
+#, c-format
+msgid "Ready to append to end of Volume \"%s\" at file address=%u.\n"
+msgstr ""
+
+#: src/stored/mount.c:393
+#, c-format
+msgid ""
+"I cannot write on Volume \"%s\" because:\n"
+"The EOD file address is wrong: Volume file address=%u != Catalog Endblock=%u"
+"(+1)\n"
+"You probably removed DVD last part in spool directory.\n"
+msgstr ""
+
+#: src/stored/mount.c:419
 #, c-format
 msgid "Marking Volume \"%s\" in Error in Catalog.\n"
 msgstr ""
 
-#: src/stored/mount.c:427
+#: src/stored/mount.c:435
 #, c-format
 msgid ""
 "Autochanger Volume \"%s\" not found in slot %d.\n"
 "    Setting InChanger to zero in catalog.\n"
 msgstr ""
 
-#: src/stored/mount.c:446
+#: src/stored/mount.c:454
 msgid "Hey!!!!! WroteVol non-zero !!!!!\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:104 src/stored/parse_bsr.c:108
+#: src/stored/parse_bsr.c:106 src/stored/parse_bsr.c:110
 #, c-format
 msgid ""
 "Bootstrap file error: %s\n"
@@ -11709,128 +11849,161 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:130
+#: src/stored/parse_bsr.c:132
 #, c-format
 msgid "Cannot open bootstrap file %s: %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:260
+#: src/stored/parse_bsr.c:262
 #, c-format
 msgid "MediaType %s in bsr at inappropriate place.\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:416
+#: src/stored/parse_bsr.c:283
+#, c-format
+msgid "Device \"%s\" in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:440
 msgid "JobType not yet implemented\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:424
+#: src/stored/parse_bsr.c:448
 msgid "JobLevel not yet implemented\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:626
+#: src/stored/parse_bsr.c:631
+#, c-format
+msgid "Slot %d in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:655
 #, c-format
 msgid "VolFile     : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:634
+#: src/stored/parse_bsr.c:663
 #, c-format
 msgid "VolBlock    : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:644
+#: src/stored/parse_bsr.c:673
 #, c-format
 msgid "FileIndex   : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:646
+#: src/stored/parse_bsr.c:675
 #, c-format
 msgid "FileIndex   : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:656
+#: src/stored/parse_bsr.c:685
 #, c-format
 msgid "JobId       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:658
+#: src/stored/parse_bsr.c:687
 #, c-format
 msgid "JobId       : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:668
+#: src/stored/parse_bsr.c:697
 #, c-format
 msgid "SessId      : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:670
+#: src/stored/parse_bsr.c:699
 #, c-format
 msgid "SessId      : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:679
+#: src/stored/parse_bsr.c:708
 #, c-format
 msgid "VolumeName  : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:688
+#: src/stored/parse_bsr.c:709
+#, c-format
+msgid "  MediaType : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:710
+#, c-format
+msgid "  Device    : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:711
+#, c-format
+msgid "  Slot      : %d\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:720
 #, c-format
 msgid "Client      : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:696
+#: src/stored/parse_bsr.c:728
 #, c-format
 msgid "Job          : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:704
+#: src/stored/parse_bsr.c:736
 #, c-format
 msgid "SessTime    : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:718
+#: src/stored/parse_bsr.c:750
 msgid "BSR is NULL\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:722
+#: src/stored/parse_bsr.c:754
 #, c-format
 msgid "Next        : 0x%x\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:723
+#: src/stored/parse_bsr.c:755
 #, c-format
 msgid "Root bsr    : 0x%x\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:734
-#, c-format
-msgid "Slot        : %u\n"
-msgstr ""
-
-#: src/stored/parse_bsr.c:737
+#: src/stored/parse_bsr.c:766
 #, c-format
 msgid "count       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:738
+#: src/stored/parse_bsr.c:767
 #, c-format
 msgid "found       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:741
+#: src/stored/parse_bsr.c:770
 #, c-format
 msgid "done        : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:742
+#: src/stored/parse_bsr.c:771
 #, c-format
 msgid "positioning : %d\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:743
+#: src/stored/parse_bsr.c:772
 #, c-format
 msgid "fast_reject : %d\n"
 msgstr ""
 
+#: src/stored/pythonsd.c:197
+msgid "Error in ParseTuple\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:213
+msgid "Parse tuple error in job_write\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:250
+#, c-format
+msgid "Error in Python method %s\n"
+msgstr ""
+
 #: src/stored/read.c:55
 msgid "No Volume names found for restore.\n"
 msgstr ""
@@ -11861,45 +12034,127 @@ msgstr ""
 
 #: src/stored/read_record.c:105
 #, c-format
-msgid "Got EOF at file %u  on device %s, Volume \"%s\"\n"
+msgid "End of file %u  on device %s, Volume \"%s\"\n"
 msgstr ""
 
 #: src/stored/read_record.c:119
 msgid "Did fsr\n"
 msgstr ""
 
-#: src/stored/read_record.c:275
+#: src/stored/read_record.c:276
 #, c-format
 msgid "Reposition from (file:block) %u:%u to %u:%u\n"
 msgstr ""
 
-#: src/stored/read_record.c:302
+#: src/stored/read_record.c:303
 #, c-format
 msgid "Forward spacing to file:block %u:%u.\n"
 msgstr ""
 
-#: src/stored/read_record.c:328
+#: src/stored/read_record.c:329
 msgid "Begin Session"
 msgstr ""
 
-#: src/stored/read_record.c:332
+#: src/stored/read_record.c:333
 msgid "End Session"
 msgstr ""
 
-#: src/stored/read_record.c:338
+#: src/stored/read_record.c:339
 #, c-format
 msgid "Unknown code %d\n"
 msgstr ""
 
-#: src/stored/record.c:61
+#: src/stored/record.c:60
 #, c-format
 msgid "unknown: %d"
 msgstr ""
 
-#: src/stored/record.c:332
+#: src/stored/record.c:343
 msgid "Damaged buffer\n"
 msgstr ""
 
+#: src/stored/reserve.c:75
+#, c-format
+msgid "Unable to initialize reservation lock. ERR=%s\n"
+msgstr ""
+
+#: src/stored/reserve.c:496 src/stored/reserve.c:507
+#, c-format
+msgid "Failed command: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:497
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
+"Device resources.\n"
+msgstr ""
+
+#: src/stored/reserve.c:687
+#, c-format
+msgid "3926 Could not get dcr for device: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:752
+#, c-format
+msgid "3601 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:761
+#, c-format
+msgid "3602 JobId=%u device %s is busy (already reading/writing).\n"
+msgstr ""
+
+#: src/stored/reserve.c:808
+#, c-format
+msgid "3603 JobId=%u device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/reserve.c:817
+#, c-format
+msgid "3604 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:883
+#, c-format
+msgid "3605 JobId=%u wants free drive but device %s is busy.\n"
+msgstr ""
+
+#: src/stored/reserve.c:891
+#, c-format
+msgid "3606 JobId=%u wants mounted, but drive %s has no Volume.\n"
+msgstr ""
+
+#: src/stored/reserve.c:901
+#, c-format
+msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:937
+#, c-format
+msgid "3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:980
+#, c-format
+msgid "3609 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:988 src/stored/reserve.c:992
+msgid "Logic error!!!! Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:989
+#, c-format
+msgid "3910 JobId=%u Logic error!!!! drive %s Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:995
+#, c-format
+msgid "3911 JobId=%u failed reserve drive %s.\n"
+msgstr ""
+
 #: src/stored/spool.c:69
 #, c-format
 msgid ""
@@ -11927,256 +12182,272 @@ msgstr ""
 
 #: src/stored/spool.c:199
 #, c-format
-msgid "Committing spooled data to Volume. Despooling %s bytes ...\n"
+msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:203
+#: src/stored/spool.c:204
 #, c-format
 msgid "Writing spooled data to Volume. Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:257 src/stored/spool.c:431 src/stored/spool.c:469
+#: src/stored/spool.c:258 src/stored/spool.c:432 src/stored/spool.c:470
 #, c-format
 msgid "Ftruncate spool file failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:259
+#: src/stored/spool.c:260
 #, c-format
 msgid "Bad return from ftruncate. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:308
+#: src/stored/spool.c:309
 #, c-format
 msgid "Spool header read error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:311
+#: src/stored/spool.c:312
 #, c-format
 msgid "Spool read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:312
+#: src/stored/spool.c:313
 #, c-format
 msgid "Spool header read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:318 src/stored/spool.c:319
+#: src/stored/spool.c:319 src/stored/spool.c:320
 #, c-format
 msgid "Spool block too big. Max %u bytes, got %u\n"
 msgstr ""
 
-#: src/stored/spool.c:324 src/stored/spool.c:325
+#: src/stored/spool.c:325 src/stored/spool.c:326
 #, c-format
 msgid "Spool data read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:382
+#: src/stored/spool.c:383
 msgid "User specified spool size reached.\n"
 msgstr ""
 
-#: src/stored/spool.c:384
+#: src/stored/spool.c:385
 msgid "Bad return from despool in write_block.\n"
 msgstr ""
 
-#: src/stored/spool.c:392
+#: src/stored/spool.c:393
 msgid "Spooling data again ...\n"
 msgstr ""
 
-#: src/stored/spool.c:423
+#: src/stored/spool.c:424
 #, c-format
 msgid "Error writing header to spool file. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:437 src/stored/spool.c:475
+#: src/stored/spool.c:438 src/stored/spool.c:476
 msgid "Fatal despooling error."
 msgstr ""
 
-#: src/stored/spool.c:444
+#: src/stored/spool.c:445
 msgid "Retrying after header spooling error failed.\n"
 msgstr ""
 
-#: src/stored/spool.c:458
+#: src/stored/spool.c:459
 #, c-format
 msgid "Error writing data to spool file. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:485
+#: src/stored/spool.c:486
 msgid "Retrying after data spooling error failed.\n"
 msgstr ""
 
-#: src/stored/spool.c:540 src/stored/spool.c:547
+#: src/stored/spool.c:541 src/stored/spool.c:548
 #, c-format
 msgid "Fseek on attributes file failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:557
+#: src/stored/spool.c:558
 #, c-format
 msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:584
+#: src/stored/spool.c:585
 #, c-format
 msgid "fopen attr spool file %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/status.c:66
+#: src/stored/status.c:67
 #, c-format
 msgid ""
 "\n"
 "%s Version: %s (%s) %s %s %s\n"
 msgstr ""
 
-#: src/stored/status.c:97
+#: src/stored/status.c:103
 msgid ""
 "\n"
 "Device status:\n"
 msgstr ""
 
-#: src/stored/status.c:99
+#: src/stored/status.c:105
 #, c-format
 msgid "Autochanger \"%s\" with devices:\n"
 msgstr ""
 
-#: src/stored/status.c:113
+#: src/stored/status.c:119
 #, c-format
-msgid "Device %s is mounted with Volume \"%s\"\n"
+msgid "Device %s is mounted with Volume=\"%s\" Pool=\"%s\"\n"
 msgstr ""
 
-#: src/stored/status.c:116
+#: src/stored/status.c:123
 #, c-format
 msgid "Device %s open but no Bacula volume is mounted.\n"
 msgstr ""
 
-#: src/stored/status.c:126
+#: src/stored/status.c:133
 #, c-format
 msgid "    Total Bytes=%s Blocks=%s Bytes/block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:140
+#: src/stored/status.c:147
 #, c-format
 msgid "    Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:145
+#: src/stored/status.c:152
 #, c-format
 msgid "    Positioned at File=%s Block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:151
+#: src/stored/status.c:158
 #, c-format
 msgid "Device %s is not open or does not exist.\n"
 msgstr ""
 
-#: src/stored/status.c:153
+#: src/stored/status.c:160
 #, c-format
 msgid "Device \"%s\" is not open or does not exist.\n"
 msgstr ""
 
-#: src/stored/status.c:158 src/stored/status.c:165 src/stored/status.c:168
+#: src/stored/status.c:165 src/stored/status.c:168 src/stored/status.c:172
+#: src/stored/status.c:174
 msgid ""
 "====\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:159
-msgid "Volume status:\n"
+#: src/stored/status.c:166
+msgid "In Use Volume status:\n"
 msgstr ""
 
-#: src/stored/status.c:183
+#: src/stored/status.c:190
 msgid ""
 "No DEVICE structure.\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:188
+#: src/stored/status.c:195
 msgid "    Device is BLOCKED. User unmounted.\n"
 msgstr ""
 
-#: src/stored/status.c:191
+#: src/stored/status.c:198
 msgid "    Device is BLOCKED. User unmounted during wait for media/mount.\n"
 msgstr ""
 
-#: src/stored/status.c:195
+#: src/stored/status.c:202
 #, c-format
 msgid "    Device is BLOCKED waiting for mount of volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/status.c:198
+#: src/stored/status.c:205
 msgid "    Device is BLOCKED waiting for media.\n"
 msgstr ""
 
-#: src/stored/status.c:202
+#: src/stored/status.c:209
 msgid "    Device is being initialized.\n"
 msgstr ""
 
-#: src/stored/status.c:205
+#: src/stored/status.c:212
 msgid "    Device is blocked labeling a Volume.\n"
 msgstr ""
 
-#: src/stored/status.c:213
+#: src/stored/status.c:220
 #, c-format
 msgid "    Slot %d is loaded in drive %d.\n"
 msgstr ""
 
-#: src/stored/status.c:216
+#: src/stored/status.c:223
 #, c-format
 msgid "    Drive %d is not loaded.\n"
 msgstr ""
 
-#: src/stored/status.c:235
+#: src/stored/status.c:242
 msgid "Device state:\n"
 msgstr ""
 
-#: src/stored/status.c:249
+#: src/stored/status.c:256
 #, c-format
 msgid ""
 "num_writers=%d JobStatus=%c block=%d\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:253
+#: src/stored/status.c:260
 #, c-format
 msgid "Archive name: %s Device name: %s\n"
 msgstr ""
 
-#: src/stored/status.c:255
+#: src/stored/status.c:262
 #, c-format
 msgid "File=%u block=%u\n"
 msgstr ""
 
-#: src/stored/status.c:256
+#: src/stored/status.c:263
 #, c-format
 msgid "Min block=%u Max block=%u\n"
 msgstr ""
 
-#: src/stored/status.c:272
+#: src/stored/status.c:280
 #, c-format
 msgid "%s Job %s waiting for Client connection.\n"
 msgstr ""
 
-#: src/stored/status.c:284
+#: src/stored/status.c:295
+#, c-format
+msgid ""
+"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:307
 #, c-format
-msgid "%s %s job %s JobId=%d Volume=\"%s\" device=\"%s\"\n"
+msgid ""
+"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
 msgstr ""
 
-#: src/stored/status.c:303
+#: src/stored/status.c:330
 #, c-format
 msgid "    FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n"
 msgstr ""
 
-#: src/stored/status.c:308
+#: src/stored/status.c:335
 msgid "    FDSocket closed\n"
 msgstr ""
 
-#: src/stored/status.c:335
+#: src/stored/status.c:352
+msgid ""
+"\n"
+"Jobs waiting to reserve a drive:\n"
+msgstr ""
+
+#: src/stored/status.c:380
 msgid " JobId  Level   Files          Bytes Status   Finished        Name \n"
 msgstr ""
 
-#: src/stored/status.c:469
+#: src/stored/status.c:514
 msgid "3900 Bad .status command, missing argument.\n"
 msgstr ""
 
-#: src/stored/status.c:494
+#: src/stored/status.c:537
 msgid "3900 Bad .status command, wrong argument.\n"
 msgstr ""
 
@@ -12201,46 +12472,46 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/stored.c:220
+#: src/stored/stored.c:222
 msgid "Volume Session Time is ZERO!\n"
 msgstr ""
 
-#: src/stored/stored.c:233
+#: src/stored/stored.c:235
 #, c-format
 msgid "Unable to create thread. ERR=%s\n"
 msgstr ""
 
-#: src/stored/stored.c:272
+#: src/stored/stored.c:273
 #, c-format
 msgid "Only one Storage resource permitted in %s\n"
 msgstr ""
 
-#: src/stored/stored.c:277
+#: src/stored/stored.c:278
 #, c-format
 msgid "No Director resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:282
+#: src/stored/stored.c:283
 #, c-format
 msgid "No Device resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:290
+#: src/stored/stored.c:291
 #, c-format
 msgid "No Messages resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:317
+#: src/stored/stored.c:318
 #, c-format
 msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/stored/stored.c:323
+#: src/stored/stored.c:324
 #, c-format
 msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/stored/stored.c:329
+#: src/stored/stored.c:330
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
@@ -12248,311 +12519,151 @@ msgid ""
 "using \"TLS Verify Peer\".\n"
 msgstr ""
 
-#: src/stored/stored.c:417
-#, c-format
-msgid "No Changer Name given for device %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:423
-#, c-format
-msgid "No Changer Command given for device %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:435
-#, c-format
-msgid ""
-"Media Type not the same for all devices in changer %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:496
+#: src/stored/stored.c:457
 #, c-format
 msgid "Could not initialize %s\n"
 msgstr ""
 
-#: src/stored/stored.c:509
+#: src/stored/stored.c:470
 #, c-format
 msgid "Could not open device %s\n"
 msgstr ""
 
-#: src/stored/stored.c:521
+#: src/stored/stored.c:483
 #, c-format
 msgid "Could not mount device %s\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:188
+#: src/stored/stored_conf.c:216
+#, c-format
+msgid "Expected a Device Type keyword, got: %s"
+msgstr ""
+
+#: src/stored/stored_conf.c:231
 #, c-format
 msgid "Warning: no \"%s\" resource (%d) defined.\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:191
+#: src/stored/stored_conf.c:234
 #, c-format
 msgid "dump_resource type=%d\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:307
+#: src/stored/stored_conf.c:350
 #, c-format
 msgid "Warning: unknown resource type %d\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:496
+#: src/stored/stored_conf.c:539
 #, c-format
 msgid "\"%s\" item is required in \"%s\" resource, but not found.\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:502
+#: src/stored/stored_conf.c:545
 #, c-format
 msgid "Too many items in \"%s\" resource\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:536
+#: src/stored/stored_conf.c:579
 #, c-format
 msgid "Cannot find AutoChanger resource %s\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:607
+#: src/stored/stored_conf.c:650
 #, c-format
 msgid ""
 "Attempt to define second \"%s\" resource named \"%s\" is not permitted.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:83
+#: src/stored/wait.c:114
 #, c-format
-msgid "Read error on device %s in ANSI label. ERR=%s\n"
+msgid "pthread timedwait error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:93
-msgid "Insane! End of tape while reading ANSI label.\n"
+#: src/stored/wait.c:199
+#, c-format
+msgid "Job %s waiting to reserve a device.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:117
-msgid "No VOL1 label while reading ANSI/IBM label.\n"
+#: src/tools/bsmtp.c:85
+#, c-format
+msgid "Fatal malformed reply from %s: %s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:137
+#: src/tools/bsmtp.c:121
 #, c-format
-msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
+msgid ""
+"\n"
+"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n"
+"       -c          set the Cc: field\n"
+"       -dnn        set debug level to nn\n"
+"       -f          set the From: field\n"
+"       -h          use mailhost:port as the SMTP server\n"
+"       -s          set the Subject: field\n"
+"       -r          set the Reply-To: field\n"
+"       -l          set the maximum number of lines that should be sent "
+"(default: unlimited)\n"
+"       -?          print this message.\n"
+"\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:148
-msgid "No HDR1 label while reading ANSI label.\n"
+#: src/tools/bsmtp.c:213
+msgid "Fatal error: no recipient given.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:154
+#: src/tools/bsmtp.c:234
 #, c-format
-msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
+msgid "Fatal gethostname error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:165
-msgid "No HDR2 label while reading ANSI/IBM label.\n"
+#: src/tools/bsmtp.c:238
+#, c-format
+msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:179
-msgid "Unknown or bad ANSI/IBM label record.\n"
+#: src/tools/bsmtp.c:263
+#, c-format
+msgid "Error unknown mail host \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:186
-msgid "Too many records in while reading ANSI/IBM label.\n"
+#: src/tools/bsmtp.c:266
+msgid "Retrying connection using \"localhost\".\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:285
+#: src/tools/bsmtp.c:274
 #, c-format
-msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
+msgid "Fatal error: Unknown address family for smtp host: %d\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:302
+#: src/tools/bsmtp.c:282
 #, c-format
-msgid "Could not write ANSI VOL1 label. ERR=%s\n"
+msgid "Fatal socket error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
+#: src/tools/bsmtp.c:286
 #, c-format
-msgid "Could not write ANSI HDR1 label. ERR=%s\n"
+msgid "Fatal connect error to %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
-msgid "Could not write ANSI HDR1 label.\n"
+#: src/tools/bsmtp.c:291
+#, c-format
+msgid "Fatal dup error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:381
+#: src/tools/bsmtp.c:295 src/tools/bsmtp.c:299
 #, c-format
-msgid "Error writing EOF to tape. ERR=%s"
+msgid "Fatal fdopen error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:386
-msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
+#: src/tools/dbcheck.c:158
+msgid ""
+"Warning skipping the additional parameters for working directory/dbname/user/"
+"password/host.\n"
 msgstr ""
 
-#: src/stored/dvd.c:153
+#: src/tools/dbcheck.c:174
 #, c-format
-msgid "Device %s cannot be mounted. ERR=%s\n"
-msgstr ""
-
-#: src/stored/dvd.c:261
-#, c-format
-msgid "Cannot run free space command (%s)\n"
-msgstr ""
-
-#: src/stored/dvd.c:322
-#, c-format
-msgid "Error while writing current part to the DVD: %s"
-msgstr ""
-
-#: src/stored/dvd.c:343
-#, c-format
-msgid "Remaining free space %s on %s\n"
-msgstr ""
-
-#: src/stored/dvd.c:412
-#, c-format
-msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
-msgstr ""
-
-#: src/stored/dvd.c:430
-#, c-format
-msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
-msgstr ""
-
-#: src/stored/dvd.c:634
-#, c-format
-msgid "Unable to write part %s: ERR=%s\n"
-msgstr ""
-
-#: src/stored/wait.c:178 src/stored/wait.c:236
-#, c-format
-msgid "Job %s waiting to reserve a device.\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:202
-msgid "Error in ParseTuple\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:218
-msgid "Parse tuple error in job_write\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:254
-#, c-format
-msgid "Error in Python method %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:373 src/stored/reserve.c:390
-#, c-format
-msgid "Failed command: %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:375
-#, c-format
-msgid ""
-"\n"
-"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
-"Device resources.\n"
-msgstr ""
-
-#: src/stored/reserve.c:564
-#, c-format
-msgid "3926 Could not get dcr for device: %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:615 src/stored/reserve.c:670
-#, c-format
-msgid "Device %s is BLOCKED due to user unmount.\n"
-msgstr ""
-
-#: src/stored/reserve.c:623
-#, c-format
-msgid "Device %s is busy.\n"
-msgstr ""
-
-#: src/stored/reserve.c:678
-#, c-format
-msgid "Device %s is busy writing on another Volume.\n"
-msgstr ""
-
-#: src/stored/reserve.c:777
-#, c-format
-msgid "Wanted Pool \"%s\", but device %s is using Pool \"%s\" .\n"
-msgstr ""
-
-#: src/stored/reserve.c:784 src/stored/reserve.c:785
-msgid "Logic error!!!! Should not get here.\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:85
-#, c-format
-msgid "Fatal malformed reply from %s: %s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:121
-#, c-format
-msgid ""
-"\n"
-"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n"
-"       -c          set the Cc: field\n"
-"       -dnn        set debug level to nn\n"
-"       -f          set the From: field\n"
-"       -h          use mailhost:port as the SMTP server\n"
-"       -s          set the Subject: field\n"
-"       -?          print this message.\n"
-"\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:204
-msgid "Fatal error: no recipient given.\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:225
-#, c-format
-msgid "Fatal gethostname error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:229
-#, c-format
-msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:254
-#, c-format
-msgid "Error unknown mail host \"%s\": ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:257
-msgid "Retrying connection using \"localhost\".\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:265
-#, c-format
-msgid "Fatal error: Unknown address family for smtp host: %d\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:273
-#, c-format
-msgid "Fatal socket error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:277
-#, c-format
-msgid "Fatal connect error to %s: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:282
-#, c-format
-msgid "Fatal dup error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:286 src/tools/bsmtp.c:290
-#, c-format
-msgid "Fatal fdopen error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/dbcheck.c:158
-msgid ""
-"Warning skipping the additional parameters for working directory/dbname/user/"
-"password/host.\n"
-msgstr ""
-
-#: src/tools/dbcheck.c:174
-#, c-format
-msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n"
+msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n"
 msgstr ""
 
 #: src/tools/dbcheck.c:176
@@ -12888,6 +12999,25 @@ msgstr ""
 msgid "Found %d bad Path records.\n"
 msgstr ""
 
+#: src/tools/fstype.c:34
+#, c-format
+msgid ""
+"\n"
+"Usage: fstype [-d debug_level] path ...\n"
+"\n"
+"       Print the file system type a given file/directory is on.\n"
+"       The following options are supported:\n"
+"\n"
+"       -v     print both path and file system type.\n"
+"       -?     print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tools/fstype.c:86
+#, c-format
+msgid "%s: unknown\n"
+msgstr ""
+
 #: src/tools/testfind.c:49
 #, c-format
 msgid ""
@@ -13033,23 +13163,9 @@ msgstr ""
 msgid "Skip: File system change prohibited. Directory not entered. %s\n"
 msgstr ""
 
-#: src/tools/fstype.c:34
-#, c-format
-msgid ""
-"\n"
-"Usage: fstype [-d debug_level] path ...\n"
-"\n"
-"       Print the file system type a given file/directory is on.\n"
-"       The following options are supported:\n"
-"\n"
-"       -v     print both path and file system type.\n"
-"       -?     print this message.\n"
-"\n"
-msgstr ""
-
-#: src/tools/fstype.c:86
+#: src/tools/bwild.c:105 src/tools/bregex.c:121
 #, c-format
-msgid "%s: unknown\n"
+msgid "Could not open data file: %s\n"
 msgstr ""
 
 #: src/tray-monitor/authenticate.c:78
@@ -13178,24 +13294,11 @@ msgstr ""
 
 #: src/tray-monitor/tray-monitor.c:503 src/tray-monitor/tray-monitor.c:513
 msgid ""
-"Copyright (C) 2004 Kern Sibbald and John Walker\n"
+"Copyright (C) 2004-2005 Kern Sibbald\n"
 "Written by Nicolas Boichat\n"
 msgstr ""
 
-#: src/tray-monitor/tray-monitor.c:505
-msgid "Version"
-msgstr ""
-
-#: src/tray-monitor/tray-monitor.c:509
-#, c-format
-msgid ""
-"%s\n"
-"\n"
-"%s\n"
-"%s %s (%s) %s %s %s"
-msgstr ""
-
-#: src/tray-monitor/tray-monitor.c:515
+#: src/tray-monitor/tray-monitor.c:505 src/tray-monitor/tray-monitor.c:515
 msgid "Version:"
 msgstr ""
 
@@ -13391,7 +13494,7 @@ msgstr ""
 msgid "<< Error: BNET_PROMPT signal received. >>\n"
 msgstr ""
 
-#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:445
+#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:465
 msgid "<< Heartbeat signal received, answered. >>\n"
 msgstr ""
 
@@ -13436,710 +13539,899 @@ msgstr ""
 msgid "Storage: name=%s address=%s SDport=%d\n"
 msgstr ""
 
-#: src/wx-console/authenticate.c:126
+#: src/wx-console/authenticate.c:129
 msgid "Bad response to Hello command: ERR="
 msgstr ""
 
-#: src/baconfig.h:52
+#: src/baconfig.h:55
 #, c-format
 msgid "Failed ASSERT: %s\n"
 msgstr ""
 
-#: src/baconfig.h:59
+#: src/baconfig.h:62
 msgid "*None*"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:103
-#, c-format
-msgid ""
-"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
-"Director \"%s\" in config file.\n"
-" At least one CA certificate store is required.\n"
-msgstr ""
-
-#: src/wx-console/console_thread.cpp:112
-msgid ""
-"No Director resource defined in config file.\n"
-"Without that I don't how to speak to the Director :-(\n"
+#: src/filed/win32/winmain.cpp:228 src/filed/win32/winmain.cpp:236
+msgid "Bacula Usage"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:132
-#, c-format
-msgid ""
-"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
-"Console \"%s\" in config file.\n"
+#: src/filed/win32/winmain.cpp:233
+msgid "Bad Command Line Options"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:154
-msgid "Error while initializing windows sockets...\n"
+#: src/filed/win32/winmain.cpp:326
+msgid "Another instance of Bacula is already running"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:169
-msgid "Error while cleaning up windows sockets...\n"
+#: src/filed/win32/winservice.cpp:131 src/filed/win32/winservice.cpp:145
+msgid "No existing instance of Bacula could be contacted"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:207
-msgid "Error while initializing library."
+#: src/filed/win32/winservice.cpp:218
+msgid "KERNEL32.DLL not found: Bacula service not started"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:237
-msgid "Please correct configuration file.\n"
+#: src/filed/win32/winservice.cpp:228
+msgid "Registry service not found: Bacula service not started"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:270
-msgid "Error : Library not initialized\n"
+#: src/filed/win32/winservice.cpp:230
+msgid "Registry service not found"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:281
-msgid "Error : No configuration file loaded\n"
+#: src/filed/win32/winservice.cpp:260
+msgid "StartServiceCtrlDispatcher failed."
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:291
-msgid "Connecting...\n"
+#: src/filed/win32/winservice.cpp:278
+msgid "RegisterServiceCtlHandler failed"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:307
-msgid "Error : No director defined in config file.\n"
+#: src/filed/win32/winservice.cpp:279
+msgid "Contact Register Service Handler failure"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:319
-msgid "Multiple directors found in your config file.\n"
+#: src/filed/win32/winservice.cpp:295
+msgid "ReportStatus STOPPED failed 1"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:328
-#, c-format
-msgid "Please choose a director (1-%d): "
+#: src/filed/win32/winservice.cpp:318
+msgid "Report Service failure"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:400
-msgid "Failed to connect to the director\n"
+#: src/filed/win32/winservice.cpp:355
+msgid "Unable to install Bacula service"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:410
-msgid "Connected\n"
+#: src/filed/win32/winservice.cpp:373
+msgid "Service command length too long"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:448
-msgid "<< Unexpected signal received : "
+#: src/filed/win32/winservice.cpp:374
+msgid "Service command length too long. Service not registered."
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:466
-msgid "Connection terminated\n"
+#: src/filed/win32/winservice.cpp:389
+msgid "Cannot write System Registry"
 msgstr ""
 
-#: src/wx-console/main.cpp:101
-msgid "Bacula wx-console"
+#: src/filed/win32/winservice.cpp:390
+msgid ""
+"The System Registry could not be updated - the Bacula service was not "
+"installed"
 msgstr ""
 
-#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
-#, c-format
-msgid "Welcome to bacula wx-console %s (%s)!\n"
+#: src/filed/win32/winservice.cpp:397
+msgid "Cannot add Bacula key to System Registry"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:41
-msgid "Config file editor"
+#: src/filed/win32/winservice.cpp:398 src/filed/win32/winservice.cpp:449
+msgid "The Bacula service could not be installed"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:57
-msgid "Save and close"
+#: src/filed/win32/winservice.cpp:406
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started by double clicking on the\n"
+"Bacula \"Start\" icon and will be automatically\n"
+"be run the next time this machine is rebooted. "
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:58
-msgid "Close without saving"
+#: src/filed/win32/winservice.cpp:424
+msgid ""
+"The Service Control Manager could not be contacted - the Bacula service was "
+"not installed"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:69
-msgid "# Bacula wx-console Configuration File\n"
+#: src/filed/win32/winservice.cpp:455
+msgid ""
+"Provides file backup and restore services. Bacula -- the network backup "
+"solution."
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:100
-#, c-format
-msgid "Unable to write to %s\n"
+#: src/filed/win32/winservice.cpp:462
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started from the Control Panel and will\n"
+"automatically be run the next time this machine is rebooted."
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:101
-msgid "Error while saving"
+#: src/filed/win32/winservice.cpp:471
+msgid ""
+"Unknown Windows operating system.\n"
+"Cannot install Bacula service.\n"
 msgstr ""
 
-#: src/wx-console/wxbconfigpanel.cpp:184
-msgid "Apply"
+#: src/filed/win32/winservice.cpp:496
+msgid ""
+"Could not find registry entry.\n"
+"Service probably not registerd - the Bacula service was not removed"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:61
-#: src/wx-console/wxbhistorytextctrl.cpp:132
-#: src/wx-console/wxbmainframe.cpp:272
-msgid "Type your command below:"
+#: src/filed/win32/winservice.cpp:501
+msgid ""
+"Could not delete Registry key.\n"
+"The Bacula service could not be removed"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:96
-msgid "Unknown command."
+#: src/filed/win32/winservice.cpp:511
+msgid "Bacula could not be contacted, probably not running"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:105
-msgid "Possible completions: "
+#: src/filed/win32/winservice.cpp:517 src/filed/win32/winservice.cpp:553
+msgid "The Bacula service has been removed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:258
-#: src/wx-console/wxbrestorepanel.cpp:1861
-#: src/wx-console/wxbrestorepanel.cpp:1890
-msgid "Enter restore mode"
+#: src/filed/win32/winservice.cpp:547
+msgid "The Bacula service could not be stopped"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:261
-msgid "Cancel restore"
+#: src/filed/win32/winservice.cpp:555
+msgid "The Bacula service could not be removed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:287
-#: src/wx-console/wxbrestorepanel.cpp:341
-msgid "Add"
+#: src/filed/win32/winservice.cpp:560
+msgid "The Bacula service could not be found"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:289
-#: src/wx-console/wxbrestorepanel.cpp:343
-msgid "Remove"
+#: src/filed/win32/winservice.cpp:565
+msgid "The SCM could not be contacted - the Bacula service was not removed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:291
-#: src/wx-console/wxbrestorepanel.cpp:345
-msgid "Refresh"
+#: src/filed/win32/winservice.cpp:629
+msgid "SetServiceStatus failed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:310
-msgid "M"
+#: src/filed/win32/winservice.cpp:657
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s error: %ld at %s:%d"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:326
-msgid "Perm."
+#: src/filed/win32/winservice.cpp:732
+#, c-format
+msgid "Locked by: %s, duration: %ld seconds\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:359
-#: src/wx-console/wxbrestorepanel.cpp:372
-#: src/wx-console/wxbrestorepanel.cpp:524
-#: src/wx-console/wxbrestorepanel.cpp:534
-#: src/wx-console/wxbrestorepanel.cpp:537
-#: src/wx-console/wxbrestorepanel.cpp:1732
-#: src/wx-console/wxbrestorepanel.cpp:1812
-msgid "Job Name"
+#: src/filed/win32/winservice.cpp:736
+#, c-format
+msgid "No longer locked\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:361
-#: src/wx-console/wxbrestorepanel.cpp:377
-#: src/wx-console/wxbrestorepanel.cpp:476
-#: src/wx-console/wxbrestorepanel.cpp:477
-#: src/wx-console/wxbrestorepanel.cpp:487
-#: src/wx-console/wxbrestorepanel.cpp:488
-#: src/wx-console/wxbrestorepanel.cpp:1101
-#: src/wx-console/wxbrestorepanel.cpp:1768
-#: src/wx-console/wxbrestorepanel.cpp:1827
-msgid "Fileset"
+#: src/filed/win32/winservice.cpp:740
+msgid "Could not lock database"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:364
-#: src/wx-console/wxbrestorepanel.cpp:1168
-#: src/wx-console/wxbrestorepanel.cpp:1183
-#: src/wx-console/wxbrestorepanel.cpp:1185
-#: src/wx-console/wxbrestorepanel.cpp:1193
-#: src/wx-console/wxbrestorepanel.cpp:1195
-#: src/wx-console/wxbrestorepanel.cpp:1212
-#: src/wx-console/wxbrestorepanel.cpp:1219
-#: src/wx-console/wxbrestorepanel.cpp:1759
-#: src/wx-console/wxbrestorepanel.cpp:1885
-msgid "Before"
+#: src/wx-console/console_thread.cpp:101
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Director \"%s\" in config file.\n"
+"At least one CA certificate store is required.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:366
-msgid "Please configure parameters concerning files to restore :"
+#: src/wx-console/console_thread.cpp:108
+msgid ""
+"No Director resource defined in config file.\n"
+"Without that I don't how to speak to the Director :-(\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-#: src/wx-console/wxbrestorepanel.cpp:1820
-msgid "always"
+#: src/wx-console/console_thread.cpp:127
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Console \"%s\" in config file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-msgid "if newer"
+#: src/wx-console/console_thread.cpp:148
+msgid "Error while initializing windows sockets...\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-msgid "if older"
+#: src/wx-console/console_thread.cpp:163
+msgid "Error while cleaning up windows sockets...\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-#: src/wx-console/wxbrestorepanel.cpp:1823
-msgid "never"
+#: src/wx-console/console_thread.cpp:201
+msgid "Error while initializing library."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:383
-msgid "Please configure parameters concerning files restoration :"
+#: src/wx-console/console_thread.cpp:227
+msgid "Cryptographic library initialization failed.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:448
-msgid "Getting parameters list."
+#: src/wx-console/console_thread.cpp:231
+msgid "Please correct configuration file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:456
-msgid "Error : no clients returned by the director."
+#: src/wx-console/console_thread.cpp:273
+msgid "Error : Library not initialized\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:480
-msgid "Error : no filesets returned by the director."
+#: src/wx-console/console_thread.cpp:284
+msgid "Error : No configuration file loaded\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:504
-msgid "Error : no storage returned by the director."
+#: src/wx-console/console_thread.cpp:294
+msgid "Connecting...\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:527
-#: src/wx-console/wxbrestorepanel.cpp:551
-msgid "Error : no jobs returned by the director."
+#: src/wx-console/console_thread.cpp:310
+msgid "Error : No director defined in config file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:537
-msgid "RestoreFiles"
+#: src/wx-console/console_thread.cpp:322
+msgid "Multiple directors found in your config file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:572
-msgid "Please configure your restore parameters."
+#: src/wx-console/console_thread.cpp:331
+#, c-format
+msgid "Please choose a director (1-%d): "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:583
-msgid "Building restore tree..."
+#: src/wx-console/console_thread.cpp:403
+msgid "Failed to connect to the director\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:622
-msgid "Error while starting restore: "
+#: src/wx-console/console_thread.cpp:413
+msgid "Connected\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:712
-msgid ""
-"Right click on a file or on a directory, or double-click on its mark to add "
-"it to the restore list."
+#: src/wx-console/console_thread.cpp:470
+msgid "<< Unexpected signal received : "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:729
-msgid " files selected to be restored."
+#: src/wx-console/console_thread.cpp:490
+msgid "Connection terminated\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:734
-msgid " file selected to be restored."
+#: src/wx-console/main.cpp:101
+msgid "Bacula wx-console"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:741
+#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
 #, c-format
-msgid "Please configure your restore (%ld files selected to be restored)..."
+msgid "Welcome to bacula wx-console %s (%s)!\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:751
-msgid "Restore failed : no file selected.\n"
+#: src/wx-console/wxbconfigfileeditor.cpp:44
+msgid "Config file editor"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:752
-msgid "Restore failed : no file selected."
+#: src/wx-console/wxbconfigfileeditor.cpp:54
+msgid "# Bacula wx-console Configuration File\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:762
-msgid "Restoring, please wait..."
+#: src/wx-console/wxbconfigfileeditor.cpp:90
+msgid "Save and close"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:775
-msgid "Job started. JobId="
+#: src/wx-console/wxbconfigfileeditor.cpp:91
+msgid "Close without saving"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:777
-msgid "Restore started, jobid="
+#: src/wx-console/wxbconfigfileeditor.cpp:118
+#, c-format
+msgid "Unable to write to %s\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:781
-msgid "Job failed."
+#: src/wx-console/wxbconfigfileeditor.cpp:119
+msgid "Error while saving"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:782
-msgid "Restore failed, please look at messages.\n"
+#: src/wx-console/wxbconfigpanel.cpp:184
+msgid "Apply"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:783
-msgid "Restore failed, please look at messages in console."
+#: src/wx-console/wxbhistorytextctrl.cpp:61
+#: src/wx-console/wxbhistorytextctrl.cpp:132
+#: src/wx-console/wxbmainframe.cpp:272
+msgid "Type your command below:"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:789
-#: src/wx-console/wxbrestorepanel.cpp:790
-msgid "Failed to retrieve jobid.\n"
+#: src/wx-console/wxbhistorytextctrl.cpp:96
+msgid "Unknown command."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:816
-msgid ""
-"Restore is scheduled in more than two minutes, wx-console will not wait for "
-"its completion.\n"
+#: src/wx-console/wxbhistorytextctrl.cpp:105
+msgid "Possible completions: "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:817
-msgid ""
-"Restore is scheduled in more than two minutes, wx-console will not wait for "
-"its completion."
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "&About...\tF1"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:841
-msgid "Restore job created, but not yet running."
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "Show about dialog"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:846
-#, c-format
-msgid "Restore job running, please wait (%ld of %ld files restored)..."
+#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:598
+msgid "Connect to the director"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:850
-msgid "Restore job terminated successfully."
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:851
-msgid "Restore job terminated successfully.\n"
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect of the director"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:856
-msgid "Restore job terminated in error, see messages in console."
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change of configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:857
-msgid "Restore job terminated in error, see messages.\n"
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change your default configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:862
-msgid "Restore job reported a non-fatal error."
+#: src/wx-console/wxbmainframe.cpp:233
+msgid "Edit your configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:866
-msgid "Restore job reported a fatal error."
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "E&xit\tAlt-X"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:871
-msgid "Restore job cancelled by user."
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "Quit this program"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:872
-msgid "Restore job cancelled by user.\n"
+#: src/wx-console/wxbmainframe.cpp:239
+msgid "&File"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:877
-msgid "Restore job is waiting on File daemon."
+#: src/wx-console/wxbmainframe.cpp:240
+msgid "&Help"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:881
-msgid "Restore job is waiting for new media."
+#: src/wx-console/wxbmainframe.cpp:257
+msgid "Console"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:885
-msgid "Restore job is waiting for storage resource."
+#: src/wx-console/wxbmainframe.cpp:264
+msgid ""
+"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:889
-msgid "Restore job is waiting for job resource."
+#: src/wx-console/wxbmainframe.cpp:268
+msgid ""
+"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
+"support when handling non-ASCII filenames: Every non-ASCII character in such "
+"filenames will be replaced by an interrogation mark.\n"
+"If this behaviour disturbs you, please build wx-console against a Unicode "
+"version of wxWidgets for GTK+ 2.0.\n"
+"---\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:893
-msgid "Restore job is waiting for Client resource."
+#: src/wx-console/wxbmainframe.cpp:279
+msgid "Send"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:897
-msgid "Restore job is waiting for maximum jobs."
+#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
+msgid "Error while parsing command line arguments, using defaults.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:901
-msgid "Restore job is waiting for start time."
+#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
+msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:905
-msgid "Restore job is waiting for higher priority jobs to finish."
+#: src/wx-console/wxbmainframe.cpp:397
+#, c-format
+msgid ""
+"It seems that it is the first time you run wx-console.\n"
+"This file (%s) has been choosen as default configuration file.\n"
+"Do you want to edit it? (if you click No you will have to select another "
+"file)"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:954
+#: src/wx-console/wxbmainframe.cpp:399
+msgid "First run"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:416
+#, c-format
 msgid ""
-"The restore job has not been started within one minute, wx-console will not "
-"wait for its completion anymore.\n"
+"Unable to read %s\n"
+"Error: %s\n"
+"Do you want to choose another one? (Press no to edit this file)"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:955
+#: src/wx-console/wxbmainframe.cpp:418
+msgid "Unable to read configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:430
+msgid "Please choose a configuration file to use"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:443
+msgid "This configuration file has been successfully read, use it as default?"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:444
+msgid "Configuration file read successfully"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:454
+#, c-format
+msgid "Using this configuration file: %s\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:459
+msgid "Connecting to the director..."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:474
+msgid "Failed to unregister a data parser !"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:482
+msgid "Quitting.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:497
 msgid ""
-"The restore job has not been started within one minute, wx-console will not "
-"wait for its completion anymore."
+"Welcome to Bacula wx-console.\n"
+"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
+"(C) 2005 Kern Sibbald\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:965
-msgid "Restore done successfully.\n"
+#: src/wx-console/wxbmainframe.cpp:499
+msgid "About Bacula wx-console"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:966
-msgid "Restore done successfully."
+#: src/wx-console/wxbmainframe.cpp:505
+msgid "Please choose your default configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1037
-msgid "Applying restore configuration changes..."
+#: src/wx-console/wxbmainframe.cpp:509
+msgid "Use this configuration file as default?"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1088
-msgid "Failed to find the selected client."
+#: src/wx-console/wxbmainframe.cpp:510
+msgid "Configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1103
-msgid "Failed to find the selected fileset."
+#: src/wx-console/wxbmainframe.cpp:581
+msgid "Console thread terminated."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1118
-msgid "Failed to find the selected storage."
+#: src/wx-console/wxbmainframe.cpp:589
+msgid "Connection to the director lost. Quit program?"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1135
-#: src/wx-console/wxbrestorepanel.cpp:1801
-msgid "Run Restore job"
+#: src/wx-console/wxbmainframe.cpp:590
+msgid "Connection lost"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1151
-msgid "Restore configuration changes were applied."
+#: src/wx-console/wxbmainframe.cpp:606
+msgid "Connected to the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1160
-msgid "Restore cancelled.\n"
+#: src/wx-console/wxbmainframe.cpp:629
+msgid "Reconnect"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1161
-msgid "Restore cancelled."
+#: src/wx-console/wxbmainframe.cpp:630
+msgid "Reconnect to the director"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1182
-msgid "No results to list."
+#: src/wx-console/wxbmainframe.cpp:644
+msgid "Disconnected of the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1184
-msgid "No backup found for this client."
+#: src/wx-console/wxbmainframe.cpp:663 src/wx-console/wxbrestorepanel.cpp:689
+msgid "Unexpected question has been received.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1191
-msgid "ERROR"
+#: src/wx-console/wxbmainframe.cpp:686 src/wx-console/wxbmainframe.cpp:703
+msgid "wx-console: unexpected director's question."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1192
-msgid "Query failed"
+#: src/wx-console/wxbrestorepanel.cpp:216
+#: src/wx-console/wxbrestorepanel.cpp:1895
+#: src/wx-console/wxbrestorepanel.cpp:1924
+msgid "Enter restore mode"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1194
-msgid "Cannot get previous backups list, see console."
+#: src/wx-console/wxbrestorepanel.cpp:219
+msgid "Cancel restore"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1811
-msgid "JobName:"
+#: src/wx-console/wxbrestorepanel.cpp:245
+#: src/wx-console/wxbrestorepanel.cpp:299
+msgid "Add"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1815
-msgid "Where:"
+#: src/wx-console/wxbrestorepanel.cpp:247
+#: src/wx-console/wxbrestorepanel.cpp:301
+msgid "Remove"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1818
-msgid "Replace:"
+#: src/wx-console/wxbrestorepanel.cpp:249
+#: src/wx-console/wxbrestorepanel.cpp:303
+msgid "Refresh"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1821
-msgid "ifnewer"
+#: src/wx-console/wxbrestorepanel.cpp:268
+msgid "M"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1822
-msgid "ifolder"
+#: src/wx-console/wxbrestorepanel.cpp:272
+msgid "Filename"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1826
-msgid "FileSet:"
+#: src/wx-console/wxbrestorepanel.cpp:284
+msgid "Perm."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1942
-msgid "Restoring..."
+#: src/wx-console/wxbrestorepanel.cpp:317
+#: src/wx-console/wxbrestorepanel.cpp:330
+#: src/wx-console/wxbrestorepanel.cpp:482
+#: src/wx-console/wxbrestorepanel.cpp:492
+#: src/wx-console/wxbrestorepanel.cpp:495
+#: src/wx-console/wxbrestorepanel.cpp:1760
+#: src/wx-console/wxbrestorepanel.cpp:1846
+msgid "Job Name"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:227
-msgid "&About...\tF1"
+#: src/wx-console/wxbrestorepanel.cpp:319
+#: src/wx-console/wxbrestorepanel.cpp:335
+#: src/wx-console/wxbrestorepanel.cpp:434
+#: src/wx-console/wxbrestorepanel.cpp:435
+#: src/wx-console/wxbrestorepanel.cpp:445
+#: src/wx-console/wxbrestorepanel.cpp:446
+#: src/wx-console/wxbrestorepanel.cpp:1118
+#: src/wx-console/wxbrestorepanel.cpp:1191
+#: src/wx-console/wxbrestorepanel.cpp:1798
+#: src/wx-console/wxbrestorepanel.cpp:1800
+#: src/wx-console/wxbrestorepanel.cpp:1861
+msgid "Fileset"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:227
-msgid "Show about dialog"
+#: src/wx-console/wxbrestorepanel.cpp:322
+#: src/wx-console/wxbrestorepanel.cpp:1185
+#: src/wx-console/wxbrestorepanel.cpp:1201
+#: src/wx-console/wxbrestorepanel.cpp:1203
+#: src/wx-console/wxbrestorepanel.cpp:1211
+#: src/wx-console/wxbrestorepanel.cpp:1213
+#: src/wx-console/wxbrestorepanel.cpp:1232
+#: src/wx-console/wxbrestorepanel.cpp:1239
+#: src/wx-console/wxbrestorepanel.cpp:1788
+#: src/wx-console/wxbrestorepanel.cpp:1799
+#: src/wx-console/wxbrestorepanel.cpp:1919
+msgid "Before"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:591
-msgid "Connect to the director"
+#: src/wx-console/wxbrestorepanel.cpp:324
+msgid "Please configure parameters concerning files to restore :"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:230
-msgid "Disconnect"
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1854
+msgid "always"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:230
-msgid "Disconnect of the director"
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if newer"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:232
-msgid "Change of configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if older"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:232
-msgid "Change your default configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1857
+msgid "never"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:233
-msgid "Edit your configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:341
+msgid "Please configure parameters concerning files restoration :"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:235
-msgid "E&xit\tAlt-X"
+#: src/wx-console/wxbrestorepanel.cpp:406
+msgid "Getting parameters list."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:235
-msgid "Quit this program"
+#: src/wx-console/wxbrestorepanel.cpp:414
+msgid "Error : no clients returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:239
-msgid "&File"
+#: src/wx-console/wxbrestorepanel.cpp:438
+msgid "Error : no filesets returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:240
-msgid "&Help"
+#: src/wx-console/wxbrestorepanel.cpp:462
+msgid "Error : no storage returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:257
-msgid "Console"
+#: src/wx-console/wxbrestorepanel.cpp:485
+#: src/wx-console/wxbrestorepanel.cpp:509
+msgid "Error : no jobs returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:264
-msgid ""
-"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
+#: src/wx-console/wxbrestorepanel.cpp:495
+msgid "RestoreFiles"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:268
+#: src/wx-console/wxbrestorepanel.cpp:530
+msgid "Please configure your restore parameters."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:541
+msgid "Building restore tree..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:584
+msgid "Error while starting restore: "
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:674
 msgid ""
-"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
-"support when handling non-ASCII filenames: Every non-ASCII character in such "
-"filenames will be replaced by an interrogation mark.\n"
-"If this behaviour disturbs you, please build wx-console against a Unicode "
-"version of wxWidgets for GTK+ 2.0.\n"
-"---\n"
+"Right click on a file or on a directory, or double-click on its mark to add "
+"it to the restore list."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:279
-msgid "Send"
+#: src/wx-console/wxbrestorepanel.cpp:711
+#: src/wx-console/wxbrestorepanel.cpp:733
+msgid "wx-console: unexpected restore question."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
-msgid "Error while parsing command line arguments, using defaults.\n"
+#: src/wx-console/wxbrestorepanel.cpp:744
+msgid " files selected to be restored."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
-msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
+#: src/wx-console/wxbrestorepanel.cpp:749
+msgid " file selected to be restored."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:397
+#: src/wx-console/wxbrestorepanel.cpp:756
 #, c-format
+msgid "Please configure your restore (%ld files selected to be restored)..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:766
+msgid "Restore failed : no file selected.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:767
+msgid "Restore failed : no file selected."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:777
+msgid "Restoring, please wait..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:790
+msgid "Job started. JobId="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:792
+msgid "Restore started, jobid="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:796
+msgid "Job failed."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:797
+msgid "Restore failed, please look at messages.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:798
+msgid "Restore failed, please look at messages in console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:804
+#: src/wx-console/wxbrestorepanel.cpp:805
+msgid "Failed to retrieve jobid.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:831
 msgid ""
-"It seems that it is the first time you run wx-console.\n"
-"This file (%s) has been choosen as default configuration file.\n"
-"Do you want to edit it? (if you click No you will have to select another "
-"file)"
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:401
-msgid "First run"
+#: src/wx-console/wxbrestorepanel.cpp:832
+msgid ""
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:418
+#: src/wx-console/wxbrestorepanel.cpp:858
+msgid "Restore job created, but not yet running."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:863
 #, c-format
-msgid ""
-"Unable to read %s\n"
-"Error: %s\n"
-"Do you want to choose another one? (Press no to edit this file)"
+msgid "Restore job running, please wait (%ld of %ld files restored)..."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:422
-msgid "Unable to read configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:867
+msgid "Restore job terminated successfully."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:434
-msgid "Please choose a configuration file to use"
+#: src/wx-console/wxbrestorepanel.cpp:868
+msgid "Restore job terminated successfully.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:447
-msgid "This configuration file has been successfully read, use it as default?"
+#: src/wx-console/wxbrestorepanel.cpp:873
+msgid "Restore job terminated in error, see messages in console."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:448
-msgid "Configuration file read successfully"
+#: src/wx-console/wxbrestorepanel.cpp:874
+msgid "Restore job terminated in error, see messages.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:458
-#, c-format
-msgid "Using this configuration file: %s\n"
+#: src/wx-console/wxbrestorepanel.cpp:879
+msgid "Restore job reported a non-fatal error."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:463
-msgid "Connecting to the director..."
+#: src/wx-console/wxbrestorepanel.cpp:883
+msgid "Restore job reported a fatal error."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:478
-msgid "Failed to unregister a data parser !"
+#: src/wx-console/wxbrestorepanel.cpp:888
+msgid "Restore job cancelled by user."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:486
-msgid "Quitting.\n"
+#: src/wx-console/wxbrestorepanel.cpp:889
+msgid "Restore job cancelled by user.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:501
+#: src/wx-console/wxbrestorepanel.cpp:894
+msgid "Restore job is waiting on File daemon."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:898
+msgid "Restore job is waiting for new media."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:902
+msgid "Restore job is waiting for storage resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:906
+msgid "Restore job is waiting for job resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:910
+msgid "Restore job is waiting for Client resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:914
+msgid "Restore job is waiting for maximum jobs."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:918
+msgid "Restore job is waiting for start time."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:922
+msgid "Restore job is waiting for higher priority jobs to finish."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:971
 msgid ""
-"Welcome to Bacula wx-console.\n"
-"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
-"(C) 2005 Kern Sibbald\n"
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:503
-msgid "About Bacula wx-console"
+#: src/wx-console/wxbrestorepanel.cpp:972
+msgid ""
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:509
-msgid "Please choose your default configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:982
+msgid "Restore done successfully.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:513
-msgid "Use this configuration file as default?"
+#: src/wx-console/wxbrestorepanel.cpp:983
+msgid "Restore done successfully."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:514
-msgid "Configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:1054
+msgid "Applying restore configuration changes..."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:578
-msgid "Console thread terminated."
+#: src/wx-console/wxbrestorepanel.cpp:1105
+msgid "Failed to find the selected client."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:582
-msgid "Connection to the director lost. Quit program?"
+#: src/wx-console/wxbrestorepanel.cpp:1120
+msgid "Failed to find the selected fileset."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:583
-msgid "Connection lost"
+#: src/wx-console/wxbrestorepanel.cpp:1135
+msgid "Failed to find the selected storage."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:599
-msgid "Connected to the director."
+#: src/wx-console/wxbrestorepanel.cpp:1152
+#: src/wx-console/wxbrestorepanel.cpp:1835
+msgid "Run Restore job"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:613
-msgid "Reconnect"
+#: src/wx-console/wxbrestorepanel.cpp:1168
+msgid "Restore configuration changes were applied."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:614
-msgid "Reconnect to the director"
+#: src/wx-console/wxbrestorepanel.cpp:1177
+msgid "Restore cancelled.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:624
-msgid "Disconnected of the director."
+#: src/wx-console/wxbrestorepanel.cpp:1178
+msgid "Restore cancelled."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:643
-msgid "Unexpected question has been received.\n"
+#: src/wx-console/wxbrestorepanel.cpp:1200
+msgid "No results to list."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:666 src/wx-console/wxbmainframe.cpp:681
-msgid "wx-console: unexpected director's question."
+#: src/wx-console/wxbrestorepanel.cpp:1202
+msgid "No backup found for this client."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1209
+msgid "ERROR"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1210
+msgid "Query failed"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1212
+msgid "Cannot get previous backups list, see console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1845
+msgid "JobName:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1849
+msgid "Where:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1852
+msgid "Replace:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1855
+msgid "ifnewer"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1856
+msgid "ifolder"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1860
+msgid "FileSet:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1976
+msgid "Restoring..."
 msgstr ""
index 62ef03365614148ae95ccf02a7ed21c3373d1c7a..9c671bc5e194b7e224a2a62ad62b5e42c0377ffd 100644 (file)
Binary files a/bacula/po/de.gmo and b/bacula/po/de.gmo differ
index 0485e5a5d398feaaa9ada2c7a18c0269c692717c..53b20e8020234029003540009ce92290d0126cdc 100644 (file)
@@ -1,6 +1,6 @@
 # German translations for Bacula package
 # German messages for Bacula.
-# Copyright (C) 2005 Kern Sibbald
+# Copyright (C) 2005-2006  Kern Sibbald
 # This file is distributed under the same license as the Bacula package.
 #  <bacula-devel@lists.sourceforge.net>, 2005.
 #
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Bacula 1.38\n"
 "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2005-08-19 11:20+0200\n"
+"POT-Creation-Date: 2006-05-02 16:47+0200\n"
 "PO-Revision-Date: 2005-08-11 14:05+0200\n"
 "Last-Translator:  <bacula-devel@lists.sourceforge.net\n"
 "Language-Team: German <bacula-devel@lists.sourceforge.net>\n"
@@ -17,35 +17,35 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/cats/bdb.c:135
+#: src/cats/bdb.c:128
 msgid "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
 msgstr ""
 
-#: src/cats/bdb.c:136
+#: src/cats/bdb.c:129
 msgid "WARNING!!!! The Internal Database is NOT OPERATIONAL!\n"
 msgstr ""
 
-#: src/cats/bdb.c:137
+#: src/cats/bdb.c:130
 msgid "You should use SQLite, PostgreSQL, or MySQL\n"
 msgstr ""
 
-#: src/cats/bdb.c:159 src/cats/mysql.c:130 src/cats/postgresql.c:128
+#: src/cats/bdb.c:152 src/cats/mysql.c:124 src/cats/postgresql.c:128
 #: src/cats/sqlite.c:122
 #, c-format
 msgid "Unable to initialize DB lock. ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:169
+#: src/cats/bdb.c:162
 #, c-format
 msgid "Unable to open Catalog DB control file %s: ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:224
+#: src/cats/bdb.c:217
 #, c-format
 msgid "Error reading catalog DB control file. ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:227
+#: src/cats/bdb.c:220
 #, c-format
 msgid ""
 "Error, catalog DB control file wrong version. Wanted %d, got %d\n"
@@ -62,11 +62,11 @@ msgstr ""
 msgid "Error updating DB Media file. ERR=%s\n"
 msgstr ""
 
-#: src/cats/mysql.c:66
+#: src/cats/mysql.c:60
 msgid "A user name for MySQL must be supplied.\n"
 msgstr ""
 
-#: src/cats/mysql.c:167
+#: src/cats/mysql.c:161
 #, c-format
 msgid ""
 "Unable to connect to MySQL server. \n"
@@ -74,7 +74,7 @@ msgid ""
 "It is probably not running or your password is incorrect.\n"
 msgstr ""
 
-#: src/cats/mysql.c:326 src/cats/postgresql.c:264 src/cats/sqlite.c:323
+#: src/cats/mysql.c:321 src/cats/postgresql.c:266 src/cats/sqlite.c:323
 #, c-format
 msgid "Query failed: %s: ERR=%s\n"
 msgstr ""
@@ -91,7 +91,7 @@ msgid ""
 "It is probably not running or your password is incorrect.\n"
 msgstr ""
 
-#: src/cats/postgresql.c:506
+#: src/cats/postgresql.c:508
 #, c-format
 msgid "error fetching currval: %s\n"
 msgstr ""
@@ -134,15 +134,15 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:772
-#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:563
-#: src/cats/sql_get.c:638 src/cats/sql_get.c:865
+#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:773
+#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:564
+#: src/cats/sql_get.c:639 src/cats/sql_get.c:866
 #, c-format
 msgid "error fetching row: %s\n"
 msgstr ""
 
-#: src/cats/sql.c:326 src/dird/catreq.c:360 src/dird/catreq.c:392
-#: src/dird/catreq.c:417
+#: src/cats/sql.c:326 src/dird/catreq.c:367 src/dird/catreq.c:399
+#: src/dird/catreq.c:424
 #, c-format
 msgid "Attribute create error. %s"
 msgstr ""
@@ -161,215 +161,141 @@ msgstr ""
 msgid "Create DB Job record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:91 src/dird/dird_conf.c:532 src/dird/ua_cmds.c:422
-#: src/dird/ua_prune.c:454 src/dird/ua_run.c:643 src/dird/ua_select.c:228
-#: src/dird/ua_select.c:249
-msgid "Job"
-msgstr ""
-
-#: src/cats/sql_create.c:131
+#: src/cats/sql_create.c:132
 #, c-format
 msgid "Create JobMedia record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:140
+#: src/cats/sql_create.c:141
 #, c-format
 msgid "Update Media record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:170
+#: src/cats/sql_create.c:171
 #, c-format
 msgid "pool record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:196
+#: src/cats/sql_create.c:197
 #, c-format
 msgid "Create db Pool record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:201 src/dird/ua_run.c:650 src/dird/ua_select.c:464
-#: src/dird/ua_select.c:554 src/dird/ua_update.c:356 src/dird/ua_update.c:426
-#: src/wx-console/wxbrestorepanel.cpp:362
-#: src/wx-console/wxbrestorepanel.cpp:548
-#: src/wx-console/wxbrestorepanel.cpp:558
-#: src/wx-console/wxbrestorepanel.cpp:1754
-msgid "Pool"
-msgstr ""
-
-#: src/cats/sql_create.c:227
+#: src/cats/sql_create.c:228
 #, c-format
 msgid "Device record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:243
+#: src/cats/sql_create.c:244
 #, c-format
 msgid "Create db Device record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:248
-msgid "Device"
-msgstr ""
-
-#: src/cats/sql_create.c:276
+#: src/cats/sql_create.c:277
 #, c-format
 msgid "More than one Storage record!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:281
+#: src/cats/sql_create.c:282
 #, c-format
 msgid "error fetching Storage row: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:301
+#: src/cats/sql_create.c:302
 #, c-format
 msgid "Create DB Storage record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:306 src/dird/ua_run.c:642 src/dird/ua_select.c:152
-#: src/wx-console/wxbrestorepanel.cpp:363
-#: src/wx-console/wxbrestorepanel.cpp:379
-#: src/wx-console/wxbrestorepanel.cpp:500
-#: src/wx-console/wxbrestorepanel.cpp:501
-#: src/wx-console/wxbrestorepanel.cpp:511
-#: src/wx-console/wxbrestorepanel.cpp:512
-#: src/wx-console/wxbrestorepanel.cpp:1116
-#: src/wx-console/wxbrestorepanel.cpp:1765
-#: src/wx-console/wxbrestorepanel.cpp:1831
-msgid "Storage"
-msgstr ""
-
-#: src/cats/sql_create.c:333
+#: src/cats/sql_create.c:334
 #, c-format
 msgid "mediatype record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:349
+#: src/cats/sql_create.c:350
 #, c-format
 msgid "Create db mediatype record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:354
-msgid "MediaType"
-msgstr ""
-
-#: src/cats/sql_create.c:383
+#: src/cats/sql_create.c:384
 #, c-format
 msgid "Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/cats/sql_create.c:421
+#: src/cats/sql_create.c:422
 #, c-format
 msgid "Create DB Media record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:425
-msgid "Media"
-msgstr ""
-
-#: src/cats/sql_create.c:469
+#: src/cats/sql_create.c:470
 #, c-format
 msgid "More than one Client!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:474
+#: src/cats/sql_create.c:475
 #, c-format
 msgid "error fetching Client row: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:501
+#: src/cats/sql_create.c:502
 #, c-format
 msgid "Create DB Client record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:507 src/dird/ua_run.c:645 src/dird/ua_select.c:272
-#: src/dird/ua_select.c:379 src/wx-console/wxbrestorepanel.cpp:360
-#: src/wx-console/wxbrestorepanel.cpp:378
-#: src/wx-console/wxbrestorepanel.cpp:452
-#: src/wx-console/wxbrestorepanel.cpp:453
-#: src/wx-console/wxbrestorepanel.cpp:463
-#: src/wx-console/wxbrestorepanel.cpp:464
-#: src/wx-console/wxbrestorepanel.cpp:707
-#: src/wx-console/wxbrestorepanel.cpp:1086
-#: src/wx-console/wxbrestorepanel.cpp:1173
-#: src/wx-console/wxbrestorepanel.cpp:1758
-#: src/wx-console/wxbrestorepanel.cpp:1760
-#: src/wx-console/wxbrestorepanel.cpp:1829
-#: src/wx-console/wxbrestorepanel.cpp:1884
-msgid "Client"
-msgstr ""
-
-#: src/cats/sql_create.c:544
+#: src/cats/sql_create.c:545
 #, c-format
 msgid "Create DB Counters record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:577
+#: src/cats/sql_create.c:578
 #, c-format
 msgid "More than one FileSet!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:582
+#: src/cats/sql_create.c:583
 #, c-format
 msgid "error fetching FileSet row: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:612
+#: src/cats/sql_create.c:613
 #, c-format
 msgid "Create DB FileSet record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:618 src/dird/ua_restore.c:1035 src/dird/ua_run.c:644
-#: src/dird/ua_select.c:173
-msgid "FileSet"
-msgstr ""
-
-#: src/cats/sql_create.c:669
+#: src/cats/sql_create.c:670
 #, c-format
 msgid "Attempt to put non-attributes into catalog. Stream=%d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:732
+#: src/cats/sql_create.c:733
 #, c-format
 msgid "Create db File record %s failed. ERR=%s"
 msgstr ""
 
-#: src/cats/sql_create.c:738 src/gnome2-console/restore.c:121
-msgid "File"
-msgstr ""
-
-#: src/cats/sql_create.c:765 src/cats/sql_get.c:224
+#: src/cats/sql_create.c:766 src/cats/sql_get.c:224
 #, c-format
 msgid "More than one Path!: %s for path: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:796
+#: src/cats/sql_create.c:797
 #, c-format
 msgid "Create db Path record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:802
-msgid "Path"
-msgstr ""
-
-#: src/cats/sql_create.c:829
+#: src/cats/sql_create.c:830
 #, c-format
 msgid "More than one Filename! %s for file: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:835
+#: src/cats/sql_create.c:836
 #, c-format
 msgid "Error fetching row for file=%s: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:851
+#: src/cats/sql_create.c:852
 #, c-format
 msgid "Create db Filename record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:856 src/wx-console/wxbrestorepanel.cpp:314
-msgid "Filename"
-msgstr ""
-
 #: src/cats/sql_delete.c:79
 #, c-format
 msgid "No pool record %s exists\n"
@@ -408,27 +334,27 @@ msgid ""
 "CMD=%s\n"
 msgstr ""
 
-#: src/cats/sql_find.c:222
+#: src/cats/sql_find.c:224
 #, c-format
-msgid "Unknown Job level=%c\n"
+msgid "Unknown Job level=%d\n"
 msgstr ""
 
-#: src/cats/sql_find.c:232
+#: src/cats/sql_find.c:234
 #, c-format
 msgid "No Job found for: %s.\n"
 msgstr ""
 
-#: src/cats/sql_find.c:243
+#: src/cats/sql_find.c:245
 #, c-format
 msgid "No Job found for: %s\n"
 msgstr ""
 
-#: src/cats/sql_find.c:312
+#: src/cats/sql_find.c:317
 #, c-format
-msgid "Request for Volume item %d greater than max %d\n"
+msgid "Request for Volume item %d greater than max %d or less than 1.\n"
 msgstr ""
 
-#: src/cats/sql_find.c:324
+#: src/cats/sql_find.c:331
 #, c-format
 msgid "No Volume record found for item %d.\n"
 msgstr ""
@@ -492,104 +418,104 @@ msgstr ""
 msgid "No Job found for JobId %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:343 src/cats/sql_get.c:398
+#: src/cats/sql_get.c:344 src/cats/sql_get.c:399
 #, c-format
 msgid "No volumes found for JobId=%d\n"
 msgstr ""
 
-#: src/cats/sql_get.c:349 src/cats/sql_get.c:407
+#: src/cats/sql_get.c:350 src/cats/sql_get.c:408
 #, c-format
 msgid "Error fetching row %d: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:363
+#: src/cats/sql_get.c:364
 #, c-format
 msgid "No Volume for JobId %d found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:479
+#: src/cats/sql_get.c:480
 #, c-format
 msgid "Pool id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:516
+#: src/cats/sql_get.c:517
 #, c-format
 msgid "Client id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:558
+#: src/cats/sql_get.c:559
 #, c-format
 msgid "More than one Pool!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:599
+#: src/cats/sql_get.c:600
 msgid "Pool record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:633
+#: src/cats/sql_get.c:634
 #, c-format
 msgid "More than one Client!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:650 src/cats/sql_get.c:654
+#: src/cats/sql_get.c:651 src/cats/sql_get.c:655
 msgid "Client record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:679
+#: src/cats/sql_get.c:680
 #, c-format
 msgid "More than one Counter!: %d\n"
 msgstr ""
 
-#: src/cats/sql_get.c:684
+#: src/cats/sql_get.c:685
 #, c-format
 msgid "error fetching Counter row: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:704
+#: src/cats/sql_get.c:705
 #, c-format
 msgid "Counter record: %s not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:740
+#: src/cats/sql_get.c:741
 #, c-format
 msgid "Error got %s FileSets but expected only one!\n"
 msgstr ""
 
-#: src/cats/sql_get.c:745
+#: src/cats/sql_get.c:746
 #, c-format
 msgid "FileSet record \"%s\" not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:755
+#: src/cats/sql_get.c:756
 msgid "FileSet record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:812
+#: src/cats/sql_get.c:813
 #, c-format
 msgid "Media id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:860
+#: src/cats/sql_get.c:861
 #, c-format
 msgid "More than one Volume!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:905
+#: src/cats/sql_get.c:906
 #, c-format
 msgid "Media record MediaId=%s not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:908
+#: src/cats/sql_get.c:909
 #, c-format
 msgid "Media record for Volume \"%s\" not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:915
+#: src/cats/sql_get.c:916
 #, c-format
 msgid "Media record for MediaId=%u not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:918
+#: src/cats/sql_get.c:919
 #, c-format
 msgid "Media record for Vol=%s not found in Catalog.\n"
 msgstr ""
@@ -609,7 +535,7 @@ msgstr ""
 msgid "Unable to open Database=%s. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sqlite.c:162 src/lib/bnet_server.c:372
+#: src/cats/sqlite.c:162 src/lib/bnet_server.c:371
 msgid "unknown"
 msgstr ""
 
@@ -628,38 +554,38 @@ msgstr ""
 msgid "next_index update error: ERR=%s\n"
 msgstr ""
 
-#: src/console/authenticate.c:104 src/dird/authenticate.c:106
-#: src/dird/authenticate.c:206 src/filed/authenticate.c:124
-#: src/filed/authenticate.c:220 src/stored/authenticate.c:128
-#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:101
+#: src/console/authenticate.c:100 src/dird/authenticate.c:106
+#: src/dird/authenticate.c:206 src/filed/authenticate.c:119
+#: src/filed/authenticate.c:215 src/stored/authenticate.c:128
+#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:106
 msgid ""
 "Authorization problem: Remote server did not advertise required TLS "
 "support.\n"
 msgstr ""
 
-#: src/console/authenticate.c:111 src/dird/authenticate.c:113
-#: src/dird/authenticate.c:213 src/filed/authenticate.c:132
-#: src/filed/authenticate.c:228 src/stored/authenticate.c:136
-#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:108
+#: src/console/authenticate.c:107 src/dird/authenticate.c:113
+#: src/dird/authenticate.c:213 src/filed/authenticate.c:127
+#: src/filed/authenticate.c:223 src/stored/authenticate.c:136
+#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:112
 msgid "Authorization problem: Remote server requires TLS.\n"
 msgstr ""
 
-#: src/console/authenticate.c:121 src/wx-console/authenticate.c:118
+#: src/console/authenticate.c:117 src/wx-console/authenticate.c:121
 msgid "TLS negotiation failed\n"
 msgstr ""
 
-#: src/console/authenticate.c:133 src/gnome2-console/authenticate.c:85
+#: src/console/authenticate.c:129 src/gnome2-console/authenticate.c:85
 #: src/tray-monitor/authenticate.c:87
 #, c-format
 msgid "Bad response to Hello command: ERR=%s\n"
 msgstr ""
 
-#: src/console/authenticate.c:140 src/gnome2-console/authenticate.c:95
-#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:133
+#: src/console/authenticate.c:136 src/gnome2-console/authenticate.c:95
+#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:136
 msgid "Director rejected Hello command\n"
 msgstr ""
 
-#: src/console/authenticate.c:150 src/wx-console/authenticate.c:143
+#: src/console/authenticate.c:146 src/wx-console/authenticate.c:146
 msgid ""
 "Director authorization problem.\n"
 "Most likely the passwords do not agree.\n"
@@ -704,7 +630,7 @@ msgstr ""
 msgid "output to file"
 msgstr ""
 
-#: src/console/console.c:152 src/dird/ua_cmds.c:106
+#: src/console/console.c:152 src/dird/ua_cmds.c:110
 msgid "quit"
 msgstr ""
 
@@ -716,7 +642,7 @@ msgstr ""
 msgid "sleep specified time"
 msgstr ""
 
-#: src/console/console.c:155 src/dird/ua_cmds.c:118
+#: src/console/console.c:155 src/dird/ua_cmds.c:122
 msgid "print current time"
 msgstr ""
 
@@ -724,7 +650,7 @@ msgstr ""
 msgid "print Console's version"
 msgstr ""
 
-#: src/console/console.c:157 src/dird/ua_cmds.c:95
+#: src/console/console.c:157 src/dird/ua_cmds.c:99
 msgid "exit = quit"
 msgstr ""
 
@@ -732,13 +658,12 @@ msgstr ""
 msgid "zed_keys = use zed keys instead of bash keys"
 msgstr ""
 
-#: src/console/console.c:191 src/dird/ua_dotcmds.c:106
+#: src/console/console.c:191 src/dird/ua_dotcmds.c:108
 msgid ": is an illegal command\n"
 msgstr ""
 
-#: src/console/console.c:400 src/dird/dird.c:196 src/filed/filed.c:183
-#: src/gnome2-console/console.c:271 src/stored/stored.c:189
-#: src/wx-console/console_thread.cpp:233
+#: src/console/console.c:400 src/filed/filed.c:183
+#: src/gnome2-console/console.c:271
 msgid "TLS library initialization failed.\n"
 msgstr ""
 
@@ -772,14 +697,14 @@ msgstr ""
 msgid "Connecting to Director %s:%d\n"
 msgstr ""
 
-#: src/console/console.c:471 src/gnome2-console/console.c:508
-#: src/wx-console/console_thread.cpp:367
+#: src/console/console.c:471 src/gnome2-console/console.c:504
+#: src/wx-console/console_thread.cpp:370
 #, c-format
 msgid "Failed to initialize TLS context for Console \"%s\".\n"
 msgstr ""
 
-#: src/console/console.c:492 src/gnome2-console/console.c:530
-#: src/wx-console/console_thread.cpp:388
+#: src/console/console.c:492 src/gnome2-console/console.c:526
+#: src/wx-console/console_thread.cpp:391
 #, c-format
 msgid "Failed to initialize TLS context for Director \"%s\".\n"
 msgstr ""
@@ -792,8 +717,8 @@ msgstr ""
 #: src/dird/dird.c:711 src/dird/dird.c:777 src/dird/dird.c:829
 #: src/filed/filed.c:302 src/filed/filed.c:348
 #: src/gnome2-console/console.c:140 src/gnome2-console/console.c:169
-#: src/stored/stored.c:310 src/wx-console/console_thread.cpp:96
-#: src/wx-console/console_thread.cpp:125
+#: src/stored/stored.c:311 src/wx-console/console_thread.cpp:94
+#: src/wx-console/console_thread.cpp:120
 msgid "TLS required but not configured in Bacula.\n"
 msgstr ""
 
@@ -841,18 +766,18 @@ msgid "Cannot open file %s for output. ERR=%s\n"
 msgstr ""
 
 #: src/console/console_conf.c:123 src/gnome2-console/console_conf.c:122
-#: src/wx-console/console_conf.c:124
+#: src/wx-console/console_conf.c:128
 #, c-format
 msgid "No record for %d %s\n"
 msgstr ""
 
-#: src/console/console_conf.c:132 src/wx-console/console_conf.c:133
+#: src/console/console_conf.c:132 src/wx-console/console_conf.c:137
 #, c-format
 msgid "Console: name=%s rcfile=%s histfile=%s\n"
 msgstr ""
 
 #: src/console/console_conf.c:136 src/gnome2-console/console_conf.c:131
-#: src/wx-console/console_conf.c:137
+#: src/wx-console/console_conf.c:141
 #, c-format
 msgid "Director: name=%s address=%s DIRport=%d\n"
 msgstr ""
@@ -862,25 +787,25 @@ msgstr ""
 #: src/filed/filed_conf.c:268 src/filed/filed_conf.c:327
 #: src/filed/filed_conf.c:357 src/gnome2-console/console_conf.c:142
 #: src/gnome2-console/console_conf.c:220 src/gnome2-console/console_conf.c:268
-#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:467
-#: src/stored/stored_conf.c:555 src/stored/stored_conf.c:590
-#: src/wx-console/console_conf.c:141 src/wx-console/console_conf.c:216
-#: src/wx-console/console_conf.c:261 src/wx-console/console_conf.c:288
+#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:510
+#: src/stored/stored_conf.c:598 src/stored/stored_conf.c:633
+#: src/wx-console/console_conf.c:145 src/wx-console/console_conf.c:220
+#: src/wx-console/console_conf.c:265 src/wx-console/console_conf.c:292
 #, c-format
 msgid "Unknown resource type %d\n"
 msgstr ""
 
-#: src/console/console_conf.c:242 src/dird/dird_conf.c:1109
-#: src/dird/dird_conf.c:1124 src/filed/filed_conf.c:296
+#: src/console/console_conf.c:242 src/dird/dird_conf.c:1112
+#: src/dird/dird_conf.c:1127 src/filed/filed_conf.c:296
 #: src/gnome2-console/console_conf.c:246 src/tray-monitor/tray_conf.c:262
-#: src/wx-console/console_conf.c:242
+#: src/wx-console/console_conf.c:246
 #, c-format
 msgid "%s item is required in %s resource, but not found.\n"
 msgstr ""
 
-#: src/console/console_conf.c:304 src/dird/dird_conf.c:1296
+#: src/console/console_conf.c:304 src/dird/dird_conf.c:1299
 #: src/filed/filed_conf.c:374 src/gnome2-console/console_conf.c:314
-#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:304
+#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:308
 #, c-format
 msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n"
 msgstr ""
@@ -890,7 +815,7 @@ msgstr ""
 msgid "Start Admin JobId %d, Job=%s\n"
 msgstr ""
 
-#: src/dird/admin.c:82 src/dird/backup.c:339 src/dird/mac.c:228
+#: src/dird/admin.c:82 src/dird/backup.c:372 src/dird/mac.c:280
 #, c-format
 msgid "Error getting job record for stats: %s"
 msgstr ""
@@ -907,8 +832,8 @@ msgstr ""
 msgid "Admin Canceled"
 msgstr ""
 
-#: src/dird/admin.c:102 src/dird/backup.c:451 src/dird/mac.c:330
-#: src/dird/restore.c:258
+#: src/dird/admin.c:102 src/dird/backup.c:423 src/dird/mac.c:382
+#: src/dird/restore.c:250
 #, c-format
 msgid "Inappropriate term code: %c\n"
 msgstr ""
@@ -941,7 +866,7 @@ msgstr ""
 
 #: src/dird/authenticate.c:95
 msgid ""
-"Unable to authenticate with Storage daemon. Possible causes:\n"
+"Director unable to authenticate with Storage daemon. Possible causes:\n"
 "Passwords or names not the same or\n"
 "Maximum Concurrent Jobs exceeded on the SD or\n"
 "SD networking messed up (restart daemon).\n"
@@ -950,8 +875,8 @@ msgid ""
 msgstr ""
 
 #: src/dird/authenticate.c:123 src/dird/authenticate.c:223
-#: src/dird/authenticate.c:356 src/filed/authenticate.c:141
-#: src/filed/authenticate.c:237 src/stored/authenticate.c:145
+#: src/dird/authenticate.c:356 src/filed/authenticate.c:136
+#: src/filed/authenticate.c:232 src/stored/authenticate.c:145
 #: src/stored/authenticate.c:249
 msgid "TLS negotiation failed.\n"
 msgstr ""
@@ -1040,84 +965,72 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:92
-#: src/dird/ua_output.c:609
+#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:124
+#: src/dird/ua_output.c:623
 #, c-format
 msgid "Pool %s not in database. %s"
 msgstr ""
 
-#: src/dird/backup.c:92 src/dird/mac.c:96 src/dird/ua_output.c:617
+#: src/dird/backup.c:92 src/dird/mac.c:128 src/dird/ua_output.c:631
 #, c-format
 msgid "Pool %s created in database.\n"
 msgstr ""
 
-#: src/dird/backup.c:117
+#: src/dird/backup.c:120
 msgid "Could not start clone job.\n"
 msgstr ""
 
-#: src/dird/backup.c:119
+#: src/dird/backup.c:122
 #, c-format
 msgid "Clone JobId %d started.\n"
 msgstr ""
 
-#: src/dird/backup.c:144
+#: src/dird/backup.c:148
 #, c-format
-msgid "Start Backup JobId %u, Job=%s\n"
+msgid "Start Backup JobId %s, Job=%s\n"
 msgstr ""
 
-#: src/dird/backup.c:272
+#: src/dird/backup.c:304
 #, c-format
 msgid "Unexpected Client Job message: %s\n"
 msgstr ""
 
-#: src/dird/backup.c:280
+#: src/dird/backup.c:312
 #, c-format
 msgid "Network error with FD during %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/backup.c:296
+#: src/dird/backup.c:328
 msgid "No Job status returned from FD.\n"
 msgstr ""
 
-#: src/dird/backup.c:346
+#: src/dird/backup.c:379
 #, c-format
 msgid "Error getting client record for stats: %s"
 msgstr ""
 
-#: src/dird/backup.c:352 src/dird/mac.c:235
+#: src/dird/backup.c:385 src/dird/mac.c:287
 #, c-format
 msgid "Error getting Media record for Volume \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/backup.c:380 src/dird/mac.c:263
-#, c-format
-msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
-msgstr ""
-
-#: src/dird/backup.c:414 src/dird/mac.c:293
-#, c-format
-msgid ""
-"Could not open WriteBootstrap file:\n"
-"%s: ERR=%s\n"
-msgstr ""
-
-#: src/dird/backup.c:424 src/dird/mac.c:303
+#: src/dird/backup.c:396 src/dird/mac.c:355
 msgid "Backup OK -- with warnings"
 msgstr ""
 
-#: src/dird/backup.c:426 src/dird/mac.c:305 src/stored/bscan.c:1054
+#: src/dird/backup.c:398 src/dird/mac.c:357 src/stored/bscan.c:1060
 msgid "Backup OK"
 msgstr ""
 
-#: src/dird/backup.c:431 src/dird/mac.c:310 src/stored/bscan.c:1058
+#: src/dird/backup.c:403 src/dird/mac.c:362 src/stored/bscan.c:1064
 msgid "*** Backup Error ***"
 msgstr ""
 
-#: src/dird/backup.c:441 src/dird/mac.c:320 src/stored/bscan.c:1061
+#: src/dird/backup.c:413 src/dird/mac.c:372 src/stored/bscan.c:1067
 msgid "Backup Canceled"
 msgstr ""
 
-#: src/dird/backup.c:491
+#: src/dird/backup.c:463
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -1131,17 +1044,18 @@ msgid ""
 "  Scheduled time:         %s\n"
 "  Start time:             %s\n"
 "  End time:               %s\n"
+"  Elapsed time:           %s\n"
 "  Priority:               %d\n"
 "  FD Files Written:       %s\n"
 "  SD Files Written:       %s\n"
-"  FD Bytes Written:       %s\n"
-"  SD Bytes Written:       %s\n"
+"  FD Bytes Written:       %s (%sB)\n"
+"  SD Bytes Written:       %s (%sB)\n"
 "  Rate:                   %.1f KB/s\n"
 "  Software Compression:   %s\n"
 "  Volume name(s):         %s\n"
 "  Volume Session Id:      %d\n"
 "  Volume Session Time:    %d\n"
-"  Last Volume Bytes:      %s\n"
+"  Last Volume Bytes:      %s (%sB)\n"
 "  Non-fatal FD errors:    %d\n"
 "  SD Errors:              %d\n"
 "  FD termination status:  %s\n"
@@ -1150,6 +1064,18 @@ msgid ""
 "\n"
 msgstr ""
 
+#: src/dird/backup.c:554 src/dird/mac.c:315
+#, c-format
+msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:588 src/dird/mac.c:345
+#, c-format
+msgid ""
+"Could not open WriteBootstrap file:\n"
+"%s: ERR=%s\n"
+msgstr ""
+
 #: src/dird/bsr.c:155
 #, c-format
 msgid "Unable to get Job record. ERR=%s\n"
@@ -1160,29 +1086,29 @@ msgstr ""
 msgid "Unable to get Job Volume Parameters. ERR=%s\n"
 msgstr ""
 
-#: src/dird/bsr.c:201
+#: src/dird/bsr.c:212
 #, c-format
 msgid "Unable to create bootstrap file %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/bsr.c:210
+#: src/dird/bsr.c:221
 msgid "Error writing bsr file.\n"
 msgstr ""
 
-#: src/dird/bsr.c:216
+#: src/dird/bsr.c:227
 #, c-format
 msgid "Bootstrap records written to %s\n"
 msgstr ""
 
-#: src/dird/bsr.c:220
+#: src/dird/bsr.c:231
 msgid "The job will require the following Volumes:\n"
 msgstr ""
 
-#: src/dird/bsr.c:235
+#: src/dird/bsr.c:263
 msgid "No Volumes found to restore.\n"
 msgstr ""
 
-#: src/dird/catreq.c:109 src/dird/catreq.c:298
+#: src/dird/catreq.c:109 src/dird/catreq.c:295
 #, c-format
 msgid "1990 Invalid Catalog Request: %s"
 msgstr ""
@@ -1192,72 +1118,87 @@ msgstr ""
 msgid "Invalid Catalog request; DB not open: %s"
 msgstr ""
 
-#: src/dird/catreq.c:131
+#: src/dird/catreq.c:133
 msgid "1901 No Media.\n"
 msgstr ""
 
-#: src/dird/catreq.c:159
+#: src/dird/catreq.c:161
 msgid "not in Pool"
 msgstr ""
 
-#: src/dird/catreq.c:161
+#: src/dird/catreq.c:163
 msgid "not correct MediaType"
 msgstr ""
 
-#: src/dird/catreq.c:187
+#: src/dird/catreq.c:179
 #, c-format
 msgid "1998 Volume \"%s\" status is %s, %s.\n"
 msgstr ""
 
-#: src/dird/catreq.c:192
+#: src/dird/catreq.c:184
 #, c-format
 msgid "1997 Volume \"%s\" not in catalog.\n"
 msgstr ""
 
-#: src/dird/catreq.c:213
+#: src/dird/catreq.c:205
 #, c-format
 msgid "Unable to get Media record for Volume %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/catreq.c:215
+#: src/dird/catreq.c:207
 #, c-format
 msgid "1991 Catalog Request for vol=%s failed: %s"
 msgstr ""
 
-#: src/dird/catreq.c:235
+#: src/dird/catreq.c:227
 #, c-format
 msgid ""
 "Volume Files at %u being set to %u for Volume \"%s\". This is incorrect.\n"
 msgstr ""
 
-#: src/dird/catreq.c:238 src/dird/catreq.c:270
-msgid "1992 Update Media error\n"
+#: src/dird/catreq.c:230
+#, c-format
+msgid "1992 Update Media error. VolFiles=%u, CatFiles=%u\n"
 msgstr ""
 
-#: src/dird/catreq.c:268
+#: src/dird/catreq.c:262
 #, c-format
 msgid "Catalog error updating Media record. %s"
 msgstr ""
 
-#: src/dird/catreq.c:287
+#: src/dird/catreq.c:264
+msgid "1993 Update Media error\n"
+msgstr ""
+
+#: src/dird/catreq.c:284
 #, c-format
 msgid "Catalog error creating JobMedia record. %s"
 msgstr ""
 
-#: src/dird/catreq.c:289
+#: src/dird/catreq.c:286
 msgid "1991 Update JobMedia error\n"
 msgstr ""
 
-#: src/dird/catreq.c:299
+#: src/dird/catreq.c:296
 #, c-format
 msgid "Invalid Catalog request: %s"
 msgstr ""
 
-#: src/dird/catreq.c:398
+#: src/dird/catreq.c:330
+#, c-format
+msgid "1991 Invalid Catalog Update: %s"
+msgstr ""
+
+#: src/dird/catreq.c:331
+#, c-format
+msgid "Invalid Catalog Update; DB not open: %s"
+msgstr ""
+
+#: src/dird/catreq.c:405
 msgid "Got MD5/SHA1 but not same File as attributes\n"
 msgstr ""
 
-#: src/dird/catreq.c:422
+#: src/dird/catreq.c:429
 #, c-format
 msgid "Catalog error updating MD5/SHA1. %s"
 msgstr ""
@@ -1283,6 +1224,10 @@ msgid ""
 "\n"
 msgstr ""
 
+#: src/dird/dird.c:196 src/stored/stored.c:189
+msgid "Cryptography library initialization failed.\n"
+msgstr ""
+
 #: src/dird/dird.c:396
 msgid "Too many open reload requests. Request ignored.\n"
 msgstr ""
@@ -1312,17 +1257,17 @@ msgstr ""
 msgid "Only one Director resource permitted in %s\n"
 msgstr ""
 
-#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:362
+#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:363
 #, c-format
 msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:368
+#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:369
 #, c-format
 msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:374
+#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:375
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
@@ -1330,7 +1275,7 @@ msgid ""
 "using \"TLS Verify Peer\".\n"
 msgstr ""
 
-#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:393
+#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:394
 #, c-format
 msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n"
 msgstr ""
@@ -1354,8 +1299,8 @@ msgstr ""
 msgid "Too many items in Job resource\n"
 msgstr ""
 
-#: src/dird/dird.c:672 src/dird/job.c:101 src/dird/ua_cmds.c:1425
-#: src/dird/ua_output.c:598
+#: src/dird/dird.c:672 src/dird/job.c:104 src/dird/ua_cmds.c:1621
+#: src/dird/ua_output.c:612
 #, c-format
 msgid "Could not open database \"%s\".\n"
 msgstr ""
@@ -1372,7 +1317,7 @@ msgid ""
 "Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:733 src/stored/stored.c:348
+#: src/dird/dird.c:733 src/stored/stored.c:349
 #, c-format
 msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n"
 msgstr ""
@@ -1407,55 +1352,55 @@ msgid ""
 "File daemon \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:441 src/tray-monitor/tray_conf.c:152
+#: src/dird/dird_conf.c:443 src/tray-monitor/tray_conf.c:152
 #, c-format
 msgid "No %s resource defined\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:450
+#: src/dird/dird_conf.c:452
 #, c-format
 msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:455
+#: src/dird/dird_conf.c:457
 #, c-format
 msgid "   query_file=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:458 src/dird/dird_conf.c:483 src/dird/dird_conf.c:497
-#: src/dird/dird_conf.c:541 src/dird/dird_conf.c:545 src/dird/dird_conf.c:549
-#: src/dird/dird_conf.c:573 src/dird/dird_conf.c:578 src/dird/dird_conf.c:582
-#: src/dird/dird_conf.c:586 src/dird/dird_conf.c:590 src/dird/dird_conf.c:594
-#: src/dird/dird_conf.c:604
+#: src/dird/dird_conf.c:460 src/dird/dird_conf.c:485 src/dird/dird_conf.c:499
+#: src/dird/dird_conf.c:544 src/dird/dird_conf.c:548 src/dird/dird_conf.c:552
+#: src/dird/dird_conf.c:576 src/dird/dird_conf.c:581 src/dird/dird_conf.c:585
+#: src/dird/dird_conf.c:589 src/dird/dird_conf.c:593 src/dird/dird_conf.c:597
+#: src/dird/dird_conf.c:607
 msgid "  --> "
 msgstr ""
 
-#: src/dird/dird_conf.c:464 src/dird/dird_conf.c:467
+#: src/dird/dird_conf.c:466 src/dird/dird_conf.c:469
 #, c-format
 msgid "Console: name=%s SSL=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:473
+#: src/dird/dird_conf.c:475
 #, c-format
 msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:478
+#: src/dird/dird_conf.c:480
 #, c-format
 msgid "Counter: name=%s min=%d max=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:489
+#: src/dird/dird_conf.c:491
 #, c-format
 msgid "Client: name=%s address=%s FDport=%d MaxJobs=%u\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:492
+#: src/dird/dird_conf.c:494
 #, c-format
 msgid "      JobRetention=%s FileRetention=%s AutoPrune=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:504
+#: src/dird/dird_conf.c:506
 #, c-format
 msgid ""
 "Device: name=%s ok=%d num_writers=%d max_writers=%d\n"
@@ -1464,245 +1409,252 @@ msgid ""
 "      poolid=%s volname=%s MediaType=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:514
+#: src/dird/dird_conf.c:516
 #, c-format
 msgid ""
 "Storage: name=%s address=%s SDport=%d MaxJobs=%u\n"
 "      DeviceName=%s MediaType=%s StorageId=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:523
+#: src/dird/dird_conf.c:525
 #, c-format
 msgid ""
 "Catalog: name=%s address=%s DBport=%d db_name=%s\n"
 "      db_user=%s MutliDBConn=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:531
+#: src/dird/dird_conf.c:533
 #, c-format
-msgid "%s: name=%s JobType=%d level=%s Priority=%d MaxJobs=%u\n"
+msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:534 src/dird/ua_cmds.c:441 src/dird/ua_prune.c:454
+#: src/dird/ua_run.c:643 src/dird/ua_select.c:234 src/dird/ua_select.c:257
+msgid "Job"
 msgstr ""
 
-#: src/dird/dird_conf.c:532
+#: src/dird/dird_conf.c:534
 msgid "JobDefs"
 msgstr ""
 
-#: src/dird/dird_conf.c:536
+#: src/dird/dird_conf.c:538
 #, c-format
-msgid "     Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%d\n"
+msgid ""
+"     MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%"
+"d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:553
+#: src/dird/dird_conf.c:556
 #, c-format
 msgid "  --> Where=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:556
+#: src/dird/dird_conf.c:559
 #, c-format
 msgid "  --> Bootstrap=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:559
+#: src/dird/dird_conf.c:562
 #, c-format
 msgid "  --> RunBefore=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:562
+#: src/dird/dird_conf.c:565
 #, c-format
 msgid "  --> RunAfter=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:565
+#: src/dird/dird_conf.c:568
 #, c-format
 msgid "  --> RunAfterFailed=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:568
+#: src/dird/dird_conf.c:571
 #, c-format
 msgid "  --> WriteBootstrap=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:600
+#: src/dird/dird_conf.c:603
 #, c-format
 msgid "  --> Run=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:611
+#: src/dird/dird_conf.c:614
 #, c-format
 msgid "FileSet: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:673 src/dird/dird_conf.c:752
+#: src/dird/dird_conf.c:676 src/dird/dird_conf.c:755
 #, c-format
 msgid "Schedule: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:678
+#: src/dird/dird_conf.c:681
 #, c-format
 msgid "  --> Run Level=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:679
+#: src/dird/dird_conf.c:682
 msgid "      hour="
 msgstr ""
 
-#: src/dird/dird_conf.c:688
+#: src/dird/dird_conf.c:691
 msgid "      mday="
 msgstr ""
 
-#: src/dird/dird_conf.c:697
+#: src/dird/dird_conf.c:700
 msgid "      month="
 msgstr ""
 
-#: src/dird/dird_conf.c:706
+#: src/dird/dird_conf.c:709
 msgid "      wday="
 msgstr ""
 
-#: src/dird/dird_conf.c:715
+#: src/dird/dird_conf.c:718
 msgid "      wom="
 msgstr ""
 
-#: src/dird/dird_conf.c:724
+#: src/dird/dird_conf.c:727
 msgid "      woy="
 msgstr ""
 
-#: src/dird/dird_conf.c:733
+#: src/dird/dird_conf.c:736
 #, c-format
 msgid "      mins=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:735 src/dird/dird_conf.c:739 src/dird/dird_conf.c:743
+#: src/dird/dird_conf.c:738 src/dird/dird_conf.c:742 src/dird/dird_conf.c:746
 msgid "     --> "
 msgstr ""
 
-#: src/dird/dird_conf.c:756
+#: src/dird/dird_conf.c:759
 #, c-format
 msgid "Pool: name=%s PoolType=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:758
+#: src/dird/dird_conf.c:761
 #, c-format
 msgid "      use_cat=%d use_once=%d acpt_any=%d cat_files=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:761
+#: src/dird/dird_conf.c:764
 #, c-format
 msgid "      max_vols=%d auto_prune=%d VolRetention=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:764
+#: src/dird/dird_conf.c:767
 #, c-format
 msgid "      VolUse=%s recycle=%d LabelFormat=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:768
+#: src/dird/dird_conf.c:771
 #, c-format
 msgid "      CleaningPrefix=%s LabelType=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:770
+#: src/dird/dird_conf.c:773
 #, c-format
 msgid "      RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:776
+#: src/dird/dird_conf.c:779
 #, c-format
 msgid "Messages: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:778
+#: src/dird/dird_conf.c:781
 #, c-format
 msgid "      mailcmd=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:780
+#: src/dird/dird_conf.c:783
 #, c-format
 msgid "      opcmd=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:783 src/tray-monitor/tray_conf.c:179
+#: src/dird/dird_conf.c:786 src/tray-monitor/tray_conf.c:179
 #, c-format
 msgid "Unknown resource type %d in dump_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1077 src/tray-monitor/tray_conf.c:232
+#: src/dird/dird_conf.c:1080 src/tray-monitor/tray_conf.c:232
 #, c-format
 msgid "Unknown resource type %d in free_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1115 src/lib/parse_conf.c:211
+#: src/dird/dird_conf.c:1118 src/lib/parse_conf.c:211
 #: src/tray-monitor/tray_conf.c:268
 #, c-format
 msgid "Too many items in %s resource\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1149
+#: src/dird/dird_conf.c:1152
 #, c-format
 msgid "Cannot find Console resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1155 src/filed/filed_conf.c:316
-#: src/stored/stored_conf.c:523
+#: src/dird/dird_conf.c:1158 src/filed/filed_conf.c:316
+#: src/stored/stored_conf.c:566
 #, c-format
 msgid "Cannot find Director resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1162 src/stored/stored_conf.c:529
+#: src/dird/dird_conf.c:1165 src/stored/stored_conf.c:572
 #, c-format
 msgid "Cannot find Storage resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1171
+#: src/dird/dird_conf.c:1174
 #, c-format
 msgid "Cannot find Job resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1189
+#: src/dird/dird_conf.c:1192
 #, c-format
 msgid "Cannot find Counter resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1197 src/filed/filed_conf.c:322
+#: src/dird/dird_conf.c:1200 src/filed/filed_conf.c:322
 #, c-format
 msgid "Cannot find Client resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1209
+#: src/dird/dird_conf.c:1212
 #, c-format
 msgid "Cannot find Schedule resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1214 src/tray-monitor/tray_conf.c:287
+#: src/dird/dird_conf.c:1217 src/tray-monitor/tray_conf.c:287
 #, c-format
 msgid "Unknown resource type %d in save_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1274 src/tray-monitor/tray_conf.c:322
+#: src/dird/dird_conf.c:1277 src/tray-monitor/tray_conf.c:322
 #, c-format
 msgid "Unknown resource type %d in save_resrouce.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1289
+#: src/dird/dird_conf.c:1292
 #, c-format
 msgid "Name item is required in %s resource, but not found.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1301
+#: src/dird/dird_conf.c:1304
 #, c-format
 msgid "Inserting %s res: %s index=%d pass=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1374
+#: src/dird/dird_conf.c:1377
 #, c-format
 msgid "Expected a Job Type keyword, got: %s"
 msgstr ""
 
-#: src/dird/dird_conf.c:1398
+#: src/dird/dird_conf.c:1401
 #, c-format
 msgid "Expected a Job Level keyword, got: %s"
 msgstr ""
 
-#: src/dird/dird_conf.c:1418
+#: src/dird/dird_conf.c:1421
 #, c-format
 msgid "Expected a Restore replacement option, got: %s"
 msgstr ""
@@ -1742,174 +1694,179 @@ msgstr ""
 msgid "Cannot destroy var context: ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:73 src/tray-monitor/tray-monitor.c:867
+#: src/dird/fd_cmds.c:74 src/tray-monitor/tray-monitor.c:867
 msgid "File daemon"
 msgstr ""
 
-#: src/dird/fd_cmds.c:104
+#: src/dird/fd_cmds.c:105
 #, c-format
 msgid "File daemon \"%s\" rejected Job command: %s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:117
+#: src/dird/fd_cmds.c:118
 #, c-format
 msgid "Error updating Client record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:122
+#: src/dird/fd_cmds.c:123
 #, c-format
 msgid "FD gave bad response to JobId command: %s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:144 src/dird/fd_cmds.c:180
+#: src/dird/fd_cmds.c:145 src/dird/fd_cmds.c:181
 msgid ", since="
 msgstr ""
 
-#: src/dird/fd_cmds.c:164
+#: src/dird/fd_cmds.c:165
 msgid "No prior or suitable Full backup found. Doing FULL backup.\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:165 src/dird/fd_cmds.c:173
+#: src/dird/fd_cmds.c:166 src/dird/fd_cmds.c:174
 #, c-format
 msgid " (upgraded from %s)"
 msgstr ""
 
-#: src/dird/fd_cmds.c:171
+#: src/dird/fd_cmds.c:172
 #, c-format
 msgid "Prior failed job found. Upgrading to %s.\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:196
+#: src/dird/fd_cmds.c:197
 msgid "since_utime "
 msgstr ""
 
-#: src/dird/fd_cmds.c:232
+#: src/dird/fd_cmds.c:233
 #, c-format
 msgid "Unimplemented backup level %d %c\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:320 src/filed/job.c:565
+#: src/dird/fd_cmds.c:321 src/filed/job.c:559
 #, c-format
 msgid "Cannot run program: %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:331 src/dird/fd_cmds.c:356 src/dird/fd_cmds.c:370
+#: src/dird/fd_cmds.c:332 src/dird/fd_cmds.c:357 src/dird/fd_cmds.c:371
 msgid ">filed: write error on socket\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:337
+#: src/dird/fd_cmds.c:338
 #, c-format
 msgid "Error running program: %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:346
+#: src/dird/fd_cmds.c:347
 #, c-format
 msgid "Cannot open included file: %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:441 src/filed/job.c:1617
+#: src/dird/fd_cmds.c:442 src/filed/job.c:1637
 #, c-format
 msgid "Could not open bootstrap file %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:526
+#: src/dird/fd_cmds.c:527
 #, c-format
 msgid ""
 "<filed: bad attributes, expected 3 fields got %d\n"
 "msglen=%d msg=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:571 src/dird/verify.c:696
+#: src/dird/fd_cmds.c:572 src/dird/verify.c:697
 #, c-format
 msgid "MD5/SHA1 index %d not same as attributes %d\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:588
+#: src/dird/fd_cmds.c:589
 #, c-format
 msgid "<filed: Network error getting attributes. ERR=%s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:135
+#: src/dird/getmsg.c:130
 #, c-format
 msgid "bget_dirmsg: unknown bnet signal %d\n"
 msgstr ""
 
-#: src/dird/getmsg.c:153 src/dird/getmsg.c:166 src/dird/getmsg.c:178
-#: src/dird/getmsg.c:225 src/dird/getmsg.c:249
+#: src/dird/getmsg.c:148 src/dird/getmsg.c:161 src/dird/getmsg.c:173
+#: src/dird/getmsg.c:220 src/dird/getmsg.c:244
 #, c-format
 msgid "Malformed message: %s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:159
+#: src/dird/getmsg.c:154
 #, c-format
 msgid "Job not found: %s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:318
+#: src/dird/getmsg.c:313
 #, c-format
 msgid "Bad response to %s command: wanted %s, got %s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:323
+#: src/dird/getmsg.c:318
 #, c-format
 msgid "Socket error on %s command: ERR=%s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:249
+#: src/dird/inc_conf.c:251
 #, c-format
 msgid "Expected a FileSet option keyword, got:%s:"
 msgstr ""
 
-#: src/dird/inc_conf.c:282
+#: src/dird/inc_conf.c:284
 msgid "Old style Include/Exclude not supported\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:310 src/dird/inc_conf.c:577
+#: src/dird/inc_conf.c:312 src/dird/inc_conf.c:584
 #, c-format
 msgid "Expecting keyword, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:318 src/dird/inc_conf.c:583 src/lib/parse_conf.c:819
+#: src/dird/inc_conf.c:320 src/dird/inc_conf.c:590 src/lib/parse_conf.c:819
 #, c-format
 msgid "expected an equals, got: %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:328 src/dird/inc_conf.c:592
+#: src/dird/inc_conf.c:330 src/dird/inc_conf.c:599
 #, c-format
 msgid "Keyword %s not permitted in this resource"
 msgstr ""
 
-#: src/dird/inc_conf.c:381
+#: src/dird/inc_conf.c:383
 #, c-format
 msgid "Regex compile error. ERR=%s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:402
+#: src/dird/inc_conf.c:404
 #, c-format
 msgid "Expected a regex string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:488
+#: src/dird/inc_conf.c:490
 #, c-format
 msgid "Expected a wild-card string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:511
+#: src/dird/inc_conf.c:513
 #, c-format
 msgid "Expected an fstype string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:546
+#: src/dird/inc_conf.c:537
+#, c-format
+msgid "Backslash found. Use forward slashes or quote the string.: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:552
 #, c-format
 msgid "Expected a filename, got: %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:562
+#: src/dird/inc_conf.c:569
 #, c-format
 msgid "Expecting open brace. Got %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:617
+#: src/dird/inc_conf.c:624
 #, c-format
 msgid "Expected a FileSet keyword, got: %s"
 msgstr ""
@@ -1919,159 +1876,174 @@ msgstr ""
 msgid "Could not init job queue: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:488
+#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:449
 #, c-format
 msgid "Unable to init job cond variable: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:139
+#: src/dird/job.c:140
 #, c-format
 msgid "Could not add job queue: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:178
+#: src/dird/job.c:177
 msgid "Job canceled because max start delay time exceeded.\n"
 msgstr ""
 
-#: src/dird/job.c:229 src/dird/job.c:307
+#: src/dird/job.c:228 src/dird/job.c:321
 #, c-format
 msgid "Unimplemented job type: %d\n"
 msgstr ""
 
-#: src/dird/job.c:254
+#: src/dird/job.c:253
 #, c-format
 msgid "RunBefore: %s"
 msgstr ""
 
-#: src/dird/job.c:259
+#: src/dird/job.c:258
 #, c-format
 msgid "RunBeforeJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:325
+#: src/dird/job.c:339
 #, c-format
 msgid "RunAfter: %s"
 msgstr ""
 
-#: src/dird/job.c:335
+#: src/dird/job.c:349
 #, c-format
 msgid "RunAfterJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:337
+#: src/dird/job.c:351
 #, c-format
 msgid "RunAfterFailedJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:376
+#: src/dird/job.c:390
 #, c-format
 msgid "JobId %d, Job %s marked to be canceled.\n"
 msgstr ""
 
-#: src/dird/job.c:387
+#: src/dird/job.c:401
 msgid "Failed to connect to File daemon.\n"
 msgstr ""
 
-#: src/dird/job.c:409 src/dird/ua_cmds.c:619 src/dird/ua_cmds.c:1266
-#: src/dird/ua_label.c:691
+#: src/dird/job.c:423 src/dird/ua_cmds.c:680 src/dird/ua_cmds.c:1327
+#: src/dird/ua_label.c:712
 msgid "Failed to connect to Storage daemon.\n"
 msgstr ""
 
-#: src/dird/job.c:545 src/dird/job.c:593
+#: src/dird/job.c:557 src/dird/job.c:605
 #, c-format
 msgid "Unhandled job status code %d\n"
 msgstr ""
 
-#: src/dird/job.c:621 src/stored/bscan.c:902
+#: src/dird/job.c:633 src/stored/bscan.c:908
 #, c-format
 msgid "Could not create Client record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:653
+#: src/dird/job.c:665
 msgid "FileSet MD5 signature not found.\n"
 msgstr ""
 
-#: src/dird/job.c:658
+#: src/dird/job.c:670
 #, c-format
 msgid "Could not create FileSet \"%s\" record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:697
+#: src/dird/job.c:709
 #, c-format
 msgid "Error updating job record. %s"
 msgstr ""
 
-#: src/dird/jobq.c:67
+#: src/dird/jobq.c:62
 #, c-format
 msgid "pthread_attr_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:76
+#: src/dird/jobq.c:71
 #, c-format
 msgid "pthread_mutex_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:82
+#: src/dird/jobq.c:77
 #, c-format
 msgid "pthread_cond_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:115 src/dird/jobq.c:242 src/dird/jobq.c:307
-#: src/dird/jobq.c:388
+#: src/dird/jobq.c:110 src/dird/jobq.c:234 src/dird/jobq.c:299
+#: src/dird/jobq.c:380
 #, c-format
 msgid "pthread_mutex_lock: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:128
+#: src/dird/jobq.c:123
 #, c-format
 msgid "pthread_cond_broadcast: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:136
+#: src/dird/jobq.c:131
 #, c-format
 msgid "pthread_cond_wait: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:144
+#: src/dird/jobq.c:139
 #, c-format
 msgid "pthread_mutex_unlock: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:180
+#: src/dird/jobq.c:175
 #, c-format
 msgid "Job %s waiting %d seconds for scheduled start time.\n"
 msgstr ""
 
-#: src/dird/jobq.c:235
+#: src/dird/jobq.c:227
 #, c-format
 msgid "pthread_thread_create: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:353
+#: src/dird/jobq.c:345
 #, c-format
 msgid "pthread_cond_signal: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:362
+#: src/dird/jobq.c:354
 #, c-format
 msgid "pthread_create: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:487
+#: src/dird/jobq.c:481
 #, c-format
 msgid "Rescheduled Job %s at %s to re-run in %d seconds.\n"
 msgstr ""
 
-#: src/dird/mac.c:59 src/dird/verify.c:92
+#: src/dird/mac.c:77 src/dird/verify.c:92
 msgid "Unable to find JobId of previous Job for this client.\n"
 msgstr ""
 
-#: src/dird/mac.c:133
+#: src/dird/mac.c:85 src/dird/verify.c:108
+#, c-format
+msgid "Could not get job record for previous Job. ERR=%s"
+msgstr ""
+
+#: src/dird/mac.c:90 src/dird/verify.c:113
+#, c-format
+msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
+msgstr ""
+
+#: src/dird/mac.c:94
+#, c-format
+msgid "%s using JobId=%d Job=%s\n"
+msgstr ""
+
+#: src/dird/mac.c:185
 #, c-format
-msgid "Start %s JobId %u, Job=%s\n"
+msgid "Start %s JobId %s, Job=%s\n"
 msgstr ""
 
-#: src/dird/mac.c:369
+#: src/dird/mac.c:421
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -2101,22 +2073,22 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/msgchan.c:78 src/filed/job.c:1128
+#: src/dird/msgchan.c:80 src/filed/job.c:1125
 #: src/tray-monitor/tray-monitor.c:874
 msgid "Storage daemon"
 msgstr ""
 
-#: src/dird/msgchan.c:157
+#: src/dird/msgchan.c:171
 #, c-format
 msgid "Storage daemon rejected Job command: %s\n"
 msgstr ""
 
-#: src/dird/msgchan.c:164
+#: src/dird/msgchan.c:178
 #, c-format
 msgid "<stored: bad response to Job command: %s\n"
 msgstr ""
 
-#: src/dird/msgchan.c:211
+#: src/dird/msgchan.c:262
 #, c-format
 msgid ""
 "\n"
@@ -2124,7 +2096,14 @@ msgid ""
 "     %s"
 msgstr ""
 
-#: src/dird/msgchan.c:241 src/dird/msgchan.c:382
+#: src/dird/msgchan.c:266
+#, c-format
+msgid ""
+"\n"
+"     Storage daemon didn't accept Device \"%s\" command.\n"
+msgstr ""
+
+#: src/dird/msgchan.c:289 src/dird/msgchan.c:434
 #, c-format
 msgid "Cannot create message thread: %s\n"
 msgstr ""
@@ -2148,85 +2127,137 @@ msgstr ""
 msgid "Too many failures. Giving up creating Volume name.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:124
-#, c-format
-msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
-msgstr ""
-
-#: src/dird/next_vol.c:150
+#: src/dird/next_vol.c:128
 #, c-format
 msgid "Purging oldest volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:156
+#: src/dird/next_vol.c:134
 #, c-format
 msgid "Pruning oldest volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:175
+#: src/dird/next_vol.c:153
 msgid "We seem to be looping trying to find the next volume. I give up.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:200
+#: src/dird/next_vol.c:178
 #, c-format
 msgid "Max Volume bytes exceeded. Marking Volume \"%s\" as Full.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:207
+#: src/dird/next_vol.c:185
 #, c-format
 msgid "Volume used once. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:214
+#: src/dird/next_vol.c:192
 #, c-format
 msgid "Max Volume jobs exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:221
+#: src/dird/next_vol.c:199
 #, c-format
 msgid "Max Volume files exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:231
+#: src/dird/next_vol.c:209
 #, c-format
 msgid "Max configured use duration exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:241
+#: src/dird/next_vol.c:219
 #, c-format
 msgid "Catalog error updating volume \"%s\". ERR=%s"
 msgstr ""
 
-#: src/dird/next_vol.c:262
+#: src/dird/next_vol.c:240
 msgid "volume has expired"
 msgstr ""
 
-#: src/dird/next_vol.c:280 src/dird/next_vol.c:316
+#: src/dird/next_vol.c:258 src/dird/next_vol.c:294
 #, c-format
 msgid "Recycled current volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:285
+#: src/dird/next_vol.c:263
 msgid "and recycling of current volume failed"
 msgstr ""
 
-#: src/dird/next_vol.c:291
+#: src/dird/next_vol.c:269
 msgid "but should be Append, Purged or Recycle"
 msgstr ""
 
-#: src/dird/next_vol.c:319
+#: src/dird/next_vol.c:297
 msgid ""
 "but should be Append, Purged or Recycle (recycling of the current volume "
 "failed)"
 msgstr ""
 
-#: src/dird/next_vol.c:323
+#: src/dird/next_vol.c:301
 msgid ""
 "but should be Append, Purged or Recycle (cannot automatically recycle "
-"current volume, as it still contains unpruned data)"
+"current volume, as it still contains unpruned data or the Volume Retention "
+"time has not expired.)"
+msgstr ""
+
+#: src/dird/next_vol.c:342
+#, c-format
+msgid "Unable to get Pool record: ERR=%s"
+msgstr ""
+
+#: src/dird/next_vol.c:347
+#, c-format
+msgid "Unable add Scratch Volume, Pool \"%s\" full MaxVols=%d\n"
+msgstr ""
+
+#: src/dird/next_vol.c:360
+#, c-format
+msgid "Failed to move Scratch Volume. ERR=%s\n"
+msgstr ""
+
+#: src/dird/next_vol.c:364
+#, c-format
+msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:372
+#, c-format
+msgid "Unable to update Volume record: ERR=%s"
+msgstr ""
+
+#: src/dird/pythondir.c:107 src/filed/pythonfd.c:96 src/filed/pythonfd.c:150
+#: src/filed/pythonfd.c:214 src/stored/pythonsd.c:90 src/stored/pythonsd.c:155
+msgid "Job pointer not found."
+msgstr ""
+
+#: src/dird/pythondir.c:139
+msgid "Pool record not found."
+msgstr ""
+
+#: src/dird/pythondir.c:168 src/filed/pythonfd.c:127 src/stored/pythonsd.c:132
+#, c-format
+msgid "Attribute %s not found."
+msgstr ""
+
+#: src/dird/pythondir.c:211 src/dird/pythondir.c:217 src/filed/pythonfd.c:169
+#: src/stored/pythonsd.c:172
+msgid "Read-only attribute"
+msgstr ""
+
+#: src/dird/pythondir.c:243
+msgid "Priority must be 1-100"
+msgstr ""
+
+#: src/dird/pythondir.c:248
+msgid "Job Level can be set only during JobInit"
 msgstr ""
 
-#: src/dird/recycle.c:102
+#: src/dird/pythondir.c:259
+msgid "Bad JobLevel string"
+msgstr ""
+
+#: src/dird/recycle.c:99
 #, c-format
 msgid "Recycled volume \"%s\"\n"
 msgstr ""
@@ -2240,23 +2271,23 @@ msgstr ""
 msgid "Start Restore Job %s\n"
 msgstr ""
 
-#: src/dird/restore.c:231
+#: src/dird/restore.c:223
 msgid "Restore OK -- warning file count mismatch"
 msgstr ""
 
-#: src/dird/restore.c:233
+#: src/dird/restore.c:225
 msgid "Restore OK"
 msgstr ""
 
-#: src/dird/restore.c:238
+#: src/dird/restore.c:230
 msgid "*** Restore Error ***"
 msgstr ""
 
-#: src/dird/restore.c:248
+#: src/dird/restore.c:240
 msgid "Restore Canceled"
 msgstr ""
 
-#: src/dird/restore.c:275
+#: src/dird/restore.c:267
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -2366,15 +2397,15 @@ msgstr ""
 msgid "Job %s not found\n"
 msgstr ""
 
-#: src/dird/scheduler.c:102
+#: src/dird/scheduler.c:103
 msgid "Walk queue"
 msgstr ""
 
-#: src/dird/scheduler.c:112
+#: src/dird/scheduler.c:113
 msgid "Dequeued job"
 msgstr ""
 
-#: src/dird/scheduler.c:115
+#: src/dird/scheduler.c:116
 msgid "Scheduler logic error\n"
 msgstr ""
 
@@ -2382,170 +2413,180 @@ msgstr ""
 msgid "Run job"
 msgstr ""
 
-#: src/dird/scheduler.c:345
+#: src/dird/scheduler.c:349
 msgid "Inserted job"
 msgstr ""
 
-#: src/dird/scheduler.c:353
+#: src/dird/scheduler.c:357
 msgid "Appended job"
 msgstr ""
 
-#: src/dird/scheduler.c:357
+#: src/dird/scheduler.c:361
 msgid "Run queue"
 msgstr ""
 
-#: src/dird/ua_cmds.c:88
+#: src/dird/ua_cmds.c:90
 msgid "add media to a pool"
 msgstr ""
 
-#: src/dird/ua_cmds.c:89
+#: src/dird/ua_cmds.c:91
 msgid "autodisplay [on|off] -- console messages"
 msgstr ""
 
-#: src/dird/ua_cmds.c:90
+#: src/dird/ua_cmds.c:92
 msgid "automount [on|off] -- after label"
 msgstr ""
 
-#: src/dird/ua_cmds.c:91
+#: src/dird/ua_cmds.c:93
 msgid "cancel [<jobid=nnn> | <job=name>] -- cancel a job"
 msgstr ""
 
-#: src/dird/ua_cmds.c:92
+#: src/dird/ua_cmds.c:94
 msgid "create DB Pool from resource"
 msgstr ""
 
-#: src/dird/ua_cmds.c:93
+#: src/dird/ua_cmds.c:95
 msgid "delete [pool=<pool-name> | media volume=<volume-name>]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:94
+#: src/dird/ua_cmds.c:96
+msgid "disable <job=name> -- disable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:97
+msgid "enable <job=name> -- enable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:98
 msgid "performs FileSet estimate, listing gives full listing"
 msgstr ""
 
-#: src/dird/ua_cmds.c:96
+#: src/dird/ua_cmds.c:100
 msgid "gui [on|off] -- non-interactive gui mode"
 msgstr ""
 
-#: src/dird/ua_cmds.c:97 src/stored/btape.c:2533
+#: src/dird/ua_cmds.c:101 src/stored/btape.c:2540
 msgid "print this command"
 msgstr ""
 
-#: src/dird/ua_cmds.c:98
+#: src/dird/ua_cmds.c:102
 msgid ""
 "list [pools | jobs | jobtotals | media <pool=pool-name> | files <jobid=nn>]; "
 "from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:99
+#: src/dird/ua_cmds.c:103
 msgid "label a tape"
 msgstr ""
 
-#: src/dird/ua_cmds.c:100
+#: src/dird/ua_cmds.c:104
 msgid "full or long list like list command"
 msgstr ""
 
-#: src/dird/ua_cmds.c:101
+#: src/dird/ua_cmds.c:105
 msgid "messages"
 msgstr ""
 
-#: src/dird/ua_cmds.c:102
+#: src/dird/ua_cmds.c:106
 msgid "mount <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:103
+#: src/dird/ua_cmds.c:107
 msgid "prune expired records from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:104
+#: src/dird/ua_cmds.c:108
 msgid "purge records from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:105
+#: src/dird/ua_cmds.c:109
 msgid "python control commands"
 msgstr ""
 
-#: src/dird/ua_cmds.c:107
+#: src/dird/ua_cmds.c:111
 msgid "query catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:108
+#: src/dird/ua_cmds.c:112
 msgid "restore files"
 msgstr ""
 
-#: src/dird/ua_cmds.c:109
+#: src/dird/ua_cmds.c:113
 msgid "relabel a tape"
 msgstr ""
 
-#: src/dird/ua_cmds.c:110
+#: src/dird/ua_cmds.c:114
 msgid "release <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:111
+#: src/dird/ua_cmds.c:115
 msgid "reload conf file"
 msgstr ""
 
-#: src/dird/ua_cmds.c:112
+#: src/dird/ua_cmds.c:116
 msgid "run <job-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:113
+#: src/dird/ua_cmds.c:117
 msgid "status [storage | client]=<name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:114
+#: src/dird/ua_cmds.c:118
 msgid "sets debug level"
 msgstr ""
 
-#: src/dird/ua_cmds.c:115
+#: src/dird/ua_cmds.c:119
 msgid "sets new client address -- if authorized"
 msgstr ""
 
-#: src/dird/ua_cmds.c:116
+#: src/dird/ua_cmds.c:120
 msgid "show (resource records) [jobs | pools | ... | all]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:117
+#: src/dird/ua_cmds.c:121
 msgid "use SQL to query catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:119
+#: src/dird/ua_cmds.c:123
 msgid "turn on/off trace to file"
 msgstr ""
 
-#: src/dird/ua_cmds.c:120
+#: src/dird/ua_cmds.c:124
 msgid "unmount <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:121
+#: src/dird/ua_cmds.c:125
 msgid "umount <storage-name> for old-time Unix guys"
 msgstr ""
 
-#: src/dird/ua_cmds.c:122
+#: src/dird/ua_cmds.c:126
 msgid "update Volume, Pool or slots"
 msgstr ""
 
-#: src/dird/ua_cmds.c:123
+#: src/dird/ua_cmds.c:127
 msgid "use catalog xxx"
 msgstr ""
 
-#: src/dird/ua_cmds.c:124
+#: src/dird/ua_cmds.c:128
 msgid "does variable expansion"
 msgstr ""
 
-#: src/dird/ua_cmds.c:125
+#: src/dird/ua_cmds.c:129
 msgid "print Director version"
 msgstr ""
 
-#: src/dird/ua_cmds.c:126
-msgid "wait until no jobs are running"
+#: src/dird/ua_cmds.c:130
+msgid ""
+"wait until no jobs are running [<jobname=name> | <jobid=nnn> | "
+"<ujobid=complete_name>]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:158
+#: src/dird/ua_cmds.c:168
 #, c-format
 msgid "%s: is an illegal command.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:196
+#: src/dird/ua_cmds.c:206
 msgid ""
 "You probably don't want to be using this command since it\n"
 "creates database records without labeling the Volumes.\n"
@@ -2553,220 +2594,234 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:215
+#: src/dird/ua_cmds.c:225
 #, c-format
-msgid "Pool already has maximum volumes = %d\n"
+msgid "Pool already has maximum volumes=%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:217
+#: src/dird/ua_cmds.c:227
 msgid "Enter new maximum (zero for unlimited): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:238
+#: src/dird/ua_cmds.c:248
 #, c-format
 msgid "Enter number of Volumes to create. 0=>fixed name. Max=%d: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:244
+#: src/dird/ua_cmds.c:254
 #, c-format
 msgid "The number must be between 0 and %d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:251
+#: src/dird/ua_cmds.c:261
 msgid "Enter Volume name: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:255
+#: src/dird/ua_cmds.c:265
 msgid "Enter base volume name: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:264 src/dird/ua_label.c:590
+#: src/dird/ua_cmds.c:274 src/dird/ua_label.c:609
 msgid "Volume name too long.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:268 src/dird/ua_label.c:596 src/lib/edit.c:413
+#: src/dird/ua_cmds.c:278 src/dird/ua_label.c:615 src/lib/edit.c:446
 msgid "Volume name must be at least one character long.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:277
+#: src/dird/ua_cmds.c:287
 msgid "Enter the starting number: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:282
+#: src/dird/ua_cmds.c:292
 msgid "Start number must be greater than zero.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:293
+#: src/dird/ua_cmds.c:303
 msgid "Enter slot (0 for none): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:297
+#: src/dird/ua_cmds.c:307
 msgid "InChanger? yes/no: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:324
+#: src/dird/ua_cmds.c:334
 #, c-format
 msgid "%d Volumes created in pool %s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:340 src/dird/ua_cmds.c:866
+#: src/dird/ua_cmds.c:350 src/dird/ua_cmds.c:927
 msgid "Turn on or off? "
 msgstr ""
 
-#: src/dird/ua_cmds.c:348 src/dird/ua_cmds.c:874
+#: src/dird/ua_cmds.c:358 src/dird/ua_cmds.c:935
 msgid "off"
 msgstr ""
 
-#: src/dird/ua_cmds.c:368
+#: src/dird/ua_cmds.c:378
 msgid "jobid"
 msgstr ""
 
-#: src/dird/ua_cmds.c:375
+#: src/dird/ua_cmds.c:385
 #, c-format
 msgid "JobId %s is not running. Use Job name to cancel inactive jobs.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:379
+#: src/dird/ua_cmds.c:389
 msgid "job"
 msgstr ""
 
-#: src/dird/ua_cmds.c:384
+#: src/dird/ua_cmds.c:394 src/dird/ua_cmds.c:404
 #, c-format
 msgid "Warning Job %s is not running. Continuing anyway ...\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:407 src/filed/status.c:193 src/stored/status.c:315
+#: src/dird/ua_cmds.c:399
+msgid "ujobid"
+msgstr ""
+
+#: src/dird/ua_cmds.c:427 src/filed/status.c:195 src/stored/status.c:343
 msgid "No Jobs running.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:410
+#: src/dird/ua_cmds.c:430
 msgid "Select Job:\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:417
+#: src/dird/ua_cmds.c:436
 #, c-format
 msgid "JobId=%s Job=%s"
 msgstr ""
 
-#: src/dird/ua_cmds.c:422
+#: src/dird/ua_cmds.c:441
 msgid "Choose Job to cancel"
 msgstr ""
 
-#: src/dird/ua_cmds.c:426
+#: src/dird/ua_cmds.c:445
 msgid "Confirm cancel (yes/no): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:434
+#: src/dird/ua_cmds.c:452
 #, c-format
 msgid "Job %s not found.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:539
+#: src/dird/ua_cmds.c:557
 #, c-format
 msgid ""
 "Error: Pool %s already exists.\n"
 "Use update to change it.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:550
+#: src/dird/ua_cmds.c:568
 #, c-format
 msgid "Pool %s created.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:563
+#: src/dird/ua_cmds.c:581
 msgid "restart"
 msgstr ""
 
-#: src/dird/ua_cmds.c:567
+#: src/dird/ua_cmds.c:585
 msgid "Python interpreter restarted.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:569 src/dird/ua_cmds.c:1094
+#: src/dird/ua_cmds.c:587 src/dird/ua_cmds.c:1155
 msgid "Nothing done.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:585
+#: src/dird/ua_cmds.c:603 src/dird/ua_cmds.c:649
 msgid "Illegal command from this console.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:592 src/dird/ua_run.c:353
+#: src/dird/ua_cmds.c:610 src/dird/ua_run.c:353
 #, c-format
 msgid "Client \"%s\" not found.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:601
+#: src/dird/ua_cmds.c:619
 #, c-format
 msgid "Client \"%s\" address set to %s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:616 src/dird/ua_status.c:286
+#: src/dird/ua_cmds.c:644
+#, c-format
+msgid "Job \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:653
+#, c-format
+msgid "Job \"%s\" %sabled\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:677 src/dird/ua_status.c:286
 #, c-format
 msgid "Connecting to Storage daemon %s at %s:%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:622 src/dird/ua_status.c:297
+#: src/dird/ua_cmds.c:683 src/dird/ua_status.c:297
 msgid "Connected to storage daemon\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:642 src/dird/ua_cmds.c:981 src/dird/ua_status.c:324
+#: src/dird/ua_cmds.c:703 src/dird/ua_cmds.c:1042 src/dird/ua_status.c:324
 #, c-format
 msgid "Connecting to Client %s at %s:%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:645 src/dird/ua_cmds.c:984
+#: src/dird/ua_cmds.c:706 src/dird/ua_cmds.c:1045
 msgid "Failed to connect to Client.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:761
+#: src/dird/ua_cmds.c:822
 msgid "Enter new debug level: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:827
+#: src/dird/ua_cmds.c:888
 msgid "Available daemons are: \n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:832
+#: src/dird/ua_cmds.c:893
 msgid "Select daemon type to set debug level"
 msgstr ""
 
-#: src/dird/ua_cmds.c:936 src/dird/ua_run.c:478
+#: src/dird/ua_cmds.c:997 src/dird/ua_run.c:478
 #, c-format
 msgid "Level %s not valid.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:949
+#: src/dird/ua_cmds.c:1010
 msgid "No job specified.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:989
+#: src/dird/ua_cmds.c:1050
 msgid "Error sending include list.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:994
+#: src/dird/ua_cmds.c:1055
 msgid "Error sending exclude list.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1080
+#: src/dird/ua_cmds.c:1141
 msgid ""
 "In general it is not a good idea to delete either a\n"
 "Pool or a Volume since they may contain data.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1083
+#: src/dird/ua_cmds.c:1144
 msgid "Choose catalog item to delete"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1151
+#: src/dird/ua_cmds.c:1212
 msgid "Enter JobId to delete: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:1194
+#: src/dird/ua_cmds.c:1255
 #, c-format
 msgid "Job %s and associated records deleted from the catalog.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1207
+#: src/dird/ua_cmds.c:1268
 #, c-format
 msgid ""
 "\n"
@@ -2774,58 +2829,70 @@ msgid ""
 "and all Jobs saved on that volume from the Catalog\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1211
+#: src/dird/ua_cmds.c:1272
 msgid "Are you sure you want to delete this Volume? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:1232
+#: src/dird/ua_cmds.c:1293
 msgid "Are you sure you want to delete this Pool? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:1329
+#: src/dird/ua_cmds.c:1390
 #, c-format
 msgid "Using Catalog name=%s DB=%s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1370 src/dird/ua_tree.c:594 src/stored/btape.c:2580
+#: src/dird/ua_cmds.c:1450
+msgid "ERR: Can't open db\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1486
+msgid "ERR: Job was not found\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1562 src/dird/ua_tree.c:629 src/stored/btape.c:2587
 #, c-format
 msgid ""
 "  Command    Description\n"
 "  =======    ===========\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1372
+#: src/dird/ua_cmds.c:1564
 #, c-format
 msgid "  %-10s %s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1374
+#: src/dird/ua_cmds.c:1566
 msgid ""
 "\n"
 "When at a prompt, entering a period cancels the command.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1390
+#: src/dird/ua_cmds.c:1582
 #, c-format
 msgid "%s Version: %s (%s)\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1409
+#: src/dird/ua_cmds.c:1601
 msgid "Could not find a Catalog resource\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1412
+#: src/dird/ua_cmds.c:1604
+msgid "You must specify a \"use <catalog-name>\" command before continuing.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1608
 #, c-format
 msgid "Using default Catalog name=%s DB=%s\n"
 msgstr ""
 
-#: src/dird/ua_dotcmds.c:121
+#: src/dird/ua_dotcmds.c:131
 msgid "The Director will segment fault.\n"
 msgstr ""
 
-#: src/dird/ua_dotcmds.c:221 src/dird/ua_restore.c:747
-#: src/dird/ua_restore.c:785
+#: src/dird/ua_dotcmds.c:245 src/dird/ua_restore.c:737
+#: src/dird/ua_restore.c:775 src/dird/ua_restore.c:806
 #, c-format
 msgid "Query failed: %s. ERR=%s\n"
 msgstr ""
@@ -2839,15 +2906,16 @@ msgstr ""
 msgid "Expected a positive integer, got: %s\n"
 msgstr ""
 
-#: src/dird/ua_input.c:120 src/dird/ua_run.c:860 src/dird/ua_select.c:54
-#: src/dird/ua_update.c:232 src/dird/ua_update.c:247 src/dird/ua_update.c:495
-#: src/stored/parse_bsr.c:741 src/tools/dbcheck.c:1098
+#: src/dird/ua_input.c:120 src/dird/ua_run.c:862 src/dird/ua_select.c:54
+#: src/dird/ua_update.c:223 src/dird/ua_update.c:237 src/dird/ua_update.c:247
+#: src/dird/ua_update.c:261 src/dird/ua_update.c:552
+#: src/stored/parse_bsr.c:770 src/tools/dbcheck.c:1098
 msgid "yes"
 msgstr ""
 
-#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:234
-#: src/dird/ua_update.c:247 src/dird/ua_update.c:495
-#: src/stored/parse_bsr.c:741
+#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:225
+#: src/dird/ua_update.c:237 src/dird/ua_update.c:249 src/dird/ua_update.c:261
+#: src/dird/ua_update.c:552 src/stored/parse_bsr.c:770
 msgid "no"
 msgstr ""
 
@@ -2855,220 +2923,210 @@ msgstr ""
 msgid "Invalid response. You must answer yes or no.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:88
+#: src/dird/ua_label.c:89
 msgid "Negative numbers not permitted\n"
 msgstr ""
 
-#: src/dird/ua_label.c:94
+#: src/dird/ua_label.c:95
 msgid "Range end is not integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:99
+#: src/dird/ua_label.c:100
 msgid "Range start is not an integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:105
+#: src/dird/ua_label.c:106
 msgid "Range end not bigger than start.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:111
+#: src/dird/ua_label.c:112
 msgid "Input value is not an integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:117
+#: src/dird/ua_label.c:118
 msgid "Values must be be greater than zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:121
+#: src/dird/ua_label.c:122
 msgid "Slot too large.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:176 src/dird/ua_label.c:463
+#: src/dird/ua_label.c:176 src/dird/ua_label.c:477
 msgid "No slots in changer to scan.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:188 src/dird/ua_label.c:474
+#: src/dird/ua_label.c:188 src/dird/ua_label.c:488
 msgid "No Volumes found to label, or no barcodes.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:195
+#: src/dird/ua_label.c:198
 #, c-format
-msgid "Slot %d larger than max %d ignored.\n"
+msgid "Slot %d greater than max %d ignored.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:224
+#: src/dird/ua_label.c:227
 #, c-format
-msgid "No VolName for Slot=%d set InChanger to zero.\n"
+msgid "No VolName for Slot=%d InChanger set to zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:239
+#: src/dird/ua_label.c:242
 #, c-format
 msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:243
+#: src/dird/ua_label.c:246
 #, c-format
 msgid "Catalog record for Volume \"%s\" is up to date.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:249
+#: src/dird/ua_label.c:252
 #, c-format
-msgid "Record for Volume \"%s\" not found in catalog.\n"
+msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:334
+#: src/dird/ua_label.c:348
 #, c-format
 msgid ""
 "Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before "
 "relabeling.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:350
+#: src/dird/ua_label.c:364
 msgid "Enter new Volume name: "
 msgstr ""
 
-#: src/dird/ua_label.c:363
+#: src/dird/ua_label.c:377
 #, c-format
 msgid "Media record for new Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:378
+#: src/dird/ua_label.c:392
 msgid "Enter slot (0 or Enter for none): "
 msgstr ""
 
-#: src/dird/ua_label.c:403
+#: src/dird/ua_label.c:417
 #, c-format
 msgid "Delete of Volume \"%s\" failed. ERR=%s"
 msgstr ""
 
-#: src/dird/ua_label.c:406
+#: src/dird/ua_label.c:420
 #, c-format
 msgid "Old volume \"%s\" deleted from catalog.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:417
+#: src/dird/ua_label.c:431
 #, c-format
 msgid "Requesting to mount %s ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:439
+#: src/dird/ua_label.c:453
 msgid "Do not forget to mount the drive!!!\n"
 msgstr ""
 
-#: src/dird/ua_label.c:479
+#: src/dird/ua_label.c:493
 msgid ""
 "The following Volumes will be labeled:\n"
 "Slot  Volume\n"
 "==============\n"
 msgstr ""
 
-#: src/dird/ua_label.c:488 src/stored/btape.c:608
+#: src/dird/ua_label.c:502 src/stored/btape.c:606
 msgid "Do you want to continue? (y/n): "
 msgstr ""
 
-#: src/dird/ua_label.c:509
+#: src/dird/ua_label.c:523
 #, c-format
 msgid "Media record for Slot %d Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:515
+#: src/dird/ua_label.c:529
 #, c-format
 msgid "Error setting InChanger: ERR=%s"
 msgstr ""
 
-#: src/dird/ua_label.c:540
+#: src/dird/ua_label.c:552
+#, c-format
+msgid "Maximum pool Volumes=%d reached.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:559
 #, c-format
 msgid "Catalog record for cleaning tape \"%s\" successfully created.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:547
+#: src/dird/ua_label.c:566
 #, c-format
 msgid "Catalog error on cleaning tape: %s"
 msgstr ""
 
-#: src/dird/ua_label.c:583
+#: src/dird/ua_label.c:602
 #, c-format
 msgid "Illegal character \"%c\" in a volume name.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:628
+#: src/dird/ua_label.c:647
 #, c-format
 msgid "Sending relabel command from \"%s\" to \"%s\" ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:635
+#: src/dird/ua_label.c:654
 #, c-format
 msgid "Sending label command for Volume \"%s\" Slot %d ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:665
+#: src/dird/ua_label.c:686
 #, c-format
 msgid "Catalog record for Volume \"%s\", Slot %d  successfully created.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:678
+#: src/dird/ua_label.c:699
 #, c-format
 msgid "Label command failed for Volume %s.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:688
+#: src/dird/ua_label.c:709
 #, c-format
 msgid "Connecting to Storage daemon %s at %s:%d ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:716
+#: src/dird/ua_label.c:737
 msgid "Could not open SD socket.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:722
-#, c-format
-msgid "readlabel %s Slot=%d drive=%d\n"
-msgstr ""
-
-#: src/dird/ua_label.c:764
-#, c-format
-msgid "autochanger list %s \n"
-msgstr ""
-
-#: src/dird/ua_label.c:788 src/dird/ua_label.c:798
+#: src/dird/ua_label.c:809 src/dird/ua_label.c:819
 #, c-format
 msgid "Invalid Slot number: %s\n"
 msgstr ""
 
-#: src/dird/ua_label.c:807
+#: src/dird/ua_label.c:828
 #, c-format
 msgid "Invalid Volume name: %s\n"
 msgstr ""
 
-#: src/dird/ua_label.c:876
-#, c-format
-msgid "autochanger slots %s \n"
-msgstr ""
-
-#: src/dird/ua_label.c:886
+#: src/dird/ua_label.c:907
 #, c-format
 msgid "Device \"%s\" has %d slots.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:902
+#: src/dird/ua_label.c:956
 #, c-format
 msgid "Pool \"%s\" resource not found!\n"
 msgstr ""
 
-#: src/dird/ua_output.c:64 src/dird/ua_output.c:90
+#: src/dird/ua_output.c:64 src/dird/ua_output.c:88
 msgid "ON or OFF keyword missing.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:178
+#: src/dird/ua_output.c:176
 msgid "Keywords for the show command are:\n"
 msgstr ""
 
-#: src/dird/ua_output.c:184
+#: src/dird/ua_output.c:182
 #, c-format
 msgid "%s resource %s not found.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:187
+#: src/dird/ua_output.c:185
 #, c-format
 msgid "Resource %s not found\n"
 msgstr ""
@@ -3077,49 +3135,55 @@ msgstr ""
 msgid "Hey! DB is NULL\n"
 msgstr ""
 
-#: src/dird/ua_output.c:353
+#: src/dird/ua_output.c:367
 #, c-format
 msgid "Jobid %d used %d Volume(s): %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:365
+#: src/dird/ua_output.c:385
 msgid "No Pool specified.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:375 src/dird/ua_select.c:446
+#: src/dird/ua_output.c:396 src/dird/ua_select.c:458
 #, c-format
 msgid "Error obtaining pool ids. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:385
+#: src/dird/ua_output.c:406
 #, c-format
 msgid "Pool: %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:396
-msgid "No Volume Name specified.\n"
+#: src/dird/ua_output.c:422 src/dird/ua_status.c:455
+msgid "Ignoring illegal value for days.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:409
+#: src/dird/ua_output.c:431
 #, c-format
 msgid "Unknown list keyword: %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:434
+#: src/dird/ua_output.c:457
 #, c-format
 msgid "%s is not a job name.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:450 src/dird/ua_output.c:462
-msgid "Could not find next Volume.\n"
+#: src/dird/ua_output.c:481
+#, c-format
+msgid "Could not find next Volume for Job %s (%s, %s).\n"
+msgstr ""
+
+#: src/dird/ua_output.c:485
+#, c-format
+msgid "The next Volume to be used by Job \"%s\" (%s, %s) will be %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:452
+#: src/dird/ua_output.c:495
 #, c-format
-msgid "The next Volume to be used by Job \"%s\" will be %s\n"
+msgid "Could not find next Volume for Job %s.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:671
+#: src/dird/ua_output.c:685
 msgid "You have no messages.\n"
 msgstr ""
 
@@ -3279,32 +3343,32 @@ msgstr ""
 msgid "End query mode.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:151
+#: src/dird/ua_restore.c:115
 msgid ""
 "No Restore Job Resource found in bacula-dir.conf.\n"
 "You must create at least one before running this command.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:167
+#: src/dird/ua_restore.c:131
 msgid "Restore not done.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:178
+#: src/dird/ua_restore.c:142
 msgid "Unable to construct a valid BSR. Cannot continue.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:182 src/dird/ua_restore.c:196
+#: src/dird/ua_restore.c:146 src/dird/ua_restore.c:160
 msgid "No files selected to be restored.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:190
+#: src/dird/ua_restore.c:154
 msgid ""
 "\n"
 "1 file selected to be restored.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:193
+#: src/dird/ua_restore.c:157
 #, c-format
 msgid ""
 "\n"
@@ -3312,80 +3376,85 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:211
+#: src/dird/ua_restore.c:175
 msgid "No Restore Job resource found!\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:309
+#: src/dird/ua_restore.c:234
+#, c-format
+msgid "Missing value for keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:283
 msgid "List last 20 Jobs run"
 msgstr ""
 
-#: src/dird/ua_restore.c:310
+#: src/dird/ua_restore.c:284
 msgid "List Jobs where a given File is saved"
 msgstr ""
 
-#: src/dird/ua_restore.c:311
+#: src/dird/ua_restore.c:285
 msgid "Enter list of comma separated JobIds to select"
 msgstr ""
 
-#: src/dird/ua_restore.c:312
+#: src/dird/ua_restore.c:286
 msgid "Enter SQL list command"
 msgstr ""
 
-#: src/dird/ua_restore.c:313
+#: src/dird/ua_restore.c:287
 msgid "Select the most recent backup for a client"
 msgstr ""
 
-#: src/dird/ua_restore.c:314
+#: src/dird/ua_restore.c:288
 msgid "Select backup for a client before a specified time"
 msgstr ""
 
-#: src/dird/ua_restore.c:315
+#: src/dird/ua_restore.c:289
 msgid "Enter a list of files to restore"
 msgstr ""
 
-#: src/dird/ua_restore.c:316
+#: src/dird/ua_restore.c:290
 msgid "Enter a list of files to restore before a specified time"
 msgstr ""
 
-#: src/dird/ua_restore.c:317
+#: src/dird/ua_restore.c:291
 msgid "Find the JobIds of the most recent backup for a client"
 msgstr ""
 
-#: src/dird/ua_restore.c:318
+#: src/dird/ua_restore.c:292
 msgid "Find the JobIds for a backup for a client before a specified time"
 msgstr ""
 
-#: src/dird/ua_restore.c:319
+#: src/dird/ua_restore.c:293
 msgid "Enter a list of directories to restore for found JobIds"
 msgstr ""
 
-#: src/dird/ua_restore.c:320 src/dird/ua_status.c:702 src/filed/status.c:249
-#: src/stored/status.c:367 src/wx-console/wxbconfigpanel.cpp:191
+#: src/dird/ua_restore.c:294 src/dird/ua_status.c:722 src/filed/status.c:251
+#: src/stored/status.c:412 src/wx-console/wxbconfigpanel.cpp:191
 msgid "Cancel"
 msgstr ""
 
-#: src/dird/ua_restore.c:356
+#: src/dird/ua_restore.c:330
 #, c-format
 msgid "Unknown keyword: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:374
+#: src/dird/ua_restore.c:354
 #, c-format
 msgid "Improper date format: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:408 src/dird/ua_select.c:576
+#: src/dird/ua_restore.c:394 src/dird/ua_select.c:590
 #, c-format
 msgid "Error: Pool resource \"%s\" does not exist.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:413
+#: src/dird/ua_restore.c:399
 #, c-format
 msgid "Error: Pool resource \"%s\" access not allowed.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:432
+#: src/dird/ua_restore.c:418
 msgid ""
 "\n"
 "First you select one or more JobIds that contain files\n"
@@ -3395,217 +3464,226 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:444
+#: src/dird/ua_restore.c:430
 msgid "To select the JobIds, you have the following choices:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:449
+#: src/dird/ua_restore.c:435
 msgid "Select item: "
 msgstr ""
 
-#: src/dird/ua_restore.c:463
+#: src/dird/ua_restore.c:449
 msgid "Enter Filename (no path):"
 msgstr ""
 
-#: src/dird/ua_restore.c:478 src/dird/ua_restore.c:578
+#: src/dird/ua_restore.c:464 src/dird/ua_restore.c:564
 msgid "Enter JobId(s), comma separated, to restore: "
 msgstr ""
 
-#: src/dird/ua_restore.c:484
+#: src/dird/ua_restore.c:470
 msgid "Enter SQL list command: "
 msgstr ""
 
-#: src/dird/ua_restore.c:512 src/dird/ua_restore.c:537
+#: src/dird/ua_restore.c:498 src/dird/ua_restore.c:523
 msgid ""
 "Enter file names with paths, or < to enter a filename\n"
-"containg a list of file names with paths, and terminate\n"
+"containing a list of file names with paths, and terminate\n"
 "them with a blank line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:516 src/dird/ua_restore.c:541
+#: src/dird/ua_restore.c:502 src/dird/ua_restore.c:527
 msgid "Enter full filename: "
 msgstr ""
 
-#: src/dird/ua_restore.c:576
+#: src/dird/ua_restore.c:562
 #, c-format
 msgid "You have already seleted the following JobIds: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:591
+#: src/dird/ua_restore.c:577
 msgid ""
 "Enter full directory names or start the name\n"
-"with a < to indicate it is a filename containg a list\n"
+"with a < to indicate it is a filename containing a list\n"
 "of directories and terminate them with a blank line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:595
+#: src/dird/ua_restore.c:581
 msgid "Enter directory name: "
 msgstr ""
 
-#: src/dird/ua_restore.c:620
+#: src/dird/ua_restore.c:606
 msgid "No Jobs selected.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:624
+#: src/dird/ua_restore.c:610
 #, c-format
 msgid "You have selected the following JobIds: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:627
+#: src/dird/ua_restore.c:613
 #, c-format
 msgid "You have selected the following JobId: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:636
+#: src/dird/ua_restore.c:621
 msgid "Invalid JobId in list.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:648
+#: src/dird/ua_restore.c:634
 #, c-format
 msgid "Unable to get Job record for JobId=%s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:653
+#: src/dird/ua_restore.c:639
 #, c-format
 msgid "No authorization. Job \"%s\" not selected.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:667
+#: src/dird/ua_restore.c:653
 msgid ""
 "The restored files will the most current backup\n"
 "BEFORE the date you specify below.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:670
+#: src/dird/ua_restore.c:656
 msgid "Enter date as YYYY-MM-DD HH:MM:SS :"
 msgstr ""
 
-#: src/dird/ua_restore.c:676
+#: src/dird/ua_restore.c:662
 msgid "Improper date format.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:697
+#: src/dird/ua_restore.c:683
 #, c-format
 msgid "Cannot open file %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:705 src/dird/ua_restore.c:709
+#: src/dird/ua_restore.c:691 src/dird/ua_restore.c:695
 #, c-format
 msgid "Error occurred on line %d of %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:751 src/dird/ua_restore.c:789
+#: src/dird/ua_restore.c:741 src/dird/ua_restore.c:779
 #, c-format
 msgid "No database record found for: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:776
+#: src/dird/ua_restore.c:766
 msgid "No JobId specified cannot continue.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:895
+#: src/dird/ua_restore.c:810
+#, c-format
+msgid "No table found: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:915
 #, c-format
 msgid ""
 "\n"
 "Building directory tree for JobId %s ...  "
 msgstr ""
 
-#: src/dird/ua_restore.c:914
+#: src/dird/ua_restore.c:934
 msgid ""
 "\n"
 "There were no files inserted into the tree, so file selection\n"
 "is not possible.Most likely your retention policy pruned the files\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:916
+#: src/dird/ua_restore.c:936
 msgid ""
 "\n"
 "Do you want to restore all the files? (yes|no): "
 msgstr ""
 
-#: src/dird/ua_restore.c:932
+#: src/dird/ua_restore.c:952
 #, c-format
 msgid ""
 "\n"
 "1 Job, %s files inserted into the tree and marked for extraction.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:936
+#: src/dird/ua_restore.c:956
 #, c-format
 msgid ""
 "\n"
 "1 Job, %s files inserted into the tree.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:942
+#: src/dird/ua_restore.c:962
 #, c-format
 msgid ""
 "\n"
 "%d Jobs, %s files inserted into the tree and marked for extraction.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:946
+#: src/dird/ua_restore.c:966
 #, c-format
 msgid ""
 "\n"
 "%d Jobs, %s files inserted into the tree.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1023
+#: src/dird/ua_restore.c:1043
 #, c-format
 msgid "Error getting FileSet \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1031 src/dird/ua_select.c:165
+#: src/dird/ua_restore.c:1051 src/dird/ua_select.c:167
 msgid "The defined FileSet resources are:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1035 src/dird/ua_select.c:173
+#: src/dird/ua_restore.c:1055 src/dird/ua_run.c:644 src/dird/ua_select.c:175
+msgid "FileSet"
+msgstr ""
+
+#: src/dird/ua_restore.c:1055 src/dird/ua_select.c:175
 msgid "Select FileSet resource"
 msgstr ""
 
-#: src/dird/ua_restore.c:1042
+#: src/dird/ua_restore.c:1062
 #, c-format
 msgid "Error getting FileSet record: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1043
+#: src/dird/ua_restore.c:1063
 msgid ""
 "This probably means you modified the FileSet.\n"
 "Continuing anyway.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1058
+#: src/dird/ua_restore.c:1078
 #, c-format
 msgid "Pool \"%s\" not found, using any pool.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1084 src/dird/ua_restore.c:1100
+#: src/dird/ua_restore.c:1104 src/dird/ua_restore.c:1120
 #, c-format
 msgid "No Full backup before %s found.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1123
+#: src/dird/ua_restore.c:1143
 msgid "No jobs found.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1289
+#: src/dird/ua_restore.c:1316
 msgid ""
 "Warning, the JobIds that you selected refer to more than one MediaType.\n"
 "Restore is not possible. The MediaTypes used are:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1297
+#: src/dird/ua_restore.c:1324
 msgid "No MediaType found for your JobIds.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1329
+#: src/dird/ua_restore.c:1356
 #, c-format
 msgid "Warning default storage overridden by %s on command line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1340
+#: src/dird/ua_restore.c:1367
 #, c-format
 msgid ""
 "\n"
@@ -3760,7 +3838,7 @@ msgid ""
 "Priority: %d\n"
 msgstr ""
 
-#: src/dird/ua_run.c:507 src/lib/util.c:301
+#: src/dird/ua_run.c:507 src/lib/util.c:295
 msgid "Admin"
 msgstr ""
 
@@ -3778,7 +3856,7 @@ msgid ""
 "Priority: %d\n"
 msgstr ""
 
-#: src/dird/ua_run.c:528 src/lib/util.c:292
+#: src/dird/ua_run.c:528 src/lib/util.c:286
 msgid "Backup"
 msgstr ""
 
@@ -3797,7 +3875,7 @@ msgid ""
 "Priority:    %d\n"
 msgstr ""
 
-#: src/dird/ua_run.c:554 src/lib/util.c:295
+#: src/dird/ua_run.c:554 src/lib/util.c:289
 msgid "Verify"
 msgstr ""
 
@@ -3850,7 +3928,7 @@ msgstr ""
 msgid "mod"
 msgstr ""
 
-#: src/dird/ua_run.c:640 src/dird/ua_update.c:415
+#: src/dird/ua_run.c:640 src/dird/ua_update.c:463
 msgid "Parameters to modify:\n"
 msgstr ""
 
@@ -3858,40 +3936,79 @@ msgstr ""
 msgid "Level"
 msgstr ""
 
-#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:380
-#: src/wx-console/wxbrestorepanel.cpp:808
-#: src/wx-console/wxbrestorepanel.cpp:1833
+#: src/dird/ua_run.c:642 src/dird/ua_select.c:152
+#: src/wx-console/wxbrestorepanel.cpp:321
+#: src/wx-console/wxbrestorepanel.cpp:337
+#: src/wx-console/wxbrestorepanel.cpp:458
+#: src/wx-console/wxbrestorepanel.cpp:459
+#: src/wx-console/wxbrestorepanel.cpp:469
+#: src/wx-console/wxbrestorepanel.cpp:470
+#: src/wx-console/wxbrestorepanel.cpp:1133
+#: src/wx-console/wxbrestorepanel.cpp:1794
+#: src/wx-console/wxbrestorepanel.cpp:1865
+msgid "Storage"
+msgstr ""
+
+#: src/dird/ua_run.c:645 src/dird/ua_select.c:282 src/dird/ua_select.c:391
+#: src/wx-console/wxbrestorepanel.cpp:318
+#: src/wx-console/wxbrestorepanel.cpp:336
+#: src/wx-console/wxbrestorepanel.cpp:410
+#: src/wx-console/wxbrestorepanel.cpp:411
+#: src/wx-console/wxbrestorepanel.cpp:421
+#: src/wx-console/wxbrestorepanel.cpp:422
+#: src/wx-console/wxbrestorepanel.cpp:669
+#: src/wx-console/wxbrestorepanel.cpp:1103
+#: src/wx-console/wxbrestorepanel.cpp:1190
+#: src/wx-console/wxbrestorepanel.cpp:1787
+#: src/wx-console/wxbrestorepanel.cpp:1789
+#: src/wx-console/wxbrestorepanel.cpp:1863
+#: src/wx-console/wxbrestorepanel.cpp:1918
+msgid "Client"
+msgstr ""
+
+#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:338
+#: src/wx-console/wxbrestorepanel.cpp:823
+#: src/wx-console/wxbrestorepanel.cpp:1867
 msgid "When"
 msgstr ""
 
-#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:381
-#: src/wx-console/wxbrestorepanel.cpp:1079
-#: src/wx-console/wxbrestorepanel.cpp:1835
+#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:339
+#: src/wx-console/wxbrestorepanel.cpp:1096
+#: src/wx-console/wxbrestorepanel.cpp:1869
 msgid "Priority"
 msgstr ""
 
+#: src/dird/ua_run.c:650 src/dird/ua_select.c:476 src/dird/ua_select.c:566
+#: src/dird/ua_update.c:400 src/dird/ua_update.c:474
+#: src/wx-console/wxbrestorepanel.cpp:320
+#: src/wx-console/wxbrestorepanel.cpp:506
+#: src/wx-console/wxbrestorepanel.cpp:516
+#: src/wx-console/wxbrestorepanel.cpp:1783
+msgid "Pool"
+msgstr ""
+
 #: src/dird/ua_run.c:652
 msgid "Verify Job"
 msgstr ""
 
-#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:373
-#: src/wx-console/wxbrestorepanel.cpp:1814
+#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:331
+#: src/wx-console/wxbrestorepanel.cpp:1848
 msgid "Bootstrap"
 msgstr ""
 
-#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:374
-#: src/wx-console/wxbrestorepanel.cpp:1055
-#: src/wx-console/wxbrestorepanel.cpp:1816
+#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:332
+#: src/wx-console/wxbrestorepanel.cpp:1072
+#: src/wx-console/wxbrestorepanel.cpp:1850
 msgid "Where"
 msgstr ""
 
-#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:376
-#: src/wx-console/wxbrestorepanel.cpp:1063
-#: src/wx-console/wxbrestorepanel.cpp:1820
-#: src/wx-console/wxbrestorepanel.cpp:1821
-#: src/wx-console/wxbrestorepanel.cpp:1822
-#: src/wx-console/wxbrestorepanel.cpp:1823
-#: src/wx-console/wxbrestorepanel.cpp:1824
+#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:334
+#: src/wx-console/wxbrestorepanel.cpp:1080
+#: src/wx-console/wxbrestorepanel.cpp:1854
+#: src/wx-console/wxbrestorepanel.cpp:1855
+#: src/wx-console/wxbrestorepanel.cpp:1856
+#: src/wx-console/wxbrestorepanel.cpp:1857
+#: src/wx-console/wxbrestorepanel.cpp:1858
 msgid "Replace"
 msgstr ""
 
@@ -3899,7 +4016,7 @@ msgstr ""
 msgid "JobId"
 msgstr ""
 
-#: src/dird/ua_run.c:660 src/dird/ua_update.c:430
+#: src/dird/ua_run.c:660 src/dird/ua_update.c:478
 msgid "Select parameter to modify"
 msgstr ""
 
@@ -3908,27 +4025,27 @@ msgid "Levels:\n"
 msgstr ""
 
 #: src/dird/ua_run.c:665 src/filed/status.c:368 src/lib/util.c:319
-#: src/stored/status.c:406
+#: src/stored/status.c:451
 msgid "Base"
 msgstr ""
 
-#: src/dird/ua_run.c:666 src/dird/ua_update.c:106 src/dird/ua_update.c:438
-#: src/filed/status.c:370 src/lib/util.c:321 src/stored/status.c:408
+#: src/dird/ua_run.c:666 src/filed/status.c:370 src/lib/util.c:321
+#: src/stored/status.c:453
 msgid "Full"
 msgstr ""
 
 #: src/dird/ua_run.c:667 src/filed/status.c:373 src/lib/util.c:324
-#: src/stored/status.c:411
+#: src/stored/status.c:456
 msgid "Incremental"
 msgstr ""
 
 #: src/dird/ua_run.c:668 src/filed/status.c:376 src/lib/util.c:327
-#: src/stored/status.c:414
+#: src/stored/status.c:459
 msgid "Differential"
 msgstr ""
 
 #: src/dird/ua_run.c:669 src/filed/status.c:379 src/lib/util.c:330
-#: src/stored/status.c:417
+#: src/stored/status.c:462
 msgid "Since"
 msgstr ""
 
@@ -3941,7 +4058,7 @@ msgid "Initialize Catalog"
 msgstr ""
 
 #: src/dird/ua_run.c:693 src/filed/status.c:382 src/lib/util.c:333
-#: src/stored/status.c:420
+#: src/stored/status.c:465
 msgid "Verify Catalog"
 msgstr ""
 
@@ -4000,16 +4117,16 @@ msgid ""
 "You must set the bootstrap file to NULL to be able to specify a JobId.\n"
 msgstr ""
 
-#: src/dird/ua_run.c:867
+#: src/dird/ua_run.c:869
 msgid "Job failed.\n"
 msgstr ""
 
-#: src/dird/ua_run.c:870
+#: src/dird/ua_run.c:872
 #, c-format
 msgid "Job started. JobId=%s\n"
 msgstr ""
 
-#: src/dird/ua_run.c:876
+#: src/dird/ua_run.c:878
 msgid "Job not run.\n"
 msgstr ""
 
@@ -4042,199 +4159,204 @@ msgstr ""
 msgid "Select Storage resource"
 msgstr ""
 
-#: src/dird/ua_select.c:189
+#: src/dird/ua_select.c:193
 msgid "catalog"
 msgstr ""
 
-#: src/dird/ua_select.c:197
+#: src/dird/ua_select.c:201
 msgid "The defined Catalog resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:205
+#: src/dird/ua_select.c:209
 msgid "Catalog"
 msgstr ""
 
-#: src/dird/ua_select.c:205
+#: src/dird/ua_select.c:209
 msgid "Select Catalog resource"
 msgstr ""
 
-#: src/dird/ua_select.c:220
+#: src/dird/ua_select.c:226
 msgid "The defined Job resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:228
+#: src/dird/ua_select.c:234
 msgid "Select Job resource"
 msgstr ""
 
-#: src/dird/ua_select.c:241
+#: src/dird/ua_select.c:249
 msgid "The defined Restore Job resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:249
+#: src/dird/ua_select.c:257
 msgid "Select Restore Job"
 msgstr ""
 
-#: src/dird/ua_select.c:264
+#: src/dird/ua_select.c:274
 msgid "The defined Client resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:272
+#: src/dird/ua_select.c:282
 msgid "Select Client (File daemon) resource"
 msgstr ""
 
-#: src/dird/ua_select.c:297
+#: src/dird/ua_select.c:309
 #, c-format
 msgid "Error: Client resource %s does not exist.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:322
+#: src/dird/ua_select.c:334
 #, c-format
 msgid "Could not find Client %s: ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:325 src/lib/bnet_server.c:285
-#: src/lib/bnet_server.c:379
+#: src/dird/ua_select.c:337 src/lib/bnet_server.c:284
+#: src/lib/bnet_server.c:378
 msgid "client"
 msgstr ""
 
-#: src/dird/ua_select.c:326
+#: src/dird/ua_select.c:338
 msgid "fd"
 msgstr ""
 
-#: src/dird/ua_select.c:332 src/dird/ua_select.c:386
+#: src/dird/ua_select.c:344 src/dird/ua_select.c:398
 #, c-format
 msgid "Could not find Client \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:361
+#: src/dird/ua_select.c:373
 #, c-format
 msgid "Error obtaining client ids. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:365
+#: src/dird/ua_select.c:377
 msgid "No clients defined. You must run a job before using this command.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:369
+#: src/dird/ua_select.c:381
 msgid "Defined Clients:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:379
+#: src/dird/ua_select.c:391
 msgid "Select the Client"
 msgstr ""
 
-#: src/dird/ua_select.c:412 src/dird/ua_select.c:435 src/dird/ua_select.c:471
+#: src/dird/ua_select.c:424 src/dird/ua_select.c:447 src/dird/ua_select.c:483
 #, c-format
 msgid "Could not find Pool \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:450
+#: src/dird/ua_select.c:462
 msgid "No pools defined. Use the \"create\" command to create one.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:454
+#: src/dird/ua_select.c:466
 msgid "Defined Pools:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:464
+#: src/dird/ua_select.c:476
 msgid "Select the Pool"
 msgstr ""
 
-#: src/dird/ua_select.c:494
+#: src/dird/ua_select.c:506
 #, c-format
 msgid "No access to Pool \"%s\"\n"
 msgstr ""
 
-#: src/dird/ua_select.c:520
+#: src/dird/ua_select.c:532
 msgid "Enter MediaId or Volume name: "
 msgstr ""
 
-#: src/dird/ua_select.c:546
+#: src/dird/ua_select.c:558
 msgid "The defined Pool resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:554
+#: src/dird/ua_select.c:566
 msgid "Select Pool resource"
 msgstr ""
 
-#: src/dird/ua_select.c:587
+#: src/dird/ua_select.c:601
 msgid "Enter the JobId to select: "
 msgstr ""
 
-#: src/dird/ua_select.c:624
+#: src/dird/ua_select.c:639
 #, c-format
 msgid "Could not find Job \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:687
+#: src/dird/ua_select.c:717
 #, c-format
 msgid "Automatically selected %s: %s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:692
+#: src/dird/ua_select.c:722
 #, c-format
 msgid "Cannot select %s in batch mode.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:708
+#: src/dird/ua_select.c:736
 msgid "Selection is empty!\n"
 msgstr ""
 
-#: src/dird/ua_select.c:714
+#: src/dird/ua_select.c:742
 msgid "Item 1 selected automatically.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:725
+#: src/dird/ua_select.c:753
 msgid "Selection aborted, nothing done.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:730
+#: src/dird/ua_select.c:758
 #, c-format
 msgid "Please enter a number between 1 and %d\n"
 msgstr ""
 
-#: src/dird/ua_select.c:778
+#: src/dird/ua_select.c:807
 msgid "Storage name given twice.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:795
+#: src/dird/ua_select.c:824
 #, c-format
 msgid "Expecting jobid=nn command, got: %s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:799
+#: src/dird/ua_select.c:828
 #, c-format
 msgid "JobId %s is not running.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:808
+#: src/dird/ua_select.c:838
 #, c-format
 msgid "Expecting job=xxx, got: %s.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:812
+#: src/dird/ua_select.c:842 src/dird/ua_select.c:854
 #, c-format
 msgid "Job \"%s\" is not running.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:828
+#: src/dird/ua_select.c:850
+#, c-format
+msgid "Expecting ujobid=xxx, got: %s.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:870
 #, c-format
 msgid "Storage resource \"%s\": not found\n"
 msgstr ""
 
-#: src/dird/ua_select.c:850
+#: src/dird/ua_select.c:902
 msgid "Enter autochanger drive[0]: "
 msgstr ""
 
-#: src/dird/ua_select.c:879
+#: src/dird/ua_select.c:932
 msgid "Media Types defined in conf file:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:885
+#: src/dird/ua_select.c:938
 msgid "Media Type"
 msgstr ""
 
-#: src/dird/ua_select.c:885
+#: src/dird/ua_select.c:938
 msgid "Select the Media Type"
 msgstr ""
 
@@ -4260,24 +4382,24 @@ msgstr ""
 msgid "%s Version: %s (%s) %s %s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:249 src/stored/status.c:70
+#: src/dird/ua_status.c:249 src/stored/status.c:71
 #, c-format
 msgid "Daemon started %s, 1 Job run since started.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:252 src/stored/status.c:73
+#: src/dird/ua_status.c:252 src/stored/status.c:74
 #, c-format
 msgid "Daemon started %s, %d Jobs run since started.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:257 src/filed/status.c:119 src/stored/status.c:77
+#: src/dird/ua_status.c:257 src/filed/status.c:121 src/stored/status.c:78
 #, c-format
 msgid " Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:277 src/dird/ua_status.c:482 src/dird/ua_status.c:644
-#: src/filed/status.c:196 src/filed/status.c:275 src/stored/status.c:317
-#: src/stored/status.c:393
+#: src/dird/ua_status.c:277 src/dird/ua_status.c:502 src/dird/ua_status.c:664
+#: src/filed/status.c:198 src/filed/status.c:277 src/stored/status.c:345
+#: src/stored/status.c:361 src/stored/status.c:438
 msgid "====\n"
 msgstr ""
 
@@ -4315,249 +4437,249 @@ msgstr ""
 msgid "===================================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:399
+#: src/dird/ua_status.c:401
 #, c-format
 msgid "%-14s %-8s %3d  %-18s %-18s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:480
+#: src/dird/ua_status.c:500
 msgid "No Scheduled Jobs.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:497 src/stored/status.c:269
+#: src/dird/ua_status.c:517 src/stored/status.c:277
 msgid ""
 "\n"
 "Running Jobs:\n"
 msgstr ""
 
-#: src/dird/ua_status.c:506
+#: src/dird/ua_status.c:525
 #, c-format
 msgid "Console connected at %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:514
+#: src/dird/ua_status.c:535
 msgid ""
 "No Jobs running.\n"
 "====\n"
 msgstr ""
 
-#: src/dird/ua_status.c:519
+#: src/dird/ua_status.c:540
 msgid " JobId Level   Name                       Status\n"
 msgstr ""
 
-#: src/dird/ua_status.c:520 src/filed/status.c:219 src/stored/status.c:337
+#: src/dird/ua_status.c:541 src/filed/status.c:221 src/stored/status.c:382
 msgid "======================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:529
+#: src/dird/ua_status.c:549
 msgid "is waiting execution"
 msgstr ""
 
-#: src/dird/ua_status.c:532
+#: src/dird/ua_status.c:552
 msgid "is running"
 msgstr ""
 
-#: src/dird/ua_status.c:535
+#: src/dird/ua_status.c:555
 msgid "is blocked"
 msgstr ""
 
-#: src/dird/ua_status.c:538
+#: src/dird/ua_status.c:558
 msgid "has terminated"
 msgstr ""
 
-#: src/dird/ua_status.c:541
+#: src/dird/ua_status.c:561
 msgid "has erred"
 msgstr ""
 
-#: src/dird/ua_status.c:544
+#: src/dird/ua_status.c:564
 msgid "has errors"
 msgstr ""
 
-#: src/dird/ua_status.c:547
+#: src/dird/ua_status.c:567
 msgid "has a fatal error"
 msgstr ""
 
-#: src/dird/ua_status.c:550
+#: src/dird/ua_status.c:570
 msgid "has verify differences"
 msgstr ""
 
-#: src/dird/ua_status.c:553
+#: src/dird/ua_status.c:573
 msgid "has been canceled"
 msgstr ""
 
-#: src/dird/ua_status.c:557
+#: src/dird/ua_status.c:577
 #, c-format
 msgid "is waiting on Client %s"
 msgstr ""
 
-#: src/dird/ua_status.c:563
+#: src/dird/ua_status.c:583
 #, c-format
 msgid "is waiting on Storage %s"
 msgstr ""
 
-#: src/dird/ua_status.c:568
+#: src/dird/ua_status.c:588
 msgid "is waiting on max Storage jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:571
+#: src/dird/ua_status.c:591
 msgid "is waiting on max Client jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:574
+#: src/dird/ua_status.c:594
 msgid "is waiting on max Job jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:577
+#: src/dird/ua_status.c:597
 msgid "is waiting on max total jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:580
+#: src/dird/ua_status.c:600
 msgid "is waiting for its start time"
 msgstr ""
 
-#: src/dird/ua_status.c:583
+#: src/dird/ua_status.c:603
 msgid "is waiting for higher priority jobs to finish"
 msgstr ""
 
-#: src/dird/ua_status.c:588
+#: src/dird/ua_status.c:608
 #, c-format
 msgid "is in unknown state %c"
 msgstr ""
 
-#: src/dird/ua_status.c:602
+#: src/dird/ua_status.c:622
 msgid "is waiting for a mount request"
 msgstr ""
 
-#: src/dird/ua_status.c:609
+#: src/dird/ua_status.c:629
 msgid "is waiting for an appendable Volume"
 msgstr ""
 
-#: src/dird/ua_status.c:616
+#: src/dird/ua_status.c:636
 #, c-format
 msgid "is waiting for Client %s to connect to Storage %s"
 msgstr ""
 
-#: src/dird/ua_status.c:632
+#: src/dird/ua_status.c:652
 #, c-format
 msgid "%6d %-6s  %-20s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:654 src/filed/status.c:209 src/stored/status.c:328
+#: src/dird/ua_status.c:674 src/filed/status.c:211 src/stored/status.c:373
 msgid "No Terminated Jobs.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:659 src/stored/status.c:333
+#: src/dird/ua_status.c:679 src/stored/status.c:378
 msgid ""
 "\n"
 "Terminated Jobs:\n"
 msgstr ""
 
-#: src/dird/ua_status.c:660
+#: src/dird/ua_status.c:680
 msgid " JobId  Level     Files      Bytes     Status   Finished        Name \n"
 msgstr ""
 
-#: src/dird/ua_status.c:661
+#: src/dird/ua_status.c:681
 msgid "========================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:692 src/filed/status.c:239 src/lib/util.c:184
-#: src/stored/status.c:357
+#: src/dird/ua_status.c:712 src/filed/status.c:241 src/lib/util.c:178
+#: src/stored/status.c:402
 msgid "Created"
 msgstr ""
 
-#: src/dird/ua_status.c:696 src/filed/status.c:243 src/lib/util.c:197
-#: src/lib/util.c:264 src/stored/status.c:361
+#: src/dird/ua_status.c:716 src/filed/status.c:245 src/lib/util.c:191
+#: src/lib/util.c:258 src/stored/status.c:406
 msgid "Error"
 msgstr ""
 
-#: src/dird/ua_status.c:699 src/filed/status.c:246 src/stored/status.c:364
+#: src/dird/ua_status.c:719 src/filed/status.c:248 src/stored/status.c:409
 msgid "Diffs"
 msgstr ""
 
-#: src/dird/ua_status.c:705 src/filed/status.c:252 src/lib/util.c:193
-#: src/lib/util.c:260 src/stored/btape.c:1160 src/stored/status.c:370
+#: src/dird/ua_status.c:725 src/filed/status.c:254 src/lib/util.c:187
+#: src/lib/util.c:254 src/stored/btape.c:1158 src/stored/status.c:415
 #: src/wx-console/wxbconfigpanel.cpp:180
 msgid "OK"
 msgstr ""
 
-#: src/dird/ua_status.c:708 src/filed/status.c:255 src/stored/status.c:373
+#: src/dird/ua_status.c:728 src/filed/status.c:257 src/stored/status.c:418
 msgid "Other"
 msgstr ""
 
-#: src/dird/ua_status.c:711 src/filed/status.c:266 src/stored/status.c:384
+#: src/dird/ua_status.c:731 src/filed/status.c:268 src/stored/status.c:429
 #, c-format
 msgid "%6d  %-6s %8s %14s %-7s  %-8s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:719 src/stored/btape.c:180
+#: src/dird/ua_status.c:739 src/stored/btape.c:180
 msgid "\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:57
+#: src/dird/ua_tree.c:58
 msgid "change current directory"
 msgstr ""
 
-#: src/dird/ua_tree.c:58
+#: src/dird/ua_tree.c:59
 msgid "count marked files in and below the cd"
 msgstr ""
 
-#: src/dird/ua_tree.c:59
+#: src/dird/ua_tree.c:60 src/dird/ua_tree.c:61
 msgid "long list current directory, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:60
+#: src/dird/ua_tree.c:62
 msgid "leave file selection mode"
 msgstr ""
 
-#: src/dird/ua_tree.c:61
+#: src/dird/ua_tree.c:63
 msgid "estimate restore size"
 msgstr ""
 
-#: src/dird/ua_tree.c:62
+#: src/dird/ua_tree.c:64
 msgid "same as done command"
 msgstr ""
 
-#: src/dird/ua_tree.c:63
+#: src/dird/ua_tree.c:65
 msgid "find files, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:64 src/dird/ua_tree.c:73
+#: src/dird/ua_tree.c:66 src/dird/ua_tree.c:75
 msgid "print help"
 msgstr ""
 
-#: src/dird/ua_tree.c:65
+#: src/dird/ua_tree.c:67
 msgid "list current directory, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:66
+#: src/dird/ua_tree.c:68
 msgid "list the marked files in and below the cd"
 msgstr ""
 
-#: src/dird/ua_tree.c:67
-msgid "mark dir/file to be restored recursively in dirs"
+#: src/dird/ua_tree.c:69
+msgid "mark dir/file to be restored recursively, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:68
+#: src/dird/ua_tree.c:70
 msgid "mark directory name to be restored (no files)"
 msgstr ""
 
-#: src/dird/ua_tree.c:69
+#: src/dird/ua_tree.c:71
 msgid "print current working directory"
 msgstr ""
 
-#: src/dird/ua_tree.c:70
+#: src/dird/ua_tree.c:72
 msgid "unmark dir/file to be restored recursively in dir"
 msgstr ""
 
-#: src/dird/ua_tree.c:71
+#: src/dird/ua_tree.c:73
 msgid "unmark directory name only no recursion"
 msgstr ""
 
-#: src/dird/ua_tree.c:72
+#: src/dird/ua_tree.c:74
 msgid "quit and do not do restore"
 msgstr ""
 
-#: src/dird/ua_tree.c:92
+#: src/dird/ua_tree.c:94
 msgid ""
 "\n"
 "You are now entering file selection mode where you add (mark) and\n"
@@ -4567,705 +4689,657 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:102 src/dird/ua_tree.c:633 src/dird/ua_tree.c:641
+#: src/dird/ua_tree.c:104 src/dird/ua_tree.c:671 src/dird/ua_tree.c:679
 #, c-format
 msgid "cwd is: %s\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:123
+#: src/dird/ua_tree.c:125
 msgid "Illegal command. Enter \"done\" to exit.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:296 src/dird/ua_tree.c:307 src/dird/ua_tree.c:324
+#: src/dird/ua_tree.c:298 src/dird/ua_tree.c:309 src/dird/ua_tree.c:326
 msgid "No files marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:309
+#: src/dird/ua_tree.c:311
 msgid "1 file marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:311
+#: src/dird/ua_tree.c:313
 #, c-format
 msgid "%s files marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:338
+#: src/dird/ua_tree.c:340
 msgid "No directories marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:340
+#: src/dird/ua_tree.c:342
 msgid "1 directory marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:342
+#: src/dird/ua_tree.c:344
 #, c-format
 msgid "%s directories marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:363
+#: src/dird/ua_tree.c:365
 #, c-format
 msgid "%s total files/dirs. %s marked to be restored.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:374
+#: src/dird/ua_tree.c:376
 msgid "No file specification given.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:502
+#: src/dird/ua_tree.c:527
 #, c-format
 msgid "Node %s has no children.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:583
+#: src/dird/ua_tree.c:618
 #, c-format
 msgid "%d total files; %d marked to be restored; %s bytes.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:625
+#: src/dird/ua_tree.c:663
 msgid "Invalid path given.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:652 src/dird/ua_tree.c:663
+#: src/dird/ua_tree.c:690 src/dird/ua_tree.c:701
 msgid "No files unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:665
+#: src/dird/ua_tree.c:703
 msgid "1 file unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:667
+#: src/dird/ua_tree.c:705
 #, c-format
 msgid "%d files unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:678 src/dird/ua_tree.c:694
+#: src/dird/ua_tree.c:716 src/dird/ua_tree.c:732
 msgid "No directories unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:696
+#: src/dird/ua_tree.c:734
 msgid "1 directory unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:698
+#: src/dird/ua_tree.c:736
 #, c-format
 msgid "%d directories unmarked.\n"
 msgstr ""
 
-#: src/dird/verify.c:87
-msgid ""
-"Unable to find JobId of previous InitCatalog Job.\n"
-"Please run a Verify with Level=InitCatalog before\n"
-"running the current Job.\n"
+#: src/dird/ua_update.c:79
+msgid "Update choice:\n"
 msgstr ""
 
-#: src/dird/verify.c:108
-#, c-format
-msgid "Could not get job record for previous Job. ERR=%s"
+#: src/dird/ua_update.c:80
+msgid "Volume parameters"
 msgstr ""
 
-#: src/dird/verify.c:113
-#, c-format
-msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
+#: src/dird/ua_update.c:81
+msgid "Pool from resource"
 msgstr ""
 
-#: src/dird/verify.c:117
-#, c-format
-msgid "Verifying against JobId=%d Job=%s\n"
+#: src/dird/ua_update.c:82
+msgid "Slots from autochanger"
 msgstr ""
 
-#: src/dird/verify.c:183
-#, c-format
-msgid "Start Verify JobId=%d Level=%s Job=%s\n"
+#: src/dird/ua_update.c:83
+msgid "item"
 msgstr ""
 
-#: src/dird/verify.c:262
-msgid "Deprecated feature ... use bootstrap.\n"
+#: src/dird/ua_update.c:83
+msgid "Choose catalog item to update"
 msgstr ""
 
-#: src/dird/verify.c:275
+#: src/dird/ua_update.c:122
 #, c-format
-msgid "Unimplemented Verify level %d(%c)\n"
+msgid "Invalid VolStatus specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:327
+#: src/dird/ua_update.c:131
 #, c-format
-msgid "Unimplemented verify level %d\n"
+msgid "New Volume status is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:382
-msgid "Verify OK"
+#: src/dird/ua_update.c:141
+#, c-format
+msgid "Invalid retention period specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:386
-msgid "*** Verify Error ***"
+#: src/dird/ua_update.c:149
+#, c-format
+msgid "New retention period is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:390
-msgid "Verify warnings"
+#: src/dird/ua_update.c:160
+#, c-format
+msgid "Invalid use duration specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:393
-msgid "Verify Canceled"
+#: src/dird/ua_update.c:168
+#, c-format
+msgid "New use duration is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:396
-msgid "Verify Differences"
+#: src/dird/ua_update.c:182
+#, c-format
+msgid "New max jobs is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:401
+#: src/dird/ua_update.c:195
 #, c-format
-msgid "Inappropriate term code: %d %c\n"
+msgid "New max files is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:415
+#: src/dird/ua_update.c:206
 #, c-format
-msgid ""
-"Bacula %s (%s): %s\n"
-"  JobId:                  %d\n"
-"  Job:                    %s\n"
-"  FileSet:                %s\n"
-"  Verify Level:           %s\n"
-"  Client:                 %s\n"
-"  Verify JobId:           %d\n"
-"  Verify Job:             %s\n"
-"  Start time:             %s\n"
-"  End time:               %s\n"
-"  Files Expected:         %s\n"
-"  Files Examined:         %s\n"
-"  Non-fatal FD errors:    %d\n"
-"  FD termination status:  %s\n"
-"  SD termination status:  %s\n"
-"  Termination:            %s\n"
-"\n"
+msgid "Invalid max. bytes specification: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:450
+#: src/dird/ua_update.c:214
 #, c-format
-msgid ""
-"Bacula %s (%s): %s\n"
-"  JobId:                  %d\n"
-"  Job:                    %s\n"
-"  FileSet:                %s\n"
-"  Verify Level:           %s\n"
-"  Client:                 %s\n"
-"  Verify JobId:           %d\n"
-"  Verify Job:             %s\n"
-"  Start time:             %s\n"
-"  End time:               %s\n"
-"  Files Examined:         %s\n"
-"  Non-fatal FD errors:    %d\n"
-"  FD termination status:  %s\n"
-"  Termination:            %s\n"
-"\n"
+msgid "New Max bytes is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:526
-#, c-format
-msgid ""
-"bird<filed: bad attributes, expected 3 fields got %d\n"
-" mslen=%d msg=%s\n"
+#: src/dird/ua_update.c:228 src/dird/ua_update.c:252
+msgid "Invalid value. It must be yes or no.\n"
 msgstr ""
 
-#: src/dird/verify.c:570
+#: src/dird/ua_update.c:236
 #, c-format
-msgid "New file: %s\n"
+msgid "New Recycle flag is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:571
+#: src/dird/ua_update.c:260
 #, c-format
-msgid "File not in catalog: %s\n"
+msgid "New InChanger flag is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:595
+#: src/dird/ua_update.c:278
 #, c-format
-msgid "      st_ino   differ. Cat: %s File: %s\n"
+msgid "Invalid slot, it must be between 0 and MaxVols=%d\n"
 msgstr ""
 
-#: src/dird/verify.c:604
+#: src/dird/ua_update.c:287 src/dird/ua_update.c:578
 #, c-format
-msgid "      st_mode  differ. Cat: %x File: %x\n"
+msgid "Error updating media record Slot: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:612
+#: src/dird/ua_update.c:289
 #, c-format
-msgid "      st_nlink differ. Cat: %d File: %d\n"
+msgid "New Slot is: %d\n"
 msgstr ""
 
-#: src/dird/verify.c:620
+#: src/dird/ua_update.c:316
 #, c-format
-msgid "      st_uid   differ. Cat: %u File: %u\n"
+msgid "New Pool is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:628
+#: src/dird/ua_update.c:345
 #, c-format
-msgid "      st_gid   differ. Cat: %u File: %u\n"
+msgid "Error updating Volume record: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:636
+#: src/dird/ua_update.c:347
 #, c-format
-msgid "      st_size  differ. Cat: %s File: %s\n"
+msgid "Volume defaults updated from \"%s\" Pool record.\n"
 msgstr ""
 
-#: src/dird/verify.c:645
-msgid "      st_atime differs\n"
+#: src/dird/ua_update.c:369
+#, c-format
+msgid "Error updating Volume records: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:652
-msgid "      st_mtime differs\n"
+#: src/dird/ua_update.c:371
+msgid "All Volume defaults updated from Pool record.\n"
 msgstr ""
 
-#: src/dird/verify.c:659
-msgid "      st_ctime differs\n"
+#: src/dird/ua_update.c:391
+msgid "VolStatus"
 msgstr ""
 
-#: src/dird/verify.c:666
-#, c-format
-msgid "      st_size  decrease. Cat: %s File: %s\n"
+#: src/dird/ua_update.c:392
+msgid "VolRetention"
 msgstr ""
 
-#: src/dird/verify.c:705
-#, c-format
-msgid "      %s not same. File=%s Cat=%s\n"
+#: src/dird/ua_update.c:393
+msgid "VolUse"
 msgstr ""
 
-#: src/dird/verify.c:708
-#, c-format
-msgid "      %s differs.\n"
+#: src/dird/ua_update.c:394
+msgid "MaxVolJobs"
 msgstr ""
 
-#: src/dird/verify.c:720
-#, c-format
-msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
+#: src/dird/ua_update.c:395
+msgid "MaxVolFiles"
 msgstr ""
 
-#: src/dird/verify.c:757
-msgid "The following files are missing:\n"
+#: src/dird/ua_update.c:396
+msgid "MaxVolBytes"
 msgstr ""
 
-#: src/dird/verify.c:771 src/tools/testfind.c:338
-#, c-format
-msgid "File: %s\n"
+#: src/dird/ua_update.c:397
+msgid "Recycle"
 msgstr ""
 
-#: src/dird/ua_update.c:79
-msgid "Update choice:\n"
+#: src/dird/ua_update.c:398
+msgid "InChanger"
 msgstr ""
 
-#: src/dird/ua_update.c:80
-msgid "Volume parameters"
+#: src/dird/ua_update.c:399 src/dird/ua_update.c:471
+msgid "Slot"
 msgstr ""
 
-#: src/dird/ua_update.c:81
-msgid "Pool from resource"
+#: src/dird/ua_update.c:401
+msgid "FromPool"
 msgstr ""
 
-#: src/dird/ua_update.c:82
-msgid "Slots from autochanger"
+#: src/dird/ua_update.c:402
+msgid "AllFromPool"
 msgstr ""
 
-#: src/dird/ua_update.c:83
-msgid "item"
+#: src/dird/ua_update.c:464
+msgid "Volume Status"
 msgstr ""
 
-#: src/dird/ua_update.c:83
-msgid "Choose catalog item to update"
+#: src/dird/ua_update.c:465
+msgid "Volume Retention Period"
 msgstr ""
 
-#: src/dird/ua_update.c:103 src/dird/ua_update.c:435
-msgid "Append"
+#: src/dird/ua_update.c:466
+msgid "Volume Use Duration"
 msgstr ""
 
-#: src/dird/ua_update.c:104 src/dird/ua_update.c:436
-msgid "Archive"
+#: src/dird/ua_update.c:467
+msgid "Maximum Volume Jobs"
 msgstr ""
 
-#: src/dird/ua_update.c:105 src/dird/ua_update.c:437
-msgid "Disabled"
+#: src/dird/ua_update.c:468
+msgid "Maximum Volume Files"
 msgstr ""
 
-#: src/dird/ua_update.c:107 src/dird/ua_update.c:439
-msgid "Used"
+#: src/dird/ua_update.c:469
+msgid "Maximum Volume Bytes"
 msgstr ""
 
-#: src/dird/ua_update.c:108 src/dird/ua_update.c:440
-msgid "Cleaning"
+#: src/dird/ua_update.c:470
+msgid "Recycle Flag"
 msgstr ""
 
-#: src/dird/ua_update.c:109 src/dird/ua_update.c:355 src/dird/ua_update.c:442
-msgid "Recycle"
+#: src/dird/ua_update.c:472
+msgid "InChanger Flag"
 msgstr ""
 
-#: src/dird/ua_update.c:110 src/dird/ua_update.c:444
-msgid "Read-Only"
+#: src/dird/ua_update.c:473
+msgid "Volume Files"
 msgstr ""
 
-#: src/dird/ua_update.c:122
-#, c-format
-msgid "Invalid VolStatus specified: %s\n"
+#: src/dird/ua_update.c:475
+msgid "Volume from Pool"
 msgstr ""
 
-#: src/dird/ua_update.c:131
-#, c-format
-msgid "New Volume status is: %s\n"
+#: src/dird/ua_update.c:476
+msgid "All Volumes from Pool"
 msgstr ""
 
-#: src/dird/ua_update.c:142
-#, c-format
-msgid "Invalid retention period specified: %s\n"
+#: src/dird/ua_update.c:477
+msgid "Done"
 msgstr ""
 
-#: src/dird/ua_update.c:151
+#: src/dird/ua_update.c:485
 #, c-format
-msgid "New retention period is: %s\n"
+msgid "Updating Volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:163
+#: src/dird/ua_update.c:490
 #, c-format
-msgid "Invalid use duration specified: %s\n"
+msgid "Current Volume status is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:172
-#, c-format
-msgid "New use duration is: %s\n"
+#: src/dird/ua_update.c:491
+msgid "Possible Values are:\n"
 msgstr ""
 
-#: src/dird/ua_update.c:187
-#, c-format
-msgid "New max jobs is: %s\n"
+#: src/dird/ua_update.c:502
+msgid "Choose new Volume Status"
 msgstr ""
 
-#: src/dird/ua_update.c:201
+#: src/dird/ua_update.c:508
 #, c-format
-msgid "New max files is: %s\n"
+msgid "Current retention period is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:213
-#, c-format
-msgid "Invalid max. bytes specification: %s\n"
+#: src/dird/ua_update.c:510
+msgid "Enter Volume Retention period: "
 msgstr ""
 
-#: src/dird/ua_update.c:222
+#: src/dird/ua_update.c:517
 #, c-format
-msgid "New Max bytes is: %s\n"
+msgid "Current use duration is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:237
-msgid "Invalid value. It must by yes or no.\n"
+#: src/dird/ua_update.c:519
+msgid "Enter Volume Use Duration: "
 msgstr ""
 
-#: src/dird/ua_update.c:246
+#: src/dird/ua_update.c:526
 #, c-format
-msgid "New Recycle flag is: %s\n"
+msgid "Current max jobs is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:275
-#, c-format
-msgid "New Pool is: %s\n"
+#: src/dird/ua_update.c:527
+msgid "Enter new Maximum Jobs: "
 msgstr ""
 
-#: src/dird/ua_update.c:304
+#: src/dird/ua_update.c:534
 #, c-format
-msgid "Error updating Volume record: ERR=%s"
+msgid "Current max files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:306
-#, c-format
-msgid "Volume defaults updated from \"%s\" Pool record.\n"
+#: src/dird/ua_update.c:535
+msgid "Enter new Maximum Files: "
 msgstr ""
 
-#: src/dird/ua_update.c:328
+#: src/dird/ua_update.c:542
 #, c-format
-msgid "Error updating Volume records: ERR=%s"
-msgstr ""
-
-#: src/dird/ua_update.c:330
-msgid "All Volume defaults updated from Pool record.\n"
-msgstr ""
-
-#: src/dird/ua_update.c:349
-msgid "VolStatus"
-msgstr ""
-
-#: src/dird/ua_update.c:350
-msgid "VolRetention"
-msgstr ""
-
-#: src/dird/ua_update.c:351
-msgid "VolUse"
-msgstr ""
-
-#: src/dird/ua_update.c:352
-msgid "MaxVolJobs"
-msgstr ""
-
-#: src/dird/ua_update.c:353
-msgid "MaxVolFiles"
+msgid "Current value is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:354
-msgid "MaxVolBytes"
+#: src/dird/ua_update.c:543
+msgid "Enter new Maximum Bytes: "
 msgstr ""
 
-#: src/dird/ua_update.c:357
-msgid "FromPool"
+#: src/dird/ua_update.c:551
+#, c-format
+msgid "Current recycle flag is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:358
-msgid "AllFromPool"
+#: src/dird/ua_update.c:553
+msgid "Enter new Recycle status: "
 msgstr ""
 
-#: src/dird/ua_update.c:414
+#: src/dird/ua_update.c:560
 #, c-format
-msgid "Updating Volume \"%s\"\n"
+msgid "Current Slot is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:416
-msgid "Volume Status"
+#: src/dird/ua_update.c:561
+msgid "Enter new Slot: "
 msgstr ""
 
-#: src/dird/ua_update.c:417
-msgid "Volume Retention Period"
+#: src/dird/ua_update.c:568
+#, c-format
+msgid "Current InChanger flag is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:418
-msgid "Volume Use Duration"
+#: src/dird/ua_update.c:569
+msgid "Set InChanger flag? yes/no: "
 msgstr ""
 
-#: src/dird/ua_update.c:419
-msgid "Maximum Volume Jobs"
+#: src/dird/ua_update.c:580
+#, c-format
+msgid "New InChanger flag is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:420
-msgid "Maximum Volume Files"
+#: src/dird/ua_update.c:587
+msgid ""
+"Warning changing Volume Files can result\n"
+"in loss of data on your Volume\n"
+"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:421
-msgid "Maximum Volume Bytes"
+#: src/dird/ua_update.c:589
+#, c-format
+msgid "Current Volume Files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:422
-msgid "Recycle Flag"
+#: src/dird/ua_update.c:590
+msgid "Enter new number of Files for Volume: "
 msgstr ""
 
-#: src/dird/ua_update.c:423
-msgid "Slot"
+#: src/dird/ua_update.c:595
+msgid "Normally, you should only increase Volume Files by one!\n"
 msgstr ""
 
-#: src/dird/ua_update.c:424
-msgid "InChanger Flag"
+#: src/dird/ua_update.c:596
+msgid "Continue? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_update.c:425
-msgid "Volume Files"
+#: src/dird/ua_update.c:606
+#, c-format
+msgid "New Volume Files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:427
-msgid "Volume from Pool"
+#: src/dird/ua_update.c:618
+#, c-format
+msgid "Current Pool is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:428
-msgid "All Volumes from Pool"
+#: src/dird/ua_update.c:619
+msgid "Enter new Pool name: "
 msgstr ""
 
-#: src/dird/ua_update.c:429
-msgid "Done"
+#: src/dird/ua_update.c:632
+msgid "Selection terminated.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:433
+#: src/dird/ua_update.c:665
 #, c-format
-msgid "Current Volume status is: %s\n"
+msgid "db_update_pool_record returned %d. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:434
-msgid "Possible Values are:\n"
+#: src/dird/ua_update.c:672
+msgid "Pool DB record updated from resource.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:441
-msgid "Purged"
+#: src/dird/verify.c:87
+msgid ""
+"Unable to find JobId of previous InitCatalog Job.\n"
+"Please run a Verify with Level=InitCatalog before\n"
+"running the current Job.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:445
-msgid "Choose new Volume Status"
+#: src/dird/verify.c:117
+#, c-format
+msgid "Verifying against JobId=%d Job=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:451
+#: src/dird/verify.c:180
 #, c-format
-msgid "Current retention period is: %s\n"
+msgid "Start Verify JobId=%s Level=%s Job=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:453
-msgid "Enter Volume Retention period: "
+#: src/dird/verify.c:263
+msgid "Deprecated feature ... use bootstrap.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:460
+#: src/dird/verify.c:276
 #, c-format
-msgid "Current use duration is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:462
-msgid "Enter Volume Use Duration: "
+msgid "Unimplemented Verify level %d(%c)\n"
 msgstr ""
 
-#: src/dird/ua_update.c:469
+#: src/dird/verify.c:328
 #, c-format
-msgid "Current max jobs is: %u\n"
+msgid "Unimplemented verify level %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:470
-msgid "Enter new Maximum Jobs: "
+#: src/dird/verify.c:383
+msgid "Verify OK"
 msgstr ""
 
-#: src/dird/ua_update.c:477
-#, c-format
-msgid "Current max files is: %u\n"
+#: src/dird/verify.c:387
+msgid "*** Verify Error ***"
 msgstr ""
 
-#: src/dird/ua_update.c:478
-msgid "Enter new Maximum Files: "
+#: src/dird/verify.c:391
+msgid "Verify warnings"
 msgstr ""
 
-#: src/dird/ua_update.c:485
-#, c-format
-msgid "Current value is: %s\n"
+#: src/dird/verify.c:394
+msgid "Verify Canceled"
 msgstr ""
 
-#: src/dird/ua_update.c:486
-msgid "Enter new Maximum Bytes: "
+#: src/dird/verify.c:397
+msgid "Verify Differences"
 msgstr ""
 
-#: src/dird/ua_update.c:494
+#: src/dird/verify.c:402
 #, c-format
-msgid "Current recycle flag is: %s\n"
+msgid "Inappropriate term code: %d %c\n"
 msgstr ""
 
-#: src/dird/ua_update.c:496
-msgid "Enter new Recycle status: "
+#: src/dird/verify.c:416
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Expected:         %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:511
+#: src/dird/verify.c:451
 #, c-format
-msgid "Current Slot is: %d\n"
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:512
-msgid "Enter new Slot: "
+#: src/dird/verify.c:527
+#, c-format
+msgid ""
+"bird<filed: bad attributes, expected 3 fields got %d\n"
+" mslen=%d msg=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:517
+#: src/dird/verify.c:571
 #, c-format
-msgid "Invalid slot, it must be between 0 and %d\n"
+msgid "New file: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:527 src/dird/ua_update.c:544
+#: src/dird/verify.c:572
 #, c-format
-msgid "Error updating media record Slot: ERR=%s"
+msgid "File not in catalog: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:529
+#: src/dird/verify.c:596
 #, c-format
-msgid "New Slot is: %d\n"
+msgid "      st_ino   differ. Cat: %s File: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:534
+#: src/dird/verify.c:605
 #, c-format
-msgid "Current InChanger flag is: %d\n"
+msgid "      st_mode  differ. Cat: %x File: %x\n"
 msgstr ""
 
-#: src/dird/ua_update.c:535
-msgid "Set InChanger flag? yes/no: "
+#: src/dird/verify.c:613
+#, c-format
+msgid "      st_nlink differ. Cat: %d File: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:546
+#: src/dird/verify.c:621
 #, c-format
-msgid "New InChanger flag is: %d\n"
+msgid "      st_uid   differ. Cat: %u File: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:553
-msgid ""
-"Warning changing Volume Files can result\n"
-"in loss of data on your Volume\n"
-"\n"
+#: src/dird/verify.c:629
+#, c-format
+msgid "      st_gid   differ. Cat: %u File: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:555
+#: src/dird/verify.c:637
 #, c-format
-msgid "Current Volume Files is: %u\n"
+msgid "      st_size  differ. Cat: %s File: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:556
-msgid "Enter new number of Files for Volume: "
+#: src/dird/verify.c:646
+msgid "      st_atime differs\n"
 msgstr ""
 
-#: src/dird/ua_update.c:561
-msgid "Normally, you should only increase Volume Files by one!\n"
+#: src/dird/verify.c:653
+msgid "      st_mtime differs\n"
 msgstr ""
 
-#: src/dird/ua_update.c:562
-msgid "Continue? (yes/no): "
+#: src/dird/verify.c:660
+msgid "      st_ctime differs\n"
 msgstr ""
 
-#: src/dird/ua_update.c:572
+#: src/dird/verify.c:667
 #, c-format
-msgid "New Volume Files is: %u\n"
+msgid "      st_size  decrease. Cat: %s File: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:584
+#: src/dird/verify.c:706
 #, c-format
-msgid "Current Pool is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:585
-msgid "Enter new Pool name: "
-msgstr ""
-
-#: src/dird/ua_update.c:598
-msgid "Selection done.\n"
+msgid "      %s not same. File=%s Cat=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:631
+#: src/dird/verify.c:709
 #, c-format
-msgid "db_update_pool_record returned %d. ERR=%s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:638
-msgid "Pool DB record updated from resource.\n"
+msgid "      %s differs.\n"
 msgstr ""
 
-#: src/dird/pythondir.c:105 src/filed/pythonfd.c:102 src/filed/pythonfd.c:156
-#: src/filed/pythonfd.c:220 src/stored/pythonsd.c:95 src/stored/pythonsd.c:160
-msgid "Job pointer not found."
+#: src/dird/verify.c:721
+#, c-format
+msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
 msgstr ""
 
-#: src/dird/pythondir.c:137
-msgid "Pool record not found."
+#: src/dird/verify.c:758
+msgid "The following files are missing:\n"
 msgstr ""
 
-#: src/dird/pythondir.c:166 src/filed/pythonfd.c:133 src/stored/pythonsd.c:137
+#: src/dird/verify.c:772 src/tools/testfind.c:338
 #, c-format
-msgid "Attribute %s not found."
-msgstr ""
-
-#: src/dird/pythondir.c:209 src/dird/pythondir.c:215 src/filed/pythonfd.c:175
-#: src/stored/pythonsd.c:177
-msgid "Read-only attribute"
+msgid "File: %s\n"
 msgstr ""
 
-#: src/filed/authenticate.c:50
+#: src/filed/authenticate.c:45
 #, c-format
 msgid "I only authenticate directors, not %d\n"
 msgstr ""
 
-#: src/filed/authenticate.c:56 src/stored/authenticate.c:59
+#: src/filed/authenticate.c:51 src/stored/authenticate.c:59
 #, c-format
 msgid "Bad Hello command from Director at %s. Len=%d.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:68 src/stored/authenticate.c:70
+#: src/filed/authenticate.c:63 src/stored/authenticate.c:70
 #, c-format
 msgid "Bad Hello command from Director at %s: %s\n"
 msgstr ""
 
-#: src/filed/authenticate.c:82 src/stored/authenticate.c:85
+#: src/filed/authenticate.c:77 src/stored/authenticate.c:85
 #, c-format
 msgid ""
 "Connection from unknown Director %s at %s rejected.\n"
@@ -5273,7 +5347,7 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:115
+#: src/filed/authenticate.c:110
 #, c-format
 msgid ""
 "Incorrect password given by Director at %s.\n"
@@ -5281,11 +5355,11 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:169 src/stored/dircmd.c:184
+#: src/filed/authenticate.c:164 src/stored/dircmd.c:184
 msgid "Unable to authenticate Director\n"
 msgstr ""
 
-#: src/filed/authenticate.c:213
+#: src/filed/authenticate.c:208
 msgid ""
 "Authorization key rejected by Storage daemon.\n"
 "Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
@@ -5346,48 +5420,48 @@ msgstr ""
 msgid "     Unknown file type %d; not saved: %s\n"
 msgstr ""
 
-#: src/filed/backup.c:243
+#: src/filed/backup.c:240
 #, c-format
 msgid "Python reader program \"%s\" not found.\n"
 msgstr ""
 
-#: src/filed/backup.c:268 src/filed/verify.c:214
+#: src/filed/backup.c:269 src/filed/verify.c:214
 #, c-format
 msgid "     Cannot open %s: ERR=%s.\n"
 msgstr ""
 
-#: src/filed/backup.c:297 src/filed/verify.c:229
+#: src/filed/backup.c:298 src/filed/verify.c:229
 #, c-format
 msgid "     Cannot open resource fork for %s: ERR=%s.\n"
 msgstr ""
 
-#: src/filed/backup.c:348
+#: src/filed/backup.c:349
 #, c-format
 msgid "Unknown signature type %i.\n"
 msgstr ""
 
-#: src/filed/backup.c:410 src/filed/backup.c:493 src/filed/backup.c:519
-#: src/filed/backup.c:548 src/filed/backup.c:561 src/filed/backup.c:569
-#: src/filed/backup.c:610 src/filed/backup.c:644
+#: src/filed/backup.c:414 src/filed/backup.c:499 src/filed/backup.c:525
+#: src/filed/backup.c:557 src/filed/backup.c:570 src/filed/backup.c:578
+#: src/filed/backup.c:619 src/filed/backup.c:653
 #, c-format
 msgid "Network send error to SD. ERR=%s\n"
 msgstr ""
 
-#: src/filed/backup.c:473
+#: src/filed/backup.c:479
 #, c-format
 msgid "Compression error: %d\n"
 msgstr ""
 
-#: src/filed/backup.c:510
+#: src/filed/backup.c:516
 #, c-format
 msgid "Read error on file %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/backup.c:513
+#: src/filed/backup.c:519
 msgid "Too many errors.\n"
 msgstr ""
 
-#: src/filed/backup.c:539
+#: src/filed/backup.c:548
 #, c-format
 msgid "Error reading ACL of %s\n"
 msgstr ""
@@ -5437,224 +5511,239 @@ msgstr ""
 msgid "No Director resource defined in %s\n"
 msgstr ""
 
-#: src/filed/job.c:323
+#: src/filed/job.c:324
 #, c-format
 msgid "2901 Job %s not found.\n"
 msgstr ""
 
-#: src/filed/job.c:339
+#: src/filed/job.c:333
 #, c-format
 msgid "2001 Job %s marked to be canceled.\n"
 msgstr ""
 
-#: src/filed/job.c:342
+#: src/filed/job.c:336
 msgid "2902 Error scanning cancel command.\n"
 msgstr ""
 
-#: src/filed/job.c:361
+#: src/filed/job.c:355
 #, c-format
 msgid "2991 Bad setdebug command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:377
+#: src/filed/job.c:371
 #, c-format
 msgid "Bad estimate command: %s"
 msgstr ""
 
-#: src/filed/job.c:378
+#: src/filed/job.c:372
 msgid "2992 Bad estimate command.\n"
 msgstr ""
 
-#: src/filed/job.c:401
+#: src/filed/job.c:395
 #, c-format
 msgid "Bad Job Command: %s"
 msgstr ""
 
-#: src/filed/job.c:421
+#: src/filed/job.c:415
 #, c-format
 msgid "Bad RunBeforeJob command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:422 src/filed/job.c:435
+#: src/filed/job.c:416 src/filed/job.c:429
 msgid "2905 Bad RunBeforeJob command.\n"
 msgstr ""
 
-#: src/filed/job.c:448
+#: src/filed/job.c:442
 #, c-format
 msgid "Bad RunAfter command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:449
+#: src/filed/job.c:443
 msgid "2905 Bad RunAfterJob command.\n"
 msgstr ""
 
-#: src/filed/job.c:475
+#: src/filed/job.c:469
 #, c-format
 msgid "%s could not execute. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:484
+#: src/filed/job.c:478
 #, c-format
 msgid "%s: %s\n"
 msgstr ""
 
-#: src/filed/job.c:489
+#: src/filed/job.c:483
 #, c-format
 msgid "%s returned non-zero status=%d. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:574
+#: src/filed/job.c:568
 #, c-format
 msgid "Error running program: %s. RtnStat=%d ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:584
+#: src/filed/job.c:578
 #, c-format
 msgid "Cannot open FileSet input file: %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:678
+#: src/filed/job.c:672
 #, c-format
 msgid "REGEX %s compile error. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:732
+#: src/filed/job.c:726
 #, c-format
 msgid "Invalid FileSet command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:901 src/findlib/match.c:184
+#: src/filed/job.c:895 src/findlib/match.c:184
 #, c-format
 msgid "Unknown include/exclude option: %c\n"
 msgstr ""
 
-#: src/filed/job.c:961 src/stored/fd_cmds.c:329
+#: src/filed/job.c:955 src/stored/fd_cmds.c:329
 #, c-format
 msgid "Could not create bootstrap file %s: ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1060
+#: src/filed/job.c:1057
 #, c-format
 msgid "DIR and FD clocks differ by %d seconds, FD automatically adjusting.\n"
 msgstr ""
 
-#: src/filed/job.c:1068
+#: src/filed/job.c:1065
 #, c-format
 msgid "Unknown backup level: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1080
+#: src/filed/job.c:1077
 #, c-format
 msgid "Bad level command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1101
+#: src/filed/job.c:1098
 #, c-format
 msgid "Bad session command: %s"
 msgstr ""
 
-#: src/filed/job.c:1122
+#: src/filed/job.c:1119
 #, c-format
 msgid "Bad storage command: %s"
 msgstr ""
 
-#: src/filed/job.c:1131
+#: src/filed/job.c:1128
 #, c-format
 msgid "Failed to connect to Storage daemon: %s:%d\n"
 msgstr ""
 
-#: src/filed/job.c:1143
+#: src/filed/job.c:1140
 msgid "Failed to authenticate Storage daemon.\n"
 msgstr ""
 
-#: src/filed/job.c:1169
+#: src/filed/job.c:1178
 msgid "Cannot contact Storage daemon\n"
 msgstr ""
 
-#: src/filed/job.c:1187
+#: src/filed/job.c:1196
 #, c-format
 msgid "Bad response to append open: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1192
+#: src/filed/job.c:1201
 msgid "Bad response from stored to open command\n"
 msgstr ""
 
-#: src/filed/job.c:1219
+#: src/filed/job.c:1228
 #, c-format
 msgid "Generate VSS snapshots. Driver=\"%s\", Drive(s)=\"%s\"\n"
 msgstr ""
 
-#: src/filed/job.c:1222
-#, c-format
-msgid "Generate VSS snapshots failed. ERR=%s\n"
+#: src/filed/job.c:1230
+msgid "Generate VSS snapshots failed.\n"
 msgstr ""
 
-#: src/filed/job.c:1229
+#: src/filed/job.c:1237
 #, c-format
 msgid "Generate VSS snapshot of drive \"%c:\\\" failed\n"
 msgstr ""
 
-#: src/filed/job.c:1238
+#: src/filed/job.c:1244
 #, c-format
-msgid "VSS Writer: %s\n"
+msgid "VSS Writer (PrepareForBackup): %s\n"
 msgstr ""
 
-#: src/filed/job.c:1242
+#: src/filed/job.c:1249
 msgid "No drive letters found for generating VSS snapshots.\n"
 msgstr ""
 
-#: src/filed/job.c:1245
-msgid "VSS was not initialized properly. VSS support is disabled.\n"
+#: src/filed/job.c:1253
+#, c-format
+msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1294
+#: src/filed/job.c:1302
 msgid "Append Close with SD failed.\n"
 msgstr ""
 
-#: src/filed/job.c:1298
+#: src/filed/job.c:1306
 #, c-format
 msgid "Bad status %d returned from Storage Daemon.\n"
 msgstr ""
 
-#: src/filed/job.c:1331
+#: src/filed/job.c:1324
+#, c-format
+msgid "VSS Writer (BackupComplete): %s\n"
+msgstr ""
+
+#: src/filed/job.c:1351
 #, c-format
 msgid "2994 Bad verify command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1346 src/filed/job.c:1385
+#: src/filed/job.c:1366 src/filed/job.c:1405
 #, c-format
 msgid "2994 Bad verify level: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1425
+#: src/filed/job.c:1445
 #, c-format
 msgid "Bad replace command. CMD=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1502
+#: src/filed/job.c:1522
 msgid "Improper calling sequence.\n"
 msgstr ""
 
-#: src/filed/job.c:1522
+#: src/filed/job.c:1542
 #, c-format
 msgid "Bad response to SD read open: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1527
+#: src/filed/job.c:1547
 msgid "Bad response from stored to read open command\n"
 msgstr ""
 
-#: src/filed/job.c:1593
+#: src/filed/job.c:1613
 #, c-format
 msgid "Comm error with SD. bad response to %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1596
+#: src/filed/job.c:1616
 #, c-format
 msgid "Bad response to %s command. Wanted %s, got %s\n"
 msgstr ""
 
+#: src/filed/pythonfd.c:144 src/stored/pythonsd.c:149
+#, c-format
+msgid "Cannot delete attribute %s"
+msgstr ""
+
+#: src/filed/pythonfd.c:162 src/filed/pythonfd.c:178 src/stored/pythonsd.c:182
+#, c-format
+msgid "Cannot find attribute %s"
+msgstr ""
+
 #: src/filed/restore.c:55
 #, c-format
 msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n"
@@ -5684,7 +5773,7 @@ msgid "Logic error: output file should not be open\n"
 msgstr ""
 
 #: src/filed/restore.c:218 src/filed/verify_vol.c:142
-#: src/stored/bextract.c:289 src/stored/bls.c:372 src/stored/bscan.c:649
+#: src/stored/bextract.c:289 src/stored/bls.c:371 src/stored/bscan.c:651
 #, c-format
 msgid "Record header file index %ld not equal record index %ld\n"
 msgstr ""
@@ -5719,7 +5808,7 @@ msgstr ""
 msgid "Can't restore default ACL of %s\n"
 msgstr ""
 
-#: src/filed/restore.c:391 src/stored/bextract.c:449
+#: src/filed/restore.c:391 src/stored/bextract.c:455
 #, c-format
 msgid "Unknown stream=%d ignored. This shouldn't happen!\n"
 msgstr ""
@@ -5808,64 +5897,64 @@ msgstr ""
 msgid "Daemon started %s, %d Job%s run since started.\n"
 msgstr ""
 
-#: src/filed/status.c:125
+#: src/filed/status.c:127
 #, c-format
 msgid " Sizeof: off_t=%d size_t=%d debug=%d trace=%d\n"
 msgstr ""
 
-#: src/filed/status.c:136
+#: src/filed/status.c:138
 msgid "Running Jobs:\n"
 msgstr ""
 
-#: src/filed/status.c:147
+#: src/filed/status.c:149
 #, c-format
 msgid "Director connected at: %s\n"
 msgstr ""
 
-#: src/filed/status.c:149
+#: src/filed/status.c:151
 #, c-format
 msgid "JobId %d Job %s is running.\n"
 msgstr ""
 
-#: src/filed/status.c:152
+#: src/filed/status.c:154
 #, c-format
 msgid "    %s%s Job started: %s\n"
 msgstr ""
 
-#: src/filed/status.c:165 src/stored/status.c:296
+#: src/filed/status.c:166 src/stored/status.c:323
 #, c-format
 msgid "    Files=%s Bytes=%s Bytes/sec=%s\n"
 msgstr ""
 
-#: src/filed/status.c:170
+#: src/filed/status.c:171
 #, c-format
 msgid "    Files Examined=%s\n"
 msgstr ""
 
-#: src/filed/status.c:175
+#: src/filed/status.c:176
 #, c-format
 msgid "    Processing file: %s\n"
 msgstr ""
 
-#: src/filed/status.c:186
+#: src/filed/status.c:187
 msgid "    SDSocket closed.\n"
 msgstr ""
 
-#: src/filed/status.c:215
+#: src/filed/status.c:217
 msgid "Terminated Jobs:\n"
 msgstr ""
 
-#: src/filed/status.c:217
+#: src/filed/status.c:219
 msgid " JobId  Level     Files         Bytes  Status   Finished        Name \n"
 msgstr ""
 
-#: src/filed/status.c:321 src/filed/status.c:347 src/stored/status.c:468
-#: src/stored/status.c:493
+#: src/filed/status.c:323 src/filed/status.c:347 src/stored/status.c:513
+#: src/stored/status.c:536
 #, c-format
 msgid "Bad .status command: %s\n"
 msgstr ""
 
-#: src/filed/status.c:322
+#: src/filed/status.c:324
 msgid "2900 Bad .status command, missing argument.\n"
 msgstr ""
 
@@ -5873,23 +5962,23 @@ msgstr ""
 msgid "2900 Bad .status command, wrong argument.\n"
 msgstr ""
 
-#: src/filed/status.c:385 src/stored/status.c:423
+#: src/filed/status.c:385 src/stored/status.c:468
 msgid "Init Catalog"
 msgstr ""
 
-#: src/filed/status.c:388 src/stored/status.c:426
+#: src/filed/status.c:388 src/stored/status.c:471
 msgid "Volume to Catalog"
 msgstr ""
 
-#: src/filed/status.c:391 src/stored/status.c:429
+#: src/filed/status.c:391 src/stored/status.c:474
 msgid "Disk to Catalog"
 msgstr ""
 
-#: src/filed/status.c:394 src/stored/status.c:432
+#: src/filed/status.c:394 src/stored/status.c:477
 msgid "Data"
 msgstr ""
 
-#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:438
+#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:483
 msgid "Unknown Job Level"
 msgstr ""
 
@@ -5957,47 +6046,37 @@ msgstr ""
 msgid "Error scanning record header: %s\n"
 msgstr ""
 
-#: src/filed/pythonfd.c:150 src/stored/pythonsd.c:154
-#, c-format
-msgid "Cannot delete attribute %s"
-msgstr ""
-
-#: src/filed/pythonfd.c:168 src/filed/pythonfd.c:184 src/stored/pythonsd.c:187
-#, c-format
-msgid "Cannot find attribute %s"
-msgstr ""
-
-#: src/findlib/attribs.c:340
+#: src/findlib/attribs.c:335
 #, c-format
 msgid "File size of restored file %s not correct. Original %s, restored %s.\n"
 msgstr ""
 
-#: src/findlib/attribs.c:358 src/findlib/attribs.c:365
+#: src/findlib/attribs.c:353 src/findlib/attribs.c:360
 #, c-format
 msgid "Unable to set file owner %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:371
+#: src/findlib/attribs.c:366
 #, c-format
 msgid "Unable to set file modes %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:381
+#: src/findlib/attribs.c:376
 #, c-format
 msgid "Unable to set file times %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:395
+#: src/findlib/attribs.c:390
 #, c-format
 msgid "Unable to set file flags %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:640
+#: src/findlib/attribs.c:635
 #, c-format
 msgid "Error in %s file %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:657
+#: src/findlib/attribs.c:652
 #, c-format
 msgid "Error in %s: ERR=%s\n"
 msgstr ""
@@ -6128,7 +6207,7 @@ msgstr ""
 msgid "Unknown file type %d; not restored: %s\n"
 msgstr ""
 
-#: src/findlib/create_file.c:392
+#: src/findlib/create_file.c:402
 #, c-format
 msgid "Zero length filename: %s\n"
 msgstr ""
@@ -6142,11 +6221,6 @@ msgstr ""
 msgid "Top level directory \"%s\" has an unlisted fstype\n"
 msgstr ""
 
-#: src/findlib/find_one.c:241
-#, c-format
-msgid "Attempt to backup hard linked file %s twice ignored.\n"
-msgstr ""
-
 #: src/findlib/makepath.c:117
 #, c-format
 msgid "Cannot create directory %s: ERR=%s\n"
@@ -6254,54 +6328,54 @@ msgstr ""
 msgid "Pthread cond init error = %s\n"
 msgstr ""
 
-#: src/gnome2-console/console.c:361
+#: src/gnome2-console/console.c:357
 msgid " Not Connected"
 msgstr ""
 
-#: src/gnome2-console/console.c:482
+#: src/gnome2-console/console.c:478
 #, c-format
 msgid " Connecting to Director %s:%d"
 msgstr ""
 
-#: src/gnome2-console/console.c:483
+#: src/gnome2-console/console.c:479
 #, c-format
 msgid ""
 "Connecting to Director %s:%d\n"
 "\n"
 msgstr ""
 
-#: src/gnome2-console/console.c:498 src/wx-console/console_thread.cpp:357
+#: src/gnome2-console/console.c:494 src/wx-console/console_thread.cpp:360
 #, c-format
 msgid "Passphrase for Console \"%s\" TLS private key: "
 msgstr ""
 
-#: src/gnome2-console/console.c:520 src/wx-console/console_thread.cpp:378
+#: src/gnome2-console/console.c:516 src/wx-console/console_thread.cpp:381
 #, c-format
 msgid "Passphrase for Director \"%s\" TLS private key: "
 msgstr ""
 
-#: src/gnome2-console/console.c:539 src/tray-monitor/tray-monitor.c:860
-#: src/wx-console/console_thread.cpp:396
+#: src/gnome2-console/console.c:535 src/tray-monitor/tray-monitor.c:860
+#: src/wx-console/console_thread.cpp:399
 msgid "Director daemon"
 msgstr ""
 
-#: src/gnome2-console/console.c:551
+#: src/gnome2-console/console.c:547
 msgid " Initializing ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:587
+#: src/gnome2-console/console.c:583
 msgid " Connected"
 msgstr ""
 
-#: src/gnome2-console/console.c:595
+#: src/gnome2-console/console.c:591
 msgid " Processing command ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:630
+#: src/gnome2-console/console.c:626
 msgid " At prompt waiting for input ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:750
+#: src/gnome2-console/console.c:746
 msgid " Ready"
 msgstr ""
 
@@ -6315,218 +6389,204 @@ msgstr ""
 msgid "ConsoleFont: name=%s font face=%s\n"
 msgstr ""
 
-#: src/gnome2-console/interface.c:32
-msgid "_Connect"
+#: src/gnome2-console/interface.c:202
+msgid "Bacula Console"
+msgstr ""
+
+#: src/gnome2-console/interface.c:235 src/wx-console/wxbmainframe.cpp:229
+#: src/wx-console/wxbmainframe.cpp:597
+msgid "Connect"
 msgstr ""
 
-#: src/gnome2-console/interface.c:33 src/gnome2-console/interface.c:232
+#: src/gnome2-console/interface.c:238
 msgid "Connect to Director"
 msgstr ""
 
-#: src/gnome2-console/interface.c:39
-msgid "_Disconnect"
+#: src/gnome2-console/interface.c:242
+msgid "Run"
 msgstr ""
 
-#: src/gnome2-console/interface.c:40
-msgid "Disconnect from Director"
+#: src/gnome2-console/interface.c:245 src/gnome2-console/interface.c:683
+#: src/gnome2-console/interface.c:697
+msgid "Run a Job"
 msgstr ""
 
-#: src/gnome2-console/interface.c:93
-msgid "_Display Messages"
+#: src/gnome2-console/interface.c:249
+msgid "Dir Status"
 msgstr ""
 
-#: src/gnome2-console/interface.c:129
-msgid "_File"
+#: src/gnome2-console/interface.c:255 src/lib/util.c:292
+#: src/wx-console/wxbrestorepanel.cpp:384
+#: src/wx-console/wxbrestorepanel.cpp:1949
+msgid "Restore"
 msgstr ""
 
-#: src/gnome2-console/interface.c:136
-msgid "_Edit"
+#: src/gnome2-console/interface.c:261
+msgid "Label"
 msgstr ""
 
-#: src/gnome2-console/interface.c:143
-msgid "_View"
+#: src/gnome2-console/interface.c:267
+msgid "Msgs"
 msgstr ""
 
-#: src/gnome2-console/interface.c:144 src/gnome2-console/interface.c:252
+#: src/gnome2-console/interface.c:270
 msgid "Display Messages"
 msgstr ""
 
-#: src/gnome2-console/interface.c:150
-msgid "_Settings"
+#: src/gnome2-console/interface.c:294
+msgid " Command: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:157
-msgid "_Help"
+#: src/gnome2-console/interface.c:303
+msgid "Enter Commands Here"
 msgstr ""
 
-#: src/gnome2-console/interface.c:197
-msgid "Bacula Console"
+#: src/gnome2-console/interface.c:314
+msgid " Status: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:231 src/wx-console/wxbmainframe.cpp:229
-#: src/wx-console/wxbmainframe.cpp:590
-msgid "Connect"
-msgstr ""
-
-#: src/gnome2-console/interface.c:241
-msgid "Run"
-msgstr ""
-
-#: src/gnome2-console/interface.c:242 src/gnome2-console/interface.c:677
-#: src/gnome2-console/interface.c:690
-msgid "Run a Job"
-msgstr ""
-
-#: src/gnome2-console/interface.c:251
-msgid "Msgs"
-msgstr ""
-
-#: src/gnome2-console/interface.c:261 src/lib/util.c:298
-#: src/wx-console/wxbrestorepanel.cpp:426
-#: src/wx-console/wxbrestorepanel.cpp:1915
-msgid "Restore"
-msgstr ""
-
-#: src/gnome2-console/interface.c:271
-msgid "Label"
-msgstr ""
-
-#: src/gnome2-console/interface.c:299
-msgid " Command: "
-msgstr ""
-
-#: src/gnome2-console/interface.c:307
-msgid "Enter Commands Here"
-msgstr ""
-
-#: src/gnome2-console/interface.c:318
-msgid " Status: "
-msgstr ""
-
-#: src/gnome2-console/interface.c:326
+#: src/gnome2-console/interface.c:323 src/gnome2-console/interface.c:1716
 msgid "  "
 msgstr ""
 
-#: src/gnome2-console/interface.c:422
+#: src/gnome2-console/interface.c:424
 msgid "About Bacula Console"
 msgstr ""
 
-#: src/gnome2-console/interface.c:436
+#: src/gnome2-console/interface.c:439
 msgid "Bacula Console\n"
 msgstr ""
 
-#: src/gnome2-console/interface.c:444
+#: src/gnome2-console/interface.c:448
 msgid "Copyright (c) 2000 - 2004, Kern Sibbald and John Walker"
 msgstr ""
 
-#: src/gnome2-console/interface.c:450
+#: src/gnome2-console/interface.c:453
 msgid "Authors: Kern Sibbald and John Walker"
 msgstr ""
 
-#: src/gnome2-console/interface.c:456
+#: src/gnome2-console/interface.c:458
 msgid "It comes by night and sucks the essence from your computers"
 msgstr ""
 
-#: src/gnome2-console/interface.c:521 src/gnome2-console/interface.c:536
+#: src/gnome2-console/interface.c:523 src/gnome2-console/interface.c:540
 msgid "Select Director"
 msgstr ""
 
-#: src/gnome2-console/interface.c:708 src/gnome2-console/interface.c:1616
+#: src/gnome2-console/interface.c:570
+msgid "         "
+msgstr ""
+
+#: src/gnome2-console/interface.c:716 src/gnome2-console/interface.c:1638
 msgid "Job:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:728
+#: src/gnome2-console/interface.c:736
 msgid "   Type:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:757 src/gnome2-console/interface.c:1644
-#: src/wx-console/wxbrestorepanel.cpp:1828
+#: src/gnome2-console/interface.c:756 src/gnome2-console/interface.c:785
+#: src/gnome2-console/interface.c:1291 src/gnome2-console/interface.c:1687
+msgid " "
+msgstr ""
+
+#: src/gnome2-console/interface.c:765 src/gnome2-console/interface.c:1667
+#: src/wx-console/wxbrestorepanel.cpp:1862
 msgid "Client:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:787 src/gnome2-console/interface.c:1672
+#: src/gnome2-console/interface.c:796 src/gnome2-console/interface.c:1696
 msgid "FileSet: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:813 src/wx-console/wxbrestorepanel.cpp:1834
+#: src/gnome2-console/interface.c:821 src/wx-console/wxbrestorepanel.cpp:1868
 msgid "Priority:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:836
+#: src/gnome2-console/interface.c:842
 msgid "Level:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:866 src/gnome2-console/interface.c:1418
-#: src/gnome2-console/interface.c:1700
+#: src/gnome2-console/interface.c:863
+msgid "             "
+msgstr ""
+
+#: src/gnome2-console/interface.c:873 src/gnome2-console/interface.c:1440
+#: src/gnome2-console/interface.c:1725
 msgid "Pool:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:895 src/gnome2-console/interface.c:1393
-#: src/gnome2-console/interface.c:1728 src/wx-console/wxbrestorepanel.cpp:1830
+#: src/gnome2-console/interface.c:894 src/gnome2-console/interface.c:925
+#: src/gnome2-console/interface.c:955 src/gnome2-console/interface.c:975
+#: src/gnome2-console/interface.c:995 src/gnome2-console/interface.c:1015
+#: src/gnome2-console/interface.c:1020 src/gnome2-console/interface.c:1490
+#: src/gnome2-console/interface.c:1746 src/gnome2-console/interface.c:1776
+#: src/gnome2-console/interface.c:1795 src/gnome2-console/interface.c:1800
+msgid "   "
+msgstr ""
+
+#: src/gnome2-console/interface.c:904 src/gnome2-console/interface.c:1414
+#: src/gnome2-console/interface.c:1755 src/wx-console/wxbrestorepanel.cpp:1864
 msgid "Storage:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:924
+#: src/gnome2-console/interface.c:935
 msgid "Messages:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:952
+#: src/gnome2-console/interface.c:965
 msgid "Where: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:970 src/wx-console/wxbrestorepanel.cpp:1832
+#: src/gnome2-console/interface.c:985 src/wx-console/wxbrestorepanel.cpp:1866
 msgid "When:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:988 src/wx-console/wxbrestorepanel.cpp:1813
+#: src/gnome2-console/interface.c:1005 src/wx-console/wxbrestorepanel.cpp:1847
 msgid "Bootstrap:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1108
-msgid "_New"
-msgstr ""
-
-#: src/gnome2-console/interface.c:1177
+#: src/gnome2-console/interface.c:1201
 msgid "Restore File Selection"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1226
+#: src/gnome2-console/interface.c:1245
 msgid "Current dir:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1252
+#: src/gnome2-console/interface.c:1272
 msgid "Files Selected: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:1373 src/gnome2-console/interface.c:1383
+#: src/gnome2-console/interface.c:1392 src/gnome2-console/interface.c:1403
 msgid "Label a Volume"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1444
+#: src/gnome2-console/interface.c:1465
 msgid "Volume Name:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1459
+#: src/gnome2-console/interface.c:1479
 msgid "Slot:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1585
+#: src/gnome2-console/interface.c:1605
 msgid "Restore Files Dialog"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1599
+#: src/gnome2-console/interface.c:1620
 msgid "Restore Files"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1756
+#: src/gnome2-console/interface.c:1785
 msgid "Before:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1799
+#: src/gnome2-console/interface.c:1831
 msgid "Select Files"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1883
+#: src/gnome2-console/interface.c:1914
 msgid "Progress"
 msgstr ""
 
@@ -6534,162 +6594,253 @@ msgstr ""
 msgid "Mark"
 msgstr ""
 
+#: src/gnome2-console/restore.c:121
+msgid "File"
+msgstr ""
+
 #: src/gnome2-console/restore.c:121
 msgid "Mode"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:330
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:288
 msgid "User"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:334
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:292
 msgid "Group"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:318
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:276
 msgid "Size"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:322
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:280
 msgid "Date"
 msgstr ""
 
-#: src/gnome2-console/support.c:41
+#: src/gnome2-console/support.c:60 src/gnome2-console/support.c:85
 #, c-format
-msgid "Widget not found: %s"
+msgid "Couldn't find pixmap file: %s"
 msgstr ""
 
-#: src/gnome2-console/support.c:60 src/gnome2-console/support.c:85
+#: src/lib/tls.c:105
 #, c-format
-msgid "Couldn't find pixmap file: %s"
+msgid ""
+"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
+msgstr ""
+
+#: src/lib/tls.c:152
+msgid "Error initializing SSL context"
+msgstr ""
+
+#: src/lib/tls.c:173
+msgid "Error loading certificate verification stores"
+msgstr ""
+
+#: src/lib/tls.c:178
+msgid ""
+"Either a certificate file or a directory must be specified as a verification "
+"store\n"
+msgstr ""
+
+#: src/lib/tls.c:189
+msgid "Error loading certificate file"
+msgstr ""
+
+#: src/lib/tls.c:197
+msgid "Error loading private key"
 msgstr ""
 
-#: src/gnome2-console/support.c:92
+#: src/lib/tls.c:205
+msgid "Unable to open DH parameters file"
+msgstr ""
+
+#: src/lib/tls.c:211
+msgid "Unable to load DH parameters from specified file"
+msgstr ""
+
+#: src/lib/tls.c:215
+msgid "Failed to set TLS Diffie-Hellman parameters"
+msgstr ""
+
+#: src/lib/tls.c:224
+msgid "Error setting cipher list, no valid ciphers available\n"
+msgstr ""
+
+#: src/lib/tls.c:272
+msgid "Peer failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:314
+#, c-format
+msgid "Peer %s failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:417
+msgid "Error creating file descriptor-based BIO"
+msgstr ""
+
+#: src/lib/tls.c:428
+msgid "Error creating new SSL object"
+msgstr ""
+
+#: src/lib/tls.c:492 src/lib/tls.c:515
+msgid "Connect failure"
+msgstr ""
+
+#: src/lib/tls.c:592 src/lib/tls.c:596
+msgid "TLS shutdown failure."
+msgstr ""
+
+#: src/lib/tls.c:645 src/lib/tls.c:665
+msgid "TLS read/write failure."
+msgstr ""
+
+#: src/lib/tls.c:723 src/lib/tls.c:780 src/stored/dev.c:209
+#: src/stored/dev.c:227 src/stored/dev.c:233 src/stored/stored_conf.c:593
+#, c-format
+msgid "Unable to init mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:743 src/lib/tls.c:812
+#, c-format
+msgid "Unable to destroy mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:877
 #, c-format
-msgid "Failed to load pixbuf file: %s: %s\n"
+msgid "Unable to init OpenSSL threading: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:887
+msgid "Failed to seed OpenSSL PRNG\n"
+msgstr ""
+
+#: src/lib/tls.c:913
+msgid "Failed to save OpenSSL PRNG\n"
 msgstr ""
 
-#: src/lib/address_conf.c:55
+#: src/lib/address_conf.c:50
 #, c-format
 msgid "Only ipv4 and ipv6 are supported (%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:59
+#: src/lib/address_conf.c:54
 #, c-format
 msgid "Only ipv4 is supported (%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:167
+#: src/lib/address_conf.c:163
 #, c-format
 msgid "It was tried to assign a ipv6 address to a ipv4(%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:176
+#: src/lib/address_conf.c:172
 #, c-format
 msgid "It was tried to assign a ipv4 address to a ipv6(%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:255
+#: src/lib/address_conf.c:251
 #, c-format
 msgid "Can't add default address (%s)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:285
+#: src/lib/address_conf.c:281
 msgid "the old style addresses cannot be mixed with new style"
 msgstr ""
 
-#: src/lib/address_conf.c:308
+#: src/lib/address_conf.c:304
 #, c-format
 msgid "can't resolve service(%s)"
 msgstr ""
 
-#: src/lib/address_conf.c:318
+#: src/lib/address_conf.c:314
 #, c-format
 msgid "can't resolve hostname(%s) %s"
 msgstr ""
 
-#: src/lib/address_conf.c:407
+#: src/lib/address_conf.c:403
 #, c-format
 msgid "Expected a block begin { , got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:412
+#: src/lib/address_conf.c:408
 msgid "Empty addr block is not allowed"
 msgstr ""
 
-#: src/lib/address_conf.c:416
+#: src/lib/address_conf.c:412
 #, c-format
 msgid "Expected a string, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:425
+#: src/lib/address_conf.c:421
 #, c-format
 msgid "Expected a string [ip|ipv4|ipv6], got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:429
+#: src/lib/address_conf.c:425
 #, c-format
 msgid "Expected a string [ip|ipv4], got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:434 src/lib/address_conf.c:464
+#: src/lib/address_conf.c:430 src/lib/address_conf.c:460
 #, c-format
 msgid "Expected a equal =, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:438
+#: src/lib/address_conf.c:434
 #, c-format
 msgid "Expected a block beginn { , got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:445 src/lib/address_conf.c:460
+#: src/lib/address_conf.c:441 src/lib/address_conf.c:456
 #, c-format
 msgid "Expected a identifier [addr|port], got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:450
+#: src/lib/address_conf.c:446
 msgid "Only one port per address block"
 msgstr ""
 
-#: src/lib/address_conf.c:456
+#: src/lib/address_conf.c:452
 msgid "Only one addr per address block"
 msgstr ""
 
-#: src/lib/address_conf.c:472
+#: src/lib/address_conf.c:468
 #, c-format
 msgid "Expected a number or a string, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:478
+#: src/lib/address_conf.c:474
 #, c-format
 msgid "Expected an IP number or a hostname, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:484
+#: src/lib/address_conf.c:480
 msgid "State machine missmatch"
 msgstr ""
 
-#: src/lib/address_conf.c:490 src/lib/address_conf.c:503
+#: src/lib/address_conf.c:486 src/lib/address_conf.c:499
 #, c-format
 msgid "Expected a end of block }, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:496
+#: src/lib/address_conf.c:492
 #, c-format
 msgid "Can't add hostname(%s) and port(%s) to addrlist (%s)"
 msgstr ""
 
-#: src/lib/address_conf.c:512
+#: src/lib/address_conf.c:508
 #, c-format
 msgid "Expected a hostname or IP nummer, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:517 src/lib/address_conf.c:531
+#: src/lib/address_conf.c:513 src/lib/address_conf.c:527
 #, c-format
 msgid "can't add port (%s) to (%s)"
 msgstr ""
 
-#: src/lib/address_conf.c:526
+#: src/lib/address_conf.c:522
 #, c-format
 msgid "Expected a port number or string, got: %s"
 msgstr ""
@@ -6699,25 +6850,25 @@ msgstr ""
 msgid "Error scanning attributes: %s\n"
 msgstr ""
 
-#: src/lib/berrno.c:66
+#: src/lib/berrno.c:48
 msgid "Child exited normally."
 msgstr ""
 
-#: src/lib/berrno.c:73
+#: src/lib/berrno.c:55
 msgid "Unknown error during program execvp"
 msgstr ""
 
-#: src/lib/berrno.c:76
+#: src/lib/berrno.c:58
 #, c-format
 msgid "Child exited with code %d"
 msgstr ""
 
-#: src/lib/berrno.c:84
+#: src/lib/berrno.c:66
 #, c-format
 msgid "Child died from signal %d: %s"
 msgstr ""
 
-#: src/lib/berrno.c:90
+#: src/lib/berrno.c:72
 msgid "Invalid errno. No error message possible."
 msgstr ""
 
@@ -6735,148 +6886,148 @@ msgstr ""
 msgid "Attr spool write error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:207 src/lib/bnet.c:264
+#: src/lib/bnet.c:209 src/lib/bnet.c:266
 #, c-format
 msgid "Read expected %d got %d from %s:%s:%d\n"
 msgstr ""
 
-#: src/lib/bnet.c:225
+#: src/lib/bnet.c:227
 #, c-format
 msgid "Packet size too big from \"%s:%s:%d. Terminating connection.\n"
 msgstr ""
 
-#: src/lib/bnet.c:254
+#: src/lib/bnet.c:256
 #, c-format
 msgid "Read error from %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:330 src/lib/bnet.c:346
+#: src/lib/bnet.c:332 src/lib/bnet.c:348
 #, c-format
 msgid "fread attr spool error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:390
+#: src/lib/bnet.c:392
 #, c-format
 msgid "Write error sending len to %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:395 src/lib/bnet.c:427
+#: src/lib/bnet.c:397 src/lib/bnet.c:430
 #, c-format
 msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"
 msgstr ""
 
-#: src/lib/bnet.c:421
+#: src/lib/bnet.c:424
 #, c-format
 msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:447 src/lib/bnet.c:487
+#: src/lib/bnet.c:450 src/lib/bnet.c:490
 msgid "TLS connection initialization failed.\n"
 msgstr ""
 
-#: src/lib/bnet.c:455
+#: src/lib/bnet.c:458
 msgid "TLS Negotiation failed.\n"
 msgstr ""
 
-#: src/lib/bnet.c:461
+#: src/lib/bnet.c:464
 msgid ""
 "TLS certificate verification failed. Peer certificate did not match a "
 "required commonName\n"
 msgstr ""
 
-#: src/lib/bnet.c:499
+#: src/lib/bnet.c:502
 #, c-format
 msgid ""
 "TLS host certificate verification failed. Host %s did not match presented "
 "certificate\n"
 msgstr ""
 
-#: src/lib/bnet.c:513 src/lib/bnet.c:518
+#: src/lib/bnet.c:516 src/lib/bnet.c:521
 msgid "TLS not configured.\n"
 msgstr ""
 
-#: src/lib/bnet.c:614
+#: src/lib/bnet.c:617
 msgid "No problem."
 msgstr ""
 
-#: src/lib/bnet.c:617
+#: src/lib/bnet.c:620
 msgid "Authoritative answer for host not found."
 msgstr ""
 
-#: src/lib/bnet.c:620
+#: src/lib/bnet.c:623
 msgid "Non-authoritative for host not found, or ServerFail."
 msgstr ""
 
-#: src/lib/bnet.c:623
+#: src/lib/bnet.c:626
 msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP."
 msgstr ""
 
-#: src/lib/bnet.c:626
+#: src/lib/bnet.c:629
 msgid "Valid name, no data record of resquested type."
 msgstr ""
 
-#: src/lib/bnet.c:629
+#: src/lib/bnet.c:632
 msgid "Unknown error."
 msgstr ""
 
-#: src/lib/bnet.c:764
+#: src/lib/bnet.c:767
 #, c-format
 msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:784
+#: src/lib/bnet.c:787
 #, c-format
 msgid "Socket open error. proto=%d port=%d. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:793 src/lib/bnet.c:818 src/lib/bnet_server.c:194
-#: src/lib/bnet_server.c:352
+#: src/lib/bnet.c:796 src/lib/bnet.c:821 src/lib/bnet_server.c:193
+#: src/lib/bnet_server.c:351
 #, c-format
 msgid "Cannot set SO_KEEPALIVE on socket: %s\n"
 msgstr ""
 
-#: src/lib/bnet.c:849
+#: src/lib/bnet.c:852
 #, c-format
 msgid ""
 "Could not connect to %s on %s:%d. ERR=%s\n"
 "Retrying ...\n"
 msgstr ""
 
-#: src/lib/bnet.c:855
+#: src/lib/bnet.c:858
 #, c-format
 msgid "Unable to connect to %s on %s:%d. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:933
+#: src/lib/bnet.c:936
 msgid "Could not malloc BSOCK data buffer\n"
 msgstr ""
 
-#: src/lib/bnet.c:940 src/lib/bnet.c:964
+#: src/lib/bnet.c:943 src/lib/bnet.c:967
 #, c-format
 msgid "sockopt error: %s\n"
 msgstr ""
 
-#: src/lib/bnet.c:946 src/lib/bnet.c:970
+#: src/lib/bnet.c:949 src/lib/bnet.c:973
 #, c-format
 msgid "Warning network buffer = %d bytes not max size.\n"
 msgstr ""
 
-#: src/lib/bnet.c:950 src/lib/bnet.c:974
+#: src/lib/bnet.c:953 src/lib/bnet.c:977
 #, c-format
 msgid "Network buffer size %d not multiple of tape block size.\n"
 msgstr ""
 
-#: src/lib/bnet.c:994 src/lib/bnet.c:1028
+#: src/lib/bnet.c:997 src/lib/bnet.c:1031
 #, c-format
 msgid "fcntl F_GETFL error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:1000 src/lib/bnet.c:1034 src/lib/bnet.c:1059
+#: src/lib/bnet.c:1003 src/lib/bnet.c:1037 src/lib/bnet.c:1062
 #, c-format
 msgid "fcntl F_SETFL error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:1113
+#: src/lib/bnet.c:1116
 #, c-format
 msgid "Unknown sig %d"
 msgstr ""
@@ -6891,7 +7042,7 @@ msgstr ""
 msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:259
+#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:258
 #, c-format
 msgid "Cannot set SO_REUSEADDR on socket: %s\n"
 msgstr ""
@@ -6911,50 +7062,50 @@ msgstr ""
 msgid "Could not init client queue: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:158 src/lib/bnet_server.c:321
+#: src/lib/bnet_server.c:157 src/lib/bnet_server.c:320
 #, c-format
 msgid "Error in select: %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:179 src/lib/bnet_server.c:340
+#: src/lib/bnet_server.c:178 src/lib/bnet_server.c:339
 #, c-format
 msgid "Connection from %s:%d refused by hosts.access\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:205
+#: src/lib/bnet_server.c:204
 msgid "Could not create client BSOCK.\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:212
+#: src/lib/bnet_server.c:211
 #, c-format
 msgid "Could not add job to client queue: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:223
+#: src/lib/bnet_server.c:222
 #, c-format
 msgid "Could not destroy client queue: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:250
+#: src/lib/bnet_server.c:249
 #, c-format
 msgid "Cannot open stream socket: %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:279
+#: src/lib/bnet_server.c:278
 #, c-format
 msgid "Cannot bind port %d: ERR=%s: retrying ...\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:285
+#: src/lib/bnet_server.c:284
 msgid "Server socket"
 msgstr ""
 
-#: src/lib/bnet_server.c:367
+#: src/lib/bnet_server.c:366
 #, c-format
 msgid "Socket accept error for %s. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bpipe.c:282 src/lib/bpipe.c:357
+#: src/lib/bpipe.c:283 src/lib/bpipe.c:362
 msgid "Program killed by Bacula watchdog (timeout)\n"
 msgstr ""
 
@@ -6988,85 +7139,85 @@ msgstr ""
 msgid "Out of memory: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:254
+#: src/lib/bsys.c:256
 msgid "Buffer overflow.\n"
 msgstr ""
 
-#: src/lib/bsys.c:319
+#: src/lib/bsys.c:322
 msgid "Bad errno"
 msgstr ""
 
-#: src/lib/bsys.c:336
+#: src/lib/bsys.c:339
 msgid "Possible mutex deadlock.\n"
 msgstr ""
 
-#: src/lib/bsys.c:340 src/lib/bsys.c:372
+#: src/lib/bsys.c:343 src/lib/bsys.c:375
 #, c-format
 msgid "Mutex lock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:343
+#: src/lib/bsys.c:346
 msgid "Possible mutex deadlock resolved.\n"
 msgstr ""
 
-#: src/lib/bsys.c:355
+#: src/lib/bsys.c:358
 #, c-format
 msgid "Mutex unlock not locked. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:360 src/lib/bsys.c:382
+#: src/lib/bsys.c:363 src/lib/bsys.c:385
 #, c-format
 msgid "Mutex unlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:396
+#: src/lib/bsys.c:399
 #, c-format
 msgid "Memset for %d bytes at %s:%d\n"
 msgstr ""
 
-#: src/lib/bsys.c:425
+#: src/lib/bsys.c:428
 #, c-format
 msgid "Cannot open pid file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:429
+#: src/lib/bsys.c:432
 #, c-format
 msgid ""
 "%s is already running. pid=%d\n"
 "Check file %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:442
+#: src/lib/bsys.c:445
 #, c-format
 msgid "Could not open pid file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:536
+#: src/lib/bsys.c:565
 #, c-format
 msgid "Could not create state file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:552
+#: src/lib/bsys.c:584
 #, c-format
 msgid "Write final hdr error: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:574
+#: src/lib/bsys.c:611
 #, c-format
 msgid "Could not find specified group: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:577 src/lib/bsys.c:581
+#: src/lib/bsys.c:614 src/lib/bsys.c:618
 #, c-format
 msgid "Could not set specified group: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:590
+#: src/lib/bsys.c:627
 #, c-format
 msgid "Could not find specified userid: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:593
+#: src/lib/bsys.c:630
 #, c-format
 msgid "Could not set specified userid: %s\n"
 msgstr ""
@@ -7075,21 +7226,21 @@ msgstr ""
 msgid "stop_btimer called with NULL btimer_id\n"
 msgstr ""
 
-#: src/lib/cram-md5.c:80 src/lib/cram-md5.c:105
+#: src/lib/cram-md5.c:76 src/lib/cram-md5.c:101
 msgid "1999 Authorization failed.\n"
 msgstr ""
 
-#: src/lib/daemon.c:58
+#: src/lib/daemon.c:53
 #, c-format
 msgid "Cannot fork to become daemon: %s\n"
 msgstr ""
 
-#: src/lib/edit.c:400
+#: src/lib/edit.c:433
 #, c-format
 msgid "Illegal character \"%c\" in name.\n"
 msgstr ""
 
-#: src/lib/edit.c:407
+#: src/lib/edit.c:440
 msgid "Name too long.\n"
 msgstr ""
 
@@ -7097,40 +7248,40 @@ msgstr ""
 msgid "Events not available"
 msgstr ""
 
-#: src/lib/jcr.c:277
+#: src/lib/jcr.c:279
 msgid "NULL jcr.\n"
 msgstr ""
 
-#: src/lib/jcr.c:396
+#: src/lib/jcr.c:400
 #, c-format
 msgid "JCR use_count=%d JobId=%d\n"
 msgstr ""
 
-#: src/lib/jcr.c:625
+#: src/lib/jcr.c:678
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading Storage "
 "daemon.\n"
 msgstr ""
 
-#: src/lib/jcr.c:637
+#: src/lib/jcr.c:690
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading File daemon.\n"
 msgstr ""
 
-#: src/lib/jcr.c:649
+#: src/lib/jcr.c:702
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading Director.\n"
 msgstr ""
 
-#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:192
+#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:186
 #, c-format
 msgid "Problem probably begins at line %d.\n"
 msgstr ""
 
-#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:197
+#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:191
 #, c-format
 msgid ""
 "Config error: %s\n"
@@ -7225,14 +7376,14 @@ msgstr ""
 msgid "expected a string, got %s: %s"
 msgstr ""
 
-#: src/lib/mem_pool.c:100
+#: src/lib/mem_pool.c:95
 #, c-format
 msgid "MemPool index %d larger than max %d\n"
 msgstr ""
 
-#: src/lib/mem_pool.c:118 src/lib/mem_pool.c:138 src/lib/mem_pool.c:173
-#: src/lib/mem_pool.c:244 src/lib/mem_pool.c:264 src/lib/mem_pool.c:302
-#: src/lib/mem_pool.c:521
+#: src/lib/mem_pool.c:113 src/lib/mem_pool.c:133 src/lib/mem_pool.c:168
+#: src/lib/mem_pool.c:239 src/lib/mem_pool.c:259 src/lib/mem_pool.c:297
+#: src/lib/mem_pool.c:550
 #, c-format
 msgid "Out of memory requesting %d bytes\n"
 msgstr ""
@@ -7467,177 +7618,156 @@ msgid ""
 "Perhaps you left the trailing brace off of the previous resource."
 msgstr ""
 
-#: src/lib/parse_conf.c:850
+#: src/lib/parse_conf.c:844
+msgid "Name not specified for resource"
+msgstr ""
+
+#: src/lib/parse_conf.c:853
 #, c-format
 msgid "unexpected token %d %s in resource definition"
 msgstr ""
 
-#: src/lib/parse_conf.c:856
+#: src/lib/parse_conf.c:859
 #, c-format
 msgid "Unknown parser state %d\n"
 msgstr ""
 
-#: src/lib/parse_conf.c:861
+#: src/lib/parse_conf.c:864
 msgid "End of conf file reached with unclosed resource."
 msgstr ""
 
-#: src/lib/regex.c:1040
-msgid "Success"
-msgstr ""
-
-#: src/lib/regex.c:1043
-msgid "No match"
-msgstr ""
-
-#: src/lib/regex.c:1046
-msgid "Invalid regular expression"
-msgstr ""
-
-#: src/lib/regex.c:1049
-msgid "Invalid collation character"
-msgstr ""
-
-#: src/lib/regex.c:1052
-msgid "Invalid character class name"
-msgstr ""
-
-#: src/lib/regex.c:1055
-msgid "Trailing backslash"
-msgstr ""
-
-#: src/lib/regex.c:1058
-msgid "Invalid back reference"
-msgstr ""
-
-#: src/lib/regex.c:1061
-msgid "Unmatched [ or [^"
-msgstr ""
-
-#: src/lib/regex.c:1064
-msgid "Unmatched ( or \\("
+#: src/lib/pythonlib.c:114
+msgid "Could not initialize Python\n"
 msgstr ""
 
-#: src/lib/regex.c:1067
-msgid "Unmatched \\{"
+#: src/lib/pythonlib.c:119
+#, c-format
+msgid "Could not Run Python string %s\n"
 msgstr ""
 
-#: src/lib/regex.c:1070
-msgid "Invalid content of \\{\\}"
+#: src/lib/pythonlib.c:131
+msgid "Could not initialize Python Job type.\n"
 msgstr ""
 
-#: src/lib/regex.c:1073
-msgid "Invalid range end"
+#: src/lib/pythonlib.c:136
+#, c-format
+msgid "Could not import Python script %s/%s. Python disabled.\n"
 msgstr ""
 
-#: src/lib/regex.c:1076
-msgid "Memory exhausted"
+#: src/lib/pythonlib.c:239
+msgid "Could not create Python Job Object.\n"
 msgstr ""
 
-#: src/lib/regex.c:1079
-msgid "Invalid preceding regular expression"
+#: src/lib/pythonlib.c:252 src/lib/pythonlib.c:276
+#, c-format
+msgid "Python function \"%s\" not found.\n"
 msgstr ""
 
-#: src/lib/regex.c:1082
-msgid "Premature end of regular expression"
+#: src/lib/pythonlib.c:291
+#, c-format
+msgid "Unknown Python daemon event %s\n"
 msgstr ""
 
-#: src/lib/regex.c:1085
-msgid "Regular expression too big"
+#: src/lib/pythonlib.c:316
+#, c-format
+msgid "Unable to initialize the Python lock. ERR=%s\n"
 msgstr ""
 
-#: src/lib/regex.c:1088
-msgid "Unmatched ) or \\)"
+#: src/lib/res.c:66
+#, c-format
+msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
 msgstr ""
 
-#: src/lib/regex.c:5874
-msgid "No previous regular expression"
+#: src/lib/res.c:76
+#, c-format
+msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:289
+#: src/lib/rwlock.c:284
 msgid "rwl_writeunlock called too many times.\n"
 msgstr ""
 
-#: src/lib/rwlock.c:293
+#: src/lib/rwlock.c:288
 msgid "rwl_writeunlock by non-owner.\n"
 msgstr ""
 
-#: src/lib/rwlock.c:358 src/lib/semlock.c:248
+#: src/lib/rwlock.c:353 src/lib/semlock.c:248
 #, c-format
 msgid "Write lock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:365 src/lib/semlock.c:255
+#: src/lib/rwlock.c:360 src/lib/semlock.c:255
 #, c-format
 msgid "Write unlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:375 src/lib/semlock.c:265
+#: src/lib/rwlock.c:370 src/lib/semlock.c:265
 #, c-format
 msgid "Read lock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:382 src/lib/semlock.c:272
+#: src/lib/rwlock.c:377 src/lib/semlock.c:272
 #, c-format
 msgid "Read unlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:391 src/lib/semlock.c:281
+#: src/lib/rwlock.c:386 src/lib/semlock.c:281
 #, c-format
 msgid "Thread %d found unchanged elements %d times\n"
 msgstr ""
 
-#: src/lib/rwlock.c:423 src/lib/semlock.c:313
+#: src/lib/rwlock.c:418 src/lib/semlock.c:313
 #, c-format
 msgid "Init rwlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:438 src/lib/semlock.c:328
+#: src/lib/rwlock.c:433 src/lib/semlock.c:328
 #, c-format
 msgid "Create thread failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:449 src/lib/semlock.c:339
+#: src/lib/rwlock.c:444 src/lib/semlock.c:339
 #, c-format
 msgid "Join thread failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:452 src/lib/semlock.c:342
+#: src/lib/rwlock.c:447 src/lib/semlock.c:342
 #, c-format
 msgid "%02d: interval %d, writes %d, reads %d\n"
 msgstr ""
 
-#: src/lib/rwlock.c:462 src/lib/semlock.c:352
+#: src/lib/rwlock.c:457 src/lib/semlock.c:352
 #, c-format
 msgid "data %02d: value %d, %d writes\n"
 msgstr ""
 
-#: src/lib/rwlock.c:467 src/lib/semlock.c:357
+#: src/lib/rwlock.c:462 src/lib/semlock.c:357
 #, c-format
 msgid "Total: %d thread writes, %d data writes\n"
 msgstr ""
 
-#: src/lib/rwlock.c:539 src/lib/semlock.c:429
+#: src/lib/rwlock.c:534 src/lib/semlock.c:429
 msgid "Try write lock"
 msgstr ""
 
-#: src/lib/rwlock.c:545 src/lib/semlock.c:435
+#: src/lib/rwlock.c:540 src/lib/semlock.c:435
 msgid "Try read lock"
 msgstr ""
 
-#: src/lib/rwlock.c:600 src/lib/semlock.c:490
+#: src/lib/rwlock.c:595 src/lib/semlock.c:490
 msgid "Create thread"
 msgstr ""
 
-#: src/lib/rwlock.c:610 src/lib/semlock.c:500
+#: src/lib/rwlock.c:605 src/lib/semlock.c:500
 msgid "Join thread"
 msgstr ""
 
-#: src/lib/rwlock.c:612 src/lib/semlock.c:502
+#: src/lib/rwlock.c:607 src/lib/semlock.c:502
 #, c-format
 msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n"
 msgstr ""
 
-#: src/lib/rwlock.c:624 src/lib/semlock.c:514
+#: src/lib/rwlock.c:619 src/lib/semlock.c:514
 #, c-format
 msgid "data %02d: value %d, %d updates\n"
 msgstr ""
@@ -7851,41 +7981,41 @@ msgstr ""
 msgid "Resource Lost (e.g. record-lock lost)"
 msgstr ""
 
-#: src/lib/smartall.c:137 src/lib/smartall.c:228 src/lib/smartall.c:243
+#: src/lib/smartall.c:132 src/lib/smartall.c:225 src/lib/smartall.c:240
 msgid "Out of memory\n"
 msgstr ""
 
-#: src/lib/smartall.c:165
+#: src/lib/smartall.c:160
 #, c-format
 msgid "Attempt to free NULL called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:181
+#: src/lib/smartall.c:176
 #, c-format
 msgid "qp->qnext->qprev != qp called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:185
+#: src/lib/smartall.c:180
 #, c-format
 msgid "qp->qprev->qnext != qp called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:194
+#: src/lib/smartall.c:189
 #, c-format
 msgid "Buffer overrun called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:265
+#: src/lib/smartall.c:262
 #, c-format
 msgid "sm_realloc size: %d\n"
 msgstr ""
 
-#: src/lib/smartall.c:306
+#: src/lib/smartall.c:303
 #, c-format
 msgid "sm_realloc %d at %x from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:368
+#: src/lib/smartall.c:365
 #, c-format
 msgid ""
 "\n"
@@ -7894,125 +8024,133 @@ msgid ""
 "  Buffer address with bad links: %lx\n"
 msgstr ""
 
-#: src/lib/smartall.c:379
+#: src/lib/smartall.c:376
 #, c-format
 msgid "Orphaned buffer:  %6u bytes allocated at line %d of %s %s\n"
 msgstr ""
 
-#: src/lib/smartall.c:415
+#: src/lib/smartall.c:412
 #, c-format
 msgid "Damaged buffer found. Called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:445
+#: src/lib/smartall.c:442
 #, c-format
 msgid ""
 "\n"
 "Damaged buffers found at %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:448
+#: src/lib/smartall.c:445
 #, c-format
 msgid "  discovery of bad prev link.\n"
 msgstr ""
 
-#: src/lib/smartall.c:451
+#: src/lib/smartall.c:448
 #, c-format
 msgid "  discovery of bad next link.\n"
 msgstr ""
 
-#: src/lib/smartall.c:454
+#: src/lib/smartall.c:451
 #, c-format
 msgid "  discovery of data overrun.\n"
 msgstr ""
 
-#: src/lib/smartall.c:457
+#: src/lib/smartall.c:454
 #, c-format
 msgid "  Buffer address: %lx\n"
 msgstr ""
 
-#: src/lib/smartall.c:464
+#: src/lib/smartall.c:461
 #, c-format
 msgid "Damaged buffer:  %6u bytes allocated at line %d of %s %s\n"
 msgstr ""
 
-#: src/lib/util.c:187
+#: src/lib/util.c:181
 msgid "Running"
 msgstr ""
 
-#: src/lib/util.c:190
+#: src/lib/util.c:184
 msgid "Blocked"
 msgstr ""
 
-#: src/lib/util.c:200
+#: src/lib/util.c:194
 msgid "Non-fatal error"
 msgstr ""
 
-#: src/lib/util.c:203 src/lib/util.c:270
+#: src/lib/util.c:197 src/lib/util.c:264
 msgid "Canceled"
 msgstr ""
 
-#: src/lib/util.c:206
+#: src/lib/util.c:200
 msgid "Verify differences"
 msgstr ""
 
-#: src/lib/util.c:209
+#: src/lib/util.c:203
 msgid "Waiting on FD"
 msgstr ""
 
-#: src/lib/util.c:212
+#: src/lib/util.c:206
 msgid "Wait on SD"
 msgstr ""
 
-#: src/lib/util.c:215
+#: src/lib/util.c:209
 msgid "Wait for new Volume"
 msgstr ""
 
-#: src/lib/util.c:218
+#: src/lib/util.c:212
 msgid "Waiting for mount"
 msgstr ""
 
-#: src/lib/util.c:221
+#: src/lib/util.c:215
 msgid "Waiting for Storage resource"
 msgstr ""
 
-#: src/lib/util.c:224
+#: src/lib/util.c:218
 msgid "Waiting for Job resource"
 msgstr ""
 
-#: src/lib/util.c:227
+#: src/lib/util.c:221
 msgid "Waiting for Client resource"
 msgstr ""
 
-#: src/lib/util.c:230
+#: src/lib/util.c:224
 msgid "Waiting on Max Jobs"
 msgstr ""
 
-#: src/lib/util.c:233
+#: src/lib/util.c:227
 msgid "Waiting for Start Time"
 msgstr ""
 
-#: src/lib/util.c:236
+#: src/lib/util.c:230
 msgid "Waiting on Priority"
 msgstr ""
 
-#: src/lib/util.c:243
+#: src/lib/util.c:237
 #, c-format
 msgid "Unknown Job termination status=%d"
 msgstr ""
 
-#: src/lib/util.c:267
+#: src/lib/util.c:261
 msgid "Fatal Error"
 msgstr ""
 
-#: src/lib/util.c:273
+#: src/lib/util.c:267
 msgid "Differences"
 msgstr ""
 
-#: src/lib/util.c:276
+#: src/lib/util.c:270
 msgid "Unknown term code"
 msgstr ""
 
+#: src/lib/util.c:298
+msgid "Migrate"
+msgstr ""
+
+#: src/lib/util.c:301
+msgid "Copy"
+msgstr ""
+
 #: src/lib/util.c:304
 msgid "Unknown Type"
 msgstr ""
@@ -8227,311 +8365,247 @@ msgstr ""
 msgid "unknown error"
 msgstr ""
 
-#: src/lib/watchdog.c:74
+#: src/lib/watchdog.c:69
 #, c-format
 msgid "Unable to initialize watchdog lock. ERR=%s\n"
 msgstr ""
 
-#: src/lib/watchdog.c:170
+#: src/lib/watchdog.c:165
 msgid "BUG! register_watchdog called before start_watchdog\n"
 msgstr ""
 
-#: src/lib/watchdog.c:173
+#: src/lib/watchdog.c:168
 #, c-format
 msgid "BUG! Watchdog %p has NULL callback\n"
 msgstr ""
 
-#: src/lib/watchdog.c:176
+#: src/lib/watchdog.c:171
 #, c-format
 msgid "BUG! Watchdog %p has zero interval\n"
 msgstr ""
 
-#: src/lib/watchdog.c:196
+#: src/lib/watchdog.c:191
 msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n"
 msgstr ""
 
-#: src/lib/watchdog.c:313
+#: src/lib/watchdog.c:309
 #, c-format
 msgid "rwl_writelock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/watchdog.c:327
+#: src/lib/watchdog.c:323
 #, c-format
 msgid "rwl_writeunlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:108
-msgid "Could not initialize Python\n"
+#: src/stored/acquire.c:52
+#, c-format
+msgid "Num_writers=%d not zero. Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:113
+#: src/stored/acquire.c:60
 #, c-format
-msgid "Could not Run Python string %s\n"
+msgid "No volumes specified. Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:125
-msgid "Could not initialize Python Job type.\n"
+#: src/stored/acquire.c:92 src/stored/mount.c:73
+#, c-format
+msgid "Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:130
+#: src/stored/acquire.c:103
 #, c-format
-msgid "Could not import Python script %s/%s. Python disabled.\n"
+msgid "Read open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:230
-msgid "Could not create Python Job Object.\n"
+#: src/stored/acquire.c:108
+#, c-format
+msgid "Read open device %s Volume \"%s\" failed: ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:243 src/lib/pythonlib.c:267
+#: src/stored/acquire.c:179 src/stored/mount.c:67
 #, c-format
-msgid "Python function \"%s\" not found.\n"
+msgid "Too many errors trying to mount device %s.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:282
+#: src/stored/acquire.c:188
 #, c-format
-msgid "Unknown Python daemon event %s\n"
+msgid "Ready to read from volume \"%s\" on device %s.\n"
 msgstr ""
 
-#: src/lib/res.c:66
+#: src/stored/acquire.c:232
 #, c-format
-msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
+msgid "Device %s is busy reading.\n"
 msgstr ""
 
-#: src/lib/res.c:76
+#: src/stored/acquire.c:262
 #, c-format
-msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
+msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
 msgstr ""
 
-#: src/lib/tls.c:108
+#: src/stored/acquire.c:281
 #, c-format
 msgid ""
-"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
+"Cannot recycle volume \"%s\" on device %s because it is in use by another "
+"job.\n"
 msgstr ""
 
-#: src/lib/tls.c:155
-msgid "Error initializing SSL context"
+#: src/stored/acquire.c:303
+#, c-format
+msgid "Could not ready device %s for append.\n"
 msgstr ""
 
-#: src/lib/tls.c:176
-msgid "Error loading certificate verification stores"
+#: src/stored/acquire.c:380 src/stored/block.c:354 src/stored/block.c:682
+#: src/stored/block.c:751
+#, c-format
+msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
 msgstr ""
 
-#: src/lib/tls.c:181
-msgid ""
-"Either a certificate file or a directory must be specified as a verification "
-"store\n"
+#: src/stored/acquire.c:422
+#, c-format
+msgid "Alert: %s"
 msgstr ""
 
-#: src/lib/tls.c:192
-msgid "Error loading certificate file"
+#: src/stored/acquire.c:430
+#, c-format
+msgid "3997 Bad alert command: %s: ERR=%s.\n"
 msgstr ""
 
-#: src/lib/tls.c:200
-msgid "Error loading private key"
+#: src/stored/acquire.c:518
+#, c-format
+msgid "Hey! num_writers=%d!!!!\n"
 msgstr ""
 
-#: src/lib/tls.c:208
-msgid "Unable to open DH parameters file"
+#: src/stored/ansi_label.c:83
+#, c-format
+msgid "Read error on device %s in ANSI label. ERR=%s\n"
 msgstr ""
 
-#: src/lib/tls.c:214
-msgid "Unable to load DH parameters from specified file"
+#: src/stored/ansi_label.c:93
+msgid "Insane! End of tape while reading ANSI label.\n"
 msgstr ""
 
-#: src/lib/tls.c:218
-msgid "Failed to set TLS Diffie-Hellman parameters"
+#: src/stored/ansi_label.c:117
+msgid "No VOL1 label while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/lib/tls.c:227
-msgid "Error setting cipher list, no valid ciphers available\n"
+#: src/stored/ansi_label.c:137
+#, c-format
+msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
 msgstr ""
 
-#: src/lib/tls.c:275
-msgid "Peer failed to present a TLS certificate\n"
-msgstr ""
-
-#: src/lib/tls.c:317
-#, c-format
-msgid "Peer %s failed to present a TLS certificate\n"
-msgstr ""
-
-#: src/lib/tls.c:416
-msgid "Error creating file descriptor-based BIO"
-msgstr ""
-
-#: src/lib/tls.c:427
-msgid "Error creating new SSL object"
-msgstr ""
-
-#: src/lib/tls.c:493 src/lib/tls.c:510
-msgid "Connect failure"
-msgstr ""
-
-#: src/lib/tls.c:587 src/lib/tls.c:591
-msgid "TLS shutdown failure."
-msgstr ""
-
-#: src/lib/tls.c:642 src/lib/tls.c:658
-msgid "TLS read/write failure."
-msgstr ""
-
-#: src/lib/tls.c:716 src/lib/tls.c:773 src/stored/dev.c:212
-#: src/stored/dev.c:230 src/stored/dev.c:236 src/stored/stored_conf.c:550
-#, c-format
-msgid "Unable to init mutex: ERR=%s\n"
-msgstr ""
-
-#: src/lib/tls.c:736 src/lib/tls.c:805
-#, c-format
-msgid "Unable to destroy mutex: ERR=%s\n"
-msgstr ""
-
-#: src/lib/tls.c:870
-#, c-format
-msgid "Unable to init OpenSSL threading: ERR=%s\n"
-msgstr ""
-
-#: src/lib/tls.c:880
-msgid "Failed to seed OpenSSL PRNG\n"
-msgstr ""
-
-#: src/lib/tls.c:906
-msgid "Failed to save OpenSSL PRNG\n"
-msgstr ""
-
-#: src/stored/acquire.c:98
-#, c-format
-msgid "Hey! num_writers=%d!!!!\n"
-msgstr ""
-
-#: src/stored/acquire.c:146
-#, c-format
-msgid "Num_writers=%d not zero. Job %d canceled.\n"
-msgstr ""
-
-#: src/stored/acquire.c:154
-#, c-format
-msgid "No volumes specified. Job %d canceled.\n"
+#: src/stored/ansi_label.c:148
+msgid "No HDR1 label while reading ANSI label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:182 src/stored/mount.c:72
+#: src/stored/ansi_label.c:154
 #, c-format
-msgid "Job %d canceled.\n"
+msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
 msgstr ""
 
-#: src/stored/acquire.c:193
-#, c-format
-msgid "Open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
+#: src/stored/ansi_label.c:165
+msgid "No HDR2 label while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:208
-#, c-format
-msgid "Open device %s Volume \"%s\" failed: ERR=%s\n"
+#: src/stored/ansi_label.c:179
+msgid "Unknown or bad ANSI/IBM label record.\n"
 msgstr ""
 
-#: src/stored/acquire.c:273 src/stored/mount.c:66
-#, c-format
-msgid "Too many errors trying to mount device %s.\n"
+#: src/stored/ansi_label.c:186
+msgid "Too many records in while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:282
+#: src/stored/ansi_label.c:285
 #, c-format
-msgid "Ready to read from volume \"%s\" on device %s.\n"
+msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
 msgstr ""
 
-#: src/stored/acquire.c:328 src/stored/reserve.c:664
+#: src/stored/ansi_label.c:302
 #, c-format
-msgid "Device %s is busy reading.\n"
+msgid "Could not write ANSI VOL1 label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/acquire.c:358
+#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
 #, c-format
-msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
+msgid "Could not write ANSI HDR1 label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/acquire.c:377
-#, c-format
-msgid ""
-"Cannot recycle volume \"%s\" on device %s because it is in use by another "
-"job.\n"
+#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
+msgid "Could not write ANSI HDR1 label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:399
+#: src/stored/ansi_label.c:381
 #, c-format
-msgid "Could not ready device %s for append.\n"
+msgid "Error writing EOF to tape. ERR=%s"
 msgstr ""
 
-#: src/stored/acquire.c:464 src/stored/block.c:353 src/stored/block.c:676
-#: src/stored/block.c:744
-#, c-format
-msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
+#: src/stored/ansi_label.c:386
+msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
 msgstr ""
 
-#: src/stored/acquire.c:506
-#, c-format
-msgid "Alert: %s"
+#: src/stored/append.c:49
+msgid "DCR is NULL!!!\n"
 msgstr ""
 
-#: src/stored/acquire.c:514
-#, c-format
-msgid "3997 Bad alert command: %s: ERR=%s.\n"
+#: src/stored/append.c:54
+msgid "DEVICE is NULL!!!\n"
 msgstr ""
 
-#: src/stored/append.c:60
+#: src/stored/append.c:66
 msgid "Unable to set network buffer size.\n"
 msgstr ""
 
-#: src/stored/append.c:73 src/stored/append.c:82 src/stored/append.c:94
-#: src/stored/append.c:249 src/stored/append.c:264 src/stored/append.c:276
-#: src/stored/askdir.c:284 src/stored/askdir.c:285
+#: src/stored/append.c:79 src/stored/append.c:88 src/stored/append.c:100
+#: src/stored/append.c:256 src/stored/append.c:271 src/stored/append.c:283
+#: src/stored/askdir.c:291 src/stored/askdir.c:292
 msgid "NULL Volume name. This shouldn't happen!!!\n"
 msgstr ""
 
-#: src/stored/append.c:88 src/stored/btape.c:1853
+#: src/stored/append.c:94 src/stored/btape.c:1854
 #, c-format
 msgid "Write session label failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:100
+#: src/stored/append.c:106
 #, c-format
 msgid "Network send error to FD. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:137
+#: src/stored/append.c:143
 #, c-format
 msgid "Error reading data header from FD. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:159
+#: src/stored/append.c:165
 #, c-format
 msgid "Malformed data header from FD: %s\n"
 msgstr ""
 
-#: src/stored/append.c:169
+#: src/stored/append.c:175
 msgid "File index from FD not positive or sequential\n"
 msgstr ""
 
-#: src/stored/append.c:199 src/stored/append.c:269 src/stored/spool.c:247
+#: src/stored/append.c:206 src/stored/append.c:276 src/stored/spool.c:248
 #, c-format
 msgid "Fatal append error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:224
+#: src/stored/append.c:231
 #, c-format
 msgid "Error updating file attributes. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:237
+#: src/stored/append.c:244
 #, c-format
 msgid "Network error on data channel. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:258 src/stored/btape.c:1969
+#: src/stored/append.c:265 src/stored/btape.c:1976
 #, c-format
 msgid "Error writting end session label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:271
+#: src/stored/append.c:278
 msgid "Set ok=FALSE after write_block_to_device.\n"
 msgstr ""
 
@@ -8541,41 +8615,34 @@ msgstr ""
 
 #: src/stored/askdir.c:178
 #, c-format
-msgid "Error getting Volume info: %s\n"
+msgid "Error getting Volume info: %s"
 msgstr ""
 
-#: src/stored/askdir.c:289 src/stored/askdir.c:290
+#: src/stored/askdir.c:296 src/stored/askdir.c:297
 msgid "Attempt to update_volume_info in read mode!!!\n"
 msgstr ""
 
-#: src/stored/askdir.c:318
+#: src/stored/askdir.c:325
 #, c-format
 msgid "Didn't get vol info vol=%s: ERR=%s"
 msgstr ""
 
-#: src/stored/askdir.c:349
+#: src/stored/askdir.c:356
 #, c-format
 msgid "Error creating JobMedia record: ERR=%s\n"
 msgstr ""
 
-#: src/stored/askdir.c:356
+#: src/stored/askdir.c:363
 #, c-format
 msgid "Error creating JobMedia record: %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:424
+#: src/stored/askdir.c:429
 #, c-format
 msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n"
 msgstr ""
 
-#: src/stored/askdir.c:452
-#, c-format
-msgid ""
-"Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
-"Use \"mount\" command to release Job.\n"
-msgstr ""
-
-#: src/stored/askdir.c:462
+#: src/stored/askdir.c:442
 #, c-format
 msgid ""
 "Job %s waiting. Cannot find any appendable volumes.\n"
@@ -8585,45 +8652,31 @@ msgid ""
 "    Pool:         %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:486 src/stored/askdir.c:588
+#: src/stored/askdir.c:466 src/stored/askdir.c:548
 #, c-format
 msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:496 src/stored/askdir.c:503
-#, c-format
-msgid "pthread error in mount_next_volume stat=%d ERR=%s\n"
-msgstr ""
-
-#: src/stored/askdir.c:514
-#, c-format
-msgid ""
-"Someone woke me up, but I cannot find any appendable\n"
-"volumes for Job=%s.\n"
+#: src/stored/askdir.c:476
+msgid "pthread error in mount_next_volume.\n"
 msgstr ""
 
-#: src/stored/askdir.c:558
+#: src/stored/askdir.c:508
 msgid "Cannot request another volume: no volume name given.\n"
 msgstr ""
 
-#: src/stored/askdir.c:564
+#: src/stored/askdir.c:514
 #, c-format
 msgid "Job %s canceled while waiting for mount on Storage Device %s.\n"
 msgstr ""
 
-#: src/stored/askdir.c:570
+#: src/stored/askdir.c:529
 #, c-format
 msgid "Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:598
-#, c-format
-msgid "pthread error in mount_volume stat=%d ERR=%s\n"
-msgstr ""
-
-#: src/stored/askdir.c:605
-#, c-format
-msgid "pthread error in mount_next_volume stat=%d: ERR=%s\n"
+#: src/stored/askdir.c:558
+msgid "pthread error in mount_volume\n"
 msgstr ""
 
 #: src/stored/authenticate.c:53
@@ -8651,71 +8704,91 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:95
+#: src/stored/autochanger.c:53
+#, c-format
+msgid "No Changer Name given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:59
+#, c-format
+msgid "No Changer Command given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:72
+#, c-format
+msgid ""
+"Media Type not the same for all devices in changer %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:152
 #, c-format
 msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:102
+#: src/stored/autochanger.c:161
 #, c-format
 msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:108
+#: src/stored/autochanger.c:167
 #, c-format
 msgid "3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:153
+#: src/stored/autochanger.c:208
+msgid "3992 Missing Changer command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:218
 #, c-format
 msgid "3301 Issuing autochanger \"loaded drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:162
+#: src/stored/autochanger.c:227
 #, c-format
 msgid "3302 Autochanger \"loaded drive %d\", result is Slot %d.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:166
+#: src/stored/autochanger.c:231
 #, c-format
 msgid "3302 Autochanger \"loaded drive %d\", result: nothing loaded.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:173
+#: src/stored/autochanger.c:238
 #, c-format
 msgid "3991 Bad autochanger \"loaded drive %d\" command: ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:234 src/stored/autochanger.c:304
+#: src/stored/autochanger.c:297 src/stored/autochanger.c:380
 #, c-format
 msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:247 src/stored/autochanger.c:325
+#: src/stored/autochanger.c:310 src/stored/autochanger.c:401
 #, c-format
 msgid "3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:290
+#: src/stored/autochanger.c:369
 #, c-format
 msgid "Volume %s is in use by device %s\n"
 msgstr ""
 
-#: src/stored/autochanger.c:358
+#: src/stored/autochanger.c:439
 #, c-format
 msgid "3993 Device %s not an autochanger device.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:372
+#: src/stored/autochanger.c:464
 #, c-format
 msgid "3306 Issuing autochanger \"%s\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:377
+#: src/stored/autochanger.c:467
 msgid "3996 Open bpipe failed.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:401
+#: src/stored/autochanger.c:494
 #, c-format
 msgid "Autochanger error: ERR=%s\n"
 msgstr ""
@@ -8744,7 +8817,7 @@ msgstr ""
 msgid "Wrong number of arguments: \n"
 msgstr ""
 
-#: src/stored/bcopy.c:172 src/stored/btape.c:334 src/stored/device.c:273
+#: src/stored/bcopy.c:172 src/stored/btape.c:333 src/stored/device.c:266
 #, c-format
 msgid "dev open failed: %s\n"
 msgstr ""
@@ -8758,7 +8831,7 @@ msgstr ""
 msgid "%u Jobs copied. %u records copied.\n"
 msgstr ""
 
-#: src/stored/bcopy.c:205 src/stored/bscan.c:389
+#: src/stored/bcopy.c:205 src/stored/bscan.c:390
 #, c-format
 msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n"
 msgstr ""
@@ -8772,7 +8845,7 @@ msgid "Volume label not copied.\n"
 msgstr ""
 
 #: src/stored/bcopy.c:235 src/stored/bcopy.c:242 src/stored/bcopy.c:265
-#: src/stored/btape.c:2335
+#: src/stored/btape.c:2342
 #, c-format
 msgid "Cannot fixup device error. %s\n"
 msgstr ""
@@ -8785,8 +8858,8 @@ msgstr ""
 msgid "EOT label not copied.\n"
 msgstr ""
 
-#: src/stored/bcopy.c:290 src/stored/bextract.c:473 src/stored/bls.c:444
-#: src/stored/bscan.c:1227 src/stored/btape.c:2683
+#: src/stored/bcopy.c:287 src/stored/bextract.c:476 src/stored/bls.c:440
+#: src/stored/bscan.c:1231 src/stored/btape.c:2690
 #, c-format
 msgid "Mount Volume \"%s\" on device %s and press return when ready: "
 msgstr ""
@@ -8812,12 +8885,12 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bextract.c:127 src/stored/bls.c:129
+#: src/stored/bextract.c:127 src/stored/bls.c:128
 #, c-format
 msgid "Could not open exclude file: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/bextract.c:142 src/stored/bls.c:143
+#: src/stored/bextract.c:142 src/stored/bls.c:142
 #, c-format
 msgid "Could not open include file: %s, ERR=%s\n"
 msgstr ""
@@ -8847,11 +8920,11 @@ msgstr ""
 msgid "%u files restored.\n"
 msgstr ""
 
-#: src/stored/bextract.c:278 src/stored/bextract.c:444
+#: src/stored/bextract.c:278 src/stored/bextract.c:450
 msgid "Logic error output file should be open but is not.\n"
 msgstr ""
 
-#: src/stored/bextract.c:285 src/stored/bls.c:365 src/stored/bscan.c:645
+#: src/stored/bextract.c:285 src/stored/bls.c:364 src/stored/bscan.c:647
 msgid "Cannot continue.\n"
 msgstr ""
 
@@ -8869,176 +8942,178 @@ msgstr ""
 msgid "===Write error===\n"
 msgstr ""
 
-#: src/stored/bextract.c:435
+#: src/stored/bextract.c:441
 msgid "Got Program Name or Data Stream. Ignored.\n"
 msgstr ""
 
-#: src/stored/block.c:78
+#: src/stored/block.c:79
 #, c-format
 msgid ""
 "Dump block %s %x: size=%d BlkNum=%d\n"
 "               Hdrcksum=%x cksum=%x\n"
 msgstr ""
 
-#: src/stored/block.c:91
+#: src/stored/block.c:92
 #, c-format
 msgid "   Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n"
 msgstr ""
 
-#: src/stored/block.c:147
+#: src/stored/block.c:148
 #, c-format
 msgid "%d block read errors not printed.\n"
 msgstr ""
 
-#: src/stored/block.c:235 src/stored/block.c:251 src/stored/block.c:261
+#: src/stored/block.c:236 src/stored/block.c:252 src/stored/block.c:262
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer "
 "discarded.\n"
 msgstr ""
 
-#: src/stored/block.c:275
+#: src/stored/block.c:276
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Block length %u is insane (too large), probably "
 "due to a bad archive.\n"
 msgstr ""
 
-#: src/stored/block.c:301
+#: src/stored/block.c:302
 #, c-format
 msgid ""
 "Volume data error at %u:%u!\n"
 "Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n"
 msgstr ""
 
-#: src/stored/block.c:409
+#: src/stored/block.c:410
 msgid "Cannot write block. Device at EOM.\n"
 msgstr ""
 
-#: src/stored/block.c:414
+#: src/stored/block.c:415
 msgid "Attempt to write on read-only Volume.\n"
 msgstr ""
 
-#: src/stored/block.c:466
+#: src/stored/block.c:467
 #, c-format
 msgid "User defined maximum volume capacity %s exceeded on device %s.\n"
 msgstr ""
 
-#: src/stored/block.c:481
+#: src/stored/block.c:482
 #, c-format
 msgid "Unable to write EOF. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:507 src/stored/block.c:518
+#: src/stored/block.c:508 src/stored/block.c:519
 msgid "Write block header zeroed.\n"
 msgstr ""
 
-#: src/stored/block.c:536
+#: src/stored/block.c:537
 #, c-format
 msgid "Write error at %u:%u on device %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/block.c:543
+#: src/stored/block.c:544
 #, c-format
 msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"
 msgstr ""
 
-#: src/stored/block.c:618 src/stored/block.c:624
+#: src/stored/block.c:619 src/stored/block.c:625
 #, c-format
 msgid "Backspace file at EOT failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:631
+#: src/stored/block.c:632
 #, c-format
 msgid "Backspace record at EOT failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:648
+#: src/stored/block.c:649
 #, c-format
 msgid "Re-read last block at EOT failed. ERR=%s"
 msgstr ""
 
-#: src/stored/block.c:652
-msgid "Re-read of last block succeeded.\n"
+#: src/stored/block.c:659
+#, c-format
+msgid ""
+"Re-read of last block OK, but block numbers differ. Last block=%u Current "
+"block=%u.\n"
 msgstr ""
 
-#: src/stored/block.c:655
-#, c-format
-msgid "Re-read of last block failed. Last block=%u Current block=%u.\n"
+#: src/stored/block.c:662
+msgid "Re-read of last block succeeded.\n"
 msgstr ""
 
-#: src/stored/block.c:684
+#: src/stored/block.c:690
 #, c-format
 msgid ""
-"Error writing final EOF to tape. This tape may not be readable.\n"
+"Error writing final EOF to tape. This Volume may not be readable.\n"
 "%s"
 msgstr ""
 
-#: src/stored/block.c:790 src/stored/dvd.c:622
+#: src/stored/block.c:800 src/stored/dvd.c:689
 #, c-format
 msgid ""
 "Error while writing, current part number is less than the total number of "
 "parts (%d/%d, device=%s)\n"
 msgstr ""
 
-#: src/stored/block.c:798 src/stored/block.c:908
+#: src/stored/block.c:808 src/stored/block.c:918
 #, c-format
 msgid "Unable to open device next part %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:816
+#: src/stored/block.c:826
 #, c-format
 msgid ""
 "End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
 "free_space_errno=%d, errmsg=%s).\n"
 msgstr ""
 
-#: src/stored/block.c:829
+#: src/stored/block.c:839
 #, c-format
 msgid ""
 "End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
 "free_space_errno=%d).\n"
 msgstr ""
 
-#: src/stored/block.c:883
+#: src/stored/block.c:893
 #, c-format
 msgid "Block buffer size looping problem on device %s\n"
 msgstr ""
 
-#: src/stored/block.c:934
+#: src/stored/block.c:944
 #, c-format
 msgid "Read error at file:blk %u:%u on device %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/block.c:947
+#: src/stored/block.c:957
 #, c-format
 msgid "Read zero bytes at %u:%u on device %s.\n"
 msgstr ""
 
-#: src/stored/block.c:960
+#: src/stored/block.c:970
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Very short block of %d bytes on device %s "
 "discarded.\n"
 msgstr ""
 
-#: src/stored/block.c:985
+#: src/stored/block.c:995
 #, c-format
 msgid "Block length %u is greater than buffer %u. Attempting recovery.\n"
 msgstr ""
 
-#: src/stored/block.c:1004
+#: src/stored/block.c:1014
 #, c-format
 msgid "Setting block buffer size to %u bytes.\n"
 msgstr ""
 
-#: src/stored/block.c:1019
+#: src/stored/block.c:1029
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n"
 msgstr ""
 
-#: src/stored/bls.c:69
+#: src/stored/bls.c:68
 #, c-format
 msgid ""
 "Copyright (C) 2000-2005 Kern Sibbald.\n"
@@ -9062,74 +9137,74 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bls.c:190
+#: src/stored/bls.c:189
 msgid "No archive name specified\n"
 msgstr ""
 
-#: src/stored/bls.c:226
+#: src/stored/bls.c:224
 #, c-format
 msgid ""
 "\n"
 "Warning, this Volume is a continuation of Volume %s\n"
 msgstr ""
 
-#: src/stored/bls.c:268
+#: src/stored/bls.c:267
 #, c-format
 msgid "Got EOM at file %u on device %s, Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/bls.c:279
+#: src/stored/bls.c:278
 #, c-format
 msgid "Mounted Volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/bls.c:281
+#: src/stored/bls.c:280
 #, c-format
-msgid "Got EOF at file %u on device %s, Volume \"%s\"\n"
+msgid "End of file %u on device %s, Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/bls.c:305
+#: src/stored/bls.c:304
 #, c-format
 msgid ""
 "File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
 "s rlen=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:314
+#: src/stored/bls.c:313
 #, c-format
 msgid "Block: %d size=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:381
+#: src/stored/bls.c:380
 #, c-format
 msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:398 src/stored/read_record.c:321
+#: src/stored/bls.c:397 src/stored/read_record.c:322
 msgid "Fresh Volume Label"
 msgstr ""
 
-#: src/stored/bls.c:401 src/stored/read_record.c:324
+#: src/stored/bls.c:400 src/stored/read_record.c:325
 msgid "Volume Label"
 msgstr ""
 
-#: src/stored/bls.c:405 src/stored/label.c:959
+#: src/stored/bls.c:404 src/stored/label.c:969
 msgid "Begin Job Session"
 msgstr ""
 
-#: src/stored/bls.c:409 src/stored/label.c:962
+#: src/stored/bls.c:408 src/stored/label.c:972
 msgid "End Job Session"
 msgstr ""
 
-#: src/stored/bls.c:412
+#: src/stored/bls.c:411
 msgid "End of Medium"
 msgstr ""
 
-#: src/stored/bls.c:415 src/stored/label.c:971
+#: src/stored/bls.c:414 src/stored/label.c:981
 msgid "Unknown"
 msgstr ""
 
-#: src/stored/bls.c:421 src/stored/read_record.c:342
+#: src/stored/bls.c:420 src/stored/read_record.c:343
 #, c-format
 msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n"
 msgstr ""
@@ -9161,12 +9236,12 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bscan.c:234 src/stored/stored.c:266
+#: src/stored/bscan.c:234 src/stored/stored.c:267
 #, c-format
 msgid "No Storage resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/bscan.c:242 src/stored/stored.c:297
+#: src/stored/bscan.c:242 src/stored/stored.c:298
 #, c-format
 msgid "No Working Directory defined in %s. Cannot continue.\n"
 msgstr ""
@@ -9181,7 +9256,7 @@ msgstr ""
 msgid "Working Directory: %s is not a directory. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/bscan.c:268 src/stored/bscan.c:340
+#: src/stored/bscan.c:268 src/stored/bscan.c:341
 #, c-format
 msgid "First Volume Size = %sn"
 msgstr ""
@@ -9200,235 +9275,235 @@ msgstr ""
 msgid "Create JobMedia for Job %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:325
+#: src/stored/bscan.c:326
 #, c-format
 msgid "Could not create JobMedia record for Volume=%s Job=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:381
+#: src/stored/bscan.c:382
 #, c-format
 msgid "done: %d%%\n"
 msgstr ""
 
-#: src/stored/bscan.c:405
+#: src/stored/bscan.c:406
 msgid "Volume is prelabeled. This tape cannot be scanned.\n"
 msgstr ""
 
-#: src/stored/bscan.c:417
+#: src/stored/bscan.c:418
 #, c-format
 msgid "Pool record for %s found in DB.\n"
 msgstr ""
 
-#: src/stored/bscan.c:421
+#: src/stored/bscan.c:422
 #, c-format
 msgid "VOL_LABEL: Pool record not found for Pool: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:427
+#: src/stored/bscan.c:428
 #, c-format
 msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:431
+#: src/stored/bscan.c:432
 #, c-format
 msgid "Pool type \"%s\" is OK.\n"
 msgstr ""
 
-#: src/stored/bscan.c:441
+#: src/stored/bscan.c:442
 #, c-format
 msgid "Media record for %s found in DB.\n"
 msgstr ""
 
-#: src/stored/bscan.c:448
+#: src/stored/bscan.c:449
 #, c-format
 msgid "VOL_LABEL: Media record not found for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:455
+#: src/stored/bscan.c:456
 #, c-format
 msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:459
+#: src/stored/bscan.c:460
 #, c-format
 msgid "Media type \"%s\" is OK.\n"
 msgstr ""
 
-#: src/stored/bscan.c:468
+#: src/stored/bscan.c:469
 #, c-format
 msgid "VOL_LABEL: OK for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:475
+#: src/stored/bscan.c:476
 #, c-format
 msgid "%d \"errors\" ignored before first Start of Session record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:486
+#: src/stored/bscan.c:487
 #, c-format
 msgid "SOS_LABEL: Found Job record for JobId: %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:491
+#: src/stored/bscan.c:492
 #, c-format
 msgid "SOS_LABEL: Job record not found for JobId: %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:531
+#: src/stored/bscan.c:532
 #, c-format
 msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:537
+#: src/stored/bscan.c:538
 #, c-format
 msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:543
+#: src/stored/bscan.c:544
 #, c-format
 msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:561 src/stored/bscan.c:1007
+#: src/stored/bscan.c:562 src/stored/bscan.c:1013
 #, c-format
 msgid "Could not find SessId=%d SessTime=%d for EOS record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:604
+#: src/stored/bscan.c:606
 #, c-format
 msgid "Could not update job record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:615
+#: src/stored/bscan.c:617
 #, c-format
 msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:627
+#: src/stored/bscan.c:629
 #, c-format
 msgid "Could not find Job for SessId=%d SessTime=%d record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:663
+#: src/stored/bscan.c:665
 #, c-format
 msgid "%s file records. At file:blk=%s:%s bytes=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:706
+#: src/stored/bscan.c:708
 #, c-format
 msgid "Got MD5 record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:715
+#: src/stored/bscan.c:717
 #, c-format
 msgid "Got SHA1 record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:723
+#: src/stored/bscan.c:725
 #, c-format
 msgid "Got Prog Names Stream: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:729
+#: src/stored/bscan.c:731
 msgid "Got Prog Data Stream record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:733
+#: src/stored/bscan.c:735
 #, c-format
 msgid "Unknown stream type!!! stream=%d data=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:793
+#: src/stored/bscan.c:799
 #, c-format
 msgid "Could not create File Attributes record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:799
+#: src/stored/bscan.c:805
 #, c-format
 msgid "Created File record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:836
+#: src/stored/bscan.c:842
 #, c-format
 msgid "Could not create media record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:840 src/stored/bscan.c:861
+#: src/stored/bscan.c:846 src/stored/bscan.c:867
 #, c-format
 msgid "Could not update media record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:844
+#: src/stored/bscan.c:850
 #, c-format
 msgid "Created Media record for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:865
+#: src/stored/bscan.c:871
 #, c-format
 msgid "Updated Media record at end of Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:882
+#: src/stored/bscan.c:888
 #, c-format
 msgid "Could not create pool record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:886
+#: src/stored/bscan.c:892
 #, c-format
 msgid "Created Pool record for Pool: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:906
+#: src/stored/bscan.c:912
 #, c-format
 msgid "Created Client record for Client: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:923
+#: src/stored/bscan.c:929
 #, c-format
 msgid "Fileset \"%s\" already exists.\n"
 msgstr ""
 
-#: src/stored/bscan.c:927
+#: src/stored/bscan.c:933
 #, c-format
 msgid "Could not create FileSet record \"%s\". ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:932
+#: src/stored/bscan.c:938
 #, c-format
 msgid "Created FileSet record \"%s\"\n"
 msgstr ""
 
-#: src/stored/bscan.c:979
+#: src/stored/bscan.c:985
 #, c-format
 msgid "Could not create JobId record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:985
+#: src/stored/bscan.c:991
 #, c-format
 msgid "Could not update job start record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:988
+#: src/stored/bscan.c:994
 #, c-format
 msgid "Created new JobId=%u record for original JobId=%u\n"
 msgstr ""
 
-#: src/stored/bscan.c:1038
+#: src/stored/bscan.c:1044
 #, c-format
 msgid "Could not update JobId=%u record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1043
+#: src/stored/bscan.c:1049
 #, c-format
 msgid "Updated Job termination record for JobId=%u TermStat=%c\n"
 msgstr ""
 
-#: src/stored/bscan.c:1065
+#: src/stored/bscan.c:1071
 #, c-format
 msgid "Job Termination code: %d"
 msgstr ""
 
-#: src/stored/bscan.c:1070
+#: src/stored/bscan.c:1076
 #, c-format
 msgid ""
 "%s\n"
@@ -9448,27 +9523,27 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bscan.c:1134
+#: src/stored/bscan.c:1140
 #, c-format
 msgid "Could not create JobMedia record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1138
+#: src/stored/bscan.c:1144
 #, c-format
 msgid "Created JobMedia record JobId %d, MediaId %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:1154
+#: src/stored/bscan.c:1160
 #, c-format
 msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:1168
+#: src/stored/bscan.c:1174
 #, c-format
 msgid "Could not add MD5/SHA1 to File record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1173
+#: src/stored/bscan.c:1179
 msgid "Updated MD5/SHA1 record\n"
 msgstr ""
 
@@ -9519,140 +9594,140 @@ msgstr ""
 msgid "Improper number of arguments specified.\n"
 msgstr ""
 
-#: src/stored/btape.c:340
+#: src/stored/btape.c:338
 #, c-format
 msgid "open device %s: OK\n"
 msgstr ""
 
-#: src/stored/btape.c:361
+#: src/stored/btape.c:359
 msgid "Enter Volume Name: "
 msgstr ""
 
-#: src/stored/btape.c:368
+#: src/stored/btape.c:366
 #, c-format
 msgid "Device open failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:373
+#: src/stored/btape.c:371
 #, c-format
 msgid "Wrote Volume label for volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/btape.c:387
+#: src/stored/btape.c:385
 msgid "Volume has no label.\n"
 msgstr ""
 
-#: src/stored/btape.c:390
+#: src/stored/btape.c:388
 msgid "Volume label read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:393
+#: src/stored/btape.c:391
 #, c-format
 msgid "I/O error on device: ERR=%s"
 msgstr ""
 
-#: src/stored/btape.c:396
+#: src/stored/btape.c:394
 msgid "Volume name error\n"
 msgstr ""
 
-#: src/stored/btape.c:399
+#: src/stored/btape.c:397
 #, c-format
 msgid "Error creating label. ERR=%s"
 msgstr ""
 
-#: src/stored/btape.c:402
+#: src/stored/btape.c:400
 msgid "Volume version error.\n"
 msgstr ""
 
-#: src/stored/btape.c:405
+#: src/stored/btape.c:403
 msgid "Bad Volume label type.\n"
 msgstr ""
 
-#: src/stored/btape.c:408
+#: src/stored/btape.c:406
 msgid "Unknown error.\n"
 msgstr ""
 
-#: src/stored/btape.c:426
+#: src/stored/btape.c:424
 #, c-format
 msgid "Bad status from load. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:428
+#: src/stored/btape.c:426
 #, c-format
 msgid "Loaded %s\n"
 msgstr ""
 
-#: src/stored/btape.c:437 src/stored/btape.c:777 src/stored/btape.c:819
-#: src/stored/btape.c:889 src/stored/btape.c:931 src/stored/btape.c:1200
+#: src/stored/btape.c:435 src/stored/btape.c:775 src/stored/btape.c:817
+#: src/stored/btape.c:887 src/stored/btape.c:929 src/stored/btape.c:1198
 #, c-format
 msgid "Bad status from rewind. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:440 src/stored/btape.c:1208
+#: src/stored/btape.c:438 src/stored/btape.c:1206
 #, c-format
 msgid "Rewound %s\n"
 msgstr ""
 
-#: src/stored/btape.c:467 src/stored/btape.c:1212
+#: src/stored/btape.c:465 src/stored/btape.c:1210
 #, c-format
 msgid "Bad status from weof %d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:471
+#: src/stored/btape.c:469
 #, c-format
 msgid "Wrote 1 EOF to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:474
+#: src/stored/btape.c:472
 #, c-format
 msgid "Wrote %d EOFs to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:492
+#: src/stored/btape.c:490
 msgid "Moved to end of medium.\n"
 msgstr ""
 
-#: src/stored/btape.c:519
+#: src/stored/btape.c:517
 #, c-format
 msgid "Bad status from bsf. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:521
+#: src/stored/btape.c:519
 #, c-format
 msgid "Backspaced %d file%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:538
+#: src/stored/btape.c:536
 #, c-format
 msgid "Bad status from bsr. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:540
+#: src/stored/btape.c:538
 #, c-format
 msgid "Backspaced %d record%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:550 src/stored/status.c:220
+#: src/stored/btape.c:548 src/stored/status.c:227
 #, c-format
 msgid "Configured device capabilities:\n"
 msgstr ""
 
-#: src/stored/btape.c:568
+#: src/stored/btape.c:566
 #, c-format
 msgid "Device status:\n"
 msgstr ""
 
-#: src/stored/btape.c:582 src/stored/status.c:252
+#: src/stored/btape.c:580 src/stored/status.c:259
 #, c-format
 msgid "Device parameters:\n"
 msgstr ""
 
-#: src/stored/btape.c:587
+#: src/stored/btape.c:585
 #, c-format
 msgid "Status:\n"
 msgstr ""
 
-#: src/stored/btape.c:602
+#: src/stored/btape.c:600
 msgid ""
 "Test writting larger and larger records.\n"
 "This is a torture test for records.\n"
@@ -9661,20 +9736,20 @@ msgid ""
 "plus the header exceeds the block size (by default about 64K)\n"
 msgstr ""
 
-#: src/stored/btape.c:610 src/stored/btape.c:1814
+#: src/stored/btape.c:608 src/stored/btape.c:1815
 msgid "Command aborted.\n"
 msgstr ""
 
-#: src/stored/btape.c:626
+#: src/stored/btape.c:624
 #, c-format
 msgid "Block %d i=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:652
+#: src/stored/btape.c:650
 msgid "Skipping read backwards test because BSR turned off.\n"
 msgstr ""
 
-#: src/stored/btape.c:656
+#: src/stored/btape.c:654
 msgid ""
 "\n"
 "=== Write, backup, and re-read test ===\n"
@@ -9688,73 +9763,73 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:669 src/stored/btape.c:680 src/stored/btape.c:691
-#: src/stored/btape.c:789 src/stored/btape.c:805 src/stored/btape.c:901
-#: src/stored/btape.c:917 src/stored/btape.c:1526 src/stored/btape.c:2400
+#: src/stored/btape.c:667 src/stored/btape.c:678 src/stored/btape.c:689
+#: src/stored/btape.c:787 src/stored/btape.c:803 src/stored/btape.c:899
+#: src/stored/btape.c:915 src/stored/btape.c:1524 src/stored/btape.c:2407
 msgid "Error writing record to block.\n"
 msgstr ""
 
-#: src/stored/btape.c:673 src/stored/btape.c:684 src/stored/btape.c:695
-#: src/stored/btape.c:793 src/stored/btape.c:809 src/stored/btape.c:905
-#: src/stored/btape.c:921 src/stored/btape.c:1530 src/stored/btape.c:2404
+#: src/stored/btape.c:671 src/stored/btape.c:682 src/stored/btape.c:693
+#: src/stored/btape.c:791 src/stored/btape.c:807 src/stored/btape.c:903
+#: src/stored/btape.c:919 src/stored/btape.c:1528 src/stored/btape.c:2411
 msgid "Error writing block to device.\n"
 msgstr ""
 
-#: src/stored/btape.c:676
+#: src/stored/btape.c:674
 #, c-format
 msgid "Wrote first record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:687
+#: src/stored/btape.c:685
 #, c-format
 msgid "Wrote second record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:698
+#: src/stored/btape.c:696
 #, c-format
 msgid "Wrote third record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:705 src/stored/btape.c:710
+#: src/stored/btape.c:703 src/stored/btape.c:708
 #, c-format
 msgid "Backspace file failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:714
+#: src/stored/btape.c:712
 msgid "Backspaced over EOF OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:716
+#: src/stored/btape.c:714
 #, c-format
 msgid "Backspace record failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:719
+#: src/stored/btape.c:717
 msgid "Backspace record OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:722 src/stored/btape.c:728
+#: src/stored/btape.c:720 src/stored/btape.c:726
 #, c-format
 msgid "Read block failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:733
+#: src/stored/btape.c:731
 msgid "Bad data in record. Test failed!\n"
 msgstr ""
 
-#: src/stored/btape.c:737
+#: src/stored/btape.c:735
 msgid ""
 "\n"
 "Block re-read correct. Test succeeded!\n"
 msgstr ""
 
-#: src/stored/btape.c:738
+#: src/stored/btape.c:736
 msgid ""
 "=== End Write, backup, and re-read test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:745
+#: src/stored/btape.c:743
 msgid ""
 "This is not terribly serious since Bacula only uses\n"
 "this function to verify the last block written to the\n"
@@ -9766,7 +9841,7 @@ msgid ""
 "to your Storage daemon's Device resource definition.\n"
 msgstr ""
 
-#: src/stored/btape.c:769
+#: src/stored/btape.c:767
 msgid ""
 "\n"
 "=== Write, rewind, and re-read test ===\n"
@@ -9779,46 +9854,46 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:797 src/stored/btape.c:813 src/stored/btape.c:909
-#: src/stored/btape.c:925
+#: src/stored/btape.c:795 src/stored/btape.c:811 src/stored/btape.c:907
+#: src/stored/btape.c:923
 #, c-format
 msgid "Wrote 1000 blocks of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:822 src/stored/btape.c:934
+#: src/stored/btape.c:820 src/stored/btape.c:932
 msgid "Rewind OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:829 src/stored/btape.c:983
+#: src/stored/btape.c:827 src/stored/btape.c:981
 msgid "Got EOF on tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:834
+#: src/stored/btape.c:832
 #, c-format
 msgid "Read block %d failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:840
+#: src/stored/btape.c:838
 #, c-format
 msgid "Read record failed. Block %d! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:846 src/stored/btape.c:1013
+#: src/stored/btape.c:844 src/stored/btape.c:1011
 #, c-format
 msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"
 msgstr ""
 
-#: src/stored/btape.c:853
+#: src/stored/btape.c:851
 msgid "1000 blocks re-read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:856 src/stored/btape.c:1020
+#: src/stored/btape.c:854 src/stored/btape.c:1018
 msgid ""
 "=== Test Succeeded. End Write, rewind, and re-read test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:881
+#: src/stored/btape.c:879
 msgid ""
 "\n"
 "=== Write, rewind, and position test ===\n"
@@ -9831,23 +9906,23 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:974
+#: src/stored/btape.c:972
 #, c-format
 msgid "Reposition to file:block %d:%d\n"
 msgstr ""
 
-#: src/stored/btape.c:976
+#: src/stored/btape.c:974
 msgid "Reposition error.\n"
 msgstr ""
 
-#: src/stored/btape.c:989
+#: src/stored/btape.c:987
 #, c-format
 msgid ""
 "Read block %d failed! file=%d blk=%d. ERR=%s\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:991
+#: src/stored/btape.c:989
 msgid ""
 "This may be because the tape drive block size is not\n"
 " set to variable blocking as normally used by Bacula.\n"
@@ -9861,17 +9936,17 @@ msgid ""
 " in your Device resource.\n"
 msgstr ""
 
-#: src/stored/btape.c:1007
+#: src/stored/btape.c:1005
 #, c-format
 msgid "Read record failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1018
+#: src/stored/btape.c:1016
 #, c-format
 msgid "Block %d re-read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:1039
+#: src/stored/btape.c:1037
 msgid ""
 "\n"
 "\n"
@@ -9885,58 +9960,58 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1063
+#: src/stored/btape.c:1061
 msgid "Now moving to end of medium.\n"
 msgstr ""
 
-#: src/stored/btape.c:1065 src/stored/btape.c:1295
+#: src/stored/btape.c:1063 src/stored/btape.c:1293
 #, c-format
 msgid "We should be in file 3. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1066 src/stored/btape.c:1084 src/stored/btape.c:1284
-#: src/stored/btape.c:1296 src/stored/btape.c:1309 src/stored/btape.c:1326
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
 msgid "This is correct!"
 msgstr ""
 
-#: src/stored/btape.c:1066 src/stored/btape.c:1084 src/stored/btape.c:1284
-#: src/stored/btape.c:1296 src/stored/btape.c:1309 src/stored/btape.c:1326
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
 msgid "This is NOT correct!!!!"
 msgstr ""
 
-#: src/stored/btape.c:1072
+#: src/stored/btape.c:1070
 msgid ""
 "\n"
 "Now the important part, I am going to attempt to append to the tape.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1079
+#: src/stored/btape.c:1077
 msgid ""
 "Done appending, there should be no I/O errors\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1080
+#: src/stored/btape.c:1078
 msgid "Doing Bacula scan of blocks:\n"
 msgstr ""
 
-#: src/stored/btape.c:1082
+#: src/stored/btape.c:1080
 msgid "End scanning the tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:1083 src/stored/btape.c:1308
+#: src/stored/btape.c:1081 src/stored/btape.c:1306
 #, c-format
 msgid "We should be in file 4. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1108
+#: src/stored/btape.c:1106
 msgid ""
 "\n"
 "Autochanger enabled, but no name or no command device specified.\n"
 msgstr ""
 
-#: src/stored/btape.c:1112
+#: src/stored/btape.c:1110
 msgid ""
 "\n"
 "Ah, I see you have an autochanger configured.\n"
@@ -9944,13 +10019,13 @@ msgid ""
 " that I can write on in Slot 1.\n"
 msgstr ""
 
-#: src/stored/btape.c:1115
+#: src/stored/btape.c:1113
 msgid ""
 "\n"
 "Do you wish to continue with the Autochanger test? (y/n): "
 msgstr ""
 
-#: src/stored/btape.c:1122
+#: src/stored/btape.c:1120
 msgid ""
 "\n"
 "\n"
@@ -9958,74 +10033,74 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1131
+#: src/stored/btape.c:1129
 msgid "3301 Issuing autochanger \"loaded\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1140
+#: src/stored/btape.c:1138
 #, c-format
 msgid "3991 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1141
+#: src/stored/btape.c:1139
 #, c-format
 msgid "3991 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1145
+#: src/stored/btape.c:1143
 #, c-format
 msgid "Slot %d loaded. I am going to unload it.\n"
 msgstr ""
 
-#: src/stored/btape.c:1147
+#: src/stored/btape.c:1145
 msgid "Nothing loaded in the drive. OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:1155
+#: src/stored/btape.c:1153
 #, c-format
 msgid "3302 Issuing autochanger \"unload %d %d\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1160
+#: src/stored/btape.c:1158
 #, c-format
 msgid "unload status=%s %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1160
+#: src/stored/btape.c:1158
 msgid "Bad"
 msgstr ""
 
-#: src/stored/btape.c:1163
+#: src/stored/btape.c:1161
 #, c-format
 msgid "3992 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1164
+#: src/stored/btape.c:1162
 #, c-format
 msgid "3992 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1174
+#: src/stored/btape.c:1172
 #, c-format
 msgid "3303 Issuing autochanger \"load %d %d\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1182
+#: src/stored/btape.c:1180
 #, c-format
 msgid "3303 Autochanger \"load %d %d\" status is OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:1186
+#: src/stored/btape.c:1184
 #, c-format
 msgid "3993 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1187
+#: src/stored/btape.c:1185
 #, c-format
 msgid "3993 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1202
+#: src/stored/btape.c:1200
 msgid ""
 "\n"
 "The test failed, probably because you need to put\n"
@@ -10033,12 +10108,12 @@ msgid ""
 "Adding a 30 second sleep and trying again ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1215
+#: src/stored/btape.c:1213
 #, c-format
 msgid "Wrote EOF to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1219
+#: src/stored/btape.c:1217
 #, c-format
 msgid ""
 "\n"
@@ -10050,18 +10125,18 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1224
+#: src/stored/btape.c:1222
 msgid ""
 "\n"
 "The test autochanger worked!!\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1235
+#: src/stored/btape.c:1233
 msgid "You must correct this error or the Autochanger will not work.\n"
 msgstr ""
 
-#: src/stored/btape.c:1253
+#: src/stored/btape.c:1251
 msgid ""
 "\n"
 "\n"
@@ -10073,30 +10148,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1278
+#: src/stored/btape.c:1276
 msgid "Now forward spacing 1 file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1280 src/stored/btape.c:1292 src/stored/btape.c:1305
-#: src/stored/btape.c:1323 src/stored/btape.c:1492
+#: src/stored/btape.c:1278 src/stored/btape.c:1290 src/stored/btape.c:1303
+#: src/stored/btape.c:1321 src/stored/btape.c:1490
 #, c-format
 msgid "Bad status from fsr. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1283
+#: src/stored/btape.c:1281
 #, c-format
 msgid "We should be in file 1. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1290
+#: src/stored/btape.c:1288
 msgid "Now forward spacing 2 files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1303
+#: src/stored/btape.c:1301
 msgid "Now forward spacing 4 files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1315
+#: src/stored/btape.c:1313
 msgid ""
 "The test worked this time. Please add:\n"
 "\n"
@@ -10105,35 +10180,35 @@ msgid ""
 "to your Device resource for this drive.\n"
 msgstr ""
 
-#: src/stored/btape.c:1321
+#: src/stored/btape.c:1319
 msgid "Now forward spacing 1 more file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1325
+#: src/stored/btape.c:1323
 #, c-format
 msgid "We should be in file 5. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1330
+#: src/stored/btape.c:1328
 msgid ""
 "\n"
 "=== End Forward space files test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1334
+#: src/stored/btape.c:1332
 msgid ""
 "\n"
 "The forward space file test failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1336
+#: src/stored/btape.c:1334
 msgid ""
 "You have Fast Forward Space File enabled.\n"
 "I am turning it off then retrying the test.\n"
 msgstr ""
 
-#: src/stored/btape.c:1342
+#: src/stored/btape.c:1340
 msgid ""
 "You must correct this error or Bacula will not work.\n"
 "Some systems, e.g. OpenBSD, require you to set\n"
@@ -10141,7 +10216,7 @@ msgid ""
 "in your device resource. Use with caution.\n"
 msgstr ""
 
-#: src/stored/btape.c:1374
+#: src/stored/btape.c:1372
 msgid ""
 "\n"
 "Append test failed. Attempting again.\n"
@@ -10151,7 +10226,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1382
+#: src/stored/btape.c:1380
 msgid ""
 "\n"
 "\n"
@@ -10163,14 +10238,14 @@ msgid ""
 "to your Device resource in the Storage conf file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1389
+#: src/stored/btape.c:1387
 msgid ""
 "\n"
 "\n"
 "That appears *NOT* to have corrected the problem.\n"
 msgstr ""
 
-#: src/stored/btape.c:1394
+#: src/stored/btape.c:1392
 msgid ""
 "\n"
 "\n"
@@ -10178,7 +10253,7 @@ msgid ""
 "Setting \"BSF at EOM = yes\" and retrying append test.\n"
 msgstr ""
 
-#: src/stored/btape.c:1399
+#: src/stored/btape.c:1397
 msgid ""
 "\n"
 "\n"
@@ -10191,7 +10266,7 @@ msgid ""
 "to your Device resource in the Storage conf file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1410
+#: src/stored/btape.c:1408
 msgid ""
 "\n"
 "Append test failed.\n"
@@ -10218,7 +10293,7 @@ msgid ""
 "in your device resource. Use with caution.\n"
 msgstr ""
 
-#: src/stored/btape.c:1431
+#: src/stored/btape.c:1429
 msgid ""
 "\n"
 "The above Bacula scan should have output identical to what follows.\n"
@@ -10242,116 +10317,116 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1470
+#: src/stored/btape.c:1468
 #, c-format
 msgid "Bad status from fsf. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1474
+#: src/stored/btape.c:1472
 msgid "Forward spaced 1 file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1477
+#: src/stored/btape.c:1475
 #, c-format
 msgid "Forward spaced %d files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1496
+#: src/stored/btape.c:1494
 msgid "Forward spaced 1 record.\n"
 msgstr ""
 
-#: src/stored/btape.c:1499
+#: src/stored/btape.c:1497
 #, c-format
 msgid "Forward spaced %d records.\n"
 msgstr ""
 
-#: src/stored/btape.c:1533
+#: src/stored/btape.c:1531
 #, c-format
 msgid "Wrote one record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:1535
+#: src/stored/btape.c:1533
 msgid "Wrote block to device.\n"
 msgstr ""
 
-#: src/stored/btape.c:1550
+#: src/stored/btape.c:1548
 msgid "Enter length to read: "
 msgstr ""
 
-#: src/stored/btape.c:1555
+#: src/stored/btape.c:1553
 msgid "Bad length entered, using default of 1024 bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:1564
+#: src/stored/btape.c:1562
 #, c-format
 msgid "Read of %d bytes gives stat=%d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1587 src/stored/btape.c:1636
+#: src/stored/btape.c:1585 src/stored/btape.c:1634
 #, c-format
 msgid "End of tape\n"
 msgstr ""
 
-#: src/stored/btape.c:1592
+#: src/stored/btape.c:1590
 #, c-format
 msgid "Starting scan at file %u\n"
 msgstr ""
 
-#: src/stored/btape.c:1597 src/stored/dev.c:1238
+#: src/stored/btape.c:1595 src/stored/dev.c:1229
 #, c-format
 msgid "read error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:1599
+#: src/stored/btape.c:1597
 #, c-format
 msgid "Bad status from read %d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1602 src/stored/btape.c:1616 src/stored/btape.c:1679
-#: src/stored/btape.c:1691 src/stored/btape.c:1704 src/stored/btape.c:1720
+#: src/stored/btape.c:1600 src/stored/btape.c:1614 src/stored/btape.c:1678
+#: src/stored/btape.c:1690 src/stored/btape.c:1703 src/stored/btape.c:1719
 #, c-format
 msgid "1 block of %d bytes in file %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1605 src/stored/btape.c:1619 src/stored/btape.c:1682
-#: src/stored/btape.c:1694 src/stored/btape.c:1707 src/stored/btape.c:1723
+#: src/stored/btape.c:1603 src/stored/btape.c:1617 src/stored/btape.c:1681
+#: src/stored/btape.c:1693 src/stored/btape.c:1706 src/stored/btape.c:1722
 #, c-format
 msgid "%d blocks of %d bytes in file %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1627 src/stored/btape.c:1698
+#: src/stored/btape.c:1625 src/stored/btape.c:1697
 #, c-format
 msgid "End of File mark.\n"
 msgstr ""
 
-#: src/stored/btape.c:1648 src/stored/btape.c:1751
+#: src/stored/btape.c:1646 src/stored/btape.c:1750
 #, c-format
 msgid "Total files=%d, blocks=%d, bytes = %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1711
+#: src/stored/btape.c:1710
 #, c-format
 msgid "Short block read.\n"
 msgstr ""
 
-#: src/stored/btape.c:1714
+#: src/stored/btape.c:1713
 #, c-format
 msgid "Error reading block. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1738
+#: src/stored/btape.c:1737
 #, c-format
 msgid ""
 "Blk_block: %u dev_blk=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
 "s rlen=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:1760
+#: src/stored/btape.c:1759
 #, c-format
 msgid "Device status: %u. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1788
+#: src/stored/btape.c:1789
 msgid ""
 "\n"
 "This command simulates Bacula writing to a tape.\n"
@@ -10376,95 +10451,98 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1805
+#: src/stored/btape.c:1806
 msgid ""
 "Do you want to run the simplified test (s) with one tape\n"
 "or the complete multiple tape (m) test: (s/m) "
 msgstr ""
 
-#: src/stored/btape.c:1808
+#: src/stored/btape.c:1809
 msgid "Simple test (single tape) selected.\n"
 msgstr ""
 
-#: src/stored/btape.c:1811
+#: src/stored/btape.c:1812
 msgid "Multiple tape test selected.\n"
 msgstr ""
 
-#: src/stored/btape.c:1827
+#: src/stored/btape.c:1828
 msgid "Rewind failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1830
+#: src/stored/btape.c:1831
 msgid "Write EOF failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1857
+#: src/stored/btape.c:1858
 msgid "Wrote Start of Session label.\n"
 msgstr ""
 
-#: src/stored/btape.c:1886
-msgid "Begin writing Bacula records to tape ...\n"
+#: src/stored/btape.c:1889
+#, c-format
+msgid "%s Begin writing Bacula records to tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1888
-msgid "Begin writing Bacula records to first tape ...\n"
+#: src/stored/btape.c:1891
+#, c-format
+msgid "%s Begin writing Bacula records to first tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1928
+#: src/stored/btape.c:1932
 #, c-format
 msgid "Wrote blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:1935
-msgid "Flush block, write EOF\n"
+#: src/stored/btape.c:1942
+#, c-format
+msgid "%s Flush block, write EOF\n"
 msgstr ""
 
-#: src/stored/btape.c:1946
+#: src/stored/btape.c:1953
 msgid "Not OK\n"
 msgstr ""
 
-#: src/stored/btape.c:1974
+#: src/stored/btape.c:1981
 msgid "Set ok=false after write_block_to_device.\n"
 msgstr ""
 
-#: src/stored/btape.c:1977
+#: src/stored/btape.c:1984
 msgid "Wrote End of Session label.\n"
 msgstr ""
 
-#: src/stored/btape.c:2001
+#: src/stored/btape.c:2008
 #, c-format
 msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2005
+#: src/stored/btape.c:2012
 #, c-format
 msgid "Could not create state file: %s ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2010
+#: src/stored/btape.c:2020
 #, c-format
 msgid ""
 "\n"
 "\n"
-"Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
+"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2014
+#: src/stored/btape.c:2024
 #, c-format
 msgid ""
 "\n"
 "\n"
-"Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
+"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2053
+#: src/stored/btape.c:2063
 msgid ""
 "\n"
 "The state file level has changed. You must redo\n"
 "the fill command.\n"
 msgstr ""
 
-#: src/stored/btape.c:2059
+#: src/stored/btape.c:2069
 #, c-format
 msgid ""
 "\n"
@@ -10472,95 +10550,95 @@ msgid ""
 "You must redo the fill command.\n"
 msgstr ""
 
-#: src/stored/btape.c:2101
+#: src/stored/btape.c:2111
 msgid "Mount first tape. Press enter when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2125
-msgid "Reading the first 10000 records.\n"
+#: src/stored/btape.c:2131
+msgid "Rewinding.\n"
+msgstr ""
+
+#: src/stored/btape.c:2136
+#, c-format
+msgid "Reading the first 10000 records from %u:%u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2128 src/stored/btape.c:2195
+#: src/stored/btape.c:2140 src/stored/btape.c:2207
 #, c-format
 msgid "Reposition from %u:%u to %u:%u\n"
 msgstr ""
 
-#: src/stored/btape.c:2131 src/stored/btape.c:2182 src/stored/btape.c:2198
+#: src/stored/btape.c:2143 src/stored/btape.c:2194 src/stored/btape.c:2210
 #, c-format
 msgid "Reposition error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2134
+#: src/stored/btape.c:2146
 #, c-format
 msgid "Reading block %u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2136 src/stored/btape.c:2187 src/stored/btape.c:2203
+#: src/stored/btape.c:2148 src/stored/btape.c:2199 src/stored/btape.c:2215
 #, c-format
 msgid "Error reading block: ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2141
+#: src/stored/btape.c:2153
 msgid ""
 "\n"
 "The last block on the tape matches. Test succeeded.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2143
+#: src/stored/btape.c:2155
 msgid ""
 "\n"
 "The last block of the first tape matches.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2168
+#: src/stored/btape.c:2180
 msgid "Mount second tape. Press enter when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2180
+#: src/stored/btape.c:2192
 #, c-format
 msgid "Reposition from %u:%u to 0:1\n"
 msgstr ""
 
-#: src/stored/btape.c:2185 src/stored/btape.c:2201
+#: src/stored/btape.c:2197 src/stored/btape.c:2213
 #, c-format
 msgid "Reading block %d.\n"
 msgstr ""
 
-#: src/stored/btape.c:2191
+#: src/stored/btape.c:2203
 msgid ""
 "\n"
 "The first block on the second tape matches.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2207
+#: src/stored/btape.c:2219
 msgid ""
 "\n"
 "The last block on the second tape matches. Test succeeded.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2221
+#: src/stored/btape.c:2234
 #, c-format
-msgid "ERROR! device at %d:%d count=%d\n"
+msgid "10000 records read now at %d:%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2227
-#, c-format
-msgid "1000 records read now at %d:%d\n"
-msgstr ""
-
-#: src/stored/btape.c:2250 src/stored/btape.c:2261 src/stored/btape.c:2309
+#: src/stored/btape.c:2257 src/stored/btape.c:2268 src/stored/btape.c:2316
 msgid "Last block written"
 msgstr ""
 
-#: src/stored/btape.c:2252 src/stored/btape.c:2262
+#: src/stored/btape.c:2259 src/stored/btape.c:2269
 msgid "Block read back"
 msgstr ""
 
-#: src/stored/btape.c:2253
+#: src/stored/btape.c:2260
 #, c-format
 msgid ""
 "\n"
@@ -10568,7 +10646,7 @@ msgid ""
 "The blocks differ at byte %u\n"
 msgstr ""
 
-#: src/stored/btape.c:2254
+#: src/stored/btape.c:2261
 msgid ""
 "\n"
 "\n"
@@ -10578,177 +10656,177 @@ msgid ""
 "to write multi-tape Volumes.!!!!\n"
 msgstr ""
 
-#: src/stored/btape.c:2293
+#: src/stored/btape.c:2300
 #, c-format
 msgid "Last block at: %u:%u this_dev_block_num=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2307
+#: src/stored/btape.c:2314
 #, c-format
 msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n"
 msgstr ""
 
-#: src/stored/btape.c:2311
+#: src/stored/btape.c:2318
 msgid "Block not written"
 msgstr ""
 
-#: src/stored/btape.c:2326
+#: src/stored/btape.c:2333
 #, c-format
 msgid "End of tape %d:%d. VolumeCapacity=%s. Write rate = %.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:2376
+#: src/stored/btape.c:2383
 msgid "Test writing blocks of 64512 bytes to tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:2378
+#: src/stored/btape.c:2385
 msgid "How many blocks do you want to write? (1000): "
 msgstr ""
 
-#: src/stored/btape.c:2393
+#: src/stored/btape.c:2400
 #, c-format
 msgid "Begin writing %d Bacula blocks to tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2445
+#: src/stored/btape.c:2452
 #, c-format
 msgid "Begin writing raw blocks of %u bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:2465
+#: src/stored/btape.c:2472
 #, c-format
 msgid "Write failed at block %u. stat=%d ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2495
+#: src/stored/btape.c:2502
 #, c-format
 msgid "Begin writing Bacula blocks of %u bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:2514
+#: src/stored/btape.c:2521
 #, c-format
 msgid "Write failed at block %u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2521
+#: src/stored/btape.c:2528
 msgid "test autochanger"
 msgstr ""
 
-#: src/stored/btape.c:2522
+#: src/stored/btape.c:2529
 msgid "backspace file"
 msgstr ""
 
-#: src/stored/btape.c:2523
+#: src/stored/btape.c:2530
 msgid "backspace record"
 msgstr ""
 
-#: src/stored/btape.c:2524
+#: src/stored/btape.c:2531
 msgid "fill tape using Bacula writes"
 msgstr ""
 
-#: src/stored/btape.c:2525
+#: src/stored/btape.c:2532
 msgid "list device capabilities"
 msgstr ""
 
-#: src/stored/btape.c:2526
+#: src/stored/btape.c:2533
 msgid "clear tape errors"
 msgstr ""
 
-#: src/stored/btape.c:2527
+#: src/stored/btape.c:2534
 msgid "go to end of Bacula data for append"
 msgstr ""
 
-#: src/stored/btape.c:2528
+#: src/stored/btape.c:2535
 msgid "go to the physical end of medium"
 msgstr ""
 
-#: src/stored/btape.c:2529
+#: src/stored/btape.c:2536
 msgid "fill tape, write onto second volume"
 msgstr ""
 
-#: src/stored/btape.c:2530
+#: src/stored/btape.c:2537
 msgid "read filled tape"
 msgstr ""
 
-#: src/stored/btape.c:2531
+#: src/stored/btape.c:2538
 msgid "forward space a file"
 msgstr ""
 
-#: src/stored/btape.c:2532
+#: src/stored/btape.c:2539
 msgid "forward space a record"
 msgstr ""
 
-#: src/stored/btape.c:2534
+#: src/stored/btape.c:2541
 msgid "write a Bacula label to the tape"
 msgstr ""
 
-#: src/stored/btape.c:2535
+#: src/stored/btape.c:2542
 msgid "load a tape"
 msgstr ""
 
-#: src/stored/btape.c:2536
+#: src/stored/btape.c:2543
 msgid "quit btape"
 msgstr ""
 
-#: src/stored/btape.c:2537
+#: src/stored/btape.c:2544
 msgid "use write() to fill tape"
 msgstr ""
 
-#: src/stored/btape.c:2538
+#: src/stored/btape.c:2545
 msgid "read and print the Bacula tape label"
 msgstr ""
 
-#: src/stored/btape.c:2539
+#: src/stored/btape.c:2546
 msgid "test record handling functions"
 msgstr ""
 
-#: src/stored/btape.c:2540
+#: src/stored/btape.c:2547
 msgid "rewind the tape"
 msgstr ""
 
-#: src/stored/btape.c:2541
+#: src/stored/btape.c:2548
 msgid "read() tape block by block to EOT and report"
 msgstr ""
 
-#: src/stored/btape.c:2542
+#: src/stored/btape.c:2549
 msgid "Bacula read block by block to EOT and report"
 msgstr ""
 
-#: src/stored/btape.c:2543
+#: src/stored/btape.c:2550
 msgid "print tape status"
 msgstr ""
 
-#: src/stored/btape.c:2544
+#: src/stored/btape.c:2551
 msgid "General test Bacula tape functions"
 msgstr ""
 
-#: src/stored/btape.c:2545
+#: src/stored/btape.c:2552
 msgid "write an EOF on the tape"
 msgstr ""
 
-#: src/stored/btape.c:2546
+#: src/stored/btape.c:2553
 msgid "write a single Bacula block"
 msgstr ""
 
-#: src/stored/btape.c:2547
+#: src/stored/btape.c:2554
 msgid "read a single record"
 msgstr ""
 
-#: src/stored/btape.c:2548
+#: src/stored/btape.c:2555
 msgid "quick fill command"
 msgstr ""
 
-#: src/stored/btape.c:2569
+#: src/stored/btape.c:2576
 #, c-format
 msgid "%s is an illegal command\n"
 msgstr ""
 
-#: src/stored/btape.c:2579
+#: src/stored/btape.c:2586
 #, c-format
 msgid "Interactive commands:\n"
 msgstr ""
 
-#: src/stored/btape.c:2589
+#: src/stored/btape.c:2596
 #, c-format
 msgid ""
 "Copyright (C) 2000-2005 Kern Sibbald.\n"
@@ -10766,27 +10844,27 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2680
+#: src/stored/btape.c:2687
 #, c-format
 msgid "Mount second Volume on device %s and press return when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2707
+#: src/stored/btape.c:2714
 #, c-format
 msgid "Mount blank Volume on device %s and press return when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2725
+#: src/stored/btape.c:2732
 #, c-format
 msgid "End of Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/btape.c:2737
+#: src/stored/btape.c:2744
 #, c-format
 msgid "Read block=%u, VolBytes=%s rate=%.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:2752 src/stored/mount.c:493
+#: src/stored/btape.c:2759 src/stored/mount.c:501
 #, c-format
 msgid "Cannot open Dev=%s, Vol=%s\n"
 msgstr ""
@@ -10811,358 +10889,345 @@ msgstr ""
 msgid "cont,"
 msgstr ""
 
-#: src/stored/butil.c:128
+#: src/stored/butil.c:133
 msgid "Volume name or names is too long. Please use a .bsr file.\n"
 msgstr ""
 
-#: src/stored/butil.c:148
+#: src/stored/butil.c:153
 #, c-format
 msgid "Cannot find device \"%s\" in config file %s.\n"
 msgstr ""
 
-#: src/stored/butil.c:155
+#: src/stored/butil.c:160
 #, c-format
 msgid "Cannot init device %s\n"
 msgstr ""
 
-#: src/stored/butil.c:174
+#: src/stored/butil.c:181
 #, c-format
 msgid "Cannot open %s\n"
 msgstr ""
 
-#: src/stored/butil.c:253
+#: src/stored/butil.c:264
 #, c-format
 msgid "Could not find device \"%s\" in config file %s.\n"
 msgstr ""
 
-#: src/stored/butil.c:258
+#: src/stored/butil.c:269
 #, c-format
 msgid "Using device: \"%s\" for reading.\n"
 msgstr ""
 
-#: src/stored/butil.c:261
+#: src/stored/butil.c:272
 #, c-format
 msgid "Using device: \"%s\" for writing.\n"
 msgstr ""
 
-#: src/stored/butil.c:277
+#: src/stored/butil.c:288
 msgid "Unexpected End of Data\n"
 msgstr ""
 
-#: src/stored/butil.c:279
+#: src/stored/butil.c:290
 msgid "Unexpected End of Tape\n"
 msgstr ""
 
-#: src/stored/butil.c:281
+#: src/stored/butil.c:292
 msgid "Unexpected End of File\n"
 msgstr ""
 
-#: src/stored/butil.c:283
+#: src/stored/butil.c:294
 msgid "Tape Door is Open\n"
 msgstr ""
 
-#: src/stored/butil.c:285
+#: src/stored/butil.c:296
 msgid "Unexpected Tape is Off-line\n"
 msgstr ""
 
-#: src/stored/dev.c:110
+#: src/stored/dev.c:112
 #, c-format
 msgid "Unable to stat device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:125
+#: src/stored/dev.c:123
 #, c-format
 msgid ""
 "%s is an unknown device type. Must be tape or directory\n"
 " or have RequiresMount=yes for DVD. st_mode=%x\n"
 msgstr ""
 
-#: src/stored/dev.c:183
+#: src/stored/dev.c:179
 #, c-format
 msgid "Unable to stat mount point %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:188
+#: src/stored/dev.c:186
 msgid ""
 "Mount and unmount commands must defined for a device which requires mount.\n"
 msgstr ""
 
-#: src/stored/dev.c:191
+#: src/stored/dev.c:189
 msgid "Write part command must be defined for a device which requires mount.\n"
 msgstr ""
 
-#: src/stored/dev.c:197
+#: src/stored/dev.c:194
 #, c-format
 msgid "Block size %u on device %s is too large, using default %u\n"
 msgstr ""
 
-#: src/stored/dev.c:202
+#: src/stored/dev.c:199
 #, c-format
 msgid "Max block size %u not multiple of device %s block size.\n"
 msgstr ""
 
-#: src/stored/dev.c:218 src/stored/dev.c:224
+#: src/stored/dev.c:215 src/stored/dev.c:221
 #, c-format
 msgid "Unable to init cond variable: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:310
+#: src/stored/dev.c:312
 msgid "Illegal mode given to open dev.\n"
 msgstr ""
 
-#: src/stored/dev.c:376 src/stored/device.c:302
+#: src/stored/dev.c:355 src/stored/device.c:295
 #, c-format
 msgid "Unable to open device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:396
-#, c-format
-msgid "fcntl error. ERR=%s\n"
-msgstr ""
-
-#: src/stored/dev.c:434 src/stored/dev.c:493
+#: src/stored/dev.c:423 src/stored/dev.c:481
 #, c-format
 msgid "Could not open file device %s. No Volume name given.\n"
 msgstr ""
 
-#: src/stored/dev.c:459 src/stored/dev.c:573
+#: src/stored/dev.c:449 src/stored/dev.c:562
 #, c-format
 msgid "Could not open: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:518
+#: src/stored/dev.c:506
 #, c-format
 msgid ""
 "The media in the device %s is not empty, please blank it before writing "
 "anything to it.\n"
 msgstr ""
 
-#: src/stored/dev.c:534
+#: src/stored/dev.c:523
 #, c-format
 msgid "There is no valid media in the device %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:541
+#: src/stored/dev.c:530
 #, c-format
 msgid "Could not mount device %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:599
+#: src/stored/dev.c:588
 #, c-format
 msgid "Could not fstat: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:652
+#: src/stored/dev.c:631
 #, c-format
-msgid "Bad call to rewind_dev. Device %s not open\n"
+msgid "Bad call to rewind. Device %s not open\n"
 msgstr ""
 
-#: src/stored/dev.c:681
+#: src/stored/dev.c:677
 #, c-format
 msgid "Rewind error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:691 src/stored/dev.c:804 src/stored/dev.c:941
-#: src/stored/dev.c:1466
+#: src/stored/dev.c:687 src/stored/dev.c:802 src/stored/dev.c:938
+#: src/stored/dev.c:1457
 #, c-format
 msgid "lseek_dev error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:731
+#: src/stored/dev.c:727
 msgid "unknown blocked code"
 msgstr ""
 
-#: src/stored/dev.c:774
+#: src/stored/dev.c:772
 #, c-format
 msgid "Bad call to eod_dev. Device %s not open\n"
 msgstr ""
 
-#: src/stored/dev.c:840
+#: src/stored/dev.c:838
 #, c-format
 msgid "ioctl MTEOM error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:848 src/stored/dev.c:981
+#: src/stored/dev.c:846 src/stored/dev.c:978
 #, c-format
 msgid "ioctl MTIOCGET error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:927
+#: src/stored/dev.c:924
 msgid "Bad device call. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:940
+#: src/stored/dev.c:937
 #, c-format
 msgid "Seek error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:976
+#: src/stored/dev.c:973
 msgid " Bacula status:"
 msgstr ""
 
-#: src/stored/dev.c:977 src/stored/dev.c:1026 src/stored/dev.c:1028
+#: src/stored/dev.c:974 src/stored/dev.c:1023 src/stored/dev.c:1025
 #, c-format
 msgid " file=%d block=%d\n"
 msgstr ""
 
-#: src/stored/dev.c:985
+#: src/stored/dev.c:982
 msgid " Device status:"
 msgstr ""
 
-#: src/stored/dev.c:1050
+#: src/stored/dev.c:1047
 msgid "Bad call to load_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1061 src/stored/dev.c:1074
+#: src/stored/dev.c:1058 src/stored/dev.c:1071
 #, c-format
 msgid "ioctl MTLOAD error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1093
-msgid "Bad call to offline_dev. Device not open\n"
-msgstr ""
-
-#: src/stored/dev.c:1116
+#: src/stored/dev.c:1107
 #, c-format
 msgid "ioctl MTOFFL error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1157
+#: src/stored/dev.c:1148
 msgid "Bad call to fsf_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1167 src/stored/dev.c:1288
+#: src/stored/dev.c:1158 src/stored/dev.c:1279
 #, c-format
 msgid "Device %s at End of Tape.\n"
 msgstr ""
 
-#: src/stored/dev.c:1192 src/stored/dev.c:1268
+#: src/stored/dev.c:1183 src/stored/dev.c:1259
 #, c-format
 msgid "ioctl MTFSF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1317
+#: src/stored/dev.c:1308
 msgid "Bad call to bsf_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1323
+#: src/stored/dev.c:1314
 #, c-format
 msgid "Device %s cannot BSF because it is not a tape.\n"
 msgstr ""
 
-#: src/stored/dev.c:1338
+#: src/stored/dev.c:1329
 #, c-format
 msgid "ioctl MTBSF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1358
+#: src/stored/dev.c:1349
 msgid "Bad call to fsr. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1367
+#: src/stored/dev.c:1358
 #, c-format
 msgid "ioctl MTFSR not permitted on %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1395
+#: src/stored/dev.c:1386
 #, c-format
 msgid "ioctl MTFSR %d error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1415
+#: src/stored/dev.c:1406
 msgid "Bad call to bsr_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1425
+#: src/stored/dev.c:1416
 #, c-format
 msgid "ioctl MTBSR not permitted on %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1438
+#: src/stored/dev.c:1429
 #, c-format
 msgid "ioctl MTBSR error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1455
+#: src/stored/dev.c:1446
 msgid "Bad call to reposition_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1523
+#: src/stored/dev.c:1514
 msgid "Bad call to weof_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1533
+#: src/stored/dev.c:1524
 msgid "Attempt to WEOF on non-appendable Volume\n"
 msgstr ""
 
-#: src/stored/dev.c:1550
+#: src/stored/dev.c:1541
 #, c-format
 msgid "ioctl MTWEOF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1592
+#: src/stored/dev.c:1583
 msgid "Got ENOTTY on read/write!\n"
 msgstr ""
 
-#: src/stored/dev.c:1639
+#: src/stored/dev.c:1630
 #, c-format
 msgid "unknown func code %d"
 msgstr ""
 
-#: src/stored/dev.c:1645
+#: src/stored/dev.c:1636
 #, c-format
 msgid "I/O function \"%s\" not supported on this device.\n"
 msgstr ""
 
-#: src/stored/dev.c:1783 src/stored/dvd.c:668
+#: src/stored/dev.c:1761 src/stored/dvd.c:734
 #, c-format
 msgid "Unable to truncate device %s. ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:1822
+#: src/stored/dev.c:1800
 msgid "Bad call to term_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/device.c:105
+#: src/stored/device.c:100
 #, c-format
 msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n"
 msgstr ""
 
-#: src/stored/device.c:119
+#: src/stored/device.c:114
 #, c-format
 msgid "New volume \"%s\" mounted on device %s at %s.\n"
 msgstr ""
 
-#: src/stored/device.c:131
+#: src/stored/device.c:126
 #, c-format
 msgid "write_block_to_device Volume label failed. ERR=%s"
 msgstr ""
 
-#: src/stored/device.c:168
+#: src/stored/device.c:162
 #, c-format
 msgid "write_block_to_device overflow block failed. ERR=%s"
 msgstr ""
 
-#: src/stored/device.c:304
+#: src/stored/device.c:297
 #, c-format
 msgid "Unable to open archive %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:328
-msgid "Bad call to force_close_dev. Device not open\n"
-msgstr ""
-
-#: src/stored/device.c:346
+#: src/stored/device.c:332
 #, c-format
 msgid "Device write lock failure. ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:354
+#: src/stored/device.c:340
 #, c-format
 msgid "Device write unlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:373
+#: src/stored/device.c:359
 #, c-format
 msgid "pthread_cond_wait failure. ERR=%s\n"
 msgstr ""
@@ -11183,72 +11248,72 @@ msgstr ""
 
 #: src/stored/dircmd.c:262
 #, c-format
-msgid "3902 Job %s not found.\n"
+msgid "3904 Job %s not found.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:279
+#: src/stored/dircmd.c:283
 #, c-format
 msgid "3000 Job %s marked to be canceled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:283
+#: src/stored/dircmd.c:287
 msgid "3903 Error scanning cancel command.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:356 src/stored/dircmd.c:655 src/stored/dircmd.c:720
-#: src/stored/dircmd.c:779 src/stored/dircmd.c:829 src/stored/dircmd.c:869
+#: src/stored/dircmd.c:364 src/stored/dircmd.c:680 src/stored/dircmd.c:756
+#: src/stored/dircmd.c:819 src/stored/dircmd.c:874 src/stored/dircmd.c:918
 #, c-format
-msgid "3999 Device \"%s\" not found\n"
+msgid "3999 Device \"%s\" not found or could not be opened.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:361
+#: src/stored/dircmd.c:369
 #, c-format
 msgid "3903 Error scanning label command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:405
+#: src/stored/dircmd.c:412
 #, c-format
 msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:411
+#: src/stored/dircmd.c:419
 msgid "3921 Wrong volume mounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:415
+#: src/stored/dircmd.c:423
 msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:423 src/stored/dircmd.c:432
+#: src/stored/dircmd.c:431 src/stored/dircmd.c:440
 #, c-format
 msgid "3912 Failed to label Volume: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:435
+#: src/stored/dircmd.c:443
 #, c-format
 msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n"
 msgstr ""
 
-#: src/stored/dircmd.c:468
+#: src/stored/dircmd.c:476
 #, c-format
 msgid "3001 Mounted Volume: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:472 src/stored/dircmd.c:905
+#: src/stored/dircmd.c:480 src/stored/dircmd.c:954
 #, c-format
 msgid ""
 "3902 Cannot mount Volume on Storage Device %s because:\n"
 "%s"
 msgstr ""
 
-#: src/stored/dircmd.c:495 src/stored/reserve.c:554
+#: src/stored/dircmd.c:508 src/stored/reserve.c:674
 #, c-format
 msgid ""
 "\n"
 "     Device \"%s\" requested by DIR could not be opened or does not exist.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:516 src/stored/reserve.c:550
+#: src/stored/dircmd.c:529 src/stored/reserve.c:670
 #, c-format
 msgid ""
 "\n"
@@ -11256,222 +11321,283 @@ msgid ""
 "does not exist.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:575 src/stored/dircmd.c:623
+#: src/stored/dircmd.c:593 src/stored/dircmd.c:646
 #, c-format
 msgid "3901 open device failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:590 src/stored/dircmd.c:614
+#: src/stored/dircmd.c:613 src/stored/dircmd.c:637
 #, c-format
 msgid "3001 Device %s is mounted with Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:593 src/stored/dircmd.c:617 src/stored/dircmd.c:632
+#: src/stored/dircmd.c:616 src/stored/dircmd.c:640 src/stored/dircmd.c:655
 #, c-format
 msgid ""
 "3905 Device %s open but no Bacula volume is mounted.\n"
 "If this is not a blank tape, try unmounting and remounting the Volume.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:602
+#: src/stored/dircmd.c:625
 #, c-format
 msgid "3001 Device %s is doing acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:607 src/stored/dircmd.c:698
+#: src/stored/dircmd.c:630 src/stored/dircmd.c:730
 #, c-format
 msgid "3903 Device %s is being labeled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:629
+#: src/stored/dircmd.c:652
 #, c-format
 msgid "3001 Device %s is already mounted with Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:638
+#: src/stored/dircmd.c:661
 #, c-format
 msgid "3002 Device %s is mounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:641
+#: src/stored/dircmd.c:664
 #, c-format
 msgid "3907 %s"
 msgstr ""
 
-#: src/stored/dircmd.c:644
+#: src/stored/dircmd.c:667
 #, c-format
 msgid "3906 File device %s is always mounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:650
+#: src/stored/dircmd.c:673
 #, c-format
 msgid "3905 Bizarre wait state %d\n"
 msgstr ""
 
-#: src/stored/dircmd.c:659
+#: src/stored/dircmd.c:684
 #, c-format
 msgid "3909 Error scanning mount command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:681
+#: src/stored/dircmd.c:711
 #, c-format
 msgid "3901 Device %s is already unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:690
+#: src/stored/dircmd.c:722
 #, c-format
 msgid "3001 Device %s unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:694
+#: src/stored/dircmd.c:726
 #, c-format
 msgid "3902 Device %s is busy in acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:715
+#: src/stored/dircmd.c:749
 #, c-format
 msgid "3002 Device %s unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:725
+#: src/stored/dircmd.c:761
 #, c-format
 msgid "3907 Error scanning unmount command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:751
+#: src/stored/dircmd.c:789
 #, c-format
-msgid "3911 Device %s already released.\n"
+msgid "3921 Device %s already released.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:758
+#: src/stored/dircmd.c:796
 #, c-format
-msgid "3912 Device %s waiting for mount.\n"
+msgid "3922 Device %s waiting for mount.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:762
+#: src/stored/dircmd.c:800
 #, c-format
-msgid "3913 Device %s is busy in acquire.\n"
+msgid "3923 Device %s is busy in acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:766
+#: src/stored/dircmd.c:804
 #, c-format
 msgid "3914 Device %s is being labeled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:774
+#: src/stored/dircmd.c:812
 #, c-format
-msgid "3012 Device %s released.\n"
+msgid "3022 Device %s released.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:784
+#: src/stored/dircmd.c:824
 #, c-format
-msgid "3917 Error scanning release command: %s\n"
+msgid "3927 Error scanning release command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:817
+#: src/stored/dircmd.c:860
 #, c-format
 msgid "3995 Device %s is not an autochanger.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:833
+#: src/stored/dircmd.c:878
 #, c-format
-msgid "3908 Error scanning autocharger list/slots command: %s\n"
+msgid "3908 Error scanning autocharger drives/list/slots command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:873
+#: src/stored/dircmd.c:922
 #, c-format
 msgid "3909 Error scanning readlabel command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:901
+#: src/stored/dircmd.c:950
 #, c-format
 msgid "3001 Volume=%s Slot=%d\n"
 msgstr ""
 
-#: src/stored/dircmd.c:930
+#: src/stored/dircmd.c:979
 #, c-format
 msgid "3910 Unable to open device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:940
+#: src/stored/dircmd.c:991
 #, c-format
-msgid "3911 Device %s is busy reading.\n"
+msgid "3931 Device %s is BLOCKED. user unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:943
+#: src/stored/dircmd.c:995
 #, c-format
-msgid "3912 Device %s is busy with %d writer(s).\n"
+msgid ""
+"3932 Device %s is BLOCKED. user unmounted during wait for media/mount.\n"
 msgstr ""
 
-#: src/stored/fd_cmds.c:340
-msgid "Error parsing bootstrap file.\n"
+#: src/stored/dircmd.c:999
+#, c-format
+msgid "3933 Device %s is BLOCKED waiting for media.\n"
 msgstr ""
 
-#: src/stored/job.c:79
+#: src/stored/dircmd.c:1003
 #, c-format
-msgid "Bad Job Command from Director: %s\n"
+msgid "3934 Device %s is being initialized.\n"
 msgstr ""
 
-#: src/stored/job.c:189
+#: src/stored/dircmd.c:1007
 #, c-format
-msgid "Job name not found: %s\n"
+msgid "3935 Device %s is blocked labeling a Volume.\n"
 msgstr ""
 
-#: src/stored/job.c:200
+#: src/stored/dircmd.c:1011
 #, c-format
-msgid "Hey!!!! JobId %u Job %s already authenticated.\n"
+msgid "3935 Device %s is blocked for unknown reason.\n"
 msgstr ""
 
-#: src/stored/job.c:211
-msgid "Unable to authenticate File daemon\n"
+#: src/stored/dircmd.c:1016
+#, c-format
+msgid "3936 Device %s is busy reading.\n"
 msgstr ""
 
-#: src/stored/job.c:338
-msgid "In free_jcr(), but still attached to device!!!!\n"
+#: src/stored/dircmd.c:1019
+#, c-format
+msgid "3937 Device %s is busy with %d writer(s).\n"
 msgstr ""
 
-#: src/stored/label.c:74
-msgid "BAD call to read_dev_volume_label\n"
+#: src/stored/dvd.c:153
+#, c-format
+msgid "Device %s cannot be mounted. ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:79 src/stored/label.c:120 src/stored/label.c:208
+#: src/stored/dvd.c:271
 #, c-format
-msgid "Wrong Volume mounted on device %s: Wanted %s have %s\n"
+msgid "Cannot run free space command (%s)\n"
 msgstr ""
 
-#: src/stored/label.c:86 src/stored/label.c:123 src/stored/label.c:195
+#: src/stored/dvd.c:374
 #, c-format
-msgid "Too many tries: %s"
+msgid "Error while writing current part to the DVD: %s"
 msgstr ""
 
-#: src/stored/label.c:102
+#: src/stored/dvd.c:394
 #, c-format
-msgid "Couldn't rewind device %s: ERR=%s\n"
+msgid "Remaining free space %s on %s\n"
 msgstr ""
 
-#: src/stored/label.c:140
+#: src/stored/dvd.c:464
 #, c-format
-msgid ""
-"Requested Volume \"%s\" on %s is not a Bacula labeled Volume, because: ERR=%s"
+msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
 msgstr ""
 
-#: src/stored/label.c:145
-msgid "Could not read Volume label from block.\n"
+#: src/stored/dvd.c:481
+#, c-format
+msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:148
+#: src/stored/dvd.c:700
 #, c-format
-msgid "Could not unserialize Volume label: ERR=%s\n"
+msgid "Unable to write part %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:153
-#, c-format
-msgid "Volume Header Id bad: %s\n"
+#: src/stored/fd_cmds.c:340
+msgid "Error parsing bootstrap file.\n"
 msgstr ""
 
-#: src/stored/label.c:180
+#: src/stored/job.c:191
 #, c-format
-msgid "Volume on %s has wrong Bacula version. Wanted %d got %d\n"
+msgid "Job name not found: %s\n"
+msgstr ""
+
+#: src/stored/job.c:202
+#, c-format
+msgid "Hey!!!! JobId %u Job %s already authenticated.\n"
+msgstr ""
+
+#: src/stored/job.c:213
+msgid "Unable to authenticate File daemon\n"
+msgstr ""
+
+#: src/stored/job.c:334
+msgid "In free_jcr(), but still attached to device!!!!\n"
+msgstr ""
+
+#: src/stored/label.c:74
+msgid "BAD call to read_dev_volume_label\n"
+msgstr ""
+
+#: src/stored/label.c:79 src/stored/label.c:120 src/stored/label.c:208
+#, c-format
+msgid "Wrong Volume mounted on device %s: Wanted %s have %s\n"
+msgstr ""
+
+#: src/stored/label.c:86 src/stored/label.c:123 src/stored/label.c:195
+#, c-format
+msgid "Too many tries: %s"
+msgstr ""
+
+#: src/stored/label.c:102
+#, c-format
+msgid "Couldn't rewind device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:140
+#, c-format
+msgid ""
+"Requested Volume \"%s\" on %s is not a Bacula labeled Volume, because: ERR=%s"
+msgstr ""
+
+#: src/stored/label.c:145
+msgid "Could not read Volume label from block.\n"
+msgstr ""
+
+#: src/stored/label.c:148
+#, c-format
+msgid "Could not unserialize Volume label: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:153
+#, c-format
+msgid "Volume Header Id bad: %s\n"
+msgstr ""
+
+#: src/stored/label.c:180
+#, c-format
+msgid "Volume on %s has wrong Bacula version. Wanted %d got %d\n"
 msgstr ""
 
 #: src/stored/label.c:191
@@ -11484,52 +11610,52 @@ msgstr ""
 msgid "Cannot write Volume label to block for device %s\n"
 msgstr ""
 
-#: src/stored/label.c:393
+#: src/stored/label.c:400
 #, c-format
 msgid "Rewind error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:398
+#: src/stored/label.c:405
 #, c-format
 msgid "Truncate error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:420
+#: src/stored/label.c:427
 #, c-format
 msgid "Unable to write device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:448
+#: src/stored/label.c:455
 #, c-format
 msgid "Recycled volume \"%s\" on device %s, all previous data lost.\n"
 msgstr ""
 
-#: src/stored/label.c:451
+#: src/stored/label.c:458
 #, c-format
 msgid "Wrote label to prelabeled Volume \"%s\" on device %s\n"
 msgstr ""
 
-#: src/stored/label.c:648
+#: src/stored/label.c:657
 #, c-format
 msgid "Bad session label = %d\n"
 msgstr ""
 
-#: src/stored/label.c:666 src/stored/label.c:673
+#: src/stored/label.c:675 src/stored/label.c:682
 #, c-format
 msgid "Error writing Session label to %s: %s\n"
 msgstr ""
 
-#: src/stored/label.c:707
+#: src/stored/label.c:717
 #, c-format
 msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n"
 msgstr ""
 
-#: src/stored/label.c:834
+#: src/stored/label.c:844
 #, c-format
 msgid "Unknown %d"
 msgstr ""
 
-#: src/stored/label.c:838
+#: src/stored/label.c:848
 #, c-format
 msgid ""
 "\n"
@@ -11546,17 +11672,17 @@ msgid ""
 "HostName          : %s\n"
 msgstr ""
 
-#: src/stored/label.c:860
+#: src/stored/label.c:870
 #, c-format
 msgid "Date label written: %s\n"
 msgstr ""
 
-#: src/stored/label.c:866
+#: src/stored/label.c:876
 #, c-format
 msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n"
 msgstr ""
 
-#: src/stored/label.c:886
+#: src/stored/label.c:896
 #, c-format
 msgid ""
 "\n"
@@ -11569,7 +11695,7 @@ msgid ""
 "ClientName        : %s\n"
 msgstr ""
 
-#: src/stored/label.c:899
+#: src/stored/label.c:909
 #, c-format
 msgid ""
 "Job (unique name) : %s\n"
@@ -11578,7 +11704,7 @@ msgid ""
 "JobLevel          : %c\n"
 msgstr ""
 
-#: src/stored/label.c:908
+#: src/stored/label.c:918
 #, c-format
 msgid ""
 "JobFiles          : %s\n"
@@ -11591,118 +11717,132 @@ msgid ""
 "JobStatus         : %c\n"
 msgstr ""
 
-#: src/stored/label.c:929
+#: src/stored/label.c:939
 #, c-format
 msgid "Date written      : %s\n"
 msgstr ""
 
-#: src/stored/label.c:934
+#: src/stored/label.c:944
 #, c-format
 msgid "Date written      : %04d-%02d-%02d at %02d:%02d\n"
 msgstr ""
 
-#: src/stored/label.c:953
+#: src/stored/label.c:963
 msgid "Fresh Volume"
 msgstr ""
 
-#: src/stored/label.c:956
+#: src/stored/label.c:966
 msgid "Volume"
 msgstr ""
 
-#: src/stored/label.c:965 src/stored/read_record.c:335
+#: src/stored/label.c:975 src/stored/read_record.c:336
 msgid "End of Media"
 msgstr ""
 
-#: src/stored/label.c:968
+#: src/stored/label.c:978
 msgid "End of Tape"
 msgstr ""
 
-#: src/stored/label.c:988 src/stored/label.c:996 src/stored/label.c:1029
+#: src/stored/label.c:998 src/stored/label.c:1006 src/stored/label.c:1039
 #, c-format
 msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n"
 msgstr ""
 
-#: src/stored/label.c:993
+#: src/stored/label.c:1003
 msgid "End of physical tape.\n"
 msgstr ""
 
-#: src/stored/label.c:1008 src/stored/label.c:1017
+#: src/stored/label.c:1018 src/stored/label.c:1027
 #, c-format
 msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n"
 msgstr ""
 
-#: src/stored/label.c:1010
+#: src/stored/label.c:1020
 #, c-format
 msgid "   Job=%s Date=%s Level=%c Type=%c\n"
 msgstr ""
 
-#: src/stored/label.c:1019
+#: src/stored/label.c:1029
 #, c-format
 msgid "   Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n"
 msgstr ""
 
-#: src/stored/mount.c:197 src/stored/mount.c:294
+#: src/stored/mount.c:198 src/stored/mount.c:296
 #, c-format
 msgid "Volume \"%s\" not on device %s.\n"
 msgstr ""
 
-#: src/stored/mount.c:230
+#: src/stored/mount.c:225
 #, c-format
 msgid ""
-"Director wanted Volume \"%s\".\n"
+"Director wanted Volume \"%s\" for device %s.\n"
 "    Current Volume \"%s\" not acceptable because:\n"
 "    %s"
 msgstr ""
 
-#: src/stored/mount.c:284
+#: src/stored/mount.c:286
 #, c-format
 msgid "Labeled new Volume \"%s\" on device %s.\n"
 msgstr ""
 
-#: src/stored/mount.c:289
+#: src/stored/mount.c:291
 #, c-format
 msgid "Warning device %s not configured to autolabel Volumes.\n"
 msgstr ""
 
-#: src/stored/mount.c:340
+#: src/stored/mount.c:343
 #, c-format
 msgid "Volume \"%s\" previously written, moving to end of data.\n"
 msgstr ""
 
-#: src/stored/mount.c:343
+#: src/stored/mount.c:346
 #, c-format
 msgid "Unable to position to end of data on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/mount.c:355
+#: src/stored/mount.c:358
 #, c-format
 msgid "Ready to append to end of Volume \"%s\" at file=%d.\n"
 msgstr ""
 
-#: src/stored/mount.c:358
+#: src/stored/mount.c:361
 #, c-format
 msgid ""
 "I cannot write on Volume \"%s\" because:\n"
 "The number of files mismatch! Volume=%u Catalog=%u\n"
 msgstr ""
 
-#: src/stored/mount.c:411
+#: src/stored/mount.c:389
+#, c-format
+msgid "Ready to append to end of Volume \"%s\" at file address=%u.\n"
+msgstr ""
+
+#: src/stored/mount.c:393
+#, c-format
+msgid ""
+"I cannot write on Volume \"%s\" because:\n"
+"The EOD file address is wrong: Volume file address=%u != Catalog Endblock=%u"
+"(+1)\n"
+"You probably removed DVD last part in spool directory.\n"
+msgstr ""
+
+#: src/stored/mount.c:419
 #, c-format
 msgid "Marking Volume \"%s\" in Error in Catalog.\n"
 msgstr ""
 
-#: src/stored/mount.c:427
+#: src/stored/mount.c:435
 #, c-format
 msgid ""
 "Autochanger Volume \"%s\" not found in slot %d.\n"
 "    Setting InChanger to zero in catalog.\n"
 msgstr ""
 
-#: src/stored/mount.c:446
+#: src/stored/mount.c:454
 msgid "Hey!!!!! WroteVol non-zero !!!!!\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:104 src/stored/parse_bsr.c:108
+#: src/stored/parse_bsr.c:106 src/stored/parse_bsr.c:110
 #, c-format
 msgid ""
 "Bootstrap file error: %s\n"
@@ -11710,128 +11850,161 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:130
+#: src/stored/parse_bsr.c:132
 #, c-format
 msgid "Cannot open bootstrap file %s: %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:260
+#: src/stored/parse_bsr.c:262
 #, c-format
 msgid "MediaType %s in bsr at inappropriate place.\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:416
+#: src/stored/parse_bsr.c:283
+#, c-format
+msgid "Device \"%s\" in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:440
 msgid "JobType not yet implemented\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:424
+#: src/stored/parse_bsr.c:448
 msgid "JobLevel not yet implemented\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:626
+#: src/stored/parse_bsr.c:631
+#, c-format
+msgid "Slot %d in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:655
 #, c-format
 msgid "VolFile     : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:634
+#: src/stored/parse_bsr.c:663
 #, c-format
 msgid "VolBlock    : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:644
+#: src/stored/parse_bsr.c:673
 #, c-format
 msgid "FileIndex   : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:646
+#: src/stored/parse_bsr.c:675
 #, c-format
 msgid "FileIndex   : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:656
+#: src/stored/parse_bsr.c:685
 #, c-format
 msgid "JobId       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:658
+#: src/stored/parse_bsr.c:687
 #, c-format
 msgid "JobId       : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:668
+#: src/stored/parse_bsr.c:697
 #, c-format
 msgid "SessId      : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:670
+#: src/stored/parse_bsr.c:699
 #, c-format
 msgid "SessId      : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:679
+#: src/stored/parse_bsr.c:708
 #, c-format
 msgid "VolumeName  : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:688
+#: src/stored/parse_bsr.c:709
+#, c-format
+msgid "  MediaType : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:710
+#, c-format
+msgid "  Device    : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:711
+#, c-format
+msgid "  Slot      : %d\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:720
 #, c-format
 msgid "Client      : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:696
+#: src/stored/parse_bsr.c:728
 #, c-format
 msgid "Job          : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:704
+#: src/stored/parse_bsr.c:736
 #, c-format
 msgid "SessTime    : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:718
+#: src/stored/parse_bsr.c:750
 msgid "BSR is NULL\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:722
+#: src/stored/parse_bsr.c:754
 #, c-format
 msgid "Next        : 0x%x\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:723
+#: src/stored/parse_bsr.c:755
 #, c-format
 msgid "Root bsr    : 0x%x\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:734
-#, c-format
-msgid "Slot        : %u\n"
-msgstr ""
-
-#: src/stored/parse_bsr.c:737
+#: src/stored/parse_bsr.c:766
 #, c-format
 msgid "count       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:738
+#: src/stored/parse_bsr.c:767
 #, c-format
 msgid "found       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:741
+#: src/stored/parse_bsr.c:770
 #, c-format
 msgid "done        : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:742
+#: src/stored/parse_bsr.c:771
 #, c-format
 msgid "positioning : %d\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:743
+#: src/stored/parse_bsr.c:772
 #, c-format
 msgid "fast_reject : %d\n"
 msgstr ""
 
+#: src/stored/pythonsd.c:197
+msgid "Error in ParseTuple\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:213
+msgid "Parse tuple error in job_write\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:250
+#, c-format
+msgid "Error in Python method %s\n"
+msgstr ""
+
 #: src/stored/read.c:55
 msgid "No Volume names found for restore.\n"
 msgstr ""
@@ -11862,45 +12035,127 @@ msgstr ""
 
 #: src/stored/read_record.c:105
 #, c-format
-msgid "Got EOF at file %u  on device %s, Volume \"%s\"\n"
+msgid "End of file %u  on device %s, Volume \"%s\"\n"
 msgstr ""
 
 #: src/stored/read_record.c:119
 msgid "Did fsr\n"
 msgstr ""
 
-#: src/stored/read_record.c:275
+#: src/stored/read_record.c:276
 #, c-format
 msgid "Reposition from (file:block) %u:%u to %u:%u\n"
 msgstr ""
 
-#: src/stored/read_record.c:302
+#: src/stored/read_record.c:303
 #, c-format
 msgid "Forward spacing to file:block %u:%u.\n"
 msgstr ""
 
-#: src/stored/read_record.c:328
+#: src/stored/read_record.c:329
 msgid "Begin Session"
 msgstr ""
 
-#: src/stored/read_record.c:332
+#: src/stored/read_record.c:333
 msgid "End Session"
 msgstr ""
 
-#: src/stored/read_record.c:338
+#: src/stored/read_record.c:339
 #, c-format
 msgid "Unknown code %d\n"
 msgstr ""
 
-#: src/stored/record.c:61
+#: src/stored/record.c:60
 #, c-format
 msgid "unknown: %d"
 msgstr ""
 
-#: src/stored/record.c:332
+#: src/stored/record.c:343
 msgid "Damaged buffer\n"
 msgstr ""
 
+#: src/stored/reserve.c:75
+#, c-format
+msgid "Unable to initialize reservation lock. ERR=%s\n"
+msgstr ""
+
+#: src/stored/reserve.c:496 src/stored/reserve.c:507
+#, c-format
+msgid "Failed command: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:497
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
+"Device resources.\n"
+msgstr ""
+
+#: src/stored/reserve.c:687
+#, c-format
+msgid "3926 Could not get dcr for device: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:752
+#, c-format
+msgid "3601 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:761
+#, c-format
+msgid "3602 JobId=%u device %s is busy (already reading/writing).\n"
+msgstr ""
+
+#: src/stored/reserve.c:808
+#, c-format
+msgid "3603 JobId=%u device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/reserve.c:817
+#, c-format
+msgid "3604 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:883
+#, c-format
+msgid "3605 JobId=%u wants free drive but device %s is busy.\n"
+msgstr ""
+
+#: src/stored/reserve.c:891
+#, c-format
+msgid "3606 JobId=%u wants mounted, but drive %s has no Volume.\n"
+msgstr ""
+
+#: src/stored/reserve.c:901
+#, c-format
+msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:937
+#, c-format
+msgid "3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:980
+#, c-format
+msgid "3609 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:988 src/stored/reserve.c:992
+msgid "Logic error!!!! Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:989
+#, c-format
+msgid "3910 JobId=%u Logic error!!!! drive %s Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:995
+#, c-format
+msgid "3911 JobId=%u failed reserve drive %s.\n"
+msgstr ""
+
 #: src/stored/spool.c:69
 #, c-format
 msgid ""
@@ -11928,256 +12183,272 @@ msgstr ""
 
 #: src/stored/spool.c:199
 #, c-format
-msgid "Committing spooled data to Volume. Despooling %s bytes ...\n"
+msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:203
+#: src/stored/spool.c:204
 #, c-format
 msgid "Writing spooled data to Volume. Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:257 src/stored/spool.c:431 src/stored/spool.c:469
+#: src/stored/spool.c:258 src/stored/spool.c:432 src/stored/spool.c:470
 #, c-format
 msgid "Ftruncate spool file failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:259
+#: src/stored/spool.c:260
 #, c-format
 msgid "Bad return from ftruncate. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:308
+#: src/stored/spool.c:309
 #, c-format
 msgid "Spool header read error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:311
+#: src/stored/spool.c:312
 #, c-format
 msgid "Spool read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:312
+#: src/stored/spool.c:313
 #, c-format
 msgid "Spool header read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:318 src/stored/spool.c:319
+#: src/stored/spool.c:319 src/stored/spool.c:320
 #, c-format
 msgid "Spool block too big. Max %u bytes, got %u\n"
 msgstr ""
 
-#: src/stored/spool.c:324 src/stored/spool.c:325
+#: src/stored/spool.c:325 src/stored/spool.c:326
 #, c-format
 msgid "Spool data read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:382
+#: src/stored/spool.c:383
 msgid "User specified spool size reached.\n"
 msgstr ""
 
-#: src/stored/spool.c:384
+#: src/stored/spool.c:385
 msgid "Bad return from despool in write_block.\n"
 msgstr ""
 
-#: src/stored/spool.c:392
+#: src/stored/spool.c:393
 msgid "Spooling data again ...\n"
 msgstr ""
 
-#: src/stored/spool.c:423
+#: src/stored/spool.c:424
 #, c-format
 msgid "Error writing header to spool file. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:437 src/stored/spool.c:475
+#: src/stored/spool.c:438 src/stored/spool.c:476
 msgid "Fatal despooling error."
 msgstr ""
 
-#: src/stored/spool.c:444
+#: src/stored/spool.c:445
 msgid "Retrying after header spooling error failed.\n"
 msgstr ""
 
-#: src/stored/spool.c:458
+#: src/stored/spool.c:459
 #, c-format
 msgid "Error writing data to spool file. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:485
+#: src/stored/spool.c:486
 msgid "Retrying after data spooling error failed.\n"
 msgstr ""
 
-#: src/stored/spool.c:540 src/stored/spool.c:547
+#: src/stored/spool.c:541 src/stored/spool.c:548
 #, c-format
 msgid "Fseek on attributes file failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:557
+#: src/stored/spool.c:558
 #, c-format
 msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:584
+#: src/stored/spool.c:585
 #, c-format
 msgid "fopen attr spool file %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/status.c:66
+#: src/stored/status.c:67
 #, c-format
 msgid ""
 "\n"
 "%s Version: %s (%s) %s %s %s\n"
 msgstr ""
 
-#: src/stored/status.c:97
+#: src/stored/status.c:103
 msgid ""
 "\n"
 "Device status:\n"
 msgstr ""
 
-#: src/stored/status.c:99
+#: src/stored/status.c:105
 #, c-format
 msgid "Autochanger \"%s\" with devices:\n"
 msgstr ""
 
-#: src/stored/status.c:113
+#: src/stored/status.c:119
 #, c-format
-msgid "Device %s is mounted with Volume \"%s\"\n"
+msgid "Device %s is mounted with Volume=\"%s\" Pool=\"%s\"\n"
 msgstr ""
 
-#: src/stored/status.c:116
+#: src/stored/status.c:123
 #, c-format
 msgid "Device %s open but no Bacula volume is mounted.\n"
 msgstr ""
 
-#: src/stored/status.c:126
+#: src/stored/status.c:133
 #, c-format
 msgid "    Total Bytes=%s Blocks=%s Bytes/block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:140
+#: src/stored/status.c:147
 #, c-format
 msgid "    Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:145
+#: src/stored/status.c:152
 #, c-format
 msgid "    Positioned at File=%s Block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:151
+#: src/stored/status.c:158
 #, c-format
 msgid "Device %s is not open or does not exist.\n"
 msgstr ""
 
-#: src/stored/status.c:153
+#: src/stored/status.c:160
 #, c-format
 msgid "Device \"%s\" is not open or does not exist.\n"
 msgstr ""
 
-#: src/stored/status.c:158 src/stored/status.c:165 src/stored/status.c:168
+#: src/stored/status.c:165 src/stored/status.c:168 src/stored/status.c:172
+#: src/stored/status.c:174
 msgid ""
 "====\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:159
-msgid "Volume status:\n"
+#: src/stored/status.c:166
+msgid "In Use Volume status:\n"
 msgstr ""
 
-#: src/stored/status.c:183
+#: src/stored/status.c:190
 msgid ""
 "No DEVICE structure.\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:188
+#: src/stored/status.c:195
 msgid "    Device is BLOCKED. User unmounted.\n"
 msgstr ""
 
-#: src/stored/status.c:191
+#: src/stored/status.c:198
 msgid "    Device is BLOCKED. User unmounted during wait for media/mount.\n"
 msgstr ""
 
-#: src/stored/status.c:195
+#: src/stored/status.c:202
 #, c-format
 msgid "    Device is BLOCKED waiting for mount of volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/status.c:198
+#: src/stored/status.c:205
 msgid "    Device is BLOCKED waiting for media.\n"
 msgstr ""
 
-#: src/stored/status.c:202
+#: src/stored/status.c:209
 msgid "    Device is being initialized.\n"
 msgstr ""
 
-#: src/stored/status.c:205
+#: src/stored/status.c:212
 msgid "    Device is blocked labeling a Volume.\n"
 msgstr ""
 
-#: src/stored/status.c:213
+#: src/stored/status.c:220
 #, c-format
 msgid "    Slot %d is loaded in drive %d.\n"
 msgstr ""
 
-#: src/stored/status.c:216
+#: src/stored/status.c:223
 #, c-format
 msgid "    Drive %d is not loaded.\n"
 msgstr ""
 
-#: src/stored/status.c:235
+#: src/stored/status.c:242
 msgid "Device state:\n"
 msgstr ""
 
-#: src/stored/status.c:249
+#: src/stored/status.c:256
 #, c-format
 msgid ""
 "num_writers=%d JobStatus=%c block=%d\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:253
+#: src/stored/status.c:260
 #, c-format
 msgid "Archive name: %s Device name: %s\n"
 msgstr ""
 
-#: src/stored/status.c:255
+#: src/stored/status.c:262
 #, c-format
 msgid "File=%u block=%u\n"
 msgstr ""
 
-#: src/stored/status.c:256
+#: src/stored/status.c:263
 #, c-format
 msgid "Min block=%u Max block=%u\n"
 msgstr ""
 
-#: src/stored/status.c:272
+#: src/stored/status.c:280
 #, c-format
 msgid "%s Job %s waiting for Client connection.\n"
 msgstr ""
 
-#: src/stored/status.c:284
+#: src/stored/status.c:295
+#, c-format
+msgid ""
+"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:307
 #, c-format
-msgid "%s %s job %s JobId=%d Volume=\"%s\" device=\"%s\"\n"
+msgid ""
+"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
 msgstr ""
 
-#: src/stored/status.c:303
+#: src/stored/status.c:330
 #, c-format
 msgid "    FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n"
 msgstr ""
 
-#: src/stored/status.c:308
+#: src/stored/status.c:335
 msgid "    FDSocket closed\n"
 msgstr ""
 
-#: src/stored/status.c:335
+#: src/stored/status.c:352
+msgid ""
+"\n"
+"Jobs waiting to reserve a drive:\n"
+msgstr ""
+
+#: src/stored/status.c:380
 msgid " JobId  Level   Files          Bytes Status   Finished        Name \n"
 msgstr ""
 
-#: src/stored/status.c:469
+#: src/stored/status.c:514
 msgid "3900 Bad .status command, missing argument.\n"
 msgstr ""
 
-#: src/stored/status.c:494
+#: src/stored/status.c:537
 msgid "3900 Bad .status command, wrong argument.\n"
 msgstr ""
 
@@ -12202,46 +12473,46 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/stored.c:220
+#: src/stored/stored.c:222
 msgid "Volume Session Time is ZERO!\n"
 msgstr ""
 
-#: src/stored/stored.c:233
+#: src/stored/stored.c:235
 #, c-format
 msgid "Unable to create thread. ERR=%s\n"
 msgstr ""
 
-#: src/stored/stored.c:272
+#: src/stored/stored.c:273
 #, c-format
 msgid "Only one Storage resource permitted in %s\n"
 msgstr ""
 
-#: src/stored/stored.c:277
+#: src/stored/stored.c:278
 #, c-format
 msgid "No Director resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:282
+#: src/stored/stored.c:283
 #, c-format
 msgid "No Device resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:290
+#: src/stored/stored.c:291
 #, c-format
 msgid "No Messages resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:317
+#: src/stored/stored.c:318
 #, c-format
 msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/stored/stored.c:323
+#: src/stored/stored.c:324
 #, c-format
 msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/stored/stored.c:329
+#: src/stored/stored.c:330
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
@@ -12249,311 +12520,151 @@ msgid ""
 "using \"TLS Verify Peer\".\n"
 msgstr ""
 
-#: src/stored/stored.c:417
-#, c-format
-msgid "No Changer Name given for device %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:423
-#, c-format
-msgid "No Changer Command given for device %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:435
-#, c-format
-msgid ""
-"Media Type not the same for all devices in changer %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:496
+#: src/stored/stored.c:457
 #, c-format
 msgid "Could not initialize %s\n"
 msgstr ""
 
-#: src/stored/stored.c:509
+#: src/stored/stored.c:470
 #, c-format
 msgid "Could not open device %s\n"
 msgstr ""
 
-#: src/stored/stored.c:521
+#: src/stored/stored.c:483
 #, c-format
 msgid "Could not mount device %s\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:188
+#: src/stored/stored_conf.c:216
+#, c-format
+msgid "Expected a Device Type keyword, got: %s"
+msgstr ""
+
+#: src/stored/stored_conf.c:231
 #, c-format
 msgid "Warning: no \"%s\" resource (%d) defined.\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:191
+#: src/stored/stored_conf.c:234
 #, c-format
 msgid "dump_resource type=%d\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:307
+#: src/stored/stored_conf.c:350
 #, c-format
 msgid "Warning: unknown resource type %d\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:496
+#: src/stored/stored_conf.c:539
 #, c-format
 msgid "\"%s\" item is required in \"%s\" resource, but not found.\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:502
+#: src/stored/stored_conf.c:545
 #, c-format
 msgid "Too many items in \"%s\" resource\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:536
+#: src/stored/stored_conf.c:579
 #, c-format
 msgid "Cannot find AutoChanger resource %s\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:607
+#: src/stored/stored_conf.c:650
 #, c-format
 msgid ""
 "Attempt to define second \"%s\" resource named \"%s\" is not permitted.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:83
+#: src/stored/wait.c:114
 #, c-format
-msgid "Read error on device %s in ANSI label. ERR=%s\n"
+msgid "pthread timedwait error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:93
-msgid "Insane! End of tape while reading ANSI label.\n"
+#: src/stored/wait.c:199
+#, c-format
+msgid "Job %s waiting to reserve a device.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:117
-msgid "No VOL1 label while reading ANSI/IBM label.\n"
+#: src/tools/bsmtp.c:85
+#, c-format
+msgid "Fatal malformed reply from %s: %s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:137
+#: src/tools/bsmtp.c:121
 #, c-format
-msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
+msgid ""
+"\n"
+"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n"
+"       -c          set the Cc: field\n"
+"       -dnn        set debug level to nn\n"
+"       -f          set the From: field\n"
+"       -h          use mailhost:port as the SMTP server\n"
+"       -s          set the Subject: field\n"
+"       -r          set the Reply-To: field\n"
+"       -l          set the maximum number of lines that should be sent "
+"(default: unlimited)\n"
+"       -?          print this message.\n"
+"\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:148
-msgid "No HDR1 label while reading ANSI label.\n"
+#: src/tools/bsmtp.c:213
+msgid "Fatal error: no recipient given.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:154
+#: src/tools/bsmtp.c:234
 #, c-format
-msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
+msgid "Fatal gethostname error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:165
-msgid "No HDR2 label while reading ANSI/IBM label.\n"
+#: src/tools/bsmtp.c:238
+#, c-format
+msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:179
-msgid "Unknown or bad ANSI/IBM label record.\n"
+#: src/tools/bsmtp.c:263
+#, c-format
+msgid "Error unknown mail host \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:186
-msgid "Too many records in while reading ANSI/IBM label.\n"
+#: src/tools/bsmtp.c:266
+msgid "Retrying connection using \"localhost\".\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:285
+#: src/tools/bsmtp.c:274
 #, c-format
-msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
+msgid "Fatal error: Unknown address family for smtp host: %d\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:302
+#: src/tools/bsmtp.c:282
 #, c-format
-msgid "Could not write ANSI VOL1 label. ERR=%s\n"
+msgid "Fatal socket error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
+#: src/tools/bsmtp.c:286
 #, c-format
-msgid "Could not write ANSI HDR1 label. ERR=%s\n"
+msgid "Fatal connect error to %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
-msgid "Could not write ANSI HDR1 label.\n"
+#: src/tools/bsmtp.c:291
+#, c-format
+msgid "Fatal dup error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:381
+#: src/tools/bsmtp.c:295 src/tools/bsmtp.c:299
 #, c-format
-msgid "Error writing EOF to tape. ERR=%s"
+msgid "Fatal fdopen error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:386
-msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
+#: src/tools/dbcheck.c:158
+msgid ""
+"Warning skipping the additional parameters for working directory/dbname/user/"
+"password/host.\n"
 msgstr ""
 
-#: src/stored/dvd.c:153
+#: src/tools/dbcheck.c:174
 #, c-format
-msgid "Device %s cannot be mounted. ERR=%s\n"
-msgstr ""
-
-#: src/stored/dvd.c:261
-#, c-format
-msgid "Cannot run free space command (%s)\n"
-msgstr ""
-
-#: src/stored/dvd.c:322
-#, c-format
-msgid "Error while writing current part to the DVD: %s"
-msgstr ""
-
-#: src/stored/dvd.c:343
-#, c-format
-msgid "Remaining free space %s on %s\n"
-msgstr ""
-
-#: src/stored/dvd.c:412
-#, c-format
-msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
-msgstr ""
-
-#: src/stored/dvd.c:430
-#, c-format
-msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
-msgstr ""
-
-#: src/stored/dvd.c:634
-#, c-format
-msgid "Unable to write part %s: ERR=%s\n"
-msgstr ""
-
-#: src/stored/wait.c:178 src/stored/wait.c:236
-#, c-format
-msgid "Job %s waiting to reserve a device.\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:202
-msgid "Error in ParseTuple\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:218
-msgid "Parse tuple error in job_write\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:254
-#, c-format
-msgid "Error in Python method %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:373 src/stored/reserve.c:390
-#, c-format
-msgid "Failed command: %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:375
-#, c-format
-msgid ""
-"\n"
-"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
-"Device resources.\n"
-msgstr ""
-
-#: src/stored/reserve.c:564
-#, c-format
-msgid "3926 Could not get dcr for device: %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:615 src/stored/reserve.c:670
-#, c-format
-msgid "Device %s is BLOCKED due to user unmount.\n"
-msgstr ""
-
-#: src/stored/reserve.c:623
-#, c-format
-msgid "Device %s is busy.\n"
-msgstr ""
-
-#: src/stored/reserve.c:678
-#, c-format
-msgid "Device %s is busy writing on another Volume.\n"
-msgstr ""
-
-#: src/stored/reserve.c:777
-#, c-format
-msgid "Wanted Pool \"%s\", but device %s is using Pool \"%s\" .\n"
-msgstr ""
-
-#: src/stored/reserve.c:784 src/stored/reserve.c:785
-msgid "Logic error!!!! Should not get here.\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:85
-#, c-format
-msgid "Fatal malformed reply from %s: %s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:121
-#, c-format
-msgid ""
-"\n"
-"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n"
-"       -c          set the Cc: field\n"
-"       -dnn        set debug level to nn\n"
-"       -f          set the From: field\n"
-"       -h          use mailhost:port as the SMTP server\n"
-"       -s          set the Subject: field\n"
-"       -?          print this message.\n"
-"\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:204
-msgid "Fatal error: no recipient given.\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:225
-#, c-format
-msgid "Fatal gethostname error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:229
-#, c-format
-msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:254
-#, c-format
-msgid "Error unknown mail host \"%s\": ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:257
-msgid "Retrying connection using \"localhost\".\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:265
-#, c-format
-msgid "Fatal error: Unknown address family for smtp host: %d\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:273
-#, c-format
-msgid "Fatal socket error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:277
-#, c-format
-msgid "Fatal connect error to %s: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:282
-#, c-format
-msgid "Fatal dup error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:286 src/tools/bsmtp.c:290
-#, c-format
-msgid "Fatal fdopen error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/dbcheck.c:158
-msgid ""
-"Warning skipping the additional parameters for working directory/dbname/user/"
-"password/host.\n"
-msgstr ""
-
-#: src/tools/dbcheck.c:174
-#, c-format
-msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n"
+msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n"
 msgstr ""
 
 #: src/tools/dbcheck.c:176
@@ -12889,6 +13000,25 @@ msgstr ""
 msgid "Found %d bad Path records.\n"
 msgstr ""
 
+#: src/tools/fstype.c:34
+#, c-format
+msgid ""
+"\n"
+"Usage: fstype [-d debug_level] path ...\n"
+"\n"
+"       Print the file system type a given file/directory is on.\n"
+"       The following options are supported:\n"
+"\n"
+"       -v     print both path and file system type.\n"
+"       -?     print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tools/fstype.c:86
+#, c-format
+msgid "%s: unknown\n"
+msgstr ""
+
 #: src/tools/testfind.c:49
 #, c-format
 msgid ""
@@ -13034,23 +13164,9 @@ msgstr ""
 msgid "Skip: File system change prohibited. Directory not entered. %s\n"
 msgstr ""
 
-#: src/tools/fstype.c:34
-#, c-format
-msgid ""
-"\n"
-"Usage: fstype [-d debug_level] path ...\n"
-"\n"
-"       Print the file system type a given file/directory is on.\n"
-"       The following options are supported:\n"
-"\n"
-"       -v     print both path and file system type.\n"
-"       -?     print this message.\n"
-"\n"
-msgstr ""
-
-#: src/tools/fstype.c:86
+#: src/tools/bwild.c:105 src/tools/bregex.c:121
 #, c-format
-msgid "%s: unknown\n"
+msgid "Could not open data file: %s\n"
 msgstr ""
 
 #: src/tray-monitor/authenticate.c:78
@@ -13179,24 +13295,11 @@ msgstr ""
 
 #: src/tray-monitor/tray-monitor.c:503 src/tray-monitor/tray-monitor.c:513
 msgid ""
-"Copyright (C) 2004 Kern Sibbald and John Walker\n"
+"Copyright (C) 2004-2005 Kern Sibbald\n"
 "Written by Nicolas Boichat\n"
 msgstr ""
 
-#: src/tray-monitor/tray-monitor.c:505
-msgid "Version"
-msgstr ""
-
-#: src/tray-monitor/tray-monitor.c:509
-#, c-format
-msgid ""
-"%s\n"
-"\n"
-"%s\n"
-"%s %s (%s) %s %s %s"
-msgstr ""
-
-#: src/tray-monitor/tray-monitor.c:515
+#: src/tray-monitor/tray-monitor.c:505 src/tray-monitor/tray-monitor.c:515
 msgid "Version:"
 msgstr ""
 
@@ -13392,7 +13495,7 @@ msgstr ""
 msgid "<< Error: BNET_PROMPT signal received. >>\n"
 msgstr ""
 
-#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:445
+#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:465
 msgid "<< Heartbeat signal received, answered. >>\n"
 msgstr ""
 
@@ -13437,710 +13540,899 @@ msgstr ""
 msgid "Storage: name=%s address=%s SDport=%d\n"
 msgstr ""
 
-#: src/wx-console/authenticate.c:126
+#: src/wx-console/authenticate.c:129
 msgid "Bad response to Hello command: ERR="
 msgstr ""
 
-#: src/baconfig.h:52
+#: src/baconfig.h:55
 #, c-format
 msgid "Failed ASSERT: %s\n"
 msgstr ""
 
-#: src/baconfig.h:59
+#: src/baconfig.h:62
 msgid "*None*"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:103
-#, c-format
-msgid ""
-"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
-"Director \"%s\" in config file.\n"
-" At least one CA certificate store is required.\n"
-msgstr ""
-
-#: src/wx-console/console_thread.cpp:112
-msgid ""
-"No Director resource defined in config file.\n"
-"Without that I don't how to speak to the Director :-(\n"
+#: src/filed/win32/winmain.cpp:228 src/filed/win32/winmain.cpp:236
+msgid "Bacula Usage"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:132
-#, c-format
-msgid ""
-"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
-"Console \"%s\" in config file.\n"
+#: src/filed/win32/winmain.cpp:233
+msgid "Bad Command Line Options"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:154
-msgid "Error while initializing windows sockets...\n"
+#: src/filed/win32/winmain.cpp:326
+msgid "Another instance of Bacula is already running"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:169
-msgid "Error while cleaning up windows sockets...\n"
+#: src/filed/win32/winservice.cpp:131 src/filed/win32/winservice.cpp:145
+msgid "No existing instance of Bacula could be contacted"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:207
-msgid "Error while initializing library."
+#: src/filed/win32/winservice.cpp:218
+msgid "KERNEL32.DLL not found: Bacula service not started"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:237
-msgid "Please correct configuration file.\n"
+#: src/filed/win32/winservice.cpp:228
+msgid "Registry service not found: Bacula service not started"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:270
-msgid "Error : Library not initialized\n"
+#: src/filed/win32/winservice.cpp:230
+msgid "Registry service not found"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:281
-msgid "Error : No configuration file loaded\n"
+#: src/filed/win32/winservice.cpp:260
+msgid "StartServiceCtrlDispatcher failed."
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:291
-msgid "Connecting...\n"
+#: src/filed/win32/winservice.cpp:278
+msgid "RegisterServiceCtlHandler failed"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:307
-msgid "Error : No director defined in config file.\n"
+#: src/filed/win32/winservice.cpp:279
+msgid "Contact Register Service Handler failure"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:319
-msgid "Multiple directors found in your config file.\n"
+#: src/filed/win32/winservice.cpp:295
+msgid "ReportStatus STOPPED failed 1"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:328
-#, c-format
-msgid "Please choose a director (1-%d): "
+#: src/filed/win32/winservice.cpp:318
+msgid "Report Service failure"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:400
-msgid "Failed to connect to the director\n"
+#: src/filed/win32/winservice.cpp:355
+msgid "Unable to install Bacula service"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:410
-msgid "Connected\n"
+#: src/filed/win32/winservice.cpp:373
+msgid "Service command length too long"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:448
-msgid "<< Unexpected signal received : "
+#: src/filed/win32/winservice.cpp:374
+msgid "Service command length too long. Service not registered."
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:466
-msgid "Connection terminated\n"
+#: src/filed/win32/winservice.cpp:389
+msgid "Cannot write System Registry"
 msgstr ""
 
-#: src/wx-console/main.cpp:101
-msgid "Bacula wx-console"
+#: src/filed/win32/winservice.cpp:390
+msgid ""
+"The System Registry could not be updated - the Bacula service was not "
+"installed"
 msgstr ""
 
-#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
-#, c-format
-msgid "Welcome to bacula wx-console %s (%s)!\n"
+#: src/filed/win32/winservice.cpp:397
+msgid "Cannot add Bacula key to System Registry"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:41
-msgid "Config file editor"
+#: src/filed/win32/winservice.cpp:398 src/filed/win32/winservice.cpp:449
+msgid "The Bacula service could not be installed"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:57
-msgid "Save and close"
+#: src/filed/win32/winservice.cpp:406
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started by double clicking on the\n"
+"Bacula \"Start\" icon and will be automatically\n"
+"be run the next time this machine is rebooted. "
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:58
-msgid "Close without saving"
+#: src/filed/win32/winservice.cpp:424
+msgid ""
+"The Service Control Manager could not be contacted - the Bacula service was "
+"not installed"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:69
-msgid "# Bacula wx-console Configuration File\n"
+#: src/filed/win32/winservice.cpp:455
+msgid ""
+"Provides file backup and restore services. Bacula -- the network backup "
+"solution."
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:100
-#, c-format
-msgid "Unable to write to %s\n"
+#: src/filed/win32/winservice.cpp:462
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started from the Control Panel and will\n"
+"automatically be run the next time this machine is rebooted."
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:101
-msgid "Error while saving"
+#: src/filed/win32/winservice.cpp:471
+msgid ""
+"Unknown Windows operating system.\n"
+"Cannot install Bacula service.\n"
 msgstr ""
 
-#: src/wx-console/wxbconfigpanel.cpp:184
-msgid "Apply"
+#: src/filed/win32/winservice.cpp:496
+msgid ""
+"Could not find registry entry.\n"
+"Service probably not registerd - the Bacula service was not removed"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:61
-#: src/wx-console/wxbhistorytextctrl.cpp:132
-#: src/wx-console/wxbmainframe.cpp:272
-msgid "Type your command below:"
+#: src/filed/win32/winservice.cpp:501
+msgid ""
+"Could not delete Registry key.\n"
+"The Bacula service could not be removed"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:96
-msgid "Unknown command."
+#: src/filed/win32/winservice.cpp:511
+msgid "Bacula could not be contacted, probably not running"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:105
-msgid "Possible completions: "
+#: src/filed/win32/winservice.cpp:517 src/filed/win32/winservice.cpp:553
+msgid "The Bacula service has been removed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:258
-#: src/wx-console/wxbrestorepanel.cpp:1861
-#: src/wx-console/wxbrestorepanel.cpp:1890
-msgid "Enter restore mode"
+#: src/filed/win32/winservice.cpp:547
+msgid "The Bacula service could not be stopped"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:261
-msgid "Cancel restore"
+#: src/filed/win32/winservice.cpp:555
+msgid "The Bacula service could not be removed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:287
-#: src/wx-console/wxbrestorepanel.cpp:341
-msgid "Add"
+#: src/filed/win32/winservice.cpp:560
+msgid "The Bacula service could not be found"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:289
-#: src/wx-console/wxbrestorepanel.cpp:343
-msgid "Remove"
+#: src/filed/win32/winservice.cpp:565
+msgid "The SCM could not be contacted - the Bacula service was not removed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:291
-#: src/wx-console/wxbrestorepanel.cpp:345
-msgid "Refresh"
+#: src/filed/win32/winservice.cpp:629
+msgid "SetServiceStatus failed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:310
-msgid "M"
+#: src/filed/win32/winservice.cpp:657
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s error: %ld at %s:%d"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:326
-msgid "Perm."
+#: src/filed/win32/winservice.cpp:732
+#, c-format
+msgid "Locked by: %s, duration: %ld seconds\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:359
-#: src/wx-console/wxbrestorepanel.cpp:372
-#: src/wx-console/wxbrestorepanel.cpp:524
-#: src/wx-console/wxbrestorepanel.cpp:534
-#: src/wx-console/wxbrestorepanel.cpp:537
-#: src/wx-console/wxbrestorepanel.cpp:1732
-#: src/wx-console/wxbrestorepanel.cpp:1812
-msgid "Job Name"
+#: src/filed/win32/winservice.cpp:736
+#, c-format
+msgid "No longer locked\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:361
-#: src/wx-console/wxbrestorepanel.cpp:377
-#: src/wx-console/wxbrestorepanel.cpp:476
-#: src/wx-console/wxbrestorepanel.cpp:477
-#: src/wx-console/wxbrestorepanel.cpp:487
-#: src/wx-console/wxbrestorepanel.cpp:488
-#: src/wx-console/wxbrestorepanel.cpp:1101
-#: src/wx-console/wxbrestorepanel.cpp:1768
-#: src/wx-console/wxbrestorepanel.cpp:1827
-msgid "Fileset"
+#: src/filed/win32/winservice.cpp:740
+msgid "Could not lock database"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:364
-#: src/wx-console/wxbrestorepanel.cpp:1168
-#: src/wx-console/wxbrestorepanel.cpp:1183
-#: src/wx-console/wxbrestorepanel.cpp:1185
-#: src/wx-console/wxbrestorepanel.cpp:1193
-#: src/wx-console/wxbrestorepanel.cpp:1195
-#: src/wx-console/wxbrestorepanel.cpp:1212
-#: src/wx-console/wxbrestorepanel.cpp:1219
-#: src/wx-console/wxbrestorepanel.cpp:1759
-#: src/wx-console/wxbrestorepanel.cpp:1885
-msgid "Before"
+#: src/wx-console/console_thread.cpp:101
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Director \"%s\" in config file.\n"
+"At least one CA certificate store is required.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:366
-msgid "Please configure parameters concerning files to restore :"
+#: src/wx-console/console_thread.cpp:108
+msgid ""
+"No Director resource defined in config file.\n"
+"Without that I don't how to speak to the Director :-(\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-#: src/wx-console/wxbrestorepanel.cpp:1820
-msgid "always"
+#: src/wx-console/console_thread.cpp:127
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Console \"%s\" in config file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-msgid "if newer"
+#: src/wx-console/console_thread.cpp:148
+msgid "Error while initializing windows sockets...\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-msgid "if older"
+#: src/wx-console/console_thread.cpp:163
+msgid "Error while cleaning up windows sockets...\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-#: src/wx-console/wxbrestorepanel.cpp:1823
-msgid "never"
+#: src/wx-console/console_thread.cpp:201
+msgid "Error while initializing library."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:383
-msgid "Please configure parameters concerning files restoration :"
+#: src/wx-console/console_thread.cpp:227
+msgid "Cryptographic library initialization failed.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:448
-msgid "Getting parameters list."
+#: src/wx-console/console_thread.cpp:231
+msgid "Please correct configuration file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:456
-msgid "Error : no clients returned by the director."
+#: src/wx-console/console_thread.cpp:273
+msgid "Error : Library not initialized\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:480
-msgid "Error : no filesets returned by the director."
+#: src/wx-console/console_thread.cpp:284
+msgid "Error : No configuration file loaded\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:504
-msgid "Error : no storage returned by the director."
+#: src/wx-console/console_thread.cpp:294
+msgid "Connecting...\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:527
-#: src/wx-console/wxbrestorepanel.cpp:551
-msgid "Error : no jobs returned by the director."
+#: src/wx-console/console_thread.cpp:310
+msgid "Error : No director defined in config file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:537
-msgid "RestoreFiles"
+#: src/wx-console/console_thread.cpp:322
+msgid "Multiple directors found in your config file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:572
-msgid "Please configure your restore parameters."
+#: src/wx-console/console_thread.cpp:331
+#, c-format
+msgid "Please choose a director (1-%d): "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:583
-msgid "Building restore tree..."
+#: src/wx-console/console_thread.cpp:403
+msgid "Failed to connect to the director\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:622
-msgid "Error while starting restore: "
+#: src/wx-console/console_thread.cpp:413
+msgid "Connected\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:712
-msgid ""
-"Right click on a file or on a directory, or double-click on its mark to add "
-"it to the restore list."
+#: src/wx-console/console_thread.cpp:470
+msgid "<< Unexpected signal received : "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:729
-msgid " files selected to be restored."
+#: src/wx-console/console_thread.cpp:490
+msgid "Connection terminated\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:734
-msgid " file selected to be restored."
+#: src/wx-console/main.cpp:101
+msgid "Bacula wx-console"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:741
+#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
 #, c-format
-msgid "Please configure your restore (%ld files selected to be restored)..."
+msgid "Welcome to bacula wx-console %s (%s)!\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:751
-msgid "Restore failed : no file selected.\n"
+#: src/wx-console/wxbconfigfileeditor.cpp:44
+msgid "Config file editor"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:752
-msgid "Restore failed : no file selected."
+#: src/wx-console/wxbconfigfileeditor.cpp:54
+msgid "# Bacula wx-console Configuration File\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:762
-msgid "Restoring, please wait..."
+#: src/wx-console/wxbconfigfileeditor.cpp:90
+msgid "Save and close"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:775
-msgid "Job started. JobId="
+#: src/wx-console/wxbconfigfileeditor.cpp:91
+msgid "Close without saving"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:777
-msgid "Restore started, jobid="
+#: src/wx-console/wxbconfigfileeditor.cpp:118
+#, c-format
+msgid "Unable to write to %s\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:781
-msgid "Job failed."
+#: src/wx-console/wxbconfigfileeditor.cpp:119
+msgid "Error while saving"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:782
-msgid "Restore failed, please look at messages.\n"
+#: src/wx-console/wxbconfigpanel.cpp:184
+msgid "Apply"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:783
-msgid "Restore failed, please look at messages in console."
+#: src/wx-console/wxbhistorytextctrl.cpp:61
+#: src/wx-console/wxbhistorytextctrl.cpp:132
+#: src/wx-console/wxbmainframe.cpp:272
+msgid "Type your command below:"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:789
-#: src/wx-console/wxbrestorepanel.cpp:790
-msgid "Failed to retrieve jobid.\n"
+#: src/wx-console/wxbhistorytextctrl.cpp:96
+msgid "Unknown command."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:816
-msgid ""
-"Restore is scheduled in more than two minutes, wx-console will not wait for "
-"its completion.\n"
+#: src/wx-console/wxbhistorytextctrl.cpp:105
+msgid "Possible completions: "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:817
-msgid ""
-"Restore is scheduled in more than two minutes, wx-console will not wait for "
-"its completion."
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "&About...\tF1"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:841
-msgid "Restore job created, but not yet running."
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "Show about dialog"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:846
-#, c-format
-msgid "Restore job running, please wait (%ld of %ld files restored)..."
+#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:598
+msgid "Connect to the director"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:850
-msgid "Restore job terminated successfully."
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:851
-msgid "Restore job terminated successfully.\n"
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect of the director"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:856
-msgid "Restore job terminated in error, see messages in console."
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change of configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:857
-msgid "Restore job terminated in error, see messages.\n"
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change your default configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:862
-msgid "Restore job reported a non-fatal error."
+#: src/wx-console/wxbmainframe.cpp:233
+msgid "Edit your configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:866
-msgid "Restore job reported a fatal error."
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "E&xit\tAlt-X"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:871
-msgid "Restore job cancelled by user."
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "Quit this program"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:872
-msgid "Restore job cancelled by user.\n"
+#: src/wx-console/wxbmainframe.cpp:239
+msgid "&File"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:877
-msgid "Restore job is waiting on File daemon."
+#: src/wx-console/wxbmainframe.cpp:240
+msgid "&Help"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:881
-msgid "Restore job is waiting for new media."
+#: src/wx-console/wxbmainframe.cpp:257
+msgid "Console"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:885
-msgid "Restore job is waiting for storage resource."
+#: src/wx-console/wxbmainframe.cpp:264
+msgid ""
+"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:889
-msgid "Restore job is waiting for job resource."
+#: src/wx-console/wxbmainframe.cpp:268
+msgid ""
+"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
+"support when handling non-ASCII filenames: Every non-ASCII character in such "
+"filenames will be replaced by an interrogation mark.\n"
+"If this behaviour disturbs you, please build wx-console against a Unicode "
+"version of wxWidgets for GTK+ 2.0.\n"
+"---\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:893
-msgid "Restore job is waiting for Client resource."
+#: src/wx-console/wxbmainframe.cpp:279
+msgid "Send"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:897
-msgid "Restore job is waiting for maximum jobs."
+#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
+msgid "Error while parsing command line arguments, using defaults.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:901
-msgid "Restore job is waiting for start time."
+#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
+msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:905
-msgid "Restore job is waiting for higher priority jobs to finish."
+#: src/wx-console/wxbmainframe.cpp:397
+#, c-format
+msgid ""
+"It seems that it is the first time you run wx-console.\n"
+"This file (%s) has been choosen as default configuration file.\n"
+"Do you want to edit it? (if you click No you will have to select another "
+"file)"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:954
+#: src/wx-console/wxbmainframe.cpp:399
+msgid "First run"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:416
+#, c-format
 msgid ""
-"The restore job has not been started within one minute, wx-console will not "
-"wait for its completion anymore.\n"
+"Unable to read %s\n"
+"Error: %s\n"
+"Do you want to choose another one? (Press no to edit this file)"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:955
+#: src/wx-console/wxbmainframe.cpp:418
+msgid "Unable to read configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:430
+msgid "Please choose a configuration file to use"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:443
+msgid "This configuration file has been successfully read, use it as default?"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:444
+msgid "Configuration file read successfully"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:454
+#, c-format
+msgid "Using this configuration file: %s\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:459
+msgid "Connecting to the director..."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:474
+msgid "Failed to unregister a data parser !"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:482
+msgid "Quitting.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:497
 msgid ""
-"The restore job has not been started within one minute, wx-console will not "
-"wait for its completion anymore."
+"Welcome to Bacula wx-console.\n"
+"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
+"(C) 2005 Kern Sibbald\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:965
-msgid "Restore done successfully.\n"
+#: src/wx-console/wxbmainframe.cpp:499
+msgid "About Bacula wx-console"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:966
-msgid "Restore done successfully."
+#: src/wx-console/wxbmainframe.cpp:505
+msgid "Please choose your default configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1037
-msgid "Applying restore configuration changes..."
+#: src/wx-console/wxbmainframe.cpp:509
+msgid "Use this configuration file as default?"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1088
-msgid "Failed to find the selected client."
+#: src/wx-console/wxbmainframe.cpp:510
+msgid "Configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1103
-msgid "Failed to find the selected fileset."
+#: src/wx-console/wxbmainframe.cpp:581
+msgid "Console thread terminated."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1118
-msgid "Failed to find the selected storage."
+#: src/wx-console/wxbmainframe.cpp:589
+msgid "Connection to the director lost. Quit program?"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1135
-#: src/wx-console/wxbrestorepanel.cpp:1801
-msgid "Run Restore job"
+#: src/wx-console/wxbmainframe.cpp:590
+msgid "Connection lost"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1151
-msgid "Restore configuration changes were applied."
+#: src/wx-console/wxbmainframe.cpp:606
+msgid "Connected to the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1160
-msgid "Restore cancelled.\n"
+#: src/wx-console/wxbmainframe.cpp:629
+msgid "Reconnect"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1161
-msgid "Restore cancelled."
+#: src/wx-console/wxbmainframe.cpp:630
+msgid "Reconnect to the director"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1182
-msgid "No results to list."
+#: src/wx-console/wxbmainframe.cpp:644
+msgid "Disconnected of the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1184
-msgid "No backup found for this client."
+#: src/wx-console/wxbmainframe.cpp:663 src/wx-console/wxbrestorepanel.cpp:689
+msgid "Unexpected question has been received.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1191
-msgid "ERROR"
+#: src/wx-console/wxbmainframe.cpp:686 src/wx-console/wxbmainframe.cpp:703
+msgid "wx-console: unexpected director's question."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1192
-msgid "Query failed"
+#: src/wx-console/wxbrestorepanel.cpp:216
+#: src/wx-console/wxbrestorepanel.cpp:1895
+#: src/wx-console/wxbrestorepanel.cpp:1924
+msgid "Enter restore mode"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1194
-msgid "Cannot get previous backups list, see console."
+#: src/wx-console/wxbrestorepanel.cpp:219
+msgid "Cancel restore"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1811
-msgid "JobName:"
+#: src/wx-console/wxbrestorepanel.cpp:245
+#: src/wx-console/wxbrestorepanel.cpp:299
+msgid "Add"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1815
-msgid "Where:"
+#: src/wx-console/wxbrestorepanel.cpp:247
+#: src/wx-console/wxbrestorepanel.cpp:301
+msgid "Remove"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1818
-msgid "Replace:"
+#: src/wx-console/wxbrestorepanel.cpp:249
+#: src/wx-console/wxbrestorepanel.cpp:303
+msgid "Refresh"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1821
-msgid "ifnewer"
+#: src/wx-console/wxbrestorepanel.cpp:268
+msgid "M"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1822
-msgid "ifolder"
+#: src/wx-console/wxbrestorepanel.cpp:272
+msgid "Filename"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1826
-msgid "FileSet:"
+#: src/wx-console/wxbrestorepanel.cpp:284
+msgid "Perm."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1942
-msgid "Restoring..."
+#: src/wx-console/wxbrestorepanel.cpp:317
+#: src/wx-console/wxbrestorepanel.cpp:330
+#: src/wx-console/wxbrestorepanel.cpp:482
+#: src/wx-console/wxbrestorepanel.cpp:492
+#: src/wx-console/wxbrestorepanel.cpp:495
+#: src/wx-console/wxbrestorepanel.cpp:1760
+#: src/wx-console/wxbrestorepanel.cpp:1846
+msgid "Job Name"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:227
-msgid "&About...\tF1"
+#: src/wx-console/wxbrestorepanel.cpp:319
+#: src/wx-console/wxbrestorepanel.cpp:335
+#: src/wx-console/wxbrestorepanel.cpp:434
+#: src/wx-console/wxbrestorepanel.cpp:435
+#: src/wx-console/wxbrestorepanel.cpp:445
+#: src/wx-console/wxbrestorepanel.cpp:446
+#: src/wx-console/wxbrestorepanel.cpp:1118
+#: src/wx-console/wxbrestorepanel.cpp:1191
+#: src/wx-console/wxbrestorepanel.cpp:1798
+#: src/wx-console/wxbrestorepanel.cpp:1800
+#: src/wx-console/wxbrestorepanel.cpp:1861
+msgid "Fileset"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:227
-msgid "Show about dialog"
+#: src/wx-console/wxbrestorepanel.cpp:322
+#: src/wx-console/wxbrestorepanel.cpp:1185
+#: src/wx-console/wxbrestorepanel.cpp:1201
+#: src/wx-console/wxbrestorepanel.cpp:1203
+#: src/wx-console/wxbrestorepanel.cpp:1211
+#: src/wx-console/wxbrestorepanel.cpp:1213
+#: src/wx-console/wxbrestorepanel.cpp:1232
+#: src/wx-console/wxbrestorepanel.cpp:1239
+#: src/wx-console/wxbrestorepanel.cpp:1788
+#: src/wx-console/wxbrestorepanel.cpp:1799
+#: src/wx-console/wxbrestorepanel.cpp:1919
+msgid "Before"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:591
-msgid "Connect to the director"
+#: src/wx-console/wxbrestorepanel.cpp:324
+msgid "Please configure parameters concerning files to restore :"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:230
-msgid "Disconnect"
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1854
+msgid "always"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:230
-msgid "Disconnect of the director"
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if newer"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:232
-msgid "Change of configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if older"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:232
-msgid "Change your default configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1857
+msgid "never"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:233
-msgid "Edit your configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:341
+msgid "Please configure parameters concerning files restoration :"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:235
-msgid "E&xit\tAlt-X"
+#: src/wx-console/wxbrestorepanel.cpp:406
+msgid "Getting parameters list."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:235
-msgid "Quit this program"
+#: src/wx-console/wxbrestorepanel.cpp:414
+msgid "Error : no clients returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:239
-msgid "&File"
+#: src/wx-console/wxbrestorepanel.cpp:438
+msgid "Error : no filesets returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:240
-msgid "&Help"
+#: src/wx-console/wxbrestorepanel.cpp:462
+msgid "Error : no storage returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:257
-msgid "Console"
+#: src/wx-console/wxbrestorepanel.cpp:485
+#: src/wx-console/wxbrestorepanel.cpp:509
+msgid "Error : no jobs returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:264
-msgid ""
-"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
+#: src/wx-console/wxbrestorepanel.cpp:495
+msgid "RestoreFiles"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:268
+#: src/wx-console/wxbrestorepanel.cpp:530
+msgid "Please configure your restore parameters."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:541
+msgid "Building restore tree..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:584
+msgid "Error while starting restore: "
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:674
 msgid ""
-"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
-"support when handling non-ASCII filenames: Every non-ASCII character in such "
-"filenames will be replaced by an interrogation mark.\n"
-"If this behaviour disturbs you, please build wx-console against a Unicode "
-"version of wxWidgets for GTK+ 2.0.\n"
-"---\n"
+"Right click on a file or on a directory, or double-click on its mark to add "
+"it to the restore list."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:279
-msgid "Send"
+#: src/wx-console/wxbrestorepanel.cpp:711
+#: src/wx-console/wxbrestorepanel.cpp:733
+msgid "wx-console: unexpected restore question."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
-msgid "Error while parsing command line arguments, using defaults.\n"
+#: src/wx-console/wxbrestorepanel.cpp:744
+msgid " files selected to be restored."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
-msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
+#: src/wx-console/wxbrestorepanel.cpp:749
+msgid " file selected to be restored."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:397
+#: src/wx-console/wxbrestorepanel.cpp:756
 #, c-format
+msgid "Please configure your restore (%ld files selected to be restored)..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:766
+msgid "Restore failed : no file selected.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:767
+msgid "Restore failed : no file selected."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:777
+msgid "Restoring, please wait..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:790
+msgid "Job started. JobId="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:792
+msgid "Restore started, jobid="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:796
+msgid "Job failed."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:797
+msgid "Restore failed, please look at messages.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:798
+msgid "Restore failed, please look at messages in console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:804
+#: src/wx-console/wxbrestorepanel.cpp:805
+msgid "Failed to retrieve jobid.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:831
 msgid ""
-"It seems that it is the first time you run wx-console.\n"
-"This file (%s) has been choosen as default configuration file.\n"
-"Do you want to edit it? (if you click No you will have to select another "
-"file)"
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:401
-msgid "First run"
+#: src/wx-console/wxbrestorepanel.cpp:832
+msgid ""
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:418
+#: src/wx-console/wxbrestorepanel.cpp:858
+msgid "Restore job created, but not yet running."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:863
 #, c-format
-msgid ""
-"Unable to read %s\n"
-"Error: %s\n"
-"Do you want to choose another one? (Press no to edit this file)"
+msgid "Restore job running, please wait (%ld of %ld files restored)..."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:422
-msgid "Unable to read configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:867
+msgid "Restore job terminated successfully."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:434
-msgid "Please choose a configuration file to use"
+#: src/wx-console/wxbrestorepanel.cpp:868
+msgid "Restore job terminated successfully.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:447
-msgid "This configuration file has been successfully read, use it as default?"
+#: src/wx-console/wxbrestorepanel.cpp:873
+msgid "Restore job terminated in error, see messages in console."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:448
-msgid "Configuration file read successfully"
+#: src/wx-console/wxbrestorepanel.cpp:874
+msgid "Restore job terminated in error, see messages.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:458
-#, c-format
-msgid "Using this configuration file: %s\n"
+#: src/wx-console/wxbrestorepanel.cpp:879
+msgid "Restore job reported a non-fatal error."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:463
-msgid "Connecting to the director..."
+#: src/wx-console/wxbrestorepanel.cpp:883
+msgid "Restore job reported a fatal error."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:478
-msgid "Failed to unregister a data parser !"
+#: src/wx-console/wxbrestorepanel.cpp:888
+msgid "Restore job cancelled by user."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:486
-msgid "Quitting.\n"
+#: src/wx-console/wxbrestorepanel.cpp:889
+msgid "Restore job cancelled by user.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:501
+#: src/wx-console/wxbrestorepanel.cpp:894
+msgid "Restore job is waiting on File daemon."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:898
+msgid "Restore job is waiting for new media."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:902
+msgid "Restore job is waiting for storage resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:906
+msgid "Restore job is waiting for job resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:910
+msgid "Restore job is waiting for Client resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:914
+msgid "Restore job is waiting for maximum jobs."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:918
+msgid "Restore job is waiting for start time."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:922
+msgid "Restore job is waiting for higher priority jobs to finish."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:971
 msgid ""
-"Welcome to Bacula wx-console.\n"
-"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
-"(C) 2005 Kern Sibbald\n"
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:503
-msgid "About Bacula wx-console"
+#: src/wx-console/wxbrestorepanel.cpp:972
+msgid ""
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:509
-msgid "Please choose your default configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:982
+msgid "Restore done successfully.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:513
-msgid "Use this configuration file as default?"
+#: src/wx-console/wxbrestorepanel.cpp:983
+msgid "Restore done successfully."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:514
-msgid "Configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:1054
+msgid "Applying restore configuration changes..."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:578
-msgid "Console thread terminated."
+#: src/wx-console/wxbrestorepanel.cpp:1105
+msgid "Failed to find the selected client."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:582
-msgid "Connection to the director lost. Quit program?"
+#: src/wx-console/wxbrestorepanel.cpp:1120
+msgid "Failed to find the selected fileset."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:583
-msgid "Connection lost"
+#: src/wx-console/wxbrestorepanel.cpp:1135
+msgid "Failed to find the selected storage."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:599
-msgid "Connected to the director."
+#: src/wx-console/wxbrestorepanel.cpp:1152
+#: src/wx-console/wxbrestorepanel.cpp:1835
+msgid "Run Restore job"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:613
-msgid "Reconnect"
+#: src/wx-console/wxbrestorepanel.cpp:1168
+msgid "Restore configuration changes were applied."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:614
-msgid "Reconnect to the director"
+#: src/wx-console/wxbrestorepanel.cpp:1177
+msgid "Restore cancelled.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:624
-msgid "Disconnected of the director."
+#: src/wx-console/wxbrestorepanel.cpp:1178
+msgid "Restore cancelled."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:643
-msgid "Unexpected question has been received.\n"
+#: src/wx-console/wxbrestorepanel.cpp:1200
+msgid "No results to list."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:666 src/wx-console/wxbmainframe.cpp:681
-msgid "wx-console: unexpected director's question."
+#: src/wx-console/wxbrestorepanel.cpp:1202
+msgid "No backup found for this client."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1209
+msgid "ERROR"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1210
+msgid "Query failed"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1212
+msgid "Cannot get previous backups list, see console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1845
+msgid "JobName:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1849
+msgid "Where:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1852
+msgid "Replace:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1855
+msgid "ifnewer"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1856
+msgid "ifolder"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1860
+msgid "FileSet:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1976
+msgid "Restoring..."
 msgstr ""
diff --git a/bacula/po/es.gmo b/bacula/po/es.gmo
new file mode 100644 (file)
index 0000000..5d5d456
Binary files /dev/null and b/bacula/po/es.gmo differ
diff --git a/bacula/po/es.po b/bacula/po/es.po
new file mode 100644 (file)
index 0000000..4a58fe1
--- /dev/null
@@ -0,0 +1,14438 @@
+# Spanish translations for branch package
+# Traducciones al español para el paquete branch.
+# Copyright (C) 2006 Kern Sibbald
+# This file is distributed under the same license as the branch package.
+#  <kern@sibbald.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: branch 1.38\n"
+"Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2006-05-02 16:47+0200\n"
+"PO-Revision-Date: 2006-04-13 08:14+0200\n"
+"Last-Translator:  <kern@sibbald.com>\n"
+"Language-Team: Spanish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/cats/bdb.c:128
+msgid "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
+msgstr ""
+
+#: src/cats/bdb.c:129
+msgid "WARNING!!!! The Internal Database is NOT OPERATIONAL!\n"
+msgstr ""
+
+#: src/cats/bdb.c:130
+msgid "You should use SQLite, PostgreSQL, or MySQL\n"
+msgstr ""
+
+#: src/cats/bdb.c:152 src/cats/mysql.c:124 src/cats/postgresql.c:128
+#: src/cats/sqlite.c:122
+#, c-format
+msgid "Unable to initialize DB lock. ERR=%s\n"
+msgstr ""
+
+#: src/cats/bdb.c:162
+#, c-format
+msgid "Unable to open Catalog DB control file %s: ERR=%s\n"
+msgstr ""
+
+#: src/cats/bdb.c:217
+#, c-format
+msgid "Error reading catalog DB control file. ERR=%s\n"
+msgstr ""
+
+#: src/cats/bdb.c:220
+#, c-format
+msgid ""
+"Error, catalog DB control file wrong version. Wanted %d, got %d\n"
+"Please reinitialize the working directory.\n"
+msgstr ""
+
+#: src/cats/bdb_update.c:83 src/cats/bdb_update.c:114
+#, c-format
+msgid "Error updating DB Job file. ERR=%s\n"
+msgstr ""
+
+#: src/cats/bdb_update.c:153 src/cats/bdb_update.c:189
+#, c-format
+msgid "Error updating DB Media file. ERR=%s\n"
+msgstr ""
+
+#: src/cats/mysql.c:60
+msgid "A user name for MySQL must be supplied.\n"
+msgstr ""
+
+#: src/cats/mysql.c:161
+#, c-format
+msgid ""
+"Unable to connect to MySQL server. \n"
+"Database=%s User=%s\n"
+"It is probably not running or your password is incorrect.\n"
+msgstr ""
+
+#: src/cats/mysql.c:321 src/cats/postgresql.c:266 src/cats/sqlite.c:323
+#, c-format
+msgid "Query failed: %s: ERR=%s\n"
+msgstr ""
+
+#: src/cats/postgresql.c:62
+msgid "A user name for PostgreSQL must be supplied.\n"
+msgstr ""
+
+#: src/cats/postgresql.c:165
+#, c-format
+msgid ""
+"Unable to connect to PostgreSQL server.\n"
+"Database=%s User=%s\n"
+"It is probably not running or your password is incorrect.\n"
+msgstr ""
+
+#: src/cats/postgresql.c:508
+#, c-format
+msgid "error fetching currval: %s\n"
+msgstr ""
+
+#: src/cats/sql.c:96
+#, c-format
+msgid ""
+"query %s failed:\n"
+"%s\n"
+msgstr ""
+
+#: src/cats/sql.c:118
+#, c-format
+msgid ""
+"insert %s failed:\n"
+"%s\n"
+msgstr ""
+
+#: src/cats/sql.c:132
+#, c-format
+msgid "Insertion problem: affected_rows=%s\n"
+msgstr ""
+
+#: src/cats/sql.c:152
+#, c-format
+msgid ""
+"update %s failed:\n"
+"%s\n"
+msgstr ""
+
+#: src/cats/sql.c:162
+#, c-format
+msgid "Update problem: affected_rows=%s\n"
+msgstr ""
+
+#: src/cats/sql.c:183
+#, c-format
+msgid ""
+"delete %s failed:\n"
+"%s\n"
+msgstr ""
+
+#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:773
+#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:564
+#: src/cats/sql_get.c:639 src/cats/sql_get.c:866
+#, c-format
+msgid "error fetching row: %s\n"
+msgstr ""
+
+#: src/cats/sql.c:326 src/dird/catreq.c:367 src/dird/catreq.c:399
+#: src/dird/catreq.c:424
+#, c-format
+msgid "Attribute create error. %s"
+msgstr ""
+
+#: src/cats/sql.c:407
+#, c-format
+msgid "Path length is zero. File=%s\n"
+msgstr ""
+
+#: src/cats/sql.c:451
+msgid "No results to list.\n"
+msgstr ""
+
+#: src/cats/sql_create.c:86
+#, c-format
+msgid "Create DB Job record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:132
+#, c-format
+msgid "Create JobMedia record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:141
+#, c-format
+msgid "Update Media record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:171
+#, c-format
+msgid "pool record %s already exists\n"
+msgstr ""
+
+#: src/cats/sql_create.c:197
+#, c-format
+msgid "Create db Pool record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:228
+#, c-format
+msgid "Device record %s already exists\n"
+msgstr ""
+
+#: src/cats/sql_create.c:244
+#, c-format
+msgid "Create db Device record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:277
+#, c-format
+msgid "More than one Storage record!: %d\n"
+msgstr ""
+
+#: src/cats/sql_create.c:282
+#, c-format
+msgid "error fetching Storage row: %s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:302
+#, c-format
+msgid "Create DB Storage record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:334
+#, c-format
+msgid "mediatype record %s already exists\n"
+msgstr ""
+
+#: src/cats/sql_create.c:350
+#, c-format
+msgid "Create db mediatype record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:384
+#, c-format
+msgid "Volume \"%s\" already exists.\n"
+msgstr ""
+
+#: src/cats/sql_create.c:422
+#, c-format
+msgid "Create DB Media record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:470
+#, c-format
+msgid "More than one Client!: %d\n"
+msgstr ""
+
+#: src/cats/sql_create.c:475
+#, c-format
+msgid "error fetching Client row: %s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:502
+#, c-format
+msgid "Create DB Client record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:545
+#, c-format
+msgid "Create DB Counters record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:578
+#, c-format
+msgid "More than one FileSet!: %d\n"
+msgstr ""
+
+#: src/cats/sql_create.c:583
+#, c-format
+msgid "error fetching FileSet row: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:613
+#, c-format
+msgid "Create DB FileSet record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:670
+#, c-format
+msgid "Attempt to put non-attributes into catalog. Stream=%d\n"
+msgstr ""
+
+#: src/cats/sql_create.c:733
+#, c-format
+msgid "Create db File record %s failed. ERR=%s"
+msgstr ""
+
+#: src/cats/sql_create.c:766 src/cats/sql_get.c:224
+#, c-format
+msgid "More than one Path!: %s for path: %s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:797
+#, c-format
+msgid "Create db Path record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:830
+#, c-format
+msgid "More than one Filename! %s for file: %s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:836
+#, c-format
+msgid "Error fetching row for file=%s: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:852
+#, c-format
+msgid "Create db Filename record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_delete.c:79
+#, c-format
+msgid "No pool record %s exists\n"
+msgstr ""
+
+#: src/cats/sql_delete.c:84
+#, c-format
+msgid "Expecting one pool record, got %d\n"
+msgstr ""
+
+#: src/cats/sql_delete.c:90
+#, c-format
+msgid "Error fetching row %s\n"
+msgstr ""
+
+#: src/cats/sql_find.c:90 src/cats/sql_find.c:119
+#, c-format
+msgid ""
+"Query error for start time request: ERR=%s\n"
+"CMD=%s\n"
+msgstr ""
+
+#: src/cats/sql_find.c:96
+msgid "No prior Full backup Job record found.\n"
+msgstr ""
+
+#: src/cats/sql_find.c:108
+#, c-format
+msgid "Unknown level=%d\n"
+msgstr ""
+
+#: src/cats/sql_find.c:125
+#, c-format
+msgid ""
+"No Job record found: ERR=%s\n"
+"CMD=%s\n"
+msgstr ""
+
+#: src/cats/sql_find.c:224
+#, c-format
+msgid "Unknown Job level=%d\n"
+msgstr ""
+
+#: src/cats/sql_find.c:234
+#, c-format
+msgid "No Job found for: %s.\n"
+msgstr ""
+
+#: src/cats/sql_find.c:245
+#, c-format
+msgid "No Job found for: %s\n"
+msgstr ""
+
+#: src/cats/sql_find.c:317
+#, c-format
+msgid "Request for Volume item %d greater than max %d or less than 1.\n"
+msgstr ""
+
+#: src/cats/sql_find.c:331
+#, c-format
+msgid "No Volume record found for item %d.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:130
+#, c-format
+msgid "get_file_record want 1 got rows=%d\n"
+msgstr ""
+
+#: src/cats/sql_get.c:135
+#, c-format
+msgid "Error fetching row: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:143
+#, c-format
+msgid "File record for PathId=%s FilenameId=%s not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:149
+msgid "File record not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:174
+#, c-format
+msgid "More than one Filename!: %s for file: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:184
+#, c-format
+msgid "Get DB Filename record %s found bad record: %d\n"
+msgstr ""
+
+#: src/cats/sql_get.c:190
+#, c-format
+msgid "Filename record: %s not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:194
+#, c-format
+msgid "Filename record: %s not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:235
+#, c-format
+msgid "Get DB path record %s found bad record: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:248
+#, c-format
+msgid "Path record: %s not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:252
+#, c-format
+msgid "Path record: %s not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:287
+#, c-format
+msgid "No Job found for JobId %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:344 src/cats/sql_get.c:399
+#, c-format
+msgid "No volumes found for JobId=%d\n"
+msgstr ""
+
+#: src/cats/sql_get.c:350 src/cats/sql_get.c:408
+#, c-format
+msgid "Error fetching row %d: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:364
+#, c-format
+msgid "No Volume for JobId %d found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:480
+#, c-format
+msgid "Pool id select failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:517
+#, c-format
+msgid "Client id select failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:559
+#, c-format
+msgid "More than one Pool!: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:600
+msgid "Pool record not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:634
+#, c-format
+msgid "More than one Client!: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:651 src/cats/sql_get.c:655
+msgid "Client record not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:680
+#, c-format
+msgid "More than one Counter!: %d\n"
+msgstr ""
+
+#: src/cats/sql_get.c:685
+#, c-format
+msgid "error fetching Counter row: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:705
+#, c-format
+msgid "Counter record: %s not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:741
+#, c-format
+msgid "Error got %s FileSets but expected only one!\n"
+msgstr ""
+
+#: src/cats/sql_get.c:746
+#, c-format
+msgid "FileSet record \"%s\" not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:756
+msgid "FileSet record not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:813
+#, c-format
+msgid "Media id select failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:861
+#, c-format
+msgid "More than one Volume!: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:906
+#, c-format
+msgid "Media record MediaId=%s not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:909
+#, c-format
+msgid "Media record for Volume \"%s\" not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:916
+#, c-format
+msgid "Media record for MediaId=%u not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:919
+#, c-format
+msgid "Media record for Vol=%s not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_list.c:53
+#, c-format
+msgid "Query failed: %s\n"
+msgstr ""
+
+#: src/cats/sqlite.c:136
+#, c-format
+msgid "Database %s does not exist, please create it.\n"
+msgstr ""
+
+#: src/cats/sqlite.c:161
+#, c-format
+msgid "Unable to open Database=%s. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sqlite.c:162 src/lib/bnet_server.c:371
+msgid "unknown"
+msgstr ""
+
+#: src/cats/sqlite.c:221
+#, c-format
+msgid "next_index query error: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sqlite.c:226
+#, c-format
+msgid "Error fetching index: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sqlite.c:236
+#, c-format
+msgid "next_index update error: ERR=%s\n"
+msgstr ""
+
+#: src/console/authenticate.c:100 src/dird/authenticate.c:106
+#: src/dird/authenticate.c:206 src/filed/authenticate.c:119
+#: src/filed/authenticate.c:215 src/stored/authenticate.c:128
+#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:106
+msgid ""
+"Authorization problem: Remote server did not advertise required TLS "
+"support.\n"
+msgstr ""
+
+#: src/console/authenticate.c:107 src/dird/authenticate.c:113
+#: src/dird/authenticate.c:213 src/filed/authenticate.c:127
+#: src/filed/authenticate.c:223 src/stored/authenticate.c:136
+#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:112
+msgid "Authorization problem: Remote server requires TLS.\n"
+msgstr ""
+
+#: src/console/authenticate.c:117 src/wx-console/authenticate.c:121
+msgid "TLS negotiation failed\n"
+msgstr ""
+
+#: src/console/authenticate.c:129 src/gnome2-console/authenticate.c:85
+#: src/tray-monitor/authenticate.c:87
+#, c-format
+msgid "Bad response to Hello command: ERR=%s\n"
+msgstr ""
+
+#: src/console/authenticate.c:136 src/gnome2-console/authenticate.c:95
+#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:136
+msgid "Director rejected Hello command\n"
+msgstr ""
+
+#: src/console/authenticate.c:146 src/wx-console/authenticate.c:146
+msgid ""
+"Director authorization problem.\n"
+"Most likely the passwords do not agree.\n"
+"If you are using TLS, there may have been a certificate validation error "
+"during the TLS handshake.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/console/console.c:102
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald\n"
+"\n"
+"Version: "
+msgstr ""
+
+#: src/console/console.c:103 src/dird/admin.c:108
+#, c-format
+msgid " ("
+msgstr ""
+
+#: src/console/console.c:103
+#, c-format
+msgid ""
+") %s %s %s\n"
+"\n"
+"Usage: bconsole [-s] [-c config_file] [-d debug_level]\n"
+"       -c <file>   set configuration file to file\n"
+"       -dnn        set debug level to nn\n"
+"       -s          no signals\n"
+"       -t          test - read configuration and exit\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/console/console.c:150
+msgid "input from file"
+msgstr ""
+
+#: src/console/console.c:151
+msgid "output to file"
+msgstr ""
+
+#: src/console/console.c:152 src/dird/ua_cmds.c:110
+msgid "quit"
+msgstr ""
+
+#: src/console/console.c:153
+msgid "output to file and terminal"
+msgstr ""
+
+#: src/console/console.c:154
+msgid "sleep specified time"
+msgstr ""
+
+#: src/console/console.c:155 src/dird/ua_cmds.c:122
+msgid "print current time"
+msgstr ""
+
+#: src/console/console.c:156
+msgid "print Console's version"
+msgstr ""
+
+#: src/console/console.c:157 src/dird/ua_cmds.c:99
+msgid "exit = quit"
+msgstr ""
+
+#: src/console/console.c:158
+msgid "zed_keys = use zed keys instead of bash keys"
+msgstr ""
+
+#: src/console/console.c:191 src/dird/ua_dotcmds.c:108
+msgid ": is an illegal command\n"
+msgstr ""
+
+#: src/console/console.c:400 src/filed/filed.c:183
+#: src/gnome2-console/console.c:271
+msgid "TLS library initialization failed.\n"
+msgstr ""
+
+#: src/console/console.c:404 src/dird/dird.c:200 src/dird/dird.c:410
+#: src/dird/dird.c:413 src/filed/filed.c:188 src/gnome2-console/console.c:275
+#: src/stored/stored.c:193
+#, c-format
+msgid "Please correct configuration file: %s\n"
+msgstr ""
+
+#: src/console/console.c:421
+msgid "Available Directors:\n"
+msgstr ""
+
+#: src/console/console.c:425
+#, c-format
+msgid "%d  %s at %s:%d\n"
+msgstr ""
+
+#: src/console/console.c:429
+msgid "Select Director: "
+msgstr ""
+
+#: src/console/console.c:435
+#, c-format
+msgid "You must enter a number between 1 and %d\n"
+msgstr ""
+
+#: src/console/console.c:455 src/tray-monitor/tray-monitor.c:858
+#, c-format
+msgid "Connecting to Director %s:%d\n"
+msgstr ""
+
+#: src/console/console.c:471 src/gnome2-console/console.c:504
+#: src/wx-console/console_thread.cpp:370
+#, c-format
+msgid "Failed to initialize TLS context for Console \"%s\".\n"
+msgstr ""
+
+#: src/console/console.c:492 src/gnome2-console/console.c:526
+#: src/wx-console/console_thread.cpp:391
+#, c-format
+msgid "Failed to initialize TLS context for Director \"%s\".\n"
+msgstr ""
+
+#: src/console/console.c:515
+msgid "Enter a period to cancel a command.\n"
+msgstr ""
+
+#: src/console/console.c:582 src/console/console.c:611 src/dird/dird.c:496
+#: src/dird/dird.c:711 src/dird/dird.c:777 src/dird/dird.c:829
+#: src/filed/filed.c:302 src/filed/filed.c:348
+#: src/gnome2-console/console.c:140 src/gnome2-console/console.c:169
+#: src/stored/stored.c:311 src/wx-console/console_thread.cpp:94
+#: src/wx-console/console_thread.cpp:120
+msgid "TLS required but not configured in Bacula.\n"
+msgstr ""
+
+#: src/console/console.c:589 src/gnome2-console/console.c:147
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Director \"%s\" in %s. At least one CA certificate store is required.\n"
+msgstr ""
+
+#: src/console/console.c:598 src/gnome2-console/console.c:156
+#, c-format
+msgid ""
+"No Director resource defined in %s\n"
+"Without that I don't how to speak to the Director :-(\n"
+msgstr ""
+
+#: src/console/console.c:618 src/gnome2-console/console.c:176
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Console \"%s\" in %s.\n"
+msgstr ""
+
+#: src/console/console.c:763
+msgid "Too many arguments on input command.\n"
+msgstr ""
+
+#: src/console/console.c:767
+msgid "First argument to input command must be a filename.\n"
+msgstr ""
+
+#: src/console/console.c:772
+#, c-format
+msgid "Cannot open file %s for input. ERR=%s\n"
+msgstr ""
+
+#: src/console/console.c:802
+msgid "Too many arguments on output/tee command.\n"
+msgstr ""
+
+#: src/console/console.c:818
+#, c-format
+msgid "Cannot open file %s for output. ERR=%s\n"
+msgstr ""
+
+#: src/console/console_conf.c:123 src/gnome2-console/console_conf.c:122
+#: src/wx-console/console_conf.c:128
+#, c-format
+msgid "No record for %d %s\n"
+msgstr ""
+
+#: src/console/console_conf.c:132 src/wx-console/console_conf.c:137
+#, c-format
+msgid "Console: name=%s rcfile=%s histfile=%s\n"
+msgstr ""
+
+#: src/console/console_conf.c:136 src/gnome2-console/console_conf.c:131
+#: src/wx-console/console_conf.c:141
+#, c-format
+msgid "Director: name=%s address=%s DIRport=%d\n"
+msgstr ""
+
+#: src/console/console_conf.c:140 src/console/console_conf.c:216
+#: src/console/console_conf.c:261 src/console/console_conf.c:288
+#: src/filed/filed_conf.c:268 src/filed/filed_conf.c:327
+#: src/filed/filed_conf.c:357 src/gnome2-console/console_conf.c:142
+#: src/gnome2-console/console_conf.c:220 src/gnome2-console/console_conf.c:268
+#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:510
+#: src/stored/stored_conf.c:598 src/stored/stored_conf.c:633
+#: src/wx-console/console_conf.c:145 src/wx-console/console_conf.c:220
+#: src/wx-console/console_conf.c:265 src/wx-console/console_conf.c:292
+#, c-format
+msgid "Unknown resource type %d\n"
+msgstr ""
+
+#: src/console/console_conf.c:242 src/dird/dird_conf.c:1112
+#: src/dird/dird_conf.c:1127 src/filed/filed_conf.c:296
+#: src/gnome2-console/console_conf.c:246 src/tray-monitor/tray_conf.c:262
+#: src/wx-console/console_conf.c:246
+#, c-format
+msgid "%s item is required in %s resource, but not found.\n"
+msgstr ""
+
+#: src/console/console_conf.c:304 src/dird/dird_conf.c:1299
+#: src/filed/filed_conf.c:374 src/gnome2-console/console_conf.c:314
+#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:308
+#, c-format
+msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n"
+msgstr ""
+
+#: src/dird/admin.c:55
+#, c-format
+msgid "Start Admin JobId %d, Job=%s\n"
+msgstr ""
+
+#: src/dird/admin.c:82 src/dird/backup.c:372 src/dird/mac.c:280
+#, c-format
+msgid "Error getting job record for stats: %s"
+msgstr ""
+
+#: src/dird/admin.c:90
+msgid "Admin OK"
+msgstr ""
+
+#: src/dird/admin.c:94
+msgid "*** Admin Error ***"
+msgstr ""
+
+#: src/dird/admin.c:98
+msgid "Admin Canceled"
+msgstr ""
+
+#: src/dird/admin.c:102 src/dird/backup.c:423 src/dird/mac.c:382
+#: src/dird/restore.c:250
+#, c-format
+msgid "Inappropriate term code: %c\n"
+msgstr ""
+
+#: src/dird/admin.c:108
+msgid "Bacula "
+msgstr ""
+
+#: src/dird/admin.c:108
+#, c-format
+msgid ""
+"): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/authenticate.c:67 src/dird/authenticate.c:68
+#: src/tray-monitor/authenticate.c:121
+#, c-format
+msgid "Error sending Hello to Storage daemon. ERR=%s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:93
+msgid "Director and Storage daemon passwords or names not the same.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:95
+msgid ""
+"Director unable to authenticate with Storage daemon. Possible causes:\n"
+"Passwords or names not the same or\n"
+"Maximum Concurrent Jobs exceeded on the SD or\n"
+"SD networking messed up (restart daemon).\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:123 src/dird/authenticate.c:223
+#: src/dird/authenticate.c:356 src/filed/authenticate.c:136
+#: src/filed/authenticate.c:232 src/stored/authenticate.c:145
+#: src/stored/authenticate.c:249
+msgid "TLS negotiation failed.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:132 src/tray-monitor/authenticate.c:134
+#, c-format
+msgid "bdird<stored: bad response to Hello command: ERR=%s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:139 src/dird/authenticate.c:140
+#: src/tray-monitor/authenticate.c:141
+msgid "Storage daemon rejected Hello command\n"
+msgstr ""
+
+#: src/dird/authenticate.c:167 src/tray-monitor/authenticate.c:166
+#, c-format
+msgid "Error sending Hello to File daemon. ERR=%s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:193
+msgid "Director and File daemon passwords or names not the same.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:195
+msgid ""
+"Unable to authenticate with File daemon. Possible causes:\n"
+"Passwords or names not the same or\n"
+"Maximum Concurrent Jobs exceeded on the FD or\n"
+"FD networking messed up (restart daemon).\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:232 src/dird/authenticate.c:234
+#: src/tray-monitor/authenticate.c:179
+#, c-format
+msgid "Bad response from File daemon to Hello command: ERR=%s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:241 src/dird/authenticate.c:242
+#: src/tray-monitor/authenticate.c:186
+msgid "File daemon rejected Hello command\n"
+msgstr ""
+
+#: src/dird/authenticate.c:268
+#, c-format
+msgid "UA Hello from %s:%s:%d is invalid. Len=%d\n"
+msgstr ""
+
+#: src/dird/authenticate.c:275
+#, c-format
+msgid "UA Hello from %s:%s:%d is invalid. Got: %s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:332
+msgid ""
+"Authorization problem: Remote client did not advertise required TLS "
+"support.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:340
+msgid "Authorization problem: Remote client requires TLS.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:368
+#, c-format
+msgid "Unable to authenticate console \"%s\" at %s:%s:%d.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:373
+#, c-format
+msgid "1000 OK: %s Version: %s (%s)\n"
+msgstr ""
+
+#: src/dird/autoprune.c:57
+msgid "Begin pruning Jobs.\n"
+msgstr ""
+
+#: src/dird/autoprune.c:65
+msgid "Begin pruning Files.\n"
+msgstr ""
+
+#: src/dird/autoprune.c:70
+msgid ""
+"End auto prune.\n"
+"\n"
+msgstr ""
+
+#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:124
+#: src/dird/ua_output.c:623
+#, c-format
+msgid "Pool %s not in database. %s"
+msgstr ""
+
+#: src/dird/backup.c:92 src/dird/mac.c:128 src/dird/ua_output.c:631
+#, c-format
+msgid "Pool %s created in database.\n"
+msgstr ""
+
+#: src/dird/backup.c:120
+msgid "Could not start clone job.\n"
+msgstr ""
+
+#: src/dird/backup.c:122
+#, c-format
+msgid "Clone JobId %d started.\n"
+msgstr ""
+
+#: src/dird/backup.c:148
+#, c-format
+msgid "Start Backup JobId %s, Job=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:304
+#, c-format
+msgid "Unexpected Client Job message: %s\n"
+msgstr ""
+
+#: src/dird/backup.c:312
+#, c-format
+msgid "Network error with FD during %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:328
+msgid "No Job status returned from FD.\n"
+msgstr ""
+
+#: src/dird/backup.c:379
+#, c-format
+msgid "Error getting client record for stats: %s"
+msgstr ""
+
+#: src/dird/backup.c:385 src/dird/mac.c:287
+#, c-format
+msgid "Error getting Media record for Volume \"%s\": ERR=%s"
+msgstr ""
+
+#: src/dird/backup.c:396 src/dird/mac.c:355
+msgid "Backup OK -- with warnings"
+msgstr ""
+
+#: src/dird/backup.c:398 src/dird/mac.c:357 src/stored/bscan.c:1060
+msgid "Backup OK"
+msgstr ""
+
+#: src/dird/backup.c:403 src/dird/mac.c:362 src/stored/bscan.c:1064
+msgid "*** Backup Error ***"
+msgstr ""
+
+#: src/dird/backup.c:413 src/dird/mac.c:372 src/stored/bscan.c:1067
+msgid "Backup Canceled"
+msgstr ""
+
+#: src/dird/backup.c:463
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  Backup Level:           %s%s\n"
+"  Client:                 \"%s\" %s\n"
+"  FileSet:                \"%s\" %s\n"
+"  Pool:                   \"%s\"\n"
+"  Storage:                \"%s\"\n"
+"  Scheduled time:         %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Elapsed time:           %s\n"
+"  Priority:               %d\n"
+"  FD Files Written:       %s\n"
+"  SD Files Written:       %s\n"
+"  FD Bytes Written:       %s (%sB)\n"
+"  SD Bytes Written:       %s (%sB)\n"
+"  Rate:                   %.1f KB/s\n"
+"  Software Compression:   %s\n"
+"  Volume name(s):         %s\n"
+"  Volume Session Id:      %d\n"
+"  Volume Session Time:    %d\n"
+"  Last Volume Bytes:      %s (%sB)\n"
+"  Non-fatal FD errors:    %d\n"
+"  SD Errors:              %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/backup.c:554 src/dird/mac.c:315
+#, c-format
+msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:588 src/dird/mac.c:345
+#, c-format
+msgid ""
+"Could not open WriteBootstrap file:\n"
+"%s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/bsr.c:155
+#, c-format
+msgid "Unable to get Job record. ERR=%s\n"
+msgstr ""
+
+#: src/dird/bsr.c:162
+#, c-format
+msgid "Unable to get Job Volume Parameters. ERR=%s\n"
+msgstr ""
+
+#: src/dird/bsr.c:212
+#, c-format
+msgid "Unable to create bootstrap file %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/bsr.c:221
+msgid "Error writing bsr file.\n"
+msgstr ""
+
+#: src/dird/bsr.c:227
+#, c-format
+msgid "Bootstrap records written to %s\n"
+msgstr ""
+
+#: src/dird/bsr.c:231
+msgid "The job will require the following Volumes:\n"
+msgstr ""
+
+#: src/dird/bsr.c:263
+msgid "No Volumes found to restore.\n"
+msgstr ""
+
+#: src/dird/catreq.c:109 src/dird/catreq.c:295
+#, c-format
+msgid "1990 Invalid Catalog Request: %s"
+msgstr ""
+
+#: src/dird/catreq.c:110
+#, c-format
+msgid "Invalid Catalog request; DB not open: %s"
+msgstr ""
+
+#: src/dird/catreq.c:133
+msgid "1901 No Media.\n"
+msgstr ""
+
+#: src/dird/catreq.c:161
+msgid "not in Pool"
+msgstr ""
+
+#: src/dird/catreq.c:163
+msgid "not correct MediaType"
+msgstr ""
+
+#: src/dird/catreq.c:179
+#, c-format
+msgid "1998 Volume \"%s\" status is %s, %s.\n"
+msgstr ""
+
+#: src/dird/catreq.c:184
+#, c-format
+msgid "1997 Volume \"%s\" not in catalog.\n"
+msgstr ""
+
+#: src/dird/catreq.c:205
+#, c-format
+msgid "Unable to get Media record for Volume %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/catreq.c:207
+#, c-format
+msgid "1991 Catalog Request for vol=%s failed: %s"
+msgstr ""
+
+#: src/dird/catreq.c:227
+#, c-format
+msgid ""
+"Volume Files at %u being set to %u for Volume \"%s\". This is incorrect.\n"
+msgstr ""
+
+#: src/dird/catreq.c:230
+#, c-format
+msgid "1992 Update Media error. VolFiles=%u, CatFiles=%u\n"
+msgstr ""
+
+#: src/dird/catreq.c:262
+#, c-format
+msgid "Catalog error updating Media record. %s"
+msgstr ""
+
+#: src/dird/catreq.c:264
+msgid "1993 Update Media error\n"
+msgstr ""
+
+#: src/dird/catreq.c:284
+#, c-format
+msgid "Catalog error creating JobMedia record. %s"
+msgstr ""
+
+#: src/dird/catreq.c:286
+msgid "1991 Update JobMedia error\n"
+msgstr ""
+
+#: src/dird/catreq.c:296
+#, c-format
+msgid "Invalid Catalog request: %s"
+msgstr ""
+
+#: src/dird/catreq.c:330
+#, c-format
+msgid "1991 Invalid Catalog Update: %s"
+msgstr ""
+
+#: src/dird/catreq.c:331
+#, c-format
+msgid "Invalid Catalog Update; DB not open: %s"
+msgstr ""
+
+#: src/dird/catreq.c:405
+msgid "Got MD5/SHA1 but not same File as attributes\n"
+msgstr ""
+
+#: src/dird/catreq.c:429
+#, c-format
+msgid "Catalog error updating MD5/SHA1. %s"
+msgstr ""
+
+#: src/dird/dird.c:71
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n"
+"       -c <file>   set configuration file to file\n"
+"       -dnn        set debug level to nn\n"
+"       -f          run in foreground (for debugging)\n"
+"       -g          groupid\n"
+"       -r <job>    run <job> now\n"
+"       -s          no signals\n"
+"       -t          test - read configuration and exit\n"
+"       -u          userid\n"
+"       -v          verbose user messages\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/dird/dird.c:196 src/stored/stored.c:189
+msgid "Cryptography library initialization failed.\n"
+msgstr ""
+
+#: src/dird/dird.c:396
+msgid "Too many open reload requests. Request ignored.\n"
+msgstr ""
+
+#: src/dird/dird.c:411
+msgid "Out of reload table entries. Giving up.\n"
+msgstr ""
+
+#: src/dird/dird.c:414
+msgid "Resetting previous configuration.\n"
+msgstr ""
+
+#: src/dird/dird.c:474
+#, c-format
+msgid ""
+"No Director resource defined in %s\n"
+"Without that I don't know who I am :-(\n"
+msgstr ""
+
+#: src/dird/dird.c:482 src/filed/filed.c:295
+#, c-format
+msgid "No Messages resource defined in %s\n"
+msgstr ""
+
+#: src/dird/dird.c:487
+#, c-format
+msgid "Only one Director resource permitted in %s\n"
+msgstr ""
+
+#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:363
+#, c-format
+msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:369
+#, c-format
+msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:375
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Director \"%s\" in %s. At least one CA certificate store is required when "
+"using \"TLS Verify Peer\".\n"
+msgstr ""
+
+#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:394
+#, c-format
+msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:541
+#, c-format
+msgid "No Job records defined in %s\n"
+msgstr ""
+
+#: src/dird/dird.c:585 src/dird/dird.c:598
+#, c-format
+msgid "Hey something is wrong. p=0x%lu\n"
+msgstr ""
+
+#: src/dird/dird.c:647
+#, c-format
+msgid "\"%s\" directive in Job \"%s\" resource is required, but not found.\n"
+msgstr ""
+
+#: src/dird/dird.c:654
+msgid "Too many items in Job resource\n"
+msgstr ""
+
+#: src/dird/dird.c:672 src/dird/job.c:104 src/dird/ua_cmds.c:1621
+#: src/dird/ua_output.c:612
+#, c-format
+msgid "Could not open database \"%s\".\n"
+msgstr ""
+
+#: src/dird/dird.c:675
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: src/dird/dird.c:717
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Storage \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:733 src/stored/stored.c:349
+#, c-format
+msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:784
+#, c-format
+msgid "\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:790
+#, c-format
+msgid "\"TLS Key\" file not defined for Console \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:796
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Console \"%s\" in %s. At least one CA certificate store is required when "
+"using \"TLS Verify Peer\".\n"
+msgstr ""
+
+#: src/dird/dird.c:813 src/dird/dird.c:853 src/filed/filed.c:326
+#, c-format
+msgid "Failed to initialize TLS context for File daemon \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:836
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"File daemon \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:443 src/tray-monitor/tray_conf.c:152
+#, c-format
+msgid "No %s resource defined\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:452
+#, c-format
+msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:457
+#, c-format
+msgid "   query_file=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:460 src/dird/dird_conf.c:485 src/dird/dird_conf.c:499
+#: src/dird/dird_conf.c:544 src/dird/dird_conf.c:548 src/dird/dird_conf.c:552
+#: src/dird/dird_conf.c:576 src/dird/dird_conf.c:581 src/dird/dird_conf.c:585
+#: src/dird/dird_conf.c:589 src/dird/dird_conf.c:593 src/dird/dird_conf.c:597
+#: src/dird/dird_conf.c:607
+msgid "  --> "
+msgstr ""
+
+#: src/dird/dird_conf.c:466 src/dird/dird_conf.c:469
+#, c-format
+msgid "Console: name=%s SSL=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:475
+#, c-format
+msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:480
+#, c-format
+msgid "Counter: name=%s min=%d max=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:491
+#, c-format
+msgid "Client: name=%s address=%s FDport=%d MaxJobs=%u\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:494
+#, c-format
+msgid "      JobRetention=%s FileRetention=%s AutoPrune=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:506
+#, c-format
+msgid ""
+"Device: name=%s ok=%d num_writers=%d max_writers=%d\n"
+"      reserved=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=%"
+"d\n"
+"      poolid=%s volname=%s MediaType=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:516
+#, c-format
+msgid ""
+"Storage: name=%s address=%s SDport=%d MaxJobs=%u\n"
+"      DeviceName=%s MediaType=%s StorageId=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:525
+#, c-format
+msgid ""
+"Catalog: name=%s address=%s DBport=%d db_name=%s\n"
+"      db_user=%s MutliDBConn=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:533
+#, c-format
+msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:534 src/dird/ua_cmds.c:441 src/dird/ua_prune.c:454
+#: src/dird/ua_run.c:643 src/dird/ua_select.c:234 src/dird/ua_select.c:257
+msgid "Job"
+msgstr ""
+
+#: src/dird/dird_conf.c:534
+msgid "JobDefs"
+msgstr ""
+
+#: src/dird/dird_conf.c:538
+#, c-format
+msgid ""
+"     MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%"
+"d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:556
+#, c-format
+msgid "  --> Where=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:559
+#, c-format
+msgid "  --> Bootstrap=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:562
+#, c-format
+msgid "  --> RunBefore=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:565
+#, c-format
+msgid "  --> RunAfter=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:568
+#, c-format
+msgid "  --> RunAfterFailed=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:571
+#, c-format
+msgid "  --> WriteBootstrap=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:603
+#, c-format
+msgid "  --> Run=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:614
+#, c-format
+msgid "FileSet: name=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:676 src/dird/dird_conf.c:755
+#, c-format
+msgid "Schedule: name=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:681
+#, c-format
+msgid "  --> Run Level=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:682
+msgid "      hour="
+msgstr ""
+
+#: src/dird/dird_conf.c:691
+msgid "      mday="
+msgstr ""
+
+#: src/dird/dird_conf.c:700
+msgid "      month="
+msgstr ""
+
+#: src/dird/dird_conf.c:709
+msgid "      wday="
+msgstr ""
+
+#: src/dird/dird_conf.c:718
+msgid "      wom="
+msgstr ""
+
+#: src/dird/dird_conf.c:727
+msgid "      woy="
+msgstr ""
+
+#: src/dird/dird_conf.c:736
+#, c-format
+msgid "      mins=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:738 src/dird/dird_conf.c:742 src/dird/dird_conf.c:746
+msgid "     --> "
+msgstr ""
+
+#: src/dird/dird_conf.c:759
+#, c-format
+msgid "Pool: name=%s PoolType=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:761
+#, c-format
+msgid "      use_cat=%d use_once=%d acpt_any=%d cat_files=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:764
+#, c-format
+msgid "      max_vols=%d auto_prune=%d VolRetention=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:767
+#, c-format
+msgid "      VolUse=%s recycle=%d LabelFormat=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:771
+#, c-format
+msgid "      CleaningPrefix=%s LabelType=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:773
+#, c-format
+msgid "      RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:779
+#, c-format
+msgid "Messages: name=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:781
+#, c-format
+msgid "      mailcmd=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:783
+#, c-format
+msgid "      opcmd=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:786 src/tray-monitor/tray_conf.c:179
+#, c-format
+msgid "Unknown resource type %d in dump_resource.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1080 src/tray-monitor/tray_conf.c:232
+#, c-format
+msgid "Unknown resource type %d in free_resource.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1118 src/lib/parse_conf.c:211
+#: src/tray-monitor/tray_conf.c:268
+#, c-format
+msgid "Too many items in %s resource\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1152
+#, c-format
+msgid "Cannot find Console resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1158 src/filed/filed_conf.c:316
+#: src/stored/stored_conf.c:566
+#, c-format
+msgid "Cannot find Director resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1165 src/stored/stored_conf.c:572
+#, c-format
+msgid "Cannot find Storage resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1174
+#, c-format
+msgid "Cannot find Job resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1192
+#, c-format
+msgid "Cannot find Counter resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1200 src/filed/filed_conf.c:322
+#, c-format
+msgid "Cannot find Client resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1212
+#, c-format
+msgid "Cannot find Schedule resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1217 src/tray-monitor/tray_conf.c:287
+#, c-format
+msgid "Unknown resource type %d in save_resource.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1277 src/tray-monitor/tray_conf.c:322
+#, c-format
+msgid "Unknown resource type %d in save_resrouce.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1292
+#, c-format
+msgid "Name item is required in %s resource, but not found.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1304
+#, c-format
+msgid "Inserting %s res: %s index=%d pass=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1377
+#, c-format
+msgid "Expected a Job Type keyword, got: %s"
+msgstr ""
+
+#: src/dird/dird_conf.c:1401
+#, c-format
+msgid "Expected a Job Level keyword, got: %s"
+msgstr ""
+
+#: src/dird/dird_conf.c:1421
+#, c-format
+msgid "Expected a Restore replacement option, got: %s"
+msgstr ""
+
+#: src/dird/expand.c:240
+#, c-format
+msgid "Count not update counter %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:412
+#, c-format
+msgid "Cannot create var context: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:417
+#, c-format
+msgid "Cannot set var callback: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:423
+#, c-format
+msgid "Cannot set var operate: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:429 src/dird/expand.c:444
+#, c-format
+msgid "Cannot unescape string: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:437
+#, c-format
+msgid "Cannot expand expression \"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:455
+#, c-format
+msgid "Cannot destroy var context: ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:74 src/tray-monitor/tray-monitor.c:867
+msgid "File daemon"
+msgstr ""
+
+#: src/dird/fd_cmds.c:105
+#, c-format
+msgid "File daemon \"%s\" rejected Job command: %s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:118
+#, c-format
+msgid "Error updating Client record. ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:123
+#, c-format
+msgid "FD gave bad response to JobId command: %s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:145 src/dird/fd_cmds.c:181
+msgid ", since="
+msgstr ""
+
+#: src/dird/fd_cmds.c:165
+msgid "No prior or suitable Full backup found. Doing FULL backup.\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:166 src/dird/fd_cmds.c:174
+#, c-format
+msgid " (upgraded from %s)"
+msgstr ""
+
+#: src/dird/fd_cmds.c:172
+#, c-format
+msgid "Prior failed job found. Upgrading to %s.\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:197
+msgid "since_utime "
+msgstr ""
+
+#: src/dird/fd_cmds.c:233
+#, c-format
+msgid "Unimplemented backup level %d %c\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:321 src/filed/job.c:559
+#, c-format
+msgid "Cannot run program: %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:332 src/dird/fd_cmds.c:357 src/dird/fd_cmds.c:371
+msgid ">filed: write error on socket\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:338
+#, c-format
+msgid "Error running program: %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:347
+#, c-format
+msgid "Cannot open included file: %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:442 src/filed/job.c:1637
+#, c-format
+msgid "Could not open bootstrap file %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:527
+#, c-format
+msgid ""
+"<filed: bad attributes, expected 3 fields got %d\n"
+"msglen=%d msg=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:572 src/dird/verify.c:697
+#, c-format
+msgid "MD5/SHA1 index %d not same as attributes %d\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:589
+#, c-format
+msgid "<filed: Network error getting attributes. ERR=%s\n"
+msgstr ""
+
+#: src/dird/getmsg.c:130
+#, c-format
+msgid "bget_dirmsg: unknown bnet signal %d\n"
+msgstr ""
+
+#: src/dird/getmsg.c:148 src/dird/getmsg.c:161 src/dird/getmsg.c:173
+#: src/dird/getmsg.c:220 src/dird/getmsg.c:244
+#, c-format
+msgid "Malformed message: %s\n"
+msgstr ""
+
+#: src/dird/getmsg.c:154
+#, c-format
+msgid "Job not found: %s\n"
+msgstr ""
+
+#: src/dird/getmsg.c:313
+#, c-format
+msgid "Bad response to %s command: wanted %s, got %s\n"
+msgstr ""
+
+#: src/dird/getmsg.c:318
+#, c-format
+msgid "Socket error on %s command: ERR=%s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:251
+#, c-format
+msgid "Expected a FileSet option keyword, got:%s:"
+msgstr ""
+
+#: src/dird/inc_conf.c:284
+msgid "Old style Include/Exclude not supported\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:312 src/dird/inc_conf.c:584
+#, c-format
+msgid "Expecting keyword, got: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:320 src/dird/inc_conf.c:590 src/lib/parse_conf.c:819
+#, c-format
+msgid "expected an equals, got: %s"
+msgstr ""
+
+#: src/dird/inc_conf.c:330 src/dird/inc_conf.c:599
+#, c-format
+msgid "Keyword %s not permitted in this resource"
+msgstr ""
+
+#: src/dird/inc_conf.c:383
+#, c-format
+msgid "Regex compile error. ERR=%s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:404
+#, c-format
+msgid "Expected a regex string, got: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:490
+#, c-format
+msgid "Expected a wild-card string, got: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:513
+#, c-format
+msgid "Expected an fstype string, got: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:537
+#, c-format
+msgid "Backslash found. Use forward slashes or quote the string.: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:552
+#, c-format
+msgid "Expected a filename, got: %s"
+msgstr ""
+
+#: src/dird/inc_conf.c:569
+#, c-format
+msgid "Expecting open brace. Got %s"
+msgstr ""
+
+#: src/dird/inc_conf.c:624
+#, c-format
+msgid "Expected a FileSet keyword, got: %s"
+msgstr ""
+
+#: src/dird/job.c:50
+#, c-format
+msgid "Could not init job queue: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:449
+#, c-format
+msgid "Unable to init job cond variable: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:140
+#, c-format
+msgid "Could not add job queue: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:177
+msgid "Job canceled because max start delay time exceeded.\n"
+msgstr ""
+
+#: src/dird/job.c:228 src/dird/job.c:321
+#, c-format
+msgid "Unimplemented job type: %d\n"
+msgstr ""
+
+#: src/dird/job.c:253
+#, c-format
+msgid "RunBefore: %s"
+msgstr ""
+
+#: src/dird/job.c:258
+#, c-format
+msgid "RunBeforeJob error: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:339
+#, c-format
+msgid "RunAfter: %s"
+msgstr ""
+
+#: src/dird/job.c:349
+#, c-format
+msgid "RunAfterJob error: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:351
+#, c-format
+msgid "RunAfterFailedJob error: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:390
+#, c-format
+msgid "JobId %d, Job %s marked to be canceled.\n"
+msgstr ""
+
+#: src/dird/job.c:401
+msgid "Failed to connect to File daemon.\n"
+msgstr ""
+
+#: src/dird/job.c:423 src/dird/ua_cmds.c:680 src/dird/ua_cmds.c:1327
+#: src/dird/ua_label.c:712
+msgid "Failed to connect to Storage daemon.\n"
+msgstr ""
+
+#: src/dird/job.c:557 src/dird/job.c:605
+#, c-format
+msgid "Unhandled job status code %d\n"
+msgstr ""
+
+#: src/dird/job.c:633 src/stored/bscan.c:908
+#, c-format
+msgid "Could not create Client record. ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:665
+msgid "FileSet MD5 signature not found.\n"
+msgstr ""
+
+#: src/dird/job.c:670
+#, c-format
+msgid "Could not create FileSet \"%s\" record. ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:709
+#, c-format
+msgid "Error updating job record. %s"
+msgstr ""
+
+#: src/dird/jobq.c:62
+#, c-format
+msgid "pthread_attr_init: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:71
+#, c-format
+msgid "pthread_mutex_init: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:77
+#, c-format
+msgid "pthread_cond_init: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:110 src/dird/jobq.c:234 src/dird/jobq.c:299
+#: src/dird/jobq.c:380
+#, c-format
+msgid "pthread_mutex_lock: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:123
+#, c-format
+msgid "pthread_cond_broadcast: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:131
+#, c-format
+msgid "pthread_cond_wait: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:139
+#, c-format
+msgid "pthread_mutex_unlock: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:175
+#, c-format
+msgid "Job %s waiting %d seconds for scheduled start time.\n"
+msgstr ""
+
+#: src/dird/jobq.c:227
+#, c-format
+msgid "pthread_thread_create: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:345
+#, c-format
+msgid "pthread_cond_signal: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:354
+#, c-format
+msgid "pthread_create: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:481
+#, c-format
+msgid "Rescheduled Job %s at %s to re-run in %d seconds.\n"
+msgstr ""
+
+#: src/dird/mac.c:77 src/dird/verify.c:92
+msgid "Unable to find JobId of previous Job for this client.\n"
+msgstr ""
+
+#: src/dird/mac.c:85 src/dird/verify.c:108
+#, c-format
+msgid "Could not get job record for previous Job. ERR=%s"
+msgstr ""
+
+#: src/dird/mac.c:90 src/dird/verify.c:113
+#, c-format
+msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
+msgstr ""
+
+#: src/dird/mac.c:94
+#, c-format
+msgid "%s using JobId=%d Job=%s\n"
+msgstr ""
+
+#: src/dird/mac.c:185
+#, c-format
+msgid "Start %s JobId %s, Job=%s\n"
+msgstr ""
+
+#: src/dird/mac.c:421
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  Backup Level:           %s%s\n"
+"  Client:                 %s\n"
+"  FileSet:                \"%s\" %s\n"
+"  Pool:                   \"%s\"\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  FD Files Written:       %s\n"
+"  SD Files Written:       %s\n"
+"  FD Bytes Written:       %s\n"
+"  SD Bytes Written:       %s\n"
+"  Rate:                   %.1f KB/s\n"
+"  Software Compression:   %s\n"
+"  Volume name(s):         %s\n"
+"  Volume Session Id:      %d\n"
+"  Volume Session Time:    %d\n"
+"  Last Volume Bytes:      %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  SD Errors:              %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/msgchan.c:80 src/filed/job.c:1125
+#: src/tray-monitor/tray-monitor.c:874
+msgid "Storage daemon"
+msgstr ""
+
+#: src/dird/msgchan.c:171
+#, c-format
+msgid "Storage daemon rejected Job command: %s\n"
+msgstr ""
+
+#: src/dird/msgchan.c:178
+#, c-format
+msgid "<stored: bad response to Job command: %s\n"
+msgstr ""
+
+#: src/dird/msgchan.c:262
+#, c-format
+msgid ""
+"\n"
+"     Storage daemon didn't accept Device \"%s\" because:\n"
+"     %s"
+msgstr ""
+
+#: src/dird/msgchan.c:266
+#, c-format
+msgid ""
+"\n"
+"     Storage daemon didn't accept Device \"%s\" command.\n"
+msgstr ""
+
+#: src/dird/msgchan.c:289 src/dird/msgchan.c:434
+#, c-format
+msgid "Cannot create message thread: %s\n"
+msgstr ""
+
+#: src/dird/newvol.c:77
+#, c-format
+msgid "Illegal character in Volume name \"%s\"\n"
+msgstr ""
+
+#: src/dird/newvol.c:89
+#, c-format
+msgid "Created new Volume \"%s\" in catalog.\n"
+msgstr ""
+
+#: src/dird/newvol.c:117
+#, c-format
+msgid "Wanted to create Volume \"%s\", but it already exists. Trying again.\n"
+msgstr ""
+
+#: src/dird/newvol.c:126
+msgid "Too many failures. Giving up creating Volume name.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:128
+#, c-format
+msgid "Purging oldest volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/next_vol.c:134
+#, c-format
+msgid "Pruning oldest volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/next_vol.c:153
+msgid "We seem to be looping trying to find the next volume. I give up.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:178
+#, c-format
+msgid "Max Volume bytes exceeded. Marking Volume \"%s\" as Full.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:185
+#, c-format
+msgid "Volume used once. Marking Volume \"%s\" as Used.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:192
+#, c-format
+msgid "Max Volume jobs exceeded. Marking Volume \"%s\" as Used.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:199
+#, c-format
+msgid "Max Volume files exceeded. Marking Volume \"%s\" as Used.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:209
+#, c-format
+msgid "Max configured use duration exceeded. Marking Volume \"%s\" as Used.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:219
+#, c-format
+msgid "Catalog error updating volume \"%s\". ERR=%s"
+msgstr ""
+
+#: src/dird/next_vol.c:240
+msgid "volume has expired"
+msgstr ""
+
+#: src/dird/next_vol.c:258 src/dird/next_vol.c:294
+#, c-format
+msgid "Recycled current volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/next_vol.c:263
+msgid "and recycling of current volume failed"
+msgstr ""
+
+#: src/dird/next_vol.c:269
+msgid "but should be Append, Purged or Recycle"
+msgstr ""
+
+#: src/dird/next_vol.c:297
+msgid ""
+"but should be Append, Purged or Recycle (recycling of the current volume "
+"failed)"
+msgstr ""
+
+#: src/dird/next_vol.c:301
+msgid ""
+"but should be Append, Purged or Recycle (cannot automatically recycle "
+"current volume, as it still contains unpruned data or the Volume Retention "
+"time has not expired.)"
+msgstr ""
+
+#: src/dird/next_vol.c:342
+#, c-format
+msgid "Unable to get Pool record: ERR=%s"
+msgstr ""
+
+#: src/dird/next_vol.c:347
+#, c-format
+msgid "Unable add Scratch Volume, Pool \"%s\" full MaxVols=%d\n"
+msgstr ""
+
+#: src/dird/next_vol.c:360
+#, c-format
+msgid "Failed to move Scratch Volume. ERR=%s\n"
+msgstr ""
+
+#: src/dird/next_vol.c:364
+#, c-format
+msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:372
+#, c-format
+msgid "Unable to update Volume record: ERR=%s"
+msgstr ""
+
+#: src/dird/pythondir.c:107 src/filed/pythonfd.c:96 src/filed/pythonfd.c:150
+#: src/filed/pythonfd.c:214 src/stored/pythonsd.c:90 src/stored/pythonsd.c:155
+msgid "Job pointer not found."
+msgstr ""
+
+#: src/dird/pythondir.c:139
+msgid "Pool record not found."
+msgstr ""
+
+#: src/dird/pythondir.c:168 src/filed/pythonfd.c:127 src/stored/pythonsd.c:132
+#, c-format
+msgid "Attribute %s not found."
+msgstr ""
+
+#: src/dird/pythondir.c:211 src/dird/pythondir.c:217 src/filed/pythonfd.c:169
+#: src/stored/pythonsd.c:172
+msgid "Read-only attribute"
+msgstr ""
+
+#: src/dird/pythondir.c:243
+msgid "Priority must be 1-100"
+msgstr ""
+
+#: src/dird/pythondir.c:248
+msgid "Job Level can be set only during JobInit"
+msgstr ""
+
+#: src/dird/pythondir.c:259
+msgid "Bad JobLevel string"
+msgstr ""
+
+#: src/dird/recycle.c:99
+#, c-format
+msgid "Recycled volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/restore.c:70
+msgid "Cannot restore without bootstrap file.\n"
+msgstr ""
+
+#: src/dird/restore.c:77
+#, c-format
+msgid "Start Restore Job %s\n"
+msgstr ""
+
+#: src/dird/restore.c:223
+msgid "Restore OK -- warning file count mismatch"
+msgstr ""
+
+#: src/dird/restore.c:225
+msgid "Restore OK"
+msgstr ""
+
+#: src/dird/restore.c:230
+msgid "*** Restore Error ***"
+msgstr ""
+
+#: src/dird/restore.c:240
+msgid "Restore Canceled"
+msgstr ""
+
+#: src/dird/restore.c:267
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  Client:                 %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Expected:         %s\n"
+"  Files Restored:         %s\n"
+"  Bytes Restored:         %s\n"
+"  Rate:                   %.1f KB/s\n"
+"  FD Errors:              %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/run_conf.c:188
+#, c-format
+msgid "Expected an equals, got: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:201 src/dird/run_conf.c:213
+#, c-format
+msgid "Expect a YES or NO, got: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:227
+#, c-format
+msgid "Job level field: %s not found in run record"
+msgstr ""
+
+#: src/dird/run_conf.c:245
+#, c-format
+msgid "Could not find specified Pool Resource: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:270
+#, c-format
+msgid "Could not find specified Storage Resource: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:282
+#, c-format
+msgid "Could not find specified Messages Resource: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:290
+#, c-format
+msgid "Expected a keyword name, got: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:327
+msgid "Day number out of range (1-31)"
+msgstr ""
+
+#: src/dird/run_conf.c:344 src/dird/run_conf.c:490
+msgid "Week number out of range (0-53)"
+msgstr ""
+
+#: src/dird/run_conf.c:359
+#, c-format
+msgid "Job type field: %s in run record not found"
+msgstr ""
+
+#: src/dird/run_conf.c:366
+#, c-format
+msgid "Unexpected token: %d:%s"
+msgstr ""
+
+#: src/dird/run_conf.c:410
+msgid "Time must be preceded by keyword AT."
+msgstr ""
+
+#: src/dird/run_conf.c:418
+msgid "Time logic error.\n"
+msgstr ""
+
+#: src/dird/run_conf.c:430 src/dird/run_conf.c:446
+msgid "Bad time specification."
+msgstr ""
+
+#: src/dird/run_conf.c:459
+msgid "Range logic error.\n"
+msgstr ""
+
+#: src/dird/run_conf.c:468
+msgid "Bad day range specification."
+msgstr ""
+
+#: src/dird/run_conf.c:515
+msgid "Invalid month, week or position day range"
+msgstr ""
+
+#: src/dird/run_conf.c:530
+msgid "Invalid month, weekday or position range"
+msgstr ""
+
+#: src/dird/run_conf.c:589
+msgid "Unexpected run state\n"
+msgstr ""
+
+#: src/dird/scheduler.c:80
+#, c-format
+msgid "Job %s not found\n"
+msgstr ""
+
+#: src/dird/scheduler.c:103
+msgid "Walk queue"
+msgstr ""
+
+#: src/dird/scheduler.c:113
+msgid "Dequeued job"
+msgstr ""
+
+#: src/dird/scheduler.c:116
+msgid "Scheduler logic error\n"
+msgstr ""
+
+#: src/dird/scheduler.c:132
+msgid "Run job"
+msgstr ""
+
+#: src/dird/scheduler.c:349
+msgid "Inserted job"
+msgstr ""
+
+#: src/dird/scheduler.c:357
+msgid "Appended job"
+msgstr ""
+
+#: src/dird/scheduler.c:361
+msgid "Run queue"
+msgstr ""
+
+#: src/dird/ua_cmds.c:90
+msgid "add media to a pool"
+msgstr ""
+
+#: src/dird/ua_cmds.c:91
+msgid "autodisplay [on|off] -- console messages"
+msgstr ""
+
+#: src/dird/ua_cmds.c:92
+msgid "automount [on|off] -- after label"
+msgstr ""
+
+#: src/dird/ua_cmds.c:93
+msgid "cancel [<jobid=nnn> | <job=name>] -- cancel a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:94
+msgid "create DB Pool from resource"
+msgstr ""
+
+#: src/dird/ua_cmds.c:95
+msgid "delete [pool=<pool-name> | media volume=<volume-name>]"
+msgstr ""
+
+#: src/dird/ua_cmds.c:96
+msgid "disable <job=name> -- disable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:97
+msgid "enable <job=name> -- enable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:98
+msgid "performs FileSet estimate, listing gives full listing"
+msgstr ""
+
+#: src/dird/ua_cmds.c:100
+msgid "gui [on|off] -- non-interactive gui mode"
+msgstr ""
+
+#: src/dird/ua_cmds.c:101 src/stored/btape.c:2540
+msgid "print this command"
+msgstr ""
+
+#: src/dird/ua_cmds.c:102
+msgid ""
+"list [pools | jobs | jobtotals | media <pool=pool-name> | files <jobid=nn>]; "
+"from catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:103
+msgid "label a tape"
+msgstr ""
+
+#: src/dird/ua_cmds.c:104
+msgid "full or long list like list command"
+msgstr ""
+
+#: src/dird/ua_cmds.c:105
+msgid "messages"
+msgstr ""
+
+#: src/dird/ua_cmds.c:106
+msgid "mount <storage-name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:107
+msgid "prune expired records from catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:108
+msgid "purge records from catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:109
+msgid "python control commands"
+msgstr ""
+
+#: src/dird/ua_cmds.c:111
+msgid "query catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:112
+msgid "restore files"
+msgstr ""
+
+#: src/dird/ua_cmds.c:113
+msgid "relabel a tape"
+msgstr ""
+
+#: src/dird/ua_cmds.c:114
+msgid "release <storage-name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:115
+msgid "reload conf file"
+msgstr ""
+
+#: src/dird/ua_cmds.c:116
+msgid "run <job-name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:117
+msgid "status [storage | client]=<name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:118
+msgid "sets debug level"
+msgstr ""
+
+#: src/dird/ua_cmds.c:119
+msgid "sets new client address -- if authorized"
+msgstr ""
+
+#: src/dird/ua_cmds.c:120
+msgid "show (resource records) [jobs | pools | ... | all]"
+msgstr ""
+
+#: src/dird/ua_cmds.c:121
+msgid "use SQL to query catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:123
+msgid "turn on/off trace to file"
+msgstr ""
+
+#: src/dird/ua_cmds.c:124
+msgid "unmount <storage-name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:125
+msgid "umount <storage-name> for old-time Unix guys"
+msgstr ""
+
+#: src/dird/ua_cmds.c:126
+msgid "update Volume, Pool or slots"
+msgstr ""
+
+#: src/dird/ua_cmds.c:127
+msgid "use catalog xxx"
+msgstr ""
+
+#: src/dird/ua_cmds.c:128
+msgid "does variable expansion"
+msgstr ""
+
+#: src/dird/ua_cmds.c:129
+msgid "print Director version"
+msgstr ""
+
+#: src/dird/ua_cmds.c:130
+msgid ""
+"wait until no jobs are running [<jobname=name> | <jobid=nnn> | "
+"<ujobid=complete_name>]"
+msgstr ""
+
+#: src/dird/ua_cmds.c:168
+#, c-format
+msgid "%s: is an illegal command.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:206
+msgid ""
+"You probably don't want to be using this command since it\n"
+"creates database records without labeling the Volumes.\n"
+"You probably want to use the \"label\" command.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:225
+#, c-format
+msgid "Pool already has maximum volumes=%d\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:227
+msgid "Enter new maximum (zero for unlimited): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:248
+#, c-format
+msgid "Enter number of Volumes to create. 0=>fixed name. Max=%d: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:254
+#, c-format
+msgid "The number must be between 0 and %d\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:261
+msgid "Enter Volume name: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:265
+msgid "Enter base volume name: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:274 src/dird/ua_label.c:609
+msgid "Volume name too long.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:278 src/dird/ua_label.c:615 src/lib/edit.c:446
+msgid "Volume name must be at least one character long.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:287
+msgid "Enter the starting number: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:292
+msgid "Start number must be greater than zero.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:303
+msgid "Enter slot (0 for none): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:307
+msgid "InChanger? yes/no: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:334
+#, c-format
+msgid "%d Volumes created in pool %s\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:350 src/dird/ua_cmds.c:927
+msgid "Turn on or off? "
+msgstr ""
+
+#: src/dird/ua_cmds.c:358 src/dird/ua_cmds.c:935
+msgid "off"
+msgstr ""
+
+#: src/dird/ua_cmds.c:378
+msgid "jobid"
+msgstr ""
+
+#: src/dird/ua_cmds.c:385
+#, c-format
+msgid "JobId %s is not running. Use Job name to cancel inactive jobs.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:389
+msgid "job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:394 src/dird/ua_cmds.c:404
+#, c-format
+msgid "Warning Job %s is not running. Continuing anyway ...\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:399
+msgid "ujobid"
+msgstr ""
+
+#: src/dird/ua_cmds.c:427 src/filed/status.c:195 src/stored/status.c:343
+msgid "No Jobs running.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:430
+msgid "Select Job:\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:436
+#, c-format
+msgid "JobId=%s Job=%s"
+msgstr ""
+
+#: src/dird/ua_cmds.c:441
+msgid "Choose Job to cancel"
+msgstr ""
+
+#: src/dird/ua_cmds.c:445
+msgid "Confirm cancel (yes/no): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:452
+#, c-format
+msgid "Job %s not found.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:557
+#, c-format
+msgid ""
+"Error: Pool %s already exists.\n"
+"Use update to change it.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:568
+#, c-format
+msgid "Pool %s created.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:581
+msgid "restart"
+msgstr ""
+
+#: src/dird/ua_cmds.c:585
+msgid "Python interpreter restarted.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:587 src/dird/ua_cmds.c:1155
+msgid "Nothing done.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:603 src/dird/ua_cmds.c:649
+msgid "Illegal command from this console.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:610 src/dird/ua_run.c:353
+#, c-format
+msgid "Client \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:619
+#, c-format
+msgid "Client \"%s\" address set to %s\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:644
+#, c-format
+msgid "Job \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:653
+#, c-format
+msgid "Job \"%s\" %sabled\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:677 src/dird/ua_status.c:286
+#, c-format
+msgid "Connecting to Storage daemon %s at %s:%d\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:683 src/dird/ua_status.c:297
+msgid "Connected to storage daemon\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:703 src/dird/ua_cmds.c:1042 src/dird/ua_status.c:324
+#, c-format
+msgid "Connecting to Client %s at %s:%d\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:706 src/dird/ua_cmds.c:1045
+msgid "Failed to connect to Client.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:822
+msgid "Enter new debug level: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:888
+msgid "Available daemons are: \n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:893
+msgid "Select daemon type to set debug level"
+msgstr ""
+
+#: src/dird/ua_cmds.c:997 src/dird/ua_run.c:478
+#, c-format
+msgid "Level %s not valid.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1010
+msgid "No job specified.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1050
+msgid "Error sending include list.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1055
+msgid "Error sending exclude list.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1141
+msgid ""
+"In general it is not a good idea to delete either a\n"
+"Pool or a Volume since they may contain data.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1144
+msgid "Choose catalog item to delete"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1212
+msgid "Enter JobId to delete: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:1255
+#, c-format
+msgid "Job %s and associated records deleted from the catalog.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1268
+#, c-format
+msgid ""
+"\n"
+"This command will delete volume %s\n"
+"and all Jobs saved on that volume from the Catalog\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1272
+msgid "Are you sure you want to delete this Volume? (yes/no): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:1293
+msgid "Are you sure you want to delete this Pool? (yes/no): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:1390
+#, c-format
+msgid "Using Catalog name=%s DB=%s\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1450
+msgid "ERR: Can't open db\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1486
+msgid "ERR: Job was not found\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1562 src/dird/ua_tree.c:629 src/stored/btape.c:2587
+#, c-format
+msgid ""
+"  Command    Description\n"
+"  =======    ===========\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1564
+#, c-format
+msgid "  %-10s %s\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1566
+msgid ""
+"\n"
+"When at a prompt, entering a period cancels the command.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1582
+#, c-format
+msgid "%s Version: %s (%s)\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1601
+msgid "Could not find a Catalog resource\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1604
+msgid "You must specify a \"use <catalog-name>\" command before continuing.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1608
+#, c-format
+msgid "Using default Catalog name=%s DB=%s\n"
+msgstr ""
+
+#: src/dird/ua_dotcmds.c:131
+msgid "The Director will segment fault.\n"
+msgstr ""
+
+#: src/dird/ua_dotcmds.c:245 src/dird/ua_restore.c:737
+#: src/dird/ua_restore.c:775 src/dird/ua_restore.c:806
+#, c-format
+msgid "Query failed: %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_input.c:82
+msgid "Enter slot"
+msgstr ""
+
+#: src/dird/ua_input.c:86 src/dird/ua_input.c:92
+#, c-format
+msgid "Expected a positive integer, got: %s\n"
+msgstr ""
+
+#: src/dird/ua_input.c:120 src/dird/ua_run.c:862 src/dird/ua_select.c:54
+#: src/dird/ua_update.c:223 src/dird/ua_update.c:237 src/dird/ua_update.c:247
+#: src/dird/ua_update.c:261 src/dird/ua_update.c:552
+#: src/stored/parse_bsr.c:770 src/tools/dbcheck.c:1098
+msgid "yes"
+msgstr ""
+
+#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:225
+#: src/dird/ua_update.c:237 src/dird/ua_update.c:249 src/dird/ua_update.c:261
+#: src/dird/ua_update.c:552 src/stored/parse_bsr.c:770
+msgid "no"
+msgstr ""
+
+#: src/dird/ua_input.c:127
+msgid "Invalid response. You must answer yes or no.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:89
+msgid "Negative numbers not permitted\n"
+msgstr ""
+
+#: src/dird/ua_label.c:95
+msgid "Range end is not integer.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:100
+msgid "Range start is not an integer.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:106
+msgid "Range end not bigger than start.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:112
+msgid "Input value is not an integer.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:118
+msgid "Values must be be greater than zero.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:122
+msgid "Slot too large.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:176 src/dird/ua_label.c:477
+msgid "No slots in changer to scan.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:188 src/dird/ua_label.c:488
+msgid "No Volumes found to label, or no barcodes.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:198
+#, c-format
+msgid "Slot %d greater than max %d ignored.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:227
+#, c-format
+msgid "No VolName for Slot=%d InChanger set to zero.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:242
+#, c-format
+msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:246
+#, c-format
+msgid "Catalog record for Volume \"%s\" is up to date.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:252
+#, c-format
+msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:348
+#, c-format
+msgid ""
+"Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before "
+"relabeling.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:364
+msgid "Enter new Volume name: "
+msgstr ""
+
+#: src/dird/ua_label.c:377
+#, c-format
+msgid "Media record for new Volume \"%s\" already exists.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:392
+msgid "Enter slot (0 or Enter for none): "
+msgstr ""
+
+#: src/dird/ua_label.c:417
+#, c-format
+msgid "Delete of Volume \"%s\" failed. ERR=%s"
+msgstr ""
+
+#: src/dird/ua_label.c:420
+#, c-format
+msgid "Old volume \"%s\" deleted from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:431
+#, c-format
+msgid "Requesting to mount %s ...\n"
+msgstr ""
+
+#: src/dird/ua_label.c:453
+msgid "Do not forget to mount the drive!!!\n"
+msgstr ""
+
+#: src/dird/ua_label.c:493
+msgid ""
+"The following Volumes will be labeled:\n"
+"Slot  Volume\n"
+"==============\n"
+msgstr ""
+
+#: src/dird/ua_label.c:502 src/stored/btape.c:606
+msgid "Do you want to continue? (y/n): "
+msgstr ""
+
+#: src/dird/ua_label.c:523
+#, c-format
+msgid "Media record for Slot %d Volume \"%s\" already exists.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:529
+#, c-format
+msgid "Error setting InChanger: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_label.c:552
+#, c-format
+msgid "Maximum pool Volumes=%d reached.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:559
+#, c-format
+msgid "Catalog record for cleaning tape \"%s\" successfully created.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:566
+#, c-format
+msgid "Catalog error on cleaning tape: %s"
+msgstr ""
+
+#: src/dird/ua_label.c:602
+#, c-format
+msgid "Illegal character \"%c\" in a volume name.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:647
+#, c-format
+msgid "Sending relabel command from \"%s\" to \"%s\" ...\n"
+msgstr ""
+
+#: src/dird/ua_label.c:654
+#, c-format
+msgid "Sending label command for Volume \"%s\" Slot %d ...\n"
+msgstr ""
+
+#: src/dird/ua_label.c:686
+#, c-format
+msgid "Catalog record for Volume \"%s\", Slot %d  successfully created.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:699
+#, c-format
+msgid "Label command failed for Volume %s.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:709
+#, c-format
+msgid "Connecting to Storage daemon %s at %s:%d ...\n"
+msgstr ""
+
+#: src/dird/ua_label.c:737
+msgid "Could not open SD socket.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:809 src/dird/ua_label.c:819
+#, c-format
+msgid "Invalid Slot number: %s\n"
+msgstr ""
+
+#: src/dird/ua_label.c:828
+#, c-format
+msgid "Invalid Volume name: %s\n"
+msgstr ""
+
+#: src/dird/ua_label.c:907
+#, c-format
+msgid "Device \"%s\" has %d slots.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:956
+#, c-format
+msgid "Pool \"%s\" resource not found!\n"
+msgstr ""
+
+#: src/dird/ua_output.c:64 src/dird/ua_output.c:88
+msgid "ON or OFF keyword missing.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:176
+msgid "Keywords for the show command are:\n"
+msgstr ""
+
+#: src/dird/ua_output.c:182
+#, c-format
+msgid "%s resource %s not found.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:185
+#, c-format
+msgid "Resource %s not found\n"
+msgstr ""
+
+#: src/dird/ua_output.c:253
+msgid "Hey! DB is NULL\n"
+msgstr ""
+
+#: src/dird/ua_output.c:367
+#, c-format
+msgid "Jobid %d used %d Volume(s): %s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:385
+msgid "No Pool specified.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:396 src/dird/ua_select.c:458
+#, c-format
+msgid "Error obtaining pool ids. ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:406
+#, c-format
+msgid "Pool: %s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:422 src/dird/ua_status.c:455
+msgid "Ignoring illegal value for days.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:431
+#, c-format
+msgid "Unknown list keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:457
+#, c-format
+msgid "%s is not a job name.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:481
+#, c-format
+msgid "Could not find next Volume for Job %s (%s, %s).\n"
+msgstr ""
+
+#: src/dird/ua_output.c:485
+#, c-format
+msgid "The next Volume to be used by Job \"%s\" (%s, %s) will be %s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:495
+#, c-format
+msgid "Could not find next Volume for Job %s.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:685
+msgid "You have no messages.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:173
+msgid "Choose item to prune"
+msgstr ""
+
+#: src/dird/ua_prune.c:254
+msgid "No Files found to prune.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:286
+#, c-format
+msgid "Pruned Files from %s Jobs for client %s from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:392
+msgid "No Jobs found to prune.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:453
+#, c-format
+msgid "Pruned %d %s for client %s from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:454
+msgid "Jobs"
+msgstr ""
+
+#: src/dird/ua_prune.c:501
+#, c-format
+msgid "There are no Jobs associated with Volume \"%s\". Prune not needed.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:508 src/dird/ua_purge.c:482
+#, c-format
+msgid "There are no Jobs associated with Volume \"%s\". Marking it purged.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:566
+#, c-format
+msgid "Pruned %d %s on Volume \"%s\" from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:177
+msgid ""
+"\n"
+"This command is can be DANGEROUS!!!\n"
+"\n"
+"It purges (deletes) all Files from a Job,\n"
+"JobId, Client or Volume; or it purges (deletes)\n"
+"all Jobs from a Client or Volume without regard\n"
+"for retention periods. Normally you should use the\n"
+"PRUNE command, which respects retention periods.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:237
+msgid "Choose item to purge"
+msgstr ""
+
+#: src/dird/ua_purge.c:282
+#, c-format
+msgid "Begin purging files for Client \"%s\"\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:294
+#, c-format
+msgid "No Files found for client %s to purge from %s catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:325
+#, c-format
+msgid "%d Files for client \"%s\" purged from %s catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:362
+#, c-format
+msgid "Begin purging jobs from Client \"%s\"\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:373
+#, c-format
+msgid "No Jobs found for client %s to purge from %s catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:413
+#, c-format
+msgid "%d Jobs for client %s purged from %s catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:464
+#, c-format
+msgid ""
+"Volume \"%s\" has VolStatus \"%s\" and cannot be purged.\n"
+"The VolStatus must be: Append, Full, Used, or Error to be purged.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:535
+#, c-format
+msgid "%d File%s on Volume \"%s\" purged from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:549
+#, c-format
+msgid ""
+"There are no more Jobs associated with Volume \"%s\". Marking it purged.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:581
+#, c-format
+msgid "Cannot purge Volume with VolStatus=%s\n"
+msgstr ""
+
+#: src/dird/ua_query.c:59 src/findlib/create_file.c:282
+#: src/findlib/create_file.c:339
+#, c-format
+msgid "Could not open %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_query.c:64
+msgid "Available queries:\n"
+msgstr ""
+
+#: src/dird/ua_query.c:71
+msgid "Choose a query"
+msgstr ""
+
+#: src/dird/ua_query.c:85
+msgid "Could not find query.\n"
+msgstr ""
+
+#: src/dird/ua_query.c:103
+msgid "Too many prompts in query, max is 9.\n"
+msgstr ""
+
+#: src/dird/ua_query.c:206
+#, c-format
+msgid "Warning prompt %d missing.\n"
+msgstr ""
+
+#: src/dird/ua_query.c:252
+msgid ""
+"Entering SQL query mode.\n"
+"Terminate each query with a semicolon.\n"
+"Terminate query mode with a blank line.\n"
+msgstr ""
+
+#: src/dird/ua_query.c:255 src/dird/ua_query.c:272
+msgid "Enter SQL query: "
+msgstr ""
+
+#: src/dird/ua_query.c:274
+msgid "Add to SQL query: "
+msgstr ""
+
+#: src/dird/ua_query.c:278
+msgid "End query mode.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:115
+msgid ""
+"No Restore Job Resource found in bacula-dir.conf.\n"
+"You must create at least one before running this command.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:131
+msgid "Restore not done.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:142
+msgid "Unable to construct a valid BSR. Cannot continue.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:146 src/dird/ua_restore.c:160
+msgid "No files selected to be restored.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:154
+msgid ""
+"\n"
+"1 file selected to be restored.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:157
+#, c-format
+msgid ""
+"\n"
+"%u files selected to be restored.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:175
+msgid "No Restore Job resource found!\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:234
+#, c-format
+msgid "Missing value for keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:283
+msgid "List last 20 Jobs run"
+msgstr ""
+
+#: src/dird/ua_restore.c:284
+msgid "List Jobs where a given File is saved"
+msgstr ""
+
+#: src/dird/ua_restore.c:285
+msgid "Enter list of comma separated JobIds to select"
+msgstr ""
+
+#: src/dird/ua_restore.c:286
+msgid "Enter SQL list command"
+msgstr ""
+
+#: src/dird/ua_restore.c:287
+msgid "Select the most recent backup for a client"
+msgstr ""
+
+#: src/dird/ua_restore.c:288
+msgid "Select backup for a client before a specified time"
+msgstr ""
+
+#: src/dird/ua_restore.c:289
+msgid "Enter a list of files to restore"
+msgstr ""
+
+#: src/dird/ua_restore.c:290
+msgid "Enter a list of files to restore before a specified time"
+msgstr ""
+
+#: src/dird/ua_restore.c:291
+msgid "Find the JobIds of the most recent backup for a client"
+msgstr ""
+
+#: src/dird/ua_restore.c:292
+msgid "Find the JobIds for a backup for a client before a specified time"
+msgstr ""
+
+#: src/dird/ua_restore.c:293
+msgid "Enter a list of directories to restore for found JobIds"
+msgstr ""
+
+#: src/dird/ua_restore.c:294 src/dird/ua_status.c:722 src/filed/status.c:251
+#: src/stored/status.c:412 src/wx-console/wxbconfigpanel.cpp:191
+msgid "Cancel"
+msgstr ""
+
+#: src/dird/ua_restore.c:330
+#, c-format
+msgid "Unknown keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:354
+#, c-format
+msgid "Improper date format: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:394 src/dird/ua_select.c:590
+#, c-format
+msgid "Error: Pool resource \"%s\" does not exist.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:399
+#, c-format
+msgid "Error: Pool resource \"%s\" access not allowed.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:418
+msgid ""
+"\n"
+"First you select one or more JobIds that contain files\n"
+"to be restored. You will be presented several methods\n"
+"of specifying the JobIds. Then you will be allowed to\n"
+"select which files from those JobIds are to be restored.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:430
+msgid "To select the JobIds, you have the following choices:\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:435
+msgid "Select item: "
+msgstr ""
+
+#: src/dird/ua_restore.c:449
+msgid "Enter Filename (no path):"
+msgstr ""
+
+#: src/dird/ua_restore.c:464 src/dird/ua_restore.c:564
+msgid "Enter JobId(s), comma separated, to restore: "
+msgstr ""
+
+#: src/dird/ua_restore.c:470
+msgid "Enter SQL list command: "
+msgstr ""
+
+#: src/dird/ua_restore.c:498 src/dird/ua_restore.c:523
+msgid ""
+"Enter file names with paths, or < to enter a filename\n"
+"containing a list of file names with paths, and terminate\n"
+"them with a blank line.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:502 src/dird/ua_restore.c:527
+msgid "Enter full filename: "
+msgstr ""
+
+#: src/dird/ua_restore.c:562
+#, c-format
+msgid "You have already seleted the following JobIds: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:577
+msgid ""
+"Enter full directory names or start the name\n"
+"with a < to indicate it is a filename containing a list\n"
+"of directories and terminate them with a blank line.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:581
+msgid "Enter directory name: "
+msgstr ""
+
+#: src/dird/ua_restore.c:606
+msgid "No Jobs selected.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:610
+#, c-format
+msgid "You have selected the following JobIds: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:613
+#, c-format
+msgid "You have selected the following JobId: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:621
+msgid "Invalid JobId in list.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:634
+#, c-format
+msgid "Unable to get Job record for JobId=%s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:639
+#, c-format
+msgid "No authorization. Job \"%s\" not selected.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:653
+msgid ""
+"The restored files will the most current backup\n"
+"BEFORE the date you specify below.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:656
+msgid "Enter date as YYYY-MM-DD HH:MM:SS :"
+msgstr ""
+
+#: src/dird/ua_restore.c:662
+msgid "Improper date format.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:683
+#, c-format
+msgid "Cannot open file %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:691 src/dird/ua_restore.c:695
+#, c-format
+msgid "Error occurred on line %d of %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:741 src/dird/ua_restore.c:779
+#, c-format
+msgid "No database record found for: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:766
+msgid "No JobId specified cannot continue.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:810
+#, c-format
+msgid "No table found: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:915
+#, c-format
+msgid ""
+"\n"
+"Building directory tree for JobId %s ...  "
+msgstr ""
+
+#: src/dird/ua_restore.c:934
+msgid ""
+"\n"
+"There were no files inserted into the tree, so file selection\n"
+"is not possible.Most likely your retention policy pruned the files\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:936
+msgid ""
+"\n"
+"Do you want to restore all the files? (yes|no): "
+msgstr ""
+
+#: src/dird/ua_restore.c:952
+#, c-format
+msgid ""
+"\n"
+"1 Job, %s files inserted into the tree and marked for extraction.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:956
+#, c-format
+msgid ""
+"\n"
+"1 Job, %s files inserted into the tree.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:962
+#, c-format
+msgid ""
+"\n"
+"%d Jobs, %s files inserted into the tree and marked for extraction.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:966
+#, c-format
+msgid ""
+"\n"
+"%d Jobs, %s files inserted into the tree.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1043
+#, c-format
+msgid "Error getting FileSet \"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1051 src/dird/ua_select.c:167
+msgid "The defined FileSet resources are:\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1055 src/dird/ua_run.c:644 src/dird/ua_select.c:175
+msgid "FileSet"
+msgstr ""
+
+#: src/dird/ua_restore.c:1055 src/dird/ua_select.c:175
+msgid "Select FileSet resource"
+msgstr ""
+
+#: src/dird/ua_restore.c:1062
+#, c-format
+msgid "Error getting FileSet record: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1063
+msgid ""
+"This probably means you modified the FileSet.\n"
+"Continuing anyway.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1078
+#, c-format
+msgid "Pool \"%s\" not found, using any pool.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1104 src/dird/ua_restore.c:1120
+#, c-format
+msgid "No Full backup before %s found.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1143
+msgid "No jobs found.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1316
+msgid ""
+"Warning, the JobIds that you selected refer to more than one MediaType.\n"
+"Restore is not possible. The MediaTypes used are:\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1324
+msgid "No MediaType found for your JobIds.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1356
+#, c-format
+msgid "Warning default storage overridden by %s on command line.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1367
+#, c-format
+msgid ""
+"\n"
+"Warning. Unable to find Storage resource for\n"
+"MediaType \"%s\", needed by the Jobs you selected.\n"
+"You will be allowed to select a Storage device later.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:112
+#, c-format
+msgid "Value missing for keyword %s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:119
+msgid "Job name specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:127
+msgid "JobId specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:136
+msgid "Client specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:144
+msgid "FileSet specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:152
+msgid "Level specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:161
+msgid "Storage specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:169
+msgid "Pool specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:177
+msgid "Where specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:185
+msgid "Bootstrap specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:193
+msgid "Replace specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:201
+msgid "When specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:209
+msgid "Priority specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:214
+msgid "Priority must be positive nonzero setting it to 10.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:224
+msgid "Verify Job specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:268
+#, c-format
+msgid "Invalid keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:280
+#, c-format
+msgid "Catalog \"%s\" not found\n"
+msgstr ""
+
+#: src/dird/ua_run.c:291
+#, c-format
+msgid "Job \"%s\" not found\n"
+msgstr ""
+
+#: src/dird/ua_run.c:298
+msgid "A job name must be specified.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:304
+#, c-format
+msgid "No authorization. Job \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:313
+#, c-format
+msgid "Storage \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:323
+#, c-format
+msgid "No authorization. Storage \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:333
+#, c-format
+msgid "Pool \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:343
+#, c-format
+msgid "No authorization. Pool \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:363
+#, c-format
+msgid "No authorization. Client \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:372
+#, c-format
+msgid "FileSet \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:381
+#, c-format
+msgid "No authorization. FileSet \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:389
+#, c-format
+msgid "Verify Job \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:422 src/dird/ua_run.c:764
+msgid "Invalid time, using current time.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:442
+#, c-format
+msgid "Invalid replace option: %s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:500
+#, c-format
+msgid ""
+"Run %s job\n"
+"JobName:  %s\n"
+"FileSet:  %s\n"
+"Client:   %s\n"
+"Storage:  %s\n"
+"When:     %s\n"
+"Priority: %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:507 src/lib/util.c:295
+msgid "Admin"
+msgstr ""
+
+#: src/dird/ua_run.c:519
+#, c-format
+msgid ""
+"Run %s job\n"
+"JobName:  %s\n"
+"FileSet:  %s\n"
+"Level:    %s\n"
+"Client:   %s\n"
+"Storage:  %s\n"
+"Pool:     %s\n"
+"When:     %s\n"
+"Priority: %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:528 src/lib/util.c:286
+msgid "Backup"
+msgstr ""
+
+#: src/dird/ua_run.c:544
+#, c-format
+msgid ""
+"Run %s job\n"
+"JobName:     %s\n"
+"FileSet:     %s\n"
+"Level:       %s\n"
+"Client:      %s\n"
+"Storage:     %s\n"
+"Pool:        %s\n"
+"Verify Job:  %s\n"
+"When:        %s\n"
+"Priority:    %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:554 src/lib/util.c:289
+msgid "Verify"
+msgstr ""
+
+#: src/dird/ua_run.c:571
+msgid "Please enter a JobId for restore: "
+msgstr ""
+
+#: src/dird/ua_run.c:580
+#, c-format
+msgid ""
+"Run Restore job\n"
+"JobName:    %s\n"
+"Bootstrap:  %s\n"
+"Where:      %s\n"
+"Replace:    %s\n"
+"FileSet:    %s\n"
+"Client:     %s\n"
+"Storage:    %s\n"
+"When:       %s\n"
+"Catalog:    %s\n"
+"Priority:   %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:602
+#, c-format
+msgid ""
+"Run Restore job\n"
+"JobName:    %s\n"
+"Bootstrap:  %s\n"
+"Where:      %s\n"
+"Replace:    %s\n"
+"Client:     %s\n"
+"Storage:    %s\n"
+"JobId:      %s\n"
+"When:       %s\n"
+"Catalog:    %s\n"
+"Priority:   %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:626
+#, c-format
+msgid "Unknown Job Type=%d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:631
+msgid "OK to run? (yes/mod/no): "
+msgstr ""
+
+#: src/dird/ua_run.c:637 src/dird/ua_select.c:44
+msgid "mod"
+msgstr ""
+
+#: src/dird/ua_run.c:640 src/dird/ua_update.c:463
+msgid "Parameters to modify:\n"
+msgstr ""
+
+#: src/dird/ua_run.c:641
+msgid "Level"
+msgstr ""
+
+#: src/dird/ua_run.c:642 src/dird/ua_select.c:152
+#: src/wx-console/wxbrestorepanel.cpp:321
+#: src/wx-console/wxbrestorepanel.cpp:337
+#: src/wx-console/wxbrestorepanel.cpp:458
+#: src/wx-console/wxbrestorepanel.cpp:459
+#: src/wx-console/wxbrestorepanel.cpp:469
+#: src/wx-console/wxbrestorepanel.cpp:470
+#: src/wx-console/wxbrestorepanel.cpp:1133
+#: src/wx-console/wxbrestorepanel.cpp:1794
+#: src/wx-console/wxbrestorepanel.cpp:1865
+msgid "Storage"
+msgstr ""
+
+#: src/dird/ua_run.c:645 src/dird/ua_select.c:282 src/dird/ua_select.c:391
+#: src/wx-console/wxbrestorepanel.cpp:318
+#: src/wx-console/wxbrestorepanel.cpp:336
+#: src/wx-console/wxbrestorepanel.cpp:410
+#: src/wx-console/wxbrestorepanel.cpp:411
+#: src/wx-console/wxbrestorepanel.cpp:421
+#: src/wx-console/wxbrestorepanel.cpp:422
+#: src/wx-console/wxbrestorepanel.cpp:669
+#: src/wx-console/wxbrestorepanel.cpp:1103
+#: src/wx-console/wxbrestorepanel.cpp:1190
+#: src/wx-console/wxbrestorepanel.cpp:1787
+#: src/wx-console/wxbrestorepanel.cpp:1789
+#: src/wx-console/wxbrestorepanel.cpp:1863
+#: src/wx-console/wxbrestorepanel.cpp:1918
+msgid "Client"
+msgstr ""
+
+#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:338
+#: src/wx-console/wxbrestorepanel.cpp:823
+#: src/wx-console/wxbrestorepanel.cpp:1867
+msgid "When"
+msgstr ""
+
+#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:339
+#: src/wx-console/wxbrestorepanel.cpp:1096
+#: src/wx-console/wxbrestorepanel.cpp:1869
+msgid "Priority"
+msgstr ""
+
+#: src/dird/ua_run.c:650 src/dird/ua_select.c:476 src/dird/ua_select.c:566
+#: src/dird/ua_update.c:400 src/dird/ua_update.c:474
+#: src/wx-console/wxbrestorepanel.cpp:320
+#: src/wx-console/wxbrestorepanel.cpp:506
+#: src/wx-console/wxbrestorepanel.cpp:516
+#: src/wx-console/wxbrestorepanel.cpp:1783
+msgid "Pool"
+msgstr ""
+
+#: src/dird/ua_run.c:652
+msgid "Verify Job"
+msgstr ""
+
+#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:331
+#: src/wx-console/wxbrestorepanel.cpp:1848
+msgid "Bootstrap"
+msgstr ""
+
+#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:332
+#: src/wx-console/wxbrestorepanel.cpp:1072
+#: src/wx-console/wxbrestorepanel.cpp:1850
+msgid "Where"
+msgstr ""
+
+#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:334
+#: src/wx-console/wxbrestorepanel.cpp:1080
+#: src/wx-console/wxbrestorepanel.cpp:1854
+#: src/wx-console/wxbrestorepanel.cpp:1855
+#: src/wx-console/wxbrestorepanel.cpp:1856
+#: src/wx-console/wxbrestorepanel.cpp:1857
+#: src/wx-console/wxbrestorepanel.cpp:1858
+msgid "Replace"
+msgstr ""
+
+#: src/dird/ua_run.c:658
+msgid "JobId"
+msgstr ""
+
+#: src/dird/ua_run.c:660 src/dird/ua_update.c:478
+msgid "Select parameter to modify"
+msgstr ""
+
+#: src/dird/ua_run.c:664 src/dird/ua_run.c:691
+msgid "Levels:\n"
+msgstr ""
+
+#: src/dird/ua_run.c:665 src/filed/status.c:368 src/lib/util.c:319
+#: src/stored/status.c:451
+msgid "Base"
+msgstr ""
+
+#: src/dird/ua_run.c:666 src/filed/status.c:370 src/lib/util.c:321
+#: src/stored/status.c:453
+msgid "Full"
+msgstr ""
+
+#: src/dird/ua_run.c:667 src/filed/status.c:373 src/lib/util.c:324
+#: src/stored/status.c:456
+msgid "Incremental"
+msgstr ""
+
+#: src/dird/ua_run.c:668 src/filed/status.c:376 src/lib/util.c:327
+#: src/stored/status.c:459
+msgid "Differential"
+msgstr ""
+
+#: src/dird/ua_run.c:669 src/filed/status.c:379 src/lib/util.c:330
+#: src/stored/status.c:462
+msgid "Since"
+msgstr ""
+
+#: src/dird/ua_run.c:670 src/dird/ua_run.c:697
+msgid "Select level"
+msgstr ""
+
+#: src/dird/ua_run.c:692
+msgid "Initialize Catalog"
+msgstr ""
+
+#: src/dird/ua_run.c:693 src/filed/status.c:382 src/lib/util.c:333
+#: src/stored/status.c:465
+msgid "Verify Catalog"
+msgstr ""
+
+#: src/dird/ua_run.c:694 src/lib/util.c:339
+msgid "Verify Volume to Catalog"
+msgstr ""
+
+#: src/dird/ua_run.c:695 src/lib/util.c:342
+msgid "Verify Disk to Catalog"
+msgstr ""
+
+#: src/dird/ua_run.c:696
+msgid "Verify Volume Data (not yet implemented)"
+msgstr ""
+
+#: src/dird/ua_run.c:718
+msgid "Level not appropriate for this Job. Cannot be changed.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:756
+msgid ""
+"Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): "
+msgstr ""
+
+#: src/dird/ua_run.c:771
+msgid "Enter new Priority: "
+msgstr ""
+
+#: src/dird/ua_run.c:775
+msgid "Priority must be a positive integer.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:793
+msgid "Please enter the Bootstrap file name: "
+msgstr ""
+
+#: src/dird/ua_run.c:804
+#, c-format
+msgid "Warning cannot open %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:823
+msgid "Please enter path prefix for restore (/ for none): "
+msgstr ""
+
+#: src/dird/ua_run.c:837
+msgid "Replace:\n"
+msgstr ""
+
+#: src/dird/ua_run.c:841
+msgid "Select replace option"
+msgstr ""
+
+#: src/dird/ua_run.c:851
+msgid ""
+"You must set the bootstrap file to NULL to be able to specify a JobId.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:869
+msgid "Job failed.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:872
+#, c-format
+msgid "Job started. JobId=%s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:878
+msgid "Job not run.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:39
+#, c-format
+msgid "The current %s retention period is: %s\n"
+msgstr ""
+
+#: src/dird/ua_select.c:41
+msgid "Continue? (yes/mod/no): "
+msgstr ""
+
+#: src/dird/ua_select.c:45
+msgid "Enter new retention period: "
+msgstr ""
+
+#: src/dird/ua_select.c:49
+msgid "Invalid period.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:128
+msgid "You have the following choices:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:144
+msgid "The defined Storage resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:152
+msgid "Select Storage resource"
+msgstr ""
+
+#: src/dird/ua_select.c:193
+msgid "catalog"
+msgstr ""
+
+#: src/dird/ua_select.c:201
+msgid "The defined Catalog resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:209
+msgid "Catalog"
+msgstr ""
+
+#: src/dird/ua_select.c:209
+msgid "Select Catalog resource"
+msgstr ""
+
+#: src/dird/ua_select.c:226
+msgid "The defined Job resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:234
+msgid "Select Job resource"
+msgstr ""
+
+#: src/dird/ua_select.c:249
+msgid "The defined Restore Job resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:257
+msgid "Select Restore Job"
+msgstr ""
+
+#: src/dird/ua_select.c:274
+msgid "The defined Client resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:282
+msgid "Select Client (File daemon) resource"
+msgstr ""
+
+#: src/dird/ua_select.c:309
+#, c-format
+msgid "Error: Client resource %s does not exist.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:334
+#, c-format
+msgid "Could not find Client %s: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_select.c:337 src/lib/bnet_server.c:284
+#: src/lib/bnet_server.c:378
+msgid "client"
+msgstr ""
+
+#: src/dird/ua_select.c:338
+msgid "fd"
+msgstr ""
+
+#: src/dird/ua_select.c:344 src/dird/ua_select.c:398
+#, c-format
+msgid "Could not find Client \"%s\": ERR=%s"
+msgstr ""
+
+#: src/dird/ua_select.c:373
+#, c-format
+msgid "Error obtaining client ids. ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_select.c:377
+msgid "No clients defined. You must run a job before using this command.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:381
+msgid "Defined Clients:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:391
+msgid "Select the Client"
+msgstr ""
+
+#: src/dird/ua_select.c:424 src/dird/ua_select.c:447 src/dird/ua_select.c:483
+#, c-format
+msgid "Could not find Pool \"%s\": ERR=%s"
+msgstr ""
+
+#: src/dird/ua_select.c:462
+msgid "No pools defined. Use the \"create\" command to create one.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:466
+msgid "Defined Pools:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:476
+msgid "Select the Pool"
+msgstr ""
+
+#: src/dird/ua_select.c:506
+#, c-format
+msgid "No access to Pool \"%s\"\n"
+msgstr ""
+
+#: src/dird/ua_select.c:532
+msgid "Enter MediaId or Volume name: "
+msgstr ""
+
+#: src/dird/ua_select.c:558
+msgid "The defined Pool resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:566
+msgid "Select Pool resource"
+msgstr ""
+
+#: src/dird/ua_select.c:601
+msgid "Enter the JobId to select: "
+msgstr ""
+
+#: src/dird/ua_select.c:639
+#, c-format
+msgid "Could not find Job \"%s\": ERR=%s"
+msgstr ""
+
+#: src/dird/ua_select.c:717
+#, c-format
+msgid "Automatically selected %s: %s\n"
+msgstr ""
+
+#: src/dird/ua_select.c:722
+#, c-format
+msgid "Cannot select %s in batch mode.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:736
+msgid "Selection is empty!\n"
+msgstr ""
+
+#: src/dird/ua_select.c:742
+msgid "Item 1 selected automatically.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:753
+msgid "Selection aborted, nothing done.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:758
+#, c-format
+msgid "Please enter a number between 1 and %d\n"
+msgstr ""
+
+#: src/dird/ua_select.c:807
+msgid "Storage name given twice.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:824
+#, c-format
+msgid "Expecting jobid=nn command, got: %s\n"
+msgstr ""
+
+#: src/dird/ua_select.c:828
+#, c-format
+msgid "JobId %s is not running.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:838
+#, c-format
+msgid "Expecting job=xxx, got: %s.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:842 src/dird/ua_select.c:854
+#, c-format
+msgid "Job \"%s\" is not running.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:850
+#, c-format
+msgid "Expecting ujobid=xxx, got: %s.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:870
+#, c-format
+msgid "Storage resource \"%s\": not found\n"
+msgstr ""
+
+#: src/dird/ua_select.c:902
+msgid "Enter autochanger drive[0]: "
+msgstr ""
+
+#: src/dird/ua_select.c:932
+msgid "Media Types defined in conf file:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:938
+msgid "Media Type"
+msgstr ""
+
+#: src/dird/ua_select.c:938
+msgid "Select the Media Type"
+msgstr ""
+
+#: src/dird/ua_server.c:61
+#, c-format
+msgid "Cannot create UA thread: %s\n"
+msgstr ""
+
+#: src/dird/ua_server.c:142
+msgid "You have messages.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:126
+msgid "Status available for:\n"
+msgstr ""
+
+#: src/dird/ua_status.c:132
+msgid "Select daemon type for status"
+msgstr ""
+
+#: src/dird/ua_status.c:245
+#, c-format
+msgid "%s Version: %s (%s) %s %s %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:249 src/stored/status.c:71
+#, c-format
+msgid "Daemon started %s, 1 Job run since started.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:252 src/stored/status.c:74
+#, c-format
+msgid "Daemon started %s, %d Jobs run since started.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:257 src/filed/status.c:121 src/stored/status.c:78
+#, c-format
+msgid " Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:277 src/dird/ua_status.c:502 src/dird/ua_status.c:664
+#: src/filed/status.c:198 src/filed/status.c:277 src/stored/status.c:345
+#: src/stored/status.c:361 src/stored/status.c:438
+msgid "====\n"
+msgstr ""
+
+#: src/dird/ua_status.c:289
+#, c-format
+msgid ""
+"\n"
+"Failed to connect to Storage daemon %s.\n"
+"====\n"
+msgstr ""
+
+#: src/dird/ua_status.c:327
+#, c-format
+msgid ""
+"Failed to connect to Client %s.\n"
+"====\n"
+msgstr ""
+
+#: src/dird/ua_status.c:335
+msgid "Connected to file daemon\n"
+msgstr ""
+
+#: src/dird/ua_status.c:350
+msgid ""
+"\n"
+"Scheduled Jobs:\n"
+msgstr ""
+
+#: src/dird/ua_status.c:351
+msgid ""
+"Level          Type     Pri  Scheduled          Name               Volume\n"
+msgstr ""
+
+#: src/dird/ua_status.c:352
+msgid "===================================================================================\n"
+msgstr ""
+
+#: src/dird/ua_status.c:401
+#, c-format
+msgid "%-14s %-8s %3d  %-18s %-18s %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:500
+msgid "No Scheduled Jobs.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:517 src/stored/status.c:277
+msgid ""
+"\n"
+"Running Jobs:\n"
+msgstr ""
+
+#: src/dird/ua_status.c:525
+#, c-format
+msgid "Console connected at %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:535
+msgid ""
+"No Jobs running.\n"
+"====\n"
+msgstr ""
+
+#: src/dird/ua_status.c:540
+msgid " JobId Level   Name                       Status\n"
+msgstr ""
+
+#: src/dird/ua_status.c:541 src/filed/status.c:221 src/stored/status.c:382
+msgid "======================================================================\n"
+msgstr ""
+
+#: src/dird/ua_status.c:549
+msgid "is waiting execution"
+msgstr ""
+
+#: src/dird/ua_status.c:552
+msgid "is running"
+msgstr ""
+
+#: src/dird/ua_status.c:555
+msgid "is blocked"
+msgstr ""
+
+#: src/dird/ua_status.c:558
+msgid "has terminated"
+msgstr ""
+
+#: src/dird/ua_status.c:561
+msgid "has erred"
+msgstr ""
+
+#: src/dird/ua_status.c:564
+msgid "has errors"
+msgstr ""
+
+#: src/dird/ua_status.c:567
+msgid "has a fatal error"
+msgstr ""
+
+#: src/dird/ua_status.c:570
+msgid "has verify differences"
+msgstr ""
+
+#: src/dird/ua_status.c:573
+msgid "has been canceled"
+msgstr ""
+
+#: src/dird/ua_status.c:577
+#, c-format
+msgid "is waiting on Client %s"
+msgstr ""
+
+#: src/dird/ua_status.c:583
+#, c-format
+msgid "is waiting on Storage %s"
+msgstr ""
+
+#: src/dird/ua_status.c:588
+msgid "is waiting on max Storage jobs"
+msgstr ""
+
+#: src/dird/ua_status.c:591
+msgid "is waiting on max Client jobs"
+msgstr ""
+
+#: src/dird/ua_status.c:594
+msgid "is waiting on max Job jobs"
+msgstr ""
+
+#: src/dird/ua_status.c:597
+msgid "is waiting on max total jobs"
+msgstr ""
+
+#: src/dird/ua_status.c:600
+msgid "is waiting for its start time"
+msgstr ""
+
+#: src/dird/ua_status.c:603
+msgid "is waiting for higher priority jobs to finish"
+msgstr ""
+
+#: src/dird/ua_status.c:608
+#, c-format
+msgid "is in unknown state %c"
+msgstr ""
+
+#: src/dird/ua_status.c:622
+msgid "is waiting for a mount request"
+msgstr ""
+
+#: src/dird/ua_status.c:629
+msgid "is waiting for an appendable Volume"
+msgstr ""
+
+#: src/dird/ua_status.c:636
+#, c-format
+msgid "is waiting for Client %s to connect to Storage %s"
+msgstr ""
+
+#: src/dird/ua_status.c:652
+#, c-format
+msgid "%6d %-6s  %-20s %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:674 src/filed/status.c:211 src/stored/status.c:373
+msgid "No Terminated Jobs.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:679 src/stored/status.c:378
+msgid ""
+"\n"
+"Terminated Jobs:\n"
+msgstr ""
+
+#: src/dird/ua_status.c:680
+msgid " JobId  Level     Files      Bytes     Status   Finished        Name \n"
+msgstr ""
+
+#: src/dird/ua_status.c:681
+msgid "========================================================================\n"
+msgstr ""
+
+#: src/dird/ua_status.c:712 src/filed/status.c:241 src/lib/util.c:178
+#: src/stored/status.c:402
+msgid "Created"
+msgstr ""
+
+#: src/dird/ua_status.c:716 src/filed/status.c:245 src/lib/util.c:191
+#: src/lib/util.c:258 src/stored/status.c:406
+msgid "Error"
+msgstr ""
+
+#: src/dird/ua_status.c:719 src/filed/status.c:248 src/stored/status.c:409
+msgid "Diffs"
+msgstr ""
+
+#: src/dird/ua_status.c:725 src/filed/status.c:254 src/lib/util.c:187
+#: src/lib/util.c:254 src/stored/btape.c:1158 src/stored/status.c:415
+#: src/wx-console/wxbconfigpanel.cpp:180
+msgid "OK"
+msgstr ""
+
+#: src/dird/ua_status.c:728 src/filed/status.c:257 src/stored/status.c:418
+msgid "Other"
+msgstr ""
+
+#: src/dird/ua_status.c:731 src/filed/status.c:268 src/stored/status.c:429
+#, c-format
+msgid "%6d  %-6s %8s %14s %-7s  %-8s %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:739 src/stored/btape.c:180
+msgid "\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:58
+msgid "change current directory"
+msgstr ""
+
+#: src/dird/ua_tree.c:59
+msgid "count marked files in and below the cd"
+msgstr ""
+
+#: src/dird/ua_tree.c:60 src/dird/ua_tree.c:61
+msgid "long list current directory, wildcards allowed"
+msgstr ""
+
+#: src/dird/ua_tree.c:62
+msgid "leave file selection mode"
+msgstr ""
+
+#: src/dird/ua_tree.c:63
+msgid "estimate restore size"
+msgstr ""
+
+#: src/dird/ua_tree.c:64
+msgid "same as done command"
+msgstr ""
+
+#: src/dird/ua_tree.c:65
+msgid "find files, wildcards allowed"
+msgstr ""
+
+#: src/dird/ua_tree.c:66 src/dird/ua_tree.c:75
+msgid "print help"
+msgstr ""
+
+#: src/dird/ua_tree.c:67
+msgid "list current directory, wildcards allowed"
+msgstr ""
+
+#: src/dird/ua_tree.c:68
+msgid "list the marked files in and below the cd"
+msgstr ""
+
+#: src/dird/ua_tree.c:69
+msgid "mark dir/file to be restored recursively, wildcards allowed"
+msgstr ""
+
+#: src/dird/ua_tree.c:70
+msgid "mark directory name to be restored (no files)"
+msgstr ""
+
+#: src/dird/ua_tree.c:71
+msgid "print current working directory"
+msgstr ""
+
+#: src/dird/ua_tree.c:72
+msgid "unmark dir/file to be restored recursively in dir"
+msgstr ""
+
+#: src/dird/ua_tree.c:73
+msgid "unmark directory name only no recursion"
+msgstr ""
+
+#: src/dird/ua_tree.c:74
+msgid "quit and do not do restore"
+msgstr ""
+
+#: src/dird/ua_tree.c:94
+msgid ""
+"\n"
+"You are now entering file selection mode where you add (mark) and\n"
+"remove (unmark) files to be restored. No files are initially added, unless\n"
+"you used the \"all\" keyword on the command line.\n"
+"Enter \"done\" to leave this mode.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:104 src/dird/ua_tree.c:671 src/dird/ua_tree.c:679
+#, c-format
+msgid "cwd is: %s\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:125
+msgid "Illegal command. Enter \"done\" to exit.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:298 src/dird/ua_tree.c:309 src/dird/ua_tree.c:326
+msgid "No files marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:311
+msgid "1 file marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:313
+#, c-format
+msgid "%s files marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:340
+msgid "No directories marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:342
+msgid "1 directory marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:344
+#, c-format
+msgid "%s directories marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:365
+#, c-format
+msgid "%s total files/dirs. %s marked to be restored.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:376
+msgid "No file specification given.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:527
+#, c-format
+msgid "Node %s has no children.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:618
+#, c-format
+msgid "%d total files; %d marked to be restored; %s bytes.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:663
+msgid "Invalid path given.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:690 src/dird/ua_tree.c:701
+msgid "No files unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:703
+msgid "1 file unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:705
+#, c-format
+msgid "%d files unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:716 src/dird/ua_tree.c:732
+msgid "No directories unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:734
+msgid "1 directory unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:736
+#, c-format
+msgid "%d directories unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:79
+msgid "Update choice:\n"
+msgstr ""
+
+#: src/dird/ua_update.c:80
+msgid "Volume parameters"
+msgstr ""
+
+#: src/dird/ua_update.c:81
+msgid "Pool from resource"
+msgstr ""
+
+#: src/dird/ua_update.c:82
+msgid "Slots from autochanger"
+msgstr ""
+
+#: src/dird/ua_update.c:83
+msgid "item"
+msgstr ""
+
+#: src/dird/ua_update.c:83
+msgid "Choose catalog item to update"
+msgstr ""
+
+#: src/dird/ua_update.c:122
+#, c-format
+msgid "Invalid VolStatus specified: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:131
+#, c-format
+msgid "New Volume status is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:141
+#, c-format
+msgid "Invalid retention period specified: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:149
+#, c-format
+msgid "New retention period is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:160
+#, c-format
+msgid "Invalid use duration specified: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:168
+#, c-format
+msgid "New use duration is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:182
+#, c-format
+msgid "New max jobs is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:195
+#, c-format
+msgid "New max files is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:206
+#, c-format
+msgid "Invalid max. bytes specification: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:214
+#, c-format
+msgid "New Max bytes is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:228 src/dird/ua_update.c:252
+msgid "Invalid value. It must be yes or no.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:236
+#, c-format
+msgid "New Recycle flag is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:260
+#, c-format
+msgid "New InChanger flag is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:278
+#, c-format
+msgid "Invalid slot, it must be between 0 and MaxVols=%d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:287 src/dird/ua_update.c:578
+#, c-format
+msgid "Error updating media record Slot: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_update.c:289
+#, c-format
+msgid "New Slot is: %d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:316
+#, c-format
+msgid "New Pool is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:345
+#, c-format
+msgid "Error updating Volume record: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_update.c:347
+#, c-format
+msgid "Volume defaults updated from \"%s\" Pool record.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:369
+#, c-format
+msgid "Error updating Volume records: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_update.c:371
+msgid "All Volume defaults updated from Pool record.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:391
+msgid "VolStatus"
+msgstr ""
+
+#: src/dird/ua_update.c:392
+msgid "VolRetention"
+msgstr ""
+
+#: src/dird/ua_update.c:393
+msgid "VolUse"
+msgstr ""
+
+#: src/dird/ua_update.c:394
+msgid "MaxVolJobs"
+msgstr ""
+
+#: src/dird/ua_update.c:395
+msgid "MaxVolFiles"
+msgstr ""
+
+#: src/dird/ua_update.c:396
+msgid "MaxVolBytes"
+msgstr ""
+
+#: src/dird/ua_update.c:397
+msgid "Recycle"
+msgstr ""
+
+#: src/dird/ua_update.c:398
+msgid "InChanger"
+msgstr ""
+
+#: src/dird/ua_update.c:399 src/dird/ua_update.c:471
+msgid "Slot"
+msgstr ""
+
+#: src/dird/ua_update.c:401
+msgid "FromPool"
+msgstr ""
+
+#: src/dird/ua_update.c:402
+msgid "AllFromPool"
+msgstr ""
+
+#: src/dird/ua_update.c:464
+msgid "Volume Status"
+msgstr ""
+
+#: src/dird/ua_update.c:465
+msgid "Volume Retention Period"
+msgstr ""
+
+#: src/dird/ua_update.c:466
+msgid "Volume Use Duration"
+msgstr ""
+
+#: src/dird/ua_update.c:467
+msgid "Maximum Volume Jobs"
+msgstr ""
+
+#: src/dird/ua_update.c:468
+msgid "Maximum Volume Files"
+msgstr ""
+
+#: src/dird/ua_update.c:469
+msgid "Maximum Volume Bytes"
+msgstr ""
+
+#: src/dird/ua_update.c:470
+msgid "Recycle Flag"
+msgstr ""
+
+#: src/dird/ua_update.c:472
+msgid "InChanger Flag"
+msgstr ""
+
+#: src/dird/ua_update.c:473
+msgid "Volume Files"
+msgstr ""
+
+#: src/dird/ua_update.c:475
+msgid "Volume from Pool"
+msgstr ""
+
+#: src/dird/ua_update.c:476
+msgid "All Volumes from Pool"
+msgstr ""
+
+#: src/dird/ua_update.c:477
+msgid "Done"
+msgstr ""
+
+#: src/dird/ua_update.c:485
+#, c-format
+msgid "Updating Volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/ua_update.c:490
+#, c-format
+msgid "Current Volume status is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:491
+msgid "Possible Values are:\n"
+msgstr ""
+
+#: src/dird/ua_update.c:502
+msgid "Choose new Volume Status"
+msgstr ""
+
+#: src/dird/ua_update.c:508
+#, c-format
+msgid "Current retention period is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:510
+msgid "Enter Volume Retention period: "
+msgstr ""
+
+#: src/dird/ua_update.c:517
+#, c-format
+msgid "Current use duration is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:519
+msgid "Enter Volume Use Duration: "
+msgstr ""
+
+#: src/dird/ua_update.c:526
+#, c-format
+msgid "Current max jobs is: %u\n"
+msgstr ""
+
+#: src/dird/ua_update.c:527
+msgid "Enter new Maximum Jobs: "
+msgstr ""
+
+#: src/dird/ua_update.c:534
+#, c-format
+msgid "Current max files is: %u\n"
+msgstr ""
+
+#: src/dird/ua_update.c:535
+msgid "Enter new Maximum Files: "
+msgstr ""
+
+#: src/dird/ua_update.c:542
+#, c-format
+msgid "Current value is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:543
+msgid "Enter new Maximum Bytes: "
+msgstr ""
+
+#: src/dird/ua_update.c:551
+#, c-format
+msgid "Current recycle flag is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:553
+msgid "Enter new Recycle status: "
+msgstr ""
+
+#: src/dird/ua_update.c:560
+#, c-format
+msgid "Current Slot is: %d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:561
+msgid "Enter new Slot: "
+msgstr ""
+
+#: src/dird/ua_update.c:568
+#, c-format
+msgid "Current InChanger flag is: %d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:569
+msgid "Set InChanger flag? yes/no: "
+msgstr ""
+
+#: src/dird/ua_update.c:580
+#, c-format
+msgid "New InChanger flag is: %d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:587
+msgid ""
+"Warning changing Volume Files can result\n"
+"in loss of data on your Volume\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_update.c:589
+#, c-format
+msgid "Current Volume Files is: %u\n"
+msgstr ""
+
+#: src/dird/ua_update.c:590
+msgid "Enter new number of Files for Volume: "
+msgstr ""
+
+#: src/dird/ua_update.c:595
+msgid "Normally, you should only increase Volume Files by one!\n"
+msgstr ""
+
+#: src/dird/ua_update.c:596
+msgid "Continue? (yes/no): "
+msgstr ""
+
+#: src/dird/ua_update.c:606
+#, c-format
+msgid "New Volume Files is: %u\n"
+msgstr ""
+
+#: src/dird/ua_update.c:618
+#, c-format
+msgid "Current Pool is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:619
+msgid "Enter new Pool name: "
+msgstr ""
+
+#: src/dird/ua_update.c:632
+msgid "Selection terminated.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:665
+#, c-format
+msgid "db_update_pool_record returned %d. ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:672
+msgid "Pool DB record updated from resource.\n"
+msgstr ""
+
+#: src/dird/verify.c:87
+msgid ""
+"Unable to find JobId of previous InitCatalog Job.\n"
+"Please run a Verify with Level=InitCatalog before\n"
+"running the current Job.\n"
+msgstr ""
+
+#: src/dird/verify.c:117
+#, c-format
+msgid "Verifying against JobId=%d Job=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:180
+#, c-format
+msgid "Start Verify JobId=%s Level=%s Job=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:263
+msgid "Deprecated feature ... use bootstrap.\n"
+msgstr ""
+
+#: src/dird/verify.c:276
+#, c-format
+msgid "Unimplemented Verify level %d(%c)\n"
+msgstr ""
+
+#: src/dird/verify.c:328
+#, c-format
+msgid "Unimplemented verify level %d\n"
+msgstr ""
+
+#: src/dird/verify.c:383
+msgid "Verify OK"
+msgstr ""
+
+#: src/dird/verify.c:387
+msgid "*** Verify Error ***"
+msgstr ""
+
+#: src/dird/verify.c:391
+msgid "Verify warnings"
+msgstr ""
+
+#: src/dird/verify.c:394
+msgid "Verify Canceled"
+msgstr ""
+
+#: src/dird/verify.c:397
+msgid "Verify Differences"
+msgstr ""
+
+#: src/dird/verify.c:402
+#, c-format
+msgid "Inappropriate term code: %d %c\n"
+msgstr ""
+
+#: src/dird/verify.c:416
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Expected:         %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/verify.c:451
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/verify.c:527
+#, c-format
+msgid ""
+"bird<filed: bad attributes, expected 3 fields got %d\n"
+" mslen=%d msg=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:571
+#, c-format
+msgid "New file: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:572
+#, c-format
+msgid "File not in catalog: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:596
+#, c-format
+msgid "      st_ino   differ. Cat: %s File: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:605
+#, c-format
+msgid "      st_mode  differ. Cat: %x File: %x\n"
+msgstr ""
+
+#: src/dird/verify.c:613
+#, c-format
+msgid "      st_nlink differ. Cat: %d File: %d\n"
+msgstr ""
+
+#: src/dird/verify.c:621
+#, c-format
+msgid "      st_uid   differ. Cat: %u File: %u\n"
+msgstr ""
+
+#: src/dird/verify.c:629
+#, c-format
+msgid "      st_gid   differ. Cat: %u File: %u\n"
+msgstr ""
+
+#: src/dird/verify.c:637
+#, c-format
+msgid "      st_size  differ. Cat: %s File: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:646
+msgid "      st_atime differs\n"
+msgstr ""
+
+#: src/dird/verify.c:653
+msgid "      st_mtime differs\n"
+msgstr ""
+
+#: src/dird/verify.c:660
+msgid "      st_ctime differs\n"
+msgstr ""
+
+#: src/dird/verify.c:667
+#, c-format
+msgid "      st_size  decrease. Cat: %s File: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:706
+#, c-format
+msgid "      %s not same. File=%s Cat=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:709
+#, c-format
+msgid "      %s differs.\n"
+msgstr ""
+
+#: src/dird/verify.c:721
+#, c-format
+msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
+msgstr ""
+
+#: src/dird/verify.c:758
+msgid "The following files are missing:\n"
+msgstr ""
+
+#: src/dird/verify.c:772 src/tools/testfind.c:338
+#, c-format
+msgid "File: %s\n"
+msgstr ""
+
+#: src/filed/authenticate.c:45
+#, c-format
+msgid "I only authenticate directors, not %d\n"
+msgstr ""
+
+#: src/filed/authenticate.c:51 src/stored/authenticate.c:59
+#, c-format
+msgid "Bad Hello command from Director at %s. Len=%d.\n"
+msgstr ""
+
+#: src/filed/authenticate.c:63 src/stored/authenticate.c:70
+#, c-format
+msgid "Bad Hello command from Director at %s: %s\n"
+msgstr ""
+
+#: src/filed/authenticate.c:77 src/stored/authenticate.c:85
+#, c-format
+msgid ""
+"Connection from unknown Director %s at %s rejected.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/filed/authenticate.c:110
+#, c-format
+msgid ""
+"Incorrect password given by Director at %s.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/filed/authenticate.c:164 src/stored/dircmd.c:184
+msgid "Unable to authenticate Director\n"
+msgstr ""
+
+#: src/filed/authenticate.c:208
+msgid ""
+"Authorization key rejected by Storage daemon.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/filed/backup.c:68
+msgid "Cannot set buffer size FD->SD.\n"
+msgstr ""
+
+#: src/filed/backup.c:155
+#, c-format
+msgid "     Recursion turned off. Will not descend into %s\n"
+msgstr ""
+
+#: src/filed/backup.c:162
+#, c-format
+msgid "     Filesystem change prohibited. Will not descend into %s\n"
+msgstr ""
+
+#: src/filed/backup.c:168
+#, c-format
+msgid "     Disallowed filesystem. Will not descend into %s\n"
+msgstr ""
+
+#: src/filed/backup.c:186 src/filed/verify.c:113
+#, c-format
+msgid "     Could not access %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:193 src/filed/verify.c:120
+#, c-format
+msgid "     Could not follow link %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:200 src/filed/verify.c:127
+#, c-format
+msgid "     Could not stat %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:207 src/filed/verify.c:133
+#, c-format
+msgid "     Unchanged file skipped: %s\n"
+msgstr ""
+
+#: src/filed/backup.c:210
+#, c-format
+msgid "     Archive file not saved: %s\n"
+msgstr ""
+
+#: src/filed/backup.c:214 src/filed/verify.c:147
+#, c-format
+msgid "     Could not open directory %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:220
+#, c-format
+msgid "     Unknown file type %d; not saved: %s\n"
+msgstr ""
+
+#: src/filed/backup.c:240
+#, c-format
+msgid "Python reader program \"%s\" not found.\n"
+msgstr ""
+
+#: src/filed/backup.c:269 src/filed/verify.c:214
+#, c-format
+msgid "     Cannot open %s: ERR=%s.\n"
+msgstr ""
+
+#: src/filed/backup.c:298 src/filed/verify.c:229
+#, c-format
+msgid "     Cannot open resource fork for %s: ERR=%s.\n"
+msgstr ""
+
+#: src/filed/backup.c:349
+#, c-format
+msgid "Unknown signature type %i.\n"
+msgstr ""
+
+#: src/filed/backup.c:414 src/filed/backup.c:499 src/filed/backup.c:525
+#: src/filed/backup.c:557 src/filed/backup.c:570 src/filed/backup.c:578
+#: src/filed/backup.c:619 src/filed/backup.c:653
+#, c-format
+msgid "Network send error to SD. ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:479
+#, c-format
+msgid "Compression error: %d\n"
+msgstr ""
+
+#: src/filed/backup.c:516
+#, c-format
+msgid "Read error on file %s. ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:519
+msgid "Too many errors.\n"
+msgstr ""
+
+#: src/filed/backup.c:548
+#, c-format
+msgid "Error reading ACL of %s\n"
+msgstr ""
+
+#: src/filed/filed.c:62
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n"
+"        -c <file>   use <file> as configuration file\n"
+"        -dnn        set debug level to nn\n"
+"        -f          run in foreground (for debugging)\n"
+"        -g          groupid\n"
+"        -i          inetd request\n"
+"        -s          no signals (for debugging)\n"
+"        -t          test configuration file and exit\n"
+"        -u          userid\n"
+"        -v          verbose user messages\n"
+"        -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/filed/filed.c:282
+#, c-format
+msgid ""
+"No File daemon resource defined in %s\n"
+"Without that I don't know who I am :-(\n"
+msgstr ""
+
+#: src/filed/filed.c:287
+#, c-format
+msgid "Only one Client resource permitted in %s\n"
+msgstr ""
+
+#: src/filed/filed.c:310
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"File daemon in %s.\n"
+msgstr ""
+
+#: src/filed/filed.c:339
+#, c-format
+msgid "No Director resource defined in %s\n"
+msgstr ""
+
+#: src/filed/job.c:324
+#, c-format
+msgid "2901 Job %s not found.\n"
+msgstr ""
+
+#: src/filed/job.c:333
+#, c-format
+msgid "2001 Job %s marked to be canceled.\n"
+msgstr ""
+
+#: src/filed/job.c:336
+msgid "2902 Error scanning cancel command.\n"
+msgstr ""
+
+#: src/filed/job.c:355
+#, c-format
+msgid "2991 Bad setdebug command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:371
+#, c-format
+msgid "Bad estimate command: %s"
+msgstr ""
+
+#: src/filed/job.c:372
+msgid "2992 Bad estimate command.\n"
+msgstr ""
+
+#: src/filed/job.c:395
+#, c-format
+msgid "Bad Job Command: %s"
+msgstr ""
+
+#: src/filed/job.c:415
+#, c-format
+msgid "Bad RunBeforeJob command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:416 src/filed/job.c:429
+msgid "2905 Bad RunBeforeJob command.\n"
+msgstr ""
+
+#: src/filed/job.c:442
+#, c-format
+msgid "Bad RunAfter command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:443
+msgid "2905 Bad RunAfterJob command.\n"
+msgstr ""
+
+#: src/filed/job.c:469
+#, c-format
+msgid "%s could not execute. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:478
+#, c-format
+msgid "%s: %s\n"
+msgstr ""
+
+#: src/filed/job.c:483
+#, c-format
+msgid "%s returned non-zero status=%d. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:568
+#, c-format
+msgid "Error running program: %s. RtnStat=%d ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:578
+#, c-format
+msgid "Cannot open FileSet input file: %s. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:672
+#, c-format
+msgid "REGEX %s compile error. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:726
+#, c-format
+msgid "Invalid FileSet command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:895 src/findlib/match.c:184
+#, c-format
+msgid "Unknown include/exclude option: %c\n"
+msgstr ""
+
+#: src/filed/job.c:955 src/stored/fd_cmds.c:329
+#, c-format
+msgid "Could not create bootstrap file %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:1057
+#, c-format
+msgid "DIR and FD clocks differ by %d seconds, FD automatically adjusting.\n"
+msgstr ""
+
+#: src/filed/job.c:1065
+#, c-format
+msgid "Unknown backup level: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1077
+#, c-format
+msgid "Bad level command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1098
+#, c-format
+msgid "Bad session command: %s"
+msgstr ""
+
+#: src/filed/job.c:1119
+#, c-format
+msgid "Bad storage command: %s"
+msgstr ""
+
+#: src/filed/job.c:1128
+#, c-format
+msgid "Failed to connect to Storage daemon: %s:%d\n"
+msgstr ""
+
+#: src/filed/job.c:1140
+msgid "Failed to authenticate Storage daemon.\n"
+msgstr ""
+
+#: src/filed/job.c:1178
+msgid "Cannot contact Storage daemon\n"
+msgstr ""
+
+#: src/filed/job.c:1196
+#, c-format
+msgid "Bad response to append open: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1201
+msgid "Bad response from stored to open command\n"
+msgstr ""
+
+#: src/filed/job.c:1228
+#, c-format
+msgid "Generate VSS snapshots. Driver=\"%s\", Drive(s)=\"%s\"\n"
+msgstr ""
+
+#: src/filed/job.c:1230
+msgid "Generate VSS snapshots failed.\n"
+msgstr ""
+
+#: src/filed/job.c:1237
+#, c-format
+msgid "Generate VSS snapshot of drive \"%c:\\\" failed\n"
+msgstr ""
+
+#: src/filed/job.c:1244
+#, c-format
+msgid "VSS Writer (PrepareForBackup): %s\n"
+msgstr ""
+
+#: src/filed/job.c:1249
+msgid "No drive letters found for generating VSS snapshots.\n"
+msgstr ""
+
+#: src/filed/job.c:1253
+#, c-format
+msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:1302
+msgid "Append Close with SD failed.\n"
+msgstr ""
+
+#: src/filed/job.c:1306
+#, c-format
+msgid "Bad status %d returned from Storage Daemon.\n"
+msgstr ""
+
+#: src/filed/job.c:1324
+#, c-format
+msgid "VSS Writer (BackupComplete): %s\n"
+msgstr ""
+
+#: src/filed/job.c:1351
+#, c-format
+msgid "2994 Bad verify command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1366 src/filed/job.c:1405
+#, c-format
+msgid "2994 Bad verify level: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1445
+#, c-format
+msgid "Bad replace command. CMD=%s\n"
+msgstr ""
+
+#: src/filed/job.c:1522
+msgid "Improper calling sequence.\n"
+msgstr ""
+
+#: src/filed/job.c:1542
+#, c-format
+msgid "Bad response to SD read open: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1547
+msgid "Bad response from stored to read open command\n"
+msgstr ""
+
+#: src/filed/job.c:1613
+#, c-format
+msgid "Comm error with SD. bad response to %s. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:1616
+#, c-format
+msgid "Bad response to %s command. Wanted %s, got %s\n"
+msgstr ""
+
+#: src/filed/pythonfd.c:144 src/stored/pythonsd.c:149
+#, c-format
+msgid "Cannot delete attribute %s"
+msgstr ""
+
+#: src/filed/pythonfd.c:162 src/filed/pythonfd.c:178 src/stored/pythonsd.c:182
+#, c-format
+msgid "Cannot find attribute %s"
+msgstr ""
+
+#: src/filed/restore.c:55
+#, c-format
+msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n"
+msgstr ""
+
+#: src/filed/restore.c:165 src/filed/verify_vol.c:90
+#, c-format
+msgid "Record header scan error: %s\n"
+msgstr ""
+
+#: src/filed/restore.c:172 src/filed/verify_vol.c:99
+#, c-format
+msgid "Data record error. ERR=%s\n"
+msgstr ""
+
+#: src/filed/restore.c:176 src/filed/verify_vol.c:103
+#, c-format
+msgid "Actual data size %d not same as header %d\n"
+msgstr ""
+
+#: src/filed/restore.c:201 src/filed/restore.c:383
+msgid "Logic error: output file should be open\n"
+msgstr ""
+
+#: src/filed/restore.c:207 src/filed/restore.c:388
+msgid "Logic error: output file should not be open\n"
+msgstr ""
+
+#: src/filed/restore.c:218 src/filed/verify_vol.c:142
+#: src/stored/bextract.c:289 src/stored/bls.c:371 src/stored/bscan.c:651
+#, c-format
+msgid "Record header file index %ld not equal record index %ld\n"
+msgstr ""
+
+#: src/filed/restore.c:231 src/stored/bextract.c:298
+#, c-format
+msgid "%s stream not supported on this Client.\n"
+msgstr ""
+
+#: src/filed/restore.c:308
+#, c-format
+msgid "     Cannot open resource fork for %s.\n"
+msgstr ""
+
+#: src/filed/restore.c:331
+#, c-format
+msgid "     Invalid length of Finder Info (got %d, not 32)\n"
+msgstr ""
+
+#: src/filed/restore.c:335
+#, c-format
+msgid "     Could not set Finder Info on %s\n"
+msgstr ""
+
+#: src/filed/restore.c:347
+#, c-format
+msgid "Can't restore ACL of %s\n"
+msgstr ""
+
+#: src/filed/restore.c:359
+#, c-format
+msgid "Can't restore default ACL of %s\n"
+msgstr ""
+
+#: src/filed/restore.c:391 src/stored/bextract.c:455
+#, c-format
+msgid "Unknown stream=%d ignored. This shouldn't happen!\n"
+msgstr ""
+
+#: src/filed/restore.c:428
+#, c-format
+msgid ""
+"%d non-supported data streams and %d non-supported attrib streams ignored.\n"
+msgstr ""
+
+#: src/filed/restore.c:432
+#, c-format
+msgid "%d non-supported resource fork streams ignored.\n"
+msgstr ""
+
+#: src/filed/restore.c:435
+#, c-format
+msgid "%d non-supported Finder Info streams ignored.\n"
+msgstr ""
+
+#: src/filed/restore.c:438
+#, c-format
+msgid "%d non-supported acl streams ignored.\n"
+msgstr ""
+
+#: src/filed/restore.c:450
+msgid "None"
+msgstr ""
+
+#: src/filed/restore.c:454
+msgid "Zlib errno"
+msgstr ""
+
+#: src/filed/restore.c:456
+msgid "Zlib stream error"
+msgstr ""
+
+#: src/filed/restore.c:458
+msgid "Zlib data error"
+msgstr ""
+
+#: src/filed/restore.c:460
+msgid "Zlib memory error"
+msgstr ""
+
+#: src/filed/restore.c:462
+msgid "Zlib buffer error"
+msgstr ""
+
+#: src/filed/restore.c:464
+msgid "Zlib version error"
+msgstr ""
+
+#: src/filed/restore.c:466 src/lib/util.c:546 src/lib/util.c:556
+#: src/lib/util.c:564 src/lib/util.c:571 src/lib/util.c:578 src/lib/util.c:592
+#: src/lib/util.c:602 src/lib/util.c:609 src/lib/util.c:620
+msgid "*none*"
+msgstr ""
+
+#: src/filed/restore.c:498 src/stored/bextract.c:387
+#, c-format
+msgid "Seek to %s error on %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/restore.c:522
+#, c-format
+msgid "Uncompression error on file %s. ERR=%s\n"
+msgstr ""
+
+#: src/filed/restore.c:530 src/stored/bextract.c:421
+msgid "GZIP data stream found, but GZIP not configured!\n"
+msgstr ""
+
+#: src/filed/restore.c:539 src/stored/bextract.c:359 src/stored/bextract.c:409
+#, c-format
+msgid "Write error on %s: %s\n"
+msgstr ""
+
+#: src/filed/status.c:67
+#, c-format
+msgid "%s Version: %s (%s) %s %s %s %s\n"
+msgstr ""
+
+#: src/filed/status.c:71
+#, c-format
+msgid "Daemon started %s, %d Job%s run since started.\n"
+msgstr ""
+
+#: src/filed/status.c:127
+#, c-format
+msgid " Sizeof: off_t=%d size_t=%d debug=%d trace=%d\n"
+msgstr ""
+
+#: src/filed/status.c:138
+msgid "Running Jobs:\n"
+msgstr ""
+
+#: src/filed/status.c:149
+#, c-format
+msgid "Director connected at: %s\n"
+msgstr ""
+
+#: src/filed/status.c:151
+#, c-format
+msgid "JobId %d Job %s is running.\n"
+msgstr ""
+
+#: src/filed/status.c:154
+#, c-format
+msgid "    %s%s Job started: %s\n"
+msgstr ""
+
+#: src/filed/status.c:166 src/stored/status.c:323
+#, c-format
+msgid "    Files=%s Bytes=%s Bytes/sec=%s\n"
+msgstr ""
+
+#: src/filed/status.c:171
+#, c-format
+msgid "    Files Examined=%s\n"
+msgstr ""
+
+#: src/filed/status.c:176
+#, c-format
+msgid "    Processing file: %s\n"
+msgstr ""
+
+#: src/filed/status.c:187
+msgid "    SDSocket closed.\n"
+msgstr ""
+
+#: src/filed/status.c:217
+msgid "Terminated Jobs:\n"
+msgstr ""
+
+#: src/filed/status.c:219
+msgid " JobId  Level     Files         Bytes  Status   Finished        Name \n"
+msgstr ""
+
+#: src/filed/status.c:323 src/filed/status.c:347 src/stored/status.c:513
+#: src/stored/status.c:536
+#, c-format
+msgid "Bad .status command: %s\n"
+msgstr ""
+
+#: src/filed/status.c:324
+msgid "2900 Bad .status command, missing argument.\n"
+msgstr ""
+
+#: src/filed/status.c:348
+msgid "2900 Bad .status command, wrong argument.\n"
+msgstr ""
+
+#: src/filed/status.c:385 src/stored/status.c:468
+msgid "Init Catalog"
+msgstr ""
+
+#: src/filed/status.c:388 src/stored/status.c:471
+msgid "Volume to Catalog"
+msgstr ""
+
+#: src/filed/status.c:391 src/stored/status.c:474
+msgid "Disk to Catalog"
+msgstr ""
+
+#: src/filed/status.c:394 src/stored/status.c:477
+msgid "Data"
+msgstr ""
+
+#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:483
+msgid "Unknown Job Level"
+msgstr ""
+
+#: src/filed/status.c:451
+msgid "Bacula Idle"
+msgstr ""
+
+#: src/filed/status.c:462
+msgid "Bacula Running"
+msgstr ""
+
+#: src/filed/status.c:476
+msgid "Last Job Canceled"
+msgstr ""
+
+#: src/filed/status.c:480
+msgid "Last Job Failed"
+msgstr ""
+
+#: src/filed/status.c:484
+msgid "Last Job had Warnings"
+msgstr ""
+
+#: src/filed/verify.c:45
+#, c-format
+msgid "Cannot malloc %d network read buffer\n"
+msgstr ""
+
+#: src/filed/verify.c:136
+#, c-format
+msgid "     Archive file skipped: %s\n"
+msgstr ""
+
+#: src/filed/verify.c:139
+#, c-format
+msgid "     Recursion turned off. Directory skipped: %s\n"
+msgstr ""
+
+#: src/filed/verify.c:142
+#, c-format
+msgid "     File system change prohibited. Directory skipped: %s\n"
+msgstr ""
+
+#: src/filed/verify.c:152
+#, c-format
+msgid "     Unknown file type %d: %s\n"
+msgstr ""
+
+#: src/filed/verify.c:195 src/filed/verify_vol.c:200
+#, c-format
+msgid "Network error in send to Director: ERR=%s\n"
+msgstr ""
+
+#: src/filed/verify.c:284
+#, c-format
+msgid "Error reading file %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/verify_vol.c:56
+msgid "Storage command not issued before Verify.\n"
+msgstr ""
+
+#: src/filed/verify_vol.c:136
+#, c-format
+msgid "Error scanning record header: %s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:335
+#, c-format
+msgid "File size of restored file %s not correct. Original %s, restored %s.\n"
+msgstr ""
+
+#: src/findlib/attribs.c:353 src/findlib/attribs.c:360
+#, c-format
+msgid "Unable to set file owner %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:366
+#, c-format
+msgid "Unable to set file modes %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:376
+#, c-format
+msgid "Unable to set file times %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:390
+#, c-format
+msgid "Unable to set file flags %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:635
+#, c-format
+msgid "Error in %s file %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:652
+#, c-format
+msgid "Error in %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/bfile.c:67
+msgid "GZIP data"
+msgstr ""
+
+#: src/findlib/bfile.c:69
+msgid "GZIP sparse data"
+msgstr ""
+
+#: src/findlib/bfile.c:71
+msgid "Win32 data"
+msgstr ""
+
+#: src/findlib/bfile.c:73
+msgid "Win32 GZIP data"
+msgstr ""
+
+#: src/findlib/bfile.c:75
+msgid "File attributes"
+msgstr ""
+
+#: src/findlib/bfile.c:77
+msgid "File data"
+msgstr ""
+
+#: src/findlib/bfile.c:79
+msgid "MD5 signature"
+msgstr ""
+
+#: src/findlib/bfile.c:81
+msgid "Extended attributes"
+msgstr ""
+
+#: src/findlib/bfile.c:83
+msgid "Sparse data"
+msgstr ""
+
+#: src/findlib/bfile.c:85
+msgid "Program names"
+msgstr ""
+
+#: src/findlib/bfile.c:87
+msgid "Program data"
+msgstr ""
+
+#: src/findlib/bfile.c:89
+msgid "SHA1 signature"
+msgstr ""
+
+#: src/findlib/bfile.c:91
+msgid "HFS+ resource fork"
+msgstr ""
+
+#: src/findlib/bfile.c:93
+msgid "HFS+ Finder Info"
+msgstr ""
+
+#: src/findlib/create_file.c:86
+#, c-format
+msgid "File skipped. Not newer: %s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:93
+#, c-format
+msgid "File skipped. Not older: %s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:99
+#, c-format
+msgid "File skipped. Already exists: %s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:124
+#, c-format
+msgid "File %s already exists and could not be replaced. ERR=%s.\n"
+msgstr ""
+
+#: src/findlib/create_file.c:176 src/findlib/create_file.c:277
+#: src/findlib/create_file.c:328
+#, c-format
+msgid "bpkt already open fid=%d\n"
+msgstr ""
+
+#: src/findlib/create_file.c:198
+msgid "Could not save_dirn"
+msgstr ""
+
+#: src/findlib/create_file.c:207 src/findlib/create_file.c:220
+#, c-format
+msgid "Could not chdir to %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:240
+#, c-format
+msgid "Could not create %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:253
+#, c-format
+msgid "Cannot make fifo %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:261
+#, c-format
+msgid "Cannot make node %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:297
+#, c-format
+msgid "Could not symlink %s -> %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:307
+#, c-format
+msgid "Could not hard link %s -> %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:358
+#, c-format
+msgid "Original file %s not saved: type=%d\n"
+msgstr ""
+
+#: src/findlib/create_file.c:361
+#, c-format
+msgid "Unknown file type %d; not restored: %s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:402
+#, c-format
+msgid "Zero length filename: %s\n"
+msgstr ""
+
+#: src/findlib/enable_priv.c:85
+msgid "AdjustTokenPrivileges set "
+msgstr ""
+
+#: src/findlib/find_one.c:168
+#, c-format
+msgid "Top level directory \"%s\" has an unlisted fstype\n"
+msgstr ""
+
+#: src/findlib/makepath.c:117
+#, c-format
+msgid "Cannot create directory %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/makepath.c:121 src/findlib/makepath.c:378
+#, c-format
+msgid "%s exists but is not a directory\n"
+msgstr ""
+
+#: src/findlib/makepath.c:276 src/findlib/makepath.c:337
+#: src/findlib/makepath.c:397
+#, c-format
+msgid "Cannot change owner and/or group of %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/makepath.c:297
+#, c-format
+msgid "Cannot chdir to directory, %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/makepath.c:352 src/findlib/makepath.c:368
+#: src/findlib/makepath.c:402
+#, c-format
+msgid "Cannot change permissions of %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:48
+#, c-format
+msgid "Cannot open current directory: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:62
+#, c-format
+msgid "Current directory: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:84
+#, c-format
+msgid "Cannot get current directory: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:105
+#, c-format
+msgid "Cannot return to %s from %s: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:109
+#, c-format
+msgid "Cannot return to saved working directory from %s: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:115
+#, c-format
+msgid "Cannot return to %s: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:119
+#, c-format
+msgid "Cannot return to saved working directory: %s\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:74
+#, c-format
+msgid "%s: Director authorization problem.\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:75
+msgid "Director authorization problem.\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:77
+msgid ""
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:87
+#, c-format
+msgid "%s: Bad response to Hello command: ERR=%s\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:89
+msgid "The Director is probably not running.\n"
+msgstr ""
+
+#: src/gnome2-console/console.c:88
+#, c-format
+msgid ""
+"Copyright (C) 2002-2005 Kern Sibbald\n"
+"\n"
+"Version: %s (%s) %s %s %s\n"
+"\n"
+"Usage: gnome-console [-s] [-c config_file] [-d debug_level] [config_file]\n"
+"       -c <file>   set configuration file to file\n"
+"       -dnn        set debug level to nn\n"
+"       -s          no signals\n"
+"       -t          test - read configuration and exit\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/gnome2-console/console.c:219
+#, c-format
+msgid "Pthread cond init error = %s\n"
+msgstr ""
+
+#: src/gnome2-console/console.c:357
+msgid " Not Connected"
+msgstr ""
+
+#: src/gnome2-console/console.c:478
+#, c-format
+msgid " Connecting to Director %s:%d"
+msgstr ""
+
+#: src/gnome2-console/console.c:479
+#, c-format
+msgid ""
+"Connecting to Director %s:%d\n"
+"\n"
+msgstr ""
+
+#: src/gnome2-console/console.c:494 src/wx-console/console_thread.cpp:360
+#, c-format
+msgid "Passphrase for Console \"%s\" TLS private key: "
+msgstr ""
+
+#: src/gnome2-console/console.c:516 src/wx-console/console_thread.cpp:381
+#, c-format
+msgid "Passphrase for Director \"%s\" TLS private key: "
+msgstr ""
+
+#: src/gnome2-console/console.c:535 src/tray-monitor/tray-monitor.c:860
+#: src/wx-console/console_thread.cpp:399
+msgid "Director daemon"
+msgstr ""
+
+#: src/gnome2-console/console.c:547
+msgid " Initializing ..."
+msgstr ""
+
+#: src/gnome2-console/console.c:583
+msgid " Connected"
+msgstr ""
+
+#: src/gnome2-console/console.c:591
+msgid " Processing command ..."
+msgstr ""
+
+#: src/gnome2-console/console.c:626
+msgid " At prompt waiting for input ..."
+msgstr ""
+
+#: src/gnome2-console/console.c:746
+msgid " Ready"
+msgstr ""
+
+#: src/gnome2-console/console_conf.c:135
+#, c-format
+msgid "Console: name=%s\n"
+msgstr ""
+
+#: src/gnome2-console/console_conf.c:138
+#, c-format
+msgid "ConsoleFont: name=%s font face=%s\n"
+msgstr ""
+
+#: src/gnome2-console/interface.c:202
+msgid "Bacula Console"
+msgstr ""
+
+#: src/gnome2-console/interface.c:235 src/wx-console/wxbmainframe.cpp:229
+#: src/wx-console/wxbmainframe.cpp:597
+msgid "Connect"
+msgstr ""
+
+#: src/gnome2-console/interface.c:238
+msgid "Connect to Director"
+msgstr ""
+
+#: src/gnome2-console/interface.c:242
+msgid "Run"
+msgstr ""
+
+#: src/gnome2-console/interface.c:245 src/gnome2-console/interface.c:683
+#: src/gnome2-console/interface.c:697
+msgid "Run a Job"
+msgstr ""
+
+#: src/gnome2-console/interface.c:249
+msgid "Dir Status"
+msgstr ""
+
+#: src/gnome2-console/interface.c:255 src/lib/util.c:292
+#: src/wx-console/wxbrestorepanel.cpp:384
+#: src/wx-console/wxbrestorepanel.cpp:1949
+msgid "Restore"
+msgstr ""
+
+#: src/gnome2-console/interface.c:261
+msgid "Label"
+msgstr ""
+
+#: src/gnome2-console/interface.c:267
+msgid "Msgs"
+msgstr ""
+
+#: src/gnome2-console/interface.c:270
+msgid "Display Messages"
+msgstr ""
+
+#: src/gnome2-console/interface.c:294
+msgid " Command: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:303
+msgid "Enter Commands Here"
+msgstr ""
+
+#: src/gnome2-console/interface.c:314
+msgid " Status: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:323 src/gnome2-console/interface.c:1716
+msgid "  "
+msgstr ""
+
+#: src/gnome2-console/interface.c:424
+msgid "About Bacula Console"
+msgstr ""
+
+#: src/gnome2-console/interface.c:439
+msgid "Bacula Console\n"
+msgstr ""
+
+#: src/gnome2-console/interface.c:448
+msgid "Copyright (c) 2000 - 2004, Kern Sibbald and John Walker"
+msgstr ""
+
+#: src/gnome2-console/interface.c:453
+msgid "Authors: Kern Sibbald and John Walker"
+msgstr ""
+
+#: src/gnome2-console/interface.c:458
+msgid "It comes by night and sucks the essence from your computers"
+msgstr ""
+
+#: src/gnome2-console/interface.c:523 src/gnome2-console/interface.c:540
+msgid "Select Director"
+msgstr ""
+
+#: src/gnome2-console/interface.c:570
+msgid "         "
+msgstr ""
+
+#: src/gnome2-console/interface.c:716 src/gnome2-console/interface.c:1638
+msgid "Job:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:736
+msgid "   Type:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:756 src/gnome2-console/interface.c:785
+#: src/gnome2-console/interface.c:1291 src/gnome2-console/interface.c:1687
+msgid " "
+msgstr ""
+
+#: src/gnome2-console/interface.c:765 src/gnome2-console/interface.c:1667
+#: src/wx-console/wxbrestorepanel.cpp:1862
+msgid "Client:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:796 src/gnome2-console/interface.c:1696
+msgid "FileSet: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:821 src/wx-console/wxbrestorepanel.cpp:1868
+msgid "Priority:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:842
+msgid "Level:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:863
+msgid "             "
+msgstr ""
+
+#: src/gnome2-console/interface.c:873 src/gnome2-console/interface.c:1440
+#: src/gnome2-console/interface.c:1725
+msgid "Pool:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:894 src/gnome2-console/interface.c:925
+#: src/gnome2-console/interface.c:955 src/gnome2-console/interface.c:975
+#: src/gnome2-console/interface.c:995 src/gnome2-console/interface.c:1015
+#: src/gnome2-console/interface.c:1020 src/gnome2-console/interface.c:1490
+#: src/gnome2-console/interface.c:1746 src/gnome2-console/interface.c:1776
+#: src/gnome2-console/interface.c:1795 src/gnome2-console/interface.c:1800
+msgid "   "
+msgstr ""
+
+#: src/gnome2-console/interface.c:904 src/gnome2-console/interface.c:1414
+#: src/gnome2-console/interface.c:1755 src/wx-console/wxbrestorepanel.cpp:1864
+msgid "Storage:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:935
+msgid "Messages:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:965
+msgid "Where: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:985 src/wx-console/wxbrestorepanel.cpp:1866
+msgid "When:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1005 src/wx-console/wxbrestorepanel.cpp:1847
+msgid "Bootstrap:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1201
+msgid "Restore File Selection"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1245
+msgid "Current dir:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1272
+msgid "Files Selected: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:1392 src/gnome2-console/interface.c:1403
+msgid "Label a Volume"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1465
+msgid "Volume Name:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1479
+msgid "Slot:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1605
+msgid "Restore Files Dialog"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1620
+msgid "Restore Files"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1785
+msgid "Before:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1831
+msgid "Select Files"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1914
+msgid "Progress"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121
+msgid "Mark"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121
+msgid "File"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121
+msgid "Mode"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:288
+msgid "User"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:292
+msgid "Group"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:276
+msgid "Size"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:280
+msgid "Date"
+msgstr ""
+
+#: src/gnome2-console/support.c:60 src/gnome2-console/support.c:85
+#, c-format
+msgid "Couldn't find pixmap file: %s"
+msgstr ""
+
+#: src/lib/tls.c:105
+#, c-format
+msgid ""
+"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
+msgstr ""
+
+#: src/lib/tls.c:152
+msgid "Error initializing SSL context"
+msgstr ""
+
+#: src/lib/tls.c:173
+msgid "Error loading certificate verification stores"
+msgstr ""
+
+#: src/lib/tls.c:178
+msgid ""
+"Either a certificate file or a directory must be specified as a verification "
+"store\n"
+msgstr ""
+
+#: src/lib/tls.c:189
+msgid "Error loading certificate file"
+msgstr ""
+
+#: src/lib/tls.c:197
+msgid "Error loading private key"
+msgstr ""
+
+#: src/lib/tls.c:205
+msgid "Unable to open DH parameters file"
+msgstr ""
+
+#: src/lib/tls.c:211
+msgid "Unable to load DH parameters from specified file"
+msgstr ""
+
+#: src/lib/tls.c:215
+msgid "Failed to set TLS Diffie-Hellman parameters"
+msgstr ""
+
+#: src/lib/tls.c:224
+msgid "Error setting cipher list, no valid ciphers available\n"
+msgstr ""
+
+#: src/lib/tls.c:272
+msgid "Peer failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:314
+#, c-format
+msgid "Peer %s failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:417
+msgid "Error creating file descriptor-based BIO"
+msgstr ""
+
+#: src/lib/tls.c:428
+msgid "Error creating new SSL object"
+msgstr ""
+
+#: src/lib/tls.c:492 src/lib/tls.c:515
+msgid "Connect failure"
+msgstr ""
+
+#: src/lib/tls.c:592 src/lib/tls.c:596
+msgid "TLS shutdown failure."
+msgstr ""
+
+#: src/lib/tls.c:645 src/lib/tls.c:665
+msgid "TLS read/write failure."
+msgstr ""
+
+#: src/lib/tls.c:723 src/lib/tls.c:780 src/stored/dev.c:209
+#: src/stored/dev.c:227 src/stored/dev.c:233 src/stored/stored_conf.c:593
+#, c-format
+msgid "Unable to init mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:743 src/lib/tls.c:812
+#, c-format
+msgid "Unable to destroy mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:877
+#, c-format
+msgid "Unable to init OpenSSL threading: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:887
+msgid "Failed to seed OpenSSL PRNG\n"
+msgstr ""
+
+#: src/lib/tls.c:913
+msgid "Failed to save OpenSSL PRNG\n"
+msgstr ""
+
+#: src/lib/address_conf.c:50
+#, c-format
+msgid "Only ipv4 and ipv6 are supported (%d)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:54
+#, c-format
+msgid "Only ipv4 is supported (%d)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:163
+#, c-format
+msgid "It was tried to assign a ipv6 address to a ipv4(%d)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:172
+#, c-format
+msgid "It was tried to assign a ipv4 address to a ipv6(%d)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:251
+#, c-format
+msgid "Can't add default address (%s)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:281
+msgid "the old style addresses cannot be mixed with new style"
+msgstr ""
+
+#: src/lib/address_conf.c:304
+#, c-format
+msgid "can't resolve service(%s)"
+msgstr ""
+
+#: src/lib/address_conf.c:314
+#, c-format
+msgid "can't resolve hostname(%s) %s"
+msgstr ""
+
+#: src/lib/address_conf.c:403
+#, c-format
+msgid "Expected a block begin { , got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:408
+msgid "Empty addr block is not allowed"
+msgstr ""
+
+#: src/lib/address_conf.c:412
+#, c-format
+msgid "Expected a string, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:421
+#, c-format
+msgid "Expected a string [ip|ipv4|ipv6], got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:425
+#, c-format
+msgid "Expected a string [ip|ipv4], got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:430 src/lib/address_conf.c:460
+#, c-format
+msgid "Expected a equal =, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:434
+#, c-format
+msgid "Expected a block beginn { , got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:441 src/lib/address_conf.c:456
+#, c-format
+msgid "Expected a identifier [addr|port], got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:446
+msgid "Only one port per address block"
+msgstr ""
+
+#: src/lib/address_conf.c:452
+msgid "Only one addr per address block"
+msgstr ""
+
+#: src/lib/address_conf.c:468
+#, c-format
+msgid "Expected a number or a string, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:474
+#, c-format
+msgid "Expected an IP number or a hostname, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:480
+msgid "State machine missmatch"
+msgstr ""
+
+#: src/lib/address_conf.c:486 src/lib/address_conf.c:499
+#, c-format
+msgid "Expected a end of block }, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:492
+#, c-format
+msgid "Can't add hostname(%s) and port(%s) to addrlist (%s)"
+msgstr ""
+
+#: src/lib/address_conf.c:508
+#, c-format
+msgid "Expected a hostname or IP nummer, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:513 src/lib/address_conf.c:527
+#, c-format
+msgid "can't add port (%s) to (%s)"
+msgstr ""
+
+#: src/lib/address_conf.c:522
+#, c-format
+msgid "Expected a port number or string, got: %s"
+msgstr ""
+
+#: src/lib/attr.c:64
+#, c-format
+msgid "Error scanning attributes: %s\n"
+msgstr ""
+
+#: src/lib/berrno.c:48
+msgid "Child exited normally."
+msgstr ""
+
+#: src/lib/berrno.c:55
+msgid "Unknown error during program execvp"
+msgstr ""
+
+#: src/lib/berrno.c:58
+#, c-format
+msgid "Child exited with code %d"
+msgstr ""
+
+#: src/lib/berrno.c:66
+#, c-format
+msgid "Child died from signal %d: %s"
+msgstr ""
+
+#: src/lib/berrno.c:72
+msgid "Invalid errno. No error message possible."
+msgstr ""
+
+#: src/lib/bget_msg.c:86
+msgid "Status OK\n"
+msgstr ""
+
+#: src/lib/bget_msg.c:90
+#, c-format
+msgid "bget_msg: unknown signal %d\n"
+msgstr ""
+
+#: src/lib/bnet.c:109
+#, c-format
+msgid "Attr spool write error. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:209 src/lib/bnet.c:266
+#, c-format
+msgid "Read expected %d got %d from %s:%s:%d\n"
+msgstr ""
+
+#: src/lib/bnet.c:227
+#, c-format
+msgid "Packet size too big from \"%s:%s:%d. Terminating connection.\n"
+msgstr ""
+
+#: src/lib/bnet.c:256
+#, c-format
+msgid "Read error from %s:%s:%d: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:332 src/lib/bnet.c:348
+#, c-format
+msgid "fread attr spool error. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:392
+#, c-format
+msgid "Write error sending len to %s:%s:%d: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:397 src/lib/bnet.c:430
+#, c-format
+msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"
+msgstr ""
+
+#: src/lib/bnet.c:424
+#, c-format
+msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:450 src/lib/bnet.c:490
+msgid "TLS connection initialization failed.\n"
+msgstr ""
+
+#: src/lib/bnet.c:458
+msgid "TLS Negotiation failed.\n"
+msgstr ""
+
+#: src/lib/bnet.c:464
+msgid ""
+"TLS certificate verification failed. Peer certificate did not match a "
+"required commonName\n"
+msgstr ""
+
+#: src/lib/bnet.c:502
+#, c-format
+msgid ""
+"TLS host certificate verification failed. Host %s did not match presented "
+"certificate\n"
+msgstr ""
+
+#: src/lib/bnet.c:516 src/lib/bnet.c:521
+msgid "TLS not configured.\n"
+msgstr ""
+
+#: src/lib/bnet.c:617
+msgid "No problem."
+msgstr ""
+
+#: src/lib/bnet.c:620
+msgid "Authoritative answer for host not found."
+msgstr ""
+
+#: src/lib/bnet.c:623
+msgid "Non-authoritative for host not found, or ServerFail."
+msgstr ""
+
+#: src/lib/bnet.c:626
+msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP."
+msgstr ""
+
+#: src/lib/bnet.c:629
+msgid "Valid name, no data record of resquested type."
+msgstr ""
+
+#: src/lib/bnet.c:632
+msgid "Unknown error."
+msgstr ""
+
+#: src/lib/bnet.c:767
+#, c-format
+msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:787
+#, c-format
+msgid "Socket open error. proto=%d port=%d. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:796 src/lib/bnet.c:821 src/lib/bnet_server.c:193
+#: src/lib/bnet_server.c:351
+#, c-format
+msgid "Cannot set SO_KEEPALIVE on socket: %s\n"
+msgstr ""
+
+#: src/lib/bnet.c:852
+#, c-format
+msgid ""
+"Could not connect to %s on %s:%d. ERR=%s\n"
+"Retrying ...\n"
+msgstr ""
+
+#: src/lib/bnet.c:858
+#, c-format
+msgid "Unable to connect to %s on %s:%d. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:936
+msgid "Could not malloc BSOCK data buffer\n"
+msgstr ""
+
+#: src/lib/bnet.c:943 src/lib/bnet.c:967
+#, c-format
+msgid "sockopt error: %s\n"
+msgstr ""
+
+#: src/lib/bnet.c:949 src/lib/bnet.c:973
+#, c-format
+msgid "Warning network buffer = %d bytes not max size.\n"
+msgstr ""
+
+#: src/lib/bnet.c:953 src/lib/bnet.c:977
+#, c-format
+msgid "Network buffer size %d not multiple of tape block size.\n"
+msgstr ""
+
+#: src/lib/bnet.c:997 src/lib/bnet.c:1031
+#, c-format
+msgid "fcntl F_GETFL error. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:1003 src/lib/bnet.c:1037 src/lib/bnet.c:1062
+#, c-format
+msgid "fcntl F_SETFL error. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:1116
+#, c-format
+msgid "Unknown sig %d"
+msgstr ""
+
+#: src/lib/bnet_pkt.c:89 src/lib/bnet_pkt.c:147
+#, c-format
+msgid "Unknown BPKT type: %d\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:96
+#, c-format
+msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:258
+#, c-format
+msgid "Cannot set SO_REUSEADDR on socket: %s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:118
+#, c-format
+msgid "Cannot bind port %d: ERR=%s: Retrying ...\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:123
+#, c-format
+msgid "Cannot bind port %d: ERR=%s.\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:134
+#, c-format
+msgid "Could not init client queue: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:157 src/lib/bnet_server.c:320
+#, c-format
+msgid "Error in select: %s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:178 src/lib/bnet_server.c:339
+#, c-format
+msgid "Connection from %s:%d refused by hosts.access\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:204
+msgid "Could not create client BSOCK.\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:211
+#, c-format
+msgid "Could not add job to client queue: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:222
+#, c-format
+msgid "Could not destroy client queue: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:249
+#, c-format
+msgid "Cannot open stream socket: %s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:278
+#, c-format
+msgid "Cannot bind port %d: ERR=%s: retrying ...\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:284
+msgid "Server socket"
+msgstr ""
+
+#: src/lib/bnet_server.c:366
+#, c-format
+msgid "Socket accept error for %s. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bpipe.c:283 src/lib/bpipe.c:362
+msgid "Program killed by Bacula watchdog (timeout)\n"
+msgstr ""
+
+#: src/lib/bshm.c:69
+#, c-format
+msgid "shmget failure key = %x\n"
+msgstr ""
+
+#: src/lib/bshm.c:77
+#, c-format
+msgid "Could not get %d bytes of shared memory: %s\n"
+msgstr ""
+
+#: src/lib/bshm.c:102
+#, c-format
+msgid "Could not attach shared memory: %s\n"
+msgstr ""
+
+#: src/lib/bshm.c:123
+#, c-format
+msgid "Error detaching shared memory: %s\n"
+msgstr ""
+
+#: src/lib/bshm.c:139
+#, c-format
+msgid "Could not destroy shared memory: %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:176 src/lib/bsys.c:192 src/lib/bsys.c:202 src/lib/bsys.c:214
+#, c-format
+msgid "Out of memory: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:256
+msgid "Buffer overflow.\n"
+msgstr ""
+
+#: src/lib/bsys.c:322
+msgid "Bad errno"
+msgstr ""
+
+#: src/lib/bsys.c:339
+msgid "Possible mutex deadlock.\n"
+msgstr ""
+
+#: src/lib/bsys.c:343 src/lib/bsys.c:375
+#, c-format
+msgid "Mutex lock failure. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:346
+msgid "Possible mutex deadlock resolved.\n"
+msgstr ""
+
+#: src/lib/bsys.c:358
+#, c-format
+msgid "Mutex unlock not locked. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:363 src/lib/bsys.c:385
+#, c-format
+msgid "Mutex unlock failure. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:399
+#, c-format
+msgid "Memset for %d bytes at %s:%d\n"
+msgstr ""
+
+#: src/lib/bsys.c:428
+#, c-format
+msgid "Cannot open pid file. %s ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:432
+#, c-format
+msgid ""
+"%s is already running. pid=%d\n"
+"Check file %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:445
+#, c-format
+msgid "Could not open pid file. %s ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:565
+#, c-format
+msgid "Could not create state file. %s ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:584
+#, c-format
+msgid "Write final hdr error: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:611
+#, c-format
+msgid "Could not find specified group: %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:614 src/lib/bsys.c:618
+#, c-format
+msgid "Could not set specified group: %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:627
+#, c-format
+msgid "Could not find specified userid: %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:630
+#, c-format
+msgid "Could not set specified userid: %s\n"
+msgstr ""
+
+#: src/lib/btimers.c:241
+msgid "stop_btimer called with NULL btimer_id\n"
+msgstr ""
+
+#: src/lib/cram-md5.c:76 src/lib/cram-md5.c:101
+msgid "1999 Authorization failed.\n"
+msgstr ""
+
+#: src/lib/daemon.c:53
+#, c-format
+msgid "Cannot fork to become daemon: %s\n"
+msgstr ""
+
+#: src/lib/edit.c:433
+#, c-format
+msgid "Illegal character \"%c\" in name.\n"
+msgstr ""
+
+#: src/lib/edit.c:440
+msgid "Name too long.\n"
+msgstr ""
+
+#: src/lib/events.c:161
+msgid "Events not available"
+msgstr ""
+
+#: src/lib/jcr.c:279
+msgid "NULL jcr.\n"
+msgstr ""
+
+#: src/lib/jcr.c:400
+#, c-format
+msgid "JCR use_count=%d JobId=%d\n"
+msgstr ""
+
+#: src/lib/jcr.c:678
+#, c-format
+msgid ""
+"Watchdog sending kill after %d secs to thread stalled reading Storage "
+"daemon.\n"
+msgstr ""
+
+#: src/lib/jcr.c:690
+#, c-format
+msgid ""
+"Watchdog sending kill after %d secs to thread stalled reading File daemon.\n"
+msgstr ""
+
+#: src/lib/jcr.c:702
+#, c-format
+msgid ""
+"Watchdog sending kill after %d secs to thread stalled reading Director.\n"
+msgstr ""
+
+#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:186
+#, c-format
+msgid "Problem probably begins at line %d.\n"
+msgstr ""
+
+#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:191
+#, c-format
+msgid ""
+"Config error: %s\n"
+"            : line %d, col %d of file %s\n"
+"%s\n"
+"%s"
+msgstr ""
+
+#: src/lib/lex.c:88
+#, c-format
+msgid "Config error: %s\n"
+msgstr ""
+
+#: src/lib/lex.c:108
+msgid "Close of NULL file\n"
+msgstr ""
+
+#: src/lib/lex.c:181
+msgid "get_char: called after EOF\n"
+msgstr ""
+
+#: src/lib/lex.c:220
+#, c-format
+msgid "Config token too long, file: %s, line %d, begins at line %d\n"
+msgstr ""
+
+#: src/lib/lex.c:244
+msgid "none"
+msgstr ""
+
+#: src/lib/lex.c:245
+msgid "comment"
+msgstr ""
+
+#: src/lib/lex.c:246
+msgid "number"
+msgstr ""
+
+#: src/lib/lex.c:247
+msgid "ip_addr"
+msgstr ""
+
+#: src/lib/lex.c:248
+msgid "identifier"
+msgstr ""
+
+#: src/lib/lex.c:249
+msgid "string"
+msgstr ""
+
+#: src/lib/lex.c:250
+msgid "quoted_string"
+msgstr ""
+
+#: src/lib/lex.c:286
+#, c-format
+msgid "expected a positive integer number, got: %s"
+msgstr ""
+
+#: src/lib/lex.c:292
+#, c-format
+msgid "expected a postive integer number, got: %s"
+msgstr ""
+
+#: src/lib/lex.c:504
+#, c-format
+msgid "Cannot open included config file %s: %s\n"
+msgstr ""
+
+#: src/lib/lex.c:539
+#, c-format
+msgid "expected an integer or a range, got %s: %s"
+msgstr ""
+
+#: src/lib/lex.c:553 src/lib/lex.c:561 src/lib/lex.c:572 src/lib/lex.c:580
+#, c-format
+msgid "expected an integer number, got %s: %s"
+msgstr ""
+
+#: src/lib/lex.c:590
+#, c-format
+msgid "expected a name, got %s: %s"
+msgstr ""
+
+#: src/lib/lex.c:594
+#, c-format
+msgid "name %s length %d too long, max is %d\n"
+msgstr ""
+
+#: src/lib/lex.c:602
+#, c-format
+msgid "expected a string, got %s: %s"
+msgstr ""
+
+#: src/lib/mem_pool.c:95
+#, c-format
+msgid "MemPool index %d larger than max %d\n"
+msgstr ""
+
+#: src/lib/mem_pool.c:113 src/lib/mem_pool.c:133 src/lib/mem_pool.c:168
+#: src/lib/mem_pool.c:239 src/lib/mem_pool.c:259 src/lib/mem_pool.c:297
+#: src/lib/mem_pool.c:550
+#, c-format
+msgid "Out of memory requesting %d bytes\n"
+msgstr ""
+
+#: src/lib/message.c:253 src/lib/message.c:263
+#, c-format
+msgid "Could not open console message file %s: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:268
+#, c-format
+msgid "Could not get con mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:372
+#, c-format
+msgid "open mail pipe %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:378
+msgid "Bacula Message"
+msgstr ""
+
+#: src/lib/message.c:431
+msgid "open mail pipe failed.\n"
+msgstr ""
+
+#: src/lib/message.c:443
+#, c-format
+msgid "close error: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:454
+#, c-format
+msgid "Mail prog: %s"
+msgstr ""
+
+#: src/lib/message.c:463
+#, c-format
+msgid ""
+"Mail program terminated in error.\n"
+"CMD=%s\n"
+"ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:650
+#, c-format
+msgid ""
+"Operator mail program terminated in error.\n"
+"CMD=%s\n"
+"ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:667 src/lib/message.c:689 src/lib/message.c:705
+#, c-format
+msgid "fopen %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:933
+#, c-format
+msgid "%s: ABORTING due to ERROR in %s:%d\n"
+msgstr ""
+
+#: src/lib/message.c:937
+#, c-format
+msgid "%s: ERROR TERMINATION at %s:%d\n"
+msgstr ""
+
+#: src/lib/message.c:942
+#, c-format
+msgid "%s: Fatal Error because: "
+msgstr ""
+
+#: src/lib/message.c:944
+#, c-format
+msgid "%s: Fatal Error at %s:%d because:\n"
+msgstr ""
+
+#: src/lib/message.c:948
+#, c-format
+msgid "%s: ERROR: "
+msgstr ""
+
+#: src/lib/message.c:950
+#, c-format
+msgid "%s: ERROR in %s:%d "
+msgstr ""
+
+#: src/lib/message.c:953
+#, c-format
+msgid "%s: Warning: "
+msgstr ""
+
+#: src/lib/message.c:956
+#, c-format
+msgid "%s: Security violation: "
+msgstr ""
+
+#: src/lib/message.c:1032
+#, c-format
+msgid "%s ABORTING due to ERROR\n"
+msgstr ""
+
+#: src/lib/message.c:1035
+#, c-format
+msgid "%s ERROR TERMINATION\n"
+msgstr ""
+
+#: src/lib/message.c:1038
+#, c-format
+msgid "%s: %s Fatal error: "
+msgstr ""
+
+#: src/lib/message.c:1044
+#, c-format
+msgid "%s: %s Error: "
+msgstr ""
+
+#: src/lib/message.c:1050
+#, c-format
+msgid "%s: %s Warning: "
+msgstr ""
+
+#: src/lib/message.c:1053
+#, c-format
+msgid "%s: %s Security violation: "
+msgstr ""
+
+#: src/lib/parse_conf.c:160
+msgid "***UNKNOWN***"
+msgstr ""
+
+#: src/lib/parse_conf.c:179
+#, c-format
+msgid "Unable to initialize resource lock. ERR=%s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:262 src/lib/parse_conf.c:281
+#, c-format
+msgid "expected an =, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:289
+#, c-format
+msgid "Unknown item code: %d\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:328
+#, c-format
+msgid "message type: %s not found"
+msgstr ""
+
+#: src/lib/parse_conf.c:367
+#, c-format
+msgid "Attempt to redefine name \"%s\" to \"%s\"."
+msgstr ""
+
+#: src/lib/parse_conf.c:458
+#, c-format
+msgid "Could not find config Resource %s referenced on line %d : %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:462
+#, c-format
+msgid "Attempt to redefine resource \"%s\" referenced on line %d : %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:497
+#, c-format
+msgid "Too many %s directives. Max. is %d. line %d: %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:507
+#, c-format
+msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:569
+#, c-format
+msgid "Missing config Resource \"%s\" referenced on line %d : %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:633
+#, c-format
+msgid "expected a size number, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:638
+#, c-format
+msgid "expected a size, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:675 src/lib/parse_conf.c:680
+#, c-format
+msgid "expected a time period, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:699
+#, c-format
+msgid "Expect a %s or %s, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:723
+#, c-format
+msgid "Expected a Tape Label keyword, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:772
+#, c-format
+msgid "Cannot open config file \"%s\": %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:785
+#, c-format
+msgid "Expected a Resource name identifier, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:797
+#, c-format
+msgid "expected resource name, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:808
+#, c-format
+msgid "not in resource definition: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:833
+#, c-format
+msgid ""
+"Keyword \"%s\" not permitted in this resource.\n"
+"Perhaps you left the trailing brace off of the previous resource."
+msgstr ""
+
+#: src/lib/parse_conf.c:844
+msgid "Name not specified for resource"
+msgstr ""
+
+#: src/lib/parse_conf.c:853
+#, c-format
+msgid "unexpected token %d %s in resource definition"
+msgstr ""
+
+#: src/lib/parse_conf.c:859
+#, c-format
+msgid "Unknown parser state %d\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:864
+msgid "End of conf file reached with unclosed resource."
+msgstr ""
+
+#: src/lib/pythonlib.c:114
+msgid "Could not initialize Python\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:119
+#, c-format
+msgid "Could not Run Python string %s\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:131
+msgid "Could not initialize Python Job type.\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:136
+#, c-format
+msgid "Could not import Python script %s/%s. Python disabled.\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:239
+msgid "Could not create Python Job Object.\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:252 src/lib/pythonlib.c:276
+#, c-format
+msgid "Python function \"%s\" not found.\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:291
+#, c-format
+msgid "Unknown Python daemon event %s\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:316
+#, c-format
+msgid "Unable to initialize the Python lock. ERR=%s\n"
+msgstr ""
+
+#: src/lib/res.c:66
+#, c-format
+msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
+msgstr ""
+
+#: src/lib/res.c:76
+#, c-format
+msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:284
+msgid "rwl_writeunlock called too many times.\n"
+msgstr ""
+
+#: src/lib/rwlock.c:288
+msgid "rwl_writeunlock by non-owner.\n"
+msgstr ""
+
+#: src/lib/rwlock.c:353 src/lib/semlock.c:248
+#, c-format
+msgid "Write lock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:360 src/lib/semlock.c:255
+#, c-format
+msgid "Write unlock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:370 src/lib/semlock.c:265
+#, c-format
+msgid "Read lock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:377 src/lib/semlock.c:272
+#, c-format
+msgid "Read unlock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:386 src/lib/semlock.c:281
+#, c-format
+msgid "Thread %d found unchanged elements %d times\n"
+msgstr ""
+
+#: src/lib/rwlock.c:418 src/lib/semlock.c:313
+#, c-format
+msgid "Init rwlock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:433 src/lib/semlock.c:328
+#, c-format
+msgid "Create thread failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:444 src/lib/semlock.c:339
+#, c-format
+msgid "Join thread failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:447 src/lib/semlock.c:342
+#, c-format
+msgid "%02d: interval %d, writes %d, reads %d\n"
+msgstr ""
+
+#: src/lib/rwlock.c:457 src/lib/semlock.c:352
+#, c-format
+msgid "data %02d: value %d, %d writes\n"
+msgstr ""
+
+#: src/lib/rwlock.c:462 src/lib/semlock.c:357
+#, c-format
+msgid "Total: %d thread writes, %d data writes\n"
+msgstr ""
+
+#: src/lib/rwlock.c:534 src/lib/semlock.c:429
+msgid "Try write lock"
+msgstr ""
+
+#: src/lib/rwlock.c:540 src/lib/semlock.c:435
+msgid "Try read lock"
+msgstr ""
+
+#: src/lib/rwlock.c:595 src/lib/semlock.c:490
+msgid "Create thread"
+msgstr ""
+
+#: src/lib/rwlock.c:605 src/lib/semlock.c:500
+msgid "Join thread"
+msgstr ""
+
+#: src/lib/rwlock.c:607 src/lib/semlock.c:502
+#, c-format
+msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n"
+msgstr ""
+
+#: src/lib/rwlock.c:619 src/lib/semlock.c:514
+#, c-format
+msgid "data %02d: value %d, %d updates\n"
+msgstr ""
+
+#: src/lib/semlock.c:185
+msgid "sem_unlock by non-owner.\n"
+msgstr ""
+
+#: src/lib/signal.c:61
+msgid "Invalid signal number"
+msgstr ""
+
+#: src/lib/signal.c:87
+#, c-format
+msgid "Bacula interrupted by signal %d: %s\n"
+msgstr ""
+
+#: src/lib/signal.c:100
+#, c-format
+msgid "Kaboom! %s, %s got signal %d. Attempting traceback.\n"
+msgstr ""
+
+#: src/lib/signal.c:102
+#, c-format
+msgid "Kaboom! exepath=%s\n"
+msgstr ""
+
+#: src/lib/signal.c:136
+#, c-format
+msgid "Fork error: ERR=%s\n"
+msgstr ""
+
+#: src/lib/signal.c:143
+#, c-format
+msgid "Calling: %s %s %s\n"
+msgstr ""
+
+#: src/lib/signal.c:145
+#, c-format
+msgid "execv: %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/lib/signal.c:160
+#, c-format
+msgid "Traceback complete, attempting cleanup ...\n"
+msgstr ""
+
+#: src/lib/signal.c:168
+#, c-format
+msgid "It looks like the traceback worked ...\n"
+msgstr ""
+
+#: src/lib/signal.c:197
+#, c-format
+msgid "BA_NSIG too small (%d) should be (%d)\n"
+msgstr ""
+
+#: src/lib/signal.c:203
+msgid "UNKNOWN SIGNAL"
+msgstr ""
+
+#: src/lib/signal.c:204
+msgid "Hangup"
+msgstr ""
+
+#: src/lib/signal.c:205
+msgid "Interrupt"
+msgstr ""
+
+#: src/lib/signal.c:206
+msgid "Quit"
+msgstr ""
+
+#: src/lib/signal.c:207
+msgid "Illegal instruction"
+msgstr ""
+
+#: src/lib/signal.c:208
+msgid "Trace/Breakpoint trap"
+msgstr ""
+
+#: src/lib/signal.c:209
+msgid "Abort"
+msgstr ""
+
+#: src/lib/signal.c:211
+msgid "EMT instruction (Emulation Trap)"
+msgstr ""
+
+#: src/lib/signal.c:214
+msgid "IOT trap"
+msgstr ""
+
+#: src/lib/signal.c:216
+msgid "BUS error"
+msgstr ""
+
+#: src/lib/signal.c:217
+msgid "Floating-point exception"
+msgstr ""
+
+#: src/lib/signal.c:218
+msgid "Kill, unblockable"
+msgstr ""
+
+#: src/lib/signal.c:219
+msgid "User-defined signal 1"
+msgstr ""
+
+#: src/lib/signal.c:220
+msgid "Segmentation violation"
+msgstr ""
+
+#: src/lib/signal.c:221
+msgid "User-defined signal 2"
+msgstr ""
+
+#: src/lib/signal.c:222
+msgid "Broken pipe"
+msgstr ""
+
+#: src/lib/signal.c:223
+msgid "Alarm clock"
+msgstr ""
+
+#: src/lib/signal.c:224
+msgid "Termination"
+msgstr ""
+
+#: src/lib/signal.c:226
+msgid "Stack fault"
+msgstr ""
+
+#: src/lib/signal.c:228
+msgid "Child status has changed"
+msgstr ""
+
+#: src/lib/signal.c:229
+msgid "Continue"
+msgstr ""
+
+#: src/lib/signal.c:230
+msgid "Stop, unblockable"
+msgstr ""
+
+#: src/lib/signal.c:231
+msgid "Keyboard stop"
+msgstr ""
+
+#: src/lib/signal.c:232
+msgid "Background read from tty"
+msgstr ""
+
+#: src/lib/signal.c:233
+msgid "Background write to tty"
+msgstr ""
+
+#: src/lib/signal.c:234
+msgid "Urgent condition on socket"
+msgstr ""
+
+#: src/lib/signal.c:235
+msgid "CPU limit exceeded"
+msgstr ""
+
+#: src/lib/signal.c:236
+msgid "File size limit exceeded"
+msgstr ""
+
+#: src/lib/signal.c:237
+msgid "Virtual alarm clock"
+msgstr ""
+
+#: src/lib/signal.c:238
+msgid "Profiling alarm clock"
+msgstr ""
+
+#: src/lib/signal.c:239
+msgid "Window size change"
+msgstr ""
+
+#: src/lib/signal.c:240
+msgid "I/O now possible"
+msgstr ""
+
+#: src/lib/signal.c:242
+msgid "Power failure restart"
+msgstr ""
+
+#: src/lib/signal.c:245
+msgid "No runnable lwp"
+msgstr ""
+
+#: src/lib/signal.c:248
+msgid "SIGLWP special signal used by thread library"
+msgstr ""
+
+#: src/lib/signal.c:251
+msgid "Checkpoint Freeze"
+msgstr ""
+
+#: src/lib/signal.c:254
+msgid "Checkpoint Thaw"
+msgstr ""
+
+#: src/lib/signal.c:257
+msgid "Thread Cancellation"
+msgstr ""
+
+#: src/lib/signal.c:260
+msgid "Resource Lost (e.g. record-lock lost)"
+msgstr ""
+
+#: src/lib/smartall.c:132 src/lib/smartall.c:225 src/lib/smartall.c:240
+msgid "Out of memory\n"
+msgstr ""
+
+#: src/lib/smartall.c:160
+#, c-format
+msgid "Attempt to free NULL called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:176
+#, c-format
+msgid "qp->qnext->qprev != qp called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:180
+#, c-format
+msgid "qp->qprev->qnext != qp called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:189
+#, c-format
+msgid "Buffer overrun called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:262
+#, c-format
+msgid "sm_realloc size: %d\n"
+msgstr ""
+
+#: src/lib/smartall.c:303
+#, c-format
+msgid "sm_realloc %d at %x from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:365
+#, c-format
+msgid ""
+"\n"
+"Orphaned buffers exist.  Dump terminated following\n"
+"  discovery of bad links in chain of orphaned buffers.\n"
+"  Buffer address with bad links: %lx\n"
+msgstr ""
+
+#: src/lib/smartall.c:376
+#, c-format
+msgid "Orphaned buffer:  %6u bytes allocated at line %d of %s %s\n"
+msgstr ""
+
+#: src/lib/smartall.c:412
+#, c-format
+msgid "Damaged buffer found. Called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:442
+#, c-format
+msgid ""
+"\n"
+"Damaged buffers found at %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:445
+#, c-format
+msgid "  discovery of bad prev link.\n"
+msgstr ""
+
+#: src/lib/smartall.c:448
+#, c-format
+msgid "  discovery of bad next link.\n"
+msgstr ""
+
+#: src/lib/smartall.c:451
+#, c-format
+msgid "  discovery of data overrun.\n"
+msgstr ""
+
+#: src/lib/smartall.c:454
+#, c-format
+msgid "  Buffer address: %lx\n"
+msgstr ""
+
+#: src/lib/smartall.c:461
+#, c-format
+msgid "Damaged buffer:  %6u bytes allocated at line %d of %s %s\n"
+msgstr ""
+
+#: src/lib/util.c:181
+msgid "Running"
+msgstr ""
+
+#: src/lib/util.c:184
+msgid "Blocked"
+msgstr ""
+
+#: src/lib/util.c:194
+msgid "Non-fatal error"
+msgstr ""
+
+#: src/lib/util.c:197 src/lib/util.c:264
+msgid "Canceled"
+msgstr ""
+
+#: src/lib/util.c:200
+msgid "Verify differences"
+msgstr ""
+
+#: src/lib/util.c:203
+msgid "Waiting on FD"
+msgstr ""
+
+#: src/lib/util.c:206
+msgid "Wait on SD"
+msgstr ""
+
+#: src/lib/util.c:209
+msgid "Wait for new Volume"
+msgstr ""
+
+#: src/lib/util.c:212
+msgid "Waiting for mount"
+msgstr ""
+
+#: src/lib/util.c:215
+msgid "Waiting for Storage resource"
+msgstr ""
+
+#: src/lib/util.c:218
+msgid "Waiting for Job resource"
+msgstr ""
+
+#: src/lib/util.c:221
+msgid "Waiting for Client resource"
+msgstr ""
+
+#: src/lib/util.c:224
+msgid "Waiting on Max Jobs"
+msgstr ""
+
+#: src/lib/util.c:227
+msgid "Waiting for Start Time"
+msgstr ""
+
+#: src/lib/util.c:230
+msgid "Waiting on Priority"
+msgstr ""
+
+#: src/lib/util.c:237
+#, c-format
+msgid "Unknown Job termination status=%d"
+msgstr ""
+
+#: src/lib/util.c:261
+msgid "Fatal Error"
+msgstr ""
+
+#: src/lib/util.c:267
+msgid "Differences"
+msgstr ""
+
+#: src/lib/util.c:270
+msgid "Unknown term code"
+msgstr ""
+
+#: src/lib/util.c:298
+msgid "Migrate"
+msgstr ""
+
+#: src/lib/util.c:301
+msgid "Copy"
+msgstr ""
+
+#: src/lib/util.c:304
+msgid "Unknown Type"
+msgstr ""
+
+#: src/lib/util.c:336
+msgid "Verify Init Catalog"
+msgstr ""
+
+#: src/lib/util.c:345
+msgid "Verify Data"
+msgstr ""
+
+#: src/lib/util.c:647
+msgid "Working directory not defined. Cannot continue.\n"
+msgstr ""
+
+#: src/lib/util.c:650
+#, c-format
+msgid "Working Directory: \"%s\" not found. Cannot continue.\n"
+msgstr ""
+
+#: src/lib/util.c:654
+#, c-format
+msgid "Working Directory: \"%s\" is not a directory. Cannot continue.\n"
+msgstr ""
+
+#: src/lib/var.c:2659
+msgid "everything ok"
+msgstr ""
+
+#: src/lib/var.c:2660
+msgid "incomplete named character"
+msgstr ""
+
+#: src/lib/var.c:2661
+msgid "incomplete hexadecimal value"
+msgstr ""
+
+#: src/lib/var.c:2662
+msgid "invalid hexadecimal value"
+msgstr ""
+
+#: src/lib/var.c:2663
+msgid "octal value too large"
+msgstr ""
+
+#: src/lib/var.c:2664
+msgid "invalid octal value"
+msgstr ""
+
+#: src/lib/var.c:2665
+msgid "incomplete octal value"
+msgstr ""
+
+#: src/lib/var.c:2666
+msgid "incomplete grouped hexadecimal value"
+msgstr ""
+
+#: src/lib/var.c:2667
+msgid "incorrect character class specification"
+msgstr ""
+
+#: src/lib/var.c:2668
+msgid "invalid expansion configuration"
+msgstr ""
+
+#: src/lib/var.c:2669
+msgid "out of memory"
+msgstr ""
+
+#: src/lib/var.c:2670
+msgid "incomplete variable specification"
+msgstr ""
+
+#: src/lib/var.c:2671
+msgid "undefined variable"
+msgstr ""
+
+#: src/lib/var.c:2672
+msgid "input is neither text nor variable"
+msgstr ""
+
+#: src/lib/var.c:2673
+msgid "unknown command character in variable"
+msgstr ""
+
+#: src/lib/var.c:2674
+msgid "malformatted search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2675
+msgid "unknown flag in search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2676
+msgid "invalid regex in search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2677
+msgid "missing parameter in command"
+msgstr ""
+
+#: src/lib/var.c:2678
+msgid "empty search string in search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2679
+msgid "start offset missing in cut operation"
+msgstr ""
+
+#: src/lib/var.c:2680
+msgid "offsets in cut operation delimited by unknown character"
+msgstr ""
+
+#: src/lib/var.c:2681
+msgid "range out of bounds in cut operation"
+msgstr ""
+
+#: src/lib/var.c:2682
+msgid "offset out of bounds in cut operation"
+msgstr ""
+
+#: src/lib/var.c:2683
+msgid "logic error in cut operation"
+msgstr ""
+
+#: src/lib/var.c:2684
+msgid "malformatted transpose operation"
+msgstr ""
+
+#: src/lib/var.c:2685
+msgid "source and target class mismatch in transpose operation"
+msgstr ""
+
+#: src/lib/var.c:2686
+msgid "empty character class in transpose operation"
+msgstr ""
+
+#: src/lib/var.c:2687
+msgid "incorrect character class in transpose operation"
+msgstr ""
+
+#: src/lib/var.c:2688
+msgid "malformatted padding operation"
+msgstr ""
+
+#: src/lib/var.c:2689
+msgid "width parameter missing in padding operation"
+msgstr ""
+
+#: src/lib/var.c:2690
+msgid "fill string missing in padding operation"
+msgstr ""
+
+#: src/lib/var.c:2691
+msgid "unknown quoted pair in search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2692
+msgid "sub-matching reference out of range"
+msgstr ""
+
+#: src/lib/var.c:2693
+msgid "invalid argument"
+msgstr ""
+
+#: src/lib/var.c:2694
+msgid "incomplete quoted pair"
+msgstr ""
+
+#: src/lib/var.c:2695
+msgid "lookup function does not support variable arrays"
+msgstr ""
+
+#: src/lib/var.c:2696
+msgid "index of array variable contains an invalid character"
+msgstr ""
+
+#: src/lib/var.c:2697
+msgid "index of array variable is incomplete"
+msgstr ""
+
+#: src/lib/var.c:2698
+msgid "bracket expression in array variable's index not closed"
+msgstr ""
+
+#: src/lib/var.c:2699
+msgid "division by zero error in index specification"
+msgstr ""
+
+#: src/lib/var.c:2700
+msgid "unterminated loop construct"
+msgstr ""
+
+#: src/lib/var.c:2701
+msgid "invalid character in loop limits"
+msgstr ""
+
+#: src/lib/var.c:2702
+msgid "malformed operation argument list"
+msgstr ""
+
+#: src/lib/var.c:2703
+msgid "undefined operation"
+msgstr ""
+
+#: src/lib/var.c:2704
+msgid "formatting failure"
+msgstr ""
+
+#: src/lib/var.c:2713
+msgid "unknown error"
+msgstr ""
+
+#: src/lib/watchdog.c:69
+#, c-format
+msgid "Unable to initialize watchdog lock. ERR=%s\n"
+msgstr ""
+
+#: src/lib/watchdog.c:165
+msgid "BUG! register_watchdog called before start_watchdog\n"
+msgstr ""
+
+#: src/lib/watchdog.c:168
+#, c-format
+msgid "BUG! Watchdog %p has NULL callback\n"
+msgstr ""
+
+#: src/lib/watchdog.c:171
+#, c-format
+msgid "BUG! Watchdog %p has zero interval\n"
+msgstr ""
+
+#: src/lib/watchdog.c:191
+msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n"
+msgstr ""
+
+#: src/lib/watchdog.c:309
+#, c-format
+msgid "rwl_writelock failure. ERR=%s\n"
+msgstr ""
+
+#: src/lib/watchdog.c:323
+#, c-format
+msgid "rwl_writeunlock failure. ERR=%s\n"
+msgstr ""
+
+#: src/stored/acquire.c:52
+#, c-format
+msgid "Num_writers=%d not zero. Job %d canceled.\n"
+msgstr ""
+
+#: src/stored/acquire.c:60
+#, c-format
+msgid "No volumes specified. Job %d canceled.\n"
+msgstr ""
+
+#: src/stored/acquire.c:92 src/stored/mount.c:73
+#, c-format
+msgid "Job %d canceled.\n"
+msgstr ""
+
+#: src/stored/acquire.c:103
+#, c-format
+msgid "Read open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
+msgstr ""
+
+#: src/stored/acquire.c:108
+#, c-format
+msgid "Read open device %s Volume \"%s\" failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/acquire.c:179 src/stored/mount.c:67
+#, c-format
+msgid "Too many errors trying to mount device %s.\n"
+msgstr ""
+
+#: src/stored/acquire.c:188
+#, c-format
+msgid "Ready to read from volume \"%s\" on device %s.\n"
+msgstr ""
+
+#: src/stored/acquire.c:232
+#, c-format
+msgid "Device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/acquire.c:262
+#, c-format
+msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
+msgstr ""
+
+#: src/stored/acquire.c:281
+#, c-format
+msgid ""
+"Cannot recycle volume \"%s\" on device %s because it is in use by another "
+"job.\n"
+msgstr ""
+
+#: src/stored/acquire.c:303
+#, c-format
+msgid "Could not ready device %s for append.\n"
+msgstr ""
+
+#: src/stored/acquire.c:380 src/stored/block.c:354 src/stored/block.c:682
+#: src/stored/block.c:751
+#, c-format
+msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
+msgstr ""
+
+#: src/stored/acquire.c:422
+#, c-format
+msgid "Alert: %s"
+msgstr ""
+
+#: src/stored/acquire.c:430
+#, c-format
+msgid "3997 Bad alert command: %s: ERR=%s.\n"
+msgstr ""
+
+#: src/stored/acquire.c:518
+#, c-format
+msgid "Hey! num_writers=%d!!!!\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:83
+#, c-format
+msgid "Read error on device %s in ANSI label. ERR=%s\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:93
+msgid "Insane! End of tape while reading ANSI label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:117
+msgid "No VOL1 label while reading ANSI/IBM label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:137
+#, c-format
+msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:148
+msgid "No HDR1 label while reading ANSI label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:154
+#, c-format
+msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:165
+msgid "No HDR2 label while reading ANSI/IBM label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:179
+msgid "Unknown or bad ANSI/IBM label record.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:186
+msgid "Too many records in while reading ANSI/IBM label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:285
+#, c-format
+msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:302
+#, c-format
+msgid "Could not write ANSI VOL1 label. ERR=%s\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
+#, c-format
+msgid "Could not write ANSI HDR1 label. ERR=%s\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
+msgid "Could not write ANSI HDR1 label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:381
+#, c-format
+msgid "Error writing EOF to tape. ERR=%s"
+msgstr ""
+
+#: src/stored/ansi_label.c:386
+msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
+msgstr ""
+
+#: src/stored/append.c:49
+msgid "DCR is NULL!!!\n"
+msgstr ""
+
+#: src/stored/append.c:54
+msgid "DEVICE is NULL!!!\n"
+msgstr ""
+
+#: src/stored/append.c:66
+msgid "Unable to set network buffer size.\n"
+msgstr ""
+
+#: src/stored/append.c:79 src/stored/append.c:88 src/stored/append.c:100
+#: src/stored/append.c:256 src/stored/append.c:271 src/stored/append.c:283
+#: src/stored/askdir.c:291 src/stored/askdir.c:292
+msgid "NULL Volume name. This shouldn't happen!!!\n"
+msgstr ""
+
+#: src/stored/append.c:94 src/stored/btape.c:1854
+#, c-format
+msgid "Write session label failed. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:106
+#, c-format
+msgid "Network send error to FD. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:143
+#, c-format
+msgid "Error reading data header from FD. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:165
+#, c-format
+msgid "Malformed data header from FD: %s\n"
+msgstr ""
+
+#: src/stored/append.c:175
+msgid "File index from FD not positive or sequential\n"
+msgstr ""
+
+#: src/stored/append.c:206 src/stored/append.c:276 src/stored/spool.c:248
+#, c-format
+msgid "Fatal append error on device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:231
+#, c-format
+msgid "Error updating file attributes. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:244
+#, c-format
+msgid "Network error on data channel. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:265 src/stored/btape.c:1976
+#, c-format
+msgid "Error writting end session label. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:278
+msgid "Set ok=FALSE after write_block_to_device.\n"
+msgstr ""
+
+#: src/stored/askdir.c:161
+msgid "Network error on bnet_recv in req_vol_info.\n"
+msgstr ""
+
+#: src/stored/askdir.c:178
+#, c-format
+msgid "Error getting Volume info: %s"
+msgstr ""
+
+#: src/stored/askdir.c:296 src/stored/askdir.c:297
+msgid "Attempt to update_volume_info in read mode!!!\n"
+msgstr ""
+
+#: src/stored/askdir.c:325
+#, c-format
+msgid "Didn't get vol info vol=%s: ERR=%s"
+msgstr ""
+
+#: src/stored/askdir.c:356
+#, c-format
+msgid "Error creating JobMedia record: ERR=%s\n"
+msgstr ""
+
+#: src/stored/askdir.c:363
+#, c-format
+msgid "Error creating JobMedia record: %s\n"
+msgstr ""
+
+#: src/stored/askdir.c:429
+#, c-format
+msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n"
+msgstr ""
+
+#: src/stored/askdir.c:442
+#, c-format
+msgid ""
+"Job %s waiting. Cannot find any appendable volumes.\n"
+"Please use the \"label\"  command to create a new Volume for:\n"
+"    Storage:      %s\n"
+"    Media type:   %s\n"
+"    Pool:         %s\n"
+msgstr ""
+
+#: src/stored/askdir.c:466 src/stored/askdir.c:548
+#, c-format
+msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n"
+msgstr ""
+
+#: src/stored/askdir.c:476
+msgid "pthread error in mount_next_volume.\n"
+msgstr ""
+
+#: src/stored/askdir.c:508
+msgid "Cannot request another volume: no volume name given.\n"
+msgstr ""
+
+#: src/stored/askdir.c:514
+#, c-format
+msgid "Job %s canceled while waiting for mount on Storage Device %s.\n"
+msgstr ""
+
+#: src/stored/askdir.c:529
+#, c-format
+msgid "Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
+msgstr ""
+
+#: src/stored/askdir.c:558
+msgid "pthread error in mount_volume\n"
+msgstr ""
+
+#: src/stored/authenticate.c:53
+#, c-format
+msgid "I only authenticate Directors, not %d\n"
+msgstr ""
+
+#: src/stored/authenticate.c:120
+msgid ""
+"Incorrect password given by Director.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/stored/authenticate.c:178
+#, c-format
+msgid "Unable to authenticate Director at %s.\n"
+msgstr ""
+
+#: src/stored/authenticate.c:223 src/stored/authenticate.c:259
+#, c-format
+msgid ""
+"Incorrect authorization key from File daemon at %s rejected.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:53
+#, c-format
+msgid "No Changer Name given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:59
+#, c-format
+msgid "No Changer Command given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:72
+#, c-format
+msgid ""
+"Media Type not the same for all devices in changer %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:152
+#, c-format
+msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:161
+#, c-format
+msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:167
+#, c-format
+msgid "3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:208
+msgid "3992 Missing Changer command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:218
+#, c-format
+msgid "3301 Issuing autochanger \"loaded drive %d\" command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:227
+#, c-format
+msgid "3302 Autochanger \"loaded drive %d\", result is Slot %d.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:231
+#, c-format
+msgid "3302 Autochanger \"loaded drive %d\", result: nothing loaded.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:238
+#, c-format
+msgid "3991 Bad autochanger \"loaded drive %d\" command: ERR=%s.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:297 src/stored/autochanger.c:380
+#, c-format
+msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:310 src/stored/autochanger.c:401
+#, c-format
+msgid "3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:369
+#, c-format
+msgid "Volume %s is in use by device %s\n"
+msgstr ""
+
+#: src/stored/autochanger.c:439
+#, c-format
+msgid "3993 Device %s not an autochanger device.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:464
+#, c-format
+msgid "3306 Issuing autochanger \"%s\" command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:467
+msgid "3996 Open bpipe failed.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:494
+#, c-format
+msgid "Autochanger error: ERR=%s\n"
+msgstr ""
+
+#: src/stored/bcopy.c:58
+#, c-format
+msgid ""
+"Copyright (C) 2002-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: bcopy [-d debug_level] <input-archive> <output-archive>\n"
+"       -b bootstrap      specify a bootstrap file\n"
+"       -c <file>         specify configuration file\n"
+"       -d <nn>           set debug level to nn\n"
+"       -i                specify input Volume names (separated by |)\n"
+"       -o                specify output Volume names (separated by |)\n"
+"       -p                proceed inspite of errors\n"
+"       -v                verbose\n"
+"       -w <dir>          specify working directory (default /tmp)\n"
+"       -?                print this message\n"
+"\n"
+msgstr ""
+
+#: src/stored/bcopy.c:137 src/stored/bextract.c:177 src/stored/bscan.c:221
+msgid "Wrong number of arguments: \n"
+msgstr ""
+
+#: src/stored/bcopy.c:172 src/stored/btape.c:333 src/stored/device.c:266
+#, c-format
+msgid "dev open failed: %s\n"
+msgstr ""
+
+#: src/stored/bcopy.c:185
+msgid "Write of last block failed.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:188
+#, c-format
+msgid "%u Jobs copied. %u records copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:205 src/stored/bscan.c:390
+#, c-format
+msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n"
+msgstr ""
+
+#: src/stored/bcopy.c:220
+msgid "Volume is prelabeled. This volume cannot be copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:223
+msgid "Volume label not copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:235 src/stored/bcopy.c:242 src/stored/bcopy.c:265
+#: src/stored/btape.c:2342
+#, c-format
+msgid "Cannot fixup device error. %s\n"
+msgstr ""
+
+#: src/stored/bcopy.c:247
+msgid "EOM label not copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:250
+msgid "EOT label not copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:287 src/stored/bextract.c:476 src/stored/bls.c:440
+#: src/stored/bscan.c:1231 src/stored/btape.c:2690
+#, c-format
+msgid "Mount Volume \"%s\" on device %s and press return when ready: "
+msgstr ""
+
+#: src/stored/bextract.c:70
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: bextract <options> <bacula-archive-device-name> <directory-to-store-"
+"files>\n"
+"       -b <file>       specify a bootstrap file\n"
+"       -c <file>       specify a configuration file\n"
+"       -d <nn>         set debug level to nn\n"
+"       -e <file>       exclude list\n"
+"       -i <file>       include list\n"
+"       -p              proceed inspite of I/O errors\n"
+"       -v              verbose\n"
+"       -V <volumes>    specify Volume names (separated by |)\n"
+"       -?              print this message\n"
+"\n"
+msgstr ""
+
+#: src/stored/bextract.c:127 src/stored/bls.c:128
+#, c-format
+msgid "Could not open exclude file: %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/bextract.c:142 src/stored/bls.c:142
+#, c-format
+msgid "Could not open include file: %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/bextract.c:198
+#, c-format
+msgid "%d Program Name and/or Program Data Stream records ignored.\n"
+msgstr ""
+
+#: src/stored/bextract.c:202
+#, c-format
+msgid "%d Win32 data or Win32 gzip data stream records. Ignored.\n"
+msgstr ""
+
+#: src/stored/bextract.c:226
+#, c-format
+msgid "Cannot stat %s. It must exist. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bextract.c:230
+#, c-format
+msgid "%s must be a directory.\n"
+msgstr ""
+
+#: src/stored/bextract.c:251
+#, c-format
+msgid "%u files restored.\n"
+msgstr ""
+
+#: src/stored/bextract.c:278 src/stored/bextract.c:450
+msgid "Logic error output file should be open but is not.\n"
+msgstr ""
+
+#: src/stored/bextract.c:285 src/stored/bls.c:364 src/stored/bscan.c:647
+msgid "Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bextract.c:347
+#, c-format
+msgid "Seek error on %s: %s\n"
+msgstr ""
+
+#: src/stored/bextract.c:400
+#, c-format
+msgid "Uncompression error. ERR=%d\n"
+msgstr ""
+
+#: src/stored/bextract.c:408
+msgid "===Write error===\n"
+msgstr ""
+
+#: src/stored/bextract.c:441
+msgid "Got Program Name or Data Stream. Ignored.\n"
+msgstr ""
+
+#: src/stored/block.c:79
+#, c-format
+msgid ""
+"Dump block %s %x: size=%d BlkNum=%d\n"
+"               Hdrcksum=%x cksum=%x\n"
+msgstr ""
+
+#: src/stored/block.c:92
+#, c-format
+msgid "   Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n"
+msgstr ""
+
+#: src/stored/block.c:148
+#, c-format
+msgid "%d block read errors not printed.\n"
+msgstr ""
+
+#: src/stored/block.c:236 src/stored/block.c:252 src/stored/block.c:262
+#, c-format
+msgid ""
+"Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer "
+"discarded.\n"
+msgstr ""
+
+#: src/stored/block.c:276
+#, c-format
+msgid ""
+"Volume data error at %u:%u! Block length %u is insane (too large), probably "
+"due to a bad archive.\n"
+msgstr ""
+
+#: src/stored/block.c:302
+#, c-format
+msgid ""
+"Volume data error at %u:%u!\n"
+"Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n"
+msgstr ""
+
+#: src/stored/block.c:410
+msgid "Cannot write block. Device at EOM.\n"
+msgstr ""
+
+#: src/stored/block.c:415
+msgid "Attempt to write on read-only Volume.\n"
+msgstr ""
+
+#: src/stored/block.c:467
+#, c-format
+msgid "User defined maximum volume capacity %s exceeded on device %s.\n"
+msgstr ""
+
+#: src/stored/block.c:482
+#, c-format
+msgid "Unable to write EOF. ERR=%s\n"
+msgstr ""
+
+#: src/stored/block.c:508 src/stored/block.c:519
+msgid "Write block header zeroed.\n"
+msgstr ""
+
+#: src/stored/block.c:537
+#, c-format
+msgid "Write error at %u:%u on device %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/block.c:544
+#, c-format
+msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"
+msgstr ""
+
+#: src/stored/block.c:619 src/stored/block.c:625
+#, c-format
+msgid "Backspace file at EOT failed. ERR=%s\n"
+msgstr ""
+
+#: src/stored/block.c:632
+#, c-format
+msgid "Backspace record at EOT failed. ERR=%s\n"
+msgstr ""
+
+#: src/stored/block.c:649
+#, c-format
+msgid "Re-read last block at EOT failed. ERR=%s"
+msgstr ""
+
+#: src/stored/block.c:659
+#, c-format
+msgid ""
+"Re-read of last block OK, but block numbers differ. Last block=%u Current "
+"block=%u.\n"
+msgstr ""
+
+#: src/stored/block.c:662
+msgid "Re-read of last block succeeded.\n"
+msgstr ""
+
+#: src/stored/block.c:690
+#, c-format
+msgid ""
+"Error writing final EOF to tape. This Volume may not be readable.\n"
+"%s"
+msgstr ""
+
+#: src/stored/block.c:800 src/stored/dvd.c:689
+#, c-format
+msgid ""
+"Error while writing, current part number is less than the total number of "
+"parts (%d/%d, device=%s)\n"
+msgstr ""
+
+#: src/stored/block.c:808 src/stored/block.c:918
+#, c-format
+msgid "Unable to open device next part %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/block.c:826
+#, c-format
+msgid ""
+"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
+"free_space_errno=%d, errmsg=%s).\n"
+msgstr ""
+
+#: src/stored/block.c:839
+#, c-format
+msgid ""
+"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
+"free_space_errno=%d).\n"
+msgstr ""
+
+#: src/stored/block.c:893
+#, c-format
+msgid "Block buffer size looping problem on device %s\n"
+msgstr ""
+
+#: src/stored/block.c:944
+#, c-format
+msgid "Read error at file:blk %u:%u on device %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/block.c:957
+#, c-format
+msgid "Read zero bytes at %u:%u on device %s.\n"
+msgstr ""
+
+#: src/stored/block.c:970
+#, c-format
+msgid ""
+"Volume data error at %u:%u! Very short block of %d bytes on device %s "
+"discarded.\n"
+msgstr ""
+
+#: src/stored/block.c:995
+#, c-format
+msgid "Block length %u is greater than buffer %u. Attempting recovery.\n"
+msgstr ""
+
+#: src/stored/block.c:1014
+#, c-format
+msgid "Setting block buffer size to %u bytes.\n"
+msgstr ""
+
+#: src/stored/block.c:1029
+#, c-format
+msgid ""
+"Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n"
+msgstr ""
+
+#: src/stored/bls.c:68
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %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"
+"       -e <file>       exclude list\n"
+"       -i <file>       include list\n"
+"       -j              list jobs\n"
+"       -k              list blocks\n"
+"    (no j or k option) list saved files\n"
+"       -L              dump label\n"
+"       -p              proceed inspite of errors\n"
+"       -v              be verbose\n"
+"       -V              specify Volume names (separated by |)\n"
+"       -?              print this message\n"
+"\n"
+msgstr ""
+
+#: src/stored/bls.c:189
+msgid "No archive name specified\n"
+msgstr ""
+
+#: src/stored/bls.c:224
+#, c-format
+msgid ""
+"\n"
+"Warning, this Volume is a continuation of Volume %s\n"
+msgstr ""
+
+#: src/stored/bls.c:267
+#, c-format
+msgid "Got EOM at file %u on device %s, Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/bls.c:278
+#, c-format
+msgid "Mounted Volume \"%s\".\n"
+msgstr ""
+
+#: src/stored/bls.c:280
+#, c-format
+msgid "End of file %u on device %s, Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/bls.c:304
+#, c-format
+msgid ""
+"File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
+"s rlen=%d\n"
+msgstr ""
+
+#: src/stored/bls.c:313
+#, c-format
+msgid "Block: %d size=%d\n"
+msgstr ""
+
+#: src/stored/bls.c:380
+#, c-format
+msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n"
+msgstr ""
+
+#: src/stored/bls.c:397 src/stored/read_record.c:322
+msgid "Fresh Volume Label"
+msgstr ""
+
+#: src/stored/bls.c:400 src/stored/read_record.c:325
+msgid "Volume Label"
+msgstr ""
+
+#: src/stored/bls.c:404 src/stored/label.c:969
+msgid "Begin Job Session"
+msgstr ""
+
+#: src/stored/bls.c:408 src/stored/label.c:972
+msgid "End Job Session"
+msgstr ""
+
+#: src/stored/bls.c:411
+msgid "End of Medium"
+msgstr ""
+
+#: src/stored/bls.c:414 src/stored/label.c:981
+msgid "Unknown"
+msgstr ""
+
+#: src/stored/bls.c:420 src/stored/read_record.c:343
+#, c-format
+msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n"
+msgstr ""
+
+#: src/stored/bscan.c:109
+#, c-format
+msgid ""
+"Copyright (C) 2001-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: bscan [ options ] <bacula-archive>\n"
+"       -b bootstrap      specify a bootstrap file\n"
+"       -c <file>         specify configuration file\n"
+"       -d <nn>           set debug level to nn\n"
+"       -m                update media info in database\n"
+"       -n <name>         specify the database name (default bacula)\n"
+"       -u <user>         specify database user name (default bacula)\n"
+"       -P <password      specify database password (default none)\n"
+"       -h <host>         specify database host (default NULL)\n"
+"       -p                proceed inspite of I/O errors\n"
+"       -r                list records\n"
+"       -s                synchronize or store in database\n"
+"       -S                show scan progress periodically\n"
+"       -v                verbose\n"
+"       -V <Volumes>      specify Volume names (separated by |)\n"
+"       -w <dir>          specify working directory (default from conf file)\n"
+"       -?                print this message\n"
+"\n"
+msgstr ""
+
+#: src/stored/bscan.c:234 src/stored/stored.c:267
+#, c-format
+msgid "No Storage resource defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bscan.c:242 src/stored/stored.c:298
+#, c-format
+msgid "No Working Directory defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bscan.c:250
+#, c-format
+msgid "Working Directory: %s not found. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bscan.c:254
+#, c-format
+msgid "Working Directory: %s is not a directory. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bscan.c:268 src/stored/bscan.c:341
+#, c-format
+msgid "First Volume Size = %sn"
+msgstr ""
+
+#: src/stored/bscan.c:274
+msgid "Could not init Bacula database\n"
+msgstr ""
+
+#: src/stored/bscan.c:281
+#, c-format
+msgid "Using Database: %s, User: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:315
+#, c-format
+msgid "Create JobMedia for Job %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:326
+#, c-format
+msgid "Could not create JobMedia record for Volume=%s Job=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:382
+#, c-format
+msgid "done: %d%%\n"
+msgstr ""
+
+#: src/stored/bscan.c:406
+msgid "Volume is prelabeled. This tape cannot be scanned.\n"
+msgstr ""
+
+#: src/stored/bscan.c:418
+#, c-format
+msgid "Pool record for %s found in DB.\n"
+msgstr ""
+
+#: src/stored/bscan.c:422
+#, c-format
+msgid "VOL_LABEL: Pool record not found for Pool: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:428
+#, c-format
+msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:432
+#, c-format
+msgid "Pool type \"%s\" is OK.\n"
+msgstr ""
+
+#: src/stored/bscan.c:442
+#, c-format
+msgid "Media record for %s found in DB.\n"
+msgstr ""
+
+#: src/stored/bscan.c:449
+#, c-format
+msgid "VOL_LABEL: Media record not found for Volume: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:456
+#, c-format
+msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:460
+#, c-format
+msgid "Media type \"%s\" is OK.\n"
+msgstr ""
+
+#: src/stored/bscan.c:469
+#, c-format
+msgid "VOL_LABEL: OK for Volume: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:476
+#, c-format
+msgid "%d \"errors\" ignored before first Start of Session record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:487
+#, c-format
+msgid "SOS_LABEL: Found Job record for JobId: %d\n"
+msgstr ""
+
+#: src/stored/bscan.c:492
+#, c-format
+msgid "SOS_LABEL: Job record not found for JobId: %d\n"
+msgstr ""
+
+#: src/stored/bscan.c:532
+#, c-format
+msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n"
+msgstr ""
+
+#: src/stored/bscan.c:538
+#, c-format
+msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n"
+msgstr ""
+
+#: src/stored/bscan.c:544
+#, c-format
+msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n"
+msgstr ""
+
+#: src/stored/bscan.c:562 src/stored/bscan.c:1013
+#, c-format
+msgid "Could not find SessId=%d SessTime=%d for EOS record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:606
+#, c-format
+msgid "Could not update job record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:617
+#, c-format
+msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:629
+#, c-format
+msgid "Could not find Job for SessId=%d SessTime=%d record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:665
+#, c-format
+msgid "%s file records. At file:blk=%s:%s bytes=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:708
+#, c-format
+msgid "Got MD5 record: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:717
+#, c-format
+msgid "Got SHA1 record: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:725
+#, c-format
+msgid "Got Prog Names Stream: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:731
+msgid "Got Prog Data Stream record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:735
+#, c-format
+msgid "Unknown stream type!!! stream=%d data=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:799
+#, c-format
+msgid "Could not create File Attributes record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:805
+#, c-format
+msgid "Created File record: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:842
+#, c-format
+msgid "Could not create media record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:846 src/stored/bscan.c:867
+#, c-format
+msgid "Could not update media record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:850
+#, c-format
+msgid "Created Media record for Volume: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:871
+#, c-format
+msgid "Updated Media record at end of Volume: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:888
+#, c-format
+msgid "Could not create pool record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:892
+#, c-format
+msgid "Created Pool record for Pool: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:912
+#, c-format
+msgid "Created Client record for Client: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:929
+#, c-format
+msgid "Fileset \"%s\" already exists.\n"
+msgstr ""
+
+#: src/stored/bscan.c:933
+#, c-format
+msgid "Could not create FileSet record \"%s\". ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:938
+#, c-format
+msgid "Created FileSet record \"%s\"\n"
+msgstr ""
+
+#: src/stored/bscan.c:985
+#, c-format
+msgid "Could not create JobId record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:991
+#, c-format
+msgid "Could not update job start record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:994
+#, c-format
+msgid "Created new JobId=%u record for original JobId=%u\n"
+msgstr ""
+
+#: src/stored/bscan.c:1044
+#, c-format
+msgid "Could not update JobId=%u record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:1049
+#, c-format
+msgid "Updated Job termination record for JobId=%u TermStat=%c\n"
+msgstr ""
+
+#: src/stored/bscan.c:1071
+#, c-format
+msgid "Job Termination code: %d"
+msgstr ""
+
+#: src/stored/bscan.c:1076
+#, c-format
+msgid ""
+"%s\n"
+"JobId:                  %d\n"
+"Job:                    %s\n"
+"FileSet:                %s\n"
+"Backup Level:           %s\n"
+"Client:                 %s\n"
+"Start time:             %s\n"
+"End time:               %s\n"
+"Files Written:          %s\n"
+"Bytes Written:          %s\n"
+"Volume Session Id:      %d\n"
+"Volume Session Time:    %d\n"
+"Last Volume Bytes:      %s\n"
+"Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/stored/bscan.c:1140
+#, c-format
+msgid "Could not create JobMedia record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:1144
+#, c-format
+msgid "Created JobMedia record JobId %d, MediaId %d\n"
+msgstr ""
+
+#: src/stored/bscan.c:1160
+#, c-format
+msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:1174
+#, c-format
+msgid "Could not add MD5/SHA1 to File record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:1179
+msgid "Updated MD5/SHA1 record\n"
+msgstr ""
+
+#: src/stored/btape.c:157 src/stored/stored.c:107
+#, c-format
+msgid "Tape block size (%d) not multiple of system size (%d)\n"
+msgstr ""
+
+#: src/stored/btape.c:161 src/stored/stored.c:111
+#, c-format
+msgid "Tape block size (%d) is not a power of 2\n"
+msgstr ""
+
+#: src/stored/btape.c:164
+#, c-format
+msgid ""
+"\n"
+"\n"
+"!!!! Warning large disk addressing disabled. off_t=%d should be 8 or "
+"more !!!!!\n"
+"\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:171
+#, c-format
+msgid "32 bit printf/scanf problem. i=%d x32=%u y32=%u\n"
+msgstr ""
+
+#: src/stored/btape.c:180
+msgid "64 bit printf/scanf problem. i=%d x64=%"
+msgstr ""
+
+#: src/stored/btape.c:180
+msgid " y64=%"
+msgstr ""
+
+#: src/stored/btape.c:184
+#, c-format
+msgid "Tape block granularity is %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:251
+msgid "No archive name specified.\n"
+msgstr ""
+
+#: src/stored/btape.c:255
+msgid "Improper number of arguments specified.\n"
+msgstr ""
+
+#: src/stored/btape.c:338
+#, c-format
+msgid "open device %s: OK\n"
+msgstr ""
+
+#: src/stored/btape.c:359
+msgid "Enter Volume Name: "
+msgstr ""
+
+#: src/stored/btape.c:366
+#, c-format
+msgid "Device open failed. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:371
+#, c-format
+msgid "Wrote Volume label for volume \"%s\".\n"
+msgstr ""
+
+#: src/stored/btape.c:385
+msgid "Volume has no label.\n"
+msgstr ""
+
+#: src/stored/btape.c:388
+msgid "Volume label read correctly.\n"
+msgstr ""
+
+#: src/stored/btape.c:391
+#, c-format
+msgid "I/O error on device: ERR=%s"
+msgstr ""
+
+#: src/stored/btape.c:394
+msgid "Volume name error\n"
+msgstr ""
+
+#: src/stored/btape.c:397
+#, c-format
+msgid "Error creating label. ERR=%s"
+msgstr ""
+
+#: src/stored/btape.c:400
+msgid "Volume version error.\n"
+msgstr ""
+
+#: src/stored/btape.c:403
+msgid "Bad Volume label type.\n"
+msgstr ""
+
+#: src/stored/btape.c:406
+msgid "Unknown error.\n"
+msgstr ""
+
+#: src/stored/btape.c:424
+#, c-format
+msgid "Bad status from load. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:426
+#, c-format
+msgid "Loaded %s\n"
+msgstr ""
+
+#: src/stored/btape.c:435 src/stored/btape.c:775 src/stored/btape.c:817
+#: src/stored/btape.c:887 src/stored/btape.c:929 src/stored/btape.c:1198
+#, c-format
+msgid "Bad status from rewind. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:438 src/stored/btape.c:1206
+#, c-format
+msgid "Rewound %s\n"
+msgstr ""
+
+#: src/stored/btape.c:465 src/stored/btape.c:1210
+#, c-format
+msgid "Bad status from weof %d. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:469
+#, c-format
+msgid "Wrote 1 EOF to %s\n"
+msgstr ""
+
+#: src/stored/btape.c:472
+#, c-format
+msgid "Wrote %d EOFs to %s\n"
+msgstr ""
+
+#: src/stored/btape.c:490
+msgid "Moved to end of medium.\n"
+msgstr ""
+
+#: src/stored/btape.c:517
+#, c-format
+msgid "Bad status from bsf. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:519
+#, c-format
+msgid "Backspaced %d file%s.\n"
+msgstr ""
+
+#: src/stored/btape.c:536
+#, c-format
+msgid "Bad status from bsr. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:538
+#, c-format
+msgid "Backspaced %d record%s.\n"
+msgstr ""
+
+#: src/stored/btape.c:548 src/stored/status.c:227
+#, c-format
+msgid "Configured device capabilities:\n"
+msgstr ""
+
+#: src/stored/btape.c:566
+#, c-format
+msgid "Device status:\n"
+msgstr ""
+
+#: src/stored/btape.c:580 src/stored/status.c:259
+#, c-format
+msgid "Device parameters:\n"
+msgstr ""
+
+#: src/stored/btape.c:585
+#, c-format
+msgid "Status:\n"
+msgstr ""
+
+#: src/stored/btape.c:600
+msgid ""
+"Test writting larger and larger records.\n"
+"This is a torture test for records.\n"
+"I am going to write\n"
+"larger and larger records. It will stop when the record size\n"
+"plus the header exceeds the block size (by default about 64K)\n"
+msgstr ""
+
+#: src/stored/btape.c:608 src/stored/btape.c:1815
+msgid "Command aborted.\n"
+msgstr ""
+
+#: src/stored/btape.c:624
+#, c-format
+msgid "Block %d i=%d\n"
+msgstr ""
+
+#: src/stored/btape.c:650
+msgid "Skipping read backwards test because BSR turned off.\n"
+msgstr ""
+
+#: src/stored/btape.c:654
+msgid ""
+"\n"
+"=== Write, backup, and re-read test ===\n"
+"\n"
+"I'm going to write three records and an EOF\n"
+"then backup over the EOF and re-read the last record.\n"
+"Bacula does this after writing the last block on the\n"
+"tape to verify that the block was written correctly.\n"
+"\n"
+"This is not an *essential* feature ...\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:667 src/stored/btape.c:678 src/stored/btape.c:689
+#: src/stored/btape.c:787 src/stored/btape.c:803 src/stored/btape.c:899
+#: src/stored/btape.c:915 src/stored/btape.c:1524 src/stored/btape.c:2407
+msgid "Error writing record to block.\n"
+msgstr ""
+
+#: src/stored/btape.c:671 src/stored/btape.c:682 src/stored/btape.c:693
+#: src/stored/btape.c:791 src/stored/btape.c:807 src/stored/btape.c:903
+#: src/stored/btape.c:919 src/stored/btape.c:1528 src/stored/btape.c:2411
+msgid "Error writing block to device.\n"
+msgstr ""
+
+#: src/stored/btape.c:674
+#, c-format
+msgid "Wrote first record of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:685
+#, c-format
+msgid "Wrote second record of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:696
+#, c-format
+msgid "Wrote third record of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:703 src/stored/btape.c:708
+#, c-format
+msgid "Backspace file failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:712
+msgid "Backspaced over EOF OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:714
+#, c-format
+msgid "Backspace record failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:717
+msgid "Backspace record OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:720 src/stored/btape.c:726
+#, c-format
+msgid "Read block failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:731
+msgid "Bad data in record. Test failed!\n"
+msgstr ""
+
+#: src/stored/btape.c:735
+msgid ""
+"\n"
+"Block re-read correct. Test succeeded!\n"
+msgstr ""
+
+#: src/stored/btape.c:736
+msgid ""
+"=== End Write, backup, and re-read test ===\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:743
+msgid ""
+"This is not terribly serious since Bacula only uses\n"
+"this function to verify the last block written to the\n"
+"tape. Bacula will skip the last block verification\n"
+"if you add:\n"
+"\n"
+"Backward Space Record = No\n"
+"\n"
+"to your Storage daemon's Device resource definition.\n"
+msgstr ""
+
+#: src/stored/btape.c:767
+msgid ""
+"\n"
+"=== Write, rewind, and re-read test ===\n"
+"\n"
+"I'm going to write 1000 records and an EOF\n"
+"then write 1000 records and an EOF, then rewind,\n"
+"and re-read the data to verify that it is correct.\n"
+"\n"
+"This is an *essential* feature ...\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:795 src/stored/btape.c:811 src/stored/btape.c:907
+#: src/stored/btape.c:923
+#, c-format
+msgid "Wrote 1000 blocks of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:820 src/stored/btape.c:932
+msgid "Rewind OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:827 src/stored/btape.c:981
+msgid "Got EOF on tape.\n"
+msgstr ""
+
+#: src/stored/btape.c:832
+#, c-format
+msgid "Read block %d failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:838
+#, c-format
+msgid "Read record failed. Block %d! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:844 src/stored/btape.c:1011
+#, c-format
+msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"
+msgstr ""
+
+#: src/stored/btape.c:851
+msgid "1000 blocks re-read correctly.\n"
+msgstr ""
+
+#: src/stored/btape.c:854 src/stored/btape.c:1018
+msgid ""
+"=== Test Succeeded. End Write, rewind, and re-read test ===\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:879
+msgid ""
+"\n"
+"=== Write, rewind, and position test ===\n"
+"\n"
+"I'm going to write 1000 records and an EOF\n"
+"then write 1000 records and an EOF, then rewind,\n"
+"and position to a few blocks and verify that it is correct.\n"
+"\n"
+"This is an *essential* feature ...\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:972
+#, c-format
+msgid "Reposition to file:block %d:%d\n"
+msgstr ""
+
+#: src/stored/btape.c:974
+msgid "Reposition error.\n"
+msgstr ""
+
+#: src/stored/btape.c:987
+#, c-format
+msgid ""
+"Read block %d failed! file=%d blk=%d. ERR=%s\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:989
+msgid ""
+"This may be because the tape drive block size is not\n"
+" set to variable blocking as normally used by Bacula.\n"
+" Please see the Tape Testing chapter in the manual and \n"
+" look for using mt with defblksize and setoptions\n"
+"If your tape drive block size is correct, then perhaps\n"
+" your SCSI driver is *really* stupid and does not\n"
+" correctly report the file:block after a FSF. In this\n"
+" case try setting:\n"
+"    Fast Forward Space File = no\n"
+" in your Device resource.\n"
+msgstr ""
+
+#: src/stored/btape.c:1005
+#, c-format
+msgid "Read record failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1016
+#, c-format
+msgid "Block %d re-read correctly.\n"
+msgstr ""
+
+#: src/stored/btape.c:1037
+msgid ""
+"\n"
+"\n"
+"=== Append files test ===\n"
+"\n"
+"This test is essential to Bacula.\n"
+"\n"
+"I'm going to write one record  in file 0,\n"
+"                   two records in file 1,\n"
+"             and three records in file 2\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1061
+msgid "Now moving to end of medium.\n"
+msgstr ""
+
+#: src/stored/btape.c:1063 src/stored/btape.c:1293
+#, c-format
+msgid "We should be in file 3. I am at file %d. %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
+msgid "This is correct!"
+msgstr ""
+
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
+msgid "This is NOT correct!!!!"
+msgstr ""
+
+#: src/stored/btape.c:1070
+msgid ""
+"\n"
+"Now the important part, I am going to attempt to append to the tape.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1077
+msgid ""
+"Done appending, there should be no I/O errors\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1078
+msgid "Doing Bacula scan of blocks:\n"
+msgstr ""
+
+#: src/stored/btape.c:1080
+msgid "End scanning the tape.\n"
+msgstr ""
+
+#: src/stored/btape.c:1081 src/stored/btape.c:1306
+#, c-format
+msgid "We should be in file 4. I am at file %d. %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1106
+msgid ""
+"\n"
+"Autochanger enabled, but no name or no command device specified.\n"
+msgstr ""
+
+#: src/stored/btape.c:1110
+msgid ""
+"\n"
+"Ah, I see you have an autochanger configured.\n"
+"To test the autochanger you must have a blank tape\n"
+" that I can write on in Slot 1.\n"
+msgstr ""
+
+#: src/stored/btape.c:1113
+msgid ""
+"\n"
+"Do you wish to continue with the Autochanger test? (y/n): "
+msgstr ""
+
+#: src/stored/btape.c:1120
+msgid ""
+"\n"
+"\n"
+"=== Autochanger test ===\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1129
+msgid "3301 Issuing autochanger \"loaded\" command.\n"
+msgstr ""
+
+#: src/stored/btape.c:1138
+#, c-format
+msgid "3991 Bad autochanger command: %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1139
+#, c-format
+msgid "3991 result=\"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1143
+#, c-format
+msgid "Slot %d loaded. I am going to unload it.\n"
+msgstr ""
+
+#: src/stored/btape.c:1145
+msgid "Nothing loaded in the drive. OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:1153
+#, c-format
+msgid "3302 Issuing autochanger \"unload %d %d\" command.\n"
+msgstr ""
+
+#: src/stored/btape.c:1158
+#, c-format
+msgid "unload status=%s %d\n"
+msgstr ""
+
+#: src/stored/btape.c:1158
+msgid "Bad"
+msgstr ""
+
+#: src/stored/btape.c:1161
+#, c-format
+msgid "3992 Bad autochanger command: %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1162
+#, c-format
+msgid "3992 result=\"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1172
+#, c-format
+msgid "3303 Issuing autochanger \"load %d %d\" command.\n"
+msgstr ""
+
+#: src/stored/btape.c:1180
+#, c-format
+msgid "3303 Autochanger \"load %d %d\" status is OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:1184
+#, c-format
+msgid "3993 Bad autochanger command: %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1185
+#, c-format
+msgid "3993 result=\"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1200
+msgid ""
+"\n"
+"The test failed, probably because you need to put\n"
+"a longer sleep time in the mtx-script in the load) case.\n"
+"Adding a 30 second sleep and trying again ...\n"
+msgstr ""
+
+#: src/stored/btape.c:1213
+#, c-format
+msgid "Wrote EOF to %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1217
+#, c-format
+msgid ""
+"\n"
+"The test worked this time. Please add:\n"
+"\n"
+"   sleep %d\n"
+"\n"
+"to your mtx-changer script in the load) case.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1222
+msgid ""
+"\n"
+"The test autochanger worked!!\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1233
+msgid "You must correct this error or the Autochanger will not work.\n"
+msgstr ""
+
+#: src/stored/btape.c:1251
+msgid ""
+"\n"
+"\n"
+"=== Forward space files test ===\n"
+"\n"
+"This test is essential to Bacula.\n"
+"\n"
+"I'm going to write five files then test forward spacing\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1276
+msgid "Now forward spacing 1 file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1278 src/stored/btape.c:1290 src/stored/btape.c:1303
+#: src/stored/btape.c:1321 src/stored/btape.c:1490
+#, c-format
+msgid "Bad status from fsr. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1281
+#, c-format
+msgid "We should be in file 1. I am at file %d. %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1288
+msgid "Now forward spacing 2 files.\n"
+msgstr ""
+
+#: src/stored/btape.c:1301
+msgid "Now forward spacing 4 files.\n"
+msgstr ""
+
+#: src/stored/btape.c:1313
+msgid ""
+"The test worked this time. Please add:\n"
+"\n"
+"   Fast Forward Space File = no\n"
+"\n"
+"to your Device resource for this drive.\n"
+msgstr ""
+
+#: src/stored/btape.c:1319
+msgid "Now forward spacing 1 more file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1323
+#, c-format
+msgid "We should be in file 5. I am at file %d. %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1328
+msgid ""
+"\n"
+"=== End Forward space files test ===\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1332
+msgid ""
+"\n"
+"The forward space file test failed.\n"
+msgstr ""
+
+#: src/stored/btape.c:1334
+msgid ""
+"You have Fast Forward Space File enabled.\n"
+"I am turning it off then retrying the test.\n"
+msgstr ""
+
+#: src/stored/btape.c:1340
+msgid ""
+"You must correct this error or Bacula will not work.\n"
+"Some systems, e.g. OpenBSD, require you to set\n"
+"   Use MTIOCGET= no\n"
+"in your device resource. Use with caution.\n"
+msgstr ""
+
+#: src/stored/btape.c:1372
+msgid ""
+"\n"
+"Append test failed. Attempting again.\n"
+"Setting \"Hardware End of Medium = no\n"
+"    and \"Fast Forward Space File = no\n"
+"and retrying append test.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1380
+msgid ""
+"\n"
+"\n"
+"It looks like the test worked this time, please add:\n"
+"\n"
+"    Hardware End of Medium = No\n"
+"\n"
+"    Fast Forward Space File = No\n"
+"to your Device resource in the Storage conf file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1387
+msgid ""
+"\n"
+"\n"
+"That appears *NOT* to have corrected the problem.\n"
+msgstr ""
+
+#: src/stored/btape.c:1392
+msgid ""
+"\n"
+"\n"
+"It looks like the append failed. Attempting again.\n"
+"Setting \"BSF at EOM = yes\" and retrying append test.\n"
+msgstr ""
+
+#: src/stored/btape.c:1397
+msgid ""
+"\n"
+"\n"
+"It looks like the test worked this time, please add:\n"
+"\n"
+"    Hardware End of Medium = No\n"
+"    Fast Forward Space File = No\n"
+"    BSF at EOM = yes\n"
+"\n"
+"to your Device resource in the Storage conf file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1408
+msgid ""
+"\n"
+"Append test failed.\n"
+"\n"
+"\n"
+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
+"Unable to correct the problem. You MUST fix this\n"
+"problem before Bacula can use your tape drive correctly\n"
+"\n"
+"Perhaps running Bacula in fixed block mode will work.\n"
+"Do so by setting:\n"
+"\n"
+"Minimum Block Size = nnn\n"
+"Maximum Block Size = nnn\n"
+"\n"
+"in your Storage daemon's Device definition.\n"
+"nnn must match your tape driver's block size, which\n"
+"can be determined by reading your tape manufacturers\n"
+"information, and the information on your kernel dirver.\n"
+"Fixed block sizes, however, are not normally an ideal solution.\n"
+"\n"
+"Some systems, e.g. OpenBSD, require you to set\n"
+"   Use MTIOCGET= no\n"
+"in your device resource. Use with caution.\n"
+msgstr ""
+
+#: src/stored/btape.c:1429
+msgid ""
+"\n"
+"The above Bacula scan should have output identical to what follows.\n"
+"Please double check it ...\n"
+"=== Sample correct output ===\n"
+"1 block of 64448 bytes in file 1\n"
+"End of File mark.\n"
+"2 blocks of 64448 bytes in file 2\n"
+"End of File mark.\n"
+"3 blocks of 64448 bytes in file 3\n"
+"End of File mark.\n"
+"1 block of 64448 bytes in file 4\n"
+"End of File mark.\n"
+"Total files=4, blocks=7, bytes = 451,136\n"
+"=== End sample correct output ===\n"
+"\n"
+"If the above scan output is not identical to the\n"
+"sample output, you MUST correct the problem\n"
+"or Bacula will not be able to write multiple Jobs to \n"
+"the tape.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1468
+#, c-format
+msgid "Bad status from fsf. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1472
+msgid "Forward spaced 1 file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1475
+#, c-format
+msgid "Forward spaced %d files.\n"
+msgstr ""
+
+#: src/stored/btape.c:1494
+msgid "Forward spaced 1 record.\n"
+msgstr ""
+
+#: src/stored/btape.c:1497
+#, c-format
+msgid "Forward spaced %d records.\n"
+msgstr ""
+
+#: src/stored/btape.c:1531
+#, c-format
+msgid "Wrote one record of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:1533
+msgid "Wrote block to device.\n"
+msgstr ""
+
+#: src/stored/btape.c:1548
+msgid "Enter length to read: "
+msgstr ""
+
+#: src/stored/btape.c:1553
+msgid "Bad length entered, using default of 1024 bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:1562
+#, c-format
+msgid "Read of %d bytes gives stat=%d. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1585 src/stored/btape.c:1634
+#, c-format
+msgid "End of tape\n"
+msgstr ""
+
+#: src/stored/btape.c:1590
+#, c-format
+msgid "Starting scan at file %u\n"
+msgstr ""
+
+#: src/stored/btape.c:1595 src/stored/dev.c:1229
+#, c-format
+msgid "read error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/btape.c:1597
+#, c-format
+msgid "Bad status from read %d. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1600 src/stored/btape.c:1614 src/stored/btape.c:1678
+#: src/stored/btape.c:1690 src/stored/btape.c:1703 src/stored/btape.c:1719
+#, c-format
+msgid "1 block of %d bytes in file %d\n"
+msgstr ""
+
+#: src/stored/btape.c:1603 src/stored/btape.c:1617 src/stored/btape.c:1681
+#: src/stored/btape.c:1693 src/stored/btape.c:1706 src/stored/btape.c:1722
+#, c-format
+msgid "%d blocks of %d bytes in file %d\n"
+msgstr ""
+
+#: src/stored/btape.c:1625 src/stored/btape.c:1697
+#, c-format
+msgid "End of File mark.\n"
+msgstr ""
+
+#: src/stored/btape.c:1646 src/stored/btape.c:1750
+#, c-format
+msgid "Total files=%d, blocks=%d, bytes = %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1710
+#, c-format
+msgid "Short block read.\n"
+msgstr ""
+
+#: src/stored/btape.c:1713
+#, c-format
+msgid "Error reading block. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1737
+#, c-format
+msgid ""
+"Blk_block: %u dev_blk=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
+"s rlen=%d\n"
+msgstr ""
+
+#: src/stored/btape.c:1759
+#, c-format
+msgid "Device status: %u. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1789
+msgid ""
+"\n"
+"This command simulates Bacula writing to a tape.\n"
+"It requires either one or two blank tapes, which it\n"
+"will label and write.\n"
+"\n"
+"If you have an autochanger configured, it will use\n"
+"the tapes that are in slots 1 and 2, otherwise, you will\n"
+"be prompted to insert the tapes when necessary.\n"
+"\n"
+"It will print a status approximately\n"
+"every 322 MB, and write an EOF every 3.2 GB.  If you have\n"
+"selected the simple test option, after writing the first tape\n"
+"it will rewind it and re-read the last block written.\n"
+"\n"
+"If you have selected the multiple tape test, when the first tape\n"
+"fills, it will ask for a second, and after writing a few more \n"
+"blocks, it will stop.  Then it will begin re-reading the\n"
+"two tapes.\n"
+"\n"
+"This may take a long time -- hours! ...\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1806
+msgid ""
+"Do you want to run the simplified test (s) with one tape\n"
+"or the complete multiple tape (m) test: (s/m) "
+msgstr ""
+
+#: src/stored/btape.c:1809
+msgid "Simple test (single tape) selected.\n"
+msgstr ""
+
+#: src/stored/btape.c:1812
+msgid "Multiple tape test selected.\n"
+msgstr ""
+
+#: src/stored/btape.c:1828
+msgid "Rewind failed.\n"
+msgstr ""
+
+#: src/stored/btape.c:1831
+msgid "Write EOF failed.\n"
+msgstr ""
+
+#: src/stored/btape.c:1858
+msgid "Wrote Start of Session label.\n"
+msgstr ""
+
+#: src/stored/btape.c:1889
+#, c-format
+msgid "%s Begin writing Bacula records to tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:1891
+#, c-format
+msgid "%s Begin writing Bacula records to first tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:1932
+#, c-format
+msgid "Wrote blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n"
+msgstr ""
+
+#: src/stored/btape.c:1942
+#, c-format
+msgid "%s Flush block, write EOF\n"
+msgstr ""
+
+#: src/stored/btape.c:1953
+msgid "Not OK\n"
+msgstr ""
+
+#: src/stored/btape.c:1981
+msgid "Set ok=false after write_block_to_device.\n"
+msgstr ""
+
+#: src/stored/btape.c:1984
+msgid "Wrote End of Session label.\n"
+msgstr ""
+
+#: src/stored/btape.c:2008
+#, c-format
+msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n"
+msgstr ""
+
+#: src/stored/btape.c:2012
+#, c-format
+msgid "Could not create state file: %s ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:2020
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:2024
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:2063
+msgid ""
+"\n"
+"The state file level has changed. You must redo\n"
+"the fill command.\n"
+msgstr ""
+
+#: src/stored/btape.c:2069
+#, c-format
+msgid ""
+"\n"
+"Could not find the state file: %s ERR=%s\n"
+"You must redo the fill command.\n"
+msgstr ""
+
+#: src/stored/btape.c:2111
+msgid "Mount first tape. Press enter when ready: "
+msgstr ""
+
+#: src/stored/btape.c:2131
+msgid "Rewinding.\n"
+msgstr ""
+
+#: src/stored/btape.c:2136
+#, c-format
+msgid "Reading the first 10000 records from %u:%u.\n"
+msgstr ""
+
+#: src/stored/btape.c:2140 src/stored/btape.c:2207
+#, c-format
+msgid "Reposition from %u:%u to %u:%u\n"
+msgstr ""
+
+#: src/stored/btape.c:2143 src/stored/btape.c:2194 src/stored/btape.c:2210
+#, c-format
+msgid "Reposition error. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:2146
+#, c-format
+msgid "Reading block %u.\n"
+msgstr ""
+
+#: src/stored/btape.c:2148 src/stored/btape.c:2199 src/stored/btape.c:2215
+#, c-format
+msgid "Error reading block: ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:2153
+msgid ""
+"\n"
+"The last block on the tape matches. Test succeeded.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2155
+msgid ""
+"\n"
+"The last block of the first tape matches.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2180
+msgid "Mount second tape. Press enter when ready: "
+msgstr ""
+
+#: src/stored/btape.c:2192
+#, c-format
+msgid "Reposition from %u:%u to 0:1\n"
+msgstr ""
+
+#: src/stored/btape.c:2197 src/stored/btape.c:2213
+#, c-format
+msgid "Reading block %d.\n"
+msgstr ""
+
+#: src/stored/btape.c:2203
+msgid ""
+"\n"
+"The first block on the second tape matches.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2219
+msgid ""
+"\n"
+"The last block on the second tape matches. Test succeeded.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2234
+#, c-format
+msgid "10000 records read now at %d:%d\n"
+msgstr ""
+
+#: src/stored/btape.c:2257 src/stored/btape.c:2268 src/stored/btape.c:2316
+msgid "Last block written"
+msgstr ""
+
+#: src/stored/btape.c:2259 src/stored/btape.c:2269
+msgid "Block read back"
+msgstr ""
+
+#: src/stored/btape.c:2260
+#, c-format
+msgid ""
+"\n"
+"\n"
+"The blocks differ at byte %u\n"
+msgstr ""
+
+#: src/stored/btape.c:2261
+msgid ""
+"\n"
+"\n"
+"!!!! The last block written and the block\n"
+"that was read back differ. The test FAILED !!!!\n"
+"This must be corrected before you use Bacula\n"
+"to write multi-tape Volumes.!!!!\n"
+msgstr ""
+
+#: src/stored/btape.c:2300
+#, c-format
+msgid "Last block at: %u:%u this_dev_block_num=%d\n"
+msgstr ""
+
+#: src/stored/btape.c:2314
+#, c-format
+msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n"
+msgstr ""
+
+#: src/stored/btape.c:2318
+msgid "Block not written"
+msgstr ""
+
+#: src/stored/btape.c:2333
+#, c-format
+msgid "End of tape %d:%d. VolumeCapacity=%s. Write rate = %.1f KB/s\n"
+msgstr ""
+
+#: src/stored/btape.c:2383
+msgid "Test writing blocks of 64512 bytes to tape.\n"
+msgstr ""
+
+#: src/stored/btape.c:2385
+msgid "How many blocks do you want to write? (1000): "
+msgstr ""
+
+#: src/stored/btape.c:2400
+#, c-format
+msgid "Begin writing %d Bacula blocks to tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:2452
+#, c-format
+msgid "Begin writing raw blocks of %u bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:2472
+#, c-format
+msgid "Write failed at block %u. stat=%d ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:2502
+#, c-format
+msgid "Begin writing Bacula blocks of %u bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:2521
+#, c-format
+msgid "Write failed at block %u.\n"
+msgstr ""
+
+#: src/stored/btape.c:2528
+msgid "test autochanger"
+msgstr ""
+
+#: src/stored/btape.c:2529
+msgid "backspace file"
+msgstr ""
+
+#: src/stored/btape.c:2530
+msgid "backspace record"
+msgstr ""
+
+#: src/stored/btape.c:2531
+msgid "fill tape using Bacula writes"
+msgstr ""
+
+#: src/stored/btape.c:2532
+msgid "list device capabilities"
+msgstr ""
+
+#: src/stored/btape.c:2533
+msgid "clear tape errors"
+msgstr ""
+
+#: src/stored/btape.c:2534
+msgid "go to end of Bacula data for append"
+msgstr ""
+
+#: src/stored/btape.c:2535
+msgid "go to the physical end of medium"
+msgstr ""
+
+#: src/stored/btape.c:2536
+msgid "fill tape, write onto second volume"
+msgstr ""
+
+#: src/stored/btape.c:2537
+msgid "read filled tape"
+msgstr ""
+
+#: src/stored/btape.c:2538
+msgid "forward space a file"
+msgstr ""
+
+#: src/stored/btape.c:2539
+msgid "forward space a record"
+msgstr ""
+
+#: src/stored/btape.c:2541
+msgid "write a Bacula label to the tape"
+msgstr ""
+
+#: src/stored/btape.c:2542
+msgid "load a tape"
+msgstr ""
+
+#: src/stored/btape.c:2543
+msgid "quit btape"
+msgstr ""
+
+#: src/stored/btape.c:2544
+msgid "use write() to fill tape"
+msgstr ""
+
+#: src/stored/btape.c:2545
+msgid "read and print the Bacula tape label"
+msgstr ""
+
+#: src/stored/btape.c:2546
+msgid "test record handling functions"
+msgstr ""
+
+#: src/stored/btape.c:2547
+msgid "rewind the tape"
+msgstr ""
+
+#: src/stored/btape.c:2548
+msgid "read() tape block by block to EOT and report"
+msgstr ""
+
+#: src/stored/btape.c:2549
+msgid "Bacula read block by block to EOT and report"
+msgstr ""
+
+#: src/stored/btape.c:2550
+msgid "print tape status"
+msgstr ""
+
+#: src/stored/btape.c:2551
+msgid "General test Bacula tape functions"
+msgstr ""
+
+#: src/stored/btape.c:2552
+msgid "write an EOF on the tape"
+msgstr ""
+
+#: src/stored/btape.c:2553
+msgid "write a single Bacula block"
+msgstr ""
+
+#: src/stored/btape.c:2554
+msgid "read a single record"
+msgstr ""
+
+#: src/stored/btape.c:2555
+msgid "quick fill command"
+msgstr ""
+
+#: src/stored/btape.c:2576
+#, c-format
+msgid "%s is an illegal command\n"
+msgstr ""
+
+#: src/stored/btape.c:2586
+#, c-format
+msgid "Interactive commands:\n"
+msgstr ""
+
+#: src/stored/btape.c:2596
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: btape <options> <device_name>\n"
+"       -b <file>   specify bootstrap file\n"
+"       -c <file>   set configuration file to file\n"
+"       -d <nn>     set debug level to nn\n"
+"       -p          proceed inspite of I/O errors\n"
+"       -s          turn off signals\n"
+"       -v          be verbose\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2687
+#, c-format
+msgid "Mount second Volume on device %s and press return when ready: "
+msgstr ""
+
+#: src/stored/btape.c:2714
+#, c-format
+msgid "Mount blank Volume on device %s and press return when ready: "
+msgstr ""
+
+#: src/stored/btape.c:2732
+#, c-format
+msgid "End of Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/btape.c:2744
+#, c-format
+msgid "Read block=%u, VolBytes=%s rate=%.1f KB/s\n"
+msgstr ""
+
+#: src/stored/btape.c:2759 src/stored/mount.c:501
+#, c-format
+msgid "Cannot open Dev=%s, Vol=%s\n"
+msgstr ""
+
+#: src/stored/butil.c:46
+msgid "Nohdr,"
+msgstr ""
+
+#: src/stored/butil.c:49
+msgid "partial,"
+msgstr ""
+
+#: src/stored/butil.c:52
+msgid "empty,"
+msgstr ""
+
+#: src/stored/butil.c:55
+msgid "Nomatch,"
+msgstr ""
+
+#: src/stored/butil.c:58
+msgid "cont,"
+msgstr ""
+
+#: src/stored/butil.c:133
+msgid "Volume name or names is too long. Please use a .bsr file.\n"
+msgstr ""
+
+#: src/stored/butil.c:153
+#, c-format
+msgid "Cannot find device \"%s\" in config file %s.\n"
+msgstr ""
+
+#: src/stored/butil.c:160
+#, c-format
+msgid "Cannot init device %s\n"
+msgstr ""
+
+#: src/stored/butil.c:181
+#, c-format
+msgid "Cannot open %s\n"
+msgstr ""
+
+#: src/stored/butil.c:264
+#, c-format
+msgid "Could not find device \"%s\" in config file %s.\n"
+msgstr ""
+
+#: src/stored/butil.c:269
+#, c-format
+msgid "Using device: \"%s\" for reading.\n"
+msgstr ""
+
+#: src/stored/butil.c:272
+#, c-format
+msgid "Using device: \"%s\" for writing.\n"
+msgstr ""
+
+#: src/stored/butil.c:288
+msgid "Unexpected End of Data\n"
+msgstr ""
+
+#: src/stored/butil.c:290
+msgid "Unexpected End of Tape\n"
+msgstr ""
+
+#: src/stored/butil.c:292
+msgid "Unexpected End of File\n"
+msgstr ""
+
+#: src/stored/butil.c:294
+msgid "Tape Door is Open\n"
+msgstr ""
+
+#: src/stored/butil.c:296
+msgid "Unexpected Tape is Off-line\n"
+msgstr ""
+
+#: src/stored/dev.c:112
+#, c-format
+msgid "Unable to stat device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:123
+#, c-format
+msgid ""
+"%s is an unknown device type. Must be tape or directory\n"
+" or have RequiresMount=yes for DVD. st_mode=%x\n"
+msgstr ""
+
+#: src/stored/dev.c:179
+#, c-format
+msgid "Unable to stat mount point %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:186
+msgid ""
+"Mount and unmount commands must defined for a device which requires mount.\n"
+msgstr ""
+
+#: src/stored/dev.c:189
+msgid "Write part command must be defined for a device which requires mount.\n"
+msgstr ""
+
+#: src/stored/dev.c:194
+#, c-format
+msgid "Block size %u on device %s is too large, using default %u\n"
+msgstr ""
+
+#: src/stored/dev.c:199
+#, c-format
+msgid "Max block size %u not multiple of device %s block size.\n"
+msgstr ""
+
+#: src/stored/dev.c:215 src/stored/dev.c:221
+#, c-format
+msgid "Unable to init cond variable: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:312
+msgid "Illegal mode given to open dev.\n"
+msgstr ""
+
+#: src/stored/dev.c:355 src/stored/device.c:295
+#, c-format
+msgid "Unable to open device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:423 src/stored/dev.c:481
+#, c-format
+msgid "Could not open file device %s. No Volume name given.\n"
+msgstr ""
+
+#: src/stored/dev.c:449 src/stored/dev.c:562
+#, c-format
+msgid "Could not open: %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:506
+#, c-format
+msgid ""
+"The media in the device %s is not empty, please blank it before writing "
+"anything to it.\n"
+msgstr ""
+
+#: src/stored/dev.c:523
+#, c-format
+msgid "There is no valid media in the device %s.\n"
+msgstr ""
+
+#: src/stored/dev.c:530
+#, c-format
+msgid "Could not mount device %s.\n"
+msgstr ""
+
+#: src/stored/dev.c:588
+#, c-format
+msgid "Could not fstat: %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:631
+#, c-format
+msgid "Bad call to rewind. Device %s not open\n"
+msgstr ""
+
+#: src/stored/dev.c:677
+#, c-format
+msgid "Rewind error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:687 src/stored/dev.c:802 src/stored/dev.c:938
+#: src/stored/dev.c:1457
+#, c-format
+msgid "lseek_dev error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:727
+msgid "unknown blocked code"
+msgstr ""
+
+#: src/stored/dev.c:772
+#, c-format
+msgid "Bad call to eod_dev. Device %s not open\n"
+msgstr ""
+
+#: src/stored/dev.c:838
+#, c-format
+msgid "ioctl MTEOM error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:846 src/stored/dev.c:978
+#, c-format
+msgid "ioctl MTIOCGET error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:924
+msgid "Bad device call. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:937
+#, c-format
+msgid "Seek error: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:973
+msgid " Bacula status:"
+msgstr ""
+
+#: src/stored/dev.c:974 src/stored/dev.c:1023 src/stored/dev.c:1025
+#, c-format
+msgid " file=%d block=%d\n"
+msgstr ""
+
+#: src/stored/dev.c:982
+msgid " Device status:"
+msgstr ""
+
+#: src/stored/dev.c:1047
+msgid "Bad call to load_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1058 src/stored/dev.c:1071
+#, c-format
+msgid "ioctl MTLOAD error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1107
+#, c-format
+msgid "ioctl MTOFFL error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1148
+msgid "Bad call to fsf_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1158 src/stored/dev.c:1279
+#, c-format
+msgid "Device %s at End of Tape.\n"
+msgstr ""
+
+#: src/stored/dev.c:1183 src/stored/dev.c:1259
+#, c-format
+msgid "ioctl MTFSF error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1308
+msgid "Bad call to bsf_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1314
+#, c-format
+msgid "Device %s cannot BSF because it is not a tape.\n"
+msgstr ""
+
+#: src/stored/dev.c:1329
+#, c-format
+msgid "ioctl MTBSF error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1349
+msgid "Bad call to fsr. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1358
+#, c-format
+msgid "ioctl MTFSR not permitted on %s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1386
+#, c-format
+msgid "ioctl MTFSR %d error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1406
+msgid "Bad call to bsr_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1416
+#, c-format
+msgid "ioctl MTBSR not permitted on %s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1429
+#, c-format
+msgid "ioctl MTBSR error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1446
+msgid "Bad call to reposition_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1514
+msgid "Bad call to weof_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1524
+msgid "Attempt to WEOF on non-appendable Volume\n"
+msgstr ""
+
+#: src/stored/dev.c:1541
+#, c-format
+msgid "ioctl MTWEOF error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1583
+msgid "Got ENOTTY on read/write!\n"
+msgstr ""
+
+#: src/stored/dev.c:1630
+#, c-format
+msgid "unknown func code %d"
+msgstr ""
+
+#: src/stored/dev.c:1636
+#, c-format
+msgid "I/O function \"%s\" not supported on this device.\n"
+msgstr ""
+
+#: src/stored/dev.c:1761 src/stored/dvd.c:734
+#, c-format
+msgid "Unable to truncate device %s. ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:1800
+msgid "Bad call to term_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/device.c:100
+#, c-format
+msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n"
+msgstr ""
+
+#: src/stored/device.c:114
+#, c-format
+msgid "New volume \"%s\" mounted on device %s at %s.\n"
+msgstr ""
+
+#: src/stored/device.c:126
+#, c-format
+msgid "write_block_to_device Volume label failed. ERR=%s"
+msgstr ""
+
+#: src/stored/device.c:162
+#, c-format
+msgid "write_block_to_device overflow block failed. ERR=%s"
+msgstr ""
+
+#: src/stored/device.c:297
+#, c-format
+msgid "Unable to open archive %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/device.c:332
+#, c-format
+msgid "Device write lock failure. ERR=%s\n"
+msgstr ""
+
+#: src/stored/device.c:340
+#, c-format
+msgid "Device write unlock failure. ERR=%s\n"
+msgstr ""
+
+#: src/stored/device.c:359
+#, c-format
+msgid "pthread_cond_wait failure. ERR=%s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:140
+msgid "Connection request failed.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:149
+#, c-format
+msgid "Invalid connection. Len=%d\n"
+msgstr ""
+
+#: src/stored/dircmd.c:241
+#, c-format
+msgid "3991 Bad setdebug command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:262
+#, c-format
+msgid "3904 Job %s not found.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:283
+#, c-format
+msgid "3000 Job %s marked to be canceled.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:287
+msgid "3903 Error scanning cancel command.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:364 src/stored/dircmd.c:680 src/stored/dircmd.c:756
+#: src/stored/dircmd.c:819 src/stored/dircmd.c:874 src/stored/dircmd.c:918
+#, c-format
+msgid "3999 Device \"%s\" not found or could not be opened.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:369
+#, c-format
+msgid "3903 Error scanning label command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:412
+#, c-format
+msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n"
+msgstr ""
+
+#: src/stored/dircmd.c:419
+msgid "3921 Wrong volume mounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:423
+msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:431 src/stored/dircmd.c:440
+#, c-format
+msgid "3912 Failed to label Volume: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:443
+#, c-format
+msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n"
+msgstr ""
+
+#: src/stored/dircmd.c:476
+#, c-format
+msgid "3001 Mounted Volume: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:480 src/stored/dircmd.c:954
+#, c-format
+msgid ""
+"3902 Cannot mount Volume on Storage Device %s because:\n"
+"%s"
+msgstr ""
+
+#: src/stored/dircmd.c:508 src/stored/reserve.c:674
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" requested by DIR could not be opened or does not exist.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:529 src/stored/reserve.c:670
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" in changer \"%s\" requested by DIR could not be opened or "
+"does not exist.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:593 src/stored/dircmd.c:646
+#, c-format
+msgid "3901 open device failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:613 src/stored/dircmd.c:637
+#, c-format
+msgid "3001 Device %s is mounted with Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/dircmd.c:616 src/stored/dircmd.c:640 src/stored/dircmd.c:655
+#, c-format
+msgid ""
+"3905 Device %s open but no Bacula volume is mounted.\n"
+"If this is not a blank tape, try unmounting and remounting the Volume.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:625
+#, c-format
+msgid "3001 Device %s is doing acquire.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:630 src/stored/dircmd.c:730
+#, c-format
+msgid "3903 Device %s is being labeled.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:652
+#, c-format
+msgid "3001 Device %s is already mounted with Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/dircmd.c:661
+#, c-format
+msgid "3002 Device %s is mounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:664
+#, c-format
+msgid "3907 %s"
+msgstr ""
+
+#: src/stored/dircmd.c:667
+#, c-format
+msgid "3906 File device %s is always mounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:673
+#, c-format
+msgid "3905 Bizarre wait state %d\n"
+msgstr ""
+
+#: src/stored/dircmd.c:684
+#, c-format
+msgid "3909 Error scanning mount command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:711
+#, c-format
+msgid "3901 Device %s is already unmounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:722
+#, c-format
+msgid "3001 Device %s unmounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:726
+#, c-format
+msgid "3902 Device %s is busy in acquire.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:749
+#, c-format
+msgid "3002 Device %s unmounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:761
+#, c-format
+msgid "3907 Error scanning unmount command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:789
+#, c-format
+msgid "3921 Device %s already released.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:796
+#, c-format
+msgid "3922 Device %s waiting for mount.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:800
+#, c-format
+msgid "3923 Device %s is busy in acquire.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:804
+#, c-format
+msgid "3914 Device %s is being labeled.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:812
+#, c-format
+msgid "3022 Device %s released.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:824
+#, c-format
+msgid "3927 Error scanning release command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:860
+#, c-format
+msgid "3995 Device %s is not an autochanger.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:878
+#, c-format
+msgid "3908 Error scanning autocharger drives/list/slots command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:922
+#, c-format
+msgid "3909 Error scanning readlabel command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:950
+#, c-format
+msgid "3001 Volume=%s Slot=%d\n"
+msgstr ""
+
+#: src/stored/dircmd.c:979
+#, c-format
+msgid "3910 Unable to open device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:991
+#, c-format
+msgid "3931 Device %s is BLOCKED. user unmounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:995
+#, c-format
+msgid ""
+"3932 Device %s is BLOCKED. user unmounted during wait for media/mount.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:999
+#, c-format
+msgid "3933 Device %s is BLOCKED waiting for media.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1003
+#, c-format
+msgid "3934 Device %s is being initialized.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1007
+#, c-format
+msgid "3935 Device %s is blocked labeling a Volume.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1011
+#, c-format
+msgid "3935 Device %s is blocked for unknown reason.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1016
+#, c-format
+msgid "3936 Device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1019
+#, c-format
+msgid "3937 Device %s is busy with %d writer(s).\n"
+msgstr ""
+
+#: src/stored/dvd.c:153
+#, c-format
+msgid "Device %s cannot be mounted. ERR=%s\n"
+msgstr ""
+
+#: src/stored/dvd.c:271
+#, c-format
+msgid "Cannot run free space command (%s)\n"
+msgstr ""
+
+#: src/stored/dvd.c:374
+#, c-format
+msgid "Error while writing current part to the DVD: %s"
+msgstr ""
+
+#: src/stored/dvd.c:394
+#, c-format
+msgid "Remaining free space %s on %s\n"
+msgstr ""
+
+#: src/stored/dvd.c:464
+#, c-format
+msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
+msgstr ""
+
+#: src/stored/dvd.c:481
+#, c-format
+msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/dvd.c:700
+#, c-format
+msgid "Unable to write part %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/fd_cmds.c:340
+msgid "Error parsing bootstrap file.\n"
+msgstr ""
+
+#: src/stored/job.c:191
+#, c-format
+msgid "Job name not found: %s\n"
+msgstr ""
+
+#: src/stored/job.c:202
+#, c-format
+msgid "Hey!!!! JobId %u Job %s already authenticated.\n"
+msgstr ""
+
+#: src/stored/job.c:213
+msgid "Unable to authenticate File daemon\n"
+msgstr ""
+
+#: src/stored/job.c:334
+msgid "In free_jcr(), but still attached to device!!!!\n"
+msgstr ""
+
+#: src/stored/label.c:74
+msgid "BAD call to read_dev_volume_label\n"
+msgstr ""
+
+#: src/stored/label.c:79 src/stored/label.c:120 src/stored/label.c:208
+#, c-format
+msgid "Wrong Volume mounted on device %s: Wanted %s have %s\n"
+msgstr ""
+
+#: src/stored/label.c:86 src/stored/label.c:123 src/stored/label.c:195
+#, c-format
+msgid "Too many tries: %s"
+msgstr ""
+
+#: src/stored/label.c:102
+#, c-format
+msgid "Couldn't rewind device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:140
+#, c-format
+msgid ""
+"Requested Volume \"%s\" on %s is not a Bacula labeled Volume, because: ERR=%s"
+msgstr ""
+
+#: src/stored/label.c:145
+msgid "Could not read Volume label from block.\n"
+msgstr ""
+
+#: src/stored/label.c:148
+#, c-format
+msgid "Could not unserialize Volume label: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:153
+#, c-format
+msgid "Volume Header Id bad: %s\n"
+msgstr ""
+
+#: src/stored/label.c:180
+#, c-format
+msgid "Volume on %s has wrong Bacula version. Wanted %d got %d\n"
+msgstr ""
+
+#: src/stored/label.c:191
+#, c-format
+msgid "Volume on %s has bad Bacula label type: %x\n"
+msgstr ""
+
+#: src/stored/label.c:272
+#, c-format
+msgid "Cannot write Volume label to block for device %s\n"
+msgstr ""
+
+#: src/stored/label.c:400
+#, c-format
+msgid "Rewind error on device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:405
+#, c-format
+msgid "Truncate error on device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:427
+#, c-format
+msgid "Unable to write device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:455
+#, c-format
+msgid "Recycled volume \"%s\" on device %s, all previous data lost.\n"
+msgstr ""
+
+#: src/stored/label.c:458
+#, c-format
+msgid "Wrote label to prelabeled Volume \"%s\" on device %s\n"
+msgstr ""
+
+#: src/stored/label.c:657
+#, c-format
+msgid "Bad session label = %d\n"
+msgstr ""
+
+#: src/stored/label.c:675 src/stored/label.c:682
+#, c-format
+msgid "Error writing Session label to %s: %s\n"
+msgstr ""
+
+#: src/stored/label.c:717
+#, c-format
+msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n"
+msgstr ""
+
+#: src/stored/label.c:844
+#, c-format
+msgid "Unknown %d"
+msgstr ""
+
+#: src/stored/label.c:848
+#, c-format
+msgid ""
+"\n"
+"Volume Label:\n"
+"Id                : %sVerNo             : %d\n"
+"VolName           : %s\n"
+"PrevVolName       : %s\n"
+"VolFile           : %d\n"
+"LabelType         : %s\n"
+"LabelSize         : %d\n"
+"PoolName          : %s\n"
+"MediaType         : %s\n"
+"PoolType          : %s\n"
+"HostName          : %s\n"
+msgstr ""
+
+#: src/stored/label.c:870
+#, c-format
+msgid "Date label written: %s\n"
+msgstr ""
+
+#: src/stored/label.c:876
+#, c-format
+msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n"
+msgstr ""
+
+#: src/stored/label.c:896
+#, c-format
+msgid ""
+"\n"
+"%s Record:\n"
+"JobId             : %d\n"
+"VerNum            : %d\n"
+"PoolName          : %s\n"
+"PoolType          : %s\n"
+"JobName           : %s\n"
+"ClientName        : %s\n"
+msgstr ""
+
+#: src/stored/label.c:909
+#, c-format
+msgid ""
+"Job (unique name) : %s\n"
+"FileSet           : %s\n"
+"JobType           : %c\n"
+"JobLevel          : %c\n"
+msgstr ""
+
+#: src/stored/label.c:918
+#, c-format
+msgid ""
+"JobFiles          : %s\n"
+"JobBytes          : %s\n"
+"StartBlock        : %s\n"
+"EndBlock          : %s\n"
+"StartFile         : %s\n"
+"EndFile           : %s\n"
+"JobErrors         : %s\n"
+"JobStatus         : %c\n"
+msgstr ""
+
+#: src/stored/label.c:939
+#, c-format
+msgid "Date written      : %s\n"
+msgstr ""
+
+#: src/stored/label.c:944
+#, c-format
+msgid "Date written      : %04d-%02d-%02d at %02d:%02d\n"
+msgstr ""
+
+#: src/stored/label.c:963
+msgid "Fresh Volume"
+msgstr ""
+
+#: src/stored/label.c:966
+msgid "Volume"
+msgstr ""
+
+#: src/stored/label.c:975 src/stored/read_record.c:336
+msgid "End of Media"
+msgstr ""
+
+#: src/stored/label.c:978
+msgid "End of Tape"
+msgstr ""
+
+#: src/stored/label.c:998 src/stored/label.c:1006 src/stored/label.c:1039
+#, c-format
+msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n"
+msgstr ""
+
+#: src/stored/label.c:1003
+msgid "End of physical tape.\n"
+msgstr ""
+
+#: src/stored/label.c:1018 src/stored/label.c:1027
+#, c-format
+msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n"
+msgstr ""
+
+#: src/stored/label.c:1020
+#, c-format
+msgid "   Job=%s Date=%s Level=%c Type=%c\n"
+msgstr ""
+
+#: src/stored/label.c:1029
+#, c-format
+msgid "   Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n"
+msgstr ""
+
+#: src/stored/mount.c:198 src/stored/mount.c:296
+#, c-format
+msgid "Volume \"%s\" not on device %s.\n"
+msgstr ""
+
+#: src/stored/mount.c:225
+#, c-format
+msgid ""
+"Director wanted Volume \"%s\" for device %s.\n"
+"    Current Volume \"%s\" not acceptable because:\n"
+"    %s"
+msgstr ""
+
+#: src/stored/mount.c:286
+#, c-format
+msgid "Labeled new Volume \"%s\" on device %s.\n"
+msgstr ""
+
+#: src/stored/mount.c:291
+#, c-format
+msgid "Warning device %s not configured to autolabel Volumes.\n"
+msgstr ""
+
+#: src/stored/mount.c:343
+#, c-format
+msgid "Volume \"%s\" previously written, moving to end of data.\n"
+msgstr ""
+
+#: src/stored/mount.c:346
+#, c-format
+msgid "Unable to position to end of data on device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/mount.c:358
+#, c-format
+msgid "Ready to append to end of Volume \"%s\" at file=%d.\n"
+msgstr ""
+
+#: src/stored/mount.c:361
+#, c-format
+msgid ""
+"I cannot write on Volume \"%s\" because:\n"
+"The number of files mismatch! Volume=%u Catalog=%u\n"
+msgstr ""
+
+#: src/stored/mount.c:389
+#, c-format
+msgid "Ready to append to end of Volume \"%s\" at file address=%u.\n"
+msgstr ""
+
+#: src/stored/mount.c:393
+#, c-format
+msgid ""
+"I cannot write on Volume \"%s\" because:\n"
+"The EOD file address is wrong: Volume file address=%u != Catalog Endblock=%u"
+"(+1)\n"
+"You probably removed DVD last part in spool directory.\n"
+msgstr ""
+
+#: src/stored/mount.c:419
+#, c-format
+msgid "Marking Volume \"%s\" in Error in Catalog.\n"
+msgstr ""
+
+#: src/stored/mount.c:435
+#, c-format
+msgid ""
+"Autochanger Volume \"%s\" not found in slot %d.\n"
+"    Setting InChanger to zero in catalog.\n"
+msgstr ""
+
+#: src/stored/mount.c:454
+msgid "Hey!!!!! WroteVol non-zero !!!!!\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:106 src/stored/parse_bsr.c:110
+#, c-format
+msgid ""
+"Bootstrap file error: %s\n"
+"            : Line %d, col %d of file %s\n"
+"%s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:132
+#, c-format
+msgid "Cannot open bootstrap file %s: %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:262
+#, c-format
+msgid "MediaType %s in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:283
+#, c-format
+msgid "Device \"%s\" in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:440
+msgid "JobType not yet implemented\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:448
+msgid "JobLevel not yet implemented\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:631
+#, c-format
+msgid "Slot %d in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:655
+#, c-format
+msgid "VolFile     : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:663
+#, c-format
+msgid "VolBlock    : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:673
+#, c-format
+msgid "FileIndex   : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:675
+#, c-format
+msgid "FileIndex   : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:685
+#, c-format
+msgid "JobId       : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:687
+#, c-format
+msgid "JobId       : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:697
+#, c-format
+msgid "SessId      : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:699
+#, c-format
+msgid "SessId      : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:708
+#, c-format
+msgid "VolumeName  : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:709
+#, c-format
+msgid "  MediaType : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:710
+#, c-format
+msgid "  Device    : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:711
+#, c-format
+msgid "  Slot      : %d\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:720
+#, c-format
+msgid "Client      : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:728
+#, c-format
+msgid "Job          : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:736
+#, c-format
+msgid "SessTime    : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:750
+msgid "BSR is NULL\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:754
+#, c-format
+msgid "Next        : 0x%x\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:755
+#, c-format
+msgid "Root bsr    : 0x%x\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:766
+#, c-format
+msgid "count       : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:767
+#, c-format
+msgid "found       : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:770
+#, c-format
+msgid "done        : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:771
+#, c-format
+msgid "positioning : %d\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:772
+#, c-format
+msgid "fast_reject : %d\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:197
+msgid "Error in ParseTuple\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:213
+msgid "Parse tuple error in job_write\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:250
+#, c-format
+msgid "Error in Python method %s\n"
+msgstr ""
+
+#: src/stored/read.c:55
+msgid "No Volume names found for restore.\n"
+msgstr ""
+
+#: src/stored/read.c:109
+#, c-format
+msgid ">filed: Error Hdr=%s\n"
+msgstr ""
+
+#: src/stored/read.c:110 src/stored/read.c:125
+#, c-format
+msgid "Error sending to File daemon. ERR=%s\n"
+msgstr ""
+
+#: src/stored/read.c:124
+#, c-format
+msgid "Error sending to FD. ERR=%s\n"
+msgstr ""
+
+#: src/stored/read_record.c:68
+#, c-format
+msgid "End of Volume at file %u on device %s, Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/read_record.c:71
+msgid "End of all volumes.\n"
+msgstr ""
+
+#: src/stored/read_record.c:105
+#, c-format
+msgid "End of file %u  on device %s, Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/read_record.c:119
+msgid "Did fsr\n"
+msgstr ""
+
+#: src/stored/read_record.c:276
+#, c-format
+msgid "Reposition from (file:block) %u:%u to %u:%u\n"
+msgstr ""
+
+#: src/stored/read_record.c:303
+#, c-format
+msgid "Forward spacing to file:block %u:%u.\n"
+msgstr ""
+
+#: src/stored/read_record.c:329
+msgid "Begin Session"
+msgstr ""
+
+#: src/stored/read_record.c:333
+msgid "End Session"
+msgstr ""
+
+#: src/stored/read_record.c:339
+#, c-format
+msgid "Unknown code %d\n"
+msgstr ""
+
+#: src/stored/record.c:60
+#, c-format
+msgid "unknown: %d"
+msgstr ""
+
+#: src/stored/record.c:343
+msgid "Damaged buffer\n"
+msgstr ""
+
+#: src/stored/reserve.c:75
+#, c-format
+msgid "Unable to initialize reservation lock. ERR=%s\n"
+msgstr ""
+
+#: src/stored/reserve.c:496 src/stored/reserve.c:507
+#, c-format
+msgid "Failed command: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:497
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
+"Device resources.\n"
+msgstr ""
+
+#: src/stored/reserve.c:687
+#, c-format
+msgid "3926 Could not get dcr for device: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:752
+#, c-format
+msgid "3601 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:761
+#, c-format
+msgid "3602 JobId=%u device %s is busy (already reading/writing).\n"
+msgstr ""
+
+#: src/stored/reserve.c:808
+#, c-format
+msgid "3603 JobId=%u device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/reserve.c:817
+#, c-format
+msgid "3604 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:883
+#, c-format
+msgid "3605 JobId=%u wants free drive but device %s is busy.\n"
+msgstr ""
+
+#: src/stored/reserve.c:891
+#, c-format
+msgid "3606 JobId=%u wants mounted, but drive %s has no Volume.\n"
+msgstr ""
+
+#: src/stored/reserve.c:901
+#, c-format
+msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:937
+#, c-format
+msgid "3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:980
+#, c-format
+msgid "3609 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:988 src/stored/reserve.c:992
+msgid "Logic error!!!! Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:989
+#, c-format
+msgid "3910 JobId=%u Logic error!!!! drive %s Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:995
+#, c-format
+msgid "3911 JobId=%u failed reserve drive %s.\n"
+msgstr ""
+
+#: src/stored/spool.c:69
+#, c-format
+msgid ""
+"Data spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes/job.\n"
+msgstr ""
+
+#: src/stored/spool.c:75
+#, c-format
+msgid "Attr spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes.\n"
+msgstr ""
+
+#: src/stored/spool.c:91
+msgid "Spooling data ...\n"
+msgstr ""
+
+#: src/stored/spool.c:117
+#, c-format
+msgid "Bad return from despool WroteVol=%d\n"
+msgstr ""
+
+#: src/stored/spool.c:150
+#, c-format
+msgid "Open data spool file %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:199
+#, c-format
+msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n"
+msgstr ""
+
+#: src/stored/spool.c:204
+#, c-format
+msgid "Writing spooled data to Volume. Despooling %s bytes ...\n"
+msgstr ""
+
+#: src/stored/spool.c:258 src/stored/spool.c:432 src/stored/spool.c:470
+#, c-format
+msgid "Ftruncate spool file failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:260
+#, c-format
+msgid "Bad return from ftruncate. ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:309
+#, c-format
+msgid "Spool header read error. ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:312
+#, c-format
+msgid "Spool read error. Wanted %u bytes, got %d\n"
+msgstr ""
+
+#: src/stored/spool.c:313
+#, c-format
+msgid "Spool header read error. Wanted %u bytes, got %d\n"
+msgstr ""
+
+#: src/stored/spool.c:319 src/stored/spool.c:320
+#, c-format
+msgid "Spool block too big. Max %u bytes, got %u\n"
+msgstr ""
+
+#: src/stored/spool.c:325 src/stored/spool.c:326
+#, c-format
+msgid "Spool data read error. Wanted %u bytes, got %d\n"
+msgstr ""
+
+#: src/stored/spool.c:383
+msgid "User specified spool size reached.\n"
+msgstr ""
+
+#: src/stored/spool.c:385
+msgid "Bad return from despool in write_block.\n"
+msgstr ""
+
+#: src/stored/spool.c:393
+msgid "Spooling data again ...\n"
+msgstr ""
+
+#: src/stored/spool.c:424
+#, c-format
+msgid "Error writing header to spool file. ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:438 src/stored/spool.c:476
+msgid "Fatal despooling error."
+msgstr ""
+
+#: src/stored/spool.c:445
+msgid "Retrying after header spooling error failed.\n"
+msgstr ""
+
+#: src/stored/spool.c:459
+#, c-format
+msgid "Error writing data to spool file. ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:486
+msgid "Retrying after data spooling error failed.\n"
+msgstr ""
+
+#: src/stored/spool.c:541 src/stored/spool.c:548
+#, c-format
+msgid "Fseek on attributes file failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:558
+#, c-format
+msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n"
+msgstr ""
+
+#: src/stored/spool.c:585
+#, c-format
+msgid "fopen attr spool file %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/status.c:67
+#, c-format
+msgid ""
+"\n"
+"%s Version: %s (%s) %s %s %s\n"
+msgstr ""
+
+#: src/stored/status.c:103
+msgid ""
+"\n"
+"Device status:\n"
+msgstr ""
+
+#: src/stored/status.c:105
+#, c-format
+msgid "Autochanger \"%s\" with devices:\n"
+msgstr ""
+
+#: src/stored/status.c:119
+#, c-format
+msgid "Device %s is mounted with Volume=\"%s\" Pool=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:123
+#, c-format
+msgid "Device %s open but no Bacula volume is mounted.\n"
+msgstr ""
+
+#: src/stored/status.c:133
+#, c-format
+msgid "    Total Bytes=%s Blocks=%s Bytes/block=%s\n"
+msgstr ""
+
+#: src/stored/status.c:147
+#, c-format
+msgid "    Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n"
+msgstr ""
+
+#: src/stored/status.c:152
+#, c-format
+msgid "    Positioned at File=%s Block=%s\n"
+msgstr ""
+
+#: src/stored/status.c:158
+#, c-format
+msgid "Device %s is not open or does not exist.\n"
+msgstr ""
+
+#: src/stored/status.c:160
+#, c-format
+msgid "Device \"%s\" is not open or does not exist.\n"
+msgstr ""
+
+#: src/stored/status.c:165 src/stored/status.c:168 src/stored/status.c:172
+#: src/stored/status.c:174
+msgid ""
+"====\n"
+"\n"
+msgstr ""
+
+#: src/stored/status.c:166
+msgid "In Use Volume status:\n"
+msgstr ""
+
+#: src/stored/status.c:190
+msgid ""
+"No DEVICE structure.\n"
+"\n"
+msgstr ""
+
+#: src/stored/status.c:195
+msgid "    Device is BLOCKED. User unmounted.\n"
+msgstr ""
+
+#: src/stored/status.c:198
+msgid "    Device is BLOCKED. User unmounted during wait for media/mount.\n"
+msgstr ""
+
+#: src/stored/status.c:202
+#, c-format
+msgid "    Device is BLOCKED waiting for mount of volume \"%s\".\n"
+msgstr ""
+
+#: src/stored/status.c:205
+msgid "    Device is BLOCKED waiting for media.\n"
+msgstr ""
+
+#: src/stored/status.c:209
+msgid "    Device is being initialized.\n"
+msgstr ""
+
+#: src/stored/status.c:212
+msgid "    Device is blocked labeling a Volume.\n"
+msgstr ""
+
+#: src/stored/status.c:220
+#, c-format
+msgid "    Slot %d is loaded in drive %d.\n"
+msgstr ""
+
+#: src/stored/status.c:223
+#, c-format
+msgid "    Drive %d is not loaded.\n"
+msgstr ""
+
+#: src/stored/status.c:242
+msgid "Device state:\n"
+msgstr ""
+
+#: src/stored/status.c:256
+#, c-format
+msgid ""
+"num_writers=%d JobStatus=%c block=%d\n"
+"\n"
+msgstr ""
+
+#: src/stored/status.c:260
+#, c-format
+msgid "Archive name: %s Device name: %s\n"
+msgstr ""
+
+#: src/stored/status.c:262
+#, c-format
+msgid "File=%u block=%u\n"
+msgstr ""
+
+#: src/stored/status.c:263
+#, c-format
+msgid "Min block=%u Max block=%u\n"
+msgstr ""
+
+#: src/stored/status.c:280
+#, c-format
+msgid "%s Job %s waiting for Client connection.\n"
+msgstr ""
+
+#: src/stored/status.c:295
+#, c-format
+msgid ""
+"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:307
+#, c-format
+msgid ""
+"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:330
+#, c-format
+msgid "    FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n"
+msgstr ""
+
+#: src/stored/status.c:335
+msgid "    FDSocket closed\n"
+msgstr ""
+
+#: src/stored/status.c:352
+msgid ""
+"\n"
+"Jobs waiting to reserve a drive:\n"
+msgstr ""
+
+#: src/stored/status.c:380
+msgid " JobId  Level   Files          Bytes Status   Finished        Name \n"
+msgstr ""
+
+#: src/stored/status.c:514
+msgid "3900 Bad .status command, missing argument.\n"
+msgstr ""
+
+#: src/stored/status.c:537
+msgid "3900 Bad .status command, wrong argument.\n"
+msgstr ""
+
+#: src/stored/stored.c:65
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: stored [options] [-c config_file] [config_file]\n"
+"        -c <file>   use <file> as configuration file\n"
+"        -dnn        set debug level to nn\n"
+"        -f          run in foreground (for debugging)\n"
+"        -g <group>  set groupid to group\n"
+"        -p          proceed despite I/O errors\n"
+"        -s          no signals (for debugging)\n"
+"        -t          test - read config and exit\n"
+"        -u <user>   userid to <user>\n"
+"        -v          verbose user messages\n"
+"        -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/stored/stored.c:222
+msgid "Volume Session Time is ZERO!\n"
+msgstr ""
+
+#: src/stored/stored.c:235
+#, c-format
+msgid "Unable to create thread. ERR=%s\n"
+msgstr ""
+
+#: src/stored/stored.c:273
+#, c-format
+msgid "Only one Storage resource permitted in %s\n"
+msgstr ""
+
+#: src/stored/stored.c:278
+#, c-format
+msgid "No Director resource defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/stored.c:283
+#, c-format
+msgid "No Device resource defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/stored.c:291
+#, c-format
+msgid "No Messages resource defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/stored.c:318
+#, c-format
+msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"
+msgstr ""
+
+#: src/stored/stored.c:324
+#, c-format
+msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"
+msgstr ""
+
+#: src/stored/stored.c:330
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Storage \"%s\" in %s. At least one CA certificate store is required when "
+"using \"TLS Verify Peer\".\n"
+msgstr ""
+
+#: src/stored/stored.c:457
+#, c-format
+msgid "Could not initialize %s\n"
+msgstr ""
+
+#: src/stored/stored.c:470
+#, c-format
+msgid "Could not open device %s\n"
+msgstr ""
+
+#: src/stored/stored.c:483
+#, c-format
+msgid "Could not mount device %s\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:216
+#, c-format
+msgid "Expected a Device Type keyword, got: %s"
+msgstr ""
+
+#: src/stored/stored_conf.c:231
+#, c-format
+msgid "Warning: no \"%s\" resource (%d) defined.\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:234
+#, c-format
+msgid "dump_resource type=%d\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:350
+#, c-format
+msgid "Warning: unknown resource type %d\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:539
+#, c-format
+msgid "\"%s\" item is required in \"%s\" resource, but not found.\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:545
+#, c-format
+msgid "Too many items in \"%s\" resource\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:579
+#, c-format
+msgid "Cannot find AutoChanger resource %s\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:650
+#, c-format
+msgid ""
+"Attempt to define second \"%s\" resource named \"%s\" is not permitted.\n"
+msgstr ""
+
+#: src/stored/wait.c:114
+#, c-format
+msgid "pthread timedwait error. ERR=%s\n"
+msgstr ""
+
+#: src/stored/wait.c:199
+#, c-format
+msgid "Job %s waiting to reserve a device.\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:85
+#, c-format
+msgid "Fatal malformed reply from %s: %s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:121
+#, c-format
+msgid ""
+"\n"
+"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n"
+"       -c          set the Cc: field\n"
+"       -dnn        set debug level to nn\n"
+"       -f          set the From: field\n"
+"       -h          use mailhost:port as the SMTP server\n"
+"       -s          set the Subject: field\n"
+"       -r          set the Reply-To: field\n"
+"       -l          set the maximum number of lines that should be sent "
+"(default: unlimited)\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:213
+msgid "Fatal error: no recipient given.\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:234
+#, c-format
+msgid "Fatal gethostname error: ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:238
+#, c-format
+msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:263
+#, c-format
+msgid "Error unknown mail host \"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:266
+msgid "Retrying connection using \"localhost\".\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:274
+#, c-format
+msgid "Fatal error: Unknown address family for smtp host: %d\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:282
+#, c-format
+msgid "Fatal socket error: ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:286
+#, c-format
+msgid "Fatal connect error to %s: ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:291
+#, c-format
+msgid "Fatal dup error: ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:295 src/tools/bsmtp.c:299
+#, c-format
+msgid "Fatal fdopen error: ERR=%s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:158
+msgid ""
+"Warning skipping the additional parameters for working directory/dbname/user/"
+"password/host.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:174
+#, c-format
+msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:176
+#, c-format
+msgid "Error there is no Catalog section in the given config file [%s]\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:185
+msgid "Error no Director resource defined.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:199
+msgid "Wrong number of arguments.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:204
+msgid "Working directory not supplied.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:269
+#, c-format
+msgid "Hello, this is the database check/correct program.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:271
+#, c-format
+msgid "Modify database is on."
+msgstr ""
+
+#: src/tools/dbcheck.c:273
+#, c-format
+msgid "Modify database is off."
+msgstr ""
+
+#: src/tools/dbcheck.c:275 src/tools/dbcheck.c:336
+#, c-format
+msgid " Verbose is on.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:277 src/tools/dbcheck.c:338
+#, c-format
+msgid " Verbose is off.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:279
+#, c-format
+msgid "Please select the fuction you want to perform.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:283
+#, c-format
+msgid ""
+"\n"
+"     1) Toggle modify database flag\n"
+"     2) Toggle verbose flag\n"
+"     3) Repair bad Filename records\n"
+"     4) Repair bad Path records\n"
+"     5) Eliminate duplicate Filename records\n"
+"     6) Eliminate duplicate Path records\n"
+"     7) Eliminate orphaned Jobmedia records\n"
+"     8) Eliminate orphaned File records\n"
+"     9) Eliminate orphaned Path records\n"
+"    10) Eliminate orphaned Filename records\n"
+"    11) Eliminate orphaned FileSet records\n"
+"    12) Eliminate orphaned Client records\n"
+"    13) Eliminate orphaned Job records\n"
+"    14) Eliminate all Admin records\n"
+"    15) Eliminate all Restore records\n"
+"    16) All (3-15)\n"
+"    17) Quit\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:302
+#, c-format
+msgid ""
+"\n"
+"     1) Toggle modify database flag\n"
+"     2) Toggle verbose flag\n"
+"     3) Check for bad Filename records\n"
+"     4) Check for bad Path records\n"
+"     5) Check for duplicate Filename records\n"
+"     6) Check for duplicate Path records\n"
+"     7) Check for orphaned Jobmedia records\n"
+"     8) Check for orphaned File records\n"
+"     9) Check for orphaned Path records\n"
+"    10) Check for orphaned Filename records\n"
+"    11) Check for orphaned FileSet records\n"
+"    12) Check for orphaned Client records\n"
+"    13) Check for orphaned Job records\n"
+"    14) Check for all Admin records\n"
+"    15) Check for all Restore records\n"
+"    16) All (3-15)\n"
+"    17) Quit\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:322
+msgid "Select function number: "
+msgstr ""
+
+#: src/tools/dbcheck.c:329
+#, c-format
+msgid "Database will be modified.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:331
+#, c-format
+msgid "Database will NOT be modified.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:421
+#, c-format
+msgid "JobId=%s Name=\"%s\" StartTime=%s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:429
+#, c-format
+msgid "Orphaned JobMediaId=%s JobId=%s Volume=\"%s\"\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:436
+#, c-format
+msgid "Orphaned FileId=%s JobId=%s Volume=\"%s\"\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:443
+#, c-format
+msgid "Orphaned FileSetId=%s FileSet=\"%s\" MD5=%s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:450
+#, c-format
+msgid "Orphaned ClientId=%s Name=\"%s\"\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:503
+#, c-format
+msgid "Deleting: %s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:577
+#, c-format
+msgid "Checking for duplicate Filename entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:586
+#, c-format
+msgid "Found %d duplicate Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:587
+msgid "Print the list? (yes/no): "
+msgstr ""
+
+#: src/tools/dbcheck.c:603 src/tools/dbcheck.c:657
+#, c-format
+msgid "Found %d for: %s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:630
+#, c-format
+msgid "Checking for duplicate Path entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:640
+#, c-format
+msgid "Found %d duplicate Path records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:641 src/tools/dbcheck.c:691 src/tools/dbcheck.c:723
+#: src/tools/dbcheck.c:755 src/tools/dbcheck.c:783 src/tools/dbcheck.c:811
+#: src/tools/dbcheck.c:849 src/tools/dbcheck.c:887 src/tools/dbcheck.c:918
+#: src/tools/dbcheck.c:948 src/tools/dbcheck.c:982 src/tools/dbcheck.c:1040
+msgid "Print them? (yes/no): "
+msgstr ""
+
+#: src/tools/dbcheck.c:683
+#, c-format
+msgid "Checking for orphaned JobMedia entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:690
+#, c-format
+msgid "Found %d orphaned JobMedia records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:703
+#, c-format
+msgid "Deleting %d orphaned JobMedia records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:712
+#, c-format
+msgid "Checking for orphaned File entries. This may take some time!\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:722
+#, c-format
+msgid "Found %d orphaned File records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:735
+#, c-format
+msgid "Deleting %d orphaned File records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:744
+#, c-format
+msgid "Checking for orphaned Path entries. This may take some time!\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:754
+#, c-format
+msgid "Found %d orphaned Path records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:763
+#, c-format
+msgid "Deleting %d orphaned Path records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:772
+#, c-format
+msgid "Checking for orphaned Filename entries. This may take some time!\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:782
+#, c-format
+msgid "Found %d orphaned Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:791
+#, c-format
+msgid "Deleting %d orphaned Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:800
+#, c-format
+msgid "Checking for orphaned FileSet entries. This takes some time!\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:810
+#, c-format
+msgid "Found %d orphaned FileSet records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:822
+#, c-format
+msgid "Deleting %d orphaned FileSet records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:831
+#, c-format
+msgid "Checking for orphaned Client entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:848
+#, c-format
+msgid "Found %d orphaned Client records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:860
+#, c-format
+msgid "Deleting %d orphaned Client records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:869
+#, c-format
+msgid "Checking for orphaned Job entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:886
+#, c-format
+msgid "Found %d orphaned Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:898
+#, c-format
+msgid "Deleting %d orphaned Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:908
+#, c-format
+msgid "Checking for Admin Job entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:917
+#, c-format
+msgid "Found %d Admin Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:929
+#, c-format
+msgid "Deleting %d Admin Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:938
+#, c-format
+msgid "Checking for Restore Job entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:947
+#, c-format
+msgid "Found %d Restore Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:959
+#, c-format
+msgid "Deleting %d Restore Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:972
+#, c-format
+msgid "Checking for Filenames with a trailing slash\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:981
+#, c-format
+msgid "Found %d bad Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:995 src/tools/dbcheck.c:1053
+#, c-format
+msgid "Reparing %d bad Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:1030
+#, c-format
+msgid "Checking for Paths without a trailing slash\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:1039
+#, c-format
+msgid "Found %d bad Path records.\n"
+msgstr ""
+
+#: src/tools/fstype.c:34
+#, c-format
+msgid ""
+"\n"
+"Usage: fstype [-d debug_level] path ...\n"
+"\n"
+"       Print the file system type a given file/directory is on.\n"
+"       The following options are supported:\n"
+"\n"
+"       -v     print both path and file system type.\n"
+"       -?     print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tools/fstype.c:86
+#, c-format
+msgid "%s: unknown\n"
+msgstr ""
+
+#: src/tools/testfind.c:49
+#, c-format
+msgid ""
+"\n"
+"Usage: testfind [-d debug_level] [-] [pattern1 ...]\n"
+"       -a          print extended attributes (Win32 debug)\n"
+"       -dnn        set debug level to nn\n"
+"       -e          specify file of exclude patterns\n"
+"       -i          specify file of include patterns\n"
+"       -           read pattern(s) from stdin\n"
+"       -?          print this message.\n"
+"\n"
+"Patterns are used for file inclusion -- normally directories.\n"
+"Debug level >= 1 prints each file found.\n"
+"Debug level >= 10 prints path/file for catalog.\n"
+"Errors are always printed.\n"
+"Files/paths truncated is the number of files/paths with len > 255.\n"
+"Truncation is only in the catalog.\n"
+"\n"
+msgstr ""
+
+#: src/tools/testfind.c:134 src/tools/testls.c:130
+#, c-format
+msgid "Could not open include file: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:147 src/tools/testls.c:143
+#, c-format
+msgid "Could not open exclude file: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:160
+#, c-format
+msgid ""
+"Total files    : %d\n"
+"Max file length: %d\n"
+"Max path length: %d\n"
+"Files truncated: %d\n"
+"Paths truncated: %d\n"
+"Hard links     : %d\n"
+msgstr ""
+
+#: src/tools/testfind.c:199
+#, c-format
+msgid "Reg: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:220
+msgid "\t[will not descend: recursion turned off]"
+msgstr ""
+
+#: src/tools/testfind.c:222
+msgid "\t[will not descend: file system change not allowed]"
+msgstr ""
+
+#: src/tools/testfind.c:224
+msgid "\t[will not descend: disallowed file system]"
+msgstr ""
+
+#: src/tools/testfind.c:240 src/tools/testls.c:178
+#, c-format
+msgid "Err: Could not access %s: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:243 src/tools/testls.c:181
+#, c-format
+msgid "Err: Could not follow ff->link %s: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:246 src/tools/testls.c:184
+#, c-format
+msgid "Err: Could not stat %s: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:249 src/tools/testls.c:187
+#, c-format
+msgid "Skip: File not saved. No change. %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:252 src/tools/testls.c:190
+#, c-format
+msgid "Err: Attempt to backup archive. Not saved. %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:255 src/tools/testls.c:199
+#, c-format
+msgid "Err: Could not open directory %s: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:258 src/tools/testls.c:202
+#, c-format
+msgid "Err: Unknown file ff->type %d: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:308
+#, c-format
+msgid "===== Filename truncated to 255 chars: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:325
+#, c-format
+msgid "========== Path name truncated to 255 chars: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:334
+#, c-format
+msgid "========== Path length is zero. File=%s\n"
+msgstr ""
+
+#: src/tools/testfind.c:337
+#, c-format
+msgid "Path: %s\n"
+msgstr ""
+
+#: src/tools/testls.c:45
+#, c-format
+msgid ""
+"\n"
+"Usage: testls [-d debug_level] [-] [pattern1 ...]\n"
+"       -a          print extended attributes (Win32 debug)\n"
+"       -dnn        set debug level to nn\n"
+"       -e          specify file of exclude patterns\n"
+"       -i          specify file of include patterns\n"
+"       -           read pattern(s) from stdin\n"
+"       -?          print this message.\n"
+"\n"
+"Patterns are file inclusion -- normally directories.\n"
+"Debug level >= 1 prints each file found.\n"
+"Debug level >= 10 prints path/file for catalog.\n"
+"Errors always printed.\n"
+"Files/paths truncated is number with len > 255.\n"
+"Truncation is only in catalog.\n"
+"\n"
+msgstr ""
+
+#: src/tools/testls.c:193
+#, c-format
+msgid "Recursion turned off. Directory not entered. %s\n"
+msgstr ""
+
+#: src/tools/testls.c:196
+#, c-format
+msgid "Skip: File system change prohibited. Directory not entered. %s\n"
+msgstr ""
+
+#: src/tools/bwild.c:105 src/tools/bregex.c:121
+#, c-format
+msgid "Could not open data file: %s\n"
+msgstr ""
+
+#: src/tray-monitor/authenticate.c:78
+msgid ""
+"Director authorization problem.\n"
+"Most likely the passwords do not agree.\n"
+"Please see http://www.bacula.org/html-manual/faq.html#AuthorizationErrors "
+"for help.\n"
+msgstr ""
+
+#: src/tray-monitor/authenticate.c:127
+msgid ""
+"Director and Storage daemon passwords or names not the same.\n"
+"Please see http://www.bacula.org/html-manual/faq.html#AuthorizationErrors "
+"for help.\n"
+msgstr ""
+
+#: src/tray-monitor/authenticate.c:172
+msgid ""
+"Director and File daemon passwords or names not the same.\n"
+"Please see http://www.bacula.org/html-manual/faq.html#AuthorizationErrors "
+"for help.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:102
+#, c-format
+msgid ""
+"Copyright (C) 2000-2004 Kern Sibbald and John Walker\n"
+"Written by Nicolas Boichat (2004)\n"
+"\n"
+"Version: %s (%s) %s %s %s\n"
+"\n"
+"Usage: tray-monitor [-c config_file] [-d debug_level]\n"
+"       -c <file>     set configuration file to file\n"
+"       -dnn          set debug level to nn\n"
+"       -t            test - read configuration and exit\n"
+"       -?            print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:251
+#, c-format
+msgid ""
+"Error: %d Monitor resource defined in %s. You must define one and only one "
+"Monitor resource.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:282
+#, c-format
+msgid ""
+"No Client, Storage nor Director resource defined in %s\n"
+"Without that I don't how to get status from the File, Storage or Director "
+"Daemon :-(\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:304
+#, c-format
+msgid ""
+"Invalid refresh interval defined in %s\n"
+"This value must be greater or equal to 1 second and less or equal to 10 "
+"minutes (read value: %d).\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:319
+msgid "Open status window..."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:325
+msgid "Exit"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:337
+msgid "Bacula tray monitor"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:362
+msgid " (DIR)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:366
+msgid " (FD)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:370
+msgid " (SD)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:383
+msgid "Unknown status."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:424
+msgid "Refresh interval in seconds: "
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:432
+msgid "Refresh now"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:436
+msgid "About"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:440
+msgid "Close"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:460
+#, c-format
+msgid "Disconnecting from Director %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:463
+#, c-format
+msgid "Disconnecting from Client %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:466
+#, c-format
+msgid "Disconnecting from Storage %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:502 src/tray-monitor/tray-monitor.c:512
+msgid "Bacula Tray Monitor"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:503 src/tray-monitor/tray-monitor.c:513
+msgid ""
+"Copyright (C) 2004-2005 Kern Sibbald\n"
+"Written by Nicolas Boichat\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:505 src/tray-monitor/tray-monitor.c:515
+msgid "Version:"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:583
+#, c-format
+msgid "Error, currentitem is not a Client or a Storage..\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:656
+#, c-format
+msgid ""
+"Current job: %s\n"
+"Last job: %s"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:668
+#, c-format
+msgid " (%d errors)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:671
+#, c-format
+msgid " (%d error)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:708
+msgid "No current job."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:711
+msgid "No last job."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:719
+msgid "Job status: Created"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:724
+msgid "Job status: Running"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:728
+msgid "Job status: Blocked"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:733
+msgid "Job status: Terminated"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:738
+msgid "Job status: Terminated in error"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:744
+msgid "Job status: Error"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:748
+msgid "Job status: Fatal error"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:753
+msgid "Job status: Verify differences"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:758
+msgid "Job status: Canceled"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:763
+msgid "Job status: Waiting on File daemon"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:768
+msgid "Job status: Waiting on the Storage daemon"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:773
+msgid "Job status: Waiting for new media"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:778
+msgid "Job status: Waiting for Mount"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:783
+msgid "Job status: Waiting for storage resource"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:788
+msgid "Job status: Waiting for job resource"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:793
+msgid "Job status: Waiting for Client resource"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:798
+msgid "Job status: Waiting for maximum jobs"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:803
+msgid "Job status: Waiting for start time"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:808
+msgid "Job status: Waiting for higher priority jobs to finish"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:813
+#, c-format
+msgid "Unknown job status %c."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:814
+#, c-format
+msgid "Job status: Unknown(%c)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:821
+#, c-format
+msgid "Bad scan : '%s' %d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:859
+#, c-format
+msgid "Connecting to Director %s:%d"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:865
+#, c-format
+msgid "Connecting to Client %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:866
+#, c-format
+msgid "Connecting to Client %s:%d"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:872
+#, c-format
+msgid "Connecting to Storage %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:873
+#, c-format
+msgid "Connecting to Storage %s:%d"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:878 src/tray-monitor/tray-monitor.c:916
+#, c-format
+msgid "Error, currentitem is not a Client, a Storage or a Director..\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:884
+msgid "Cannot connect to daemon.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:885
+msgid "Cannot connect to daemon."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:897
+#, c-format
+msgid "Authentication error : %s"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:904
+msgid "Opened connection with Director daemon.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:905
+msgid "Opened connection with Director daemon."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:908
+msgid "Opened connection with File daemon.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:909
+msgid "Opened connection with File daemon."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:912
+msgid "Opened connection with Storage daemon.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:913
+msgid "Opened connection with Storage daemon."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:948
+msgid "<< Error: BNET_PROMPT signal received. >>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:465
+msgid "<< Heartbeat signal received, answered. >>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:957
+#, c-format
+msgid "<< Unexpected signal received : %s >>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:962
+msgid "<ERROR>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:966
+msgid "Error : BNET_HARDEOF or BNET_ERROR"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:972
+msgid "<STOP>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:976
+msgid "Error : Connection closed."
+msgstr ""
+
+#: src/tray-monitor/tray_conf.c:161
+#, c-format
+msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n"
+msgstr ""
+
+#: src/tray-monitor/tray_conf.c:167
+#, c-format
+msgid "Director: name=%s address=%s FDport=%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray_conf.c:171
+#, c-format
+msgid "Client: name=%s address=%s FDport=%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray_conf.c:175
+#, c-format
+msgid "Storage: name=%s address=%s SDport=%d\n"
+msgstr ""
+
+#: src/wx-console/authenticate.c:129
+msgid "Bad response to Hello command: ERR="
+msgstr ""
+
+#: src/baconfig.h:55
+#, c-format
+msgid "Failed ASSERT: %s\n"
+msgstr ""
+
+#: src/baconfig.h:62
+msgid "*None*"
+msgstr ""
+
+#: src/filed/win32/winmain.cpp:228 src/filed/win32/winmain.cpp:236
+msgid "Bacula Usage"
+msgstr ""
+
+#: src/filed/win32/winmain.cpp:233
+msgid "Bad Command Line Options"
+msgstr ""
+
+#: src/filed/win32/winmain.cpp:326
+msgid "Another instance of Bacula is already running"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:131 src/filed/win32/winservice.cpp:145
+msgid "No existing instance of Bacula could be contacted"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:218
+msgid "KERNEL32.DLL not found: Bacula service not started"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:228
+msgid "Registry service not found: Bacula service not started"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:230
+msgid "Registry service not found"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:260
+msgid "StartServiceCtrlDispatcher failed."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:278
+msgid "RegisterServiceCtlHandler failed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:279
+msgid "Contact Register Service Handler failure"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:295
+msgid "ReportStatus STOPPED failed 1"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:318
+msgid "Report Service failure"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:355
+msgid "Unable to install Bacula service"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:373
+msgid "Service command length too long"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:374
+msgid "Service command length too long. Service not registered."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:389
+msgid "Cannot write System Registry"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:390
+msgid ""
+"The System Registry could not be updated - the Bacula service was not "
+"installed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:397
+msgid "Cannot add Bacula key to System Registry"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:398 src/filed/win32/winservice.cpp:449
+msgid "The Bacula service could not be installed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:406
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started by double clicking on the\n"
+"Bacula \"Start\" icon and will be automatically\n"
+"be run the next time this machine is rebooted. "
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:424
+msgid ""
+"The Service Control Manager could not be contacted - the Bacula service was "
+"not installed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:455
+msgid ""
+"Provides file backup and restore services. Bacula -- the network backup "
+"solution."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:462
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started from the Control Panel and will\n"
+"automatically be run the next time this machine is rebooted."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:471
+msgid ""
+"Unknown Windows operating system.\n"
+"Cannot install Bacula service.\n"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:496
+msgid ""
+"Could not find registry entry.\n"
+"Service probably not registerd - the Bacula service was not removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:501
+msgid ""
+"Could not delete Registry key.\n"
+"The Bacula service could not be removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:511
+msgid "Bacula could not be contacted, probably not running"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:517 src/filed/win32/winservice.cpp:553
+msgid "The Bacula service has been removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:547
+msgid "The Bacula service could not be stopped"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:555
+msgid "The Bacula service could not be removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:560
+msgid "The Bacula service could not be found"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:565
+msgid "The SCM could not be contacted - the Bacula service was not removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:629
+msgid "SetServiceStatus failed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:657
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s error: %ld at %s:%d"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:732
+#, c-format
+msgid "Locked by: %s, duration: %ld seconds\n"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:736
+#, c-format
+msgid "No longer locked\n"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:740
+msgid "Could not lock database"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:101
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Director \"%s\" in config file.\n"
+"At least one CA certificate store is required.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:108
+msgid ""
+"No Director resource defined in config file.\n"
+"Without that I don't how to speak to the Director :-(\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:127
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Console \"%s\" in config file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:148
+msgid "Error while initializing windows sockets...\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:163
+msgid "Error while cleaning up windows sockets...\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:201
+msgid "Error while initializing library."
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:227
+msgid "Cryptographic library initialization failed.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:231
+msgid "Please correct configuration file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:273
+msgid "Error : Library not initialized\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:284
+msgid "Error : No configuration file loaded\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:294
+msgid "Connecting...\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:310
+msgid "Error : No director defined in config file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:322
+msgid "Multiple directors found in your config file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:331
+#, c-format
+msgid "Please choose a director (1-%d): "
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:403
+msgid "Failed to connect to the director\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:413
+msgid "Connected\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:470
+msgid "<< Unexpected signal received : "
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:490
+msgid "Connection terminated\n"
+msgstr ""
+
+#: src/wx-console/main.cpp:101
+msgid "Bacula wx-console"
+msgstr ""
+
+#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
+#, c-format
+msgid "Welcome to bacula wx-console %s (%s)!\n"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:44
+msgid "Config file editor"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:54
+msgid "# Bacula wx-console Configuration File\n"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:90
+msgid "Save and close"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:91
+msgid "Close without saving"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:118
+#, c-format
+msgid "Unable to write to %s\n"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:119
+msgid "Error while saving"
+msgstr ""
+
+#: src/wx-console/wxbconfigpanel.cpp:184
+msgid "Apply"
+msgstr ""
+
+#: src/wx-console/wxbhistorytextctrl.cpp:61
+#: src/wx-console/wxbhistorytextctrl.cpp:132
+#: src/wx-console/wxbmainframe.cpp:272
+msgid "Type your command below:"
+msgstr ""
+
+#: src/wx-console/wxbhistorytextctrl.cpp:96
+msgid "Unknown command."
+msgstr ""
+
+#: src/wx-console/wxbhistorytextctrl.cpp:105
+msgid "Possible completions: "
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "&About...\tF1"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "Show about dialog"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:598
+msgid "Connect to the director"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect of the director"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change of configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change your default configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:233
+msgid "Edit your configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "E&xit\tAlt-X"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "Quit this program"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:239
+msgid "&File"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:240
+msgid "&Help"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:257
+msgid "Console"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:264
+msgid ""
+"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:268
+msgid ""
+"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
+"support when handling non-ASCII filenames: Every non-ASCII character in such "
+"filenames will be replaced by an interrogation mark.\n"
+"If this behaviour disturbs you, please build wx-console against a Unicode "
+"version of wxWidgets for GTK+ 2.0.\n"
+"---\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:279
+msgid "Send"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
+msgid "Error while parsing command line arguments, using defaults.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
+msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:397
+#, c-format
+msgid ""
+"It seems that it is the first time you run wx-console.\n"
+"This file (%s) has been choosen as default configuration file.\n"
+"Do you want to edit it? (if you click No you will have to select another "
+"file)"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:399
+msgid "First run"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:416
+#, c-format
+msgid ""
+"Unable to read %s\n"
+"Error: %s\n"
+"Do you want to choose another one? (Press no to edit this file)"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:418
+msgid "Unable to read configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:430
+msgid "Please choose a configuration file to use"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:443
+msgid "This configuration file has been successfully read, use it as default?"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:444
+msgid "Configuration file read successfully"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:454
+#, c-format
+msgid "Using this configuration file: %s\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:459
+msgid "Connecting to the director..."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:474
+msgid "Failed to unregister a data parser !"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:482
+msgid "Quitting.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:497
+msgid ""
+"Welcome to Bacula wx-console.\n"
+"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
+"(C) 2005 Kern Sibbald\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:499
+msgid "About Bacula wx-console"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:505
+msgid "Please choose your default configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:509
+msgid "Use this configuration file as default?"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:510
+msgid "Configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:581
+msgid "Console thread terminated."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:589
+msgid "Connection to the director lost. Quit program?"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:590
+msgid "Connection lost"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:606
+msgid "Connected to the director."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:629
+msgid "Reconnect"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:630
+msgid "Reconnect to the director"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:644
+msgid "Disconnected of the director."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:663 src/wx-console/wxbrestorepanel.cpp:689
+msgid "Unexpected question has been received.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:686 src/wx-console/wxbmainframe.cpp:703
+msgid "wx-console: unexpected director's question."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:216
+#: src/wx-console/wxbrestorepanel.cpp:1895
+#: src/wx-console/wxbrestorepanel.cpp:1924
+msgid "Enter restore mode"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:219
+msgid "Cancel restore"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:245
+#: src/wx-console/wxbrestorepanel.cpp:299
+msgid "Add"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:247
+#: src/wx-console/wxbrestorepanel.cpp:301
+msgid "Remove"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:249
+#: src/wx-console/wxbrestorepanel.cpp:303
+msgid "Refresh"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:268
+msgid "M"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:272
+msgid "Filename"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:284
+msgid "Perm."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:317
+#: src/wx-console/wxbrestorepanel.cpp:330
+#: src/wx-console/wxbrestorepanel.cpp:482
+#: src/wx-console/wxbrestorepanel.cpp:492
+#: src/wx-console/wxbrestorepanel.cpp:495
+#: src/wx-console/wxbrestorepanel.cpp:1760
+#: src/wx-console/wxbrestorepanel.cpp:1846
+msgid "Job Name"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:319
+#: src/wx-console/wxbrestorepanel.cpp:335
+#: src/wx-console/wxbrestorepanel.cpp:434
+#: src/wx-console/wxbrestorepanel.cpp:435
+#: src/wx-console/wxbrestorepanel.cpp:445
+#: src/wx-console/wxbrestorepanel.cpp:446
+#: src/wx-console/wxbrestorepanel.cpp:1118
+#: src/wx-console/wxbrestorepanel.cpp:1191
+#: src/wx-console/wxbrestorepanel.cpp:1798
+#: src/wx-console/wxbrestorepanel.cpp:1800
+#: src/wx-console/wxbrestorepanel.cpp:1861
+msgid "Fileset"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:322
+#: src/wx-console/wxbrestorepanel.cpp:1185
+#: src/wx-console/wxbrestorepanel.cpp:1201
+#: src/wx-console/wxbrestorepanel.cpp:1203
+#: src/wx-console/wxbrestorepanel.cpp:1211
+#: src/wx-console/wxbrestorepanel.cpp:1213
+#: src/wx-console/wxbrestorepanel.cpp:1232
+#: src/wx-console/wxbrestorepanel.cpp:1239
+#: src/wx-console/wxbrestorepanel.cpp:1788
+#: src/wx-console/wxbrestorepanel.cpp:1799
+#: src/wx-console/wxbrestorepanel.cpp:1919
+msgid "Before"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:324
+msgid "Please configure parameters concerning files to restore :"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1854
+msgid "always"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if newer"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if older"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1857
+msgid "never"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:341
+msgid "Please configure parameters concerning files restoration :"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:406
+msgid "Getting parameters list."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:414
+msgid "Error : no clients returned by the director."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:438
+msgid "Error : no filesets returned by the director."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:462
+msgid "Error : no storage returned by the director."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:485
+#: src/wx-console/wxbrestorepanel.cpp:509
+msgid "Error : no jobs returned by the director."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:495
+msgid "RestoreFiles"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:530
+msgid "Please configure your restore parameters."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:541
+msgid "Building restore tree..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:584
+msgid "Error while starting restore: "
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:674
+msgid ""
+"Right click on a file or on a directory, or double-click on its mark to add "
+"it to the restore list."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:711
+#: src/wx-console/wxbrestorepanel.cpp:733
+msgid "wx-console: unexpected restore question."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:744
+msgid " files selected to be restored."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:749
+msgid " file selected to be restored."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:756
+#, c-format
+msgid "Please configure your restore (%ld files selected to be restored)..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:766
+msgid "Restore failed : no file selected.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:767
+msgid "Restore failed : no file selected."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:777
+msgid "Restoring, please wait..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:790
+msgid "Job started. JobId="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:792
+msgid "Restore started, jobid="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:796
+msgid "Job failed."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:797
+msgid "Restore failed, please look at messages.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:798
+msgid "Restore failed, please look at messages in console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:804
+#: src/wx-console/wxbrestorepanel.cpp:805
+msgid "Failed to retrieve jobid.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:831
+msgid ""
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:832
+msgid ""
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:858
+msgid "Restore job created, but not yet running."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:863
+#, c-format
+msgid "Restore job running, please wait (%ld of %ld files restored)..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:867
+msgid "Restore job terminated successfully."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:868
+msgid "Restore job terminated successfully.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:873
+msgid "Restore job terminated in error, see messages in console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:874
+msgid "Restore job terminated in error, see messages.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:879
+msgid "Restore job reported a non-fatal error."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:883
+msgid "Restore job reported a fatal error."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:888
+msgid "Restore job cancelled by user."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:889
+msgid "Restore job cancelled by user.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:894
+msgid "Restore job is waiting on File daemon."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:898
+msgid "Restore job is waiting for new media."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:902
+msgid "Restore job is waiting for storage resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:906
+msgid "Restore job is waiting for job resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:910
+msgid "Restore job is waiting for Client resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:914
+msgid "Restore job is waiting for maximum jobs."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:918
+msgid "Restore job is waiting for start time."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:922
+msgid "Restore job is waiting for higher priority jobs to finish."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:971
+msgid ""
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:972
+msgid ""
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:982
+msgid "Restore done successfully.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:983
+msgid "Restore done successfully."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1054
+msgid "Applying restore configuration changes..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1105
+msgid "Failed to find the selected client."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1120
+msgid "Failed to find the selected fileset."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1135
+msgid "Failed to find the selected storage."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1152
+#: src/wx-console/wxbrestorepanel.cpp:1835
+msgid "Run Restore job"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1168
+msgid "Restore configuration changes were applied."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1177
+msgid "Restore cancelled.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1178
+msgid "Restore cancelled."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1200
+msgid "No results to list."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1202
+msgid "No backup found for this client."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1209
+msgid "ERROR"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1210
+msgid "Query failed"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1212
+msgid "Cannot get previous backups list, see console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1845
+msgid "JobName:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1849
+msgid "Where:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1852
+msgid "Replace:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1855
+msgid "ifnewer"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1856
+msgid "ifolder"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1860
+msgid "FileSet:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1976
+msgid "Restoring..."
+msgstr ""
diff --git a/bacula/po/es_AR.po b/bacula/po/es_AR.po
new file mode 100644 (file)
index 0000000..538cb4b
--- /dev/null
@@ -0,0 +1,14465 @@
+# Spanish translations for branch package
+# Traducciones al español para el paquete branch.
+# Copyright (C) 2006 Kern Sibbald
+# This file is distributed under the same license as the branch package.
+#  <kern@sibbald.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: branch 1.38\n"
+"Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2006-02-26 13:10+0100\n"
+"PO-Revision-Date: 2006-04-13 08:15+0200\n"
+"Last-Translator:  <kern@sibbald.com>\n"
+"Language-Team: Spanish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/cats/bdb.c:128
+msgid "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
+msgstr ""
+
+#: src/cats/bdb.c:129
+msgid "WARNING!!!! The Internal Database is NOT OPERATIONAL!\n"
+msgstr ""
+
+#: src/cats/bdb.c:130
+msgid "You should use SQLite, PostgreSQL, or MySQL\n"
+msgstr ""
+
+#: src/cats/bdb.c:152 src/cats/mysql.c:124 src/cats/postgresql.c:128
+#: src/cats/sqlite.c:122
+#, c-format
+msgid "Unable to initialize DB lock. ERR=%s\n"
+msgstr ""
+
+#: src/cats/bdb.c:162
+#, c-format
+msgid "Unable to open Catalog DB control file %s: ERR=%s\n"
+msgstr ""
+
+#: src/cats/bdb.c:217
+#, c-format
+msgid "Error reading catalog DB control file. ERR=%s\n"
+msgstr ""
+
+#: src/cats/bdb.c:220
+#, c-format
+msgid ""
+"Error, catalog DB control file wrong version. Wanted %d, got %d\n"
+"Please reinitialize the working directory.\n"
+msgstr ""
+
+#: src/cats/bdb_update.c:83 src/cats/bdb_update.c:114
+#, c-format
+msgid "Error updating DB Job file. ERR=%s\n"
+msgstr ""
+
+#: src/cats/bdb_update.c:153 src/cats/bdb_update.c:189
+#, c-format
+msgid "Error updating DB Media file. ERR=%s\n"
+msgstr ""
+
+#: src/cats/mysql.c:60
+msgid "A user name for MySQL must be supplied.\n"
+msgstr ""
+
+#: src/cats/mysql.c:161
+#, c-format
+msgid ""
+"Unable to connect to MySQL server. \n"
+"Database=%s User=%s\n"
+"It is probably not running or your password is incorrect.\n"
+msgstr ""
+
+#: src/cats/mysql.c:320 src/cats/postgresql.c:264 src/cats/sqlite.c:323
+#, c-format
+msgid "Query failed: %s: ERR=%s\n"
+msgstr ""
+
+#: src/cats/postgresql.c:62
+msgid "A user name for PostgreSQL must be supplied.\n"
+msgstr ""
+
+#: src/cats/postgresql.c:165
+#, c-format
+msgid ""
+"Unable to connect to PostgreSQL server.\n"
+"Database=%s User=%s\n"
+"It is probably not running or your password is incorrect.\n"
+msgstr ""
+
+#: src/cats/postgresql.c:506
+#, c-format
+msgid "error fetching currval: %s\n"
+msgstr ""
+
+#: src/cats/sql.c:96
+#, c-format
+msgid ""
+"query %s failed:\n"
+"%s\n"
+msgstr ""
+
+#: src/cats/sql.c:118
+#, c-format
+msgid ""
+"insert %s failed:\n"
+"%s\n"
+msgstr ""
+
+#: src/cats/sql.c:132
+#, c-format
+msgid "Insertion problem: affected_rows=%s\n"
+msgstr ""
+
+#: src/cats/sql.c:152
+#, c-format
+msgid ""
+"update %s failed:\n"
+"%s\n"
+msgstr ""
+
+#: src/cats/sql.c:162
+#, c-format
+msgid "Update problem: affected_rows=%s\n"
+msgstr ""
+
+#: src/cats/sql.c:183
+#, c-format
+msgid ""
+"delete %s failed:\n"
+"%s\n"
+msgstr ""
+
+#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:773
+#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:564
+#: src/cats/sql_get.c:639 src/cats/sql_get.c:866
+#, c-format
+msgid "error fetching row: %s\n"
+msgstr ""
+
+#: src/cats/sql.c:326 src/dird/catreq.c:369 src/dird/catreq.c:401
+#: src/dird/catreq.c:426
+#, c-format
+msgid "Attribute create error. %s"
+msgstr ""
+
+#: src/cats/sql.c:407
+#, c-format
+msgid "Path length is zero. File=%s\n"
+msgstr ""
+
+#: src/cats/sql.c:451
+msgid "No results to list.\n"
+msgstr ""
+
+#: src/cats/sql_create.c:86
+#, c-format
+msgid "Create DB Job record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:132
+#, c-format
+msgid "Create JobMedia record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:141
+#, c-format
+msgid "Update Media record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:171
+#, c-format
+msgid "pool record %s already exists\n"
+msgstr ""
+
+#: src/cats/sql_create.c:197
+#, c-format
+msgid "Create db Pool record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:228
+#, c-format
+msgid "Device record %s already exists\n"
+msgstr ""
+
+#: src/cats/sql_create.c:244
+#, c-format
+msgid "Create db Device record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:277
+#, c-format
+msgid "More than one Storage record!: %d\n"
+msgstr ""
+
+#: src/cats/sql_create.c:282
+#, c-format
+msgid "error fetching Storage row: %s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:302
+#, c-format
+msgid "Create DB Storage record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:334
+#, c-format
+msgid "mediatype record %s already exists\n"
+msgstr ""
+
+#: src/cats/sql_create.c:350
+#, c-format
+msgid "Create db mediatype record %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:384
+#, c-format
+msgid "Volume \"%s\" already exists.\n"
+msgstr ""
+
+#: src/cats/sql_create.c:422
+#, c-format
+msgid "Create DB Media record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:470
+#, c-format
+msgid "More than one Client!: %d\n"
+msgstr ""
+
+#: src/cats/sql_create.c:475
+#, c-format
+msgid "error fetching Client row: %s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:502
+#, c-format
+msgid "Create DB Client record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:545
+#, c-format
+msgid "Create DB Counters record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:578
+#, c-format
+msgid "More than one FileSet!: %d\n"
+msgstr ""
+
+#: src/cats/sql_create.c:583
+#, c-format
+msgid "error fetching FileSet row: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:613
+#, c-format
+msgid "Create DB FileSet record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:670
+#, c-format
+msgid "Attempt to put non-attributes into catalog. Stream=%d\n"
+msgstr ""
+
+#: src/cats/sql_create.c:733
+#, c-format
+msgid "Create db File record %s failed. ERR=%s"
+msgstr ""
+
+#: src/cats/sql_create.c:766 src/cats/sql_get.c:224
+#, c-format
+msgid "More than one Path!: %s for path: %s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:797
+#, c-format
+msgid "Create db Path record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:830
+#, c-format
+msgid "More than one Filename! %s for file: %s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:836
+#, c-format
+msgid "Error fetching row for file=%s: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_create.c:852
+#, c-format
+msgid "Create db Filename record %s failed. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_delete.c:79
+#, c-format
+msgid "No pool record %s exists\n"
+msgstr ""
+
+#: src/cats/sql_delete.c:84
+#, c-format
+msgid "Expecting one pool record, got %d\n"
+msgstr ""
+
+#: src/cats/sql_delete.c:90
+#, c-format
+msgid "Error fetching row %s\n"
+msgstr ""
+
+#: src/cats/sql_find.c:90 src/cats/sql_find.c:119
+#, c-format
+msgid ""
+"Query error for start time request: ERR=%s\n"
+"CMD=%s\n"
+msgstr ""
+
+#: src/cats/sql_find.c:96
+msgid "No prior Full backup Job record found.\n"
+msgstr ""
+
+#: src/cats/sql_find.c:108
+#, c-format
+msgid "Unknown level=%d\n"
+msgstr ""
+
+#: src/cats/sql_find.c:125
+#, c-format
+msgid ""
+"No Job record found: ERR=%s\n"
+"CMD=%s\n"
+msgstr ""
+
+#: src/cats/sql_find.c:224
+#, c-format
+msgid "Unknown Job level=%d\n"
+msgstr ""
+
+#: src/cats/sql_find.c:234
+#, c-format
+msgid "No Job found for: %s.\n"
+msgstr ""
+
+#: src/cats/sql_find.c:245
+#, c-format
+msgid "No Job found for: %s\n"
+msgstr ""
+
+#: src/cats/sql_find.c:317
+#, c-format
+msgid "Request for Volume item %d greater than max %d\n"
+msgstr ""
+
+#: src/cats/sql_find.c:329
+#, c-format
+msgid "No Volume record found for item %d.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:130
+#, c-format
+msgid "get_file_record want 1 got rows=%d\n"
+msgstr ""
+
+#: src/cats/sql_get.c:135
+#, c-format
+msgid "Error fetching row: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:143
+#, c-format
+msgid "File record for PathId=%s FilenameId=%s not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:149
+msgid "File record not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:174
+#, c-format
+msgid "More than one Filename!: %s for file: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:184
+#, c-format
+msgid "Get DB Filename record %s found bad record: %d\n"
+msgstr ""
+
+#: src/cats/sql_get.c:190
+#, c-format
+msgid "Filename record: %s not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:194
+#, c-format
+msgid "Filename record: %s not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:235
+#, c-format
+msgid "Get DB path record %s found bad record: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:248
+#, c-format
+msgid "Path record: %s not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:252
+#, c-format
+msgid "Path record: %s not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:287
+#, c-format
+msgid "No Job found for JobId %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:344 src/cats/sql_get.c:399
+#, c-format
+msgid "No volumes found for JobId=%d\n"
+msgstr ""
+
+#: src/cats/sql_get.c:350 src/cats/sql_get.c:408
+#, c-format
+msgid "Error fetching row %d: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:364
+#, c-format
+msgid "No Volume for JobId %d found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:480
+#, c-format
+msgid "Pool id select failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:517
+#, c-format
+msgid "Client id select failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:559
+#, c-format
+msgid "More than one Pool!: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:600
+msgid "Pool record not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:634
+#, c-format
+msgid "More than one Client!: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:651 src/cats/sql_get.c:655
+msgid "Client record not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:680
+#, c-format
+msgid "More than one Counter!: %d\n"
+msgstr ""
+
+#: src/cats/sql_get.c:685
+#, c-format
+msgid "error fetching Counter row: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:705
+#, c-format
+msgid "Counter record: %s not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:741
+#, c-format
+msgid "Error got %s FileSets but expected only one!\n"
+msgstr ""
+
+#: src/cats/sql_get.c:746
+#, c-format
+msgid "FileSet record \"%s\" not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:756
+msgid "FileSet record not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:813
+#, c-format
+msgid "Media id select failed: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:861
+#, c-format
+msgid "More than one Volume!: %s\n"
+msgstr ""
+
+#: src/cats/sql_get.c:906
+#, c-format
+msgid "Media record MediaId=%s not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:909
+#, c-format
+msgid "Media record for Volume \"%s\" not found.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:916
+#, c-format
+msgid "Media record for MediaId=%u not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_get.c:919
+#, c-format
+msgid "Media record for Vol=%s not found in Catalog.\n"
+msgstr ""
+
+#: src/cats/sql_list.c:53
+#, c-format
+msgid "Query failed: %s\n"
+msgstr ""
+
+#: src/cats/sqlite.c:136
+#, c-format
+msgid "Database %s does not exist, please create it.\n"
+msgstr ""
+
+#: src/cats/sqlite.c:161
+#, c-format
+msgid "Unable to open Database=%s. ERR=%s\n"
+msgstr ""
+
+#: src/cats/sqlite.c:162 src/lib/bnet_server.c:371
+msgid "unknown"
+msgstr ""
+
+#: src/cats/sqlite.c:221
+#, c-format
+msgid "next_index query error: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sqlite.c:226
+#, c-format
+msgid "Error fetching index: ERR=%s\n"
+msgstr ""
+
+#: src/cats/sqlite.c:236
+#, c-format
+msgid "next_index update error: ERR=%s\n"
+msgstr ""
+
+#: src/console/authenticate.c:100 src/dird/authenticate.c:106
+#: src/dird/authenticate.c:206 src/filed/authenticate.c:119
+#: src/filed/authenticate.c:215 src/stored/authenticate.c:128
+#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:106
+msgid ""
+"Authorization problem: Remote server did not advertise required TLS "
+"support.\n"
+msgstr ""
+
+#: src/console/authenticate.c:107 src/dird/authenticate.c:113
+#: src/dird/authenticate.c:213 src/filed/authenticate.c:127
+#: src/filed/authenticate.c:223 src/stored/authenticate.c:136
+#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:112
+msgid "Authorization problem: Remote server requires TLS.\n"
+msgstr ""
+
+#: src/console/authenticate.c:117 src/wx-console/authenticate.c:121
+msgid "TLS negotiation failed\n"
+msgstr ""
+
+#: src/console/authenticate.c:129 src/gnome2-console/authenticate.c:85
+#: src/tray-monitor/authenticate.c:87
+#, c-format
+msgid "Bad response to Hello command: ERR=%s\n"
+msgstr ""
+
+#: src/console/authenticate.c:136 src/gnome2-console/authenticate.c:95
+#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:136
+msgid "Director rejected Hello command\n"
+msgstr ""
+
+#: src/console/authenticate.c:146 src/wx-console/authenticate.c:146
+msgid ""
+"Director authorization problem.\n"
+"Most likely the passwords do not agree.\n"
+"If you are using TLS, there may have been a certificate validation error "
+"during the TLS handshake.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/console/console.c:102
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald\n"
+"\n"
+"Version: "
+msgstr ""
+
+#: src/console/console.c:103 src/dird/admin.c:108
+#, c-format
+msgid " ("
+msgstr ""
+
+#: src/console/console.c:103
+#, c-format
+msgid ""
+") %s %s %s\n"
+"\n"
+"Usage: bconsole [-s] [-c config_file] [-d debug_level]\n"
+"       -c <file>   set configuration file to file\n"
+"       -dnn        set debug level to nn\n"
+"       -s          no signals\n"
+"       -t          test - read configuration and exit\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/console/console.c:150
+msgid "input from file"
+msgstr ""
+
+#: src/console/console.c:151
+msgid "output to file"
+msgstr ""
+
+#: src/console/console.c:152 src/dird/ua_cmds.c:110
+msgid "quit"
+msgstr ""
+
+#: src/console/console.c:153
+msgid "output to file and terminal"
+msgstr ""
+
+#: src/console/console.c:154
+msgid "sleep specified time"
+msgstr ""
+
+#: src/console/console.c:155 src/dird/ua_cmds.c:122
+msgid "print current time"
+msgstr ""
+
+#: src/console/console.c:156
+msgid "print Console's version"
+msgstr ""
+
+#: src/console/console.c:157 src/dird/ua_cmds.c:99
+msgid "exit = quit"
+msgstr ""
+
+#: src/console/console.c:158
+msgid "zed_keys = use zed keys instead of bash keys"
+msgstr ""
+
+#: src/console/console.c:191 src/dird/ua_dotcmds.c:108
+msgid ": is an illegal command\n"
+msgstr ""
+
+#: src/console/console.c:400 src/filed/filed.c:183
+#: src/gnome2-console/console.c:271
+msgid "TLS library initialization failed.\n"
+msgstr ""
+
+#: src/console/console.c:404 src/dird/dird.c:200 src/dird/dird.c:410
+#: src/dird/dird.c:413 src/filed/filed.c:188 src/gnome2-console/console.c:275
+#: src/stored/stored.c:193
+#, c-format
+msgid "Please correct configuration file: %s\n"
+msgstr ""
+
+#: src/console/console.c:421
+msgid "Available Directors:\n"
+msgstr ""
+
+#: src/console/console.c:425
+#, c-format
+msgid "%d  %s at %s:%d\n"
+msgstr ""
+
+#: src/console/console.c:429
+msgid "Select Director: "
+msgstr ""
+
+#: src/console/console.c:435
+#, c-format
+msgid "You must enter a number between 1 and %d\n"
+msgstr ""
+
+#: src/console/console.c:455 src/tray-monitor/tray-monitor.c:858
+#, c-format
+msgid "Connecting to Director %s:%d\n"
+msgstr ""
+
+#: src/console/console.c:471 src/gnome2-console/console.c:504
+#: src/wx-console/console_thread.cpp:370
+#, c-format
+msgid "Failed to initialize TLS context for Console \"%s\".\n"
+msgstr ""
+
+#: src/console/console.c:492 src/gnome2-console/console.c:526
+#: src/wx-console/console_thread.cpp:391
+#, c-format
+msgid "Failed to initialize TLS context for Director \"%s\".\n"
+msgstr ""
+
+#: src/console/console.c:515
+msgid "Enter a period to cancel a command.\n"
+msgstr ""
+
+#: src/console/console.c:582 src/console/console.c:611 src/dird/dird.c:496
+#: src/dird/dird.c:711 src/dird/dird.c:777 src/dird/dird.c:829
+#: src/filed/filed.c:302 src/filed/filed.c:348
+#: src/gnome2-console/console.c:140 src/gnome2-console/console.c:169
+#: src/stored/stored.c:309 src/wx-console/console_thread.cpp:94
+#: src/wx-console/console_thread.cpp:120
+msgid "TLS required but not configured in Bacula.\n"
+msgstr ""
+
+#: src/console/console.c:589 src/gnome2-console/console.c:147
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Director \"%s\" in %s. At least one CA certificate store is required.\n"
+msgstr ""
+
+#: src/console/console.c:598 src/gnome2-console/console.c:156
+#, c-format
+msgid ""
+"No Director resource defined in %s\n"
+"Without that I don't how to speak to the Director :-(\n"
+msgstr ""
+
+#: src/console/console.c:618 src/gnome2-console/console.c:176
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Console \"%s\" in %s.\n"
+msgstr ""
+
+#: src/console/console.c:763
+msgid "Too many arguments on input command.\n"
+msgstr ""
+
+#: src/console/console.c:767
+msgid "First argument to input command must be a filename.\n"
+msgstr ""
+
+#: src/console/console.c:772
+#, c-format
+msgid "Cannot open file %s for input. ERR=%s\n"
+msgstr ""
+
+#: src/console/console.c:802
+msgid "Too many arguments on output/tee command.\n"
+msgstr ""
+
+#: src/console/console.c:818
+#, c-format
+msgid "Cannot open file %s for output. ERR=%s\n"
+msgstr ""
+
+#: src/console/console_conf.c:123 src/gnome2-console/console_conf.c:122
+#: src/wx-console/console_conf.c:128
+#, c-format
+msgid "No record for %d %s\n"
+msgstr ""
+
+#: src/console/console_conf.c:132 src/wx-console/console_conf.c:137
+#, c-format
+msgid "Console: name=%s rcfile=%s histfile=%s\n"
+msgstr ""
+
+#: src/console/console_conf.c:136 src/gnome2-console/console_conf.c:131
+#: src/wx-console/console_conf.c:141
+#, c-format
+msgid "Director: name=%s address=%s DIRport=%d\n"
+msgstr ""
+
+#: src/console/console_conf.c:140 src/console/console_conf.c:216
+#: src/console/console_conf.c:261 src/console/console_conf.c:288
+#: src/filed/filed_conf.c:268 src/filed/filed_conf.c:327
+#: src/filed/filed_conf.c:357 src/gnome2-console/console_conf.c:142
+#: src/gnome2-console/console_conf.c:220 src/gnome2-console/console_conf.c:268
+#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:510
+#: src/stored/stored_conf.c:598 src/stored/stored_conf.c:633
+#: src/wx-console/console_conf.c:145 src/wx-console/console_conf.c:220
+#: src/wx-console/console_conf.c:265 src/wx-console/console_conf.c:292
+#, c-format
+msgid "Unknown resource type %d\n"
+msgstr ""
+
+#: src/console/console_conf.c:242 src/dird/dird_conf.c:1112
+#: src/dird/dird_conf.c:1127 src/filed/filed_conf.c:296
+#: src/gnome2-console/console_conf.c:246 src/tray-monitor/tray_conf.c:262
+#: src/wx-console/console_conf.c:246
+#, c-format
+msgid "%s item is required in %s resource, but not found.\n"
+msgstr ""
+
+#: src/console/console_conf.c:304 src/dird/dird_conf.c:1299
+#: src/filed/filed_conf.c:374 src/gnome2-console/console_conf.c:314
+#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:308
+#, c-format
+msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n"
+msgstr ""
+
+#: src/dird/admin.c:55
+#, c-format
+msgid "Start Admin JobId %d, Job=%s\n"
+msgstr ""
+
+#: src/dird/admin.c:82 src/dird/backup.c:343 src/dird/mac.c:287
+#, c-format
+msgid "Error getting job record for stats: %s"
+msgstr ""
+
+#: src/dird/admin.c:90
+msgid "Admin OK"
+msgstr ""
+
+#: src/dird/admin.c:94
+msgid "*** Admin Error ***"
+msgstr ""
+
+#: src/dird/admin.c:98
+msgid "Admin Canceled"
+msgstr ""
+
+#: src/dird/admin.c:102 src/dird/backup.c:455 src/dird/mac.c:389
+#: src/dird/restore.c:246
+#, c-format
+msgid "Inappropriate term code: %c\n"
+msgstr ""
+
+#: src/dird/admin.c:108
+msgid "Bacula "
+msgstr ""
+
+#: src/dird/admin.c:108
+#, c-format
+msgid ""
+"): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/authenticate.c:67 src/dird/authenticate.c:68
+#: src/tray-monitor/authenticate.c:121
+#, c-format
+msgid "Error sending Hello to Storage daemon. ERR=%s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:93
+msgid "Director and Storage daemon passwords or names not the same.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:95
+msgid ""
+"Director unable to authenticate with Storage daemon. Possible causes:\n"
+"Passwords or names not the same or\n"
+"Maximum Concurrent Jobs exceeded on the SD or\n"
+"SD networking messed up (restart daemon).\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:123 src/dird/authenticate.c:223
+#: src/dird/authenticate.c:356 src/filed/authenticate.c:136
+#: src/filed/authenticate.c:232 src/stored/authenticate.c:145
+#: src/stored/authenticate.c:249
+msgid "TLS negotiation failed.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:132 src/tray-monitor/authenticate.c:134
+#, c-format
+msgid "bdird<stored: bad response to Hello command: ERR=%s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:139 src/dird/authenticate.c:140
+#: src/tray-monitor/authenticate.c:141
+msgid "Storage daemon rejected Hello command\n"
+msgstr ""
+
+#: src/dird/authenticate.c:167 src/tray-monitor/authenticate.c:166
+#, c-format
+msgid "Error sending Hello to File daemon. ERR=%s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:193
+msgid "Director and File daemon passwords or names not the same.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:195
+msgid ""
+"Unable to authenticate with File daemon. Possible causes:\n"
+"Passwords or names not the same or\n"
+"Maximum Concurrent Jobs exceeded on the FD or\n"
+"FD networking messed up (restart daemon).\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:232 src/dird/authenticate.c:234
+#: src/tray-monitor/authenticate.c:179
+#, c-format
+msgid "Bad response from File daemon to Hello command: ERR=%s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:241 src/dird/authenticate.c:242
+#: src/tray-monitor/authenticate.c:186
+msgid "File daemon rejected Hello command\n"
+msgstr ""
+
+#: src/dird/authenticate.c:268
+#, c-format
+msgid "UA Hello from %s:%s:%d is invalid. Len=%d\n"
+msgstr ""
+
+#: src/dird/authenticate.c:275
+#, c-format
+msgid "UA Hello from %s:%s:%d is invalid. Got: %s\n"
+msgstr ""
+
+#: src/dird/authenticate.c:332
+msgid ""
+"Authorization problem: Remote client did not advertise required TLS "
+"support.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:340
+msgid "Authorization problem: Remote client requires TLS.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:368
+#, c-format
+msgid "Unable to authenticate console \"%s\" at %s:%s:%d.\n"
+msgstr ""
+
+#: src/dird/authenticate.c:373
+#, c-format
+msgid "1000 OK: %s Version: %s (%s)\n"
+msgstr ""
+
+#: src/dird/autoprune.c:57
+msgid "Begin pruning Jobs.\n"
+msgstr ""
+
+#: src/dird/autoprune.c:65
+msgid "Begin pruning Files.\n"
+msgstr ""
+
+#: src/dird/autoprune.c:70
+msgid ""
+"End auto prune.\n"
+"\n"
+msgstr ""
+
+#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:124
+#: src/dird/ua_output.c:611
+#, c-format
+msgid "Pool %s not in database. %s"
+msgstr ""
+
+#: src/dird/backup.c:92 src/dird/mac.c:128 src/dird/ua_output.c:619
+#, c-format
+msgid "Pool %s created in database.\n"
+msgstr ""
+
+#: src/dird/backup.c:120
+msgid "Could not start clone job.\n"
+msgstr ""
+
+#: src/dird/backup.c:122
+#, c-format
+msgid "Clone JobId %d started.\n"
+msgstr ""
+
+#: src/dird/backup.c:148
+#, c-format
+msgid "Start Backup JobId %s, Job=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:276
+#, c-format
+msgid "Unexpected Client Job message: %s\n"
+msgstr ""
+
+#: src/dird/backup.c:284
+#, c-format
+msgid "Network error with FD during %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:300
+msgid "No Job status returned from FD.\n"
+msgstr ""
+
+#: src/dird/backup.c:350
+#, c-format
+msgid "Error getting client record for stats: %s"
+msgstr ""
+
+#: src/dird/backup.c:356 src/dird/mac.c:294
+#, c-format
+msgid "Error getting Media record for Volume \"%s\": ERR=%s"
+msgstr ""
+
+#: src/dird/backup.c:384 src/dird/mac.c:322
+#, c-format
+msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:418 src/dird/mac.c:352
+#, c-format
+msgid ""
+"Could not open WriteBootstrap file:\n"
+"%s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:428 src/dird/mac.c:362
+msgid "Backup OK -- with warnings"
+msgstr ""
+
+#: src/dird/backup.c:430 src/dird/mac.c:364 src/stored/bscan.c:1060
+msgid "Backup OK"
+msgstr ""
+
+#: src/dird/backup.c:435 src/dird/mac.c:369 src/stored/bscan.c:1064
+msgid "*** Backup Error ***"
+msgstr ""
+
+#: src/dird/backup.c:445 src/dird/mac.c:379 src/stored/bscan.c:1067
+msgid "Backup Canceled"
+msgstr ""
+
+#: src/dird/backup.c:495
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  Backup Level:           %s%s\n"
+"  Client:                 \"%s\" %s\n"
+"  FileSet:                \"%s\" %s\n"
+"  Pool:                   \"%s\"\n"
+"  Storage:                \"%s\"\n"
+"  Scheduled time:         %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Priority:               %d\n"
+"  FD Files Written:       %s\n"
+"  SD Files Written:       %s\n"
+"  FD Bytes Written:       %s\n"
+"  SD Bytes Written:       %s\n"
+"  Rate:                   %.1f KB/s\n"
+"  Software Compression:   %s\n"
+"  Volume name(s):         %s\n"
+"  Volume Session Id:      %d\n"
+"  Volume Session Time:    %d\n"
+"  Last Volume Bytes:      %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  SD Errors:              %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/bsr.c:155
+#, c-format
+msgid "Unable to get Job record. ERR=%s\n"
+msgstr ""
+
+#: src/dird/bsr.c:162
+#, c-format
+msgid "Unable to get Job Volume Parameters. ERR=%s\n"
+msgstr ""
+
+#: src/dird/bsr.c:203
+#, c-format
+msgid "Unable to create bootstrap file %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/bsr.c:212
+msgid "Error writing bsr file.\n"
+msgstr ""
+
+#: src/dird/bsr.c:218
+#, c-format
+msgid "Bootstrap records written to %s\n"
+msgstr ""
+
+#: src/dird/bsr.c:222
+msgid "The job will require the following Volumes:\n"
+msgstr ""
+
+#: src/dird/bsr.c:254
+msgid "No Volumes found to restore.\n"
+msgstr ""
+
+#: src/dird/catreq.c:109 src/dird/catreq.c:297
+#, c-format
+msgid "1990 Invalid Catalog Request: %s"
+msgstr ""
+
+#: src/dird/catreq.c:110
+#, c-format
+msgid "Invalid Catalog request; DB not open: %s"
+msgstr ""
+
+#: src/dird/catreq.c:135
+msgid "1901 No Media.\n"
+msgstr ""
+
+#: src/dird/catreq.c:163
+msgid "not in Pool"
+msgstr ""
+
+#: src/dird/catreq.c:165
+msgid "not correct MediaType"
+msgstr ""
+
+#: src/dird/catreq.c:181
+#, c-format
+msgid "1998 Volume \"%s\" status is %s, %s.\n"
+msgstr ""
+
+#: src/dird/catreq.c:186
+#, c-format
+msgid "1997 Volume \"%s\" not in catalog.\n"
+msgstr ""
+
+#: src/dird/catreq.c:207
+#, c-format
+msgid "Unable to get Media record for Volume %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/catreq.c:209
+#, c-format
+msgid "1991 Catalog Request for vol=%s failed: %s"
+msgstr ""
+
+#: src/dird/catreq.c:229
+#, c-format
+msgid ""
+"Volume Files at %u being set to %u for Volume \"%s\". This is incorrect.\n"
+msgstr ""
+
+#: src/dird/catreq.c:232
+#, c-format
+msgid "1992 Update Media error. VolFiles=%u, CatFiles=%u\n"
+msgstr ""
+
+#: src/dird/catreq.c:264
+#, c-format
+msgid "Catalog error updating Media record. %s"
+msgstr ""
+
+#: src/dird/catreq.c:266
+msgid "1993 Update Media error\n"
+msgstr ""
+
+#: src/dird/catreq.c:286
+#, c-format
+msgid "Catalog error creating JobMedia record. %s"
+msgstr ""
+
+#: src/dird/catreq.c:288
+msgid "1991 Update JobMedia error\n"
+msgstr ""
+
+#: src/dird/catreq.c:298
+#, c-format
+msgid "Invalid Catalog request: %s"
+msgstr ""
+
+#: src/dird/catreq.c:332
+#, c-format
+msgid "1991 Invalid Catalog Update: %s"
+msgstr ""
+
+#: src/dird/catreq.c:333
+#, c-format
+msgid "Invalid Catalog Update; DB not open: %s"
+msgstr ""
+
+#: src/dird/catreq.c:407
+msgid "Got MD5/SHA1 but not same File as attributes\n"
+msgstr ""
+
+#: src/dird/catreq.c:431
+#, c-format
+msgid "Catalog error updating MD5/SHA1. %s"
+msgstr ""
+
+#: src/dird/dird.c:71
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n"
+"       -c <file>   set configuration file to file\n"
+"       -dnn        set debug level to nn\n"
+"       -f          run in foreground (for debugging)\n"
+"       -g          groupid\n"
+"       -r <job>    run <job> now\n"
+"       -s          no signals\n"
+"       -t          test - read configuration and exit\n"
+"       -u          userid\n"
+"       -v          verbose user messages\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/dird/dird.c:196 src/stored/stored.c:189
+msgid "Cryptography library initialization failed.\n"
+msgstr ""
+
+#: src/dird/dird.c:396
+msgid "Too many open reload requests. Request ignored.\n"
+msgstr ""
+
+#: src/dird/dird.c:411
+msgid "Out of reload table entries. Giving up.\n"
+msgstr ""
+
+#: src/dird/dird.c:414
+msgid "Resetting previous configuration.\n"
+msgstr ""
+
+#: src/dird/dird.c:474
+#, c-format
+msgid ""
+"No Director resource defined in %s\n"
+"Without that I don't know who I am :-(\n"
+msgstr ""
+
+#: src/dird/dird.c:482 src/filed/filed.c:295
+#, c-format
+msgid "No Messages resource defined in %s\n"
+msgstr ""
+
+#: src/dird/dird.c:487
+#, c-format
+msgid "Only one Director resource permitted in %s\n"
+msgstr ""
+
+#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:361
+#, c-format
+msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:367
+#, c-format
+msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:373
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Director \"%s\" in %s. At least one CA certificate store is required when "
+"using \"TLS Verify Peer\".\n"
+msgstr ""
+
+#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:392
+#, c-format
+msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:541
+#, c-format
+msgid "No Job records defined in %s\n"
+msgstr ""
+
+#: src/dird/dird.c:585 src/dird/dird.c:598
+#, c-format
+msgid "Hey something is wrong. p=0x%lu\n"
+msgstr ""
+
+#: src/dird/dird.c:647
+#, c-format
+msgid "\"%s\" directive in Job \"%s\" resource is required, but not found.\n"
+msgstr ""
+
+#: src/dird/dird.c:654
+msgid "Too many items in Job resource\n"
+msgstr ""
+
+#: src/dird/dird.c:672 src/dird/job.c:101 src/dird/ua_cmds.c:1480
+#: src/dird/ua_output.c:600
+#, c-format
+msgid "Could not open database \"%s\".\n"
+msgstr ""
+
+#: src/dird/dird.c:675
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: src/dird/dird.c:717
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Storage \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:733 src/stored/stored.c:347
+#, c-format
+msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:784
+#, c-format
+msgid "\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:790
+#, c-format
+msgid "\"TLS Key\" file not defined for Console \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:796
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Console \"%s\" in %s. At least one CA certificate store is required when "
+"using \"TLS Verify Peer\".\n"
+msgstr ""
+
+#: src/dird/dird.c:813 src/dird/dird.c:853 src/filed/filed.c:326
+#, c-format
+msgid "Failed to initialize TLS context for File daemon \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird.c:836
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"File daemon \"%s\" in %s.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:443 src/tray-monitor/tray_conf.c:152
+#, c-format
+msgid "No %s resource defined\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:452
+#, c-format
+msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:457
+#, c-format
+msgid "   query_file=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:460 src/dird/dird_conf.c:485 src/dird/dird_conf.c:499
+#: src/dird/dird_conf.c:544 src/dird/dird_conf.c:548 src/dird/dird_conf.c:552
+#: src/dird/dird_conf.c:576 src/dird/dird_conf.c:581 src/dird/dird_conf.c:585
+#: src/dird/dird_conf.c:589 src/dird/dird_conf.c:593 src/dird/dird_conf.c:597
+#: src/dird/dird_conf.c:607
+msgid "  --> "
+msgstr ""
+
+#: src/dird/dird_conf.c:466 src/dird/dird_conf.c:469
+#, c-format
+msgid "Console: name=%s SSL=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:475
+#, c-format
+msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:480
+#, c-format
+msgid "Counter: name=%s min=%d max=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:491
+#, c-format
+msgid "Client: name=%s address=%s FDport=%d MaxJobs=%u\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:494
+#, c-format
+msgid "      JobRetention=%s FileRetention=%s AutoPrune=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:506
+#, c-format
+msgid ""
+"Device: name=%s ok=%d num_writers=%d max_writers=%d\n"
+"      reserved=%d open=%d append=%d read=%d labeled=%d offline=%d autochgr=%"
+"d\n"
+"      poolid=%s volname=%s MediaType=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:516
+#, c-format
+msgid ""
+"Storage: name=%s address=%s SDport=%d MaxJobs=%u\n"
+"      DeviceName=%s MediaType=%s StorageId=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:525
+#, c-format
+msgid ""
+"Catalog: name=%s address=%s DBport=%d db_name=%s\n"
+"      db_user=%s MutliDBConn=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:533
+#, c-format
+msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:534 src/dird/ua_cmds.c:430 src/dird/ua_prune.c:454
+#: src/dird/ua_run.c:643 src/dird/ua_select.c:234 src/dird/ua_select.c:257
+msgid "Job"
+msgstr ""
+
+#: src/dird/dird_conf.c:534
+msgid "JobDefs"
+msgstr ""
+
+#: src/dird/dird_conf.c:538
+#, c-format
+msgid ""
+"     MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%"
+"d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:556
+#, c-format
+msgid "  --> Where=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:559
+#, c-format
+msgid "  --> Bootstrap=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:562
+#, c-format
+msgid "  --> RunBefore=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:565
+#, c-format
+msgid "  --> RunAfter=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:568
+#, c-format
+msgid "  --> RunAfterFailed=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:571
+#, c-format
+msgid "  --> WriteBootstrap=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:603
+#, c-format
+msgid "  --> Run=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:614
+#, c-format
+msgid "FileSet: name=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:676 src/dird/dird_conf.c:755
+#, c-format
+msgid "Schedule: name=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:681
+#, c-format
+msgid "  --> Run Level=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:682
+msgid "      hour="
+msgstr ""
+
+#: src/dird/dird_conf.c:691
+msgid "      mday="
+msgstr ""
+
+#: src/dird/dird_conf.c:700
+msgid "      month="
+msgstr ""
+
+#: src/dird/dird_conf.c:709
+msgid "      wday="
+msgstr ""
+
+#: src/dird/dird_conf.c:718
+msgid "      wom="
+msgstr ""
+
+#: src/dird/dird_conf.c:727
+msgid "      woy="
+msgstr ""
+
+#: src/dird/dird_conf.c:736
+#, c-format
+msgid "      mins=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:738 src/dird/dird_conf.c:742 src/dird/dird_conf.c:746
+msgid "     --> "
+msgstr ""
+
+#: src/dird/dird_conf.c:759
+#, c-format
+msgid "Pool: name=%s PoolType=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:761
+#, c-format
+msgid "      use_cat=%d use_once=%d acpt_any=%d cat_files=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:764
+#, c-format
+msgid "      max_vols=%d auto_prune=%d VolRetention=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:767
+#, c-format
+msgid "      VolUse=%s recycle=%d LabelFormat=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:771
+#, c-format
+msgid "      CleaningPrefix=%s LabelType=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:773
+#, c-format
+msgid "      RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:779
+#, c-format
+msgid "Messages: name=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:781
+#, c-format
+msgid "      mailcmd=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:783
+#, c-format
+msgid "      opcmd=%s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:786 src/tray-monitor/tray_conf.c:179
+#, c-format
+msgid "Unknown resource type %d in dump_resource.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1080 src/tray-monitor/tray_conf.c:232
+#, c-format
+msgid "Unknown resource type %d in free_resource.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1118 src/lib/parse_conf.c:211
+#: src/tray-monitor/tray_conf.c:268
+#, c-format
+msgid "Too many items in %s resource\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1152
+#, c-format
+msgid "Cannot find Console resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1158 src/filed/filed_conf.c:316
+#: src/stored/stored_conf.c:566
+#, c-format
+msgid "Cannot find Director resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1165 src/stored/stored_conf.c:572
+#, c-format
+msgid "Cannot find Storage resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1174
+#, c-format
+msgid "Cannot find Job resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1192
+#, c-format
+msgid "Cannot find Counter resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1200 src/filed/filed_conf.c:322
+#, c-format
+msgid "Cannot find Client resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1212
+#, c-format
+msgid "Cannot find Schedule resource %s\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1217 src/tray-monitor/tray_conf.c:287
+#, c-format
+msgid "Unknown resource type %d in save_resource.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1277 src/tray-monitor/tray_conf.c:322
+#, c-format
+msgid "Unknown resource type %d in save_resrouce.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1292
+#, c-format
+msgid "Name item is required in %s resource, but not found.\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1304
+#, c-format
+msgid "Inserting %s res: %s index=%d pass=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:1377
+#, c-format
+msgid "Expected a Job Type keyword, got: %s"
+msgstr ""
+
+#: src/dird/dird_conf.c:1401
+#, c-format
+msgid "Expected a Job Level keyword, got: %s"
+msgstr ""
+
+#: src/dird/dird_conf.c:1421
+#, c-format
+msgid "Expected a Restore replacement option, got: %s"
+msgstr ""
+
+#: src/dird/expand.c:240
+#, c-format
+msgid "Count not update counter %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:412
+#, c-format
+msgid "Cannot create var context: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:417
+#, c-format
+msgid "Cannot set var callback: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:423
+#, c-format
+msgid "Cannot set var operate: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:429 src/dird/expand.c:444
+#, c-format
+msgid "Cannot unescape string: ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:437
+#, c-format
+msgid "Cannot expand expression \"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/dird/expand.c:455
+#, c-format
+msgid "Cannot destroy var context: ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:73 src/tray-monitor/tray-monitor.c:867
+msgid "File daemon"
+msgstr ""
+
+#: src/dird/fd_cmds.c:104
+#, c-format
+msgid "File daemon \"%s\" rejected Job command: %s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:117
+#, c-format
+msgid "Error updating Client record. ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:122
+#, c-format
+msgid "FD gave bad response to JobId command: %s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:144 src/dird/fd_cmds.c:180
+msgid ", since="
+msgstr ""
+
+#: src/dird/fd_cmds.c:164
+msgid "No prior or suitable Full backup found. Doing FULL backup.\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:165 src/dird/fd_cmds.c:173
+#, c-format
+msgid " (upgraded from %s)"
+msgstr ""
+
+#: src/dird/fd_cmds.c:171
+#, c-format
+msgid "Prior failed job found. Upgrading to %s.\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:196
+msgid "since_utime "
+msgstr ""
+
+#: src/dird/fd_cmds.c:232
+#, c-format
+msgid "Unimplemented backup level %d %c\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:320 src/filed/job.c:566
+#, c-format
+msgid "Cannot run program: %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:331 src/dird/fd_cmds.c:356 src/dird/fd_cmds.c:370
+msgid ">filed: write error on socket\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:337
+#, c-format
+msgid "Error running program: %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:346
+#, c-format
+msgid "Cannot open included file: %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:441 src/filed/job.c:1622
+#, c-format
+msgid "Could not open bootstrap file %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:526
+#, c-format
+msgid ""
+"<filed: bad attributes, expected 3 fields got %d\n"
+"msglen=%d msg=%s\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:571 src/dird/verify.c:700
+#, c-format
+msgid "MD5/SHA1 index %d not same as attributes %d\n"
+msgstr ""
+
+#: src/dird/fd_cmds.c:588
+#, c-format
+msgid "<filed: Network error getting attributes. ERR=%s\n"
+msgstr ""
+
+#: src/dird/getmsg.c:130
+#, c-format
+msgid "bget_dirmsg: unknown bnet signal %d\n"
+msgstr ""
+
+#: src/dird/getmsg.c:148 src/dird/getmsg.c:161 src/dird/getmsg.c:173
+#: src/dird/getmsg.c:220 src/dird/getmsg.c:244
+#, c-format
+msgid "Malformed message: %s\n"
+msgstr ""
+
+#: src/dird/getmsg.c:154
+#, c-format
+msgid "Job not found: %s\n"
+msgstr ""
+
+#: src/dird/getmsg.c:313
+#, c-format
+msgid "Bad response to %s command: wanted %s, got %s\n"
+msgstr ""
+
+#: src/dird/getmsg.c:318
+#, c-format
+msgid "Socket error on %s command: ERR=%s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:249
+#, c-format
+msgid "Expected a FileSet option keyword, got:%s:"
+msgstr ""
+
+#: src/dird/inc_conf.c:282
+msgid "Old style Include/Exclude not supported\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:310 src/dird/inc_conf.c:577
+#, c-format
+msgid "Expecting keyword, got: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:318 src/dird/inc_conf.c:583 src/lib/parse_conf.c:819
+#, c-format
+msgid "expected an equals, got: %s"
+msgstr ""
+
+#: src/dird/inc_conf.c:328 src/dird/inc_conf.c:592
+#, c-format
+msgid "Keyword %s not permitted in this resource"
+msgstr ""
+
+#: src/dird/inc_conf.c:381
+#, c-format
+msgid "Regex compile error. ERR=%s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:402
+#, c-format
+msgid "Expected a regex string, got: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:488
+#, c-format
+msgid "Expected a wild-card string, got: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:511
+#, c-format
+msgid "Expected an fstype string, got: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:546
+#, c-format
+msgid "Expected a filename, got: %s"
+msgstr ""
+
+#: src/dird/inc_conf.c:562
+#, c-format
+msgid "Expecting open brace. Got %s"
+msgstr ""
+
+#: src/dird/inc_conf.c:617
+#, c-format
+msgid "Expected a FileSet keyword, got: %s"
+msgstr ""
+
+#: src/dird/job.c:50
+#, c-format
+msgid "Could not init job queue: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:447
+#, c-format
+msgid "Unable to init job cond variable: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:139
+#, c-format
+msgid "Could not add job queue: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:178
+msgid "Job canceled because max start delay time exceeded.\n"
+msgstr ""
+
+#: src/dird/job.c:229 src/dird/job.c:307
+#, c-format
+msgid "Unimplemented job type: %d\n"
+msgstr ""
+
+#: src/dird/job.c:254
+#, c-format
+msgid "RunBefore: %s"
+msgstr ""
+
+#: src/dird/job.c:259
+#, c-format
+msgid "RunBeforeJob error: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:325
+#, c-format
+msgid "RunAfter: %s"
+msgstr ""
+
+#: src/dird/job.c:335
+#, c-format
+msgid "RunAfterJob error: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:337
+#, c-format
+msgid "RunAfterFailedJob error: ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:376
+#, c-format
+msgid "JobId %d, Job %s marked to be canceled.\n"
+msgstr ""
+
+#: src/dird/job.c:387
+msgid "Failed to connect to File daemon.\n"
+msgstr ""
+
+#: src/dird/job.c:409 src/dird/ua_cmds.c:670 src/dird/ua_cmds.c:1317
+#: src/dird/ua_label.c:708
+msgid "Failed to connect to Storage daemon.\n"
+msgstr ""
+
+#: src/dird/job.c:543 src/dird/job.c:591
+#, c-format
+msgid "Unhandled job status code %d\n"
+msgstr ""
+
+#: src/dird/job.c:619 src/stored/bscan.c:908
+#, c-format
+msgid "Could not create Client record. ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:651
+msgid "FileSet MD5 signature not found.\n"
+msgstr ""
+
+#: src/dird/job.c:656
+#, c-format
+msgid "Could not create FileSet \"%s\" record. ERR=%s\n"
+msgstr ""
+
+#: src/dird/job.c:695
+#, c-format
+msgid "Error updating job record. %s"
+msgstr ""
+
+#: src/dird/jobq.c:67
+#, c-format
+msgid "pthread_attr_init: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:76
+#, c-format
+msgid "pthread_mutex_init: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:82
+#, c-format
+msgid "pthread_cond_init: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:115 src/dird/jobq.c:242 src/dird/jobq.c:307
+#: src/dird/jobq.c:388
+#, c-format
+msgid "pthread_mutex_lock: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:128
+#, c-format
+msgid "pthread_cond_broadcast: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:136
+#, c-format
+msgid "pthread_cond_wait: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:144
+#, c-format
+msgid "pthread_mutex_unlock: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:180
+#, c-format
+msgid "Job %s waiting %d seconds for scheduled start time.\n"
+msgstr ""
+
+#: src/dird/jobq.c:235
+#, c-format
+msgid "pthread_thread_create: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:353
+#, c-format
+msgid "pthread_cond_signal: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:362
+#, c-format
+msgid "pthread_create: ERR=%s\n"
+msgstr ""
+
+#: src/dird/jobq.c:487
+#, c-format
+msgid "Rescheduled Job %s at %s to re-run in %d seconds.\n"
+msgstr ""
+
+#: src/dird/mac.c:77 src/dird/verify.c:92
+msgid "Unable to find JobId of previous Job for this client.\n"
+msgstr ""
+
+#: src/dird/mac.c:85 src/dird/verify.c:108
+#, c-format
+msgid "Could not get job record for previous Job. ERR=%s"
+msgstr ""
+
+#: src/dird/mac.c:90 src/dird/verify.c:113
+#, c-format
+msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
+msgstr ""
+
+#: src/dird/mac.c:94
+#, c-format
+msgid "%s using JobId=%d Job=%s\n"
+msgstr ""
+
+#: src/dird/mac.c:192
+#, c-format
+msgid "Start %s JobId %s, Job=%s\n"
+msgstr ""
+
+#: src/dird/mac.c:428
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  Backup Level:           %s%s\n"
+"  Client:                 %s\n"
+"  FileSet:                \"%s\" %s\n"
+"  Pool:                   \"%s\"\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  FD Files Written:       %s\n"
+"  SD Files Written:       %s\n"
+"  FD Bytes Written:       %s\n"
+"  SD Bytes Written:       %s\n"
+"  Rate:                   %.1f KB/s\n"
+"  Software Compression:   %s\n"
+"  Volume name(s):         %s\n"
+"  Volume Session Id:      %d\n"
+"  Volume Session Time:    %d\n"
+"  Last Volume Bytes:      %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  SD Errors:              %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/msgchan.c:78 src/filed/job.c:1129
+#: src/tray-monitor/tray-monitor.c:874
+msgid "Storage daemon"
+msgstr ""
+
+#: src/dird/msgchan.c:156
+#, c-format
+msgid "Storage daemon rejected Job command: %s\n"
+msgstr ""
+
+#: src/dird/msgchan.c:163
+#, c-format
+msgid "<stored: bad response to Job command: %s\n"
+msgstr ""
+
+#: src/dird/msgchan.c:209 src/dird/msgchan.c:245
+#, c-format
+msgid ""
+"\n"
+"     Storage daemon didn't accept Device \"%s\" because:\n"
+"     %s"
+msgstr ""
+
+#: src/dird/msgchan.c:277 src/dird/msgchan.c:418
+#, c-format
+msgid "Cannot create message thread: %s\n"
+msgstr ""
+
+#: src/dird/newvol.c:77
+#, c-format
+msgid "Illegal character in Volume name \"%s\"\n"
+msgstr ""
+
+#: src/dird/newvol.c:89
+#, c-format
+msgid "Created new Volume \"%s\" in catalog.\n"
+msgstr ""
+
+#: src/dird/newvol.c:117
+#, c-format
+msgid "Wanted to create Volume \"%s\", but it already exists. Trying again.\n"
+msgstr ""
+
+#: src/dird/newvol.c:126
+msgid "Too many failures. Giving up creating Volume name.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:130
+#, c-format
+msgid "Purging oldest volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/next_vol.c:136
+#, c-format
+msgid "Pruning oldest volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/next_vol.c:155
+msgid "We seem to be looping trying to find the next volume. I give up.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:180
+#, c-format
+msgid "Max Volume bytes exceeded. Marking Volume \"%s\" as Full.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:187
+#, c-format
+msgid "Volume used once. Marking Volume \"%s\" as Used.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:194
+#, c-format
+msgid "Max Volume jobs exceeded. Marking Volume \"%s\" as Used.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:201
+#, c-format
+msgid "Max Volume files exceeded. Marking Volume \"%s\" as Used.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:211
+#, c-format
+msgid "Max configured use duration exceeded. Marking Volume \"%s\" as Used.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:221
+#, c-format
+msgid "Catalog error updating volume \"%s\". ERR=%s"
+msgstr ""
+
+#: src/dird/next_vol.c:242
+msgid "volume has expired"
+msgstr ""
+
+#: src/dird/next_vol.c:260 src/dird/next_vol.c:296
+#, c-format
+msgid "Recycled current volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/next_vol.c:265
+msgid "and recycling of current volume failed"
+msgstr ""
+
+#: src/dird/next_vol.c:271
+msgid "but should be Append, Purged or Recycle"
+msgstr ""
+
+#: src/dird/next_vol.c:299
+msgid ""
+"but should be Append, Purged or Recycle (recycling of the current volume "
+"failed)"
+msgstr ""
+
+#: src/dird/next_vol.c:303
+msgid ""
+"but should be Append, Purged or Recycle (cannot automatically recycle "
+"current volume, as it still contains unpruned data)"
+msgstr ""
+
+#: src/dird/next_vol.c:343
+#, c-format
+msgid "Unable to get Pool record: ERR=%s"
+msgstr ""
+
+#: src/dird/next_vol.c:348
+#, c-format
+msgid "Unable add Scratch Volume, Pool \"%s\" full MaxVols=%d\n"
+msgstr ""
+
+#: src/dird/next_vol.c:361
+#, c-format
+msgid "Failed to move Scratch Volume. ERR=%s\n"
+msgstr ""
+
+#: src/dird/next_vol.c:365
+#, c-format
+msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:373
+#, c-format
+msgid "Unable to update Volume record: ERR=%s"
+msgstr ""
+
+#: src/dird/pythondir.c:105 src/filed/pythonfd.c:102 src/filed/pythonfd.c:156
+#: src/filed/pythonfd.c:220 src/stored/pythonsd.c:95 src/stored/pythonsd.c:160
+msgid "Job pointer not found."
+msgstr ""
+
+#: src/dird/pythondir.c:137
+msgid "Pool record not found."
+msgstr ""
+
+#: src/dird/pythondir.c:166 src/filed/pythonfd.c:133 src/stored/pythonsd.c:137
+#, c-format
+msgid "Attribute %s not found."
+msgstr ""
+
+#: src/dird/pythondir.c:209 src/dird/pythondir.c:215 src/filed/pythonfd.c:175
+#: src/stored/pythonsd.c:177
+msgid "Read-only attribute"
+msgstr ""
+
+#: src/dird/recycle.c:99
+#, c-format
+msgid "Recycled volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/restore.c:70
+msgid "Cannot restore without bootstrap file.\n"
+msgstr ""
+
+#: src/dird/restore.c:77
+#, c-format
+msgid "Start Restore Job %s\n"
+msgstr ""
+
+#: src/dird/restore.c:219
+msgid "Restore OK -- warning file count mismatch"
+msgstr ""
+
+#: src/dird/restore.c:221
+msgid "Restore OK"
+msgstr ""
+
+#: src/dird/restore.c:226
+msgid "*** Restore Error ***"
+msgstr ""
+
+#: src/dird/restore.c:236
+msgid "Restore Canceled"
+msgstr ""
+
+#: src/dird/restore.c:263
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  Client:                 %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Expected:         %s\n"
+"  Files Restored:         %s\n"
+"  Bytes Restored:         %s\n"
+"  Rate:                   %.1f KB/s\n"
+"  FD Errors:              %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/run_conf.c:188
+#, c-format
+msgid "Expected an equals, got: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:201 src/dird/run_conf.c:213
+#, c-format
+msgid "Expect a YES or NO, got: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:227
+#, c-format
+msgid "Job level field: %s not found in run record"
+msgstr ""
+
+#: src/dird/run_conf.c:245
+#, c-format
+msgid "Could not find specified Pool Resource: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:270
+#, c-format
+msgid "Could not find specified Storage Resource: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:282
+#, c-format
+msgid "Could not find specified Messages Resource: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:290
+#, c-format
+msgid "Expected a keyword name, got: %s"
+msgstr ""
+
+#: src/dird/run_conf.c:327
+msgid "Day number out of range (1-31)"
+msgstr ""
+
+#: src/dird/run_conf.c:344 src/dird/run_conf.c:490
+msgid "Week number out of range (0-53)"
+msgstr ""
+
+#: src/dird/run_conf.c:359
+#, c-format
+msgid "Job type field: %s in run record not found"
+msgstr ""
+
+#: src/dird/run_conf.c:366
+#, c-format
+msgid "Unexpected token: %d:%s"
+msgstr ""
+
+#: src/dird/run_conf.c:410
+msgid "Time must be preceded by keyword AT."
+msgstr ""
+
+#: src/dird/run_conf.c:418
+msgid "Time logic error.\n"
+msgstr ""
+
+#: src/dird/run_conf.c:430 src/dird/run_conf.c:446
+msgid "Bad time specification."
+msgstr ""
+
+#: src/dird/run_conf.c:459
+msgid "Range logic error.\n"
+msgstr ""
+
+#: src/dird/run_conf.c:468
+msgid "Bad day range specification."
+msgstr ""
+
+#: src/dird/run_conf.c:515
+msgid "Invalid month, week or position day range"
+msgstr ""
+
+#: src/dird/run_conf.c:530
+msgid "Invalid month, weekday or position range"
+msgstr ""
+
+#: src/dird/run_conf.c:589
+msgid "Unexpected run state\n"
+msgstr ""
+
+#: src/dird/scheduler.c:80
+#, c-format
+msgid "Job %s not found\n"
+msgstr ""
+
+#: src/dird/scheduler.c:103
+msgid "Walk queue"
+msgstr ""
+
+#: src/dird/scheduler.c:113
+msgid "Dequeued job"
+msgstr ""
+
+#: src/dird/scheduler.c:116
+msgid "Scheduler logic error\n"
+msgstr ""
+
+#: src/dird/scheduler.c:132
+msgid "Run job"
+msgstr ""
+
+#: src/dird/scheduler.c:349
+msgid "Inserted job"
+msgstr ""
+
+#: src/dird/scheduler.c:357
+msgid "Appended job"
+msgstr ""
+
+#: src/dird/scheduler.c:361
+msgid "Run queue"
+msgstr ""
+
+#: src/dird/ua_cmds.c:90
+msgid "add media to a pool"
+msgstr ""
+
+#: src/dird/ua_cmds.c:91
+msgid "autodisplay [on|off] -- console messages"
+msgstr ""
+
+#: src/dird/ua_cmds.c:92
+msgid "automount [on|off] -- after label"
+msgstr ""
+
+#: src/dird/ua_cmds.c:93
+msgid "cancel [<jobid=nnn> | <job=name>] -- cancel a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:94
+msgid "create DB Pool from resource"
+msgstr ""
+
+#: src/dird/ua_cmds.c:95
+msgid "delete [pool=<pool-name> | media volume=<volume-name>]"
+msgstr ""
+
+#: src/dird/ua_cmds.c:96
+msgid "disable <job=name> -- disable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:97
+msgid "enable <job=name> -- enable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:98
+msgid "performs FileSet estimate, listing gives full listing"
+msgstr ""
+
+#: src/dird/ua_cmds.c:100
+msgid "gui [on|off] -- non-interactive gui mode"
+msgstr ""
+
+#: src/dird/ua_cmds.c:101 src/stored/btape.c:2540
+msgid "print this command"
+msgstr ""
+
+#: src/dird/ua_cmds.c:102
+msgid ""
+"list [pools | jobs | jobtotals | media <pool=pool-name> | files <jobid=nn>]; "
+"from catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:103
+msgid "label a tape"
+msgstr ""
+
+#: src/dird/ua_cmds.c:104
+msgid "full or long list like list command"
+msgstr ""
+
+#: src/dird/ua_cmds.c:105
+msgid "messages"
+msgstr ""
+
+#: src/dird/ua_cmds.c:106
+msgid "mount <storage-name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:107
+msgid "prune expired records from catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:108
+msgid "purge records from catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:109
+msgid "python control commands"
+msgstr ""
+
+#: src/dird/ua_cmds.c:111
+msgid "query catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:112
+msgid "restore files"
+msgstr ""
+
+#: src/dird/ua_cmds.c:113
+msgid "relabel a tape"
+msgstr ""
+
+#: src/dird/ua_cmds.c:114
+msgid "release <storage-name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:115
+msgid "reload conf file"
+msgstr ""
+
+#: src/dird/ua_cmds.c:116
+msgid "run <job-name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:117
+msgid "status [storage | client]=<name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:118
+msgid "sets debug level"
+msgstr ""
+
+#: src/dird/ua_cmds.c:119
+msgid "sets new client address -- if authorized"
+msgstr ""
+
+#: src/dird/ua_cmds.c:120
+msgid "show (resource records) [jobs | pools | ... | all]"
+msgstr ""
+
+#: src/dird/ua_cmds.c:121
+msgid "use SQL to query catalog"
+msgstr ""
+
+#: src/dird/ua_cmds.c:123
+msgid "turn on/off trace to file"
+msgstr ""
+
+#: src/dird/ua_cmds.c:124
+msgid "unmount <storage-name>"
+msgstr ""
+
+#: src/dird/ua_cmds.c:125
+msgid "umount <storage-name> for old-time Unix guys"
+msgstr ""
+
+#: src/dird/ua_cmds.c:126
+msgid "update Volume, Pool or slots"
+msgstr ""
+
+#: src/dird/ua_cmds.c:127
+msgid "use catalog xxx"
+msgstr ""
+
+#: src/dird/ua_cmds.c:128
+msgid "does variable expansion"
+msgstr ""
+
+#: src/dird/ua_cmds.c:129
+msgid "print Director version"
+msgstr ""
+
+#: src/dird/ua_cmds.c:130
+msgid "wait until no jobs are running"
+msgstr ""
+
+#: src/dird/ua_cmds.c:168
+#, c-format
+msgid "%s: is an illegal command.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:206
+msgid ""
+"You probably don't want to be using this command since it\n"
+"creates database records without labeling the Volumes.\n"
+"You probably want to use the \"label\" command.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:225
+#, c-format
+msgid "Pool already has maximum volumes = %d\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:227
+msgid "Enter new maximum (zero for unlimited): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:248
+#, c-format
+msgid "Enter number of Volumes to create. 0=>fixed name. Max=%d: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:254
+#, c-format
+msgid "The number must be between 0 and %d\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:261
+msgid "Enter Volume name: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:265
+msgid "Enter base volume name: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:274 src/dird/ua_label.c:605
+msgid "Volume name too long.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:278 src/dird/ua_label.c:611 src/lib/edit.c:413
+msgid "Volume name must be at least one character long.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:287
+msgid "Enter the starting number: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:292
+msgid "Start number must be greater than zero.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:303
+msgid "Enter slot (0 for none): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:307
+msgid "InChanger? yes/no: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:334
+#, c-format
+msgid "%d Volumes created in pool %s\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:350 src/dird/ua_cmds.c:917
+msgid "Turn on or off? "
+msgstr ""
+
+#: src/dird/ua_cmds.c:358 src/dird/ua_cmds.c:925
+msgid "off"
+msgstr ""
+
+#: src/dird/ua_cmds.c:378
+msgid "jobid"
+msgstr ""
+
+#: src/dird/ua_cmds.c:385
+#, c-format
+msgid "JobId %s is not running. Use Job name to cancel inactive jobs.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:389
+msgid "job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:394
+#, c-format
+msgid "Warning Job %s is not running. Continuing anyway ...\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:416 src/filed/status.c:195 src/stored/status.c:343
+msgid "No Jobs running.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:419
+msgid "Select Job:\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:425
+#, c-format
+msgid "JobId=%s Job=%s"
+msgstr ""
+
+#: src/dird/ua_cmds.c:430
+msgid "Choose Job to cancel"
+msgstr ""
+
+#: src/dird/ua_cmds.c:434
+msgid "Confirm cancel (yes/no): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:442
+#, c-format
+msgid "Job %s not found.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:547
+#, c-format
+msgid ""
+"Error: Pool %s already exists.\n"
+"Use update to change it.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:558
+#, c-format
+msgid "Pool %s created.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:571
+msgid "restart"
+msgstr ""
+
+#: src/dird/ua_cmds.c:575
+msgid "Python interpreter restarted.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:577 src/dird/ua_cmds.c:1145
+msgid "Nothing done.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:593 src/dird/ua_cmds.c:639
+msgid "Illegal command from this console.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:600 src/dird/ua_run.c:353
+#, c-format
+msgid "Client \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:609
+#, c-format
+msgid "Client \"%s\" address set to %s\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:634
+#, c-format
+msgid "Job \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:643
+#, c-format
+msgid "Job \"%s\" %sabled\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:667 src/dird/ua_status.c:286
+#, c-format
+msgid "Connecting to Storage daemon %s at %s:%d\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:673 src/dird/ua_status.c:297
+msgid "Connected to storage daemon\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:693 src/dird/ua_cmds.c:1032 src/dird/ua_status.c:324
+#, c-format
+msgid "Connecting to Client %s at %s:%d\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:696 src/dird/ua_cmds.c:1035
+msgid "Failed to connect to Client.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:812
+msgid "Enter new debug level: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:878
+msgid "Available daemons are: \n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:883
+msgid "Select daemon type to set debug level"
+msgstr ""
+
+#: src/dird/ua_cmds.c:987 src/dird/ua_run.c:478
+#, c-format
+msgid "Level %s not valid.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1000
+msgid "No job specified.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1040
+msgid "Error sending include list.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1045
+msgid "Error sending exclude list.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1131
+msgid ""
+"In general it is not a good idea to delete either a\n"
+"Pool or a Volume since they may contain data.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1134
+msgid "Choose catalog item to delete"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1202
+msgid "Enter JobId to delete: "
+msgstr ""
+
+#: src/dird/ua_cmds.c:1245
+#, c-format
+msgid "Job %s and associated records deleted from the catalog.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1258
+#, c-format
+msgid ""
+"\n"
+"This command will delete volume %s\n"
+"and all Jobs saved on that volume from the Catalog\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1262
+msgid "Are you sure you want to delete this Volume? (yes/no): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:1283
+msgid "Are you sure you want to delete this Pool? (yes/no): "
+msgstr ""
+
+#: src/dird/ua_cmds.c:1380
+#, c-format
+msgid "Using Catalog name=%s DB=%s\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1421 src/dird/ua_tree.c:622 src/stored/btape.c:2587
+#, c-format
+msgid ""
+"  Command    Description\n"
+"  =======    ===========\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1423
+#, c-format
+msgid "  %-10s %s\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1425
+msgid ""
+"\n"
+"When at a prompt, entering a period cancels the command.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1441
+#, c-format
+msgid "%s Version: %s (%s)\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1460
+msgid "Could not find a Catalog resource\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1463
+msgid "You must specify a \"use <catalog-name>\" command before continuing.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1467
+#, c-format
+msgid "Using default Catalog name=%s DB=%s\n"
+msgstr ""
+
+#: src/dird/ua_dotcmds.c:131
+msgid "The Director will segment fault.\n"
+msgstr ""
+
+#: src/dird/ua_dotcmds.c:231 src/dird/ua_restore.c:740
+#: src/dird/ua_restore.c:778 src/dird/ua_restore.c:809
+#, c-format
+msgid "Query failed: %s. ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_input.c:82
+msgid "Enter slot"
+msgstr ""
+
+#: src/dird/ua_input.c:86 src/dird/ua_input.c:92
+#, c-format
+msgid "Expected a positive integer, got: %s\n"
+msgstr ""
+
+#: src/dird/ua_input.c:120 src/dird/ua_run.c:862 src/dird/ua_select.c:54
+#: src/dird/ua_update.c:223 src/dird/ua_update.c:237 src/dird/ua_update.c:247
+#: src/dird/ua_update.c:261 src/dird/ua_update.c:551
+#: src/stored/parse_bsr.c:741 src/tools/dbcheck.c:1098
+msgid "yes"
+msgstr ""
+
+#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:225
+#: src/dird/ua_update.c:237 src/dird/ua_update.c:249 src/dird/ua_update.c:261
+#: src/dird/ua_update.c:551 src/stored/parse_bsr.c:741
+msgid "no"
+msgstr ""
+
+#: src/dird/ua_input.c:127
+msgid "Invalid response. You must answer yes or no.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:89
+msgid "Negative numbers not permitted\n"
+msgstr ""
+
+#: src/dird/ua_label.c:95
+msgid "Range end is not integer.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:100
+msgid "Range start is not an integer.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:106
+msgid "Range end not bigger than start.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:112
+msgid "Input value is not an integer.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:118
+msgid "Values must be be greater than zero.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:122
+msgid "Slot too large.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:176 src/dird/ua_label.c:473
+msgid "No slots in changer to scan.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:188 src/dird/ua_label.c:484
+msgid "No Volumes found to label, or no barcodes.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:198
+#, c-format
+msgid "Slot %d greater than max %d ignored.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:227
+#, c-format
+msgid "No VolName for Slot=%d InChanger set to zero.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:242
+#, c-format
+msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:246
+#, c-format
+msgid "Catalog record for Volume \"%s\" is up to date.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:252
+#, c-format
+msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:344
+#, c-format
+msgid ""
+"Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before "
+"relabeling.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:360
+msgid "Enter new Volume name: "
+msgstr ""
+
+#: src/dird/ua_label.c:373
+#, c-format
+msgid "Media record for new Volume \"%s\" already exists.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:388
+msgid "Enter slot (0 or Enter for none): "
+msgstr ""
+
+#: src/dird/ua_label.c:413
+#, c-format
+msgid "Delete of Volume \"%s\" failed. ERR=%s"
+msgstr ""
+
+#: src/dird/ua_label.c:416
+#, c-format
+msgid "Old volume \"%s\" deleted from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:427
+#, c-format
+msgid "Requesting to mount %s ...\n"
+msgstr ""
+
+#: src/dird/ua_label.c:449
+msgid "Do not forget to mount the drive!!!\n"
+msgstr ""
+
+#: src/dird/ua_label.c:489
+msgid ""
+"The following Volumes will be labeled:\n"
+"Slot  Volume\n"
+"==============\n"
+msgstr ""
+
+#: src/dird/ua_label.c:498 src/stored/btape.c:606
+msgid "Do you want to continue? (y/n): "
+msgstr ""
+
+#: src/dird/ua_label.c:519
+#, c-format
+msgid "Media record for Slot %d Volume \"%s\" already exists.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:525
+#, c-format
+msgid "Error setting InChanger: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_label.c:548
+#, c-format
+msgid "Maximum pool Volumes=%d reached.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:555
+#, c-format
+msgid "Catalog record for cleaning tape \"%s\" successfully created.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:562
+#, c-format
+msgid "Catalog error on cleaning tape: %s"
+msgstr ""
+
+#: src/dird/ua_label.c:598
+#, c-format
+msgid "Illegal character \"%c\" in a volume name.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:643
+#, c-format
+msgid "Sending relabel command from \"%s\" to \"%s\" ...\n"
+msgstr ""
+
+#: src/dird/ua_label.c:650
+#, c-format
+msgid "Sending label command for Volume \"%s\" Slot %d ...\n"
+msgstr ""
+
+#: src/dird/ua_label.c:682
+#, c-format
+msgid "Catalog record for Volume \"%s\", Slot %d  successfully created.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:695
+#, c-format
+msgid "Label command failed for Volume %s.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:705
+#, c-format
+msgid "Connecting to Storage daemon %s at %s:%d ...\n"
+msgstr ""
+
+#: src/dird/ua_label.c:733
+msgid "Could not open SD socket.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:739
+#, c-format
+msgid "readlabel %s Slot=%d drive=%d\n"
+msgstr ""
+
+#: src/dird/ua_label.c:781
+#, c-format
+msgid "autochanger list %s \n"
+msgstr ""
+
+#: src/dird/ua_label.c:805 src/dird/ua_label.c:815
+#, c-format
+msgid "Invalid Slot number: %s\n"
+msgstr ""
+
+#: src/dird/ua_label.c:824
+#, c-format
+msgid "Invalid Volume name: %s\n"
+msgstr ""
+
+#: src/dird/ua_label.c:893
+#, c-format
+msgid "autochanger slots %s\n"
+msgstr ""
+
+#: src/dird/ua_label.c:903
+#, c-format
+msgid "Device \"%s\" has %d slots.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:925
+#, c-format
+msgid "autochanger drives %s\n"
+msgstr ""
+
+#: src/dird/ua_label.c:952
+#, c-format
+msgid "Pool \"%s\" resource not found!\n"
+msgstr ""
+
+#: src/dird/ua_output.c:64 src/dird/ua_output.c:88
+msgid "ON or OFF keyword missing.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:176
+msgid "Keywords for the show command are:\n"
+msgstr ""
+
+#: src/dird/ua_output.c:182
+#, c-format
+msgid "%s resource %s not found.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:185
+#, c-format
+msgid "Resource %s not found\n"
+msgstr ""
+
+#: src/dird/ua_output.c:251
+msgid "Hey! DB is NULL\n"
+msgstr ""
+
+#: src/dird/ua_output.c:358
+#, c-format
+msgid "Jobid %d used %d Volume(s): %s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:376
+msgid "No Pool specified.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:387 src/dird/ua_select.c:458
+#, c-format
+msgid "Error obtaining pool ids. ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:397
+#, c-format
+msgid "Pool: %s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:413 src/dird/ua_status.c:452
+msgid "Ignoring illegal value for days.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:422
+#, c-format
+msgid "Unknown list keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:448
+#, c-format
+msgid "%s is not a job name.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:469
+#, c-format
+msgid "Could not find next Volume for Job %s (%s, %s).\n"
+msgstr ""
+
+#: src/dird/ua_output.c:473
+#, c-format
+msgid "The next Volume to be used by Job \"%s\" (%s, %s) will be %s\n"
+msgstr ""
+
+#: src/dird/ua_output.c:483
+#, c-format
+msgid "Could not find next Volume for Job %s.\n"
+msgstr ""
+
+#: src/dird/ua_output.c:673
+msgid "You have no messages.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:173
+msgid "Choose item to prune"
+msgstr ""
+
+#: src/dird/ua_prune.c:254
+msgid "No Files found to prune.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:286
+#, c-format
+msgid "Pruned Files from %s Jobs for client %s from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:392
+msgid "No Jobs found to prune.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:453
+#, c-format
+msgid "Pruned %d %s for client %s from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:454
+msgid "Jobs"
+msgstr ""
+
+#: src/dird/ua_prune.c:501
+#, c-format
+msgid "There are no Jobs associated with Volume \"%s\". Prune not needed.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:508 src/dird/ua_purge.c:482
+#, c-format
+msgid "There are no Jobs associated with Volume \"%s\". Marking it purged.\n"
+msgstr ""
+
+#: src/dird/ua_prune.c:566
+#, c-format
+msgid "Pruned %d %s on Volume \"%s\" from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:177
+msgid ""
+"\n"
+"This command is can be DANGEROUS!!!\n"
+"\n"
+"It purges (deletes) all Files from a Job,\n"
+"JobId, Client or Volume; or it purges (deletes)\n"
+"all Jobs from a Client or Volume without regard\n"
+"for retention periods. Normally you should use the\n"
+"PRUNE command, which respects retention periods.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:237
+msgid "Choose item to purge"
+msgstr ""
+
+#: src/dird/ua_purge.c:282
+#, c-format
+msgid "Begin purging files for Client \"%s\"\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:294
+#, c-format
+msgid "No Files found for client %s to purge from %s catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:325
+#, c-format
+msgid "%d Files for client \"%s\" purged from %s catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:362
+#, c-format
+msgid "Begin purging jobs from Client \"%s\"\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:373
+#, c-format
+msgid "No Jobs found for client %s to purge from %s catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:413
+#, c-format
+msgid "%d Jobs for client %s purged from %s catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:464
+#, c-format
+msgid ""
+"Volume \"%s\" has VolStatus \"%s\" and cannot be purged.\n"
+"The VolStatus must be: Append, Full, Used, or Error to be purged.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:535
+#, c-format
+msgid "%d File%s on Volume \"%s\" purged from catalog.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:549
+#, c-format
+msgid ""
+"There are no more Jobs associated with Volume \"%s\". Marking it purged.\n"
+msgstr ""
+
+#: src/dird/ua_purge.c:581
+#, c-format
+msgid "Cannot purge Volume with VolStatus=%s\n"
+msgstr ""
+
+#: src/dird/ua_query.c:59 src/findlib/create_file.c:282
+#: src/findlib/create_file.c:339
+#, c-format
+msgid "Could not open %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_query.c:64
+msgid "Available queries:\n"
+msgstr ""
+
+#: src/dird/ua_query.c:71
+msgid "Choose a query"
+msgstr ""
+
+#: src/dird/ua_query.c:85
+msgid "Could not find query.\n"
+msgstr ""
+
+#: src/dird/ua_query.c:103
+msgid "Too many prompts in query, max is 9.\n"
+msgstr ""
+
+#: src/dird/ua_query.c:206
+#, c-format
+msgid "Warning prompt %d missing.\n"
+msgstr ""
+
+#: src/dird/ua_query.c:252
+msgid ""
+"Entering SQL query mode.\n"
+"Terminate each query with a semicolon.\n"
+"Terminate query mode with a blank line.\n"
+msgstr ""
+
+#: src/dird/ua_query.c:255 src/dird/ua_query.c:272
+msgid "Enter SQL query: "
+msgstr ""
+
+#: src/dird/ua_query.c:274
+msgid "Add to SQL query: "
+msgstr ""
+
+#: src/dird/ua_query.c:278
+msgid "End query mode.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:115
+msgid ""
+"No Restore Job Resource found in bacula-dir.conf.\n"
+"You must create at least one before running this command.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:131
+msgid "Restore not done.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:142
+msgid "Unable to construct a valid BSR. Cannot continue.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:146 src/dird/ua_restore.c:160
+msgid "No files selected to be restored.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:154
+msgid ""
+"\n"
+"1 file selected to be restored.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:157
+#, c-format
+msgid ""
+"\n"
+"%u files selected to be restored.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:175
+msgid "No Restore Job resource found!\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:237
+#, c-format
+msgid "Missing value for keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:286
+msgid "List last 20 Jobs run"
+msgstr ""
+
+#: src/dird/ua_restore.c:287
+msgid "List Jobs where a given File is saved"
+msgstr ""
+
+#: src/dird/ua_restore.c:288
+msgid "Enter list of comma separated JobIds to select"
+msgstr ""
+
+#: src/dird/ua_restore.c:289
+msgid "Enter SQL list command"
+msgstr ""
+
+#: src/dird/ua_restore.c:290
+msgid "Select the most recent backup for a client"
+msgstr ""
+
+#: src/dird/ua_restore.c:291
+msgid "Select backup for a client before a specified time"
+msgstr ""
+
+#: src/dird/ua_restore.c:292
+msgid "Enter a list of files to restore"
+msgstr ""
+
+#: src/dird/ua_restore.c:293
+msgid "Enter a list of files to restore before a specified time"
+msgstr ""
+
+#: src/dird/ua_restore.c:294
+msgid "Find the JobIds of the most recent backup for a client"
+msgstr ""
+
+#: src/dird/ua_restore.c:295
+msgid "Find the JobIds for a backup for a client before a specified time"
+msgstr ""
+
+#: src/dird/ua_restore.c:296
+msgid "Enter a list of directories to restore for found JobIds"
+msgstr ""
+
+#: src/dird/ua_restore.c:297 src/dird/ua_status.c:713 src/filed/status.c:251
+#: src/stored/status.c:412 src/wx-console/wxbconfigpanel.cpp:191
+msgid "Cancel"
+msgstr ""
+
+#: src/dird/ua_restore.c:333
+#, c-format
+msgid "Unknown keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:357
+#, c-format
+msgid "Improper date format: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:397 src/dird/ua_select.c:590
+#, c-format
+msgid "Error: Pool resource \"%s\" does not exist.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:402
+#, c-format
+msgid "Error: Pool resource \"%s\" access not allowed.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:421
+msgid ""
+"\n"
+"First you select one or more JobIds that contain files\n"
+"to be restored. You will be presented several methods\n"
+"of specifying the JobIds. Then you will be allowed to\n"
+"select which files from those JobIds are to be restored.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:433
+msgid "To select the JobIds, you have the following choices:\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:438
+msgid "Select item: "
+msgstr ""
+
+#: src/dird/ua_restore.c:452
+msgid "Enter Filename (no path):"
+msgstr ""
+
+#: src/dird/ua_restore.c:467 src/dird/ua_restore.c:567
+msgid "Enter JobId(s), comma separated, to restore: "
+msgstr ""
+
+#: src/dird/ua_restore.c:473
+msgid "Enter SQL list command: "
+msgstr ""
+
+#: src/dird/ua_restore.c:501 src/dird/ua_restore.c:526
+msgid ""
+"Enter file names with paths, or < to enter a filename\n"
+"containg a list of file names with paths, and terminate\n"
+"them with a blank line.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:505 src/dird/ua_restore.c:530
+msgid "Enter full filename: "
+msgstr ""
+
+#: src/dird/ua_restore.c:565
+#, c-format
+msgid "You have already seleted the following JobIds: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:580
+msgid ""
+"Enter full directory names or start the name\n"
+"with a < to indicate it is a filename containg a list\n"
+"of directories and terminate them with a blank line.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:584
+msgid "Enter directory name: "
+msgstr ""
+
+#: src/dird/ua_restore.c:609
+msgid "No Jobs selected.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:613
+#, c-format
+msgid "You have selected the following JobIds: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:616
+#, c-format
+msgid "You have selected the following JobId: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:624
+msgid "Invalid JobId in list.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:637
+#, c-format
+msgid "Unable to get Job record for JobId=%s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:642
+#, c-format
+msgid "No authorization. Job \"%s\" not selected.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:656
+msgid ""
+"The restored files will the most current backup\n"
+"BEFORE the date you specify below.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:659
+msgid "Enter date as YYYY-MM-DD HH:MM:SS :"
+msgstr ""
+
+#: src/dird/ua_restore.c:665
+msgid "Improper date format.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:686
+#, c-format
+msgid "Cannot open file %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:694 src/dird/ua_restore.c:698
+#, c-format
+msgid "Error occurred on line %d of %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:744 src/dird/ua_restore.c:782
+#, c-format
+msgid "No database record found for: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:769
+msgid "No JobId specified cannot continue.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:813
+#, c-format
+msgid "No table found: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:918
+#, c-format
+msgid ""
+"\n"
+"Building directory tree for JobId %s ...  "
+msgstr ""
+
+#: src/dird/ua_restore.c:937
+msgid ""
+"\n"
+"There were no files inserted into the tree, so file selection\n"
+"is not possible.Most likely your retention policy pruned the files\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:939
+msgid ""
+"\n"
+"Do you want to restore all the files? (yes|no): "
+msgstr ""
+
+#: src/dird/ua_restore.c:955
+#, c-format
+msgid ""
+"\n"
+"1 Job, %s files inserted into the tree and marked for extraction.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:959
+#, c-format
+msgid ""
+"\n"
+"1 Job, %s files inserted into the tree.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:965
+#, c-format
+msgid ""
+"\n"
+"%d Jobs, %s files inserted into the tree and marked for extraction.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:969
+#, c-format
+msgid ""
+"\n"
+"%d Jobs, %s files inserted into the tree.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1046
+#, c-format
+msgid "Error getting FileSet \"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1054 src/dird/ua_select.c:167
+msgid "The defined FileSet resources are:\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1058 src/dird/ua_run.c:644 src/dird/ua_select.c:175
+msgid "FileSet"
+msgstr ""
+
+#: src/dird/ua_restore.c:1058 src/dird/ua_select.c:175
+msgid "Select FileSet resource"
+msgstr ""
+
+#: src/dird/ua_restore.c:1065
+#, c-format
+msgid "Error getting FileSet record: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1066
+msgid ""
+"This probably means you modified the FileSet.\n"
+"Continuing anyway.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1081
+#, c-format
+msgid "Pool \"%s\" not found, using any pool.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1107 src/dird/ua_restore.c:1123
+#, c-format
+msgid "No Full backup before %s found.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1146
+msgid "No jobs found.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1312
+msgid ""
+"Warning, the JobIds that you selected refer to more than one MediaType.\n"
+"Restore is not possible. The MediaTypes used are:\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1320
+msgid "No MediaType found for your JobIds.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1352
+#, c-format
+msgid "Warning default storage overridden by %s on command line.\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:1363
+#, c-format
+msgid ""
+"\n"
+"Warning. Unable to find Storage resource for\n"
+"MediaType \"%s\", needed by the Jobs you selected.\n"
+"You will be allowed to select a Storage device later.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:112
+#, c-format
+msgid "Value missing for keyword %s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:119
+msgid "Job name specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:127
+msgid "JobId specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:136
+msgid "Client specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:144
+msgid "FileSet specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:152
+msgid "Level specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:161
+msgid "Storage specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:169
+msgid "Pool specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:177
+msgid "Where specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:185
+msgid "Bootstrap specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:193
+msgid "Replace specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:201
+msgid "When specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:209
+msgid "Priority specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:214
+msgid "Priority must be positive nonzero setting it to 10.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:224
+msgid "Verify Job specified twice.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:268
+#, c-format
+msgid "Invalid keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:280
+#, c-format
+msgid "Catalog \"%s\" not found\n"
+msgstr ""
+
+#: src/dird/ua_run.c:291
+#, c-format
+msgid "Job \"%s\" not found\n"
+msgstr ""
+
+#: src/dird/ua_run.c:298
+msgid "A job name must be specified.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:304
+#, c-format
+msgid "No authorization. Job \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:313
+#, c-format
+msgid "Storage \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:323
+#, c-format
+msgid "No authorization. Storage \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:333
+#, c-format
+msgid "Pool \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:343
+#, c-format
+msgid "No authorization. Pool \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:363
+#, c-format
+msgid "No authorization. Client \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:372
+#, c-format
+msgid "FileSet \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:381
+#, c-format
+msgid "No authorization. FileSet \"%s\".\n"
+msgstr ""
+
+#: src/dird/ua_run.c:389
+#, c-format
+msgid "Verify Job \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:422 src/dird/ua_run.c:764
+msgid "Invalid time, using current time.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:442
+#, c-format
+msgid "Invalid replace option: %s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:500
+#, c-format
+msgid ""
+"Run %s job\n"
+"JobName:  %s\n"
+"FileSet:  %s\n"
+"Client:   %s\n"
+"Storage:  %s\n"
+"When:     %s\n"
+"Priority: %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:507 src/lib/util.c:295
+msgid "Admin"
+msgstr ""
+
+#: src/dird/ua_run.c:519
+#, c-format
+msgid ""
+"Run %s job\n"
+"JobName:  %s\n"
+"FileSet:  %s\n"
+"Level:    %s\n"
+"Client:   %s\n"
+"Storage:  %s\n"
+"Pool:     %s\n"
+"When:     %s\n"
+"Priority: %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:528 src/lib/util.c:286
+msgid "Backup"
+msgstr ""
+
+#: src/dird/ua_run.c:544
+#, c-format
+msgid ""
+"Run %s job\n"
+"JobName:     %s\n"
+"FileSet:     %s\n"
+"Level:       %s\n"
+"Client:      %s\n"
+"Storage:     %s\n"
+"Pool:        %s\n"
+"Verify Job:  %s\n"
+"When:        %s\n"
+"Priority:    %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:554 src/lib/util.c:289
+msgid "Verify"
+msgstr ""
+
+#: src/dird/ua_run.c:571
+msgid "Please enter a JobId for restore: "
+msgstr ""
+
+#: src/dird/ua_run.c:580
+#, c-format
+msgid ""
+"Run Restore job\n"
+"JobName:    %s\n"
+"Bootstrap:  %s\n"
+"Where:      %s\n"
+"Replace:    %s\n"
+"FileSet:    %s\n"
+"Client:     %s\n"
+"Storage:    %s\n"
+"When:       %s\n"
+"Catalog:    %s\n"
+"Priority:   %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:602
+#, c-format
+msgid ""
+"Run Restore job\n"
+"JobName:    %s\n"
+"Bootstrap:  %s\n"
+"Where:      %s\n"
+"Replace:    %s\n"
+"Client:     %s\n"
+"Storage:    %s\n"
+"JobId:      %s\n"
+"When:       %s\n"
+"Catalog:    %s\n"
+"Priority:   %d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:626
+#, c-format
+msgid "Unknown Job Type=%d\n"
+msgstr ""
+
+#: src/dird/ua_run.c:631
+msgid "OK to run? (yes/mod/no): "
+msgstr ""
+
+#: src/dird/ua_run.c:637 src/dird/ua_select.c:44
+msgid "mod"
+msgstr ""
+
+#: src/dird/ua_run.c:640 src/dird/ua_update.c:464
+msgid "Parameters to modify:\n"
+msgstr ""
+
+#: src/dird/ua_run.c:641
+msgid "Level"
+msgstr ""
+
+#: src/dird/ua_run.c:642 src/dird/ua_select.c:152
+#: src/wx-console/wxbrestorepanel.cpp:321
+#: src/wx-console/wxbrestorepanel.cpp:337
+#: src/wx-console/wxbrestorepanel.cpp:458
+#: src/wx-console/wxbrestorepanel.cpp:459
+#: src/wx-console/wxbrestorepanel.cpp:469
+#: src/wx-console/wxbrestorepanel.cpp:470
+#: src/wx-console/wxbrestorepanel.cpp:1133
+#: src/wx-console/wxbrestorepanel.cpp:1794
+#: src/wx-console/wxbrestorepanel.cpp:1865
+msgid "Storage"
+msgstr ""
+
+#: src/dird/ua_run.c:645 src/dird/ua_select.c:282 src/dird/ua_select.c:391
+#: src/wx-console/wxbrestorepanel.cpp:318
+#: src/wx-console/wxbrestorepanel.cpp:336
+#: src/wx-console/wxbrestorepanel.cpp:410
+#: src/wx-console/wxbrestorepanel.cpp:411
+#: src/wx-console/wxbrestorepanel.cpp:421
+#: src/wx-console/wxbrestorepanel.cpp:422
+#: src/wx-console/wxbrestorepanel.cpp:669
+#: src/wx-console/wxbrestorepanel.cpp:1103
+#: src/wx-console/wxbrestorepanel.cpp:1190
+#: src/wx-console/wxbrestorepanel.cpp:1787
+#: src/wx-console/wxbrestorepanel.cpp:1789
+#: src/wx-console/wxbrestorepanel.cpp:1863
+#: src/wx-console/wxbrestorepanel.cpp:1918
+msgid "Client"
+msgstr ""
+
+#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:338
+#: src/wx-console/wxbrestorepanel.cpp:823
+#: src/wx-console/wxbrestorepanel.cpp:1867
+msgid "When"
+msgstr ""
+
+#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:339
+#: src/wx-console/wxbrestorepanel.cpp:1096
+#: src/wx-console/wxbrestorepanel.cpp:1869
+msgid "Priority"
+msgstr ""
+
+#: src/dird/ua_run.c:650 src/dird/ua_select.c:476 src/dird/ua_select.c:566
+#: src/dird/ua_update.c:400 src/dird/ua_update.c:475
+#: src/wx-console/wxbrestorepanel.cpp:320
+#: src/wx-console/wxbrestorepanel.cpp:506
+#: src/wx-console/wxbrestorepanel.cpp:516
+#: src/wx-console/wxbrestorepanel.cpp:1783
+msgid "Pool"
+msgstr ""
+
+#: src/dird/ua_run.c:652
+msgid "Verify Job"
+msgstr ""
+
+#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:331
+#: src/wx-console/wxbrestorepanel.cpp:1848
+msgid "Bootstrap"
+msgstr ""
+
+#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:332
+#: src/wx-console/wxbrestorepanel.cpp:1072
+#: src/wx-console/wxbrestorepanel.cpp:1850
+msgid "Where"
+msgstr ""
+
+#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:334
+#: src/wx-console/wxbrestorepanel.cpp:1080
+#: src/wx-console/wxbrestorepanel.cpp:1854
+#: src/wx-console/wxbrestorepanel.cpp:1855
+#: src/wx-console/wxbrestorepanel.cpp:1856
+#: src/wx-console/wxbrestorepanel.cpp:1857
+#: src/wx-console/wxbrestorepanel.cpp:1858
+msgid "Replace"
+msgstr ""
+
+#: src/dird/ua_run.c:658
+msgid "JobId"
+msgstr ""
+
+#: src/dird/ua_run.c:660 src/dird/ua_update.c:479
+msgid "Select parameter to modify"
+msgstr ""
+
+#: src/dird/ua_run.c:664 src/dird/ua_run.c:691
+msgid "Levels:\n"
+msgstr ""
+
+#: src/dird/ua_run.c:665 src/filed/status.c:368 src/lib/util.c:319
+#: src/stored/status.c:451
+msgid "Base"
+msgstr ""
+
+#: src/dird/ua_run.c:666 src/filed/status.c:370 src/lib/util.c:321
+#: src/stored/status.c:453
+msgid "Full"
+msgstr ""
+
+#: src/dird/ua_run.c:667 src/filed/status.c:373 src/lib/util.c:324
+#: src/stored/status.c:456
+msgid "Incremental"
+msgstr ""
+
+#: src/dird/ua_run.c:668 src/filed/status.c:376 src/lib/util.c:327
+#: src/stored/status.c:459
+msgid "Differential"
+msgstr ""
+
+#: src/dird/ua_run.c:669 src/filed/status.c:379 src/lib/util.c:330
+#: src/stored/status.c:462
+msgid "Since"
+msgstr ""
+
+#: src/dird/ua_run.c:670 src/dird/ua_run.c:697
+msgid "Select level"
+msgstr ""
+
+#: src/dird/ua_run.c:692
+msgid "Initialize Catalog"
+msgstr ""
+
+#: src/dird/ua_run.c:693 src/filed/status.c:382 src/lib/util.c:333
+#: src/stored/status.c:465
+msgid "Verify Catalog"
+msgstr ""
+
+#: src/dird/ua_run.c:694 src/lib/util.c:339
+msgid "Verify Volume to Catalog"
+msgstr ""
+
+#: src/dird/ua_run.c:695 src/lib/util.c:342
+msgid "Verify Disk to Catalog"
+msgstr ""
+
+#: src/dird/ua_run.c:696
+msgid "Verify Volume Data (not yet implemented)"
+msgstr ""
+
+#: src/dird/ua_run.c:718
+msgid "Level not appropriate for this Job. Cannot be changed.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:756
+msgid ""
+"Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): "
+msgstr ""
+
+#: src/dird/ua_run.c:771
+msgid "Enter new Priority: "
+msgstr ""
+
+#: src/dird/ua_run.c:775
+msgid "Priority must be a positive integer.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:793
+msgid "Please enter the Bootstrap file name: "
+msgstr ""
+
+#: src/dird/ua_run.c:804
+#, c-format
+msgid "Warning cannot open %s: ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:823
+msgid "Please enter path prefix for restore (/ for none): "
+msgstr ""
+
+#: src/dird/ua_run.c:837
+msgid "Replace:\n"
+msgstr ""
+
+#: src/dird/ua_run.c:841
+msgid "Select replace option"
+msgstr ""
+
+#: src/dird/ua_run.c:851
+msgid ""
+"You must set the bootstrap file to NULL to be able to specify a JobId.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:869
+msgid "Job failed.\n"
+msgstr ""
+
+#: src/dird/ua_run.c:872
+#, c-format
+msgid "Job started. JobId=%s\n"
+msgstr ""
+
+#: src/dird/ua_run.c:878
+msgid "Job not run.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:39
+#, c-format
+msgid "The current %s retention period is: %s\n"
+msgstr ""
+
+#: src/dird/ua_select.c:41
+msgid "Continue? (yes/mod/no): "
+msgstr ""
+
+#: src/dird/ua_select.c:45
+msgid "Enter new retention period: "
+msgstr ""
+
+#: src/dird/ua_select.c:49
+msgid "Invalid period.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:128
+msgid "You have the following choices:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:144
+msgid "The defined Storage resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:152
+msgid "Select Storage resource"
+msgstr ""
+
+#: src/dird/ua_select.c:193
+msgid "catalog"
+msgstr ""
+
+#: src/dird/ua_select.c:201
+msgid "The defined Catalog resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:209
+msgid "Catalog"
+msgstr ""
+
+#: src/dird/ua_select.c:209
+msgid "Select Catalog resource"
+msgstr ""
+
+#: src/dird/ua_select.c:226
+msgid "The defined Job resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:234
+msgid "Select Job resource"
+msgstr ""
+
+#: src/dird/ua_select.c:249
+msgid "The defined Restore Job resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:257
+msgid "Select Restore Job"
+msgstr ""
+
+#: src/dird/ua_select.c:274
+msgid "The defined Client resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:282
+msgid "Select Client (File daemon) resource"
+msgstr ""
+
+#: src/dird/ua_select.c:309
+#, c-format
+msgid "Error: Client resource %s does not exist.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:334
+#, c-format
+msgid "Could not find Client %s: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_select.c:337 src/lib/bnet_server.c:284
+#: src/lib/bnet_server.c:378
+msgid "client"
+msgstr ""
+
+#: src/dird/ua_select.c:338
+msgid "fd"
+msgstr ""
+
+#: src/dird/ua_select.c:344 src/dird/ua_select.c:398
+#, c-format
+msgid "Could not find Client \"%s\": ERR=%s"
+msgstr ""
+
+#: src/dird/ua_select.c:373
+#, c-format
+msgid "Error obtaining client ids. ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_select.c:377
+msgid "No clients defined. You must run a job before using this command.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:381
+msgid "Defined Clients:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:391
+msgid "Select the Client"
+msgstr ""
+
+#: src/dird/ua_select.c:424 src/dird/ua_select.c:447 src/dird/ua_select.c:483
+#, c-format
+msgid "Could not find Pool \"%s\": ERR=%s"
+msgstr ""
+
+#: src/dird/ua_select.c:462
+msgid "No pools defined. Use the \"create\" command to create one.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:466
+msgid "Defined Pools:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:476
+msgid "Select the Pool"
+msgstr ""
+
+#: src/dird/ua_select.c:506
+#, c-format
+msgid "No access to Pool \"%s\"\n"
+msgstr ""
+
+#: src/dird/ua_select.c:532
+msgid "Enter MediaId or Volume name: "
+msgstr ""
+
+#: src/dird/ua_select.c:558
+msgid "The defined Pool resources are:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:566
+msgid "Select Pool resource"
+msgstr ""
+
+#: src/dird/ua_select.c:601
+msgid "Enter the JobId to select: "
+msgstr ""
+
+#: src/dird/ua_select.c:638
+#, c-format
+msgid "Could not find Job \"%s\": ERR=%s"
+msgstr ""
+
+#: src/dird/ua_select.c:705
+#, c-format
+msgid "Automatically selected %s: %s\n"
+msgstr ""
+
+#: src/dird/ua_select.c:710
+#, c-format
+msgid "Cannot select %s in batch mode.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:722
+msgid "Selection is empty!\n"
+msgstr ""
+
+#: src/dird/ua_select.c:728
+msgid "Item 1 selected automatically.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:739
+msgid "Selection aborted, nothing done.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:744
+#, c-format
+msgid "Please enter a number between 1 and %d\n"
+msgstr ""
+
+#: src/dird/ua_select.c:793
+msgid "Storage name given twice.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:810
+#, c-format
+msgid "Expecting jobid=nn command, got: %s\n"
+msgstr ""
+
+#: src/dird/ua_select.c:814
+#, c-format
+msgid "JobId %s is not running.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:823
+#, c-format
+msgid "Expecting job=xxx, got: %s.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:827
+#, c-format
+msgid "Job \"%s\" is not running.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:843
+#, c-format
+msgid "Storage resource \"%s\": not found\n"
+msgstr ""
+
+#: src/dird/ua_select.c:875
+msgid "Enter autochanger drive[0]: "
+msgstr ""
+
+#: src/dird/ua_select.c:905
+msgid "Media Types defined in conf file:\n"
+msgstr ""
+
+#: src/dird/ua_select.c:911
+msgid "Media Type"
+msgstr ""
+
+#: src/dird/ua_select.c:911
+msgid "Select the Media Type"
+msgstr ""
+
+#: src/dird/ua_server.c:61
+#, c-format
+msgid "Cannot create UA thread: %s\n"
+msgstr ""
+
+#: src/dird/ua_server.c:142
+msgid "You have messages.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:126
+msgid "Status available for:\n"
+msgstr ""
+
+#: src/dird/ua_status.c:132
+msgid "Select daemon type for status"
+msgstr ""
+
+#: src/dird/ua_status.c:245
+#, c-format
+msgid "%s Version: %s (%s) %s %s %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:249 src/stored/status.c:71
+#, c-format
+msgid "Daemon started %s, 1 Job run since started.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:252 src/stored/status.c:74
+#, c-format
+msgid "Daemon started %s, %d Jobs run since started.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:257 src/filed/status.c:121 src/stored/status.c:78
+#, c-format
+msgid " Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:277 src/dird/ua_status.c:493 src/dird/ua_status.c:655
+#: src/filed/status.c:198 src/filed/status.c:277 src/stored/status.c:345
+#: src/stored/status.c:361 src/stored/status.c:438
+msgid "====\n"
+msgstr ""
+
+#: src/dird/ua_status.c:289
+#, c-format
+msgid ""
+"\n"
+"Failed to connect to Storage daemon %s.\n"
+"====\n"
+msgstr ""
+
+#: src/dird/ua_status.c:327
+#, c-format
+msgid ""
+"Failed to connect to Client %s.\n"
+"====\n"
+msgstr ""
+
+#: src/dird/ua_status.c:335
+msgid "Connected to file daemon\n"
+msgstr ""
+
+#: src/dird/ua_status.c:350
+msgid ""
+"\n"
+"Scheduled Jobs:\n"
+msgstr ""
+
+#: src/dird/ua_status.c:351
+msgid ""
+"Level          Type     Pri  Scheduled          Name               Volume\n"
+msgstr ""
+
+#: src/dird/ua_status.c:352
+msgid "===================================================================================\n"
+msgstr ""
+
+#: src/dird/ua_status.c:399
+#, c-format
+msgid "%-14s %-8s %3d  %-18s %-18s %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:491
+msgid "No Scheduled Jobs.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:508 src/stored/status.c:277
+msgid ""
+"\n"
+"Running Jobs:\n"
+msgstr ""
+
+#: src/dird/ua_status.c:516
+#, c-format
+msgid "Console connected at %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:526
+msgid ""
+"No Jobs running.\n"
+"====\n"
+msgstr ""
+
+#: src/dird/ua_status.c:531
+msgid " JobId Level   Name                       Status\n"
+msgstr ""
+
+#: src/dird/ua_status.c:532 src/filed/status.c:221 src/stored/status.c:382
+msgid "======================================================================\n"
+msgstr ""
+
+#: src/dird/ua_status.c:540
+msgid "is waiting execution"
+msgstr ""
+
+#: src/dird/ua_status.c:543
+msgid "is running"
+msgstr ""
+
+#: src/dird/ua_status.c:546
+msgid "is blocked"
+msgstr ""
+
+#: src/dird/ua_status.c:549
+msgid "has terminated"
+msgstr ""
+
+#: src/dird/ua_status.c:552
+msgid "has erred"
+msgstr ""
+
+#: src/dird/ua_status.c:555
+msgid "has errors"
+msgstr ""
+
+#: src/dird/ua_status.c:558
+msgid "has a fatal error"
+msgstr ""
+
+#: src/dird/ua_status.c:561
+msgid "has verify differences"
+msgstr ""
+
+#: src/dird/ua_status.c:564
+msgid "has been canceled"
+msgstr ""
+
+#: src/dird/ua_status.c:568
+#, c-format
+msgid "is waiting on Client %s"
+msgstr ""
+
+#: src/dird/ua_status.c:574
+#, c-format
+msgid "is waiting on Storage %s"
+msgstr ""
+
+#: src/dird/ua_status.c:579
+msgid "is waiting on max Storage jobs"
+msgstr ""
+
+#: src/dird/ua_status.c:582
+msgid "is waiting on max Client jobs"
+msgstr ""
+
+#: src/dird/ua_status.c:585
+msgid "is waiting on max Job jobs"
+msgstr ""
+
+#: src/dird/ua_status.c:588
+msgid "is waiting on max total jobs"
+msgstr ""
+
+#: src/dird/ua_status.c:591
+msgid "is waiting for its start time"
+msgstr ""
+
+#: src/dird/ua_status.c:594
+msgid "is waiting for higher priority jobs to finish"
+msgstr ""
+
+#: src/dird/ua_status.c:599
+#, c-format
+msgid "is in unknown state %c"
+msgstr ""
+
+#: src/dird/ua_status.c:613
+msgid "is waiting for a mount request"
+msgstr ""
+
+#: src/dird/ua_status.c:620
+msgid "is waiting for an appendable Volume"
+msgstr ""
+
+#: src/dird/ua_status.c:627
+#, c-format
+msgid "is waiting for Client %s to connect to Storage %s"
+msgstr ""
+
+#: src/dird/ua_status.c:643
+#, c-format
+msgid "%6d %-6s  %-20s %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:665 src/filed/status.c:211 src/stored/status.c:373
+msgid "No Terminated Jobs.\n"
+msgstr ""
+
+#: src/dird/ua_status.c:670 src/stored/status.c:378
+msgid ""
+"\n"
+"Terminated Jobs:\n"
+msgstr ""
+
+#: src/dird/ua_status.c:671
+msgid " JobId  Level     Files      Bytes     Status   Finished        Name \n"
+msgstr ""
+
+#: src/dird/ua_status.c:672
+msgid "========================================================================\n"
+msgstr ""
+
+#: src/dird/ua_status.c:703 src/filed/status.c:241 src/lib/util.c:178
+#: src/stored/status.c:402
+msgid "Created"
+msgstr ""
+
+#: src/dird/ua_status.c:707 src/filed/status.c:245 src/lib/util.c:191
+#: src/lib/util.c:258 src/stored/status.c:406
+msgid "Error"
+msgstr ""
+
+#: src/dird/ua_status.c:710 src/filed/status.c:248 src/stored/status.c:409
+msgid "Diffs"
+msgstr ""
+
+#: src/dird/ua_status.c:716 src/filed/status.c:254 src/lib/util.c:187
+#: src/lib/util.c:254 src/stored/btape.c:1158 src/stored/status.c:415
+#: src/wx-console/wxbconfigpanel.cpp:180
+msgid "OK"
+msgstr ""
+
+#: src/dird/ua_status.c:719 src/filed/status.c:257 src/stored/status.c:418
+msgid "Other"
+msgstr ""
+
+#: src/dird/ua_status.c:722 src/filed/status.c:268 src/stored/status.c:429
+#, c-format
+msgid "%6d  %-6s %8s %14s %-7s  %-8s %s\n"
+msgstr ""
+
+#: src/dird/ua_status.c:730 src/stored/btape.c:180
+msgid "\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:58
+msgid "change current directory"
+msgstr ""
+
+#: src/dird/ua_tree.c:59
+msgid "count marked files in and below the cd"
+msgstr ""
+
+#: src/dird/ua_tree.c:60 src/dird/ua_tree.c:61
+msgid "long list current directory, wildcards allowed"
+msgstr ""
+
+#: src/dird/ua_tree.c:62
+msgid "leave file selection mode"
+msgstr ""
+
+#: src/dird/ua_tree.c:63
+msgid "estimate restore size"
+msgstr ""
+
+#: src/dird/ua_tree.c:64
+msgid "same as done command"
+msgstr ""
+
+#: src/dird/ua_tree.c:65
+msgid "find files, wildcards allowed"
+msgstr ""
+
+#: src/dird/ua_tree.c:66 src/dird/ua_tree.c:75
+msgid "print help"
+msgstr ""
+
+#: src/dird/ua_tree.c:67
+msgid "list current directory, wildcards allowed"
+msgstr ""
+
+#: src/dird/ua_tree.c:68
+msgid "list the marked files in and below the cd"
+msgstr ""
+
+#: src/dird/ua_tree.c:69
+msgid "mark dir/file to be restored recursively, wildcards allowed"
+msgstr ""
+
+#: src/dird/ua_tree.c:70
+msgid "mark directory name to be restored (no files)"
+msgstr ""
+
+#: src/dird/ua_tree.c:71
+msgid "print current working directory"
+msgstr ""
+
+#: src/dird/ua_tree.c:72
+msgid "unmark dir/file to be restored recursively in dir"
+msgstr ""
+
+#: src/dird/ua_tree.c:73
+msgid "unmark directory name only no recursion"
+msgstr ""
+
+#: src/dird/ua_tree.c:74
+msgid "quit and do not do restore"
+msgstr ""
+
+#: src/dird/ua_tree.c:94
+msgid ""
+"\n"
+"You are now entering file selection mode where you add (mark) and\n"
+"remove (unmark) files to be restored. No files are initially added, unless\n"
+"you used the \"all\" keyword on the command line.\n"
+"Enter \"done\" to leave this mode.\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:104 src/dird/ua_tree.c:664 src/dird/ua_tree.c:672
+#, c-format
+msgid "cwd is: %s\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:125
+msgid "Illegal command. Enter \"done\" to exit.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:298 src/dird/ua_tree.c:309 src/dird/ua_tree.c:326
+msgid "No files marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:311
+msgid "1 file marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:313
+#, c-format
+msgid "%s files marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:340
+msgid "No directories marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:342
+msgid "1 directory marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:344
+#, c-format
+msgid "%s directories marked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:365
+#, c-format
+msgid "%s total files/dirs. %s marked to be restored.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:376
+msgid "No file specification given.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:520
+#, c-format
+msgid "Node %s has no children.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:611
+#, c-format
+msgid "%d total files; %d marked to be restored; %s bytes.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:656
+msgid "Invalid path given.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:683 src/dird/ua_tree.c:694
+msgid "No files unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:696
+msgid "1 file unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:698
+#, c-format
+msgid "%d files unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:709 src/dird/ua_tree.c:725
+msgid "No directories unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:727
+msgid "1 directory unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_tree.c:729
+#, c-format
+msgid "%d directories unmarked.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:79
+msgid "Update choice:\n"
+msgstr ""
+
+#: src/dird/ua_update.c:80
+msgid "Volume parameters"
+msgstr ""
+
+#: src/dird/ua_update.c:81
+msgid "Pool from resource"
+msgstr ""
+
+#: src/dird/ua_update.c:82
+msgid "Slots from autochanger"
+msgstr ""
+
+#: src/dird/ua_update.c:83
+msgid "item"
+msgstr ""
+
+#: src/dird/ua_update.c:83
+msgid "Choose catalog item to update"
+msgstr ""
+
+#: src/dird/ua_update.c:122
+#, c-format
+msgid "Invalid VolStatus specified: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:131
+#, c-format
+msgid "New Volume status is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:141
+#, c-format
+msgid "Invalid retention period specified: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:149
+#, c-format
+msgid "New retention period is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:160
+#, c-format
+msgid "Invalid use duration specified: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:168
+#, c-format
+msgid "New use duration is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:182
+#, c-format
+msgid "New max jobs is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:195
+#, c-format
+msgid "New max files is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:206
+#, c-format
+msgid "Invalid max. bytes specification: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:214
+#, c-format
+msgid "New Max bytes is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:228 src/dird/ua_update.c:252
+msgid "Invalid value. It must be yes or no.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:236
+#, c-format
+msgid "New Recycle flag is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:260
+#, c-format
+msgid "New InChanger flag is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:278
+#, c-format
+msgid "Invalid slot, it must be between 0 and MaxVols=%d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:287 src/dird/ua_update.c:577
+#, c-format
+msgid "Error updating media record Slot: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_update.c:289
+#, c-format
+msgid "New Slot is: %d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:316
+#, c-format
+msgid "New Pool is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:345
+#, c-format
+msgid "Error updating Volume record: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_update.c:347
+#, c-format
+msgid "Volume defaults updated from \"%s\" Pool record.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:369
+#, c-format
+msgid "Error updating Volume records: ERR=%s"
+msgstr ""
+
+#: src/dird/ua_update.c:371
+msgid "All Volume defaults updated from Pool record.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:391
+msgid "VolStatus"
+msgstr ""
+
+#: src/dird/ua_update.c:392
+msgid "VolRetention"
+msgstr ""
+
+#: src/dird/ua_update.c:393
+msgid "VolUse"
+msgstr ""
+
+#: src/dird/ua_update.c:394
+msgid "MaxVolJobs"
+msgstr ""
+
+#: src/dird/ua_update.c:395
+msgid "MaxVolFiles"
+msgstr ""
+
+#: src/dird/ua_update.c:396
+msgid "MaxVolBytes"
+msgstr ""
+
+#: src/dird/ua_update.c:397
+msgid "Recycle"
+msgstr ""
+
+#: src/dird/ua_update.c:398
+msgid "InChanger"
+msgstr ""
+
+#: src/dird/ua_update.c:399 src/dird/ua_update.c:472
+msgid "Slot"
+msgstr ""
+
+#: src/dird/ua_update.c:401
+msgid "FromPool"
+msgstr ""
+
+#: src/dird/ua_update.c:402
+msgid "AllFromPool"
+msgstr ""
+
+#: src/dird/ua_update.c:463
+#, c-format
+msgid "Updating Volume \"%s\"\n"
+msgstr ""
+
+#: src/dird/ua_update.c:465
+msgid "Volume Status"
+msgstr ""
+
+#: src/dird/ua_update.c:466
+msgid "Volume Retention Period"
+msgstr ""
+
+#: src/dird/ua_update.c:467
+msgid "Volume Use Duration"
+msgstr ""
+
+#: src/dird/ua_update.c:468
+msgid "Maximum Volume Jobs"
+msgstr ""
+
+#: src/dird/ua_update.c:469
+msgid "Maximum Volume Files"
+msgstr ""
+
+#: src/dird/ua_update.c:470
+msgid "Maximum Volume Bytes"
+msgstr ""
+
+#: src/dird/ua_update.c:471
+msgid "Recycle Flag"
+msgstr ""
+
+#: src/dird/ua_update.c:473
+msgid "InChanger Flag"
+msgstr ""
+
+#: src/dird/ua_update.c:474
+msgid "Volume Files"
+msgstr ""
+
+#: src/dird/ua_update.c:476
+msgid "Volume from Pool"
+msgstr ""
+
+#: src/dird/ua_update.c:477
+msgid "All Volumes from Pool"
+msgstr ""
+
+#: src/dird/ua_update.c:478
+msgid "Done"
+msgstr ""
+
+#: src/dird/ua_update.c:489
+#, c-format
+msgid "Current Volume status is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:490
+msgid "Possible Values are:\n"
+msgstr ""
+
+#: src/dird/ua_update.c:501
+msgid "Choose new Volume Status"
+msgstr ""
+
+#: src/dird/ua_update.c:507
+#, c-format
+msgid "Current retention period is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:509
+msgid "Enter Volume Retention period: "
+msgstr ""
+
+#: src/dird/ua_update.c:516
+#, c-format
+msgid "Current use duration is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:518
+msgid "Enter Volume Use Duration: "
+msgstr ""
+
+#: src/dird/ua_update.c:525
+#, c-format
+msgid "Current max jobs is: %u\n"
+msgstr ""
+
+#: src/dird/ua_update.c:526
+msgid "Enter new Maximum Jobs: "
+msgstr ""
+
+#: src/dird/ua_update.c:533
+#, c-format
+msgid "Current max files is: %u\n"
+msgstr ""
+
+#: src/dird/ua_update.c:534
+msgid "Enter new Maximum Files: "
+msgstr ""
+
+#: src/dird/ua_update.c:541
+#, c-format
+msgid "Current value is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:542
+msgid "Enter new Maximum Bytes: "
+msgstr ""
+
+#: src/dird/ua_update.c:550
+#, c-format
+msgid "Current recycle flag is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:552
+msgid "Enter new Recycle status: "
+msgstr ""
+
+#: src/dird/ua_update.c:559
+#, c-format
+msgid "Current Slot is: %d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:560
+msgid "Enter new Slot: "
+msgstr ""
+
+#: src/dird/ua_update.c:567
+#, c-format
+msgid "Current InChanger flag is: %d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:568
+msgid "Set InChanger flag? yes/no: "
+msgstr ""
+
+#: src/dird/ua_update.c:579
+#, c-format
+msgid "New InChanger flag is: %d\n"
+msgstr ""
+
+#: src/dird/ua_update.c:586
+msgid ""
+"Warning changing Volume Files can result\n"
+"in loss of data on your Volume\n"
+"\n"
+msgstr ""
+
+#: src/dird/ua_update.c:588
+#, c-format
+msgid "Current Volume Files is: %u\n"
+msgstr ""
+
+#: src/dird/ua_update.c:589
+msgid "Enter new number of Files for Volume: "
+msgstr ""
+
+#: src/dird/ua_update.c:594
+msgid "Normally, you should only increase Volume Files by one!\n"
+msgstr ""
+
+#: src/dird/ua_update.c:595
+msgid "Continue? (yes/no): "
+msgstr ""
+
+#: src/dird/ua_update.c:605
+#, c-format
+msgid "New Volume Files is: %u\n"
+msgstr ""
+
+#: src/dird/ua_update.c:617
+#, c-format
+msgid "Current Pool is: %s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:618
+msgid "Enter new Pool name: "
+msgstr ""
+
+#: src/dird/ua_update.c:631
+msgid "Selection terminated.\n"
+msgstr ""
+
+#: src/dird/ua_update.c:664
+#, c-format
+msgid "db_update_pool_record returned %d. ERR=%s\n"
+msgstr ""
+
+#: src/dird/ua_update.c:671
+msgid "Pool DB record updated from resource.\n"
+msgstr ""
+
+#: src/dird/verify.c:87
+msgid ""
+"Unable to find JobId of previous InitCatalog Job.\n"
+"Please run a Verify with Level=InitCatalog before\n"
+"running the current Job.\n"
+msgstr ""
+
+#: src/dird/verify.c:117
+#, c-format
+msgid "Verifying against JobId=%d Job=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:187
+#, c-format
+msgid "Start Verify JobId=%s Level=%s Job=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:266
+msgid "Deprecated feature ... use bootstrap.\n"
+msgstr ""
+
+#: src/dird/verify.c:279
+#, c-format
+msgid "Unimplemented Verify level %d(%c)\n"
+msgstr ""
+
+#: src/dird/verify.c:331
+#, c-format
+msgid "Unimplemented verify level %d\n"
+msgstr ""
+
+#: src/dird/verify.c:386
+msgid "Verify OK"
+msgstr ""
+
+#: src/dird/verify.c:390
+msgid "*** Verify Error ***"
+msgstr ""
+
+#: src/dird/verify.c:394
+msgid "Verify warnings"
+msgstr ""
+
+#: src/dird/verify.c:397
+msgid "Verify Canceled"
+msgstr ""
+
+#: src/dird/verify.c:400
+msgid "Verify Differences"
+msgstr ""
+
+#: src/dird/verify.c:405
+#, c-format
+msgid "Inappropriate term code: %d %c\n"
+msgstr ""
+
+#: src/dird/verify.c:419
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Expected:         %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/verify.c:454
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/verify.c:530
+#, c-format
+msgid ""
+"bird<filed: bad attributes, expected 3 fields got %d\n"
+" mslen=%d msg=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:574
+#, c-format
+msgid "New file: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:575
+#, c-format
+msgid "File not in catalog: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:599
+#, c-format
+msgid "      st_ino   differ. Cat: %s File: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:608
+#, c-format
+msgid "      st_mode  differ. Cat: %x File: %x\n"
+msgstr ""
+
+#: src/dird/verify.c:616
+#, c-format
+msgid "      st_nlink differ. Cat: %d File: %d\n"
+msgstr ""
+
+#: src/dird/verify.c:624
+#, c-format
+msgid "      st_uid   differ. Cat: %u File: %u\n"
+msgstr ""
+
+#: src/dird/verify.c:632
+#, c-format
+msgid "      st_gid   differ. Cat: %u File: %u\n"
+msgstr ""
+
+#: src/dird/verify.c:640
+#, c-format
+msgid "      st_size  differ. Cat: %s File: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:649
+msgid "      st_atime differs\n"
+msgstr ""
+
+#: src/dird/verify.c:656
+msgid "      st_mtime differs\n"
+msgstr ""
+
+#: src/dird/verify.c:663
+msgid "      st_ctime differs\n"
+msgstr ""
+
+#: src/dird/verify.c:670
+#, c-format
+msgid "      st_size  decrease. Cat: %s File: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:709
+#, c-format
+msgid "      %s not same. File=%s Cat=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:712
+#, c-format
+msgid "      %s differs.\n"
+msgstr ""
+
+#: src/dird/verify.c:724
+#, c-format
+msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
+msgstr ""
+
+#: src/dird/verify.c:761
+msgid "The following files are missing:\n"
+msgstr ""
+
+#: src/dird/verify.c:775 src/tools/testfind.c:338
+#, c-format
+msgid "File: %s\n"
+msgstr ""
+
+#: src/filed/authenticate.c:45
+#, c-format
+msgid "I only authenticate directors, not %d\n"
+msgstr ""
+
+#: src/filed/authenticate.c:51 src/stored/authenticate.c:59
+#, c-format
+msgid "Bad Hello command from Director at %s. Len=%d.\n"
+msgstr ""
+
+#: src/filed/authenticate.c:63 src/stored/authenticate.c:70
+#, c-format
+msgid "Bad Hello command from Director at %s: %s\n"
+msgstr ""
+
+#: src/filed/authenticate.c:77 src/stored/authenticate.c:85
+#, c-format
+msgid ""
+"Connection from unknown Director %s at %s rejected.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/filed/authenticate.c:110
+#, c-format
+msgid ""
+"Incorrect password given by Director at %s.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/filed/authenticate.c:164 src/stored/dircmd.c:184
+msgid "Unable to authenticate Director\n"
+msgstr ""
+
+#: src/filed/authenticate.c:208
+msgid ""
+"Authorization key rejected by Storage daemon.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/filed/backup.c:68
+msgid "Cannot set buffer size FD->SD.\n"
+msgstr ""
+
+#: src/filed/backup.c:155
+#, c-format
+msgid "     Recursion turned off. Will not descend into %s\n"
+msgstr ""
+
+#: src/filed/backup.c:162
+#, c-format
+msgid "     Filesystem change prohibited. Will not descend into %s\n"
+msgstr ""
+
+#: src/filed/backup.c:168
+#, c-format
+msgid "     Disallowed filesystem. Will not descend into %s\n"
+msgstr ""
+
+#: src/filed/backup.c:186 src/filed/verify.c:113
+#, c-format
+msgid "     Could not access %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:193 src/filed/verify.c:120
+#, c-format
+msgid "     Could not follow link %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:200 src/filed/verify.c:127
+#, c-format
+msgid "     Could not stat %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:207 src/filed/verify.c:133
+#, c-format
+msgid "     Unchanged file skipped: %s\n"
+msgstr ""
+
+#: src/filed/backup.c:210
+#, c-format
+msgid "     Archive file not saved: %s\n"
+msgstr ""
+
+#: src/filed/backup.c:214 src/filed/verify.c:147
+#, c-format
+msgid "     Could not open directory %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:220
+#, c-format
+msgid "     Unknown file type %d; not saved: %s\n"
+msgstr ""
+
+#: src/filed/backup.c:240
+#, c-format
+msgid "Python reader program \"%s\" not found.\n"
+msgstr ""
+
+#: src/filed/backup.c:269 src/filed/verify.c:214
+#, c-format
+msgid "     Cannot open %s: ERR=%s.\n"
+msgstr ""
+
+#: src/filed/backup.c:298 src/filed/verify.c:229
+#, c-format
+msgid "     Cannot open resource fork for %s: ERR=%s.\n"
+msgstr ""
+
+#: src/filed/backup.c:349
+#, c-format
+msgid "Unknown signature type %i.\n"
+msgstr ""
+
+#: src/filed/backup.c:414 src/filed/backup.c:499 src/filed/backup.c:525
+#: src/filed/backup.c:557 src/filed/backup.c:570 src/filed/backup.c:578
+#: src/filed/backup.c:619 src/filed/backup.c:653
+#, c-format
+msgid "Network send error to SD. ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:479
+#, c-format
+msgid "Compression error: %d\n"
+msgstr ""
+
+#: src/filed/backup.c:516
+#, c-format
+msgid "Read error on file %s. ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:519
+msgid "Too many errors.\n"
+msgstr ""
+
+#: src/filed/backup.c:548
+#, c-format
+msgid "Error reading ACL of %s\n"
+msgstr ""
+
+#: src/filed/filed.c:62
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n"
+"        -c <file>   use <file> as configuration file\n"
+"        -dnn        set debug level to nn\n"
+"        -f          run in foreground (for debugging)\n"
+"        -g          groupid\n"
+"        -i          inetd request\n"
+"        -s          no signals (for debugging)\n"
+"        -t          test configuration file and exit\n"
+"        -u          userid\n"
+"        -v          verbose user messages\n"
+"        -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/filed/filed.c:282
+#, c-format
+msgid ""
+"No File daemon resource defined in %s\n"
+"Without that I don't know who I am :-(\n"
+msgstr ""
+
+#: src/filed/filed.c:287
+#, c-format
+msgid "Only one Client resource permitted in %s\n"
+msgstr ""
+
+#: src/filed/filed.c:310
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"File daemon in %s.\n"
+msgstr ""
+
+#: src/filed/filed.c:339
+#, c-format
+msgid "No Director resource defined in %s\n"
+msgstr ""
+
+#: src/filed/job.c:324
+#, c-format
+msgid "2901 Job %s not found.\n"
+msgstr ""
+
+#: src/filed/job.c:340
+#, c-format
+msgid "2001 Job %s marked to be canceled.\n"
+msgstr ""
+
+#: src/filed/job.c:343
+msgid "2902 Error scanning cancel command.\n"
+msgstr ""
+
+#: src/filed/job.c:362
+#, c-format
+msgid "2991 Bad setdebug command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:378
+#, c-format
+msgid "Bad estimate command: %s"
+msgstr ""
+
+#: src/filed/job.c:379
+msgid "2992 Bad estimate command.\n"
+msgstr ""
+
+#: src/filed/job.c:402
+#, c-format
+msgid "Bad Job Command: %s"
+msgstr ""
+
+#: src/filed/job.c:422
+#, c-format
+msgid "Bad RunBeforeJob command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:423 src/filed/job.c:436
+msgid "2905 Bad RunBeforeJob command.\n"
+msgstr ""
+
+#: src/filed/job.c:449
+#, c-format
+msgid "Bad RunAfter command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:450
+msgid "2905 Bad RunAfterJob command.\n"
+msgstr ""
+
+#: src/filed/job.c:476
+#, c-format
+msgid "%s could not execute. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:485
+#, c-format
+msgid "%s: %s\n"
+msgstr ""
+
+#: src/filed/job.c:490
+#, c-format
+msgid "%s returned non-zero status=%d. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:575
+#, c-format
+msgid "Error running program: %s. RtnStat=%d ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:585
+#, c-format
+msgid "Cannot open FileSet input file: %s. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:679
+#, c-format
+msgid "REGEX %s compile error. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:733
+#, c-format
+msgid "Invalid FileSet command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:902 src/findlib/match.c:184
+#, c-format
+msgid "Unknown include/exclude option: %c\n"
+msgstr ""
+
+#: src/filed/job.c:962 src/stored/fd_cmds.c:329
+#, c-format
+msgid "Could not create bootstrap file %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:1061
+#, c-format
+msgid "DIR and FD clocks differ by %d seconds, FD automatically adjusting.\n"
+msgstr ""
+
+#: src/filed/job.c:1069
+#, c-format
+msgid "Unknown backup level: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1081
+#, c-format
+msgid "Bad level command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1102
+#, c-format
+msgid "Bad session command: %s"
+msgstr ""
+
+#: src/filed/job.c:1123
+#, c-format
+msgid "Bad storage command: %s"
+msgstr ""
+
+#: src/filed/job.c:1132
+#, c-format
+msgid "Failed to connect to Storage daemon: %s:%d\n"
+msgstr ""
+
+#: src/filed/job.c:1144
+msgid "Failed to authenticate Storage daemon.\n"
+msgstr ""
+
+#: src/filed/job.c:1170
+msgid "Cannot contact Storage daemon\n"
+msgstr ""
+
+#: src/filed/job.c:1188
+#, c-format
+msgid "Bad response to append open: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1193
+msgid "Bad response from stored to open command\n"
+msgstr ""
+
+#: src/filed/job.c:1222
+#, c-format
+msgid "Generate VSS snapshots. Driver=\"%s\", Drive(s)=\"%s\"\n"
+msgstr ""
+
+#: src/filed/job.c:1225
+#, c-format
+msgid "Generate VSS snapshots failed. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:1232
+#, c-format
+msgid "Generate VSS snapshot of drive \"%c:\\\" failed\n"
+msgstr ""
+
+#: src/filed/job.c:1241
+#, c-format
+msgid "VSS Writer: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1245
+msgid "No drive letters found for generating VSS snapshots.\n"
+msgstr ""
+
+#: src/filed/job.c:1248
+msgid "VSS was not initialized properly. VSS support is disabled.\n"
+msgstr ""
+
+#: src/filed/job.c:1297
+msgid "Append Close with SD failed.\n"
+msgstr ""
+
+#: src/filed/job.c:1301
+#, c-format
+msgid "Bad status %d returned from Storage Daemon.\n"
+msgstr ""
+
+#: src/filed/job.c:1336
+#, c-format
+msgid "2994 Bad verify command: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1351 src/filed/job.c:1390
+#, c-format
+msgid "2994 Bad verify level: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1430
+#, c-format
+msgid "Bad replace command. CMD=%s\n"
+msgstr ""
+
+#: src/filed/job.c:1507
+msgid "Improper calling sequence.\n"
+msgstr ""
+
+#: src/filed/job.c:1527
+#, c-format
+msgid "Bad response to SD read open: %s\n"
+msgstr ""
+
+#: src/filed/job.c:1532
+msgid "Bad response from stored to read open command\n"
+msgstr ""
+
+#: src/filed/job.c:1598
+#, c-format
+msgid "Comm error with SD. bad response to %s. ERR=%s\n"
+msgstr ""
+
+#: src/filed/job.c:1601
+#, c-format
+msgid "Bad response to %s command. Wanted %s, got %s\n"
+msgstr ""
+
+#: src/filed/pythonfd.c:150 src/stored/pythonsd.c:154
+#, c-format
+msgid "Cannot delete attribute %s"
+msgstr ""
+
+#: src/filed/pythonfd.c:168 src/filed/pythonfd.c:184 src/stored/pythonsd.c:187
+#, c-format
+msgid "Cannot find attribute %s"
+msgstr ""
+
+#: src/filed/restore.c:55
+#, c-format
+msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n"
+msgstr ""
+
+#: src/filed/restore.c:165 src/filed/verify_vol.c:90
+#, c-format
+msgid "Record header scan error: %s\n"
+msgstr ""
+
+#: src/filed/restore.c:172 src/filed/verify_vol.c:99
+#, c-format
+msgid "Data record error. ERR=%s\n"
+msgstr ""
+
+#: src/filed/restore.c:176 src/filed/verify_vol.c:103
+#, c-format
+msgid "Actual data size %d not same as header %d\n"
+msgstr ""
+
+#: src/filed/restore.c:201 src/filed/restore.c:383
+msgid "Logic error: output file should be open\n"
+msgstr ""
+
+#: src/filed/restore.c:207 src/filed/restore.c:388
+msgid "Logic error: output file should not be open\n"
+msgstr ""
+
+#: src/filed/restore.c:218 src/filed/verify_vol.c:142
+#: src/stored/bextract.c:289 src/stored/bls.c:371 src/stored/bscan.c:651
+#, c-format
+msgid "Record header file index %ld not equal record index %ld\n"
+msgstr ""
+
+#: src/filed/restore.c:231 src/stored/bextract.c:298
+#, c-format
+msgid "%s stream not supported on this Client.\n"
+msgstr ""
+
+#: src/filed/restore.c:308
+#, c-format
+msgid "     Cannot open resource fork for %s.\n"
+msgstr ""
+
+#: src/filed/restore.c:331
+#, c-format
+msgid "     Invalid length of Finder Info (got %d, not 32)\n"
+msgstr ""
+
+#: src/filed/restore.c:335
+#, c-format
+msgid "     Could not set Finder Info on %s\n"
+msgstr ""
+
+#: src/filed/restore.c:347
+#, c-format
+msgid "Can't restore ACL of %s\n"
+msgstr ""
+
+#: src/filed/restore.c:359
+#, c-format
+msgid "Can't restore default ACL of %s\n"
+msgstr ""
+
+#: src/filed/restore.c:391 src/stored/bextract.c:455
+#, c-format
+msgid "Unknown stream=%d ignored. This shouldn't happen!\n"
+msgstr ""
+
+#: src/filed/restore.c:428
+#, c-format
+msgid ""
+"%d non-supported data streams and %d non-supported attrib streams ignored.\n"
+msgstr ""
+
+#: src/filed/restore.c:432
+#, c-format
+msgid "%d non-supported resource fork streams ignored.\n"
+msgstr ""
+
+#: src/filed/restore.c:435
+#, c-format
+msgid "%d non-supported Finder Info streams ignored.\n"
+msgstr ""
+
+#: src/filed/restore.c:438
+#, c-format
+msgid "%d non-supported acl streams ignored.\n"
+msgstr ""
+
+#: src/filed/restore.c:450
+msgid "None"
+msgstr ""
+
+#: src/filed/restore.c:454
+msgid "Zlib errno"
+msgstr ""
+
+#: src/filed/restore.c:456
+msgid "Zlib stream error"
+msgstr ""
+
+#: src/filed/restore.c:458
+msgid "Zlib data error"
+msgstr ""
+
+#: src/filed/restore.c:460
+msgid "Zlib memory error"
+msgstr ""
+
+#: src/filed/restore.c:462
+msgid "Zlib buffer error"
+msgstr ""
+
+#: src/filed/restore.c:464
+msgid "Zlib version error"
+msgstr ""
+
+#: src/filed/restore.c:466 src/lib/util.c:546 src/lib/util.c:556
+#: src/lib/util.c:564 src/lib/util.c:571 src/lib/util.c:578 src/lib/util.c:592
+#: src/lib/util.c:602 src/lib/util.c:609 src/lib/util.c:620
+msgid "*none*"
+msgstr ""
+
+#: src/filed/restore.c:498 src/stored/bextract.c:387
+#, c-format
+msgid "Seek to %s error on %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/restore.c:522
+#, c-format
+msgid "Uncompression error on file %s. ERR=%s\n"
+msgstr ""
+
+#: src/filed/restore.c:530 src/stored/bextract.c:421
+msgid "GZIP data stream found, but GZIP not configured!\n"
+msgstr ""
+
+#: src/filed/restore.c:539 src/stored/bextract.c:359 src/stored/bextract.c:409
+#, c-format
+msgid "Write error on %s: %s\n"
+msgstr ""
+
+#: src/filed/status.c:67
+#, c-format
+msgid "%s Version: %s (%s) %s %s %s %s\n"
+msgstr ""
+
+#: src/filed/status.c:71
+#, c-format
+msgid "Daemon started %s, %d Job%s run since started.\n"
+msgstr ""
+
+#: src/filed/status.c:127
+#, c-format
+msgid " Sizeof: off_t=%d size_t=%d debug=%d trace=%d\n"
+msgstr ""
+
+#: src/filed/status.c:138
+msgid "Running Jobs:\n"
+msgstr ""
+
+#: src/filed/status.c:149
+#, c-format
+msgid "Director connected at: %s\n"
+msgstr ""
+
+#: src/filed/status.c:151
+#, c-format
+msgid "JobId %d Job %s is running.\n"
+msgstr ""
+
+#: src/filed/status.c:154
+#, c-format
+msgid "    %s%s Job started: %s\n"
+msgstr ""
+
+#: src/filed/status.c:166 src/stored/status.c:323
+#, c-format
+msgid "    Files=%s Bytes=%s Bytes/sec=%s\n"
+msgstr ""
+
+#: src/filed/status.c:171
+#, c-format
+msgid "    Files Examined=%s\n"
+msgstr ""
+
+#: src/filed/status.c:176
+#, c-format
+msgid "    Processing file: %s\n"
+msgstr ""
+
+#: src/filed/status.c:187
+msgid "    SDSocket closed.\n"
+msgstr ""
+
+#: src/filed/status.c:217
+msgid "Terminated Jobs:\n"
+msgstr ""
+
+#: src/filed/status.c:219
+msgid " JobId  Level     Files         Bytes  Status   Finished        Name \n"
+msgstr ""
+
+#: src/filed/status.c:323 src/filed/status.c:347 src/stored/status.c:513
+#: src/stored/status.c:536
+#, c-format
+msgid "Bad .status command: %s\n"
+msgstr ""
+
+#: src/filed/status.c:324
+msgid "2900 Bad .status command, missing argument.\n"
+msgstr ""
+
+#: src/filed/status.c:348
+msgid "2900 Bad .status command, wrong argument.\n"
+msgstr ""
+
+#: src/filed/status.c:385 src/stored/status.c:468
+msgid "Init Catalog"
+msgstr ""
+
+#: src/filed/status.c:388 src/stored/status.c:471
+msgid "Volume to Catalog"
+msgstr ""
+
+#: src/filed/status.c:391 src/stored/status.c:474
+msgid "Disk to Catalog"
+msgstr ""
+
+#: src/filed/status.c:394 src/stored/status.c:477
+msgid "Data"
+msgstr ""
+
+#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:483
+msgid "Unknown Job Level"
+msgstr ""
+
+#: src/filed/status.c:451
+msgid "Bacula Idle"
+msgstr ""
+
+#: src/filed/status.c:462
+msgid "Bacula Running"
+msgstr ""
+
+#: src/filed/status.c:476
+msgid "Last Job Canceled"
+msgstr ""
+
+#: src/filed/status.c:480
+msgid "Last Job Failed"
+msgstr ""
+
+#: src/filed/status.c:484
+msgid "Last Job had Warnings"
+msgstr ""
+
+#: src/filed/verify.c:45
+#, c-format
+msgid "Cannot malloc %d network read buffer\n"
+msgstr ""
+
+#: src/filed/verify.c:136
+#, c-format
+msgid "     Archive file skipped: %s\n"
+msgstr ""
+
+#: src/filed/verify.c:139
+#, c-format
+msgid "     Recursion turned off. Directory skipped: %s\n"
+msgstr ""
+
+#: src/filed/verify.c:142
+#, c-format
+msgid "     File system change prohibited. Directory skipped: %s\n"
+msgstr ""
+
+#: src/filed/verify.c:152
+#, c-format
+msgid "     Unknown file type %d: %s\n"
+msgstr ""
+
+#: src/filed/verify.c:195 src/filed/verify_vol.c:200
+#, c-format
+msgid "Network error in send to Director: ERR=%s\n"
+msgstr ""
+
+#: src/filed/verify.c:284
+#, c-format
+msgid "Error reading file %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/verify_vol.c:56
+msgid "Storage command not issued before Verify.\n"
+msgstr ""
+
+#: src/filed/verify_vol.c:136
+#, c-format
+msgid "Error scanning record header: %s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:335
+#, c-format
+msgid "File size of restored file %s not correct. Original %s, restored %s.\n"
+msgstr ""
+
+#: src/findlib/attribs.c:353 src/findlib/attribs.c:360
+#, c-format
+msgid "Unable to set file owner %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:366
+#, c-format
+msgid "Unable to set file modes %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:376
+#, c-format
+msgid "Unable to set file times %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:390
+#, c-format
+msgid "Unable to set file flags %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:635
+#, c-format
+msgid "Error in %s file %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/attribs.c:652
+#, c-format
+msgid "Error in %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/bfile.c:67
+msgid "GZIP data"
+msgstr ""
+
+#: src/findlib/bfile.c:69
+msgid "GZIP sparse data"
+msgstr ""
+
+#: src/findlib/bfile.c:71
+msgid "Win32 data"
+msgstr ""
+
+#: src/findlib/bfile.c:73
+msgid "Win32 GZIP data"
+msgstr ""
+
+#: src/findlib/bfile.c:75
+msgid "File attributes"
+msgstr ""
+
+#: src/findlib/bfile.c:77
+msgid "File data"
+msgstr ""
+
+#: src/findlib/bfile.c:79
+msgid "MD5 signature"
+msgstr ""
+
+#: src/findlib/bfile.c:81
+msgid "Extended attributes"
+msgstr ""
+
+#: src/findlib/bfile.c:83
+msgid "Sparse data"
+msgstr ""
+
+#: src/findlib/bfile.c:85
+msgid "Program names"
+msgstr ""
+
+#: src/findlib/bfile.c:87
+msgid "Program data"
+msgstr ""
+
+#: src/findlib/bfile.c:89
+msgid "SHA1 signature"
+msgstr ""
+
+#: src/findlib/bfile.c:91
+msgid "HFS+ resource fork"
+msgstr ""
+
+#: src/findlib/bfile.c:93
+msgid "HFS+ Finder Info"
+msgstr ""
+
+#: src/findlib/create_file.c:86
+#, c-format
+msgid "File skipped. Not newer: %s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:93
+#, c-format
+msgid "File skipped. Not older: %s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:99
+#, c-format
+msgid "File skipped. Already exists: %s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:124
+#, c-format
+msgid "File %s already exists and could not be replaced. ERR=%s.\n"
+msgstr ""
+
+#: src/findlib/create_file.c:176 src/findlib/create_file.c:277
+#: src/findlib/create_file.c:328
+#, c-format
+msgid "bpkt already open fid=%d\n"
+msgstr ""
+
+#: src/findlib/create_file.c:198
+msgid "Could not save_dirn"
+msgstr ""
+
+#: src/findlib/create_file.c:207 src/findlib/create_file.c:220
+#, c-format
+msgid "Could not chdir to %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:240
+#, c-format
+msgid "Could not create %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:253
+#, c-format
+msgid "Cannot make fifo %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:261
+#, c-format
+msgid "Cannot make node %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:297
+#, c-format
+msgid "Could not symlink %s -> %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:307
+#, c-format
+msgid "Could not hard link %s -> %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:358
+#, c-format
+msgid "Original file %s not saved: type=%d\n"
+msgstr ""
+
+#: src/findlib/create_file.c:361
+#, c-format
+msgid "Unknown file type %d; not restored: %s\n"
+msgstr ""
+
+#: src/findlib/create_file.c:392
+#, c-format
+msgid "Zero length filename: %s\n"
+msgstr ""
+
+#: src/findlib/enable_priv.c:85
+msgid "AdjustTokenPrivileges set "
+msgstr ""
+
+#: src/findlib/find_one.c:168
+#, c-format
+msgid "Top level directory \"%s\" has an unlisted fstype\n"
+msgstr ""
+
+#: src/findlib/makepath.c:117
+#, c-format
+msgid "Cannot create directory %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/makepath.c:121 src/findlib/makepath.c:378
+#, c-format
+msgid "%s exists but is not a directory\n"
+msgstr ""
+
+#: src/findlib/makepath.c:276 src/findlib/makepath.c:337
+#: src/findlib/makepath.c:397
+#, c-format
+msgid "Cannot change owner and/or group of %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/makepath.c:297
+#, c-format
+msgid "Cannot chdir to directory, %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/makepath.c:352 src/findlib/makepath.c:368
+#: src/findlib/makepath.c:402
+#, c-format
+msgid "Cannot change permissions of %s: ERR=%s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:48
+#, c-format
+msgid "Cannot open current directory: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:62
+#, c-format
+msgid "Current directory: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:84
+#, c-format
+msgid "Cannot get current directory: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:105
+#, c-format
+msgid "Cannot return to %s from %s: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:109
+#, c-format
+msgid "Cannot return to saved working directory from %s: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:115
+#, c-format
+msgid "Cannot return to %s: %s\n"
+msgstr ""
+
+#: src/findlib/save-cwd.c:119
+#, c-format
+msgid "Cannot return to saved working directory: %s\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:74
+#, c-format
+msgid "%s: Director authorization problem.\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:75
+msgid "Director authorization problem.\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:77
+msgid ""
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:87
+#, c-format
+msgid "%s: Bad response to Hello command: ERR=%s\n"
+msgstr ""
+
+#: src/gnome2-console/authenticate.c:89
+msgid "The Director is probably not running.\n"
+msgstr ""
+
+#: src/gnome2-console/console.c:88
+#, c-format
+msgid ""
+"Copyright (C) 2002-2005 Kern Sibbald\n"
+"\n"
+"Version: %s (%s) %s %s %s\n"
+"\n"
+"Usage: gnome-console [-s] [-c config_file] [-d debug_level] [config_file]\n"
+"       -c <file>   set configuration file to file\n"
+"       -dnn        set debug level to nn\n"
+"       -s          no signals\n"
+"       -t          test - read configuration and exit\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/gnome2-console/console.c:219
+#, c-format
+msgid "Pthread cond init error = %s\n"
+msgstr ""
+
+#: src/gnome2-console/console.c:357
+msgid " Not Connected"
+msgstr ""
+
+#: src/gnome2-console/console.c:478
+#, c-format
+msgid " Connecting to Director %s:%d"
+msgstr ""
+
+#: src/gnome2-console/console.c:479
+#, c-format
+msgid ""
+"Connecting to Director %s:%d\n"
+"\n"
+msgstr ""
+
+#: src/gnome2-console/console.c:494 src/wx-console/console_thread.cpp:360
+#, c-format
+msgid "Passphrase for Console \"%s\" TLS private key: "
+msgstr ""
+
+#: src/gnome2-console/console.c:516 src/wx-console/console_thread.cpp:381
+#, c-format
+msgid "Passphrase for Director \"%s\" TLS private key: "
+msgstr ""
+
+#: src/gnome2-console/console.c:535 src/tray-monitor/tray-monitor.c:860
+#: src/wx-console/console_thread.cpp:399
+msgid "Director daemon"
+msgstr ""
+
+#: src/gnome2-console/console.c:547
+msgid " Initializing ..."
+msgstr ""
+
+#: src/gnome2-console/console.c:583
+msgid " Connected"
+msgstr ""
+
+#: src/gnome2-console/console.c:591
+msgid " Processing command ..."
+msgstr ""
+
+#: src/gnome2-console/console.c:626
+msgid " At prompt waiting for input ..."
+msgstr ""
+
+#: src/gnome2-console/console.c:746
+msgid " Ready"
+msgstr ""
+
+#: src/gnome2-console/console_conf.c:135
+#, c-format
+msgid "Console: name=%s\n"
+msgstr ""
+
+#: src/gnome2-console/console_conf.c:138
+#, c-format
+msgid "ConsoleFont: name=%s font face=%s\n"
+msgstr ""
+
+#: src/gnome2-console/interface.c:32
+msgid "_Connect"
+msgstr ""
+
+#: src/gnome2-console/interface.c:33 src/gnome2-console/interface.c:232
+msgid "Connect to Director"
+msgstr ""
+
+#: src/gnome2-console/interface.c:39
+msgid "_Disconnect"
+msgstr ""
+
+#: src/gnome2-console/interface.c:40
+msgid "Disconnect from Director"
+msgstr ""
+
+#: src/gnome2-console/interface.c:93
+msgid "_Display Messages"
+msgstr ""
+
+#: src/gnome2-console/interface.c:129
+msgid "_File"
+msgstr ""
+
+#: src/gnome2-console/interface.c:136
+msgid "_Edit"
+msgstr ""
+
+#: src/gnome2-console/interface.c:143
+msgid "_View"
+msgstr ""
+
+#: src/gnome2-console/interface.c:144 src/gnome2-console/interface.c:252
+msgid "Display Messages"
+msgstr ""
+
+#: src/gnome2-console/interface.c:150
+msgid "_Settings"
+msgstr ""
+
+#: src/gnome2-console/interface.c:157
+msgid "_Help"
+msgstr ""
+
+#: src/gnome2-console/interface.c:197
+msgid "Bacula Console"
+msgstr ""
+
+#: src/gnome2-console/interface.c:231 src/wx-console/wxbmainframe.cpp:229
+#: src/wx-console/wxbmainframe.cpp:597
+msgid "Connect"
+msgstr ""
+
+#: src/gnome2-console/interface.c:241
+msgid "Run"
+msgstr ""
+
+#: src/gnome2-console/interface.c:242 src/gnome2-console/interface.c:677
+#: src/gnome2-console/interface.c:690
+msgid "Run a Job"
+msgstr ""
+
+#: src/gnome2-console/interface.c:251
+msgid "Msgs"
+msgstr ""
+
+#: src/gnome2-console/interface.c:261 src/lib/util.c:292
+#: src/wx-console/wxbrestorepanel.cpp:384
+#: src/wx-console/wxbrestorepanel.cpp:1949
+msgid "Restore"
+msgstr ""
+
+#: src/gnome2-console/interface.c:271
+msgid "Label"
+msgstr ""
+
+#: src/gnome2-console/interface.c:299
+msgid " Command: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:307
+msgid "Enter Commands Here"
+msgstr ""
+
+#: src/gnome2-console/interface.c:318
+msgid " Status: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:326
+msgid "  "
+msgstr ""
+
+#: src/gnome2-console/interface.c:422
+msgid "About Bacula Console"
+msgstr ""
+
+#: src/gnome2-console/interface.c:436
+msgid "Bacula Console\n"
+msgstr ""
+
+#: src/gnome2-console/interface.c:444
+msgid "Copyright (c) 2000 - 2004, Kern Sibbald and John Walker"
+msgstr ""
+
+#: src/gnome2-console/interface.c:450
+msgid "Authors: Kern Sibbald and John Walker"
+msgstr ""
+
+#: src/gnome2-console/interface.c:456
+msgid "It comes by night and sucks the essence from your computers"
+msgstr ""
+
+#: src/gnome2-console/interface.c:521 src/gnome2-console/interface.c:536
+msgid "Select Director"
+msgstr ""
+
+#: src/gnome2-console/interface.c:708 src/gnome2-console/interface.c:1616
+msgid "Job:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:728
+msgid "   Type:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:757 src/gnome2-console/interface.c:1644
+#: src/wx-console/wxbrestorepanel.cpp:1862
+msgid "Client:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:787 src/gnome2-console/interface.c:1672
+msgid "FileSet: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:813 src/wx-console/wxbrestorepanel.cpp:1868
+msgid "Priority:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:836
+msgid "Level:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:866 src/gnome2-console/interface.c:1418
+#: src/gnome2-console/interface.c:1700
+msgid "Pool:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:895 src/gnome2-console/interface.c:1393
+#: src/gnome2-console/interface.c:1728 src/wx-console/wxbrestorepanel.cpp:1864
+msgid "Storage:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:924
+msgid "Messages:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:952
+msgid "Where: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:970 src/wx-console/wxbrestorepanel.cpp:1866
+msgid "When:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:988 src/wx-console/wxbrestorepanel.cpp:1847
+msgid "Bootstrap:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1108
+msgid "_New"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1177
+msgid "Restore File Selection"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1226
+msgid "Current dir:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1252
+msgid "Files Selected: "
+msgstr ""
+
+#: src/gnome2-console/interface.c:1373 src/gnome2-console/interface.c:1383
+msgid "Label a Volume"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1444
+msgid "Volume Name:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1459
+msgid "Slot:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1585
+msgid "Restore Files Dialog"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1599
+msgid "Restore Files"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1756
+msgid "Before:"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1799
+msgid "Select Files"
+msgstr ""
+
+#: src/gnome2-console/interface.c:1883
+msgid "Progress"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121
+msgid "Mark"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121
+msgid "File"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121
+msgid "Mode"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:288
+msgid "User"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:292
+msgid "Group"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:276
+msgid "Size"
+msgstr ""
+
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:280
+msgid "Date"
+msgstr ""
+
+#: src/gnome2-console/support.c:41
+#, c-format
+msgid "Widget not found: %s"
+msgstr ""
+
+#: src/gnome2-console/support.c:60 src/gnome2-console/support.c:85
+#, c-format
+msgid "Couldn't find pixmap file: %s"
+msgstr ""
+
+#: src/gnome2-console/support.c:92
+#, c-format
+msgid "Failed to load pixbuf file: %s: %s\n"
+msgstr ""
+
+#: src/lib/tls.c:105
+#, c-format
+msgid ""
+"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
+msgstr ""
+
+#: src/lib/tls.c:152
+msgid "Error initializing SSL context"
+msgstr ""
+
+#: src/lib/tls.c:173
+msgid "Error loading certificate verification stores"
+msgstr ""
+
+#: src/lib/tls.c:178
+msgid ""
+"Either a certificate file or a directory must be specified as a verification "
+"store\n"
+msgstr ""
+
+#: src/lib/tls.c:189
+msgid "Error loading certificate file"
+msgstr ""
+
+#: src/lib/tls.c:197
+msgid "Error loading private key"
+msgstr ""
+
+#: src/lib/tls.c:205
+msgid "Unable to open DH parameters file"
+msgstr ""
+
+#: src/lib/tls.c:211
+msgid "Unable to load DH parameters from specified file"
+msgstr ""
+
+#: src/lib/tls.c:215
+msgid "Failed to set TLS Diffie-Hellman parameters"
+msgstr ""
+
+#: src/lib/tls.c:224
+msgid "Error setting cipher list, no valid ciphers available\n"
+msgstr ""
+
+#: src/lib/tls.c:272
+msgid "Peer failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:314
+#, c-format
+msgid "Peer %s failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:417
+msgid "Error creating file descriptor-based BIO"
+msgstr ""
+
+#: src/lib/tls.c:428
+msgid "Error creating new SSL object"
+msgstr ""
+
+#: src/lib/tls.c:492 src/lib/tls.c:515
+msgid "Connect failure"
+msgstr ""
+
+#: src/lib/tls.c:592 src/lib/tls.c:596
+msgid "TLS shutdown failure."
+msgstr ""
+
+#: src/lib/tls.c:645 src/lib/tls.c:665
+msgid "TLS read/write failure."
+msgstr ""
+
+#: src/lib/tls.c:723 src/lib/tls.c:780 src/stored/dev.c:209
+#: src/stored/dev.c:227 src/stored/dev.c:233 src/stored/stored_conf.c:593
+#, c-format
+msgid "Unable to init mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:743 src/lib/tls.c:812
+#, c-format
+msgid "Unable to destroy mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:877
+#, c-format
+msgid "Unable to init OpenSSL threading: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:887
+msgid "Failed to seed OpenSSL PRNG\n"
+msgstr ""
+
+#: src/lib/tls.c:913
+msgid "Failed to save OpenSSL PRNG\n"
+msgstr ""
+
+#: src/lib/address_conf.c:50
+#, c-format
+msgid "Only ipv4 and ipv6 are supported (%d)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:54
+#, c-format
+msgid "Only ipv4 is supported (%d)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:163
+#, c-format
+msgid "It was tried to assign a ipv6 address to a ipv4(%d)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:172
+#, c-format
+msgid "It was tried to assign a ipv4 address to a ipv6(%d)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:251
+#, c-format
+msgid "Can't add default address (%s)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:281
+msgid "the old style addresses cannot be mixed with new style"
+msgstr ""
+
+#: src/lib/address_conf.c:304
+#, c-format
+msgid "can't resolve service(%s)"
+msgstr ""
+
+#: src/lib/address_conf.c:314
+#, c-format
+msgid "can't resolve hostname(%s) %s"
+msgstr ""
+
+#: src/lib/address_conf.c:403
+#, c-format
+msgid "Expected a block begin { , got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:408
+msgid "Empty addr block is not allowed"
+msgstr ""
+
+#: src/lib/address_conf.c:412
+#, c-format
+msgid "Expected a string, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:421
+#, c-format
+msgid "Expected a string [ip|ipv4|ipv6], got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:425
+#, c-format
+msgid "Expected a string [ip|ipv4], got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:430 src/lib/address_conf.c:460
+#, c-format
+msgid "Expected a equal =, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:434
+#, c-format
+msgid "Expected a block beginn { , got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:441 src/lib/address_conf.c:456
+#, c-format
+msgid "Expected a identifier [addr|port], got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:446
+msgid "Only one port per address block"
+msgstr ""
+
+#: src/lib/address_conf.c:452
+msgid "Only one addr per address block"
+msgstr ""
+
+#: src/lib/address_conf.c:468
+#, c-format
+msgid "Expected a number or a string, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:474
+#, c-format
+msgid "Expected an IP number or a hostname, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:480
+msgid "State machine missmatch"
+msgstr ""
+
+#: src/lib/address_conf.c:486 src/lib/address_conf.c:499
+#, c-format
+msgid "Expected a end of block }, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:492
+#, c-format
+msgid "Can't add hostname(%s) and port(%s) to addrlist (%s)"
+msgstr ""
+
+#: src/lib/address_conf.c:508
+#, c-format
+msgid "Expected a hostname or IP nummer, got: %s"
+msgstr ""
+
+#: src/lib/address_conf.c:513 src/lib/address_conf.c:527
+#, c-format
+msgid "can't add port (%s) to (%s)"
+msgstr ""
+
+#: src/lib/address_conf.c:522
+#, c-format
+msgid "Expected a port number or string, got: %s"
+msgstr ""
+
+#: src/lib/attr.c:64
+#, c-format
+msgid "Error scanning attributes: %s\n"
+msgstr ""
+
+#: src/lib/berrno.c:48
+msgid "Child exited normally."
+msgstr ""
+
+#: src/lib/berrno.c:55
+msgid "Unknown error during program execvp"
+msgstr ""
+
+#: src/lib/berrno.c:58
+#, c-format
+msgid "Child exited with code %d"
+msgstr ""
+
+#: src/lib/berrno.c:66
+#, c-format
+msgid "Child died from signal %d: %s"
+msgstr ""
+
+#: src/lib/berrno.c:72
+msgid "Invalid errno. No error message possible."
+msgstr ""
+
+#: src/lib/bget_msg.c:86
+msgid "Status OK\n"
+msgstr ""
+
+#: src/lib/bget_msg.c:90
+#, c-format
+msgid "bget_msg: unknown signal %d\n"
+msgstr ""
+
+#: src/lib/bnet.c:109
+#, c-format
+msgid "Attr spool write error. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:209 src/lib/bnet.c:266
+#, c-format
+msgid "Read expected %d got %d from %s:%s:%d\n"
+msgstr ""
+
+#: src/lib/bnet.c:227
+#, c-format
+msgid "Packet size too big from \"%s:%s:%d. Terminating connection.\n"
+msgstr ""
+
+#: src/lib/bnet.c:256
+#, c-format
+msgid "Read error from %s:%s:%d: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:332 src/lib/bnet.c:348
+#, c-format
+msgid "fread attr spool error. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:392
+#, c-format
+msgid "Write error sending len to %s:%s:%d: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:397 src/lib/bnet.c:430
+#, c-format
+msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"
+msgstr ""
+
+#: src/lib/bnet.c:424
+#, c-format
+msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:450 src/lib/bnet.c:490
+msgid "TLS connection initialization failed.\n"
+msgstr ""
+
+#: src/lib/bnet.c:458
+msgid "TLS Negotiation failed.\n"
+msgstr ""
+
+#: src/lib/bnet.c:464
+msgid ""
+"TLS certificate verification failed. Peer certificate did not match a "
+"required commonName\n"
+msgstr ""
+
+#: src/lib/bnet.c:502
+#, c-format
+msgid ""
+"TLS host certificate verification failed. Host %s did not match presented "
+"certificate\n"
+msgstr ""
+
+#: src/lib/bnet.c:516 src/lib/bnet.c:521
+msgid "TLS not configured.\n"
+msgstr ""
+
+#: src/lib/bnet.c:617
+msgid "No problem."
+msgstr ""
+
+#: src/lib/bnet.c:620
+msgid "Authoritative answer for host not found."
+msgstr ""
+
+#: src/lib/bnet.c:623
+msgid "Non-authoritative for host not found, or ServerFail."
+msgstr ""
+
+#: src/lib/bnet.c:626
+msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP."
+msgstr ""
+
+#: src/lib/bnet.c:629
+msgid "Valid name, no data record of resquested type."
+msgstr ""
+
+#: src/lib/bnet.c:632
+msgid "Unknown error."
+msgstr ""
+
+#: src/lib/bnet.c:767
+#, c-format
+msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:787
+#, c-format
+msgid "Socket open error. proto=%d port=%d. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:796 src/lib/bnet.c:821 src/lib/bnet_server.c:193
+#: src/lib/bnet_server.c:351
+#, c-format
+msgid "Cannot set SO_KEEPALIVE on socket: %s\n"
+msgstr ""
+
+#: src/lib/bnet.c:852
+#, c-format
+msgid ""
+"Could not connect to %s on %s:%d. ERR=%s\n"
+"Retrying ...\n"
+msgstr ""
+
+#: src/lib/bnet.c:858
+#, c-format
+msgid "Unable to connect to %s on %s:%d. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:936
+msgid "Could not malloc BSOCK data buffer\n"
+msgstr ""
+
+#: src/lib/bnet.c:943 src/lib/bnet.c:967
+#, c-format
+msgid "sockopt error: %s\n"
+msgstr ""
+
+#: src/lib/bnet.c:949 src/lib/bnet.c:973
+#, c-format
+msgid "Warning network buffer = %d bytes not max size.\n"
+msgstr ""
+
+#: src/lib/bnet.c:953 src/lib/bnet.c:977
+#, c-format
+msgid "Network buffer size %d not multiple of tape block size.\n"
+msgstr ""
+
+#: src/lib/bnet.c:997 src/lib/bnet.c:1031
+#, c-format
+msgid "fcntl F_GETFL error. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:1003 src/lib/bnet.c:1037 src/lib/bnet.c:1062
+#, c-format
+msgid "fcntl F_SETFL error. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet.c:1116
+#, c-format
+msgid "Unknown sig %d"
+msgstr ""
+
+#: src/lib/bnet_pkt.c:89 src/lib/bnet_pkt.c:147
+#, c-format
+msgid "Unknown BPKT type: %d\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:96
+#, c-format
+msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:258
+#, c-format
+msgid "Cannot set SO_REUSEADDR on socket: %s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:118
+#, c-format
+msgid "Cannot bind port %d: ERR=%s: Retrying ...\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:123
+#, c-format
+msgid "Cannot bind port %d: ERR=%s.\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:134
+#, c-format
+msgid "Could not init client queue: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:157 src/lib/bnet_server.c:320
+#, c-format
+msgid "Error in select: %s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:178 src/lib/bnet_server.c:339
+#, c-format
+msgid "Connection from %s:%d refused by hosts.access\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:204
+msgid "Could not create client BSOCK.\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:211
+#, c-format
+msgid "Could not add job to client queue: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:222
+#, c-format
+msgid "Could not destroy client queue: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:249
+#, c-format
+msgid "Cannot open stream socket: %s\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:278
+#, c-format
+msgid "Cannot bind port %d: ERR=%s: retrying ...\n"
+msgstr ""
+
+#: src/lib/bnet_server.c:284
+msgid "Server socket"
+msgstr ""
+
+#: src/lib/bnet_server.c:366
+#, c-format
+msgid "Socket accept error for %s. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bpipe.c:282 src/lib/bpipe.c:361
+msgid "Program killed by Bacula watchdog (timeout)\n"
+msgstr ""
+
+#: src/lib/bshm.c:69
+#, c-format
+msgid "shmget failure key = %x\n"
+msgstr ""
+
+#: src/lib/bshm.c:77
+#, c-format
+msgid "Could not get %d bytes of shared memory: %s\n"
+msgstr ""
+
+#: src/lib/bshm.c:102
+#, c-format
+msgid "Could not attach shared memory: %s\n"
+msgstr ""
+
+#: src/lib/bshm.c:123
+#, c-format
+msgid "Error detaching shared memory: %s\n"
+msgstr ""
+
+#: src/lib/bshm.c:139
+#, c-format
+msgid "Could not destroy shared memory: %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:176 src/lib/bsys.c:192 src/lib/bsys.c:202 src/lib/bsys.c:214
+#, c-format
+msgid "Out of memory: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:256
+msgid "Buffer overflow.\n"
+msgstr ""
+
+#: src/lib/bsys.c:322
+msgid "Bad errno"
+msgstr ""
+
+#: src/lib/bsys.c:339
+msgid "Possible mutex deadlock.\n"
+msgstr ""
+
+#: src/lib/bsys.c:343 src/lib/bsys.c:375
+#, c-format
+msgid "Mutex lock failure. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:346
+msgid "Possible mutex deadlock resolved.\n"
+msgstr ""
+
+#: src/lib/bsys.c:358
+#, c-format
+msgid "Mutex unlock not locked. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:363 src/lib/bsys.c:385
+#, c-format
+msgid "Mutex unlock failure. ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:399
+#, c-format
+msgid "Memset for %d bytes at %s:%d\n"
+msgstr ""
+
+#: src/lib/bsys.c:428
+#, c-format
+msgid "Cannot open pid file. %s ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:432
+#, c-format
+msgid ""
+"%s is already running. pid=%d\n"
+"Check file %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:445
+#, c-format
+msgid "Could not open pid file. %s ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:565
+#, c-format
+msgid "Could not create state file. %s ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:584
+#, c-format
+msgid "Write final hdr error: ERR=%s\n"
+msgstr ""
+
+#: src/lib/bsys.c:611
+#, c-format
+msgid "Could not find specified group: %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:614 src/lib/bsys.c:618
+#, c-format
+msgid "Could not set specified group: %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:627
+#, c-format
+msgid "Could not find specified userid: %s\n"
+msgstr ""
+
+#: src/lib/bsys.c:630
+#, c-format
+msgid "Could not set specified userid: %s\n"
+msgstr ""
+
+#: src/lib/btimers.c:241
+msgid "stop_btimer called with NULL btimer_id\n"
+msgstr ""
+
+#: src/lib/cram-md5.c:76 src/lib/cram-md5.c:101
+msgid "1999 Authorization failed.\n"
+msgstr ""
+
+#: src/lib/daemon.c:53
+#, c-format
+msgid "Cannot fork to become daemon: %s\n"
+msgstr ""
+
+#: src/lib/edit.c:400
+#, c-format
+msgid "Illegal character \"%c\" in name.\n"
+msgstr ""
+
+#: src/lib/edit.c:407
+msgid "Name too long.\n"
+msgstr ""
+
+#: src/lib/events.c:161
+msgid "Events not available"
+msgstr ""
+
+#: src/lib/jcr.c:278
+msgid "NULL jcr.\n"
+msgstr ""
+
+#: src/lib/jcr.c:399
+#, c-format
+msgid "JCR use_count=%d JobId=%d\n"
+msgstr ""
+
+#: src/lib/jcr.c:680
+#, c-format
+msgid ""
+"Watchdog sending kill after %d secs to thread stalled reading Storage "
+"daemon.\n"
+msgstr ""
+
+#: src/lib/jcr.c:692
+#, c-format
+msgid ""
+"Watchdog sending kill after %d secs to thread stalled reading File daemon.\n"
+msgstr ""
+
+#: src/lib/jcr.c:704
+#, c-format
+msgid ""
+"Watchdog sending kill after %d secs to thread stalled reading Director.\n"
+msgstr ""
+
+#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:186
+#, c-format
+msgid "Problem probably begins at line %d.\n"
+msgstr ""
+
+#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:191
+#, c-format
+msgid ""
+"Config error: %s\n"
+"            : line %d, col %d of file %s\n"
+"%s\n"
+"%s"
+msgstr ""
+
+#: src/lib/lex.c:88
+#, c-format
+msgid "Config error: %s\n"
+msgstr ""
+
+#: src/lib/lex.c:108
+msgid "Close of NULL file\n"
+msgstr ""
+
+#: src/lib/lex.c:181
+msgid "get_char: called after EOF\n"
+msgstr ""
+
+#: src/lib/lex.c:220
+#, c-format
+msgid "Config token too long, file: %s, line %d, begins at line %d\n"
+msgstr ""
+
+#: src/lib/lex.c:244
+msgid "none"
+msgstr ""
+
+#: src/lib/lex.c:245
+msgid "comment"
+msgstr ""
+
+#: src/lib/lex.c:246
+msgid "number"
+msgstr ""
+
+#: src/lib/lex.c:247
+msgid "ip_addr"
+msgstr ""
+
+#: src/lib/lex.c:248
+msgid "identifier"
+msgstr ""
+
+#: src/lib/lex.c:249
+msgid "string"
+msgstr ""
+
+#: src/lib/lex.c:250
+msgid "quoted_string"
+msgstr ""
+
+#: src/lib/lex.c:286
+#, c-format
+msgid "expected a positive integer number, got: %s"
+msgstr ""
+
+#: src/lib/lex.c:292
+#, c-format
+msgid "expected a postive integer number, got: %s"
+msgstr ""
+
+#: src/lib/lex.c:504
+#, c-format
+msgid "Cannot open included config file %s: %s\n"
+msgstr ""
+
+#: src/lib/lex.c:539
+#, c-format
+msgid "expected an integer or a range, got %s: %s"
+msgstr ""
+
+#: src/lib/lex.c:553 src/lib/lex.c:561 src/lib/lex.c:572 src/lib/lex.c:580
+#, c-format
+msgid "expected an integer number, got %s: %s"
+msgstr ""
+
+#: src/lib/lex.c:590
+#, c-format
+msgid "expected a name, got %s: %s"
+msgstr ""
+
+#: src/lib/lex.c:594
+#, c-format
+msgid "name %s length %d too long, max is %d\n"
+msgstr ""
+
+#: src/lib/lex.c:602
+#, c-format
+msgid "expected a string, got %s: %s"
+msgstr ""
+
+#: src/lib/mem_pool.c:95
+#, c-format
+msgid "MemPool index %d larger than max %d\n"
+msgstr ""
+
+#: src/lib/mem_pool.c:113 src/lib/mem_pool.c:133 src/lib/mem_pool.c:168
+#: src/lib/mem_pool.c:239 src/lib/mem_pool.c:259 src/lib/mem_pool.c:297
+#: src/lib/mem_pool.c:550
+#, c-format
+msgid "Out of memory requesting %d bytes\n"
+msgstr ""
+
+#: src/lib/message.c:253 src/lib/message.c:263
+#, c-format
+msgid "Could not open console message file %s: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:268
+#, c-format
+msgid "Could not get con mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:372
+#, c-format
+msgid "open mail pipe %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:378
+msgid "Bacula Message"
+msgstr ""
+
+#: src/lib/message.c:431
+msgid "open mail pipe failed.\n"
+msgstr ""
+
+#: src/lib/message.c:443
+#, c-format
+msgid "close error: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:454
+#, c-format
+msgid "Mail prog: %s"
+msgstr ""
+
+#: src/lib/message.c:463
+#, c-format
+msgid ""
+"Mail program terminated in error.\n"
+"CMD=%s\n"
+"ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:650
+#, c-format
+msgid ""
+"Operator mail program terminated in error.\n"
+"CMD=%s\n"
+"ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:667 src/lib/message.c:689 src/lib/message.c:705
+#, c-format
+msgid "fopen %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/lib/message.c:933
+#, c-format
+msgid "%s: ABORTING due to ERROR in %s:%d\n"
+msgstr ""
+
+#: src/lib/message.c:937
+#, c-format
+msgid "%s: ERROR TERMINATION at %s:%d\n"
+msgstr ""
+
+#: src/lib/message.c:942
+#, c-format
+msgid "%s: Fatal Error because: "
+msgstr ""
+
+#: src/lib/message.c:944
+#, c-format
+msgid "%s: Fatal Error at %s:%d because:\n"
+msgstr ""
+
+#: src/lib/message.c:948
+#, c-format
+msgid "%s: ERROR: "
+msgstr ""
+
+#: src/lib/message.c:950
+#, c-format
+msgid "%s: ERROR in %s:%d "
+msgstr ""
+
+#: src/lib/message.c:953
+#, c-format
+msgid "%s: Warning: "
+msgstr ""
+
+#: src/lib/message.c:956
+#, c-format
+msgid "%s: Security violation: "
+msgstr ""
+
+#: src/lib/message.c:1032
+#, c-format
+msgid "%s ABORTING due to ERROR\n"
+msgstr ""
+
+#: src/lib/message.c:1035
+#, c-format
+msgid "%s ERROR TERMINATION\n"
+msgstr ""
+
+#: src/lib/message.c:1038
+#, c-format
+msgid "%s: %s Fatal error: "
+msgstr ""
+
+#: src/lib/message.c:1044
+#, c-format
+msgid "%s: %s Error: "
+msgstr ""
+
+#: src/lib/message.c:1050
+#, c-format
+msgid "%s: %s Warning: "
+msgstr ""
+
+#: src/lib/message.c:1053
+#, c-format
+msgid "%s: %s Security violation: "
+msgstr ""
+
+#: src/lib/parse_conf.c:160
+msgid "***UNKNOWN***"
+msgstr ""
+
+#: src/lib/parse_conf.c:179
+#, c-format
+msgid "Unable to initialize resource lock. ERR=%s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:262 src/lib/parse_conf.c:281
+#, c-format
+msgid "expected an =, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:289
+#, c-format
+msgid "Unknown item code: %d\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:328
+#, c-format
+msgid "message type: %s not found"
+msgstr ""
+
+#: src/lib/parse_conf.c:367
+#, c-format
+msgid "Attempt to redefine name \"%s\" to \"%s\"."
+msgstr ""
+
+#: src/lib/parse_conf.c:458
+#, c-format
+msgid "Could not find config Resource %s referenced on line %d : %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:462
+#, c-format
+msgid "Attempt to redefine resource \"%s\" referenced on line %d : %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:497
+#, c-format
+msgid "Too many %s directives. Max. is %d. line %d: %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:507
+#, c-format
+msgid "Could not find config Resource \"%s\" referenced on line %d : %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:569
+#, c-format
+msgid "Missing config Resource \"%s\" referenced on line %d : %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:633
+#, c-format
+msgid "expected a size number, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:638
+#, c-format
+msgid "expected a size, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:675 src/lib/parse_conf.c:680
+#, c-format
+msgid "expected a time period, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:699
+#, c-format
+msgid "Expect a %s or %s, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:723
+#, c-format
+msgid "Expected a Tape Label keyword, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:772
+#, c-format
+msgid "Cannot open config file \"%s\": %s\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:785
+#, c-format
+msgid "Expected a Resource name identifier, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:797
+#, c-format
+msgid "expected resource name, got: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:808
+#, c-format
+msgid "not in resource definition: %s"
+msgstr ""
+
+#: src/lib/parse_conf.c:833
+#, c-format
+msgid ""
+"Keyword \"%s\" not permitted in this resource.\n"
+"Perhaps you left the trailing brace off of the previous resource."
+msgstr ""
+
+#: src/lib/parse_conf.c:850
+#, c-format
+msgid "unexpected token %d %s in resource definition"
+msgstr ""
+
+#: src/lib/parse_conf.c:856
+#, c-format
+msgid "Unknown parser state %d\n"
+msgstr ""
+
+#: src/lib/parse_conf.c:861
+msgid "End of conf file reached with unclosed resource."
+msgstr ""
+
+#: src/lib/pythonlib.c:108
+msgid "Could not initialize Python\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:113
+#, c-format
+msgid "Could not Run Python string %s\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:125
+msgid "Could not initialize Python Job type.\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:130
+#, c-format
+msgid "Could not import Python script %s/%s. Python disabled.\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:230
+msgid "Could not create Python Job Object.\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:243 src/lib/pythonlib.c:267
+#, c-format
+msgid "Python function \"%s\" not found.\n"
+msgstr ""
+
+#: src/lib/pythonlib.c:282
+#, c-format
+msgid "Unknown Python daemon event %s\n"
+msgstr ""
+
+#: src/lib/regex.c:1040
+msgid "Success"
+msgstr ""
+
+#: src/lib/regex.c:1043
+msgid "No match"
+msgstr ""
+
+#: src/lib/regex.c:1046
+msgid "Invalid regular expression"
+msgstr ""
+
+#: src/lib/regex.c:1049
+msgid "Invalid collation character"
+msgstr ""
+
+#: src/lib/regex.c:1052
+msgid "Invalid character class name"
+msgstr ""
+
+#: src/lib/regex.c:1055
+msgid "Trailing backslash"
+msgstr ""
+
+#: src/lib/regex.c:1058
+msgid "Invalid back reference"
+msgstr ""
+
+#: src/lib/regex.c:1061
+msgid "Unmatched [ or [^"
+msgstr ""
+
+#: src/lib/regex.c:1064
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: src/lib/regex.c:1067
+msgid "Unmatched \\{"
+msgstr ""
+
+#: src/lib/regex.c:1070
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: src/lib/regex.c:1073
+msgid "Invalid range end"
+msgstr ""
+
+#: src/lib/regex.c:1076
+msgid "Memory exhausted"
+msgstr ""
+
+#: src/lib/regex.c:1079
+msgid "Invalid preceding regular expression"
+msgstr ""
+
+#: src/lib/regex.c:1082
+msgid "Premature end of regular expression"
+msgstr ""
+
+#: src/lib/regex.c:1085
+msgid "Regular expression too big"
+msgstr ""
+
+#: src/lib/regex.c:1088
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: src/lib/regex.c:5874
+msgid "No previous regular expression"
+msgstr ""
+
+#: src/lib/res.c:66
+#, c-format
+msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
+msgstr ""
+
+#: src/lib/res.c:76
+#, c-format
+msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:289
+msgid "rwl_writeunlock called too many times.\n"
+msgstr ""
+
+#: src/lib/rwlock.c:293
+msgid "rwl_writeunlock by non-owner.\n"
+msgstr ""
+
+#: src/lib/rwlock.c:358 src/lib/semlock.c:248
+#, c-format
+msgid "Write lock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:365 src/lib/semlock.c:255
+#, c-format
+msgid "Write unlock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:375 src/lib/semlock.c:265
+#, c-format
+msgid "Read lock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:382 src/lib/semlock.c:272
+#, c-format
+msgid "Read unlock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:391 src/lib/semlock.c:281
+#, c-format
+msgid "Thread %d found unchanged elements %d times\n"
+msgstr ""
+
+#: src/lib/rwlock.c:423 src/lib/semlock.c:313
+#, c-format
+msgid "Init rwlock failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:438 src/lib/semlock.c:328
+#, c-format
+msgid "Create thread failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:449 src/lib/semlock.c:339
+#, c-format
+msgid "Join thread failed. ERR=%s\n"
+msgstr ""
+
+#: src/lib/rwlock.c:452 src/lib/semlock.c:342
+#, c-format
+msgid "%02d: interval %d, writes %d, reads %d\n"
+msgstr ""
+
+#: src/lib/rwlock.c:462 src/lib/semlock.c:352
+#, c-format
+msgid "data %02d: value %d, %d writes\n"
+msgstr ""
+
+#: src/lib/rwlock.c:467 src/lib/semlock.c:357
+#, c-format
+msgid "Total: %d thread writes, %d data writes\n"
+msgstr ""
+
+#: src/lib/rwlock.c:539 src/lib/semlock.c:429
+msgid "Try write lock"
+msgstr ""
+
+#: src/lib/rwlock.c:545 src/lib/semlock.c:435
+msgid "Try read lock"
+msgstr ""
+
+#: src/lib/rwlock.c:600 src/lib/semlock.c:490
+msgid "Create thread"
+msgstr ""
+
+#: src/lib/rwlock.c:610 src/lib/semlock.c:500
+msgid "Join thread"
+msgstr ""
+
+#: src/lib/rwlock.c:612 src/lib/semlock.c:502
+#, c-format
+msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n"
+msgstr ""
+
+#: src/lib/rwlock.c:624 src/lib/semlock.c:514
+#, c-format
+msgid "data %02d: value %d, %d updates\n"
+msgstr ""
+
+#: src/lib/semlock.c:185
+msgid "sem_unlock by non-owner.\n"
+msgstr ""
+
+#: src/lib/signal.c:61
+msgid "Invalid signal number"
+msgstr ""
+
+#: src/lib/signal.c:87
+#, c-format
+msgid "Bacula interrupted by signal %d: %s\n"
+msgstr ""
+
+#: src/lib/signal.c:100
+#, c-format
+msgid "Kaboom! %s, %s got signal %d. Attempting traceback.\n"
+msgstr ""
+
+#: src/lib/signal.c:102
+#, c-format
+msgid "Kaboom! exepath=%s\n"
+msgstr ""
+
+#: src/lib/signal.c:136
+#, c-format
+msgid "Fork error: ERR=%s\n"
+msgstr ""
+
+#: src/lib/signal.c:143
+#, c-format
+msgid "Calling: %s %s %s\n"
+msgstr ""
+
+#: src/lib/signal.c:145
+#, c-format
+msgid "execv: %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/lib/signal.c:160
+#, c-format
+msgid "Traceback complete, attempting cleanup ...\n"
+msgstr ""
+
+#: src/lib/signal.c:168
+#, c-format
+msgid "It looks like the traceback worked ...\n"
+msgstr ""
+
+#: src/lib/signal.c:197
+#, c-format
+msgid "BA_NSIG too small (%d) should be (%d)\n"
+msgstr ""
+
+#: src/lib/signal.c:203
+msgid "UNKNOWN SIGNAL"
+msgstr ""
+
+#: src/lib/signal.c:204
+msgid "Hangup"
+msgstr ""
+
+#: src/lib/signal.c:205
+msgid "Interrupt"
+msgstr ""
+
+#: src/lib/signal.c:206
+msgid "Quit"
+msgstr ""
+
+#: src/lib/signal.c:207
+msgid "Illegal instruction"
+msgstr ""
+
+#: src/lib/signal.c:208
+msgid "Trace/Breakpoint trap"
+msgstr ""
+
+#: src/lib/signal.c:209
+msgid "Abort"
+msgstr ""
+
+#: src/lib/signal.c:211
+msgid "EMT instruction (Emulation Trap)"
+msgstr ""
+
+#: src/lib/signal.c:214
+msgid "IOT trap"
+msgstr ""
+
+#: src/lib/signal.c:216
+msgid "BUS error"
+msgstr ""
+
+#: src/lib/signal.c:217
+msgid "Floating-point exception"
+msgstr ""
+
+#: src/lib/signal.c:218
+msgid "Kill, unblockable"
+msgstr ""
+
+#: src/lib/signal.c:219
+msgid "User-defined signal 1"
+msgstr ""
+
+#: src/lib/signal.c:220
+msgid "Segmentation violation"
+msgstr ""
+
+#: src/lib/signal.c:221
+msgid "User-defined signal 2"
+msgstr ""
+
+#: src/lib/signal.c:222
+msgid "Broken pipe"
+msgstr ""
+
+#: src/lib/signal.c:223
+msgid "Alarm clock"
+msgstr ""
+
+#: src/lib/signal.c:224
+msgid "Termination"
+msgstr ""
+
+#: src/lib/signal.c:226
+msgid "Stack fault"
+msgstr ""
+
+#: src/lib/signal.c:228
+msgid "Child status has changed"
+msgstr ""
+
+#: src/lib/signal.c:229
+msgid "Continue"
+msgstr ""
+
+#: src/lib/signal.c:230
+msgid "Stop, unblockable"
+msgstr ""
+
+#: src/lib/signal.c:231
+msgid "Keyboard stop"
+msgstr ""
+
+#: src/lib/signal.c:232
+msgid "Background read from tty"
+msgstr ""
+
+#: src/lib/signal.c:233
+msgid "Background write to tty"
+msgstr ""
+
+#: src/lib/signal.c:234
+msgid "Urgent condition on socket"
+msgstr ""
+
+#: src/lib/signal.c:235
+msgid "CPU limit exceeded"
+msgstr ""
+
+#: src/lib/signal.c:236
+msgid "File size limit exceeded"
+msgstr ""
+
+#: src/lib/signal.c:237
+msgid "Virtual alarm clock"
+msgstr ""
+
+#: src/lib/signal.c:238
+msgid "Profiling alarm clock"
+msgstr ""
+
+#: src/lib/signal.c:239
+msgid "Window size change"
+msgstr ""
+
+#: src/lib/signal.c:240
+msgid "I/O now possible"
+msgstr ""
+
+#: src/lib/signal.c:242
+msgid "Power failure restart"
+msgstr ""
+
+#: src/lib/signal.c:245
+msgid "No runnable lwp"
+msgstr ""
+
+#: src/lib/signal.c:248
+msgid "SIGLWP special signal used by thread library"
+msgstr ""
+
+#: src/lib/signal.c:251
+msgid "Checkpoint Freeze"
+msgstr ""
+
+#: src/lib/signal.c:254
+msgid "Checkpoint Thaw"
+msgstr ""
+
+#: src/lib/signal.c:257
+msgid "Thread Cancellation"
+msgstr ""
+
+#: src/lib/signal.c:260
+msgid "Resource Lost (e.g. record-lock lost)"
+msgstr ""
+
+#: src/lib/smartall.c:132 src/lib/smartall.c:223 src/lib/smartall.c:238
+msgid "Out of memory\n"
+msgstr ""
+
+#: src/lib/smartall.c:160
+#, c-format
+msgid "Attempt to free NULL called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:176
+#, c-format
+msgid "qp->qnext->qprev != qp called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:180
+#, c-format
+msgid "qp->qprev->qnext != qp called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:189
+#, c-format
+msgid "Buffer overrun called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:260
+#, c-format
+msgid "sm_realloc size: %d\n"
+msgstr ""
+
+#: src/lib/smartall.c:301
+#, c-format
+msgid "sm_realloc %d at %x from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:363
+#, c-format
+msgid ""
+"\n"
+"Orphaned buffers exist.  Dump terminated following\n"
+"  discovery of bad links in chain of orphaned buffers.\n"
+"  Buffer address with bad links: %lx\n"
+msgstr ""
+
+#: src/lib/smartall.c:374
+#, c-format
+msgid "Orphaned buffer:  %6u bytes allocated at line %d of %s %s\n"
+msgstr ""
+
+#: src/lib/smartall.c:410
+#, c-format
+msgid "Damaged buffer found. Called from %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:440
+#, c-format
+msgid ""
+"\n"
+"Damaged buffers found at %s:%d\n"
+msgstr ""
+
+#: src/lib/smartall.c:443
+#, c-format
+msgid "  discovery of bad prev link.\n"
+msgstr ""
+
+#: src/lib/smartall.c:446
+#, c-format
+msgid "  discovery of bad next link.\n"
+msgstr ""
+
+#: src/lib/smartall.c:449
+#, c-format
+msgid "  discovery of data overrun.\n"
+msgstr ""
+
+#: src/lib/smartall.c:452
+#, c-format
+msgid "  Buffer address: %lx\n"
+msgstr ""
+
+#: src/lib/smartall.c:459
+#, c-format
+msgid "Damaged buffer:  %6u bytes allocated at line %d of %s %s\n"
+msgstr ""
+
+#: src/lib/util.c:181
+msgid "Running"
+msgstr ""
+
+#: src/lib/util.c:184
+msgid "Blocked"
+msgstr ""
+
+#: src/lib/util.c:194
+msgid "Non-fatal error"
+msgstr ""
+
+#: src/lib/util.c:197 src/lib/util.c:264
+msgid "Canceled"
+msgstr ""
+
+#: src/lib/util.c:200
+msgid "Verify differences"
+msgstr ""
+
+#: src/lib/util.c:203
+msgid "Waiting on FD"
+msgstr ""
+
+#: src/lib/util.c:206
+msgid "Wait on SD"
+msgstr ""
+
+#: src/lib/util.c:209
+msgid "Wait for new Volume"
+msgstr ""
+
+#: src/lib/util.c:212
+msgid "Waiting for mount"
+msgstr ""
+
+#: src/lib/util.c:215
+msgid "Waiting for Storage resource"
+msgstr ""
+
+#: src/lib/util.c:218
+msgid "Waiting for Job resource"
+msgstr ""
+
+#: src/lib/util.c:221
+msgid "Waiting for Client resource"
+msgstr ""
+
+#: src/lib/util.c:224
+msgid "Waiting on Max Jobs"
+msgstr ""
+
+#: src/lib/util.c:227
+msgid "Waiting for Start Time"
+msgstr ""
+
+#: src/lib/util.c:230
+msgid "Waiting on Priority"
+msgstr ""
+
+#: src/lib/util.c:237
+#, c-format
+msgid "Unknown Job termination status=%d"
+msgstr ""
+
+#: src/lib/util.c:261
+msgid "Fatal Error"
+msgstr ""
+
+#: src/lib/util.c:267
+msgid "Differences"
+msgstr ""
+
+#: src/lib/util.c:270
+msgid "Unknown term code"
+msgstr ""
+
+#: src/lib/util.c:298
+msgid "Migrate"
+msgstr ""
+
+#: src/lib/util.c:301
+msgid "Copy"
+msgstr ""
+
+#: src/lib/util.c:304
+msgid "Unknown Type"
+msgstr ""
+
+#: src/lib/util.c:336
+msgid "Verify Init Catalog"
+msgstr ""
+
+#: src/lib/util.c:345
+msgid "Verify Data"
+msgstr ""
+
+#: src/lib/util.c:647
+msgid "Working directory not defined. Cannot continue.\n"
+msgstr ""
+
+#: src/lib/util.c:650
+#, c-format
+msgid "Working Directory: \"%s\" not found. Cannot continue.\n"
+msgstr ""
+
+#: src/lib/util.c:654
+#, c-format
+msgid "Working Directory: \"%s\" is not a directory. Cannot continue.\n"
+msgstr ""
+
+#: src/lib/var.c:2659
+msgid "everything ok"
+msgstr ""
+
+#: src/lib/var.c:2660
+msgid "incomplete named character"
+msgstr ""
+
+#: src/lib/var.c:2661
+msgid "incomplete hexadecimal value"
+msgstr ""
+
+#: src/lib/var.c:2662
+msgid "invalid hexadecimal value"
+msgstr ""
+
+#: src/lib/var.c:2663
+msgid "octal value too large"
+msgstr ""
+
+#: src/lib/var.c:2664
+msgid "invalid octal value"
+msgstr ""
+
+#: src/lib/var.c:2665
+msgid "incomplete octal value"
+msgstr ""
+
+#: src/lib/var.c:2666
+msgid "incomplete grouped hexadecimal value"
+msgstr ""
+
+#: src/lib/var.c:2667
+msgid "incorrect character class specification"
+msgstr ""
+
+#: src/lib/var.c:2668
+msgid "invalid expansion configuration"
+msgstr ""
+
+#: src/lib/var.c:2669
+msgid "out of memory"
+msgstr ""
+
+#: src/lib/var.c:2670
+msgid "incomplete variable specification"
+msgstr ""
+
+#: src/lib/var.c:2671
+msgid "undefined variable"
+msgstr ""
+
+#: src/lib/var.c:2672
+msgid "input is neither text nor variable"
+msgstr ""
+
+#: src/lib/var.c:2673
+msgid "unknown command character in variable"
+msgstr ""
+
+#: src/lib/var.c:2674
+msgid "malformatted search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2675
+msgid "unknown flag in search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2676
+msgid "invalid regex in search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2677
+msgid "missing parameter in command"
+msgstr ""
+
+#: src/lib/var.c:2678
+msgid "empty search string in search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2679
+msgid "start offset missing in cut operation"
+msgstr ""
+
+#: src/lib/var.c:2680
+msgid "offsets in cut operation delimited by unknown character"
+msgstr ""
+
+#: src/lib/var.c:2681
+msgid "range out of bounds in cut operation"
+msgstr ""
+
+#: src/lib/var.c:2682
+msgid "offset out of bounds in cut operation"
+msgstr ""
+
+#: src/lib/var.c:2683
+msgid "logic error in cut operation"
+msgstr ""
+
+#: src/lib/var.c:2684
+msgid "malformatted transpose operation"
+msgstr ""
+
+#: src/lib/var.c:2685
+msgid "source and target class mismatch in transpose operation"
+msgstr ""
+
+#: src/lib/var.c:2686
+msgid "empty character class in transpose operation"
+msgstr ""
+
+#: src/lib/var.c:2687
+msgid "incorrect character class in transpose operation"
+msgstr ""
+
+#: src/lib/var.c:2688
+msgid "malformatted padding operation"
+msgstr ""
+
+#: src/lib/var.c:2689
+msgid "width parameter missing in padding operation"
+msgstr ""
+
+#: src/lib/var.c:2690
+msgid "fill string missing in padding operation"
+msgstr ""
+
+#: src/lib/var.c:2691
+msgid "unknown quoted pair in search and replace operation"
+msgstr ""
+
+#: src/lib/var.c:2692
+msgid "sub-matching reference out of range"
+msgstr ""
+
+#: src/lib/var.c:2693
+msgid "invalid argument"
+msgstr ""
+
+#: src/lib/var.c:2694
+msgid "incomplete quoted pair"
+msgstr ""
+
+#: src/lib/var.c:2695
+msgid "lookup function does not support variable arrays"
+msgstr ""
+
+#: src/lib/var.c:2696
+msgid "index of array variable contains an invalid character"
+msgstr ""
+
+#: src/lib/var.c:2697
+msgid "index of array variable is incomplete"
+msgstr ""
+
+#: src/lib/var.c:2698
+msgid "bracket expression in array variable's index not closed"
+msgstr ""
+
+#: src/lib/var.c:2699
+msgid "division by zero error in index specification"
+msgstr ""
+
+#: src/lib/var.c:2700
+msgid "unterminated loop construct"
+msgstr ""
+
+#: src/lib/var.c:2701
+msgid "invalid character in loop limits"
+msgstr ""
+
+#: src/lib/var.c:2702
+msgid "malformed operation argument list"
+msgstr ""
+
+#: src/lib/var.c:2703
+msgid "undefined operation"
+msgstr ""
+
+#: src/lib/var.c:2704
+msgid "formatting failure"
+msgstr ""
+
+#: src/lib/var.c:2713
+msgid "unknown error"
+msgstr ""
+
+#: src/lib/watchdog.c:74
+#, c-format
+msgid "Unable to initialize watchdog lock. ERR=%s\n"
+msgstr ""
+
+#: src/lib/watchdog.c:170
+msgid "BUG! register_watchdog called before start_watchdog\n"
+msgstr ""
+
+#: src/lib/watchdog.c:173
+#, c-format
+msgid "BUG! Watchdog %p has NULL callback\n"
+msgstr ""
+
+#: src/lib/watchdog.c:176
+#, c-format
+msgid "BUG! Watchdog %p has zero interval\n"
+msgstr ""
+
+#: src/lib/watchdog.c:196
+msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n"
+msgstr ""
+
+#: src/lib/watchdog.c:313
+#, c-format
+msgid "rwl_writelock failure. ERR=%s\n"
+msgstr ""
+
+#: src/lib/watchdog.c:327
+#, c-format
+msgid "rwl_writeunlock failure. ERR=%s\n"
+msgstr ""
+
+#: src/stored/acquire.c:96
+#, c-format
+msgid "Hey! num_writers=%d!!!!\n"
+msgstr ""
+
+#: src/stored/acquire.c:146
+#, c-format
+msgid "Num_writers=%d not zero. Job %d canceled.\n"
+msgstr ""
+
+#: src/stored/acquire.c:154
+#, c-format
+msgid "No volumes specified. Job %d canceled.\n"
+msgstr ""
+
+#: src/stored/acquire.c:182 src/stored/mount.c:73
+#, c-format
+msgid "Job %d canceled.\n"
+msgstr ""
+
+#: src/stored/acquire.c:193
+#, c-format
+msgid "Open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
+msgstr ""
+
+#: src/stored/acquire.c:198
+#, c-format
+msgid "Open device %s Volume \"%s\" failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/acquire.c:263 src/stored/mount.c:67
+#, c-format
+msgid "Too many errors trying to mount device %s.\n"
+msgstr ""
+
+#: src/stored/acquire.c:272
+#, c-format
+msgid "Ready to read from volume \"%s\" on device %s.\n"
+msgstr ""
+
+#: src/stored/acquire.c:311
+#, c-format
+msgid "Device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/acquire.c:341
+#, c-format
+msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
+msgstr ""
+
+#: src/stored/acquire.c:360
+#, c-format
+msgid ""
+"Cannot recycle volume \"%s\" on device %s because it is in use by another "
+"job.\n"
+msgstr ""
+
+#: src/stored/acquire.c:382
+#, c-format
+msgid "Could not ready device %s for append.\n"
+msgstr ""
+
+#: src/stored/acquire.c:459 src/stored/block.c:354 src/stored/block.c:677
+#: src/stored/block.c:746
+#, c-format
+msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
+msgstr ""
+
+#: src/stored/acquire.c:501
+#, c-format
+msgid "Alert: %s"
+msgstr ""
+
+#: src/stored/acquire.c:509
+#, c-format
+msgid "3997 Bad alert command: %s: ERR=%s.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:83
+#, c-format
+msgid "Read error on device %s in ANSI label. ERR=%s\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:93
+msgid "Insane! End of tape while reading ANSI label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:117
+msgid "No VOL1 label while reading ANSI/IBM label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:137
+#, c-format
+msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:148
+msgid "No HDR1 label while reading ANSI label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:154
+#, c-format
+msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:165
+msgid "No HDR2 label while reading ANSI/IBM label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:179
+msgid "Unknown or bad ANSI/IBM label record.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:186
+msgid "Too many records in while reading ANSI/IBM label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:285
+#, c-format
+msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:302
+#, c-format
+msgid "Could not write ANSI VOL1 label. ERR=%s\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
+#, c-format
+msgid "Could not write ANSI HDR1 label. ERR=%s\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
+msgid "Could not write ANSI HDR1 label.\n"
+msgstr ""
+
+#: src/stored/ansi_label.c:381
+#, c-format
+msgid "Error writing EOF to tape. ERR=%s"
+msgstr ""
+
+#: src/stored/ansi_label.c:386
+msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
+msgstr ""
+
+#: src/stored/append.c:49
+msgid "DCR is NULL!!!\n"
+msgstr ""
+
+#: src/stored/append.c:54
+msgid "DEVICE is NULL!!!\n"
+msgstr ""
+
+#: src/stored/append.c:66
+msgid "Unable to set network buffer size.\n"
+msgstr ""
+
+#: src/stored/append.c:79 src/stored/append.c:88 src/stored/append.c:100
+#: src/stored/append.c:256 src/stored/append.c:271 src/stored/append.c:283
+#: src/stored/askdir.c:294 src/stored/askdir.c:295
+msgid "NULL Volume name. This shouldn't happen!!!\n"
+msgstr ""
+
+#: src/stored/append.c:94 src/stored/btape.c:1854
+#, c-format
+msgid "Write session label failed. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:106
+#, c-format
+msgid "Network send error to FD. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:143
+#, c-format
+msgid "Error reading data header from FD. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:165
+#, c-format
+msgid "Malformed data header from FD: %s\n"
+msgstr ""
+
+#: src/stored/append.c:175
+msgid "File index from FD not positive or sequential\n"
+msgstr ""
+
+#: src/stored/append.c:206 src/stored/append.c:276 src/stored/spool.c:248
+#, c-format
+msgid "Fatal append error on device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:231
+#, c-format
+msgid "Error updating file attributes. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:244
+#, c-format
+msgid "Network error on data channel. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:265 src/stored/btape.c:1976
+#, c-format
+msgid "Error writting end session label. ERR=%s\n"
+msgstr ""
+
+#: src/stored/append.c:278
+msgid "Set ok=FALSE after write_block_to_device.\n"
+msgstr ""
+
+#: src/stored/askdir.c:161
+msgid "Network error on bnet_recv in req_vol_info.\n"
+msgstr ""
+
+#: src/stored/askdir.c:178
+#, c-format
+msgid "Error getting Volume info: %s"
+msgstr ""
+
+#: src/stored/askdir.c:299 src/stored/askdir.c:300
+msgid "Attempt to update_volume_info in read mode!!!\n"
+msgstr ""
+
+#: src/stored/askdir.c:328
+#, c-format
+msgid "Didn't get vol info vol=%s: ERR=%s"
+msgstr ""
+
+#: src/stored/askdir.c:359
+#, c-format
+msgid "Error creating JobMedia record: ERR=%s\n"
+msgstr ""
+
+#: src/stored/askdir.c:366
+#, c-format
+msgid "Error creating JobMedia record: %s\n"
+msgstr ""
+
+#: src/stored/askdir.c:432
+#, c-format
+msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n"
+msgstr ""
+
+#: src/stored/askdir.c:445
+#, c-format
+msgid ""
+"Job %s waiting. Cannot find any appendable volumes.\n"
+"Please use the \"label\"  command to create a new Volume for:\n"
+"    Storage:      %s\n"
+"    Media type:   %s\n"
+"    Pool:         %s\n"
+msgstr ""
+
+#: src/stored/askdir.c:469 src/stored/askdir.c:551
+#, c-format
+msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n"
+msgstr ""
+
+#: src/stored/askdir.c:479
+msgid "pthread error in mount_next_volume.\n"
+msgstr ""
+
+#: src/stored/askdir.c:511
+msgid "Cannot request another volume: no volume name given.\n"
+msgstr ""
+
+#: src/stored/askdir.c:517
+#, c-format
+msgid "Job %s canceled while waiting for mount on Storage Device %s.\n"
+msgstr ""
+
+#: src/stored/askdir.c:532
+#, c-format
+msgid "Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
+msgstr ""
+
+#: src/stored/askdir.c:561
+msgid "pthread error in mount_volume\n"
+msgstr ""
+
+#: src/stored/authenticate.c:53
+#, c-format
+msgid "I only authenticate Directors, not %d\n"
+msgstr ""
+
+#: src/stored/authenticate.c:120
+msgid ""
+"Incorrect password given by Director.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/stored/authenticate.c:178
+#, c-format
+msgid "Unable to authenticate Director at %s.\n"
+msgstr ""
+
+#: src/stored/authenticate.c:223 src/stored/authenticate.c:259
+#, c-format
+msgid ""
+"Incorrect authorization key from File daemon at %s rejected.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:53
+#, c-format
+msgid "No Changer Name given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:59
+#, c-format
+msgid "No Changer Command given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:72
+#, c-format
+msgid ""
+"Media Type not the same for all devices in changer %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:152
+#, c-format
+msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:161
+#, c-format
+msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:167
+#, c-format
+msgid "3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:208
+msgid "3992 Missing Changer command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:218
+#, c-format
+msgid "3301 Issuing autochanger \"loaded drive %d\" command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:227
+#, c-format
+msgid "3302 Autochanger \"loaded drive %d\", result is Slot %d.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:231
+#, c-format
+msgid "3302 Autochanger \"loaded drive %d\", result: nothing loaded.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:238
+#, c-format
+msgid "3991 Bad autochanger \"loaded drive %d\" command: ERR=%s.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:297 src/stored/autochanger.c:380
+#, c-format
+msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:310 src/stored/autochanger.c:401
+#, c-format
+msgid "3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:369
+#, c-format
+msgid "Volume %s is in use by device %s\n"
+msgstr ""
+
+#: src/stored/autochanger.c:439
+#, c-format
+msgid "3993 Device %s not an autochanger device.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:464
+#, c-format
+msgid "3306 Issuing autochanger \"%s\" command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:467
+msgid "3996 Open bpipe failed.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:494
+#, c-format
+msgid "Autochanger error: ERR=%s\n"
+msgstr ""
+
+#: src/stored/bcopy.c:58
+#, c-format
+msgid ""
+"Copyright (C) 2002-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: bcopy [-d debug_level] <input-archive> <output-archive>\n"
+"       -b bootstrap      specify a bootstrap file\n"
+"       -c <file>         specify configuration file\n"
+"       -d <nn>           set debug level to nn\n"
+"       -i                specify input Volume names (separated by |)\n"
+"       -o                specify output Volume names (separated by |)\n"
+"       -p                proceed inspite of errors\n"
+"       -v                verbose\n"
+"       -w <dir>          specify working directory (default /tmp)\n"
+"       -?                print this message\n"
+"\n"
+msgstr ""
+
+#: src/stored/bcopy.c:137 src/stored/bextract.c:177 src/stored/bscan.c:221
+msgid "Wrong number of arguments: \n"
+msgstr ""
+
+#: src/stored/bcopy.c:172 src/stored/btape.c:333 src/stored/device.c:266
+#, c-format
+msgid "dev open failed: %s\n"
+msgstr ""
+
+#: src/stored/bcopy.c:185
+msgid "Write of last block failed.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:188
+#, c-format
+msgid "%u Jobs copied. %u records copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:205 src/stored/bscan.c:390
+#, c-format
+msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n"
+msgstr ""
+
+#: src/stored/bcopy.c:220
+msgid "Volume is prelabeled. This volume cannot be copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:223
+msgid "Volume label not copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:235 src/stored/bcopy.c:242 src/stored/bcopy.c:265
+#: src/stored/btape.c:2342
+#, c-format
+msgid "Cannot fixup device error. %s\n"
+msgstr ""
+
+#: src/stored/bcopy.c:247
+msgid "EOM label not copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:250
+msgid "EOT label not copied.\n"
+msgstr ""
+
+#: src/stored/bcopy.c:290 src/stored/bextract.c:479 src/stored/bls.c:443
+#: src/stored/bscan.c:1234 src/stored/btape.c:2690
+#, c-format
+msgid "Mount Volume \"%s\" on device %s and press return when ready: "
+msgstr ""
+
+#: src/stored/bextract.c:70
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: bextract <options> <bacula-archive-device-name> <directory-to-store-"
+"files>\n"
+"       -b <file>       specify a bootstrap file\n"
+"       -c <file>       specify a configuration file\n"
+"       -d <nn>         set debug level to nn\n"
+"       -e <file>       exclude list\n"
+"       -i <file>       include list\n"
+"       -p              proceed inspite of I/O errors\n"
+"       -v              verbose\n"
+"       -V <volumes>    specify Volume names (separated by |)\n"
+"       -?              print this message\n"
+"\n"
+msgstr ""
+
+#: src/stored/bextract.c:127 src/stored/bls.c:128
+#, c-format
+msgid "Could not open exclude file: %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/bextract.c:142 src/stored/bls.c:142
+#, c-format
+msgid "Could not open include file: %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/bextract.c:198
+#, c-format
+msgid "%d Program Name and/or Program Data Stream records ignored.\n"
+msgstr ""
+
+#: src/stored/bextract.c:202
+#, c-format
+msgid "%d Win32 data or Win32 gzip data stream records. Ignored.\n"
+msgstr ""
+
+#: src/stored/bextract.c:226
+#, c-format
+msgid "Cannot stat %s. It must exist. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bextract.c:230
+#, c-format
+msgid "%s must be a directory.\n"
+msgstr ""
+
+#: src/stored/bextract.c:251
+#, c-format
+msgid "%u files restored.\n"
+msgstr ""
+
+#: src/stored/bextract.c:278 src/stored/bextract.c:450
+msgid "Logic error output file should be open but is not.\n"
+msgstr ""
+
+#: src/stored/bextract.c:285 src/stored/bls.c:364 src/stored/bscan.c:647
+msgid "Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bextract.c:347
+#, c-format
+msgid "Seek error on %s: %s\n"
+msgstr ""
+
+#: src/stored/bextract.c:400
+#, c-format
+msgid "Uncompression error. ERR=%d\n"
+msgstr ""
+
+#: src/stored/bextract.c:408
+msgid "===Write error===\n"
+msgstr ""
+
+#: src/stored/bextract.c:441
+msgid "Got Program Name or Data Stream. Ignored.\n"
+msgstr ""
+
+#: src/stored/block.c:79
+#, c-format
+msgid ""
+"Dump block %s %x: size=%d BlkNum=%d\n"
+"               Hdrcksum=%x cksum=%x\n"
+msgstr ""
+
+#: src/stored/block.c:92
+#, c-format
+msgid "   Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n"
+msgstr ""
+
+#: src/stored/block.c:148
+#, c-format
+msgid "%d block read errors not printed.\n"
+msgstr ""
+
+#: src/stored/block.c:236 src/stored/block.c:252 src/stored/block.c:262
+#, c-format
+msgid ""
+"Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer "
+"discarded.\n"
+msgstr ""
+
+#: src/stored/block.c:276
+#, c-format
+msgid ""
+"Volume data error at %u:%u! Block length %u is insane (too large), probably "
+"due to a bad archive.\n"
+msgstr ""
+
+#: src/stored/block.c:302
+#, c-format
+msgid ""
+"Volume data error at %u:%u!\n"
+"Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n"
+msgstr ""
+
+#: src/stored/block.c:410
+msgid "Cannot write block. Device at EOM.\n"
+msgstr ""
+
+#: src/stored/block.c:415
+msgid "Attempt to write on read-only Volume.\n"
+msgstr ""
+
+#: src/stored/block.c:467
+#, c-format
+msgid "User defined maximum volume capacity %s exceeded on device %s.\n"
+msgstr ""
+
+#: src/stored/block.c:482
+#, c-format
+msgid "Unable to write EOF. ERR=%s\n"
+msgstr ""
+
+#: src/stored/block.c:508 src/stored/block.c:519
+msgid "Write block header zeroed.\n"
+msgstr ""
+
+#: src/stored/block.c:537
+#, c-format
+msgid "Write error at %u:%u on device %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/block.c:544
+#, c-format
+msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"
+msgstr ""
+
+#: src/stored/block.c:619 src/stored/block.c:625
+#, c-format
+msgid "Backspace file at EOT failed. ERR=%s\n"
+msgstr ""
+
+#: src/stored/block.c:632
+#, c-format
+msgid "Backspace record at EOT failed. ERR=%s\n"
+msgstr ""
+
+#: src/stored/block.c:649
+#, c-format
+msgid "Re-read last block at EOT failed. ERR=%s"
+msgstr ""
+
+#: src/stored/block.c:653
+msgid "Re-read of last block succeeded.\n"
+msgstr ""
+
+#: src/stored/block.c:656
+#, c-format
+msgid "Re-read of last block failed. Last block=%u Current block=%u.\n"
+msgstr ""
+
+#: src/stored/block.c:685
+#, c-format
+msgid ""
+"Error writing final EOF to tape. This Volume may not be readable.\n"
+"%s"
+msgstr ""
+
+#: src/stored/block.c:795 src/stored/dvd.c:689
+#, c-format
+msgid ""
+"Error while writing, current part number is less than the total number of "
+"parts (%d/%d, device=%s)\n"
+msgstr ""
+
+#: src/stored/block.c:803 src/stored/block.c:913
+#, c-format
+msgid "Unable to open device next part %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/block.c:821
+#, c-format
+msgid ""
+"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
+"free_space_errno=%d, errmsg=%s).\n"
+msgstr ""
+
+#: src/stored/block.c:834
+#, c-format
+msgid ""
+"End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
+"free_space_errno=%d).\n"
+msgstr ""
+
+#: src/stored/block.c:888
+#, c-format
+msgid "Block buffer size looping problem on device %s\n"
+msgstr ""
+
+#: src/stored/block.c:939
+#, c-format
+msgid "Read error at file:blk %u:%u on device %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/block.c:952
+#, c-format
+msgid "Read zero bytes at %u:%u on device %s.\n"
+msgstr ""
+
+#: src/stored/block.c:965
+#, c-format
+msgid ""
+"Volume data error at %u:%u! Very short block of %d bytes on device %s "
+"discarded.\n"
+msgstr ""
+
+#: src/stored/block.c:990
+#, c-format
+msgid "Block length %u is greater than buffer %u. Attempting recovery.\n"
+msgstr ""
+
+#: src/stored/block.c:1009
+#, c-format
+msgid "Setting block buffer size to %u bytes.\n"
+msgstr ""
+
+#: src/stored/block.c:1024
+#, c-format
+msgid ""
+"Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n"
+msgstr ""
+
+#: src/stored/bls.c:68
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %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"
+"       -e <file>       exclude list\n"
+"       -i <file>       include list\n"
+"       -j              list jobs\n"
+"       -k              list blocks\n"
+"    (no j or k option) list saved files\n"
+"       -L              dump label\n"
+"       -p              proceed inspite of errors\n"
+"       -v              be verbose\n"
+"       -V              specify Volume names (separated by |)\n"
+"       -?              print this message\n"
+"\n"
+msgstr ""
+
+#: src/stored/bls.c:189
+msgid "No archive name specified\n"
+msgstr ""
+
+#: src/stored/bls.c:224
+#, c-format
+msgid ""
+"\n"
+"Warning, this Volume is a continuation of Volume %s\n"
+msgstr ""
+
+#: src/stored/bls.c:267
+#, c-format
+msgid "Got EOM at file %u on device %s, Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/bls.c:278
+#, c-format
+msgid "Mounted Volume \"%s\".\n"
+msgstr ""
+
+#: src/stored/bls.c:280
+#, c-format
+msgid "Got EOF at file %u on device %s, Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/bls.c:304
+#, c-format
+msgid ""
+"File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
+"s rlen=%d\n"
+msgstr ""
+
+#: src/stored/bls.c:313
+#, c-format
+msgid "Block: %d size=%d\n"
+msgstr ""
+
+#: src/stored/bls.c:380
+#, c-format
+msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n"
+msgstr ""
+
+#: src/stored/bls.c:397 src/stored/read_record.c:322
+msgid "Fresh Volume Label"
+msgstr ""
+
+#: src/stored/bls.c:400 src/stored/read_record.c:325
+msgid "Volume Label"
+msgstr ""
+
+#: src/stored/bls.c:404 src/stored/label.c:969
+msgid "Begin Job Session"
+msgstr ""
+
+#: src/stored/bls.c:408 src/stored/label.c:972
+msgid "End Job Session"
+msgstr ""
+
+#: src/stored/bls.c:411
+msgid "End of Medium"
+msgstr ""
+
+#: src/stored/bls.c:414 src/stored/label.c:981
+msgid "Unknown"
+msgstr ""
+
+#: src/stored/bls.c:420 src/stored/read_record.c:343
+#, c-format
+msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n"
+msgstr ""
+
+#: src/stored/bscan.c:109
+#, c-format
+msgid ""
+"Copyright (C) 2001-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: bscan [ options ] <bacula-archive>\n"
+"       -b bootstrap      specify a bootstrap file\n"
+"       -c <file>         specify configuration file\n"
+"       -d <nn>           set debug level to nn\n"
+"       -m                update media info in database\n"
+"       -n <name>         specify the database name (default bacula)\n"
+"       -u <user>         specify database user name (default bacula)\n"
+"       -P <password      specify database password (default none)\n"
+"       -h <host>         specify database host (default NULL)\n"
+"       -p                proceed inspite of I/O errors\n"
+"       -r                list records\n"
+"       -s                synchronize or store in database\n"
+"       -S                show scan progress periodically\n"
+"       -v                verbose\n"
+"       -V <Volumes>      specify Volume names (separated by |)\n"
+"       -w <dir>          specify working directory (default from conf file)\n"
+"       -?                print this message\n"
+"\n"
+msgstr ""
+
+#: src/stored/bscan.c:234 src/stored/stored.c:265
+#, c-format
+msgid "No Storage resource defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bscan.c:242 src/stored/stored.c:296
+#, c-format
+msgid "No Working Directory defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bscan.c:250
+#, c-format
+msgid "Working Directory: %s not found. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bscan.c:254
+#, c-format
+msgid "Working Directory: %s is not a directory. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/bscan.c:268 src/stored/bscan.c:341
+#, c-format
+msgid "First Volume Size = %sn"
+msgstr ""
+
+#: src/stored/bscan.c:274
+msgid "Could not init Bacula database\n"
+msgstr ""
+
+#: src/stored/bscan.c:281
+#, c-format
+msgid "Using Database: %s, User: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:315
+#, c-format
+msgid "Create JobMedia for Job %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:326
+#, c-format
+msgid "Could not create JobMedia record for Volume=%s Job=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:382
+#, c-format
+msgid "done: %d%%\n"
+msgstr ""
+
+#: src/stored/bscan.c:406
+msgid "Volume is prelabeled. This tape cannot be scanned.\n"
+msgstr ""
+
+#: src/stored/bscan.c:418
+#, c-format
+msgid "Pool record for %s found in DB.\n"
+msgstr ""
+
+#: src/stored/bscan.c:422
+#, c-format
+msgid "VOL_LABEL: Pool record not found for Pool: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:428
+#, c-format
+msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:432
+#, c-format
+msgid "Pool type \"%s\" is OK.\n"
+msgstr ""
+
+#: src/stored/bscan.c:442
+#, c-format
+msgid "Media record for %s found in DB.\n"
+msgstr ""
+
+#: src/stored/bscan.c:449
+#, c-format
+msgid "VOL_LABEL: Media record not found for Volume: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:456
+#, c-format
+msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:460
+#, c-format
+msgid "Media type \"%s\" is OK.\n"
+msgstr ""
+
+#: src/stored/bscan.c:469
+#, c-format
+msgid "VOL_LABEL: OK for Volume: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:476
+#, c-format
+msgid "%d \"errors\" ignored before first Start of Session record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:487
+#, c-format
+msgid "SOS_LABEL: Found Job record for JobId: %d\n"
+msgstr ""
+
+#: src/stored/bscan.c:492
+#, c-format
+msgid "SOS_LABEL: Job record not found for JobId: %d\n"
+msgstr ""
+
+#: src/stored/bscan.c:532
+#, c-format
+msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n"
+msgstr ""
+
+#: src/stored/bscan.c:538
+#, c-format
+msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n"
+msgstr ""
+
+#: src/stored/bscan.c:544
+#, c-format
+msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n"
+msgstr ""
+
+#: src/stored/bscan.c:562 src/stored/bscan.c:1013
+#, c-format
+msgid "Could not find SessId=%d SessTime=%d for EOS record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:606
+#, c-format
+msgid "Could not update job record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:617
+#, c-format
+msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:629
+#, c-format
+msgid "Could not find Job for SessId=%d SessTime=%d record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:665
+#, c-format
+msgid "%s file records. At file:blk=%s:%s bytes=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:708
+#, c-format
+msgid "Got MD5 record: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:717
+#, c-format
+msgid "Got SHA1 record: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:725
+#, c-format
+msgid "Got Prog Names Stream: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:731
+msgid "Got Prog Data Stream record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:735
+#, c-format
+msgid "Unknown stream type!!! stream=%d data=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:799
+#, c-format
+msgid "Could not create File Attributes record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:805
+#, c-format
+msgid "Created File record: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:842
+#, c-format
+msgid "Could not create media record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:846 src/stored/bscan.c:867
+#, c-format
+msgid "Could not update media record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:850
+#, c-format
+msgid "Created Media record for Volume: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:871
+#, c-format
+msgid "Updated Media record at end of Volume: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:888
+#, c-format
+msgid "Could not create pool record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:892
+#, c-format
+msgid "Created Pool record for Pool: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:912
+#, c-format
+msgid "Created Client record for Client: %s\n"
+msgstr ""
+
+#: src/stored/bscan.c:929
+#, c-format
+msgid "Fileset \"%s\" already exists.\n"
+msgstr ""
+
+#: src/stored/bscan.c:933
+#, c-format
+msgid "Could not create FileSet record \"%s\". ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:938
+#, c-format
+msgid "Created FileSet record \"%s\"\n"
+msgstr ""
+
+#: src/stored/bscan.c:985
+#, c-format
+msgid "Could not create JobId record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:991
+#, c-format
+msgid "Could not update job start record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:994
+#, c-format
+msgid "Created new JobId=%u record for original JobId=%u\n"
+msgstr ""
+
+#: src/stored/bscan.c:1044
+#, c-format
+msgid "Could not update JobId=%u record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:1049
+#, c-format
+msgid "Updated Job termination record for JobId=%u TermStat=%c\n"
+msgstr ""
+
+#: src/stored/bscan.c:1071
+#, c-format
+msgid "Job Termination code: %d"
+msgstr ""
+
+#: src/stored/bscan.c:1076
+#, c-format
+msgid ""
+"%s\n"
+"JobId:                  %d\n"
+"Job:                    %s\n"
+"FileSet:                %s\n"
+"Backup Level:           %s\n"
+"Client:                 %s\n"
+"Start time:             %s\n"
+"End time:               %s\n"
+"Files Written:          %s\n"
+"Bytes Written:          %s\n"
+"Volume Session Id:      %d\n"
+"Volume Session Time:    %d\n"
+"Last Volume Bytes:      %s\n"
+"Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/stored/bscan.c:1140
+#, c-format
+msgid "Could not create JobMedia record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:1144
+#, c-format
+msgid "Created JobMedia record JobId %d, MediaId %d\n"
+msgstr ""
+
+#: src/stored/bscan.c:1160
+#, c-format
+msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n"
+msgstr ""
+
+#: src/stored/bscan.c:1174
+#, c-format
+msgid "Could not add MD5/SHA1 to File record. ERR=%s\n"
+msgstr ""
+
+#: src/stored/bscan.c:1179
+msgid "Updated MD5/SHA1 record\n"
+msgstr ""
+
+#: src/stored/btape.c:157 src/stored/stored.c:107
+#, c-format
+msgid "Tape block size (%d) not multiple of system size (%d)\n"
+msgstr ""
+
+#: src/stored/btape.c:161 src/stored/stored.c:111
+#, c-format
+msgid "Tape block size (%d) is not a power of 2\n"
+msgstr ""
+
+#: src/stored/btape.c:164
+#, c-format
+msgid ""
+"\n"
+"\n"
+"!!!! Warning large disk addressing disabled. off_t=%d should be 8 or "
+"more !!!!!\n"
+"\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:171
+#, c-format
+msgid "32 bit printf/scanf problem. i=%d x32=%u y32=%u\n"
+msgstr ""
+
+#: src/stored/btape.c:180
+msgid "64 bit printf/scanf problem. i=%d x64=%"
+msgstr ""
+
+#: src/stored/btape.c:180
+msgid " y64=%"
+msgstr ""
+
+#: src/stored/btape.c:184
+#, c-format
+msgid "Tape block granularity is %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:251
+msgid "No archive name specified.\n"
+msgstr ""
+
+#: src/stored/btape.c:255
+msgid "Improper number of arguments specified.\n"
+msgstr ""
+
+#: src/stored/btape.c:338
+#, c-format
+msgid "open device %s: OK\n"
+msgstr ""
+
+#: src/stored/btape.c:359
+msgid "Enter Volume Name: "
+msgstr ""
+
+#: src/stored/btape.c:366
+#, c-format
+msgid "Device open failed. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:371
+#, c-format
+msgid "Wrote Volume label for volume \"%s\".\n"
+msgstr ""
+
+#: src/stored/btape.c:385
+msgid "Volume has no label.\n"
+msgstr ""
+
+#: src/stored/btape.c:388
+msgid "Volume label read correctly.\n"
+msgstr ""
+
+#: src/stored/btape.c:391
+#, c-format
+msgid "I/O error on device: ERR=%s"
+msgstr ""
+
+#: src/stored/btape.c:394
+msgid "Volume name error\n"
+msgstr ""
+
+#: src/stored/btape.c:397
+#, c-format
+msgid "Error creating label. ERR=%s"
+msgstr ""
+
+#: src/stored/btape.c:400
+msgid "Volume version error.\n"
+msgstr ""
+
+#: src/stored/btape.c:403
+msgid "Bad Volume label type.\n"
+msgstr ""
+
+#: src/stored/btape.c:406
+msgid "Unknown error.\n"
+msgstr ""
+
+#: src/stored/btape.c:424
+#, c-format
+msgid "Bad status from load. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:426
+#, c-format
+msgid "Loaded %s\n"
+msgstr ""
+
+#: src/stored/btape.c:435 src/stored/btape.c:775 src/stored/btape.c:817
+#: src/stored/btape.c:887 src/stored/btape.c:929 src/stored/btape.c:1198
+#, c-format
+msgid "Bad status from rewind. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:438 src/stored/btape.c:1206
+#, c-format
+msgid "Rewound %s\n"
+msgstr ""
+
+#: src/stored/btape.c:465 src/stored/btape.c:1210
+#, c-format
+msgid "Bad status from weof %d. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:469
+#, c-format
+msgid "Wrote 1 EOF to %s\n"
+msgstr ""
+
+#: src/stored/btape.c:472
+#, c-format
+msgid "Wrote %d EOFs to %s\n"
+msgstr ""
+
+#: src/stored/btape.c:490
+msgid "Moved to end of medium.\n"
+msgstr ""
+
+#: src/stored/btape.c:517
+#, c-format
+msgid "Bad status from bsf. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:519
+#, c-format
+msgid "Backspaced %d file%s.\n"
+msgstr ""
+
+#: src/stored/btape.c:536
+#, c-format
+msgid "Bad status from bsr. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:538
+#, c-format
+msgid "Backspaced %d record%s.\n"
+msgstr ""
+
+#: src/stored/btape.c:548 src/stored/status.c:227
+#, c-format
+msgid "Configured device capabilities:\n"
+msgstr ""
+
+#: src/stored/btape.c:566
+#, c-format
+msgid "Device status:\n"
+msgstr ""
+
+#: src/stored/btape.c:580 src/stored/status.c:259
+#, c-format
+msgid "Device parameters:\n"
+msgstr ""
+
+#: src/stored/btape.c:585
+#, c-format
+msgid "Status:\n"
+msgstr ""
+
+#: src/stored/btape.c:600
+msgid ""
+"Test writting larger and larger records.\n"
+"This is a torture test for records.\n"
+"I am going to write\n"
+"larger and larger records. It will stop when the record size\n"
+"plus the header exceeds the block size (by default about 64K)\n"
+msgstr ""
+
+#: src/stored/btape.c:608 src/stored/btape.c:1815
+msgid "Command aborted.\n"
+msgstr ""
+
+#: src/stored/btape.c:624
+#, c-format
+msgid "Block %d i=%d\n"
+msgstr ""
+
+#: src/stored/btape.c:650
+msgid "Skipping read backwards test because BSR turned off.\n"
+msgstr ""
+
+#: src/stored/btape.c:654
+msgid ""
+"\n"
+"=== Write, backup, and re-read test ===\n"
+"\n"
+"I'm going to write three records and an EOF\n"
+"then backup over the EOF and re-read the last record.\n"
+"Bacula does this after writing the last block on the\n"
+"tape to verify that the block was written correctly.\n"
+"\n"
+"This is not an *essential* feature ...\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:667 src/stored/btape.c:678 src/stored/btape.c:689
+#: src/stored/btape.c:787 src/stored/btape.c:803 src/stored/btape.c:899
+#: src/stored/btape.c:915 src/stored/btape.c:1524 src/stored/btape.c:2407
+msgid "Error writing record to block.\n"
+msgstr ""
+
+#: src/stored/btape.c:671 src/stored/btape.c:682 src/stored/btape.c:693
+#: src/stored/btape.c:791 src/stored/btape.c:807 src/stored/btape.c:903
+#: src/stored/btape.c:919 src/stored/btape.c:1528 src/stored/btape.c:2411
+msgid "Error writing block to device.\n"
+msgstr ""
+
+#: src/stored/btape.c:674
+#, c-format
+msgid "Wrote first record of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:685
+#, c-format
+msgid "Wrote second record of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:696
+#, c-format
+msgid "Wrote third record of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:703 src/stored/btape.c:708
+#, c-format
+msgid "Backspace file failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:712
+msgid "Backspaced over EOF OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:714
+#, c-format
+msgid "Backspace record failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:717
+msgid "Backspace record OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:720 src/stored/btape.c:726
+#, c-format
+msgid "Read block failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:731
+msgid "Bad data in record. Test failed!\n"
+msgstr ""
+
+#: src/stored/btape.c:735
+msgid ""
+"\n"
+"Block re-read correct. Test succeeded!\n"
+msgstr ""
+
+#: src/stored/btape.c:736
+msgid ""
+"=== End Write, backup, and re-read test ===\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:743
+msgid ""
+"This is not terribly serious since Bacula only uses\n"
+"this function to verify the last block written to the\n"
+"tape. Bacula will skip the last block verification\n"
+"if you add:\n"
+"\n"
+"Backward Space Record = No\n"
+"\n"
+"to your Storage daemon's Device resource definition.\n"
+msgstr ""
+
+#: src/stored/btape.c:767
+msgid ""
+"\n"
+"=== Write, rewind, and re-read test ===\n"
+"\n"
+"I'm going to write 1000 records and an EOF\n"
+"then write 1000 records and an EOF, then rewind,\n"
+"and re-read the data to verify that it is correct.\n"
+"\n"
+"This is an *essential* feature ...\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:795 src/stored/btape.c:811 src/stored/btape.c:907
+#: src/stored/btape.c:923
+#, c-format
+msgid "Wrote 1000 blocks of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:820 src/stored/btape.c:932
+msgid "Rewind OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:827 src/stored/btape.c:981
+msgid "Got EOF on tape.\n"
+msgstr ""
+
+#: src/stored/btape.c:832
+#, c-format
+msgid "Read block %d failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:838
+#, c-format
+msgid "Read record failed. Block %d! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:844 src/stored/btape.c:1011
+#, c-format
+msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"
+msgstr ""
+
+#: src/stored/btape.c:851
+msgid "1000 blocks re-read correctly.\n"
+msgstr ""
+
+#: src/stored/btape.c:854 src/stored/btape.c:1018
+msgid ""
+"=== Test Succeeded. End Write, rewind, and re-read test ===\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:879
+msgid ""
+"\n"
+"=== Write, rewind, and position test ===\n"
+"\n"
+"I'm going to write 1000 records and an EOF\n"
+"then write 1000 records and an EOF, then rewind,\n"
+"and position to a few blocks and verify that it is correct.\n"
+"\n"
+"This is an *essential* feature ...\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:972
+#, c-format
+msgid "Reposition to file:block %d:%d\n"
+msgstr ""
+
+#: src/stored/btape.c:974
+msgid "Reposition error.\n"
+msgstr ""
+
+#: src/stored/btape.c:987
+#, c-format
+msgid ""
+"Read block %d failed! file=%d blk=%d. ERR=%s\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:989
+msgid ""
+"This may be because the tape drive block size is not\n"
+" set to variable blocking as normally used by Bacula.\n"
+" Please see the Tape Testing chapter in the manual and \n"
+" look for using mt with defblksize and setoptions\n"
+"If your tape drive block size is correct, then perhaps\n"
+" your SCSI driver is *really* stupid and does not\n"
+" correctly report the file:block after a FSF. In this\n"
+" case try setting:\n"
+"    Fast Forward Space File = no\n"
+" in your Device resource.\n"
+msgstr ""
+
+#: src/stored/btape.c:1005
+#, c-format
+msgid "Read record failed! ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1016
+#, c-format
+msgid "Block %d re-read correctly.\n"
+msgstr ""
+
+#: src/stored/btape.c:1037
+msgid ""
+"\n"
+"\n"
+"=== Append files test ===\n"
+"\n"
+"This test is essential to Bacula.\n"
+"\n"
+"I'm going to write one record  in file 0,\n"
+"                   two records in file 1,\n"
+"             and three records in file 2\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1061
+msgid "Now moving to end of medium.\n"
+msgstr ""
+
+#: src/stored/btape.c:1063 src/stored/btape.c:1293
+#, c-format
+msgid "We should be in file 3. I am at file %d. %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
+msgid "This is correct!"
+msgstr ""
+
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
+msgid "This is NOT correct!!!!"
+msgstr ""
+
+#: src/stored/btape.c:1070
+msgid ""
+"\n"
+"Now the important part, I am going to attempt to append to the tape.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1077
+msgid ""
+"Done appending, there should be no I/O errors\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1078
+msgid "Doing Bacula scan of blocks:\n"
+msgstr ""
+
+#: src/stored/btape.c:1080
+msgid "End scanning the tape.\n"
+msgstr ""
+
+#: src/stored/btape.c:1081 src/stored/btape.c:1306
+#, c-format
+msgid "We should be in file 4. I am at file %d. %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1106
+msgid ""
+"\n"
+"Autochanger enabled, but no name or no command device specified.\n"
+msgstr ""
+
+#: src/stored/btape.c:1110
+msgid ""
+"\n"
+"Ah, I see you have an autochanger configured.\n"
+"To test the autochanger you must have a blank tape\n"
+" that I can write on in Slot 1.\n"
+msgstr ""
+
+#: src/stored/btape.c:1113
+msgid ""
+"\n"
+"Do you wish to continue with the Autochanger test? (y/n): "
+msgstr ""
+
+#: src/stored/btape.c:1120
+msgid ""
+"\n"
+"\n"
+"=== Autochanger test ===\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1129
+msgid "3301 Issuing autochanger \"loaded\" command.\n"
+msgstr ""
+
+#: src/stored/btape.c:1138
+#, c-format
+msgid "3991 Bad autochanger command: %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1139
+#, c-format
+msgid "3991 result=\"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1143
+#, c-format
+msgid "Slot %d loaded. I am going to unload it.\n"
+msgstr ""
+
+#: src/stored/btape.c:1145
+msgid "Nothing loaded in the drive. OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:1153
+#, c-format
+msgid "3302 Issuing autochanger \"unload %d %d\" command.\n"
+msgstr ""
+
+#: src/stored/btape.c:1158
+#, c-format
+msgid "unload status=%s %d\n"
+msgstr ""
+
+#: src/stored/btape.c:1158
+msgid "Bad"
+msgstr ""
+
+#: src/stored/btape.c:1161
+#, c-format
+msgid "3992 Bad autochanger command: %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1162
+#, c-format
+msgid "3992 result=\"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1172
+#, c-format
+msgid "3303 Issuing autochanger \"load %d %d\" command.\n"
+msgstr ""
+
+#: src/stored/btape.c:1180
+#, c-format
+msgid "3303 Autochanger \"load %d %d\" status is OK.\n"
+msgstr ""
+
+#: src/stored/btape.c:1184
+#, c-format
+msgid "3993 Bad autochanger command: %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1185
+#, c-format
+msgid "3993 result=\"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1200
+msgid ""
+"\n"
+"The test failed, probably because you need to put\n"
+"a longer sleep time in the mtx-script in the load) case.\n"
+"Adding a 30 second sleep and trying again ...\n"
+msgstr ""
+
+#: src/stored/btape.c:1213
+#, c-format
+msgid "Wrote EOF to %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1217
+#, c-format
+msgid ""
+"\n"
+"The test worked this time. Please add:\n"
+"\n"
+"   sleep %d\n"
+"\n"
+"to your mtx-changer script in the load) case.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1222
+msgid ""
+"\n"
+"The test autochanger worked!!\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1233
+msgid "You must correct this error or the Autochanger will not work.\n"
+msgstr ""
+
+#: src/stored/btape.c:1251
+msgid ""
+"\n"
+"\n"
+"=== Forward space files test ===\n"
+"\n"
+"This test is essential to Bacula.\n"
+"\n"
+"I'm going to write five files then test forward spacing\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1276
+msgid "Now forward spacing 1 file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1278 src/stored/btape.c:1290 src/stored/btape.c:1303
+#: src/stored/btape.c:1321 src/stored/btape.c:1490
+#, c-format
+msgid "Bad status from fsr. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1281
+#, c-format
+msgid "We should be in file 1. I am at file %d. %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1288
+msgid "Now forward spacing 2 files.\n"
+msgstr ""
+
+#: src/stored/btape.c:1301
+msgid "Now forward spacing 4 files.\n"
+msgstr ""
+
+#: src/stored/btape.c:1313
+msgid ""
+"The test worked this time. Please add:\n"
+"\n"
+"   Fast Forward Space File = no\n"
+"\n"
+"to your Device resource for this drive.\n"
+msgstr ""
+
+#: src/stored/btape.c:1319
+msgid "Now forward spacing 1 more file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1323
+#, c-format
+msgid "We should be in file 5. I am at file %d. %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1328
+msgid ""
+"\n"
+"=== End Forward space files test ===\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1332
+msgid ""
+"\n"
+"The forward space file test failed.\n"
+msgstr ""
+
+#: src/stored/btape.c:1334
+msgid ""
+"You have Fast Forward Space File enabled.\n"
+"I am turning it off then retrying the test.\n"
+msgstr ""
+
+#: src/stored/btape.c:1340
+msgid ""
+"You must correct this error or Bacula will not work.\n"
+"Some systems, e.g. OpenBSD, require you to set\n"
+"   Use MTIOCGET= no\n"
+"in your device resource. Use with caution.\n"
+msgstr ""
+
+#: src/stored/btape.c:1372
+msgid ""
+"\n"
+"Append test failed. Attempting again.\n"
+"Setting \"Hardware End of Medium = no\n"
+"    and \"Fast Forward Space File = no\n"
+"and retrying append test.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1380
+msgid ""
+"\n"
+"\n"
+"It looks like the test worked this time, please add:\n"
+"\n"
+"    Hardware End of Medium = No\n"
+"\n"
+"    Fast Forward Space File = No\n"
+"to your Device resource in the Storage conf file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1387
+msgid ""
+"\n"
+"\n"
+"That appears *NOT* to have corrected the problem.\n"
+msgstr ""
+
+#: src/stored/btape.c:1392
+msgid ""
+"\n"
+"\n"
+"It looks like the append failed. Attempting again.\n"
+"Setting \"BSF at EOM = yes\" and retrying append test.\n"
+msgstr ""
+
+#: src/stored/btape.c:1397
+msgid ""
+"\n"
+"\n"
+"It looks like the test worked this time, please add:\n"
+"\n"
+"    Hardware End of Medium = No\n"
+"    Fast Forward Space File = No\n"
+"    BSF at EOM = yes\n"
+"\n"
+"to your Device resource in the Storage conf file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1408
+msgid ""
+"\n"
+"Append test failed.\n"
+"\n"
+"\n"
+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
+"Unable to correct the problem. You MUST fix this\n"
+"problem before Bacula can use your tape drive correctly\n"
+"\n"
+"Perhaps running Bacula in fixed block mode will work.\n"
+"Do so by setting:\n"
+"\n"
+"Minimum Block Size = nnn\n"
+"Maximum Block Size = nnn\n"
+"\n"
+"in your Storage daemon's Device definition.\n"
+"nnn must match your tape driver's block size, which\n"
+"can be determined by reading your tape manufacturers\n"
+"information, and the information on your kernel dirver.\n"
+"Fixed block sizes, however, are not normally an ideal solution.\n"
+"\n"
+"Some systems, e.g. OpenBSD, require you to set\n"
+"   Use MTIOCGET= no\n"
+"in your device resource. Use with caution.\n"
+msgstr ""
+
+#: src/stored/btape.c:1429
+msgid ""
+"\n"
+"The above Bacula scan should have output identical to what follows.\n"
+"Please double check it ...\n"
+"=== Sample correct output ===\n"
+"1 block of 64448 bytes in file 1\n"
+"End of File mark.\n"
+"2 blocks of 64448 bytes in file 2\n"
+"End of File mark.\n"
+"3 blocks of 64448 bytes in file 3\n"
+"End of File mark.\n"
+"1 block of 64448 bytes in file 4\n"
+"End of File mark.\n"
+"Total files=4, blocks=7, bytes = 451,136\n"
+"=== End sample correct output ===\n"
+"\n"
+"If the above scan output is not identical to the\n"
+"sample output, you MUST correct the problem\n"
+"or Bacula will not be able to write multiple Jobs to \n"
+"the tape.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1468
+#, c-format
+msgid "Bad status from fsf. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1472
+msgid "Forward spaced 1 file.\n"
+msgstr ""
+
+#: src/stored/btape.c:1475
+#, c-format
+msgid "Forward spaced %d files.\n"
+msgstr ""
+
+#: src/stored/btape.c:1494
+msgid "Forward spaced 1 record.\n"
+msgstr ""
+
+#: src/stored/btape.c:1497
+#, c-format
+msgid "Forward spaced %d records.\n"
+msgstr ""
+
+#: src/stored/btape.c:1531
+#, c-format
+msgid "Wrote one record of %d bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:1533
+msgid "Wrote block to device.\n"
+msgstr ""
+
+#: src/stored/btape.c:1548
+msgid "Enter length to read: "
+msgstr ""
+
+#: src/stored/btape.c:1553
+msgid "Bad length entered, using default of 1024 bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:1562
+#, c-format
+msgid "Read of %d bytes gives stat=%d. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1585 src/stored/btape.c:1634
+#, c-format
+msgid "End of tape\n"
+msgstr ""
+
+#: src/stored/btape.c:1590
+#, c-format
+msgid "Starting scan at file %u\n"
+msgstr ""
+
+#: src/stored/btape.c:1595 src/stored/dev.c:1229
+#, c-format
+msgid "read error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/btape.c:1597
+#, c-format
+msgid "Bad status from read %d. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1600 src/stored/btape.c:1614 src/stored/btape.c:1678
+#: src/stored/btape.c:1690 src/stored/btape.c:1703 src/stored/btape.c:1719
+#, c-format
+msgid "1 block of %d bytes in file %d\n"
+msgstr ""
+
+#: src/stored/btape.c:1603 src/stored/btape.c:1617 src/stored/btape.c:1681
+#: src/stored/btape.c:1693 src/stored/btape.c:1706 src/stored/btape.c:1722
+#, c-format
+msgid "%d blocks of %d bytes in file %d\n"
+msgstr ""
+
+#: src/stored/btape.c:1625 src/stored/btape.c:1697
+#, c-format
+msgid "End of File mark.\n"
+msgstr ""
+
+#: src/stored/btape.c:1646 src/stored/btape.c:1750
+#, c-format
+msgid "Total files=%d, blocks=%d, bytes = %s\n"
+msgstr ""
+
+#: src/stored/btape.c:1710
+#, c-format
+msgid "Short block read.\n"
+msgstr ""
+
+#: src/stored/btape.c:1713
+#, c-format
+msgid "Error reading block. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1737
+#, c-format
+msgid ""
+"Blk_block: %u dev_blk=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
+"s rlen=%d\n"
+msgstr ""
+
+#: src/stored/btape.c:1759
+#, c-format
+msgid "Device status: %u. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:1789
+msgid ""
+"\n"
+"This command simulates Bacula writing to a tape.\n"
+"It requires either one or two blank tapes, which it\n"
+"will label and write.\n"
+"\n"
+"If you have an autochanger configured, it will use\n"
+"the tapes that are in slots 1 and 2, otherwise, you will\n"
+"be prompted to insert the tapes when necessary.\n"
+"\n"
+"It will print a status approximately\n"
+"every 322 MB, and write an EOF every 3.2 GB.  If you have\n"
+"selected the simple test option, after writing the first tape\n"
+"it will rewind it and re-read the last block written.\n"
+"\n"
+"If you have selected the multiple tape test, when the first tape\n"
+"fills, it will ask for a second, and after writing a few more \n"
+"blocks, it will stop.  Then it will begin re-reading the\n"
+"two tapes.\n"
+"\n"
+"This may take a long time -- hours! ...\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:1806
+msgid ""
+"Do you want to run the simplified test (s) with one tape\n"
+"or the complete multiple tape (m) test: (s/m) "
+msgstr ""
+
+#: src/stored/btape.c:1809
+msgid "Simple test (single tape) selected.\n"
+msgstr ""
+
+#: src/stored/btape.c:1812
+msgid "Multiple tape test selected.\n"
+msgstr ""
+
+#: src/stored/btape.c:1828
+msgid "Rewind failed.\n"
+msgstr ""
+
+#: src/stored/btape.c:1831
+msgid "Write EOF failed.\n"
+msgstr ""
+
+#: src/stored/btape.c:1858
+msgid "Wrote Start of Session label.\n"
+msgstr ""
+
+#: src/stored/btape.c:1889
+#, c-format
+msgid "%s Begin writing Bacula records to tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:1891
+#, c-format
+msgid "%s Begin writing Bacula records to first tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:1932
+#, c-format
+msgid "Wrote blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n"
+msgstr ""
+
+#: src/stored/btape.c:1942
+#, c-format
+msgid "%s Flush block, write EOF\n"
+msgstr ""
+
+#: src/stored/btape.c:1953
+msgid "Not OK\n"
+msgstr ""
+
+#: src/stored/btape.c:1981
+msgid "Set ok=false after write_block_to_device.\n"
+msgstr ""
+
+#: src/stored/btape.c:1984
+msgid "Wrote End of Session label.\n"
+msgstr ""
+
+#: src/stored/btape.c:2008
+#, c-format
+msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n"
+msgstr ""
+
+#: src/stored/btape.c:2012
+#, c-format
+msgid "Could not create state file: %s ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:2020
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:2024
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:2063
+msgid ""
+"\n"
+"The state file level has changed. You must redo\n"
+"the fill command.\n"
+msgstr ""
+
+#: src/stored/btape.c:2069
+#, c-format
+msgid ""
+"\n"
+"Could not find the state file: %s ERR=%s\n"
+"You must redo the fill command.\n"
+msgstr ""
+
+#: src/stored/btape.c:2111
+msgid "Mount first tape. Press enter when ready: "
+msgstr ""
+
+#: src/stored/btape.c:2131
+msgid "Rewinding.\n"
+msgstr ""
+
+#: src/stored/btape.c:2136
+#, c-format
+msgid "Reading the first 10000 records from %u:%u.\n"
+msgstr ""
+
+#: src/stored/btape.c:2140 src/stored/btape.c:2207
+#, c-format
+msgid "Reposition from %u:%u to %u:%u\n"
+msgstr ""
+
+#: src/stored/btape.c:2143 src/stored/btape.c:2194 src/stored/btape.c:2210
+#, c-format
+msgid "Reposition error. ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:2146
+#, c-format
+msgid "Reading block %u.\n"
+msgstr ""
+
+#: src/stored/btape.c:2148 src/stored/btape.c:2199 src/stored/btape.c:2215
+#, c-format
+msgid "Error reading block: ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:2153
+msgid ""
+"\n"
+"The last block on the tape matches. Test succeeded.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2155
+msgid ""
+"\n"
+"The last block of the first tape matches.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2180
+msgid "Mount second tape. Press enter when ready: "
+msgstr ""
+
+#: src/stored/btape.c:2192
+#, c-format
+msgid "Reposition from %u:%u to 0:1\n"
+msgstr ""
+
+#: src/stored/btape.c:2197 src/stored/btape.c:2213
+#, c-format
+msgid "Reading block %d.\n"
+msgstr ""
+
+#: src/stored/btape.c:2203
+msgid ""
+"\n"
+"The first block on the second tape matches.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2219
+msgid ""
+"\n"
+"The last block on the second tape matches. Test succeeded.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2234
+#, c-format
+msgid "10000 records read now at %d:%d\n"
+msgstr ""
+
+#: src/stored/btape.c:2257 src/stored/btape.c:2268 src/stored/btape.c:2316
+msgid "Last block written"
+msgstr ""
+
+#: src/stored/btape.c:2259 src/stored/btape.c:2269
+msgid "Block read back"
+msgstr ""
+
+#: src/stored/btape.c:2260
+#, c-format
+msgid ""
+"\n"
+"\n"
+"The blocks differ at byte %u\n"
+msgstr ""
+
+#: src/stored/btape.c:2261
+msgid ""
+"\n"
+"\n"
+"!!!! The last block written and the block\n"
+"that was read back differ. The test FAILED !!!!\n"
+"This must be corrected before you use Bacula\n"
+"to write multi-tape Volumes.!!!!\n"
+msgstr ""
+
+#: src/stored/btape.c:2300
+#, c-format
+msgid "Last block at: %u:%u this_dev_block_num=%d\n"
+msgstr ""
+
+#: src/stored/btape.c:2314
+#, c-format
+msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n"
+msgstr ""
+
+#: src/stored/btape.c:2318
+msgid "Block not written"
+msgstr ""
+
+#: src/stored/btape.c:2333
+#, c-format
+msgid "End of tape %d:%d. VolumeCapacity=%s. Write rate = %.1f KB/s\n"
+msgstr ""
+
+#: src/stored/btape.c:2383
+msgid "Test writing blocks of 64512 bytes to tape.\n"
+msgstr ""
+
+#: src/stored/btape.c:2385
+msgid "How many blocks do you want to write? (1000): "
+msgstr ""
+
+#: src/stored/btape.c:2400
+#, c-format
+msgid "Begin writing %d Bacula blocks to tape ...\n"
+msgstr ""
+
+#: src/stored/btape.c:2452
+#, c-format
+msgid "Begin writing raw blocks of %u bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:2472
+#, c-format
+msgid "Write failed at block %u. stat=%d ERR=%s\n"
+msgstr ""
+
+#: src/stored/btape.c:2502
+#, c-format
+msgid "Begin writing Bacula blocks of %u bytes.\n"
+msgstr ""
+
+#: src/stored/btape.c:2521
+#, c-format
+msgid "Write failed at block %u.\n"
+msgstr ""
+
+#: src/stored/btape.c:2528
+msgid "test autochanger"
+msgstr ""
+
+#: src/stored/btape.c:2529
+msgid "backspace file"
+msgstr ""
+
+#: src/stored/btape.c:2530
+msgid "backspace record"
+msgstr ""
+
+#: src/stored/btape.c:2531
+msgid "fill tape using Bacula writes"
+msgstr ""
+
+#: src/stored/btape.c:2532
+msgid "list device capabilities"
+msgstr ""
+
+#: src/stored/btape.c:2533
+msgid "clear tape errors"
+msgstr ""
+
+#: src/stored/btape.c:2534
+msgid "go to end of Bacula data for append"
+msgstr ""
+
+#: src/stored/btape.c:2535
+msgid "go to the physical end of medium"
+msgstr ""
+
+#: src/stored/btape.c:2536
+msgid "fill tape, write onto second volume"
+msgstr ""
+
+#: src/stored/btape.c:2537
+msgid "read filled tape"
+msgstr ""
+
+#: src/stored/btape.c:2538
+msgid "forward space a file"
+msgstr ""
+
+#: src/stored/btape.c:2539
+msgid "forward space a record"
+msgstr ""
+
+#: src/stored/btape.c:2541
+msgid "write a Bacula label to the tape"
+msgstr ""
+
+#: src/stored/btape.c:2542
+msgid "load a tape"
+msgstr ""
+
+#: src/stored/btape.c:2543
+msgid "quit btape"
+msgstr ""
+
+#: src/stored/btape.c:2544
+msgid "use write() to fill tape"
+msgstr ""
+
+#: src/stored/btape.c:2545
+msgid "read and print the Bacula tape label"
+msgstr ""
+
+#: src/stored/btape.c:2546
+msgid "test record handling functions"
+msgstr ""
+
+#: src/stored/btape.c:2547
+msgid "rewind the tape"
+msgstr ""
+
+#: src/stored/btape.c:2548
+msgid "read() tape block by block to EOT and report"
+msgstr ""
+
+#: src/stored/btape.c:2549
+msgid "Bacula read block by block to EOT and report"
+msgstr ""
+
+#: src/stored/btape.c:2550
+msgid "print tape status"
+msgstr ""
+
+#: src/stored/btape.c:2551
+msgid "General test Bacula tape functions"
+msgstr ""
+
+#: src/stored/btape.c:2552
+msgid "write an EOF on the tape"
+msgstr ""
+
+#: src/stored/btape.c:2553
+msgid "write a single Bacula block"
+msgstr ""
+
+#: src/stored/btape.c:2554
+msgid "read a single record"
+msgstr ""
+
+#: src/stored/btape.c:2555
+msgid "quick fill command"
+msgstr ""
+
+#: src/stored/btape.c:2576
+#, c-format
+msgid "%s is an illegal command\n"
+msgstr ""
+
+#: src/stored/btape.c:2586
+#, c-format
+msgid "Interactive commands:\n"
+msgstr ""
+
+#: src/stored/btape.c:2596
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: btape <options> <device_name>\n"
+"       -b <file>   specify bootstrap file\n"
+"       -c <file>   set configuration file to file\n"
+"       -d <nn>     set debug level to nn\n"
+"       -p          proceed inspite of I/O errors\n"
+"       -s          turn off signals\n"
+"       -v          be verbose\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/stored/btape.c:2687
+#, c-format
+msgid "Mount second Volume on device %s and press return when ready: "
+msgstr ""
+
+#: src/stored/btape.c:2714
+#, c-format
+msgid "Mount blank Volume on device %s and press return when ready: "
+msgstr ""
+
+#: src/stored/btape.c:2732
+#, c-format
+msgid "End of Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/btape.c:2744
+#, c-format
+msgid "Read block=%u, VolBytes=%s rate=%.1f KB/s\n"
+msgstr ""
+
+#: src/stored/btape.c:2759 src/stored/mount.c:500
+#, c-format
+msgid "Cannot open Dev=%s, Vol=%s\n"
+msgstr ""
+
+#: src/stored/butil.c:46
+msgid "Nohdr,"
+msgstr ""
+
+#: src/stored/butil.c:49
+msgid "partial,"
+msgstr ""
+
+#: src/stored/butil.c:52
+msgid "empty,"
+msgstr ""
+
+#: src/stored/butil.c:55
+msgid "Nomatch,"
+msgstr ""
+
+#: src/stored/butil.c:58
+msgid "cont,"
+msgstr ""
+
+#: src/stored/butil.c:130
+msgid "Volume name or names is too long. Please use a .bsr file.\n"
+msgstr ""
+
+#: src/stored/butil.c:150
+#, c-format
+msgid "Cannot find device \"%s\" in config file %s.\n"
+msgstr ""
+
+#: src/stored/butil.c:157
+#, c-format
+msgid "Cannot init device %s\n"
+msgstr ""
+
+#: src/stored/butil.c:178
+#, c-format
+msgid "Cannot open %s\n"
+msgstr ""
+
+#: src/stored/butil.c:261
+#, c-format
+msgid "Could not find device \"%s\" in config file %s.\n"
+msgstr ""
+
+#: src/stored/butil.c:266
+#, c-format
+msgid "Using device: \"%s\" for reading.\n"
+msgstr ""
+
+#: src/stored/butil.c:269
+#, c-format
+msgid "Using device: \"%s\" for writing.\n"
+msgstr ""
+
+#: src/stored/butil.c:285
+msgid "Unexpected End of Data\n"
+msgstr ""
+
+#: src/stored/butil.c:287
+msgid "Unexpected End of Tape\n"
+msgstr ""
+
+#: src/stored/butil.c:289
+msgid "Unexpected End of File\n"
+msgstr ""
+
+#: src/stored/butil.c:291
+msgid "Tape Door is Open\n"
+msgstr ""
+
+#: src/stored/butil.c:293
+msgid "Unexpected Tape is Off-line\n"
+msgstr ""
+
+#: src/stored/dev.c:112
+#, c-format
+msgid "Unable to stat device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:123
+#, c-format
+msgid ""
+"%s is an unknown device type. Must be tape or directory\n"
+" or have RequiresMount=yes for DVD. st_mode=%x\n"
+msgstr ""
+
+#: src/stored/dev.c:179
+#, c-format
+msgid "Unable to stat mount point %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:186
+msgid ""
+"Mount and unmount commands must defined for a device which requires mount.\n"
+msgstr ""
+
+#: src/stored/dev.c:189
+msgid "Write part command must be defined for a device which requires mount.\n"
+msgstr ""
+
+#: src/stored/dev.c:194
+#, c-format
+msgid "Block size %u on device %s is too large, using default %u\n"
+msgstr ""
+
+#: src/stored/dev.c:199
+#, c-format
+msgid "Max block size %u not multiple of device %s block size.\n"
+msgstr ""
+
+#: src/stored/dev.c:215 src/stored/dev.c:221
+#, c-format
+msgid "Unable to init cond variable: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:312
+msgid "Illegal mode given to open dev.\n"
+msgstr ""
+
+#: src/stored/dev.c:355 src/stored/device.c:295
+#, c-format
+msgid "Unable to open device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:423 src/stored/dev.c:481
+#, c-format
+msgid "Could not open file device %s. No Volume name given.\n"
+msgstr ""
+
+#: src/stored/dev.c:449 src/stored/dev.c:562
+#, c-format
+msgid "Could not open: %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:506
+#, c-format
+msgid ""
+"The media in the device %s is not empty, please blank it before writing "
+"anything to it.\n"
+msgstr ""
+
+#: src/stored/dev.c:523
+#, c-format
+msgid "There is no valid media in the device %s.\n"
+msgstr ""
+
+#: src/stored/dev.c:530
+#, c-format
+msgid "Could not mount device %s.\n"
+msgstr ""
+
+#: src/stored/dev.c:588
+#, c-format
+msgid "Could not fstat: %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:631
+#, c-format
+msgid "Bad call to rewind. Device %s not open\n"
+msgstr ""
+
+#: src/stored/dev.c:677
+#, c-format
+msgid "Rewind error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:687 src/stored/dev.c:802 src/stored/dev.c:938
+#: src/stored/dev.c:1457
+#, c-format
+msgid "lseek_dev error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:727
+msgid "unknown blocked code"
+msgstr ""
+
+#: src/stored/dev.c:772
+#, c-format
+msgid "Bad call to eod_dev. Device %s not open\n"
+msgstr ""
+
+#: src/stored/dev.c:838
+#, c-format
+msgid "ioctl MTEOM error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:846 src/stored/dev.c:978
+#, c-format
+msgid "ioctl MTIOCGET error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:924
+msgid "Bad device call. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:937
+#, c-format
+msgid "Seek error: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:973
+msgid " Bacula status:"
+msgstr ""
+
+#: src/stored/dev.c:974 src/stored/dev.c:1023 src/stored/dev.c:1025
+#, c-format
+msgid " file=%d block=%d\n"
+msgstr ""
+
+#: src/stored/dev.c:982
+msgid " Device status:"
+msgstr ""
+
+#: src/stored/dev.c:1047
+msgid "Bad call to load_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1058 src/stored/dev.c:1071
+#, c-format
+msgid "ioctl MTLOAD error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1107
+#, c-format
+msgid "ioctl MTOFFL error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1148
+msgid "Bad call to fsf_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1158 src/stored/dev.c:1279
+#, c-format
+msgid "Device %s at End of Tape.\n"
+msgstr ""
+
+#: src/stored/dev.c:1183 src/stored/dev.c:1259
+#, c-format
+msgid "ioctl MTFSF error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1308
+msgid "Bad call to bsf_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1314
+#, c-format
+msgid "Device %s cannot BSF because it is not a tape.\n"
+msgstr ""
+
+#: src/stored/dev.c:1329
+#, c-format
+msgid "ioctl MTBSF error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1349
+msgid "Bad call to fsr. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1358
+#, c-format
+msgid "ioctl MTFSR not permitted on %s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1386
+#, c-format
+msgid "ioctl MTFSR %d error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1406
+msgid "Bad call to bsr_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1416
+#, c-format
+msgid "ioctl MTBSR not permitted on %s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1429
+#, c-format
+msgid "ioctl MTBSR error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1446
+msgid "Bad call to reposition_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1514
+msgid "Bad call to weof_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/dev.c:1524
+msgid "Attempt to WEOF on non-appendable Volume\n"
+msgstr ""
+
+#: src/stored/dev.c:1541
+#, c-format
+msgid "ioctl MTWEOF error on %s. ERR=%s.\n"
+msgstr ""
+
+#: src/stored/dev.c:1583
+msgid "Got ENOTTY on read/write!\n"
+msgstr ""
+
+#: src/stored/dev.c:1630
+#, c-format
+msgid "unknown func code %d"
+msgstr ""
+
+#: src/stored/dev.c:1636
+#, c-format
+msgid "I/O function \"%s\" not supported on this device.\n"
+msgstr ""
+
+#: src/stored/dev.c:1761 src/stored/dvd.c:734
+#, c-format
+msgid "Unable to truncate device %s. ERR=%s\n"
+msgstr ""
+
+#: src/stored/dev.c:1800
+msgid "Bad call to term_dev. Device not open\n"
+msgstr ""
+
+#: src/stored/device.c:100
+#, c-format
+msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n"
+msgstr ""
+
+#: src/stored/device.c:114
+#, c-format
+msgid "New volume \"%s\" mounted on device %s at %s.\n"
+msgstr ""
+
+#: src/stored/device.c:126
+#, c-format
+msgid "write_block_to_device Volume label failed. ERR=%s"
+msgstr ""
+
+#: src/stored/device.c:162
+#, c-format
+msgid "write_block_to_device overflow block failed. ERR=%s"
+msgstr ""
+
+#: src/stored/device.c:297
+#, c-format
+msgid "Unable to open archive %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/device.c:332
+#, c-format
+msgid "Device write lock failure. ERR=%s\n"
+msgstr ""
+
+#: src/stored/device.c:340
+#, c-format
+msgid "Device write unlock failure. ERR=%s\n"
+msgstr ""
+
+#: src/stored/device.c:359
+#, c-format
+msgid "pthread_cond_wait failure. ERR=%s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:140
+msgid "Connection request failed.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:149
+#, c-format
+msgid "Invalid connection. Len=%d\n"
+msgstr ""
+
+#: src/stored/dircmd.c:241
+#, c-format
+msgid "3991 Bad setdebug command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:262
+#, c-format
+msgid "3904 Job %s not found.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:283
+#, c-format
+msgid "3000 Job %s marked to be canceled.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:287
+msgid "3903 Error scanning cancel command.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:364 src/stored/dircmd.c:680 src/stored/dircmd.c:756
+#: src/stored/dircmd.c:819 src/stored/dircmd.c:874 src/stored/dircmd.c:918
+#, c-format
+msgid "3999 Device \"%s\" not found or could not be opened.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:369
+#, c-format
+msgid "3903 Error scanning label command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:412
+#, c-format
+msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n"
+msgstr ""
+
+#: src/stored/dircmd.c:419
+msgid "3921 Wrong volume mounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:423
+msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:431 src/stored/dircmd.c:440
+#, c-format
+msgid "3912 Failed to label Volume: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:443
+#, c-format
+msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n"
+msgstr ""
+
+#: src/stored/dircmd.c:476
+#, c-format
+msgid "3001 Mounted Volume: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:480 src/stored/dircmd.c:954
+#, c-format
+msgid ""
+"3902 Cannot mount Volume on Storage Device %s because:\n"
+"%s"
+msgstr ""
+
+#: src/stored/dircmd.c:508 src/stored/reserve.c:634
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" requested by DIR could not be opened or does not exist.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:529 src/stored/reserve.c:630
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" in changer \"%s\" requested by DIR could not be opened or "
+"does not exist.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:593 src/stored/dircmd.c:646
+#, c-format
+msgid "3901 open device failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:613 src/stored/dircmd.c:637
+#, c-format
+msgid "3001 Device %s is mounted with Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/dircmd.c:616 src/stored/dircmd.c:640 src/stored/dircmd.c:655
+#, c-format
+msgid ""
+"3905 Device %s open but no Bacula volume is mounted.\n"
+"If this is not a blank tape, try unmounting and remounting the Volume.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:625
+#, c-format
+msgid "3001 Device %s is doing acquire.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:630 src/stored/dircmd.c:730
+#, c-format
+msgid "3903 Device %s is being labeled.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:652
+#, c-format
+msgid "3001 Device %s is already mounted with Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/dircmd.c:661
+#, c-format
+msgid "3002 Device %s is mounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:664
+#, c-format
+msgid "3907 %s"
+msgstr ""
+
+#: src/stored/dircmd.c:667
+#, c-format
+msgid "3906 File device %s is always mounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:673
+#, c-format
+msgid "3905 Bizarre wait state %d\n"
+msgstr ""
+
+#: src/stored/dircmd.c:684
+#, c-format
+msgid "3909 Error scanning mount command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:711
+#, c-format
+msgid "3901 Device %s is already unmounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:722
+#, c-format
+msgid "3001 Device %s unmounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:726
+#, c-format
+msgid "3902 Device %s is busy in acquire.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:749
+#, c-format
+msgid "3002 Device %s unmounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:761
+#, c-format
+msgid "3907 Error scanning unmount command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:789
+#, c-format
+msgid "3921 Device %s already released.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:796
+#, c-format
+msgid "3922 Device %s waiting for mount.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:800
+#, c-format
+msgid "3923 Device %s is busy in acquire.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:804
+#, c-format
+msgid "3914 Device %s is being labeled.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:812
+#, c-format
+msgid "3022 Device %s released.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:824
+#, c-format
+msgid "3927 Error scanning release command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:860
+#, c-format
+msgid "3995 Device %s is not an autochanger.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:878
+#, c-format
+msgid "3908 Error scanning autocharger drives/list/slots command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:922
+#, c-format
+msgid "3909 Error scanning readlabel command: %s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:950
+#, c-format
+msgid "3001 Volume=%s Slot=%d\n"
+msgstr ""
+
+#: src/stored/dircmd.c:979
+#, c-format
+msgid "3910 Unable to open device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/dircmd.c:991
+#, c-format
+msgid "3931 Device %s is BLOCKED. user unmounted.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:995
+#, c-format
+msgid ""
+"3932 Device %s is BLOCKED. user unmounted during wait for media/mount.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:999
+#, c-format
+msgid "3933 Device %s is BLOCKED waiting for media.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1003
+#, c-format
+msgid "3934 Device %s is being initialized.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1007
+#, c-format
+msgid "3935 Device %s is blocked labeling a Volume.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1011
+#, c-format
+msgid "3935 Device %s is blocked for unknown reason.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1016
+#, c-format
+msgid "3936 Device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1019
+#, c-format
+msgid "3937 Device %s is busy with %d writer(s).\n"
+msgstr ""
+
+#: src/stored/dvd.c:153
+#, c-format
+msgid "Device %s cannot be mounted. ERR=%s\n"
+msgstr ""
+
+#: src/stored/dvd.c:271
+#, c-format
+msgid "Cannot run free space command (%s)\n"
+msgstr ""
+
+#: src/stored/dvd.c:374
+#, c-format
+msgid "Error while writing current part to the DVD: %s"
+msgstr ""
+
+#: src/stored/dvd.c:394
+#, c-format
+msgid "Remaining free space %s on %s\n"
+msgstr ""
+
+#: src/stored/dvd.c:464
+#, c-format
+msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
+msgstr ""
+
+#: src/stored/dvd.c:481
+#, c-format
+msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/dvd.c:700
+#, c-format
+msgid "Unable to write part %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/fd_cmds.c:340
+msgid "Error parsing bootstrap file.\n"
+msgstr ""
+
+#: src/stored/job.c:79
+#, c-format
+msgid "Bad Job Command from Director: %s\n"
+msgstr ""
+
+#: src/stored/job.c:189
+#, c-format
+msgid "Job name not found: %s\n"
+msgstr ""
+
+#: src/stored/job.c:200
+#, c-format
+msgid "Hey!!!! JobId %u Job %s already authenticated.\n"
+msgstr ""
+
+#: src/stored/job.c:211
+msgid "Unable to authenticate File daemon\n"
+msgstr ""
+
+#: src/stored/job.c:338
+msgid "In free_jcr(), but still attached to device!!!!\n"
+msgstr ""
+
+#: src/stored/label.c:74
+msgid "BAD call to read_dev_volume_label\n"
+msgstr ""
+
+#: src/stored/label.c:79 src/stored/label.c:120 src/stored/label.c:208
+#, c-format
+msgid "Wrong Volume mounted on device %s: Wanted %s have %s\n"
+msgstr ""
+
+#: src/stored/label.c:86 src/stored/label.c:123 src/stored/label.c:195
+#, c-format
+msgid "Too many tries: %s"
+msgstr ""
+
+#: src/stored/label.c:102
+#, c-format
+msgid "Couldn't rewind device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:140
+#, c-format
+msgid ""
+"Requested Volume \"%s\" on %s is not a Bacula labeled Volume, because: ERR=%s"
+msgstr ""
+
+#: src/stored/label.c:145
+msgid "Could not read Volume label from block.\n"
+msgstr ""
+
+#: src/stored/label.c:148
+#, c-format
+msgid "Could not unserialize Volume label: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:153
+#, c-format
+msgid "Volume Header Id bad: %s\n"
+msgstr ""
+
+#: src/stored/label.c:180
+#, c-format
+msgid "Volume on %s has wrong Bacula version. Wanted %d got %d\n"
+msgstr ""
+
+#: src/stored/label.c:191
+#, c-format
+msgid "Volume on %s has bad Bacula label type: %x\n"
+msgstr ""
+
+#: src/stored/label.c:272
+#, c-format
+msgid "Cannot write Volume label to block for device %s\n"
+msgstr ""
+
+#: src/stored/label.c:400
+#, c-format
+msgid "Rewind error on device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:405
+#, c-format
+msgid "Truncate error on device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:427
+#, c-format
+msgid "Unable to write device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:455
+#, c-format
+msgid "Recycled volume \"%s\" on device %s, all previous data lost.\n"
+msgstr ""
+
+#: src/stored/label.c:458
+#, c-format
+msgid "Wrote label to prelabeled Volume \"%s\" on device %s\n"
+msgstr ""
+
+#: src/stored/label.c:657
+#, c-format
+msgid "Bad session label = %d\n"
+msgstr ""
+
+#: src/stored/label.c:675 src/stored/label.c:682
+#, c-format
+msgid "Error writing Session label to %s: %s\n"
+msgstr ""
+
+#: src/stored/label.c:717
+#, c-format
+msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n"
+msgstr ""
+
+#: src/stored/label.c:844
+#, c-format
+msgid "Unknown %d"
+msgstr ""
+
+#: src/stored/label.c:848
+#, c-format
+msgid ""
+"\n"
+"Volume Label:\n"
+"Id                : %sVerNo             : %d\n"
+"VolName           : %s\n"
+"PrevVolName       : %s\n"
+"VolFile           : %d\n"
+"LabelType         : %s\n"
+"LabelSize         : %d\n"
+"PoolName          : %s\n"
+"MediaType         : %s\n"
+"PoolType          : %s\n"
+"HostName          : %s\n"
+msgstr ""
+
+#: src/stored/label.c:870
+#, c-format
+msgid "Date label written: %s\n"
+msgstr ""
+
+#: src/stored/label.c:876
+#, c-format
+msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n"
+msgstr ""
+
+#: src/stored/label.c:896
+#, c-format
+msgid ""
+"\n"
+"%s Record:\n"
+"JobId             : %d\n"
+"VerNum            : %d\n"
+"PoolName          : %s\n"
+"PoolType          : %s\n"
+"JobName           : %s\n"
+"ClientName        : %s\n"
+msgstr ""
+
+#: src/stored/label.c:909
+#, c-format
+msgid ""
+"Job (unique name) : %s\n"
+"FileSet           : %s\n"
+"JobType           : %c\n"
+"JobLevel          : %c\n"
+msgstr ""
+
+#: src/stored/label.c:918
+#, c-format
+msgid ""
+"JobFiles          : %s\n"
+"JobBytes          : %s\n"
+"StartBlock        : %s\n"
+"EndBlock          : %s\n"
+"StartFile         : %s\n"
+"EndFile           : %s\n"
+"JobErrors         : %s\n"
+"JobStatus         : %c\n"
+msgstr ""
+
+#: src/stored/label.c:939
+#, c-format
+msgid "Date written      : %s\n"
+msgstr ""
+
+#: src/stored/label.c:944
+#, c-format
+msgid "Date written      : %04d-%02d-%02d at %02d:%02d\n"
+msgstr ""
+
+#: src/stored/label.c:963
+msgid "Fresh Volume"
+msgstr ""
+
+#: src/stored/label.c:966
+msgid "Volume"
+msgstr ""
+
+#: src/stored/label.c:975 src/stored/read_record.c:336
+msgid "End of Media"
+msgstr ""
+
+#: src/stored/label.c:978
+msgid "End of Tape"
+msgstr ""
+
+#: src/stored/label.c:998 src/stored/label.c:1006 src/stored/label.c:1039
+#, c-format
+msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n"
+msgstr ""
+
+#: src/stored/label.c:1003
+msgid "End of physical tape.\n"
+msgstr ""
+
+#: src/stored/label.c:1018 src/stored/label.c:1027
+#, c-format
+msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n"
+msgstr ""
+
+#: src/stored/label.c:1020
+#, c-format
+msgid "   Job=%s Date=%s Level=%c Type=%c\n"
+msgstr ""
+
+#: src/stored/label.c:1029
+#, c-format
+msgid "   Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n"
+msgstr ""
+
+#: src/stored/mount.c:198 src/stored/mount.c:295
+#, c-format
+msgid "Volume \"%s\" not on device %s.\n"
+msgstr ""
+
+#: src/stored/mount.c:231
+#, c-format
+msgid ""
+"Director wanted Volume \"%s\".\n"
+"    Current Volume \"%s\" not acceptable because:\n"
+"    %s"
+msgstr ""
+
+#: src/stored/mount.c:285
+#, c-format
+msgid "Labeled new Volume \"%s\" on device %s.\n"
+msgstr ""
+
+#: src/stored/mount.c:290
+#, c-format
+msgid "Warning device %s not configured to autolabel Volumes.\n"
+msgstr ""
+
+#: src/stored/mount.c:342
+#, c-format
+msgid "Volume \"%s\" previously written, moving to end of data.\n"
+msgstr ""
+
+#: src/stored/mount.c:345
+#, c-format
+msgid "Unable to position to end of data on device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/mount.c:357
+#, c-format
+msgid "Ready to append to end of Volume \"%s\" at file=%d.\n"
+msgstr ""
+
+#: src/stored/mount.c:360
+#, c-format
+msgid ""
+"I cannot write on Volume \"%s\" because:\n"
+"The number of files mismatch! Volume=%u Catalog=%u\n"
+msgstr ""
+
+#: src/stored/mount.c:388
+#, c-format
+msgid "Ready to append to end of Volume \"%s\" at file address=%u.\n"
+msgstr ""
+
+#: src/stored/mount.c:392
+#, c-format
+msgid ""
+"I cannot write on Volume \"%s\" because:\n"
+"The EOD file address is wrong: Volume file address=%u != Catalog Endblock=%u"
+"(+1)\n"
+"You probably removed DVD last part in spool directory.\n"
+msgstr ""
+
+#: src/stored/mount.c:418
+#, c-format
+msgid "Marking Volume \"%s\" in Error in Catalog.\n"
+msgstr ""
+
+#: src/stored/mount.c:434
+#, c-format
+msgid ""
+"Autochanger Volume \"%s\" not found in slot %d.\n"
+"    Setting InChanger to zero in catalog.\n"
+msgstr ""
+
+#: src/stored/mount.c:453
+msgid "Hey!!!!! WroteVol non-zero !!!!!\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:104 src/stored/parse_bsr.c:108
+#, c-format
+msgid ""
+"Bootstrap file error: %s\n"
+"            : Line %d, col %d of file %s\n"
+"%s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:130
+#, c-format
+msgid "Cannot open bootstrap file %s: %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:260
+#, c-format
+msgid "MediaType %s in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:416
+msgid "JobType not yet implemented\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:424
+msgid "JobLevel not yet implemented\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:626
+#, c-format
+msgid "VolFile     : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:634
+#, c-format
+msgid "VolBlock    : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:644
+#, c-format
+msgid "FileIndex   : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:646
+#, c-format
+msgid "FileIndex   : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:656
+#, c-format
+msgid "JobId       : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:658
+#, c-format
+msgid "JobId       : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:668
+#, c-format
+msgid "SessId      : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:670
+#, c-format
+msgid "SessId      : %u-%u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:679
+#, c-format
+msgid "VolumeName  : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:688
+#, c-format
+msgid "Client      : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:696
+#, c-format
+msgid "Job          : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:704
+#, c-format
+msgid "SessTime    : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:718
+msgid "BSR is NULL\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:722
+#, c-format
+msgid "Next        : 0x%x\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:723
+#, c-format
+msgid "Root bsr    : 0x%x\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:734
+#, c-format
+msgid "Slot        : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:737
+#, c-format
+msgid "count       : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:738
+#, c-format
+msgid "found       : %u\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:741
+#, c-format
+msgid "done        : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:742
+#, c-format
+msgid "positioning : %d\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:743
+#, c-format
+msgid "fast_reject : %d\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:202
+msgid "Error in ParseTuple\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:218
+msgid "Parse tuple error in job_write\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:254
+#, c-format
+msgid "Error in Python method %s\n"
+msgstr ""
+
+#: src/stored/read.c:55
+msgid "No Volume names found for restore.\n"
+msgstr ""
+
+#: src/stored/read.c:109
+#, c-format
+msgid ">filed: Error Hdr=%s\n"
+msgstr ""
+
+#: src/stored/read.c:110 src/stored/read.c:125
+#, c-format
+msgid "Error sending to File daemon. ERR=%s\n"
+msgstr ""
+
+#: src/stored/read.c:124
+#, c-format
+msgid "Error sending to FD. ERR=%s\n"
+msgstr ""
+
+#: src/stored/read_record.c:68
+#, c-format
+msgid "End of Volume at file %u on device %s, Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/read_record.c:71
+msgid "End of all volumes.\n"
+msgstr ""
+
+#: src/stored/read_record.c:105
+#, c-format
+msgid "Got EOF at file %u  on device %s, Volume \"%s\"\n"
+msgstr ""
+
+#: src/stored/read_record.c:119
+msgid "Did fsr\n"
+msgstr ""
+
+#: src/stored/read_record.c:276
+#, c-format
+msgid "Reposition from (file:block) %u:%u to %u:%u\n"
+msgstr ""
+
+#: src/stored/read_record.c:303
+#, c-format
+msgid "Forward spacing to file:block %u:%u.\n"
+msgstr ""
+
+#: src/stored/read_record.c:329
+msgid "Begin Session"
+msgstr ""
+
+#: src/stored/read_record.c:333
+msgid "End Session"
+msgstr ""
+
+#: src/stored/read_record.c:339
+#, c-format
+msgid "Unknown code %d\n"
+msgstr ""
+
+#: src/stored/record.c:60
+#, c-format
+msgid "unknown: %d"
+msgstr ""
+
+#: src/stored/record.c:343
+msgid "Damaged buffer\n"
+msgstr ""
+
+#: src/stored/reserve.c:467 src/stored/reserve.c:479
+#, c-format
+msgid "Failed command: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:469
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
+"Device resources.\n"
+msgstr ""
+
+#: src/stored/reserve.c:647
+#, c-format
+msgid "3926 Could not get dcr for device: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:709
+#, c-format
+msgid "3601 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:718
+#, c-format
+msgid "3602 JobId=%u device %s is busy (already reading/writing).\n"
+msgstr ""
+
+#: src/stored/reserve.c:761
+#, c-format
+msgid "3603 JobId=%u device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/reserve.c:770
+#, c-format
+msgid "3604 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:836
+#, c-format
+msgid "3605 JobId=%u wants free drive but device %s is busy.\n"
+msgstr ""
+
+#: src/stored/reserve.c:844
+#, c-format
+msgid "3606 JobId=%u wants mounted, but drive %s has no Volume.\n"
+msgstr ""
+
+#: src/stored/reserve.c:854
+#, c-format
+msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:890
+#, c-format
+msgid "3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:933
+#, c-format
+msgid "3609 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:941 src/stored/reserve.c:945
+msgid "Logic error!!!! Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:942
+#, c-format
+msgid "3910 JobId=%u Logic error!!!! drive %s Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:948
+#, c-format
+msgid "3911 JobId=%u failed reserve drive %s.\n"
+msgstr ""
+
+#: src/stored/spool.c:69
+#, c-format
+msgid ""
+"Data spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes/job.\n"
+msgstr ""
+
+#: src/stored/spool.c:75
+#, c-format
+msgid "Attr spooling: %u active jobs, %s bytes; %u total jobs, %s max bytes.\n"
+msgstr ""
+
+#: src/stored/spool.c:91
+msgid "Spooling data ...\n"
+msgstr ""
+
+#: src/stored/spool.c:117
+#, c-format
+msgid "Bad return from despool WroteVol=%d\n"
+msgstr ""
+
+#: src/stored/spool.c:150
+#, c-format
+msgid "Open data spool file %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:199
+#, c-format
+msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n"
+msgstr ""
+
+#: src/stored/spool.c:204
+#, c-format
+msgid "Writing spooled data to Volume. Despooling %s bytes ...\n"
+msgstr ""
+
+#: src/stored/spool.c:258 src/stored/spool.c:432 src/stored/spool.c:470
+#, c-format
+msgid "Ftruncate spool file failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:260
+#, c-format
+msgid "Bad return from ftruncate. ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:309
+#, c-format
+msgid "Spool header read error. ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:312
+#, c-format
+msgid "Spool read error. Wanted %u bytes, got %d\n"
+msgstr ""
+
+#: src/stored/spool.c:313
+#, c-format
+msgid "Spool header read error. Wanted %u bytes, got %d\n"
+msgstr ""
+
+#: src/stored/spool.c:319 src/stored/spool.c:320
+#, c-format
+msgid "Spool block too big. Max %u bytes, got %u\n"
+msgstr ""
+
+#: src/stored/spool.c:325 src/stored/spool.c:326
+#, c-format
+msgid "Spool data read error. Wanted %u bytes, got %d\n"
+msgstr ""
+
+#: src/stored/spool.c:383
+msgid "User specified spool size reached.\n"
+msgstr ""
+
+#: src/stored/spool.c:385
+msgid "Bad return from despool in write_block.\n"
+msgstr ""
+
+#: src/stored/spool.c:393
+msgid "Spooling data again ...\n"
+msgstr ""
+
+#: src/stored/spool.c:424
+#, c-format
+msgid "Error writing header to spool file. ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:438 src/stored/spool.c:476
+msgid "Fatal despooling error."
+msgstr ""
+
+#: src/stored/spool.c:445
+msgid "Retrying after header spooling error failed.\n"
+msgstr ""
+
+#: src/stored/spool.c:459
+#, c-format
+msgid "Error writing data to spool file. ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:486
+msgid "Retrying after data spooling error failed.\n"
+msgstr ""
+
+#: src/stored/spool.c:541 src/stored/spool.c:548
+#, c-format
+msgid "Fseek on attributes file failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/spool.c:558
+#, c-format
+msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n"
+msgstr ""
+
+#: src/stored/spool.c:585
+#, c-format
+msgid "fopen attr spool file %s failed: ERR=%s\n"
+msgstr ""
+
+#: src/stored/status.c:67
+#, c-format
+msgid ""
+"\n"
+"%s Version: %s (%s) %s %s %s\n"
+msgstr ""
+
+#: src/stored/status.c:103
+msgid ""
+"\n"
+"Device status:\n"
+msgstr ""
+
+#: src/stored/status.c:105
+#, c-format
+msgid "Autochanger \"%s\" with devices:\n"
+msgstr ""
+
+#: src/stored/status.c:119
+#, c-format
+msgid "Device %s is mounted with Volume=\"%s\" Pool=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:123
+#, c-format
+msgid "Device %s open but no Bacula volume is mounted.\n"
+msgstr ""
+
+#: src/stored/status.c:133
+#, c-format
+msgid "    Total Bytes=%s Blocks=%s Bytes/block=%s\n"
+msgstr ""
+
+#: src/stored/status.c:147
+#, c-format
+msgid "    Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n"
+msgstr ""
+
+#: src/stored/status.c:152
+#, c-format
+msgid "    Positioned at File=%s Block=%s\n"
+msgstr ""
+
+#: src/stored/status.c:158
+#, c-format
+msgid "Device %s is not open or does not exist.\n"
+msgstr ""
+
+#: src/stored/status.c:160
+#, c-format
+msgid "Device \"%s\" is not open or does not exist.\n"
+msgstr ""
+
+#: src/stored/status.c:165 src/stored/status.c:168 src/stored/status.c:172
+#: src/stored/status.c:174
+msgid ""
+"====\n"
+"\n"
+msgstr ""
+
+#: src/stored/status.c:166
+msgid "In Use Volume status:\n"
+msgstr ""
+
+#: src/stored/status.c:190
+msgid ""
+"No DEVICE structure.\n"
+"\n"
+msgstr ""
+
+#: src/stored/status.c:195
+msgid "    Device is BLOCKED. User unmounted.\n"
+msgstr ""
+
+#: src/stored/status.c:198
+msgid "    Device is BLOCKED. User unmounted during wait for media/mount.\n"
+msgstr ""
+
+#: src/stored/status.c:202
+#, c-format
+msgid "    Device is BLOCKED waiting for mount of volume \"%s\".\n"
+msgstr ""
+
+#: src/stored/status.c:205
+msgid "    Device is BLOCKED waiting for media.\n"
+msgstr ""
+
+#: src/stored/status.c:209
+msgid "    Device is being initialized.\n"
+msgstr ""
+
+#: src/stored/status.c:212
+msgid "    Device is blocked labeling a Volume.\n"
+msgstr ""
+
+#: src/stored/status.c:220
+#, c-format
+msgid "    Slot %d is loaded in drive %d.\n"
+msgstr ""
+
+#: src/stored/status.c:223
+#, c-format
+msgid "    Drive %d is not loaded.\n"
+msgstr ""
+
+#: src/stored/status.c:242
+msgid "Device state:\n"
+msgstr ""
+
+#: src/stored/status.c:256
+#, c-format
+msgid ""
+"num_writers=%d JobStatus=%c block=%d\n"
+"\n"
+msgstr ""
+
+#: src/stored/status.c:260
+#, c-format
+msgid "Archive name: %s Device name: %s\n"
+msgstr ""
+
+#: src/stored/status.c:262
+#, c-format
+msgid "File=%u block=%u\n"
+msgstr ""
+
+#: src/stored/status.c:263
+#, c-format
+msgid "Min block=%u Max block=%u\n"
+msgstr ""
+
+#: src/stored/status.c:280
+#, c-format
+msgid "%s Job %s waiting for Client connection.\n"
+msgstr ""
+
+#: src/stored/status.c:295
+#, c-format
+msgid ""
+"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:307
+#, c-format
+msgid ""
+"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:330
+#, c-format
+msgid "    FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n"
+msgstr ""
+
+#: src/stored/status.c:335
+msgid "    FDSocket closed\n"
+msgstr ""
+
+#: src/stored/status.c:352
+msgid ""
+"\n"
+"Jobs waiting to reserve a drive:\n"
+msgstr ""
+
+#: src/stored/status.c:380
+msgid " JobId  Level   Files          Bytes Status   Finished        Name \n"
+msgstr ""
+
+#: src/stored/status.c:514
+msgid "3900 Bad .status command, missing argument.\n"
+msgstr ""
+
+#: src/stored/status.c:537
+msgid "3900 Bad .status command, wrong argument.\n"
+msgstr ""
+
+#: src/stored/stored.c:65
+#, c-format
+msgid ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version: %s (%s)\n"
+"\n"
+"Usage: stored [options] [-c config_file] [config_file]\n"
+"        -c <file>   use <file> as configuration file\n"
+"        -dnn        set debug level to nn\n"
+"        -f          run in foreground (for debugging)\n"
+"        -g <group>  set groupid to group\n"
+"        -p          proceed despite I/O errors\n"
+"        -s          no signals (for debugging)\n"
+"        -t          test - read config and exit\n"
+"        -u <user>   userid to <user>\n"
+"        -v          verbose user messages\n"
+"        -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/stored/stored.c:220
+msgid "Volume Session Time is ZERO!\n"
+msgstr ""
+
+#: src/stored/stored.c:233
+#, c-format
+msgid "Unable to create thread. ERR=%s\n"
+msgstr ""
+
+#: src/stored/stored.c:271
+#, c-format
+msgid "Only one Storage resource permitted in %s\n"
+msgstr ""
+
+#: src/stored/stored.c:276
+#, c-format
+msgid "No Director resource defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/stored.c:281
+#, c-format
+msgid "No Device resource defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/stored.c:289
+#, c-format
+msgid "No Messages resource defined in %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/stored.c:316
+#, c-format
+msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"
+msgstr ""
+
+#: src/stored/stored.c:322
+#, c-format
+msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"
+msgstr ""
+
+#: src/stored/stored.c:328
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Storage \"%s\" in %s. At least one CA certificate store is required when "
+"using \"TLS Verify Peer\".\n"
+msgstr ""
+
+#: src/stored/stored.c:455
+#, c-format
+msgid "Could not initialize %s\n"
+msgstr ""
+
+#: src/stored/stored.c:468
+#, c-format
+msgid "Could not open device %s\n"
+msgstr ""
+
+#: src/stored/stored.c:481
+#, c-format
+msgid "Could not mount device %s\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:216
+#, c-format
+msgid "Expected a Device Type keyword, got: %s"
+msgstr ""
+
+#: src/stored/stored_conf.c:231
+#, c-format
+msgid "Warning: no \"%s\" resource (%d) defined.\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:234
+#, c-format
+msgid "dump_resource type=%d\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:350
+#, c-format
+msgid "Warning: unknown resource type %d\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:539
+#, c-format
+msgid "\"%s\" item is required in \"%s\" resource, but not found.\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:545
+#, c-format
+msgid "Too many items in \"%s\" resource\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:579
+#, c-format
+msgid "Cannot find AutoChanger resource %s\n"
+msgstr ""
+
+#: src/stored/stored_conf.c:650
+#, c-format
+msgid ""
+"Attempt to define second \"%s\" resource named \"%s\" is not permitted.\n"
+msgstr ""
+
+#: src/stored/wait.c:114
+#, c-format
+msgid "pthread timedwait error. ERR=%s\n"
+msgstr ""
+
+#: src/stored/wait.c:199
+#, c-format
+msgid "Job %s waiting to reserve a device.\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:85
+#, c-format
+msgid "Fatal malformed reply from %s: %s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:121
+#, c-format
+msgid ""
+"\n"
+"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n"
+"       -c          set the Cc: field\n"
+"       -dnn        set debug level to nn\n"
+"       -f          set the From: field\n"
+"       -h          use mailhost:port as the SMTP server\n"
+"       -s          set the Subject: field\n"
+"       -?          print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:204
+msgid "Fatal error: no recipient given.\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:225
+#, c-format
+msgid "Fatal gethostname error: ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:229
+#, c-format
+msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:254
+#, c-format
+msgid "Error unknown mail host \"%s\": ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:257
+msgid "Retrying connection using \"localhost\".\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:265
+#, c-format
+msgid "Fatal error: Unknown address family for smtp host: %d\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:273
+#, c-format
+msgid "Fatal socket error: ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:277
+#, c-format
+msgid "Fatal connect error to %s: ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:282
+#, c-format
+msgid "Fatal dup error: ERR=%s\n"
+msgstr ""
+
+#: src/tools/bsmtp.c:286 src/tools/bsmtp.c:290
+#, c-format
+msgid "Fatal fdopen error: ERR=%s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:158
+msgid ""
+"Warning skipping the additional parameters for working directory/dbname/user/"
+"password/host.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:174
+#, c-format
+msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:176
+#, c-format
+msgid "Error there is no Catalog section in the given config file [%s]\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:185
+msgid "Error no Director resource defined.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:199
+msgid "Wrong number of arguments.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:204
+msgid "Working directory not supplied.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:269
+#, c-format
+msgid "Hello, this is the database check/correct program.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:271
+#, c-format
+msgid "Modify database is on."
+msgstr ""
+
+#: src/tools/dbcheck.c:273
+#, c-format
+msgid "Modify database is off."
+msgstr ""
+
+#: src/tools/dbcheck.c:275 src/tools/dbcheck.c:336
+#, c-format
+msgid " Verbose is on.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:277 src/tools/dbcheck.c:338
+#, c-format
+msgid " Verbose is off.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:279
+#, c-format
+msgid "Please select the fuction you want to perform.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:283
+#, c-format
+msgid ""
+"\n"
+"     1) Toggle modify database flag\n"
+"     2) Toggle verbose flag\n"
+"     3) Repair bad Filename records\n"
+"     4) Repair bad Path records\n"
+"     5) Eliminate duplicate Filename records\n"
+"     6) Eliminate duplicate Path records\n"
+"     7) Eliminate orphaned Jobmedia records\n"
+"     8) Eliminate orphaned File records\n"
+"     9) Eliminate orphaned Path records\n"
+"    10) Eliminate orphaned Filename records\n"
+"    11) Eliminate orphaned FileSet records\n"
+"    12) Eliminate orphaned Client records\n"
+"    13) Eliminate orphaned Job records\n"
+"    14) Eliminate all Admin records\n"
+"    15) Eliminate all Restore records\n"
+"    16) All (3-15)\n"
+"    17) Quit\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:302
+#, c-format
+msgid ""
+"\n"
+"     1) Toggle modify database flag\n"
+"     2) Toggle verbose flag\n"
+"     3) Check for bad Filename records\n"
+"     4) Check for bad Path records\n"
+"     5) Check for duplicate Filename records\n"
+"     6) Check for duplicate Path records\n"
+"     7) Check for orphaned Jobmedia records\n"
+"     8) Check for orphaned File records\n"
+"     9) Check for orphaned Path records\n"
+"    10) Check for orphaned Filename records\n"
+"    11) Check for orphaned FileSet records\n"
+"    12) Check for orphaned Client records\n"
+"    13) Check for orphaned Job records\n"
+"    14) Check for all Admin records\n"
+"    15) Check for all Restore records\n"
+"    16) All (3-15)\n"
+"    17) Quit\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:322
+msgid "Select function number: "
+msgstr ""
+
+#: src/tools/dbcheck.c:329
+#, c-format
+msgid "Database will be modified.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:331
+#, c-format
+msgid "Database will NOT be modified.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:421
+#, c-format
+msgid "JobId=%s Name=\"%s\" StartTime=%s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:429
+#, c-format
+msgid "Orphaned JobMediaId=%s JobId=%s Volume=\"%s\"\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:436
+#, c-format
+msgid "Orphaned FileId=%s JobId=%s Volume=\"%s\"\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:443
+#, c-format
+msgid "Orphaned FileSetId=%s FileSet=\"%s\" MD5=%s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:450
+#, c-format
+msgid "Orphaned ClientId=%s Name=\"%s\"\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:503
+#, c-format
+msgid "Deleting: %s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:577
+#, c-format
+msgid "Checking for duplicate Filename entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:586
+#, c-format
+msgid "Found %d duplicate Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:587
+msgid "Print the list? (yes/no): "
+msgstr ""
+
+#: src/tools/dbcheck.c:603 src/tools/dbcheck.c:657
+#, c-format
+msgid "Found %d for: %s\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:630
+#, c-format
+msgid "Checking for duplicate Path entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:640
+#, c-format
+msgid "Found %d duplicate Path records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:641 src/tools/dbcheck.c:691 src/tools/dbcheck.c:723
+#: src/tools/dbcheck.c:755 src/tools/dbcheck.c:783 src/tools/dbcheck.c:811
+#: src/tools/dbcheck.c:849 src/tools/dbcheck.c:887 src/tools/dbcheck.c:918
+#: src/tools/dbcheck.c:948 src/tools/dbcheck.c:982 src/tools/dbcheck.c:1040
+msgid "Print them? (yes/no): "
+msgstr ""
+
+#: src/tools/dbcheck.c:683
+#, c-format
+msgid "Checking for orphaned JobMedia entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:690
+#, c-format
+msgid "Found %d orphaned JobMedia records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:703
+#, c-format
+msgid "Deleting %d orphaned JobMedia records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:712
+#, c-format
+msgid "Checking for orphaned File entries. This may take some time!\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:722
+#, c-format
+msgid "Found %d orphaned File records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:735
+#, c-format
+msgid "Deleting %d orphaned File records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:744
+#, c-format
+msgid "Checking for orphaned Path entries. This may take some time!\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:754
+#, c-format
+msgid "Found %d orphaned Path records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:763
+#, c-format
+msgid "Deleting %d orphaned Path records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:772
+#, c-format
+msgid "Checking for orphaned Filename entries. This may take some time!\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:782
+#, c-format
+msgid "Found %d orphaned Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:791
+#, c-format
+msgid "Deleting %d orphaned Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:800
+#, c-format
+msgid "Checking for orphaned FileSet entries. This takes some time!\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:810
+#, c-format
+msgid "Found %d orphaned FileSet records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:822
+#, c-format
+msgid "Deleting %d orphaned FileSet records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:831
+#, c-format
+msgid "Checking for orphaned Client entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:848
+#, c-format
+msgid "Found %d orphaned Client records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:860
+#, c-format
+msgid "Deleting %d orphaned Client records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:869
+#, c-format
+msgid "Checking for orphaned Job entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:886
+#, c-format
+msgid "Found %d orphaned Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:898
+#, c-format
+msgid "Deleting %d orphaned Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:908
+#, c-format
+msgid "Checking for Admin Job entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:917
+#, c-format
+msgid "Found %d Admin Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:929
+#, c-format
+msgid "Deleting %d Admin Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:938
+#, c-format
+msgid "Checking for Restore Job entries.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:947
+#, c-format
+msgid "Found %d Restore Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:959
+#, c-format
+msgid "Deleting %d Restore Job records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:972
+#, c-format
+msgid "Checking for Filenames with a trailing slash\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:981
+#, c-format
+msgid "Found %d bad Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:995 src/tools/dbcheck.c:1053
+#, c-format
+msgid "Reparing %d bad Filename records.\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:1030
+#, c-format
+msgid "Checking for Paths without a trailing slash\n"
+msgstr ""
+
+#: src/tools/dbcheck.c:1039
+#, c-format
+msgid "Found %d bad Path records.\n"
+msgstr ""
+
+#: src/tools/fstype.c:34
+#, c-format
+msgid ""
+"\n"
+"Usage: fstype [-d debug_level] path ...\n"
+"\n"
+"       Print the file system type a given file/directory is on.\n"
+"       The following options are supported:\n"
+"\n"
+"       -v     print both path and file system type.\n"
+"       -?     print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tools/fstype.c:86
+#, c-format
+msgid "%s: unknown\n"
+msgstr ""
+
+#: src/tools/testfind.c:49
+#, c-format
+msgid ""
+"\n"
+"Usage: testfind [-d debug_level] [-] [pattern1 ...]\n"
+"       -a          print extended attributes (Win32 debug)\n"
+"       -dnn        set debug level to nn\n"
+"       -e          specify file of exclude patterns\n"
+"       -i          specify file of include patterns\n"
+"       -           read pattern(s) from stdin\n"
+"       -?          print this message.\n"
+"\n"
+"Patterns are used for file inclusion -- normally directories.\n"
+"Debug level >= 1 prints each file found.\n"
+"Debug level >= 10 prints path/file for catalog.\n"
+"Errors are always printed.\n"
+"Files/paths truncated is the number of files/paths with len > 255.\n"
+"Truncation is only in the catalog.\n"
+"\n"
+msgstr ""
+
+#: src/tools/testfind.c:134 src/tools/testls.c:130
+#, c-format
+msgid "Could not open include file: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:147 src/tools/testls.c:143
+#, c-format
+msgid "Could not open exclude file: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:160
+#, c-format
+msgid ""
+"Total files    : %d\n"
+"Max file length: %d\n"
+"Max path length: %d\n"
+"Files truncated: %d\n"
+"Paths truncated: %d\n"
+"Hard links     : %d\n"
+msgstr ""
+
+#: src/tools/testfind.c:199
+#, c-format
+msgid "Reg: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:220
+msgid "\t[will not descend: recursion turned off]"
+msgstr ""
+
+#: src/tools/testfind.c:222
+msgid "\t[will not descend: file system change not allowed]"
+msgstr ""
+
+#: src/tools/testfind.c:224
+msgid "\t[will not descend: disallowed file system]"
+msgstr ""
+
+#: src/tools/testfind.c:240 src/tools/testls.c:178
+#, c-format
+msgid "Err: Could not access %s: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:243 src/tools/testls.c:181
+#, c-format
+msgid "Err: Could not follow ff->link %s: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:246 src/tools/testls.c:184
+#, c-format
+msgid "Err: Could not stat %s: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:249 src/tools/testls.c:187
+#, c-format
+msgid "Skip: File not saved. No change. %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:252 src/tools/testls.c:190
+#, c-format
+msgid "Err: Attempt to backup archive. Not saved. %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:255 src/tools/testls.c:199
+#, c-format
+msgid "Err: Could not open directory %s: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:258 src/tools/testls.c:202
+#, c-format
+msgid "Err: Unknown file ff->type %d: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:308
+#, c-format
+msgid "===== Filename truncated to 255 chars: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:325
+#, c-format
+msgid "========== Path name truncated to 255 chars: %s\n"
+msgstr ""
+
+#: src/tools/testfind.c:334
+#, c-format
+msgid "========== Path length is zero. File=%s\n"
+msgstr ""
+
+#: src/tools/testfind.c:337
+#, c-format
+msgid "Path: %s\n"
+msgstr ""
+
+#: src/tools/testls.c:45
+#, c-format
+msgid ""
+"\n"
+"Usage: testls [-d debug_level] [-] [pattern1 ...]\n"
+"       -a          print extended attributes (Win32 debug)\n"
+"       -dnn        set debug level to nn\n"
+"       -e          specify file of exclude patterns\n"
+"       -i          specify file of include patterns\n"
+"       -           read pattern(s) from stdin\n"
+"       -?          print this message.\n"
+"\n"
+"Patterns are file inclusion -- normally directories.\n"
+"Debug level >= 1 prints each file found.\n"
+"Debug level >= 10 prints path/file for catalog.\n"
+"Errors always printed.\n"
+"Files/paths truncated is number with len > 255.\n"
+"Truncation is only in catalog.\n"
+"\n"
+msgstr ""
+
+#: src/tools/testls.c:193
+#, c-format
+msgid "Recursion turned off. Directory not entered. %s\n"
+msgstr ""
+
+#: src/tools/testls.c:196
+#, c-format
+msgid "Skip: File system change prohibited. Directory not entered. %s\n"
+msgstr ""
+
+#: src/tray-monitor/authenticate.c:78
+msgid ""
+"Director authorization problem.\n"
+"Most likely the passwords do not agree.\n"
+"Please see http://www.bacula.org/html-manual/faq.html#AuthorizationErrors "
+"for help.\n"
+msgstr ""
+
+#: src/tray-monitor/authenticate.c:127
+msgid ""
+"Director and Storage daemon passwords or names not the same.\n"
+"Please see http://www.bacula.org/html-manual/faq.html#AuthorizationErrors "
+"for help.\n"
+msgstr ""
+
+#: src/tray-monitor/authenticate.c:172
+msgid ""
+"Director and File daemon passwords or names not the same.\n"
+"Please see http://www.bacula.org/html-manual/faq.html#AuthorizationErrors "
+"for help.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:102
+#, c-format
+msgid ""
+"Copyright (C) 2000-2004 Kern Sibbald and John Walker\n"
+"Written by Nicolas Boichat (2004)\n"
+"\n"
+"Version: %s (%s) %s %s %s\n"
+"\n"
+"Usage: tray-monitor [-c config_file] [-d debug_level]\n"
+"       -c <file>     set configuration file to file\n"
+"       -dnn          set debug level to nn\n"
+"       -t            test - read configuration and exit\n"
+"       -?            print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:251
+#, c-format
+msgid ""
+"Error: %d Monitor resource defined in %s. You must define one and only one "
+"Monitor resource.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:282
+#, c-format
+msgid ""
+"No Client, Storage nor Director resource defined in %s\n"
+"Without that I don't how to get status from the File, Storage or Director "
+"Daemon :-(\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:304
+#, c-format
+msgid ""
+"Invalid refresh interval defined in %s\n"
+"This value must be greater or equal to 1 second and less or equal to 10 "
+"minutes (read value: %d).\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:319
+msgid "Open status window..."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:325
+msgid "Exit"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:337
+msgid "Bacula tray monitor"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:362
+msgid " (DIR)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:366
+msgid " (FD)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:370
+msgid " (SD)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:383
+msgid "Unknown status."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:424
+msgid "Refresh interval in seconds: "
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:432
+msgid "Refresh now"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:436
+msgid "About"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:440
+msgid "Close"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:460
+#, c-format
+msgid "Disconnecting from Director %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:463
+#, c-format
+msgid "Disconnecting from Client %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:466
+#, c-format
+msgid "Disconnecting from Storage %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:502 src/tray-monitor/tray-monitor.c:512
+msgid "Bacula Tray Monitor"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:503 src/tray-monitor/tray-monitor.c:513
+msgid ""
+"Copyright (C) 2004-2005 Kern Sibbald\n"
+"Written by Nicolas Boichat\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:505 src/tray-monitor/tray-monitor.c:515
+msgid "Version:"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:583
+#, c-format
+msgid "Error, currentitem is not a Client or a Storage..\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:656
+#, c-format
+msgid ""
+"Current job: %s\n"
+"Last job: %s"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:668
+#, c-format
+msgid " (%d errors)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:671
+#, c-format
+msgid " (%d error)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:708
+msgid "No current job."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:711
+msgid "No last job."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:719
+msgid "Job status: Created"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:724
+msgid "Job status: Running"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:728
+msgid "Job status: Blocked"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:733
+msgid "Job status: Terminated"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:738
+msgid "Job status: Terminated in error"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:744
+msgid "Job status: Error"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:748
+msgid "Job status: Fatal error"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:753
+msgid "Job status: Verify differences"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:758
+msgid "Job status: Canceled"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:763
+msgid "Job status: Waiting on File daemon"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:768
+msgid "Job status: Waiting on the Storage daemon"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:773
+msgid "Job status: Waiting for new media"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:778
+msgid "Job status: Waiting for Mount"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:783
+msgid "Job status: Waiting for storage resource"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:788
+msgid "Job status: Waiting for job resource"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:793
+msgid "Job status: Waiting for Client resource"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:798
+msgid "Job status: Waiting for maximum jobs"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:803
+msgid "Job status: Waiting for start time"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:808
+msgid "Job status: Waiting for higher priority jobs to finish"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:813
+#, c-format
+msgid "Unknown job status %c."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:814
+#, c-format
+msgid "Job status: Unknown(%c)"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:821
+#, c-format
+msgid "Bad scan : '%s' %d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:859
+#, c-format
+msgid "Connecting to Director %s:%d"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:865
+#, c-format
+msgid "Connecting to Client %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:866
+#, c-format
+msgid "Connecting to Client %s:%d"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:872
+#, c-format
+msgid "Connecting to Storage %s:%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:873
+#, c-format
+msgid "Connecting to Storage %s:%d"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:878 src/tray-monitor/tray-monitor.c:916
+#, c-format
+msgid "Error, currentitem is not a Client, a Storage or a Director..\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:884
+msgid "Cannot connect to daemon.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:885
+msgid "Cannot connect to daemon."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:897
+#, c-format
+msgid "Authentication error : %s"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:904
+msgid "Opened connection with Director daemon.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:905
+msgid "Opened connection with Director daemon."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:908
+msgid "Opened connection with File daemon.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:909
+msgid "Opened connection with File daemon."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:912
+msgid "Opened connection with Storage daemon.\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:913
+msgid "Opened connection with Storage daemon."
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:948
+msgid "<< Error: BNET_PROMPT signal received. >>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:465
+msgid "<< Heartbeat signal received, answered. >>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:957
+#, c-format
+msgid "<< Unexpected signal received : %s >>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:962
+msgid "<ERROR>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:966
+msgid "Error : BNET_HARDEOF or BNET_ERROR"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:972
+msgid "<STOP>\n"
+msgstr ""
+
+#: src/tray-monitor/tray-monitor.c:976
+msgid "Error : Connection closed."
+msgstr ""
+
+#: src/tray-monitor/tray_conf.c:161
+#, c-format
+msgid "Monitor: name=%s FDtimeout=%s SDtimeout=%s\n"
+msgstr ""
+
+#: src/tray-monitor/tray_conf.c:167
+#, c-format
+msgid "Director: name=%s address=%s FDport=%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray_conf.c:171
+#, c-format
+msgid "Client: name=%s address=%s FDport=%d\n"
+msgstr ""
+
+#: src/tray-monitor/tray_conf.c:175
+#, c-format
+msgid "Storage: name=%s address=%s SDport=%d\n"
+msgstr ""
+
+#: src/wx-console/authenticate.c:129
+msgid "Bad response to Hello command: ERR="
+msgstr ""
+
+#: src/baconfig.h:55
+#, c-format
+msgid "Failed ASSERT: %s\n"
+msgstr ""
+
+#: src/baconfig.h:62
+msgid "*None*"
+msgstr ""
+
+#: src/filed/win32/winmain.cpp:228 src/filed/win32/winmain.cpp:236
+msgid "Bacula Usage"
+msgstr ""
+
+#: src/filed/win32/winmain.cpp:233
+msgid "Bad Command Line Options"
+msgstr ""
+
+#: src/filed/win32/winmain.cpp:326
+msgid "Another instance of Bacula is already running"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:131 src/filed/win32/winservice.cpp:145
+msgid "No existing instance of Bacula could be contacted"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:218
+msgid "KERNEL32.DLL not found: Bacula service not started"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:228
+msgid "Registry service not found: Bacula service not started"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:230
+msgid "Registry service not found"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:260
+msgid "StartServiceCtrlDispatcher failed."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:278
+msgid "RegisterServiceCtlHandler failed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:279
+msgid "Contact Register Service Handler failure"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:295
+msgid "ReportStatus STOPPED failed 1"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:318
+msgid "Report Service failure"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:355
+msgid "Unable to install Bacula service"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:373
+msgid "Service command length too long"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:374
+msgid "Service command length too long. Service not registered."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:389
+msgid "Cannot write System Registry"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:390
+msgid ""
+"The System Registry could not be updated - the Bacula service was not "
+"installed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:397
+msgid "Cannot add Bacula key to System Registry"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:398 src/filed/win32/winservice.cpp:449
+msgid "The Bacula service could not be installed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:406
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started by double clicking on the\n"
+"Bacula \"Start\" icon and will be automatically\n"
+"be run the next time this machine is rebooted. "
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:424
+msgid ""
+"The Service Control Manager could not be contacted - the Bacula service was "
+"not installed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:455
+msgid ""
+"Provides file backup and restore services. Bacula -- the network backup "
+"solution."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:462
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started from the Control Panel and will\n"
+"automatically be run the next time this machine is rebooted."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:471
+msgid ""
+"Unknown Windows operating system.\n"
+"Cannot install Bacula service.\n"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:496
+msgid ""
+"Could not find registry entry.\n"
+"Service probably not registerd - the Bacula service was not removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:501
+msgid ""
+"Could not delete Registry key.\n"
+"The Bacula service could not be removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:511
+msgid "Bacula could not be contacted, probably not running"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:517 src/filed/win32/winservice.cpp:553
+msgid "The Bacula service has been removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:547
+msgid "The Bacula service could not be stopped"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:555
+msgid "The Bacula service could not be removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:560
+msgid "The Bacula service could not be found"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:565
+msgid "The SCM could not be contacted - the Bacula service was not removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:629
+msgid "SetServiceStatus failed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:657
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s error: %ld at %s:%d"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:732
+#, c-format
+msgid "Locked by: %s, duration: %ld seconds\n"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:736
+#, c-format
+msgid "No longer locked\n"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:740
+msgid "Could not lock database"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:101
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Director \"%s\" in config file.\n"
+"At least one CA certificate store is required.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:108
+msgid ""
+"No Director resource defined in config file.\n"
+"Without that I don't how to speak to the Director :-(\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:127
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Console \"%s\" in config file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:148
+msgid "Error while initializing windows sockets...\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:163
+msgid "Error while cleaning up windows sockets...\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:201
+msgid "Error while initializing library."
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:227
+msgid "Cryptographic library initialization failed.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:231
+msgid "Please correct configuration file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:273
+msgid "Error : Library not initialized\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:284
+msgid "Error : No configuration file loaded\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:294
+msgid "Connecting...\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:310
+msgid "Error : No director defined in config file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:322
+msgid "Multiple directors found in your config file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:331
+#, c-format
+msgid "Please choose a director (1-%d): "
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:403
+msgid "Failed to connect to the director\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:413
+msgid "Connected\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:470
+msgid "<< Unexpected signal received : "
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:490
+msgid "Connection terminated\n"
+msgstr ""
+
+#: src/wx-console/main.cpp:101
+msgid "Bacula wx-console"
+msgstr ""
+
+#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
+#, c-format
+msgid "Welcome to bacula wx-console %s (%s)!\n"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:44
+msgid "Config file editor"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:54
+msgid "# Bacula wx-console Configuration File\n"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:90
+msgid "Save and close"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:91
+msgid "Close without saving"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:118
+#, c-format
+msgid "Unable to write to %s\n"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:119
+msgid "Error while saving"
+msgstr ""
+
+#: src/wx-console/wxbconfigpanel.cpp:184
+msgid "Apply"
+msgstr ""
+
+#: src/wx-console/wxbhistorytextctrl.cpp:61
+#: src/wx-console/wxbhistorytextctrl.cpp:132
+#: src/wx-console/wxbmainframe.cpp:272
+msgid "Type your command below:"
+msgstr ""
+
+#: src/wx-console/wxbhistorytextctrl.cpp:96
+msgid "Unknown command."
+msgstr ""
+
+#: src/wx-console/wxbhistorytextctrl.cpp:105
+msgid "Possible completions: "
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "&About...\tF1"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "Show about dialog"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:598
+msgid "Connect to the director"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect of the director"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change of configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change your default configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:233
+msgid "Edit your configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "E&xit\tAlt-X"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "Quit this program"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:239
+msgid "&File"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:240
+msgid "&Help"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:257
+msgid "Console"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:264
+msgid ""
+"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:268
+msgid ""
+"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
+"support when handling non-ASCII filenames: Every non-ASCII character in such "
+"filenames will be replaced by an interrogation mark.\n"
+"If this behaviour disturbs you, please build wx-console against a Unicode "
+"version of wxWidgets for GTK+ 2.0.\n"
+"---\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:279
+msgid "Send"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
+msgid "Error while parsing command line arguments, using defaults.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
+msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:397
+#, c-format
+msgid ""
+"It seems that it is the first time you run wx-console.\n"
+"This file (%s) has been choosen as default configuration file.\n"
+"Do you want to edit it? (if you click No you will have to select another "
+"file)"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:399
+msgid "First run"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:416
+#, c-format
+msgid ""
+"Unable to read %s\n"
+"Error: %s\n"
+"Do you want to choose another one? (Press no to edit this file)"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:418
+msgid "Unable to read configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:430
+msgid "Please choose a configuration file to use"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:443
+msgid "This configuration file has been successfully read, use it as default?"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:444
+msgid "Configuration file read successfully"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:454
+#, c-format
+msgid "Using this configuration file: %s\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:459
+msgid "Connecting to the director..."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:474
+msgid "Failed to unregister a data parser !"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:482
+msgid "Quitting.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:497
+msgid ""
+"Welcome to Bacula wx-console.\n"
+"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
+"(C) 2005 Kern Sibbald\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:499
+msgid "About Bacula wx-console"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:505
+msgid "Please choose your default configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:509
+msgid "Use this configuration file as default?"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:510
+msgid "Configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:581
+msgid "Console thread terminated."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:589
+msgid "Connection to the director lost. Quit program?"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:590
+msgid "Connection lost"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:606
+msgid "Connected to the director."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:629
+msgid "Reconnect"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:630
+msgid "Reconnect to the director"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:644
+msgid "Disconnected of the director."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:663 src/wx-console/wxbrestorepanel.cpp:689
+msgid "Unexpected question has been received.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:686 src/wx-console/wxbmainframe.cpp:703
+msgid "wx-console: unexpected director's question."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:216
+#: src/wx-console/wxbrestorepanel.cpp:1895
+#: src/wx-console/wxbrestorepanel.cpp:1924
+msgid "Enter restore mode"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:219
+msgid "Cancel restore"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:245
+#: src/wx-console/wxbrestorepanel.cpp:299
+msgid "Add"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:247
+#: src/wx-console/wxbrestorepanel.cpp:301
+msgid "Remove"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:249
+#: src/wx-console/wxbrestorepanel.cpp:303
+msgid "Refresh"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:268
+msgid "M"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:272
+msgid "Filename"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:284
+msgid "Perm."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:317
+#: src/wx-console/wxbrestorepanel.cpp:330
+#: src/wx-console/wxbrestorepanel.cpp:482
+#: src/wx-console/wxbrestorepanel.cpp:492
+#: src/wx-console/wxbrestorepanel.cpp:495
+#: src/wx-console/wxbrestorepanel.cpp:1760
+#: src/wx-console/wxbrestorepanel.cpp:1846
+msgid "Job Name"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:319
+#: src/wx-console/wxbrestorepanel.cpp:335
+#: src/wx-console/wxbrestorepanel.cpp:434
+#: src/wx-console/wxbrestorepanel.cpp:435
+#: src/wx-console/wxbrestorepanel.cpp:445
+#: src/wx-console/wxbrestorepanel.cpp:446
+#: src/wx-console/wxbrestorepanel.cpp:1118
+#: src/wx-console/wxbrestorepanel.cpp:1191
+#: src/wx-console/wxbrestorepanel.cpp:1798
+#: src/wx-console/wxbrestorepanel.cpp:1800
+#: src/wx-console/wxbrestorepanel.cpp:1861
+msgid "Fileset"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:322
+#: src/wx-console/wxbrestorepanel.cpp:1185
+#: src/wx-console/wxbrestorepanel.cpp:1201
+#: src/wx-console/wxbrestorepanel.cpp:1203
+#: src/wx-console/wxbrestorepanel.cpp:1211
+#: src/wx-console/wxbrestorepanel.cpp:1213
+#: src/wx-console/wxbrestorepanel.cpp:1232
+#: src/wx-console/wxbrestorepanel.cpp:1239
+#: src/wx-console/wxbrestorepanel.cpp:1788
+#: src/wx-console/wxbrestorepanel.cpp:1799
+#: src/wx-console/wxbrestorepanel.cpp:1919
+msgid "Before"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:324
+msgid "Please configure parameters concerning files to restore :"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1854
+msgid "always"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if newer"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if older"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1857
+msgid "never"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:341
+msgid "Please configure parameters concerning files restoration :"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:406
+msgid "Getting parameters list."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:414
+msgid "Error : no clients returned by the director."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:438
+msgid "Error : no filesets returned by the director."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:462
+msgid "Error : no storage returned by the director."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:485
+#: src/wx-console/wxbrestorepanel.cpp:509
+msgid "Error : no jobs returned by the director."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:495
+msgid "RestoreFiles"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:530
+msgid "Please configure your restore parameters."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:541
+msgid "Building restore tree..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:584
+msgid "Error while starting restore: "
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:674
+msgid ""
+"Right click on a file or on a directory, or double-click on its mark to add "
+"it to the restore list."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:711
+#: src/wx-console/wxbrestorepanel.cpp:733
+msgid "wx-console: unexpected restore question."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:744
+msgid " files selected to be restored."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:749
+msgid " file selected to be restored."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:756
+#, c-format
+msgid "Please configure your restore (%ld files selected to be restored)..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:766
+msgid "Restore failed : no file selected.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:767
+msgid "Restore failed : no file selected."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:777
+msgid "Restoring, please wait..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:790
+msgid "Job started. JobId="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:792
+msgid "Restore started, jobid="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:796
+msgid "Job failed."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:797
+msgid "Restore failed, please look at messages.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:798
+msgid "Restore failed, please look at messages in console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:804
+#: src/wx-console/wxbrestorepanel.cpp:805
+msgid "Failed to retrieve jobid.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:831
+msgid ""
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:832
+msgid ""
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:858
+msgid "Restore job created, but not yet running."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:863
+#, c-format
+msgid "Restore job running, please wait (%ld of %ld files restored)..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:867
+msgid "Restore job terminated successfully."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:868
+msgid "Restore job terminated successfully.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:873
+msgid "Restore job terminated in error, see messages in console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:874
+msgid "Restore job terminated in error, see messages.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:879
+msgid "Restore job reported a non-fatal error."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:883
+msgid "Restore job reported a fatal error."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:888
+msgid "Restore job cancelled by user."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:889
+msgid "Restore job cancelled by user.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:894
+msgid "Restore job is waiting on File daemon."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:898
+msgid "Restore job is waiting for new media."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:902
+msgid "Restore job is waiting for storage resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:906
+msgid "Restore job is waiting for job resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:910
+msgid "Restore job is waiting for Client resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:914
+msgid "Restore job is waiting for maximum jobs."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:918
+msgid "Restore job is waiting for start time."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:922
+msgid "Restore job is waiting for higher priority jobs to finish."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:971
+msgid ""
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:972
+msgid ""
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:982
+msgid "Restore done successfully.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:983
+msgid "Restore done successfully."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1054
+msgid "Applying restore configuration changes..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1105
+msgid "Failed to find the selected client."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1120
+msgid "Failed to find the selected fileset."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1135
+msgid "Failed to find the selected storage."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1152
+#: src/wx-console/wxbrestorepanel.cpp:1835
+msgid "Run Restore job"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1168
+msgid "Restore configuration changes were applied."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1177
+msgid "Restore cancelled.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1178
+msgid "Restore cancelled."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1200
+msgid "No results to list."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1202
+msgid "No backup found for this client."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1209
+msgid "ERROR"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1210
+msgid "Query failed"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1212
+msgid "Cannot get previous backups list, see console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1845
+msgid "JobName:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1849
+msgid "Where:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1852
+msgid "Replace:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1855
+msgid "ifnewer"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1856
+msgid "ifolder"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1860
+msgid "FileSet:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1976
+msgid "Restoring..."
+msgstr ""
index d0617c7083b50c173b7b66ad2b3b0b0d0277c40d..96d5cfbfb371e714877f9cb538b6f36f91ba8096 100644 (file)
Binary files a/bacula/po/fr.gmo and b/bacula/po/fr.gmo differ
index d9f43ae659d674a0c582f8cd52beea2674679cba..3cb636d064673c817f2856f77d4032ab64f23d6f 100644 (file)
@@ -1,14 +1,14 @@
 # French translations for Bacula package
 # Traduction anglaise du package Bacula.
-# Copyright (C) 2005 Kern Sibbald
+# Copyright (C) 2005-2006 Kern Sibbald
 # Nicolas Boichat <nicolas@boichat.ch>, 2005.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Bacula 1.38\n"
 "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2005-08-19 11:20+0200\n"
-"PO-Revision-Date: 2005-08-10 16:45+0100\n"
+"POT-Creation-Date: 2006-05-02 16:47+0200\n"
+"PO-Revision-Date: 2006-04-08 14:00+0200\n"
 "Last-Translator: Nicolas Boichat <nicolas@boichat.ch>\n"
 "Language-Team: French <bacula-devel-fr@lists.sourceforge.net>\n"
 "MIME-Version: 1.0\n"
@@ -16,35 +16,35 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: src/cats/bdb.c:135
+#: src/cats/bdb.c:128
 msgid "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
-msgstr ""
+msgstr "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
 
-#: src/cats/bdb.c:136
+#: src/cats/bdb.c:129
 msgid "WARNING!!!! The Internal Database is NOT OPERATIONAL!\n"
-msgstr ""
+msgstr "ATTENTION !!!! La base interne n'est pas OPÉRATIONNELLE !\n"
 
-#: src/cats/bdb.c:137
+#: src/cats/bdb.c:130
 msgid "You should use SQLite, PostgreSQL, or MySQL\n"
-msgstr ""
+msgstr "Vous devez utiliser SQLite, PostgreSQL, ou MySQL\n"
 
-#: src/cats/bdb.c:159 src/cats/mysql.c:130 src/cats/postgresql.c:128
+#: src/cats/bdb.c:152 src/cats/mysql.c:124 src/cats/postgresql.c:128
 #: src/cats/sqlite.c:122
 #, c-format
 msgid "Unable to initialize DB lock. ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:169
+#: src/cats/bdb.c:162
 #, c-format
 msgid "Unable to open Catalog DB control file %s: ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:224
+#: src/cats/bdb.c:217
 #, c-format
 msgid "Error reading catalog DB control file. ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:227
+#: src/cats/bdb.c:220
 #, c-format
 msgid ""
 "Error, catalog DB control file wrong version. Wanted %d, got %d\n"
@@ -61,11 +61,11 @@ msgstr ""
 msgid "Error updating DB Media file. ERR=%s\n"
 msgstr ""
 
-#: src/cats/mysql.c:66
+#: src/cats/mysql.c:60
 msgid "A user name for MySQL must be supplied.\n"
 msgstr ""
 
-#: src/cats/mysql.c:167
+#: src/cats/mysql.c:161
 #, c-format
 msgid ""
 "Unable to connect to MySQL server. \n"
@@ -73,7 +73,7 @@ msgid ""
 "It is probably not running or your password is incorrect.\n"
 msgstr ""
 
-#: src/cats/mysql.c:326 src/cats/postgresql.c:264 src/cats/sqlite.c:323
+#: src/cats/mysql.c:321 src/cats/postgresql.c:266 src/cats/sqlite.c:323
 #, c-format
 msgid "Query failed: %s: ERR=%s\n"
 msgstr ""
@@ -90,7 +90,7 @@ msgid ""
 "It is probably not running or your password is incorrect.\n"
 msgstr ""
 
-#: src/cats/postgresql.c:506
+#: src/cats/postgresql.c:508
 #, c-format
 msgid "error fetching currval: %s\n"
 msgstr ""
@@ -133,15 +133,15 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:772
-#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:563
-#: src/cats/sql_get.c:638 src/cats/sql_get.c:865
+#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:773
+#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:564
+#: src/cats/sql_get.c:639 src/cats/sql_get.c:866
 #, c-format
 msgid "error fetching row: %s\n"
 msgstr ""
 
-#: src/cats/sql.c:326 src/dird/catreq.c:360 src/dird/catreq.c:392
-#: src/dird/catreq.c:417
+#: src/cats/sql.c:326 src/dird/catreq.c:367 src/dird/catreq.c:399
+#: src/dird/catreq.c:424
 #, c-format
 msgid "Attribute create error. %s"
 msgstr ""
@@ -160,215 +160,141 @@ msgstr ""
 msgid "Create DB Job record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:91 src/dird/dird_conf.c:532 src/dird/ua_cmds.c:422
-#: src/dird/ua_prune.c:454 src/dird/ua_run.c:643 src/dird/ua_select.c:228
-#: src/dird/ua_select.c:249
-msgid "Job"
-msgstr ""
-
-#: src/cats/sql_create.c:131
+#: src/cats/sql_create.c:132
 #, c-format
 msgid "Create JobMedia record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:140
+#: src/cats/sql_create.c:141
 #, c-format
 msgid "Update Media record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:170
+#: src/cats/sql_create.c:171
 #, c-format
 msgid "pool record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:196
+#: src/cats/sql_create.c:197
 #, c-format
 msgid "Create db Pool record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:201 src/dird/ua_run.c:650 src/dird/ua_select.c:464
-#: src/dird/ua_select.c:554 src/dird/ua_update.c:356 src/dird/ua_update.c:426
-#: src/wx-console/wxbrestorepanel.cpp:362
-#: src/wx-console/wxbrestorepanel.cpp:548
-#: src/wx-console/wxbrestorepanel.cpp:558
-#: src/wx-console/wxbrestorepanel.cpp:1754
-msgid "Pool"
-msgstr ""
-
-#: src/cats/sql_create.c:227
+#: src/cats/sql_create.c:228
 #, c-format
 msgid "Device record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:243
+#: src/cats/sql_create.c:244
 #, c-format
 msgid "Create db Device record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:248
-msgid "Device"
-msgstr ""
-
-#: src/cats/sql_create.c:276
+#: src/cats/sql_create.c:277
 #, c-format
 msgid "More than one Storage record!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:281
+#: src/cats/sql_create.c:282
 #, c-format
 msgid "error fetching Storage row: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:301
+#: src/cats/sql_create.c:302
 #, c-format
 msgid "Create DB Storage record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:306 src/dird/ua_run.c:642 src/dird/ua_select.c:152
-#: src/wx-console/wxbrestorepanel.cpp:363
-#: src/wx-console/wxbrestorepanel.cpp:379
-#: src/wx-console/wxbrestorepanel.cpp:500
-#: src/wx-console/wxbrestorepanel.cpp:501
-#: src/wx-console/wxbrestorepanel.cpp:511
-#: src/wx-console/wxbrestorepanel.cpp:512
-#: src/wx-console/wxbrestorepanel.cpp:1116
-#: src/wx-console/wxbrestorepanel.cpp:1765
-#: src/wx-console/wxbrestorepanel.cpp:1831
-msgid "Storage"
-msgstr ""
-
-#: src/cats/sql_create.c:333
+#: src/cats/sql_create.c:334
 #, c-format
 msgid "mediatype record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:349
+#: src/cats/sql_create.c:350
 #, c-format
 msgid "Create db mediatype record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:354
-msgid "MediaType"
-msgstr ""
-
-#: src/cats/sql_create.c:383
+#: src/cats/sql_create.c:384
 #, c-format
 msgid "Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/cats/sql_create.c:421
+#: src/cats/sql_create.c:422
 #, c-format
 msgid "Create DB Media record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:425
-msgid "Media"
-msgstr ""
-
-#: src/cats/sql_create.c:469
+#: src/cats/sql_create.c:470
 #, c-format
 msgid "More than one Client!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:474
+#: src/cats/sql_create.c:475
 #, c-format
 msgid "error fetching Client row: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:501
+#: src/cats/sql_create.c:502
 #, c-format
 msgid "Create DB Client record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:507 src/dird/ua_run.c:645 src/dird/ua_select.c:272
-#: src/dird/ua_select.c:379 src/wx-console/wxbrestorepanel.cpp:360
-#: src/wx-console/wxbrestorepanel.cpp:378
-#: src/wx-console/wxbrestorepanel.cpp:452
-#: src/wx-console/wxbrestorepanel.cpp:453
-#: src/wx-console/wxbrestorepanel.cpp:463
-#: src/wx-console/wxbrestorepanel.cpp:464
-#: src/wx-console/wxbrestorepanel.cpp:707
-#: src/wx-console/wxbrestorepanel.cpp:1086
-#: src/wx-console/wxbrestorepanel.cpp:1173
-#: src/wx-console/wxbrestorepanel.cpp:1758
-#: src/wx-console/wxbrestorepanel.cpp:1760
-#: src/wx-console/wxbrestorepanel.cpp:1829
-#: src/wx-console/wxbrestorepanel.cpp:1884
-msgid "Client"
-msgstr ""
-
-#: src/cats/sql_create.c:544
+#: src/cats/sql_create.c:545
 #, c-format
 msgid "Create DB Counters record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:577
+#: src/cats/sql_create.c:578
 #, c-format
 msgid "More than one FileSet!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:582
+#: src/cats/sql_create.c:583
 #, c-format
 msgid "error fetching FileSet row: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:612
+#: src/cats/sql_create.c:613
 #, c-format
 msgid "Create DB FileSet record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:618 src/dird/ua_restore.c:1035 src/dird/ua_run.c:644
-#: src/dird/ua_select.c:173
-msgid "FileSet"
-msgstr ""
-
-#: src/cats/sql_create.c:669
+#: src/cats/sql_create.c:670
 #, c-format
 msgid "Attempt to put non-attributes into catalog. Stream=%d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:732
+#: src/cats/sql_create.c:733
 #, c-format
 msgid "Create db File record %s failed. ERR=%s"
 msgstr ""
 
-#: src/cats/sql_create.c:738 src/gnome2-console/restore.c:121
-msgid "File"
-msgstr ""
-
-#: src/cats/sql_create.c:765 src/cats/sql_get.c:224
+#: src/cats/sql_create.c:766 src/cats/sql_get.c:224
 #, c-format
 msgid "More than one Path!: %s for path: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:796
+#: src/cats/sql_create.c:797
 #, c-format
 msgid "Create db Path record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:802
-msgid "Path"
-msgstr ""
-
-#: src/cats/sql_create.c:829
+#: src/cats/sql_create.c:830
 #, c-format
 msgid "More than one Filename! %s for file: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:835
+#: src/cats/sql_create.c:836
 #, c-format
 msgid "Error fetching row for file=%s: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:851
+#: src/cats/sql_create.c:852
 #, c-format
 msgid "Create db Filename record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:856 src/wx-console/wxbrestorepanel.cpp:314
-msgid "Filename"
-msgstr ""
-
 #: src/cats/sql_delete.c:79
 #, c-format
 msgid "No pool record %s exists\n"
@@ -407,27 +333,27 @@ msgid ""
 "CMD=%s\n"
 msgstr ""
 
-#: src/cats/sql_find.c:222
+#: src/cats/sql_find.c:224
 #, c-format
-msgid "Unknown Job level=%c\n"
+msgid "Unknown Job level=%d\n"
 msgstr ""
 
-#: src/cats/sql_find.c:232
+#: src/cats/sql_find.c:234
 #, c-format
 msgid "No Job found for: %s.\n"
 msgstr ""
 
-#: src/cats/sql_find.c:243
+#: src/cats/sql_find.c:245
 #, c-format
 msgid "No Job found for: %s\n"
 msgstr ""
 
-#: src/cats/sql_find.c:312
+#: src/cats/sql_find.c:317
 #, c-format
-msgid "Request for Volume item %d greater than max %d\n"
+msgid "Request for Volume item %d greater than max %d or less than 1.\n"
 msgstr ""
 
-#: src/cats/sql_find.c:324
+#: src/cats/sql_find.c:331
 #, c-format
 msgid "No Volume record found for item %d.\n"
 msgstr ""
@@ -491,104 +417,104 @@ msgstr ""
 msgid "No Job found for JobId %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:343 src/cats/sql_get.c:398
+#: src/cats/sql_get.c:344 src/cats/sql_get.c:399
 #, c-format
 msgid "No volumes found for JobId=%d\n"
 msgstr ""
 
-#: src/cats/sql_get.c:349 src/cats/sql_get.c:407
+#: src/cats/sql_get.c:350 src/cats/sql_get.c:408
 #, c-format
 msgid "Error fetching row %d: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:363
+#: src/cats/sql_get.c:364
 #, c-format
 msgid "No Volume for JobId %d found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:479
+#: src/cats/sql_get.c:480
 #, c-format
 msgid "Pool id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:516
+#: src/cats/sql_get.c:517
 #, c-format
 msgid "Client id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:558
+#: src/cats/sql_get.c:559
 #, c-format
 msgid "More than one Pool!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:599
+#: src/cats/sql_get.c:600
 msgid "Pool record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:633
+#: src/cats/sql_get.c:634
 #, c-format
 msgid "More than one Client!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:650 src/cats/sql_get.c:654
+#: src/cats/sql_get.c:651 src/cats/sql_get.c:655
 msgid "Client record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:679
+#: src/cats/sql_get.c:680
 #, c-format
 msgid "More than one Counter!: %d\n"
 msgstr ""
 
-#: src/cats/sql_get.c:684
+#: src/cats/sql_get.c:685
 #, c-format
 msgid "error fetching Counter row: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:704
+#: src/cats/sql_get.c:705
 #, c-format
 msgid "Counter record: %s not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:740
+#: src/cats/sql_get.c:741
 #, c-format
 msgid "Error got %s FileSets but expected only one!\n"
 msgstr ""
 
-#: src/cats/sql_get.c:745
+#: src/cats/sql_get.c:746
 #, c-format
 msgid "FileSet record \"%s\" not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:755
+#: src/cats/sql_get.c:756
 msgid "FileSet record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:812
+#: src/cats/sql_get.c:813
 #, c-format
 msgid "Media id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:860
+#: src/cats/sql_get.c:861
 #, c-format
 msgid "More than one Volume!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:905
+#: src/cats/sql_get.c:906
 #, c-format
 msgid "Media record MediaId=%s not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:908
+#: src/cats/sql_get.c:909
 #, c-format
 msgid "Media record for Volume \"%s\" not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:915
+#: src/cats/sql_get.c:916
 #, c-format
 msgid "Media record for MediaId=%u not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:918
+#: src/cats/sql_get.c:919
 #, c-format
 msgid "Media record for Vol=%s not found in Catalog.\n"
 msgstr ""
@@ -608,9 +534,9 @@ msgstr ""
 msgid "Unable to open Database=%s. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sqlite.c:162 src/lib/bnet_server.c:372
+#: src/cats/sqlite.c:162 src/lib/bnet_server.c:371
 msgid "unknown"
-msgstr ""
+msgstr "inconnu"
 
 #: src/cats/sqlite.c:221
 #, c-format
@@ -627,38 +553,38 @@ msgstr ""
 msgid "next_index update error: ERR=%s\n"
 msgstr ""
 
-#: src/console/authenticate.c:104 src/dird/authenticate.c:106
-#: src/dird/authenticate.c:206 src/filed/authenticate.c:124
-#: src/filed/authenticate.c:220 src/stored/authenticate.c:128
-#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:101
+#: src/console/authenticate.c:100 src/dird/authenticate.c:106
+#: src/dird/authenticate.c:206 src/filed/authenticate.c:119
+#: src/filed/authenticate.c:215 src/stored/authenticate.c:128
+#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:106
 msgid ""
 "Authorization problem: Remote server did not advertise required TLS "
 "support.\n"
 msgstr ""
 
-#: src/console/authenticate.c:111 src/dird/authenticate.c:113
-#: src/dird/authenticate.c:213 src/filed/authenticate.c:132
-#: src/filed/authenticate.c:228 src/stored/authenticate.c:136
-#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:108
+#: src/console/authenticate.c:107 src/dird/authenticate.c:113
+#: src/dird/authenticate.c:213 src/filed/authenticate.c:127
+#: src/filed/authenticate.c:223 src/stored/authenticate.c:136
+#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:112
 msgid "Authorization problem: Remote server requires TLS.\n"
 msgstr ""
 
-#: src/console/authenticate.c:121 src/wx-console/authenticate.c:118
+#: src/console/authenticate.c:117 src/wx-console/authenticate.c:121
 msgid "TLS negotiation failed\n"
 msgstr ""
 
-#: src/console/authenticate.c:133 src/gnome2-console/authenticate.c:85
+#: src/console/authenticate.c:129 src/gnome2-console/authenticate.c:85
 #: src/tray-monitor/authenticate.c:87
 #, c-format
 msgid "Bad response to Hello command: ERR=%s\n"
-msgstr ""
+msgstr "Mauvaise réponse Ã  la commande Hello : ERR=%s\n"
 
-#: src/console/authenticate.c:140 src/gnome2-console/authenticate.c:95
-#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:133
+#: src/console/authenticate.c:136 src/gnome2-console/authenticate.c:95
+#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:136
 msgid "Director rejected Hello command\n"
-msgstr ""
+msgstr "Le director a rejeté la commande Hello\n"
 
-#: src/console/authenticate.c:150 src/wx-console/authenticate.c:143
+#: src/console/authenticate.c:146 src/wx-console/authenticate.c:146
 msgid ""
 "Director authorization problem.\n"
 "Most likely the passwords do not agree.\n"
@@ -667,6 +593,13 @@ msgid ""
 "Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
 "help.\n"
 msgstr ""
+"Problème d'authentification avec le director.\n"
+"Le plus souvent, les mots de pass ne correspondent pas.\n"
+"Si vous utilisez TLS, il peut y avoir une erreur de validation du "
+"certificat\n"
+"pendant l'initialisation de la connexion TLS.\n"
+"Vous trouverez de l'aide sur\n"
+"http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors\n"
 
 #: src/console/console.c:102
 #, c-format
@@ -675,6 +608,9 @@ msgid ""
 "\n"
 "Version: "
 msgstr ""
+"Copyright (C) 2000-2005 Kern Sibbald\n"
+"\n"
+"Version : "
 
 #: src/console/console.c:103 src/dird/admin.c:108
 #, c-format
@@ -694,6 +630,14 @@ msgid ""
 "       -?          print this message.\n"
 "\n"
 msgstr ""
+") %s %s %s\n"
+"\n"
+"Usage : bconsole [-s] [-c config_file] [-d niveau_debug]\n"
+"       -c <file>   set configuration file to file\n"
+"       -dnn        set debug level to nn\n"
+"       -s          no signals\n"
+"       -t          test - lecture de la configuration et sortie\n"
+"\n"
 
 #: src/console/console.c:150
 msgid "input from file"
@@ -703,9 +647,9 @@ msgstr ""
 msgid "output to file"
 msgstr ""
 
-#: src/console/console.c:152 src/dird/ua_cmds.c:106
+#: src/console/console.c:152 src/dird/ua_cmds.c:110
 msgid "quit"
-msgstr ""
+msgstr "quit"
 
 #: src/console/console.c:153
 msgid "output to file and terminal"
@@ -715,31 +659,31 @@ msgstr ""
 msgid "sleep specified time"
 msgstr ""
 
-#: src/console/console.c:155 src/dird/ua_cmds.c:118
+#: src/console/console.c:155 src/dird/ua_cmds.c:122
 msgid "print current time"
-msgstr ""
+msgstr "affiche la date courante"
 
 #: src/console/console.c:156
 msgid "print Console's version"
 msgstr ""
 
-#: src/console/console.c:157 src/dird/ua_cmds.c:95
+#: src/console/console.c:157 src/dird/ua_cmds.c:99
 msgid "exit = quit"
-msgstr ""
+msgstr "exit = quit"
 
 #: src/console/console.c:158
 msgid "zed_keys = use zed keys instead of bash keys"
 msgstr ""
 
-#: src/console/console.c:191 src/dird/ua_dotcmds.c:106
+#: src/console/console.c:191 src/dird/ua_dotcmds.c:108
 msgid ": is an illegal command\n"
 msgstr ""
 
-#: src/console/console.c:400 src/dird/dird.c:196 src/filed/filed.c:183
-#: src/gnome2-console/console.c:271 src/stored/stored.c:189
-#: src/wx-console/console_thread.cpp:233
+#: src/console/console.c:400 src/filed/filed.c:183
+#: src/gnome2-console/console.c:271
+#, fuzzy
 msgid "TLS library initialization failed.\n"
-msgstr ""
+msgstr "Initialisation de la connexion TLS Ã©chouée.\n"
 
 #: src/console/console.c:404 src/dird/dird.c:200 src/dird/dird.c:410
 #: src/dird/dird.c:413 src/filed/filed.c:188 src/gnome2-console/console.c:275
@@ -764,35 +708,35 @@ msgstr ""
 #: src/console/console.c:435
 #, c-format
 msgid "You must enter a number between 1 and %d\n"
-msgstr ""
+msgstr "Vous devez saisir un nombre entre 1 et %d\n"
 
 #: src/console/console.c:455 src/tray-monitor/tray-monitor.c:858
 #, c-format
 msgid "Connecting to Director %s:%d\n"
-msgstr "Connection au Director %s:%d\n"
+msgstr "Connexion au Director %s:%d\n"
 
-#: src/console/console.c:471 src/gnome2-console/console.c:508
-#: src/wx-console/console_thread.cpp:367
+#: src/console/console.c:471 src/gnome2-console/console.c:504
+#: src/wx-console/console_thread.cpp:370
 #, c-format
 msgid "Failed to initialize TLS context for Console \"%s\".\n"
-msgstr ""
+msgstr "Impossible d'initialiser le contexte TLS pour la Console Â«Â %s ».\n"
 
-#: src/console/console.c:492 src/gnome2-console/console.c:530
-#: src/wx-console/console_thread.cpp:388
+#: src/console/console.c:492 src/gnome2-console/console.c:526
+#: src/wx-console/console_thread.cpp:391
 #, c-format
 msgid "Failed to initialize TLS context for Director \"%s\".\n"
-msgstr ""
+msgstr "Impossible d'initialiser le contexte TLS pour le Director Â«Â %s ».\n"
 
 #: src/console/console.c:515
 msgid "Enter a period to cancel a command.\n"
-msgstr ""
+msgstr "Tapez un point (.) pour annuler une commande.\n"
 
 #: src/console/console.c:582 src/console/console.c:611 src/dird/dird.c:496
 #: src/dird/dird.c:711 src/dird/dird.c:777 src/dird/dird.c:829
 #: src/filed/filed.c:302 src/filed/filed.c:348
 #: src/gnome2-console/console.c:140 src/gnome2-console/console.c:169
-#: src/stored/stored.c:310 src/wx-console/console_thread.cpp:96
-#: src/wx-console/console_thread.cpp:125
+#: src/stored/stored.c:311 src/wx-console/console_thread.cpp:94
+#: src/wx-console/console_thread.cpp:120
 msgid "TLS required but not configured in Bacula.\n"
 msgstr ""
 
@@ -809,6 +753,8 @@ msgid ""
 "No Director resource defined in %s\n"
 "Without that I don't how to speak to the Director :-(\n"
 msgstr ""
+"Pas de director défini pour %s\n"
+"Sans cette définition, il n'est pas possible de se connecter Ã  celui-ci.\n"
 
 #: src/console/console.c:618 src/gnome2-console/console.c:176
 #, c-format
@@ -819,16 +765,16 @@ msgstr ""
 
 #: src/console/console.c:763
 msgid "Too many arguments on input command.\n"
-msgstr ""
+msgstr "Trop d'arguments sur la commande.\n"
 
 #: src/console/console.c:767
 msgid "First argument to input command must be a filename.\n"
-msgstr ""
+msgstr "Le premier argument de la commande doit Ãªtre un fichier.\n"
 
 #: src/console/console.c:772
 #, c-format
 msgid "Cannot open file %s for input. ERR=%s\n"
-msgstr ""
+msgstr "Impossible d'ouvrir le fichier %s pour lecture. ERR=%s\n"
 
 #: src/console/console.c:802
 msgid "Too many arguments on output/tee command.\n"
@@ -837,21 +783,21 @@ msgstr ""
 #: src/console/console.c:818
 #, c-format
 msgid "Cannot open file %s for output. ERR=%s\n"
-msgstr ""
+msgstr "Impossible d'ouvrir le fichier %s pour la sortie. ERR=%s\n"
 
 #: src/console/console_conf.c:123 src/gnome2-console/console_conf.c:122
-#: src/wx-console/console_conf.c:124
+#: src/wx-console/console_conf.c:128
 #, c-format
 msgid "No record for %d %s\n"
 msgstr ""
 
-#: src/console/console_conf.c:132 src/wx-console/console_conf.c:133
+#: src/console/console_conf.c:132 src/wx-console/console_conf.c:137
 #, c-format
 msgid "Console: name=%s rcfile=%s histfile=%s\n"
 msgstr ""
 
 #: src/console/console_conf.c:136 src/gnome2-console/console_conf.c:131
-#: src/wx-console/console_conf.c:137
+#: src/wx-console/console_conf.c:141
 #, c-format
 msgid "Director: name=%s address=%s DIRport=%d\n"
 msgstr ""
@@ -861,25 +807,25 @@ msgstr ""
 #: src/filed/filed_conf.c:268 src/filed/filed_conf.c:327
 #: src/filed/filed_conf.c:357 src/gnome2-console/console_conf.c:142
 #: src/gnome2-console/console_conf.c:220 src/gnome2-console/console_conf.c:268
-#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:467
-#: src/stored/stored_conf.c:555 src/stored/stored_conf.c:590
-#: src/wx-console/console_conf.c:141 src/wx-console/console_conf.c:216
-#: src/wx-console/console_conf.c:261 src/wx-console/console_conf.c:288
+#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:510
+#: src/stored/stored_conf.c:598 src/stored/stored_conf.c:633
+#: src/wx-console/console_conf.c:145 src/wx-console/console_conf.c:220
+#: src/wx-console/console_conf.c:265 src/wx-console/console_conf.c:292
 #, c-format
 msgid "Unknown resource type %d\n"
 msgstr ""
 
-#: src/console/console_conf.c:242 src/dird/dird_conf.c:1109
-#: src/dird/dird_conf.c:1124 src/filed/filed_conf.c:296
+#: src/console/console_conf.c:242 src/dird/dird_conf.c:1112
+#: src/dird/dird_conf.c:1127 src/filed/filed_conf.c:296
 #: src/gnome2-console/console_conf.c:246 src/tray-monitor/tray_conf.c:262
-#: src/wx-console/console_conf.c:242
+#: src/wx-console/console_conf.c:246
 #, c-format
 msgid "%s item is required in %s resource, but not found.\n"
 msgstr ""
 
-#: src/console/console_conf.c:304 src/dird/dird_conf.c:1296
+#: src/console/console_conf.c:304 src/dird/dird_conf.c:1299
 #: src/filed/filed_conf.c:374 src/gnome2-console/console_conf.c:314
-#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:304
+#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:308
 #, c-format
 msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n"
 msgstr ""
@@ -889,7 +835,7 @@ msgstr ""
 msgid "Start Admin JobId %d, Job=%s\n"
 msgstr ""
 
-#: src/dird/admin.c:82 src/dird/backup.c:339 src/dird/mac.c:228
+#: src/dird/admin.c:82 src/dird/backup.c:372 src/dird/mac.c:280
 #, c-format
 msgid "Error getting job record for stats: %s"
 msgstr ""
@@ -906,15 +852,15 @@ msgstr ""
 msgid "Admin Canceled"
 msgstr ""
 
-#: src/dird/admin.c:102 src/dird/backup.c:451 src/dird/mac.c:330
-#: src/dird/restore.c:258
+#: src/dird/admin.c:102 src/dird/backup.c:423 src/dird/mac.c:382
+#: src/dird/restore.c:250
 #, c-format
 msgid "Inappropriate term code: %c\n"
 msgstr ""
 
 #: src/dird/admin.c:108
 msgid "Bacula "
-msgstr ""
+msgstr "Bacula "
 
 #: src/dird/admin.c:108
 #, c-format
@@ -940,7 +886,7 @@ msgstr ""
 
 #: src/dird/authenticate.c:95
 msgid ""
-"Unable to authenticate with Storage daemon. Possible causes:\n"
+"Director unable to authenticate with Storage daemon. Possible causes:\n"
 "Passwords or names not the same or\n"
 "Maximum Concurrent Jobs exceeded on the SD or\n"
 "SD networking messed up (restart daemon).\n"
@@ -949,8 +895,8 @@ msgid ""
 msgstr ""
 
 #: src/dird/authenticate.c:123 src/dird/authenticate.c:223
-#: src/dird/authenticate.c:356 src/filed/authenticate.c:141
-#: src/filed/authenticate.c:237 src/stored/authenticate.c:145
+#: src/dird/authenticate.c:356 src/filed/authenticate.c:136
+#: src/filed/authenticate.c:232 src/stored/authenticate.c:145
 #: src/stored/authenticate.c:249
 msgid "TLS negotiation failed.\n"
 msgstr ""
@@ -1039,84 +985,72 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:92
-#: src/dird/ua_output.c:609
+#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:124
+#: src/dird/ua_output.c:623
 #, c-format
 msgid "Pool %s not in database. %s"
 msgstr ""
 
-#: src/dird/backup.c:92 src/dird/mac.c:96 src/dird/ua_output.c:617
+#: src/dird/backup.c:92 src/dird/mac.c:128 src/dird/ua_output.c:631
 #, c-format
 msgid "Pool %s created in database.\n"
 msgstr ""
 
-#: src/dird/backup.c:117
+#: src/dird/backup.c:120
 msgid "Could not start clone job.\n"
 msgstr ""
 
-#: src/dird/backup.c:119
+#: src/dird/backup.c:122
 #, c-format
 msgid "Clone JobId %d started.\n"
 msgstr ""
 
-#: src/dird/backup.c:144
+#: src/dird/backup.c:148
 #, c-format
-msgid "Start Backup JobId %u, Job=%s\n"
+msgid "Start Backup JobId %s, Job=%s\n"
 msgstr ""
 
-#: src/dird/backup.c:272
+#: src/dird/backup.c:304
 #, c-format
 msgid "Unexpected Client Job message: %s\n"
 msgstr ""
 
-#: src/dird/backup.c:280
+#: src/dird/backup.c:312
 #, c-format
 msgid "Network error with FD during %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/backup.c:296
+#: src/dird/backup.c:328
 msgid "No Job status returned from FD.\n"
 msgstr ""
 
-#: src/dird/backup.c:346
+#: src/dird/backup.c:379
 #, c-format
 msgid "Error getting client record for stats: %s"
 msgstr ""
 
-#: src/dird/backup.c:352 src/dird/mac.c:235
+#: src/dird/backup.c:385 src/dird/mac.c:287
 #, c-format
 msgid "Error getting Media record for Volume \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/backup.c:380 src/dird/mac.c:263
-#, c-format
-msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
-msgstr ""
-
-#: src/dird/backup.c:414 src/dird/mac.c:293
-#, c-format
-msgid ""
-"Could not open WriteBootstrap file:\n"
-"%s: ERR=%s\n"
-msgstr ""
-
-#: src/dird/backup.c:424 src/dird/mac.c:303
+#: src/dird/backup.c:396 src/dird/mac.c:355
 msgid "Backup OK -- with warnings"
 msgstr ""
 
-#: src/dird/backup.c:426 src/dird/mac.c:305 src/stored/bscan.c:1054
+#: src/dird/backup.c:398 src/dird/mac.c:357 src/stored/bscan.c:1060
 msgid "Backup OK"
 msgstr ""
 
-#: src/dird/backup.c:431 src/dird/mac.c:310 src/stored/bscan.c:1058
+#: src/dird/backup.c:403 src/dird/mac.c:362 src/stored/bscan.c:1064
 msgid "*** Backup Error ***"
 msgstr ""
 
-#: src/dird/backup.c:441 src/dird/mac.c:320 src/stored/bscan.c:1061
+#: src/dird/backup.c:413 src/dird/mac.c:372 src/stored/bscan.c:1067
 msgid "Backup Canceled"
 msgstr ""
 
-#: src/dird/backup.c:491
+#: src/dird/backup.c:463
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -1130,17 +1064,18 @@ msgid ""
 "  Scheduled time:         %s\n"
 "  Start time:             %s\n"
 "  End time:               %s\n"
+"  Elapsed time:           %s\n"
 "  Priority:               %d\n"
 "  FD Files Written:       %s\n"
 "  SD Files Written:       %s\n"
-"  FD Bytes Written:       %s\n"
-"  SD Bytes Written:       %s\n"
+"  FD Bytes Written:       %s (%sB)\n"
+"  SD Bytes Written:       %s (%sB)\n"
 "  Rate:                   %.1f KB/s\n"
 "  Software Compression:   %s\n"
 "  Volume name(s):         %s\n"
 "  Volume Session Id:      %d\n"
 "  Volume Session Time:    %d\n"
-"  Last Volume Bytes:      %s\n"
+"  Last Volume Bytes:      %s (%sB)\n"
 "  Non-fatal FD errors:    %d\n"
 "  SD Errors:              %d\n"
 "  FD termination status:  %s\n"
@@ -1149,6 +1084,18 @@ msgid ""
 "\n"
 msgstr ""
 
+#: src/dird/backup.c:554 src/dird/mac.c:315
+#, c-format
+msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:588 src/dird/mac.c:345
+#, c-format
+msgid ""
+"Could not open WriteBootstrap file:\n"
+"%s: ERR=%s\n"
+msgstr ""
+
 #: src/dird/bsr.c:155
 #, c-format
 msgid "Unable to get Job record. ERR=%s\n"
@@ -1159,104 +1106,121 @@ msgstr ""
 msgid "Unable to get Job Volume Parameters. ERR=%s\n"
 msgstr ""
 
-#: src/dird/bsr.c:201
+#: src/dird/bsr.c:212
 #, c-format
 msgid "Unable to create bootstrap file %s. ERR=%s\n"
-msgstr ""
+msgstr "Impossible de créer le fichier bootstrap %s. ERR=%s\n"
 
-#: src/dird/bsr.c:210
+#: src/dird/bsr.c:221
 msgid "Error writing bsr file.\n"
-msgstr ""
+msgstr "Erreur pendant l'écriture du fichier bsr.\n"
 
-#: src/dird/bsr.c:216
+#: src/dird/bsr.c:227
 #, c-format
 msgid "Bootstrap records written to %s\n"
-msgstr ""
+msgstr "Fichier bootstrap Ã©crit sur %s\n"
 
-#: src/dird/bsr.c:220
+#: src/dird/bsr.c:231
 msgid "The job will require the following Volumes:\n"
-msgstr ""
+msgstr "Le job va utiliser les volumes suivants :\n"
 
-#: src/dird/bsr.c:235
+#: src/dird/bsr.c:263
 msgid "No Volumes found to restore.\n"
-msgstr ""
+msgstr "Aucun volume trouvé pour la restauration.\n"
 
-#: src/dird/catreq.c:109 src/dird/catreq.c:298
+#: src/dird/catreq.c:109 src/dird/catreq.c:295
 #, c-format
 msgid "1990 Invalid Catalog Request: %s"
-msgstr ""
+msgstr "1990 Requête sur le Catalogue Invalide : %s"
 
 #: src/dird/catreq.c:110
 #, c-format
 msgid "Invalid Catalog request; DB not open: %s"
-msgstr ""
+msgstr "Requête sur le Catalogue invalide ; la base n'est pas ouverte : %s"
 
-#: src/dird/catreq.c:131
+#: src/dird/catreq.c:133
 msgid "1901 No Media.\n"
-msgstr ""
+msgstr "1901 Pas de Media.\n"
 
-#: src/dird/catreq.c:159
+#: src/dird/catreq.c:161
 msgid "not in Pool"
-msgstr ""
+msgstr "non présent dans le Pool"
 
-#: src/dird/catreq.c:161
+#: src/dird/catreq.c:163
 msgid "not correct MediaType"
 msgstr ""
 
-#: src/dird/catreq.c:187
+#: src/dird/catreq.c:179
 #, c-format
 msgid "1998 Volume \"%s\" status is %s, %s.\n"
-msgstr ""
+msgstr "1998 Le statut du Volume Â«Â %s » est %s, %s.\n"
 
-#: src/dird/catreq.c:192
+#: src/dird/catreq.c:184
 #, c-format
 msgid "1997 Volume \"%s\" not in catalog.\n"
-msgstr ""
+msgstr "1997 le Volume Â«Â %s » n'est pas dans le catalogue.\n"
 
-#: src/dird/catreq.c:213
+#: src/dird/catreq.c:205
 #, c-format
 msgid "Unable to get Media record for Volume %s: ERR=%s\n"
 msgstr ""
+"Impossible de récupérer les informations du Media pour le Volume %s : ERR=%"
+"s\n"
 
-#: src/dird/catreq.c:215
+#: src/dird/catreq.c:207
 #, c-format
 msgid "1991 Catalog Request for vol=%s failed: %s"
 msgstr ""
 
-#: src/dird/catreq.c:235
+#: src/dird/catreq.c:227
 #, c-format
 msgid ""
 "Volume Files at %u being set to %u for Volume \"%s\". This is incorrect.\n"
 msgstr ""
 
-#: src/dird/catreq.c:238 src/dird/catreq.c:270
-msgid "1992 Update Media error\n"
+#: src/dird/catreq.c:230
+#, c-format
+msgid "1992 Update Media error. VolFiles=%u, CatFiles=%u\n"
 msgstr ""
 
-#: src/dird/catreq.c:268
+#: src/dird/catreq.c:262
 #, c-format
 msgid "Catalog error updating Media record. %s"
 msgstr ""
 
-#: src/dird/catreq.c:287
+#: src/dird/catreq.c:264
+msgid "1993 Update Media error\n"
+msgstr "1993 Erreur sur la mise Ã  jour du Media\n"
+
+#: src/dird/catreq.c:284
 #, c-format
 msgid "Catalog error creating JobMedia record. %s"
 msgstr ""
 
-#: src/dird/catreq.c:289
+#: src/dird/catreq.c:286
 msgid "1991 Update JobMedia error\n"
-msgstr ""
+msgstr "1991 Erreur sur la mise Ã  jour du JobMedia\n"
 
-#: src/dird/catreq.c:299
+#: src/dird/catreq.c:296
 #, c-format
 msgid "Invalid Catalog request: %s"
 msgstr ""
 
-#: src/dird/catreq.c:398
+#: src/dird/catreq.c:330
+#, c-format
+msgid "1991 Invalid Catalog Update: %s"
+msgstr ""
+
+#: src/dird/catreq.c:331
+#, c-format
+msgid "Invalid Catalog Update; DB not open: %s"
+msgstr ""
+
+#: src/dird/catreq.c:405
 msgid "Got MD5/SHA1 but not same File as attributes\n"
 msgstr ""
 
-#: src/dird/catreq.c:422
+#: src/dird/catreq.c:429
 #, c-format
 msgid "Catalog error updating MD5/SHA1. %s"
 msgstr ""
@@ -1281,6 +1245,26 @@ msgid ""
 "       -?          print this message.\n"
 "\n"
 msgstr ""
+"Copyright (C) 2000-2005 Kern Sibbald.\n"
+"\n"
+"Version : %s (%s)\n"
+"\n"
+"Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n"
+"      -c <fich>      utilise fich comme fichier de configuration\n"
+"      -dnn           positionne le niveau de debug Ã  nn\n"
+"      -f             reste en avant-plan (pour debugger)\n"
+"      -g             groupid\n"
+"      -r <job>       lance <job> maintenant\n"
+"      -s             pas de signaux\n"
+"      -t             test - lit seulement le fichier de configuration\n"
+"      -u             userid\n"
+"      -v             affiche les messages utilisateurs\n"
+"      -?             affiche ce message.\n"
+"\n"
+
+#: src/dird/dird.c:196 src/stored/stored.c:189
+msgid "Cryptography library initialization failed.\n"
+msgstr ""
 
 #: src/dird/dird.c:396
 msgid "Too many open reload requests. Request ignored.\n"
@@ -1311,17 +1295,17 @@ msgstr ""
 msgid "Only one Director resource permitted in %s\n"
 msgstr ""
 
-#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:362
+#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:363
 #, c-format
 msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:368
+#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:369
 #, c-format
 msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:374
+#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:375
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
@@ -1329,7 +1313,7 @@ msgid ""
 "using \"TLS Verify Peer\".\n"
 msgstr ""
 
-#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:393
+#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:394
 #, c-format
 msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n"
 msgstr ""
@@ -1353,16 +1337,16 @@ msgstr ""
 msgid "Too many items in Job resource\n"
 msgstr ""
 
-#: src/dird/dird.c:672 src/dird/job.c:101 src/dird/ua_cmds.c:1425
-#: src/dird/ua_output.c:598
+#: src/dird/dird.c:672 src/dird/job.c:104 src/dird/ua_cmds.c:1621
+#: src/dird/ua_output.c:612
 #, c-format
 msgid "Could not open database \"%s\".\n"
-msgstr ""
+msgstr "Impossible d'ouvrir la base de données Â«Â %s ».\n"
 
 #: src/dird/dird.c:675
 #, c-format
 msgid "%s"
-msgstr ""
+msgstr "%s"
 
 #: src/dird/dird.c:717
 #, c-format
@@ -1371,7 +1355,7 @@ msgid ""
 "Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:733 src/stored/stored.c:348
+#: src/dird/dird.c:733 src/stored/stored.c:349
 #, c-format
 msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n"
 msgstr ""
@@ -1406,55 +1390,55 @@ msgid ""
 "File daemon \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:441 src/tray-monitor/tray_conf.c:152
+#: src/dird/dird_conf.c:443 src/tray-monitor/tray_conf.c:152
 #, c-format
 msgid "No %s resource defined\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:450
+#: src/dird/dird_conf.c:452
 #, c-format
 msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:455
+#: src/dird/dird_conf.c:457
 #, c-format
 msgid "   query_file=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:458 src/dird/dird_conf.c:483 src/dird/dird_conf.c:497
-#: src/dird/dird_conf.c:541 src/dird/dird_conf.c:545 src/dird/dird_conf.c:549
-#: src/dird/dird_conf.c:573 src/dird/dird_conf.c:578 src/dird/dird_conf.c:582
-#: src/dird/dird_conf.c:586 src/dird/dird_conf.c:590 src/dird/dird_conf.c:594
-#: src/dird/dird_conf.c:604
+#: src/dird/dird_conf.c:460 src/dird/dird_conf.c:485 src/dird/dird_conf.c:499
+#: src/dird/dird_conf.c:544 src/dird/dird_conf.c:548 src/dird/dird_conf.c:552
+#: src/dird/dird_conf.c:576 src/dird/dird_conf.c:581 src/dird/dird_conf.c:585
+#: src/dird/dird_conf.c:589 src/dird/dird_conf.c:593 src/dird/dird_conf.c:597
+#: src/dird/dird_conf.c:607
 msgid "  --> "
 msgstr ""
 
-#: src/dird/dird_conf.c:464 src/dird/dird_conf.c:467
+#: src/dird/dird_conf.c:466 src/dird/dird_conf.c:469
 #, c-format
 msgid "Console: name=%s SSL=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:473
+#: src/dird/dird_conf.c:475
 #, c-format
 msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:478
+#: src/dird/dird_conf.c:480
 #, c-format
 msgid "Counter: name=%s min=%d max=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:489
+#: src/dird/dird_conf.c:491
 #, c-format
 msgid "Client: name=%s address=%s FDport=%d MaxJobs=%u\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:492
+#: src/dird/dird_conf.c:494
 #, c-format
 msgid "      JobRetention=%s FileRetention=%s AutoPrune=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:504
+#: src/dird/dird_conf.c:506
 #, c-format
 msgid ""
 "Device: name=%s ok=%d num_writers=%d max_writers=%d\n"
@@ -1463,245 +1447,252 @@ msgid ""
 "      poolid=%s volname=%s MediaType=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:514
+#: src/dird/dird_conf.c:516
 #, c-format
 msgid ""
 "Storage: name=%s address=%s SDport=%d MaxJobs=%u\n"
 "      DeviceName=%s MediaType=%s StorageId=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:523
+#: src/dird/dird_conf.c:525
 #, c-format
 msgid ""
 "Catalog: name=%s address=%s DBport=%d db_name=%s\n"
 "      db_user=%s MutliDBConn=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:531
+#: src/dird/dird_conf.c:533
 #, c-format
-msgid "%s: name=%s JobType=%d level=%s Priority=%d MaxJobs=%u\n"
+msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:532
+#: src/dird/dird_conf.c:534 src/dird/ua_cmds.c:441 src/dird/ua_prune.c:454
+#: src/dird/ua_run.c:643 src/dird/ua_select.c:234 src/dird/ua_select.c:257
+msgid "Job"
+msgstr "Job"
+
+#: src/dird/dird_conf.c:534
 msgid "JobDefs"
 msgstr ""
 
-#: src/dird/dird_conf.c:536
+#: src/dird/dird_conf.c:538
 #, c-format
-msgid "     Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%d\n"
+msgid ""
+"     MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%"
+"d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:553
+#: src/dird/dird_conf.c:556
 #, c-format
 msgid "  --> Where=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:556
+#: src/dird/dird_conf.c:559
 #, c-format
 msgid "  --> Bootstrap=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:559
+#: src/dird/dird_conf.c:562
 #, c-format
 msgid "  --> RunBefore=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:562
+#: src/dird/dird_conf.c:565
 #, c-format
 msgid "  --> RunAfter=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:565
+#: src/dird/dird_conf.c:568
 #, c-format
 msgid "  --> RunAfterFailed=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:568
+#: src/dird/dird_conf.c:571
 #, c-format
 msgid "  --> WriteBootstrap=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:600
+#: src/dird/dird_conf.c:603
 #, c-format
 msgid "  --> Run=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:611
+#: src/dird/dird_conf.c:614
 #, c-format
 msgid "FileSet: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:673 src/dird/dird_conf.c:752
+#: src/dird/dird_conf.c:676 src/dird/dird_conf.c:755
 #, c-format
 msgid "Schedule: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:678
+#: src/dird/dird_conf.c:681
 #, c-format
 msgid "  --> Run Level=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:679
+#: src/dird/dird_conf.c:682
 msgid "      hour="
 msgstr ""
 
-#: src/dird/dird_conf.c:688
+#: src/dird/dird_conf.c:691
 msgid "      mday="
 msgstr ""
 
-#: src/dird/dird_conf.c:697
+#: src/dird/dird_conf.c:700
 msgid "      month="
 msgstr ""
 
-#: src/dird/dird_conf.c:706
+#: src/dird/dird_conf.c:709
 msgid "      wday="
 msgstr ""
 
-#: src/dird/dird_conf.c:715
+#: src/dird/dird_conf.c:718
 msgid "      wom="
 msgstr ""
 
-#: src/dird/dird_conf.c:724
+#: src/dird/dird_conf.c:727
 msgid "      woy="
 msgstr ""
 
-#: src/dird/dird_conf.c:733
+#: src/dird/dird_conf.c:736
 #, c-format
 msgid "      mins=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:735 src/dird/dird_conf.c:739 src/dird/dird_conf.c:743
+#: src/dird/dird_conf.c:738 src/dird/dird_conf.c:742 src/dird/dird_conf.c:746
 msgid "     --> "
 msgstr ""
 
-#: src/dird/dird_conf.c:756
+#: src/dird/dird_conf.c:759
 #, c-format
 msgid "Pool: name=%s PoolType=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:758
+#: src/dird/dird_conf.c:761
 #, c-format
 msgid "      use_cat=%d use_once=%d acpt_any=%d cat_files=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:761
+#: src/dird/dird_conf.c:764
 #, c-format
 msgid "      max_vols=%d auto_prune=%d VolRetention=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:764
+#: src/dird/dird_conf.c:767
 #, c-format
 msgid "      VolUse=%s recycle=%d LabelFormat=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:768
+#: src/dird/dird_conf.c:771
 #, c-format
 msgid "      CleaningPrefix=%s LabelType=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:770
+#: src/dird/dird_conf.c:773
 #, c-format
 msgid "      RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:776
+#: src/dird/dird_conf.c:779
 #, c-format
 msgid "Messages: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:778
+#: src/dird/dird_conf.c:781
 #, c-format
 msgid "      mailcmd=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:780
+#: src/dird/dird_conf.c:783
 #, c-format
 msgid "      opcmd=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:783 src/tray-monitor/tray_conf.c:179
+#: src/dird/dird_conf.c:786 src/tray-monitor/tray_conf.c:179
 #, c-format
 msgid "Unknown resource type %d in dump_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1077 src/tray-monitor/tray_conf.c:232
+#: src/dird/dird_conf.c:1080 src/tray-monitor/tray_conf.c:232
 #, c-format
 msgid "Unknown resource type %d in free_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1115 src/lib/parse_conf.c:211
+#: src/dird/dird_conf.c:1118 src/lib/parse_conf.c:211
 #: src/tray-monitor/tray_conf.c:268
 #, c-format
 msgid "Too many items in %s resource\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1149
+#: src/dird/dird_conf.c:1152
 #, c-format
 msgid "Cannot find Console resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1155 src/filed/filed_conf.c:316
-#: src/stored/stored_conf.c:523
+#: src/dird/dird_conf.c:1158 src/filed/filed_conf.c:316
+#: src/stored/stored_conf.c:566
 #, c-format
 msgid "Cannot find Director resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1162 src/stored/stored_conf.c:529
+#: src/dird/dird_conf.c:1165 src/stored/stored_conf.c:572
 #, c-format
 msgid "Cannot find Storage resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1171
+#: src/dird/dird_conf.c:1174
 #, c-format
 msgid "Cannot find Job resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1189
+#: src/dird/dird_conf.c:1192
 #, c-format
 msgid "Cannot find Counter resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1197 src/filed/filed_conf.c:322
+#: src/dird/dird_conf.c:1200 src/filed/filed_conf.c:322
 #, c-format
 msgid "Cannot find Client resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1209
+#: src/dird/dird_conf.c:1212
 #, c-format
 msgid "Cannot find Schedule resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1214 src/tray-monitor/tray_conf.c:287
+#: src/dird/dird_conf.c:1217 src/tray-monitor/tray_conf.c:287
 #, c-format
 msgid "Unknown resource type %d in save_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1274 src/tray-monitor/tray_conf.c:322
+#: src/dird/dird_conf.c:1277 src/tray-monitor/tray_conf.c:322
 #, c-format
 msgid "Unknown resource type %d in save_resrouce.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1289
+#: src/dird/dird_conf.c:1292
 #, c-format
 msgid "Name item is required in %s resource, but not found.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1301
+#: src/dird/dird_conf.c:1304
 #, c-format
 msgid "Inserting %s res: %s index=%d pass=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1374
+#: src/dird/dird_conf.c:1377
 #, c-format
 msgid "Expected a Job Type keyword, got: %s"
 msgstr ""
 
-#: src/dird/dird_conf.c:1398
+#: src/dird/dird_conf.c:1401
 #, c-format
 msgid "Expected a Job Level keyword, got: %s"
 msgstr ""
 
-#: src/dird/dird_conf.c:1418
+#: src/dird/dird_conf.c:1421
 #, c-format
 msgid "Expected a Restore replacement option, got: %s"
 msgstr ""
@@ -1741,174 +1732,179 @@ msgstr ""
 msgid "Cannot destroy var context: ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:73 src/tray-monitor/tray-monitor.c:867
+#: src/dird/fd_cmds.c:74 src/tray-monitor/tray-monitor.c:867
 msgid "File daemon"
 msgstr ""
 
-#: src/dird/fd_cmds.c:104
+#: src/dird/fd_cmds.c:105
 #, c-format
 msgid "File daemon \"%s\" rejected Job command: %s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:117
+#: src/dird/fd_cmds.c:118
 #, c-format
 msgid "Error updating Client record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:122
+#: src/dird/fd_cmds.c:123
 #, c-format
 msgid "FD gave bad response to JobId command: %s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:144 src/dird/fd_cmds.c:180
+#: src/dird/fd_cmds.c:145 src/dird/fd_cmds.c:181
 msgid ", since="
-msgstr ""
+msgstr ", depuis="
 
-#: src/dird/fd_cmds.c:164
+#: src/dird/fd_cmds.c:165
 msgid "No prior or suitable Full backup found. Doing FULL backup.\n"
-msgstr ""
+msgstr "Pas de précédent backup Full utilisable. Lancement d'un backup FULL.\n"
 
-#: src/dird/fd_cmds.c:165 src/dird/fd_cmds.c:173
+#: src/dird/fd_cmds.c:166 src/dird/fd_cmds.c:174
 #, c-format
 msgid " (upgraded from %s)"
 msgstr ""
 
-#: src/dird/fd_cmds.c:171
+#: src/dird/fd_cmds.c:172
 #, c-format
 msgid "Prior failed job found. Upgrading to %s.\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:196
+#: src/dird/fd_cmds.c:197
 msgid "since_utime "
 msgstr ""
 
-#: src/dird/fd_cmds.c:232
+#: src/dird/fd_cmds.c:233
 #, c-format
 msgid "Unimplemented backup level %d %c\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:320 src/filed/job.c:565
+#: src/dird/fd_cmds.c:321 src/filed/job.c:559
 #, c-format
 msgid "Cannot run program: %s. ERR=%s\n"
-msgstr ""
+msgstr "Impossible de lancer la commande : %s. ERR=%s\n"
 
-#: src/dird/fd_cmds.c:331 src/dird/fd_cmds.c:356 src/dird/fd_cmds.c:370
+#: src/dird/fd_cmds.c:332 src/dird/fd_cmds.c:357 src/dird/fd_cmds.c:371
 msgid ">filed: write error on socket\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:337
+#: src/dird/fd_cmds.c:338
 #, c-format
 msgid "Error running program: %s. ERR=%s\n"
-msgstr ""
+msgstr "Erreur dans l'exécution de la commande : %s. ERR=%s\n"
 
-#: src/dird/fd_cmds.c:346
+#: src/dird/fd_cmds.c:347
 #, c-format
 msgid "Cannot open included file: %s. ERR=%s\n"
-msgstr ""
+msgstr "Impossible d'ouvrir le fichier inclus : %s. ERR=%s\n"
 
-#: src/dird/fd_cmds.c:441 src/filed/job.c:1617
+#: src/dird/fd_cmds.c:442 src/filed/job.c:1637
 #, c-format
 msgid "Could not open bootstrap file %s: ERR=%s\n"
-msgstr ""
+msgstr "Impossible d'ouvrir le fichier bootstrap %s : ERR=%s\n"
 
-#: src/dird/fd_cmds.c:526
+#: src/dird/fd_cmds.c:527
 #, c-format
 msgid ""
 "<filed: bad attributes, expected 3 fields got %d\n"
 "msglen=%d msg=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:571 src/dird/verify.c:696
+#: src/dird/fd_cmds.c:572 src/dird/verify.c:697
 #, c-format
 msgid "MD5/SHA1 index %d not same as attributes %d\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:588
+#: src/dird/fd_cmds.c:589
 #, c-format
 msgid "<filed: Network error getting attributes. ERR=%s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:135
+#: src/dird/getmsg.c:130
 #, c-format
 msgid "bget_dirmsg: unknown bnet signal %d\n"
-msgstr ""
+msgstr "bget_dirmsg : signal bnet inconnu %d\n"
 
-#: src/dird/getmsg.c:153 src/dird/getmsg.c:166 src/dird/getmsg.c:178
-#: src/dird/getmsg.c:225 src/dird/getmsg.c:249
+#: src/dird/getmsg.c:148 src/dird/getmsg.c:161 src/dird/getmsg.c:173
+#: src/dird/getmsg.c:220 src/dird/getmsg.c:244
 #, c-format
 msgid "Malformed message: %s\n"
-msgstr ""
+msgstr "Message mal formé : %s\n"
 
-#: src/dird/getmsg.c:159
+#: src/dird/getmsg.c:154
 #, c-format
 msgid "Job not found: %s\n"
-msgstr ""
+msgstr "Job non trouvé : %s\n"
 
-#: src/dird/getmsg.c:318
+#: src/dird/getmsg.c:313
 #, c-format
 msgid "Bad response to %s command: wanted %s, got %s\n"
-msgstr ""
+msgstr "Mauvaise réponse Ã  la commande %s : voulait %s, pas %s\n"
 
-#: src/dird/getmsg.c:323
+#: src/dird/getmsg.c:318
 #, c-format
 msgid "Socket error on %s command: ERR=%s\n"
-msgstr ""
+msgstr "Erreur de socket sur la commande %s : ERR=%s\n"
 
-#: src/dird/inc_conf.c:249
+#: src/dird/inc_conf.c:251
 #, c-format
 msgid "Expected a FileSet option keyword, got:%s:"
 msgstr ""
 
-#: src/dird/inc_conf.c:282
+#: src/dird/inc_conf.c:284
 msgid "Old style Include/Exclude not supported\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:310 src/dird/inc_conf.c:577
+#: src/dird/inc_conf.c:312 src/dird/inc_conf.c:584
 #, c-format
 msgid "Expecting keyword, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:318 src/dird/inc_conf.c:583 src/lib/parse_conf.c:819
+#: src/dird/inc_conf.c:320 src/dird/inc_conf.c:590 src/lib/parse_conf.c:819
 #, c-format
 msgid "expected an equals, got: %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:328 src/dird/inc_conf.c:592
+#: src/dird/inc_conf.c:330 src/dird/inc_conf.c:599
 #, c-format
 msgid "Keyword %s not permitted in this resource"
 msgstr ""
 
-#: src/dird/inc_conf.c:381
+#: src/dird/inc_conf.c:383
 #, c-format
 msgid "Regex compile error. ERR=%s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:402
+#: src/dird/inc_conf.c:404
 #, c-format
 msgid "Expected a regex string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:488
+#: src/dird/inc_conf.c:490
 #, c-format
 msgid "Expected a wild-card string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:511
+#: src/dird/inc_conf.c:513
 #, c-format
 msgid "Expected an fstype string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:546
+#: src/dird/inc_conf.c:537
+#, c-format
+msgid "Backslash found. Use forward slashes or quote the string.: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:552
 #, c-format
 msgid "Expected a filename, got: %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:562
+#: src/dird/inc_conf.c:569
 #, c-format
 msgid "Expecting open brace. Got %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:617
+#: src/dird/inc_conf.c:624
 #, c-format
 msgid "Expected a FileSet keyword, got: %s"
 msgstr ""
@@ -1918,159 +1914,174 @@ msgstr ""
 msgid "Could not init job queue: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:488
+#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:449
 #, c-format
 msgid "Unable to init job cond variable: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:139
+#: src/dird/job.c:140
 #, c-format
 msgid "Could not add job queue: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:178
+#: src/dird/job.c:177
 msgid "Job canceled because max start delay time exceeded.\n"
 msgstr ""
 
-#: src/dird/job.c:229 src/dird/job.c:307
+#: src/dird/job.c:228 src/dird/job.c:321
 #, c-format
 msgid "Unimplemented job type: %d\n"
 msgstr ""
 
-#: src/dird/job.c:254
+#: src/dird/job.c:253
 #, c-format
 msgid "RunBefore: %s"
 msgstr ""
 
-#: src/dird/job.c:259
+#: src/dird/job.c:258
 #, c-format
 msgid "RunBeforeJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:325
+#: src/dird/job.c:339
 #, c-format
 msgid "RunAfter: %s"
 msgstr ""
 
-#: src/dird/job.c:335
+#: src/dird/job.c:349
 #, c-format
 msgid "RunAfterJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:337
+#: src/dird/job.c:351
 #, c-format
 msgid "RunAfterFailedJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:376
+#: src/dird/job.c:390
 #, c-format
 msgid "JobId %d, Job %s marked to be canceled.\n"
-msgstr ""
+msgstr "JobId %d, Job %s marqué pour Ãªtre annulé.\n"
 
-#: src/dird/job.c:387
+#: src/dird/job.c:401
 msgid "Failed to connect to File daemon.\n"
-msgstr ""
+msgstr "Impossible de se connecter au client.\n"
 
-#: src/dird/job.c:409 src/dird/ua_cmds.c:619 src/dird/ua_cmds.c:1266
-#: src/dird/ua_label.c:691
+#: src/dird/job.c:423 src/dird/ua_cmds.c:680 src/dird/ua_cmds.c:1327
+#: src/dird/ua_label.c:712
 msgid "Failed to connect to Storage daemon.\n"
-msgstr ""
+msgstr "Impossible de se connecter au Storage daemon.\n"
 
-#: src/dird/job.c:545 src/dird/job.c:593
+#: src/dird/job.c:557 src/dird/job.c:605
 #, c-format
 msgid "Unhandled job status code %d\n"
 msgstr ""
 
-#: src/dird/job.c:621 src/stored/bscan.c:902
+#: src/dird/job.c:633 src/stored/bscan.c:908
 #, c-format
 msgid "Could not create Client record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:653
+#: src/dird/job.c:665
 msgid "FileSet MD5 signature not found.\n"
 msgstr ""
 
-#: src/dird/job.c:658
+#: src/dird/job.c:670
 #, c-format
 msgid "Could not create FileSet \"%s\" record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:697
+#: src/dird/job.c:709
 #, c-format
 msgid "Error updating job record. %s"
 msgstr ""
 
-#: src/dird/jobq.c:67
+#: src/dird/jobq.c:62
 #, c-format
 msgid "pthread_attr_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:76
+#: src/dird/jobq.c:71
 #, c-format
 msgid "pthread_mutex_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:82
+#: src/dird/jobq.c:77
 #, c-format
 msgid "pthread_cond_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:115 src/dird/jobq.c:242 src/dird/jobq.c:307
-#: src/dird/jobq.c:388
+#: src/dird/jobq.c:110 src/dird/jobq.c:234 src/dird/jobq.c:299
+#: src/dird/jobq.c:380
 #, c-format
 msgid "pthread_mutex_lock: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:128
+#: src/dird/jobq.c:123
 #, c-format
 msgid "pthread_cond_broadcast: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:136
+#: src/dird/jobq.c:131
 #, c-format
 msgid "pthread_cond_wait: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:144
+#: src/dird/jobq.c:139
 #, c-format
 msgid "pthread_mutex_unlock: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:180
+#: src/dird/jobq.c:175
 #, c-format
 msgid "Job %s waiting %d seconds for scheduled start time.\n"
 msgstr ""
 
-#: src/dird/jobq.c:235
+#: src/dird/jobq.c:227
 #, c-format
 msgid "pthread_thread_create: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:353
+#: src/dird/jobq.c:345
 #, c-format
 msgid "pthread_cond_signal: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:362
+#: src/dird/jobq.c:354
 #, c-format
 msgid "pthread_create: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:487
+#: src/dird/jobq.c:481
 #, c-format
 msgid "Rescheduled Job %s at %s to re-run in %d seconds.\n"
 msgstr ""
 
-#: src/dird/mac.c:59 src/dird/verify.c:92
+#: src/dird/mac.c:77 src/dird/verify.c:92
 msgid "Unable to find JobId of previous Job for this client.\n"
+msgstr "Impossible de trouver JobId d'un précédent Job pour ce client.\n"
+
+#: src/dird/mac.c:85 src/dird/verify.c:108
+#, c-format
+msgid "Could not get job record for previous Job. ERR=%s"
 msgstr ""
 
-#: src/dird/mac.c:133
+#: src/dird/mac.c:90 src/dird/verify.c:113
 #, c-format
-msgid "Start %s JobId %u, Job=%s\n"
+msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
 msgstr ""
 
-#: src/dird/mac.c:369
+#: src/dird/mac.c:94
+#, fuzzy, c-format
+msgid "%s using JobId=%d Job=%s\n"
+msgstr "JobId=%s Job=%s"
+
+#: src/dird/mac.c:185
+#, fuzzy, c-format
+msgid "Start %s JobId %s, Job=%s\n"
+msgstr "JobId=%s Job=%s"
+
+#: src/dird/mac.c:421
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -2100,22 +2111,22 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/msgchan.c:78 src/filed/job.c:1128
+#: src/dird/msgchan.c:80 src/filed/job.c:1125
 #: src/tray-monitor/tray-monitor.c:874
 msgid "Storage daemon"
 msgstr ""
 
-#: src/dird/msgchan.c:157
+#: src/dird/msgchan.c:171
 #, c-format
 msgid "Storage daemon rejected Job command: %s\n"
 msgstr ""
 
-#: src/dird/msgchan.c:164
+#: src/dird/msgchan.c:178
 #, c-format
 msgid "<stored: bad response to Job command: %s\n"
 msgstr ""
 
-#: src/dird/msgchan.c:211
+#: src/dird/msgchan.c:262
 #, c-format
 msgid ""
 "\n"
@@ -2123,7 +2134,14 @@ msgid ""
 "     %s"
 msgstr ""
 
-#: src/dird/msgchan.c:241 src/dird/msgchan.c:382
+#: src/dird/msgchan.c:266
+#, c-format
+msgid ""
+"\n"
+"     Storage daemon didn't accept Device \"%s\" command.\n"
+msgstr ""
+
+#: src/dird/msgchan.c:289 src/dird/msgchan.c:434
 #, c-format
 msgid "Cannot create message thread: %s\n"
 msgstr ""
@@ -2147,89 +2165,141 @@ msgstr ""
 msgid "Too many failures. Giving up creating Volume name.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:124
-#, c-format
-msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
-msgstr ""
-
-#: src/dird/next_vol.c:150
+#: src/dird/next_vol.c:128
 #, c-format
 msgid "Purging oldest volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:156
+#: src/dird/next_vol.c:134
 #, c-format
 msgid "Pruning oldest volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:175
+#: src/dird/next_vol.c:153
 msgid "We seem to be looping trying to find the next volume. I give up.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:200
+#: src/dird/next_vol.c:178
 #, c-format
 msgid "Max Volume bytes exceeded. Marking Volume \"%s\" as Full.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:207
+#: src/dird/next_vol.c:185
 #, c-format
 msgid "Volume used once. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:214
+#: src/dird/next_vol.c:192
 #, c-format
 msgid "Max Volume jobs exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:221
+#: src/dird/next_vol.c:199
 #, c-format
 msgid "Max Volume files exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:231
+#: src/dird/next_vol.c:209
 #, c-format
 msgid "Max configured use duration exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:241
+#: src/dird/next_vol.c:219
 #, c-format
 msgid "Catalog error updating volume \"%s\". ERR=%s"
 msgstr ""
 
-#: src/dird/next_vol.c:262
+#: src/dird/next_vol.c:240
 msgid "volume has expired"
 msgstr ""
 
-#: src/dird/next_vol.c:280 src/dird/next_vol.c:316
+#: src/dird/next_vol.c:258 src/dird/next_vol.c:294
 #, c-format
 msgid "Recycled current volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:285
+#: src/dird/next_vol.c:263
 msgid "and recycling of current volume failed"
 msgstr ""
 
-#: src/dird/next_vol.c:291
+#: src/dird/next_vol.c:269
 msgid "but should be Append, Purged or Recycle"
 msgstr ""
 
-#: src/dird/next_vol.c:319
+#: src/dird/next_vol.c:297
 msgid ""
 "but should be Append, Purged or Recycle (recycling of the current volume "
 "failed)"
 msgstr ""
 
-#: src/dird/next_vol.c:323
+#: src/dird/next_vol.c:301
 msgid ""
 "but should be Append, Purged or Recycle (cannot automatically recycle "
-"current volume, as it still contains unpruned data)"
+"current volume, as it still contains unpruned data or the Volume Retention "
+"time has not expired.)"
 msgstr ""
 
-#: src/dird/recycle.c:102
+#: src/dird/next_vol.c:342
 #, c-format
-msgid "Recycled volume \"%s\"\n"
+msgid "Unable to get Pool record: ERR=%s"
+msgstr ""
+
+#: src/dird/next_vol.c:347
+#, c-format
+msgid "Unable add Scratch Volume, Pool \"%s\" full MaxVols=%d\n"
+msgstr ""
+
+#: src/dird/next_vol.c:360
+#, c-format
+msgid "Failed to move Scratch Volume. ERR=%s\n"
+msgstr "Impossible de déplacer un Volume du Scratch. ERR=%s\n"
+
+#: src/dird/next_vol.c:364
+#, c-format
+msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
+msgstr "Utilisation du Volume Â«Â %s » du pool Â«Â Scratch ».\n"
+
+#: src/dird/next_vol.c:372
+#, c-format
+msgid "Unable to update Volume record: ERR=%s"
+msgstr "Impossible de mettre Ã  jour les informations du Volume : ERR=%s"
+
+#: src/dird/pythondir.c:107 src/filed/pythonfd.c:96 src/filed/pythonfd.c:150
+#: src/filed/pythonfd.c:214 src/stored/pythonsd.c:90 src/stored/pythonsd.c:155
+msgid "Job pointer not found."
+msgstr ""
+
+#: src/dird/pythondir.c:139
+msgid "Pool record not found."
+msgstr ""
+
+#: src/dird/pythondir.c:168 src/filed/pythonfd.c:127 src/stored/pythonsd.c:132
+#, c-format
+msgid "Attribute %s not found."
+msgstr "Attribut %s non trouvé."
+
+#: src/dird/pythondir.c:211 src/dird/pythondir.c:217 src/filed/pythonfd.c:169
+#: src/stored/pythonsd.c:172
+msgid "Read-only attribute"
+msgstr ""
+
+#: src/dird/pythondir.c:243
+msgid "Priority must be 1-100"
+msgstr ""
+
+#: src/dird/pythondir.c:248
+msgid "Job Level can be set only during JobInit"
+msgstr ""
+
+#: src/dird/pythondir.c:259
+msgid "Bad JobLevel string"
 msgstr ""
 
+#: src/dird/recycle.c:99
+#, c-format
+msgid "Recycled volume \"%s\"\n"
+msgstr "Volume recyclé Â«Â %s »\n"
+
 #: src/dird/restore.c:70
 msgid "Cannot restore without bootstrap file.\n"
 msgstr ""
@@ -2239,23 +2309,23 @@ msgstr ""
 msgid "Start Restore Job %s\n"
 msgstr ""
 
-#: src/dird/restore.c:231
+#: src/dird/restore.c:223
 msgid "Restore OK -- warning file count mismatch"
 msgstr ""
 
-#: src/dird/restore.c:233
+#: src/dird/restore.c:225
 msgid "Restore OK"
 msgstr ""
 
-#: src/dird/restore.c:238
+#: src/dird/restore.c:230
 msgid "*** Restore Error ***"
 msgstr ""
 
-#: src/dird/restore.c:248
+#: src/dird/restore.c:240
 msgid "Restore Canceled"
 msgstr ""
 
-#: src/dird/restore.c:275
+#: src/dird/restore.c:267
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -2363,17 +2433,17 @@ msgstr ""
 #: src/dird/scheduler.c:80
 #, c-format
 msgid "Job %s not found\n"
-msgstr ""
+msgstr "Job %s non trouvé\n"
 
-#: src/dird/scheduler.c:102
+#: src/dird/scheduler.c:103
 msgid "Walk queue"
 msgstr ""
 
-#: src/dird/scheduler.c:112
+#: src/dird/scheduler.c:113
 msgid "Dequeued job"
 msgstr ""
 
-#: src/dird/scheduler.c:115
+#: src/dird/scheduler.c:116
 msgid "Scheduler logic error\n"
 msgstr ""
 
@@ -2381,170 +2451,180 @@ msgstr ""
 msgid "Run job"
 msgstr ""
 
-#: src/dird/scheduler.c:345
+#: src/dird/scheduler.c:349
 msgid "Inserted job"
 msgstr ""
 
-#: src/dird/scheduler.c:353
+#: src/dird/scheduler.c:357
 msgid "Appended job"
 msgstr ""
 
-#: src/dird/scheduler.c:357
+#: src/dird/scheduler.c:361
 msgid "Run queue"
 msgstr ""
 
-#: src/dird/ua_cmds.c:88
+#: src/dird/ua_cmds.c:90
 msgid "add media to a pool"
-msgstr ""
+msgstr "ajouter un média dans un pool"
 
-#: src/dird/ua_cmds.c:89
+#: src/dird/ua_cmds.c:91
 msgid "autodisplay [on|off] -- console messages"
-msgstr ""
+msgstr "autodisplay [on|off] -- messages de la console"
 
-#: src/dird/ua_cmds.c:90
+#: src/dird/ua_cmds.c:92
 msgid "automount [on|off] -- after label"
 msgstr ""
 
-#: src/dird/ua_cmds.c:91
+#: src/dird/ua_cmds.c:93
 msgid "cancel [<jobid=nnn> | <job=name>] -- cancel a job"
-msgstr ""
+msgstr "cancel [<jobid=nnn> | <job=name>] -- annulation d'un job"
 
-#: src/dird/ua_cmds.c:92
+#: src/dird/ua_cmds.c:94
 msgid "create DB Pool from resource"
 msgstr ""
 
-#: src/dird/ua_cmds.c:93
+#: src/dird/ua_cmds.c:95
 msgid "delete [pool=<pool-name> | media volume=<volume-name>]"
-msgstr ""
+msgstr "delete [pool=<pool-name> | media volume=<volume-name>]"
 
-#: src/dird/ua_cmds.c:94
+#: src/dird/ua_cmds.c:96
+msgid "disable <job=name> -- disable a job"
+msgstr "disable <job=name> -- désactive un job"
+
+#: src/dird/ua_cmds.c:97
+msgid "enable <job=name> -- enable a job"
+msgstr "enable <job=name> -- active un job"
+
+#: src/dird/ua_cmds.c:98
 msgid "performs FileSet estimate, listing gives full listing"
 msgstr ""
 
-#: src/dird/ua_cmds.c:96
+#: src/dird/ua_cmds.c:100
 msgid "gui [on|off] -- non-interactive gui mode"
 msgstr ""
 
-#: src/dird/ua_cmds.c:97 src/stored/btape.c:2533
+#: src/dird/ua_cmds.c:101 src/stored/btape.c:2540
 msgid "print this command"
-msgstr ""
+msgstr "affiche cette commande"
 
-#: src/dird/ua_cmds.c:98
+#: src/dird/ua_cmds.c:102
 msgid ""
 "list [pools | jobs | jobtotals | media <pool=pool-name> | files <jobid=nn>]; "
 "from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:99
+#: src/dird/ua_cmds.c:103
 msgid "label a tape"
-msgstr ""
+msgstr "labéliser une bande"
 
-#: src/dird/ua_cmds.c:100
+#: src/dird/ua_cmds.c:104
 msgid "full or long list like list command"
 msgstr ""
 
-#: src/dird/ua_cmds.c:101
+#: src/dird/ua_cmds.c:105
 msgid "messages"
 msgstr ""
 
-#: src/dird/ua_cmds.c:102
+#: src/dird/ua_cmds.c:106
 msgid "mount <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:103
+#: src/dird/ua_cmds.c:107
 msgid "prune expired records from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:104
+#: src/dird/ua_cmds.c:108
 msgid "purge records from catalog"
-msgstr ""
+msgstr "purge les enregistrements du catalogue"
 
-#: src/dird/ua_cmds.c:105
+#: src/dird/ua_cmds.c:109
 msgid "python control commands"
 msgstr ""
 
-#: src/dird/ua_cmds.c:107
+#: src/dird/ua_cmds.c:111
 msgid "query catalog"
-msgstr ""
+msgstr "interroger le catalogue"
 
-#: src/dird/ua_cmds.c:108
+#: src/dird/ua_cmds.c:112
 msgid "restore files"
-msgstr ""
+msgstr "restauration de fichier"
 
-#: src/dird/ua_cmds.c:109
+#: src/dird/ua_cmds.c:113
 msgid "relabel a tape"
-msgstr ""
+msgstr "re-labélise une bande"
 
-#: src/dird/ua_cmds.c:110
+#: src/dird/ua_cmds.c:114
 msgid "release <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:111
+#: src/dird/ua_cmds.c:115
 msgid "reload conf file"
-msgstr ""
+msgstr "recharge la configuration"
 
-#: src/dird/ua_cmds.c:112
+#: src/dird/ua_cmds.c:116
 msgid "run <job-name>"
-msgstr ""
+msgstr "run <nom-job> -- lance un job"
 
-#: src/dird/ua_cmds.c:113
+#: src/dird/ua_cmds.c:117
 msgid "status [storage | client]=<name>"
-msgstr ""
+msgstr "status [storage | client]=<name> -- affiche le statut d'un composant"
 
-#: src/dird/ua_cmds.c:114
+#: src/dird/ua_cmds.c:118
 msgid "sets debug level"
-msgstr ""
+msgstr "positionne le niveau de debug"
 
-#: src/dird/ua_cmds.c:115
+#: src/dird/ua_cmds.c:119
 msgid "sets new client address -- if authorized"
 msgstr ""
 
-#: src/dird/ua_cmds.c:116
+#: src/dird/ua_cmds.c:120
 msgid "show (resource records) [jobs | pools | ... | all]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:117
+#: src/dird/ua_cmds.c:121
 msgid "use SQL to query catalog"
-msgstr ""
+msgstr "passer des commandes SQL pour interroger le catalogue"
 
-#: src/dird/ua_cmds.c:119
+#: src/dird/ua_cmds.c:123
 msgid "turn on/off trace to file"
-msgstr ""
+msgstr "active/désactive le fichier de trace"
 
-#: src/dird/ua_cmds.c:120
+#: src/dird/ua_cmds.c:124
 msgid "unmount <storage-name>"
-msgstr ""
+msgstr "unmount <nom-storage> -- démonte un lecteur"
 
-#: src/dird/ua_cmds.c:121
+#: src/dird/ua_cmds.c:125
 msgid "umount <storage-name> for old-time Unix guys"
-msgstr ""
+msgstr "umount <nom-storage> -- démonte un lecteur"
 
-#: src/dird/ua_cmds.c:122
+#: src/dird/ua_cmds.c:126
 msgid "update Volume, Pool or slots"
 msgstr ""
 
-#: src/dird/ua_cmds.c:123
+#: src/dird/ua_cmds.c:127
 msgid "use catalog xxx"
-msgstr ""
+msgstr "utilise le catalogue xxx"
 
-#: src/dird/ua_cmds.c:124
+#: src/dird/ua_cmds.c:128
 msgid "does variable expansion"
 msgstr ""
 
-#: src/dird/ua_cmds.c:125
+#: src/dird/ua_cmds.c:129
 msgid "print Director version"
-msgstr ""
+msgstr "affiche la version du Director"
 
-#: src/dird/ua_cmds.c:126
-msgid "wait until no jobs are running"
+#: src/dird/ua_cmds.c:130
+msgid ""
+"wait until no jobs are running [<jobname=name> | <jobid=nnn> | "
+"<ujobid=complete_name>]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:158
+#: src/dird/ua_cmds.c:168
 #, c-format
 msgid "%s: is an illegal command.\n"
-msgstr ""
+msgstr "%s : est une commande invalide.\n"
 
-#: src/dird/ua_cmds.c:196
+#: src/dird/ua_cmds.c:206
 msgid ""
 "You probably don't want to be using this command since it\n"
 "creates database records without labeling the Volumes.\n"
@@ -2552,279 +2632,322 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:215
+#: src/dird/ua_cmds.c:225
 #, c-format
-msgid "Pool already has maximum volumes = %d\n"
+msgid "Pool already has maximum volumes=%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:217
+#: src/dird/ua_cmds.c:227
 msgid "Enter new maximum (zero for unlimited): "
-msgstr ""
+msgstr "Entrez le nouveau maximum (zéro pour illimité) : "
 
-#: src/dird/ua_cmds.c:238
+#: src/dird/ua_cmds.c:248
 #, c-format
 msgid "Enter number of Volumes to create. 0=>fixed name. Max=%d: "
-msgstr ""
+msgstr "Entrez le nombre de Volume Ã  créer. 0=>nom fixé. Max=%d : "
 
-#: src/dird/ua_cmds.c:244
+#: src/dird/ua_cmds.c:254
 #, c-format
 msgid "The number must be between 0 and %d\n"
-msgstr ""
+msgstr "Le nombre doit Ãªtre entre 0 et %d\n"
 
-#: src/dird/ua_cmds.c:251
+#: src/dird/ua_cmds.c:261
 msgid "Enter Volume name: "
-msgstr ""
+msgstr "Entrez le nom du Volume : "
 
-#: src/dird/ua_cmds.c:255
+#: src/dird/ua_cmds.c:265
 msgid "Enter base volume name: "
-msgstr ""
+msgstr "Entrez le nom de base du volume : "
 
-#: src/dird/ua_cmds.c:264 src/dird/ua_label.c:590
+#: src/dird/ua_cmds.c:274 src/dird/ua_label.c:609
 msgid "Volume name too long.\n"
-msgstr ""
+msgstr "Nom de Volume trop long.\n"
 
-#: src/dird/ua_cmds.c:268 src/dird/ua_label.c:596 src/lib/edit.c:413
+#: src/dird/ua_cmds.c:278 src/dird/ua_label.c:615 src/lib/edit.c:446
 msgid "Volume name must be at least one character long.\n"
-msgstr ""
+msgstr "Le nom du volume doit comporter au moins un caractère\n"
 
-#: src/dird/ua_cmds.c:277
+#: src/dird/ua_cmds.c:287
 msgid "Enter the starting number: "
-msgstr ""
+msgstr "Entrez le nombre de départ : "
 
-#: src/dird/ua_cmds.c:282
+#: src/dird/ua_cmds.c:292
 msgid "Start number must be greater than zero.\n"
-msgstr ""
+msgstr "Le nombre de départ doit Ãªtre supérieur Ã  zéro.\n"
 
-#: src/dird/ua_cmds.c:293
+#: src/dird/ua_cmds.c:303
 msgid "Enter slot (0 for none): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:297
+#: src/dird/ua_cmds.c:307
 msgid "InChanger? yes/no: "
-msgstr ""
+msgstr "InChanger ? oui/non : "
 
-#: src/dird/ua_cmds.c:324
+#: src/dird/ua_cmds.c:334
 #, c-format
 msgid "%d Volumes created in pool %s\n"
-msgstr ""
+msgstr "%d Volumes créés dans le pool %s\n"
 
-#: src/dird/ua_cmds.c:340 src/dird/ua_cmds.c:866
+#: src/dird/ua_cmds.c:350 src/dird/ua_cmds.c:927
 msgid "Turn on or off? "
-msgstr ""
+msgstr "Activer ou désactiver ? (on/off) "
 
-#: src/dird/ua_cmds.c:348 src/dird/ua_cmds.c:874
+#: src/dird/ua_cmds.c:358 src/dird/ua_cmds.c:935
 msgid "off"
-msgstr ""
+msgstr "off"
 
-#: src/dird/ua_cmds.c:368
+#: src/dird/ua_cmds.c:378
 msgid "jobid"
-msgstr ""
+msgstr "jobid"
 
-#: src/dird/ua_cmds.c:375
+#: src/dird/ua_cmds.c:385
 #, c-format
 msgid "JobId %s is not running. Use Job name to cancel inactive jobs.\n"
 msgstr ""
+"JobId %s n'est pas en cours. Utilisez le nom du Job pour annuler un job "
+"inactif.\n"
 
-#: src/dird/ua_cmds.c:379
+#: src/dird/ua_cmds.c:389
 msgid "job"
-msgstr ""
+msgstr "job"
 
-#: src/dird/ua_cmds.c:384
+#: src/dird/ua_cmds.c:394 src/dird/ua_cmds.c:404
 #, c-format
 msgid "Warning Job %s is not running. Continuing anyway ...\n"
-msgstr ""
+msgstr "Attention le Job %s n'est pas en cours. Continuons quand même...\n"
 
-#: src/dird/ua_cmds.c:407 src/filed/status.c:193 src/stored/status.c:315
+#: src/dird/ua_cmds.c:399
+#, fuzzy
+msgid "ujobid"
+msgstr "jobid"
+
+#: src/dird/ua_cmds.c:427 src/filed/status.c:195 src/stored/status.c:343
 msgid "No Jobs running.\n"
-msgstr ""
+msgstr "Pas de job en cours.\n"
 
-#: src/dird/ua_cmds.c:410
+#: src/dird/ua_cmds.c:430
 msgid "Select Job:\n"
-msgstr ""
+msgstr "Sélectionnez le Job :\n"
 
-#: src/dird/ua_cmds.c:417
+#: src/dird/ua_cmds.c:436
 #, c-format
 msgid "JobId=%s Job=%s"
-msgstr ""
+msgstr "JobId=%s Job=%s"
 
-#: src/dird/ua_cmds.c:422
+#: src/dird/ua_cmds.c:441
 msgid "Choose Job to cancel"
-msgstr ""
+msgstr "Sélectionnez le Job Ã  annuler"
 
-#: src/dird/ua_cmds.c:426
+#: src/dird/ua_cmds.c:445
 msgid "Confirm cancel (yes/no): "
-msgstr ""
+msgstr "Confirmez l'annulation (oui/non) : "
 
-#: src/dird/ua_cmds.c:434
+#: src/dird/ua_cmds.c:452
 #, c-format
 msgid "Job %s not found.\n"
-msgstr ""
+msgstr "Job %s non trouvé.\n"
 
-#: src/dird/ua_cmds.c:539
+#: src/dird/ua_cmds.c:557
 #, c-format
 msgid ""
 "Error: Pool %s already exists.\n"
 "Use update to change it.\n"
 msgstr ""
+"Erreur : Pool %s est déjà défini.\n"
+"Utilisez update pour le changer\n"
 
-#: src/dird/ua_cmds.c:550
+#: src/dird/ua_cmds.c:568
 #, c-format
 msgid "Pool %s created.\n"
-msgstr ""
+msgstr "Pool %s créé.\n"
 
-#: src/dird/ua_cmds.c:563
+#: src/dird/ua_cmds.c:581
 msgid "restart"
-msgstr ""
+msgstr "restart"
 
-#: src/dird/ua_cmds.c:567
+#: src/dird/ua_cmds.c:585
 msgid "Python interpreter restarted.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:569 src/dird/ua_cmds.c:1094
+#: src/dird/ua_cmds.c:587 src/dird/ua_cmds.c:1155
 msgid "Nothing done.\n"
-msgstr ""
+msgstr "Rien de fait.\n"
 
-#: src/dird/ua_cmds.c:585
+#: src/dird/ua_cmds.c:603 src/dird/ua_cmds.c:649
 msgid "Illegal command from this console.\n"
-msgstr ""
+msgstr "Commande interdite depuis cette console.\n"
 
-#: src/dird/ua_cmds.c:592 src/dird/ua_run.c:353
+#: src/dird/ua_cmds.c:610 src/dird/ua_run.c:353
 #, c-format
 msgid "Client \"%s\" not found.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:601
+#: src/dird/ua_cmds.c:619
 #, c-format
 msgid "Client \"%s\" address set to %s\n"
+msgstr "Client Â«Â %s » adresse positionné Ã  %s\n"
+
+#: src/dird/ua_cmds.c:644
+#, c-format
+msgid "Job \"%s\" not found.\n"
+msgstr "Job Â«Â %s » non trouvé.\n"
+
+#: src/dird/ua_cmds.c:653
+#, c-format
+msgid "Job \"%s\" %sabled\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:616 src/dird/ua_status.c:286
+#: src/dird/ua_cmds.c:677 src/dird/ua_status.c:286
 #, c-format
 msgid "Connecting to Storage daemon %s at %s:%d\n"
-msgstr ""
+msgstr "Connexion au Storage Daemon %s (%s:%d)\n"
 
-#: src/dird/ua_cmds.c:622 src/dird/ua_status.c:297
+#: src/dird/ua_cmds.c:683 src/dird/ua_status.c:297
 msgid "Connected to storage daemon\n"
-msgstr ""
+msgstr "Connecté au Storage Daemon\n"
 
-#: src/dird/ua_cmds.c:642 src/dird/ua_cmds.c:981 src/dird/ua_status.c:324
+#: src/dird/ua_cmds.c:703 src/dird/ua_cmds.c:1042 src/dird/ua_status.c:324
 #, c-format
 msgid "Connecting to Client %s at %s:%d\n"
-msgstr ""
+msgstr "Connexion Ã  l'agent %s (%s:%d)\n"
 
-#: src/dird/ua_cmds.c:645 src/dird/ua_cmds.c:984
+#: src/dird/ua_cmds.c:706 src/dird/ua_cmds.c:1045
 msgid "Failed to connect to Client.\n"
-msgstr ""
+msgstr "Impossible de se connecter au Client.\n"
 
-#: src/dird/ua_cmds.c:761
+#: src/dird/ua_cmds.c:822
 msgid "Enter new debug level: "
-msgstr ""
+msgstr "Saisissez le nouveau niveau de debug : "
 
-#: src/dird/ua_cmds.c:827
+#: src/dird/ua_cmds.c:888
 msgid "Available daemons are: \n"
-msgstr ""
+msgstr "Les démons disponibles sont :\n"
 
-#: src/dird/ua_cmds.c:832
+#: src/dird/ua_cmds.c:893
 msgid "Select daemon type to set debug level"
-msgstr ""
+msgstr "Sélectionnez le composant a mettre Ã  jour"
 
-#: src/dird/ua_cmds.c:936 src/dird/ua_run.c:478
+#: src/dird/ua_cmds.c:997 src/dird/ua_run.c:478
 #, c-format
 msgid "Level %s not valid.\n"
-msgstr ""
+msgstr "Le type %s est invalide.\n"
 
-#: src/dird/ua_cmds.c:949
+#: src/dird/ua_cmds.c:1010
 msgid "No job specified.\n"
-msgstr ""
+msgstr "Pas de job sélectionné.\n"
 
-#: src/dird/ua_cmds.c:989
+#: src/dird/ua_cmds.c:1050
 msgid "Error sending include list.\n"
-msgstr ""
+msgstr "Erreur pendant l'envoi de la liste d'inclusion.\n"
 
-#: src/dird/ua_cmds.c:994
+#: src/dird/ua_cmds.c:1055
 msgid "Error sending exclude list.\n"
-msgstr ""
+msgstr "Erreur pendant l'envoi de la liste d'exclusion.\n"
 
-#: src/dird/ua_cmds.c:1080
+#: src/dird/ua_cmds.c:1141
 msgid ""
 "In general it is not a good idea to delete either a\n"
 "Pool or a Volume since they may contain data.\n"
 "\n"
 msgstr ""
+"Généralement supprimer un pool ou bien un volume\n"
+"n'est pas une bonne idée car ils peuvent contenir des données.\n"
+"\n"
 
-#: src/dird/ua_cmds.c:1083
+#: src/dird/ua_cmds.c:1144
 msgid "Choose catalog item to delete"
-msgstr ""
+msgstr "Choisissez l'objet du catalogue Ã  supprimer"
 
-#: src/dird/ua_cmds.c:1151
+#: src/dird/ua_cmds.c:1212
 msgid "Enter JobId to delete: "
-msgstr ""
+msgstr "Saisissez le JobId Ã  supprimer : "
 
-#: src/dird/ua_cmds.c:1194
+#: src/dird/ua_cmds.c:1255
 #, c-format
 msgid "Job %s and associated records deleted from the catalog.\n"
 msgstr ""
+"Le Job %s et les enregistrements associés ont Ã©té supprimés du catalogue.\n"
 
-#: src/dird/ua_cmds.c:1207
+#: src/dird/ua_cmds.c:1268
 #, c-format
 msgid ""
 "\n"
 "This command will delete volume %s\n"
 "and all Jobs saved on that volume from the Catalog\n"
 msgstr ""
+"\n"
+"Cette commande va supprimer le Volume %s\n"
+"et tous les Jobs sauvegardés sur celui-ci du Catalogue\n"
 
-#: src/dird/ua_cmds.c:1211
+#: src/dird/ua_cmds.c:1272
 msgid "Are you sure you want to delete this Volume? (yes/no): "
-msgstr ""
+msgstr "Êtes vous certain de vouloir supprimer ce Volume ? (oui/non) : "
 
-#: src/dird/ua_cmds.c:1232
+#: src/dird/ua_cmds.c:1293
 msgid "Are you sure you want to delete this Pool? (yes/no): "
-msgstr ""
+msgstr "Êtes vous certain de vouloir supprimer ce Pool ? (oui/non) : "
 
-#: src/dird/ua_cmds.c:1329
+#: src/dird/ua_cmds.c:1390
 #, c-format
 msgid "Using Catalog name=%s DB=%s\n"
+msgstr "Utilisation du Catalogue name=%s DB=%s\n"
+
+#: src/dird/ua_cmds.c:1450
+msgid "ERR: Can't open db\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1370 src/dird/ua_tree.c:594 src/stored/btape.c:2580
+#: src/dird/ua_cmds.c:1486
+#, fuzzy
+msgid "ERR: Job was not found\n"
+msgstr "Job %s non trouvé\n"
+
+#: src/dird/ua_cmds.c:1562 src/dird/ua_tree.c:629 src/stored/btape.c:2587
 #, c-format
 msgid ""
 "  Command    Description\n"
 "  =======    ===========\n"
 msgstr ""
+"  Commande   Description\n"
+"  ========   ===========\n"
 
-#: src/dird/ua_cmds.c:1372
+#: src/dird/ua_cmds.c:1564
 #, c-format
 msgid "  %-10s %s\n"
-msgstr ""
+msgstr "  %-10s %s\n"
 
-#: src/dird/ua_cmds.c:1374
+#: src/dird/ua_cmds.c:1566
 msgid ""
 "\n"
 "When at a prompt, entering a period cancels the command.\n"
 "\n"
 msgstr ""
+"\n"
+"Sur une question, tapez un point (.) pour annuler la commande en cours.\n"
 
-#: src/dird/ua_cmds.c:1390
+#: src/dird/ua_cmds.c:1582
 #, c-format
 msgid "%s Version: %s (%s)\n"
-msgstr ""
+msgstr "%s Version : %s (%s)\n"
 
-#: src/dird/ua_cmds.c:1409
+#: src/dird/ua_cmds.c:1601
 msgid "Could not find a Catalog resource\n"
+msgstr "Impossible de trouver un Catalogue\n"
+
+#: src/dird/ua_cmds.c:1604
+msgid "You must specify a \"use <catalog-name>\" command before continuing.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1412
+#: src/dird/ua_cmds.c:1608
 #, c-format
 msgid "Using default Catalog name=%s DB=%s\n"
-msgstr ""
+msgstr "Utilisation du Catalogue par défaut name=%s DB=%s\n"
 
-#: src/dird/ua_dotcmds.c:121
+#: src/dird/ua_dotcmds.c:131
 msgid "The Director will segment fault.\n"
 msgstr ""
 
-#: src/dird/ua_dotcmds.c:221 src/dird/ua_restore.c:747
-#: src/dird/ua_restore.c:785
+#: src/dird/ua_dotcmds.c:245 src/dird/ua_restore.c:737
+#: src/dird/ua_restore.c:775 src/dird/ua_restore.c:806
 #, c-format
 msgid "Query failed: %s. ERR=%s\n"
 msgstr ""
@@ -2836,238 +2959,234 @@ msgstr ""
 #: src/dird/ua_input.c:86 src/dird/ua_input.c:92
 #, c-format
 msgid "Expected a positive integer, got: %s\n"
-msgstr ""
+msgstr "Attendait un entier positif, pas : %s\n"
 
-#: src/dird/ua_input.c:120 src/dird/ua_run.c:860 src/dird/ua_select.c:54
-#: src/dird/ua_update.c:232 src/dird/ua_update.c:247 src/dird/ua_update.c:495
-#: src/stored/parse_bsr.c:741 src/tools/dbcheck.c:1098
+#: src/dird/ua_input.c:120 src/dird/ua_run.c:862 src/dird/ua_select.c:54
+#: src/dird/ua_update.c:223 src/dird/ua_update.c:237 src/dird/ua_update.c:247
+#: src/dird/ua_update.c:261 src/dird/ua_update.c:552
+#: src/stored/parse_bsr.c:770 src/tools/dbcheck.c:1098
 msgid "yes"
-msgstr ""
+msgstr "oui"
 
-#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:234
-#: src/dird/ua_update.c:247 src/dird/ua_update.c:495
-#: src/stored/parse_bsr.c:741
+#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:225
+#: src/dird/ua_update.c:237 src/dird/ua_update.c:249 src/dird/ua_update.c:261
+#: src/dird/ua_update.c:552 src/stored/parse_bsr.c:770
 msgid "no"
-msgstr ""
+msgstr "non"
 
 #: src/dird/ua_input.c:127
 msgid "Invalid response. You must answer yes or no.\n"
-msgstr ""
+msgstr "Réponse invalide. Vous devez répondre oui ou non.\n"
 
-#: src/dird/ua_label.c:88
+#: src/dird/ua_label.c:89
 msgid "Negative numbers not permitted\n"
 msgstr ""
 
-#: src/dird/ua_label.c:94
+#: src/dird/ua_label.c:95
 msgid "Range end is not integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:99
+#: src/dird/ua_label.c:100
 msgid "Range start is not an integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:105
+#: src/dird/ua_label.c:106
 msgid "Range end not bigger than start.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:111
+#: src/dird/ua_label.c:112
 msgid "Input value is not an integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:117
+#: src/dird/ua_label.c:118
 msgid "Values must be be greater than zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:121
+#: src/dird/ua_label.c:122
 msgid "Slot too large.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:176 src/dird/ua_label.c:463
+#: src/dird/ua_label.c:176 src/dird/ua_label.c:477
 msgid "No slots in changer to scan.\n"
-msgstr ""
+msgstr "Pas de slot dans le magasin Ã  scanner.\n"
 
-#: src/dird/ua_label.c:188 src/dird/ua_label.c:474
+#: src/dird/ua_label.c:188 src/dird/ua_label.c:488
 msgid "No Volumes found to label, or no barcodes.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:195
+#: src/dird/ua_label.c:198
 #, c-format
-msgid "Slot %d larger than max %d ignored.\n"
+msgid "Slot %d greater than max %d ignored.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:224
+#: src/dird/ua_label.c:227
 #, c-format
-msgid "No VolName for Slot=%d set InChanger to zero.\n"
+msgid "No VolName for Slot=%d InChanger set to zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:239
+#: src/dird/ua_label.c:242
 #, c-format
 msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:243
+#: src/dird/ua_label.c:246
 #, c-format
 msgid "Catalog record for Volume \"%s\" is up to date.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:249
+#: src/dird/ua_label.c:252
 #, c-format
-msgid "Record for Volume \"%s\" not found in catalog.\n"
+msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:334
+#: src/dird/ua_label.c:348
 #, c-format
 msgid ""
 "Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before "
 "relabeling.\n"
 msgstr ""
+"Le volume Â«Â %s » (VolStatus) a le statut Â«Â %s ». Il doit Ãªtre purgé ou bien\n"
+"recyclé avant de pouvoir le re-labéliser.\n"
 
-#: src/dird/ua_label.c:350
+#: src/dird/ua_label.c:364
 msgid "Enter new Volume name: "
-msgstr ""
+msgstr "Saisissez le nouveau nom du Volume : "
 
-#: src/dird/ua_label.c:363
+#: src/dird/ua_label.c:377
 #, c-format
 msgid "Media record for new Volume \"%s\" already exists.\n"
-msgstr ""
+msgstr "Le nouveau volume Â«Â %s » existe déjà en base.\n"
 
-#: src/dird/ua_label.c:378
+#: src/dird/ua_label.c:392
 msgid "Enter slot (0 or Enter for none): "
 msgstr ""
 
-#: src/dird/ua_label.c:403
+#: src/dird/ua_label.c:417
 #, c-format
 msgid "Delete of Volume \"%s\" failed. ERR=%s"
-msgstr ""
+msgstr "Impossible de supprimer le volume Â«Â %s ». ERR=%s"
 
-#: src/dird/ua_label.c:406
+#: src/dird/ua_label.c:420
 #, c-format
 msgid "Old volume \"%s\" deleted from catalog.\n"
-msgstr ""
+msgstr "L'ancien volume Â«Â %s » a Ã©té supprimé du catalogue.\n"
 
-#: src/dird/ua_label.c:417
+#: src/dird/ua_label.c:431
 #, c-format
 msgid "Requesting to mount %s ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:439
+#: src/dird/ua_label.c:453
 msgid "Do not forget to mount the drive!!!\n"
-msgstr ""
+msgstr "N'oubliez pas de monter le lecteur.\n"
 
-#: src/dird/ua_label.c:479
+#: src/dird/ua_label.c:493
 msgid ""
 "The following Volumes will be labeled:\n"
 "Slot  Volume\n"
 "==============\n"
 msgstr ""
+"Les volumes suivants vont Ãªtre labélisés :\n"
+"Slot  Volume\n"
+"==============\n"
 
-#: src/dird/ua_label.c:488 src/stored/btape.c:608
+#: src/dird/ua_label.c:502 src/stored/btape.c:606
 msgid "Do you want to continue? (y/n): "
-msgstr ""
+msgstr "Vous voulez continuer ? (y/n) : "
 
-#: src/dird/ua_label.c:509
+#: src/dird/ua_label.c:523
 #, c-format
 msgid "Media record for Slot %d Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:515
+#: src/dird/ua_label.c:529
 #, c-format
 msgid "Error setting InChanger: ERR=%s"
+msgstr "Impossible de positionner le flag InChanger : ERR=%s"
+
+#: src/dird/ua_label.c:552
+#, c-format
+msgid "Maximum pool Volumes=%d reached.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:540
+#: src/dird/ua_label.c:559
 #, c-format
 msgid "Catalog record for cleaning tape \"%s\" successfully created.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:547
+#: src/dird/ua_label.c:566
 #, c-format
 msgid "Catalog error on cleaning tape: %s"
 msgstr ""
 
-#: src/dird/ua_label.c:583
+#: src/dird/ua_label.c:602
 #, c-format
 msgid "Illegal character \"%c\" in a volume name.\n"
-msgstr ""
+msgstr "Caractères Â«Â %c » interdits dans le nom d'un volume.\n"
 
-#: src/dird/ua_label.c:628
+#: src/dird/ua_label.c:647
 #, c-format
 msgid "Sending relabel command from \"%s\" to \"%s\" ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:635
+#: src/dird/ua_label.c:654
 #, c-format
 msgid "Sending label command for Volume \"%s\" Slot %d ...\n"
-msgstr ""
+msgstr "Demande de labélisation du volume Â«Â %s » Slot %d...\n"
 
-#: src/dird/ua_label.c:665
+#: src/dird/ua_label.c:686
 #, c-format
 msgid "Catalog record for Volume \"%s\", Slot %d  successfully created.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:678
+#: src/dird/ua_label.c:699
 #, c-format
 msgid "Label command failed for Volume %s.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:688
+#: src/dird/ua_label.c:709
 #, c-format
 msgid "Connecting to Storage daemon %s at %s:%d ...\n"
-msgstr ""
+msgstr "Connexion au Storage Daemon %s (%s:%d)...\n"
 
-#: src/dird/ua_label.c:716
+#: src/dird/ua_label.c:737
 msgid "Could not open SD socket.\n"
-msgstr ""
+msgstr "Impossible d'ouvrir la socket avec le SD.\n"
 
-#: src/dird/ua_label.c:722
-#, c-format
-msgid "readlabel %s Slot=%d drive=%d\n"
-msgstr ""
-
-#: src/dird/ua_label.c:764
-#, c-format
-msgid "autochanger list %s \n"
-msgstr ""
-
-#: src/dird/ua_label.c:788 src/dird/ua_label.c:798
+#: src/dird/ua_label.c:809 src/dird/ua_label.c:819
 #, c-format
 msgid "Invalid Slot number: %s\n"
 msgstr ""
 
-#: src/dird/ua_label.c:807
+#: src/dird/ua_label.c:828
 #, c-format
 msgid "Invalid Volume name: %s\n"
-msgstr ""
-
-#: src/dird/ua_label.c:876
-#, c-format
-msgid "autochanger slots %s \n"
-msgstr ""
+msgstr "Nom de Volume invalide : %s\n"
 
-#: src/dird/ua_label.c:886
+#: src/dird/ua_label.c:907
 #, c-format
 msgid "Device \"%s\" has %d slots.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:902
+#: src/dird/ua_label.c:956
 #, c-format
 msgid "Pool \"%s\" resource not found!\n"
 msgstr ""
 
-#: src/dird/ua_output.c:64 src/dird/ua_output.c:90
+#: src/dird/ua_output.c:64 src/dird/ua_output.c:88
 msgid "ON or OFF keyword missing.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:178
+#: src/dird/ua_output.c:176
 msgid "Keywords for the show command are:\n"
 msgstr ""
 
-#: src/dird/ua_output.c:184
+#: src/dird/ua_output.c:182
 #, c-format
 msgid "%s resource %s not found.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:187
+#: src/dird/ua_output.c:185
 #, c-format
 msgid "Resource %s not found\n"
 msgstr ""
@@ -3076,51 +3195,57 @@ msgstr ""
 msgid "Hey! DB is NULL\n"
 msgstr ""
 
-#: src/dird/ua_output.c:353
+#: src/dird/ua_output.c:367
 #, c-format
 msgid "Jobid %d used %d Volume(s): %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:365
+#: src/dird/ua_output.c:385
 msgid "No Pool specified.\n"
-msgstr ""
+msgstr "Pas de Pool spécifié.\n"
 
-#: src/dird/ua_output.c:375 src/dird/ua_select.c:446
+#: src/dird/ua_output.c:396 src/dird/ua_select.c:458
 #, c-format
 msgid "Error obtaining pool ids. ERR=%s\n"
-msgstr ""
+msgstr "Erreur pendant lors de la récupération du pool. ERR=%s\n"
 
-#: src/dird/ua_output.c:385
+#: src/dird/ua_output.c:406
 #, c-format
 msgid "Pool: %s\n"
-msgstr ""
+msgstr "Pool : %s\n"
 
-#: src/dird/ua_output.c:396
-msgid "No Volume Name specified.\n"
+#: src/dird/ua_output.c:422 src/dird/ua_status.c:455
+msgid "Ignoring illegal value for days.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:409
+#: src/dird/ua_output.c:431
 #, c-format
 msgid "Unknown list keyword: %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:434
+#: src/dird/ua_output.c:457
 #, c-format
 msgid "%s is not a job name.\n"
-msgstr ""
+msgstr "%s n'est pas un nom de job.\n"
 
-#: src/dird/ua_output.c:450 src/dird/ua_output.c:462
-msgid "Could not find next Volume.\n"
-msgstr ""
+#: src/dird/ua_output.c:481
+#, c-format
+msgid "Could not find next Volume for Job %s (%s, %s).\n"
+msgstr "Impossible de trouver le prochain Volume pour le Job %s (%s, %s).\n"
 
-#: src/dird/ua_output.c:452
+#: src/dird/ua_output.c:485
 #, c-format
-msgid "The next Volume to be used by Job \"%s\" will be %s\n"
-msgstr ""
+msgid "The next Volume to be used by Job \"%s\" (%s, %s) will be %s\n"
+msgstr "Le prochain Volume utilisé par le Job Â«Â %s » (%s, %s) sera %s\n"
+
+#: src/dird/ua_output.c:495
+#, c-format
+msgid "Could not find next Volume for Job %s.\n"
+msgstr "Impossible de trouver le prochain volume pour le Job %s.\n"
 
-#: src/dird/ua_output.c:671
+#: src/dird/ua_output.c:685
 msgid "You have no messages.\n"
-msgstr ""
+msgstr "Vous n'avez pas de messages.\n"
 
 #: src/dird/ua_prune.c:173
 msgid "Choose item to prune"
@@ -3152,11 +3277,15 @@ msgstr ""
 #, c-format
 msgid "There are no Jobs associated with Volume \"%s\". Prune not needed.\n"
 msgstr ""
+"Il n'y a pas de job associé avec le volume Â«Â %s ». Pas besoin de \"Pruner"
+"\".\n"
 
 #: src/dird/ua_prune.c:508 src/dird/ua_purge.c:482
 #, c-format
 msgid "There are no Jobs associated with Volume \"%s\". Marking it purged.\n"
 msgstr ""
+"Il n'y a pas de job associé avec le volume Â«Â %s ». Il doit Ãªtre marqué\n"
+"comme purgé.\n"
 
 #: src/dird/ua_prune.c:566
 #, c-format
@@ -3215,11 +3344,13 @@ msgid ""
 "Volume \"%s\" has VolStatus \"%s\" and cannot be purged.\n"
 "The VolStatus must be: Append, Full, Used, or Error to be purged.\n"
 msgstr ""
+"Le volume Â«Â %s » est en Ã©tat \"%s\" et il ne peut pas Ãªtre purgé.\n"
+"Son statut doit Ãªtre : Append, Full, Used ou Error pour Ãªtre purgé.\n"
 
 #: src/dird/ua_purge.c:535
 #, c-format
 msgid "%d File%s on Volume \"%s\" purged from catalog.\n"
-msgstr ""
+msgstr "%d fichier%s du volume Â«Â %s » purgé du catalogue.\n"
 
 #: src/dird/ua_purge.c:549
 #, c-format
@@ -3230,7 +3361,7 @@ msgstr ""
 #: src/dird/ua_purge.c:581
 #, c-format
 msgid "Cannot purge Volume with VolStatus=%s\n"
-msgstr ""
+msgstr "Impossible de purger un volume dans l'état (VolStatus) %s\n"
 
 #: src/dird/ua_query.c:59 src/findlib/create_file.c:282
 #: src/findlib/create_file.c:339
@@ -3278,113 +3409,124 @@ msgstr ""
 msgid "End query mode.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:151
+#: src/dird/ua_restore.c:115
 msgid ""
 "No Restore Job Resource found in bacula-dir.conf.\n"
 "You must create at least one before running this command.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:167
+#: src/dird/ua_restore.c:131
 msgid "Restore not done.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:178
+#: src/dird/ua_restore.c:142
 msgid "Unable to construct a valid BSR. Cannot continue.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:182 src/dird/ua_restore.c:196
+#: src/dird/ua_restore.c:146 src/dird/ua_restore.c:160
 msgid "No files selected to be restored.\n"
-msgstr ""
+msgstr "Aucun fichier sélectionné pour la restauration.\n"
 
-#: src/dird/ua_restore.c:190
+#: src/dird/ua_restore.c:154
 msgid ""
 "\n"
 "1 file selected to be restored.\n"
 "\n"
 msgstr ""
+"\n"
+"1 fichier sélectionne pour la restauration.\n"
+"\n"
 
-#: src/dird/ua_restore.c:193
+#: src/dird/ua_restore.c:157
 #, c-format
 msgid ""
 "\n"
 "%u files selected to be restored.\n"
 "\n"
 msgstr ""
+"\n"
+"%u fichiers sélectionnés pour la restauration.\n"
 
-#: src/dird/ua_restore.c:211
+#: src/dird/ua_restore.c:175
 msgid "No Restore Job resource found!\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:309
-msgid "List last 20 Jobs run"
+#: src/dird/ua_restore.c:234
+#, c-format
+msgid "Missing value for keyword: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:310
+#: src/dird/ua_restore.c:283
+msgid "List last 20 Jobs run"
+msgstr "Afficher les 20 derniers jobs lancés"
+
+#: src/dird/ua_restore.c:284
 msgid "List Jobs where a given File is saved"
-msgstr ""
+msgstr "Afficher les jobs où un fichier donné a Ã©té sauvegardé"
 
-#: src/dird/ua_restore.c:311
+#: src/dird/ua_restore.c:285
 msgid "Enter list of comma separated JobIds to select"
-msgstr ""
+msgstr "Saisir une liste de JobIds Ã  sélectionner (ex : 12,4,3)"
 
-#: src/dird/ua_restore.c:312
+#: src/dird/ua_restore.c:286
 msgid "Enter SQL list command"
-msgstr ""
+msgstr "Exécuter une requête SQL"
 
-#: src/dird/ua_restore.c:313
+#: src/dird/ua_restore.c:287
 msgid "Select the most recent backup for a client"
-msgstr ""
+msgstr "Sélectionner la sauvegarde la plus récente pour un client"
 
-#: src/dird/ua_restore.c:314
+#: src/dird/ua_restore.c:288
 msgid "Select backup for a client before a specified time"
 msgstr ""
+"Sélectionner la dernière sauvegarde pour un client avant une certaine date"
 
-#: src/dird/ua_restore.c:315
+#: src/dird/ua_restore.c:289
 msgid "Enter a list of files to restore"
-msgstr ""
+msgstr "Saisir la liste des fichiers Ã  restaurer"
 
-#: src/dird/ua_restore.c:316
+#: src/dird/ua_restore.c:290
 msgid "Enter a list of files to restore before a specified time"
-msgstr ""
+msgstr "Saisir la liste des fichiers Ã  restaurer avant une certaine date"
 
-#: src/dird/ua_restore.c:317
+#: src/dird/ua_restore.c:291
 msgid "Find the JobIds of the most recent backup for a client"
-msgstr ""
+msgstr "Afficher les JobIds de sauvegarde les plus récents pour un client"
 
-#: src/dird/ua_restore.c:318
+#: src/dird/ua_restore.c:292
 msgid "Find the JobIds for a backup for a client before a specified time"
-msgstr ""
+msgstr "Afficher les JobIds de sauvegarde avant une certaine date"
 
-#: src/dird/ua_restore.c:319
+#: src/dird/ua_restore.c:293
 msgid "Enter a list of directories to restore for found JobIds"
-msgstr ""
+msgstr "Saisir la liste des répertoires Ã  restaurer (pour un JobId)"
 
-#: src/dird/ua_restore.c:320 src/dird/ua_status.c:702 src/filed/status.c:249
-#: src/stored/status.c:367 src/wx-console/wxbconfigpanel.cpp:191
+#: src/dird/ua_restore.c:294 src/dird/ua_status.c:722 src/filed/status.c:251
+#: src/stored/status.c:412 src/wx-console/wxbconfigpanel.cpp:191
 msgid "Cancel"
-msgstr ""
+msgstr "Annulé"
 
-#: src/dird/ua_restore.c:356
+#: src/dird/ua_restore.c:330
 #, c-format
 msgid "Unknown keyword: %s\n"
-msgstr ""
+msgstr "Mot clef inconnu : %s\n"
 
-#: src/dird/ua_restore.c:374
+#: src/dird/ua_restore.c:354
 #, c-format
 msgid "Improper date format: %s\n"
-msgstr ""
+msgstr "Format de date invalide : %s\n"
 
-#: src/dird/ua_restore.c:408 src/dird/ua_select.c:576
+#: src/dird/ua_restore.c:394 src/dird/ua_select.c:590
 #, c-format
 msgid "Error: Pool resource \"%s\" does not exist.\n"
-msgstr ""
+msgstr "Erreur : le Pool Â«Â %s » n'existe pas.\n"
 
-#: src/dird/ua_restore.c:413
+#: src/dird/ua_restore.c:399
 #, c-format
 msgid "Error: Pool resource \"%s\" access not allowed.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:432
+#: src/dird/ua_restore.c:418
 msgid ""
 "\n"
 "First you select one or more JobIds that contain files\n"
@@ -3393,218 +3535,248 @@ msgid ""
 "select which files from those JobIds are to be restored.\n"
 "\n"
 msgstr ""
+"\n"
+"\n"
+"D'abord, vous devez sélectionner un ou plusieurs jobs (par leur JobId) qui\n"
+"contiennent les fichiers Ã  restaurer. Il vous est présenté plusieurs "
+"méthodes\n"
+"pour choisir le bon JobId. Après, vous pourrez sélectionner les fichiers Ã \n"
+"restaurer parmi la liste totale des fichiers présents dans les jobs\n"
+"sélectionnés.\n"
 
-#: src/dird/ua_restore.c:444
+#: src/dird/ua_restore.c:430
 msgid "To select the JobIds, you have the following choices:\n"
-msgstr ""
+msgstr "Pour sélectionner les JobIds, vous avez les possibilités suivantes :\n"
 
-#: src/dird/ua_restore.c:449
+#: src/dird/ua_restore.c:435
 msgid "Select item: "
-msgstr ""
+msgstr "Choix : "
 
-#: src/dird/ua_restore.c:463
+#: src/dird/ua_restore.c:449
 msgid "Enter Filename (no path):"
-msgstr ""
+msgstr "Saisissez le nom du fichier (sans le chemin) : "
 
-#: src/dird/ua_restore.c:478 src/dird/ua_restore.c:578
+#: src/dird/ua_restore.c:464 src/dird/ua_restore.c:564
 msgid "Enter JobId(s), comma separated, to restore: "
-msgstr ""
+msgstr "Saisissez le ou les JobIds Ã  restaurer (ex : id1,id2,id3) : "
 
-#: src/dird/ua_restore.c:484
+#: src/dird/ua_restore.c:470
 msgid "Enter SQL list command: "
-msgstr ""
+msgstr "Exécuter une requête SQL : "
 
-#: src/dird/ua_restore.c:512 src/dird/ua_restore.c:537
+#: src/dird/ua_restore.c:498 src/dird/ua_restore.c:523
 msgid ""
 "Enter file names with paths, or < to enter a filename\n"
-"containg a list of file names with paths, and terminate\n"
+"containing a list of file names with paths, and terminate\n"
 "them with a blank line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:516 src/dird/ua_restore.c:541
+#: src/dird/ua_restore.c:502 src/dird/ua_restore.c:527
 msgid "Enter full filename: "
-msgstr ""
+msgstr "Saisissez le nom complet du fichier : "
 
-#: src/dird/ua_restore.c:576
+#: src/dird/ua_restore.c:562
 #, c-format
 msgid "You have already seleted the following JobIds: %s\n"
-msgstr ""
+msgstr "Vous avez déjà sélectionné les JobIds suivants : %s\n"
 
-#: src/dird/ua_restore.c:591
+#: src/dird/ua_restore.c:577
 msgid ""
 "Enter full directory names or start the name\n"
-"with a < to indicate it is a filename containg a list\n"
+"with a < to indicate it is a filename containing a list\n"
 "of directories and terminate them with a blank line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:595
+#: src/dird/ua_restore.c:581
 msgid "Enter directory name: "
-msgstr ""
+msgstr "Saisissez le nom d'un répertoire : "
 
-#: src/dird/ua_restore.c:620
+#: src/dird/ua_restore.c:606
 msgid "No Jobs selected.\n"
-msgstr ""
+msgstr "Pas de job sélectionné.\n"
 
-#: src/dird/ua_restore.c:624
+#: src/dird/ua_restore.c:610
 #, c-format
 msgid "You have selected the following JobIds: %s\n"
-msgstr ""
+msgstr "Vous avez sélectionné les JobIds suivants : %s\n"
 
-#: src/dird/ua_restore.c:627
+#: src/dird/ua_restore.c:613
 #, c-format
 msgid "You have selected the following JobId: %s\n"
-msgstr ""
+msgstr "Vous avez sélectionné le JobId suivant : %s\n"
 
-#: src/dird/ua_restore.c:636
+#: src/dird/ua_restore.c:621
 msgid "Invalid JobId in list.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:648
+#: src/dird/ua_restore.c:634
 #, c-format
 msgid "Unable to get Job record for JobId=%s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:653
+#: src/dird/ua_restore.c:639
 #, c-format
 msgid "No authorization. Job \"%s\" not selected.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:667
+#: src/dird/ua_restore.c:653
 msgid ""
 "The restored files will the most current backup\n"
 "BEFORE the date you specify below.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:670
+#: src/dird/ua_restore.c:656
 msgid "Enter date as YYYY-MM-DD HH:MM:SS :"
-msgstr ""
+msgstr "Saisissez la date au format YYYY-MM-DD HH:MM:SS : "
 
-#: src/dird/ua_restore.c:676
+#: src/dird/ua_restore.c:662
 msgid "Improper date format.\n"
-msgstr ""
+msgstr "Format de date invalide.\n"
 
-#: src/dird/ua_restore.c:697
+#: src/dird/ua_restore.c:683
 #, c-format
 msgid "Cannot open file %s: ERR=%s\n"
-msgstr ""
+msgstr "Impossible d'ouvrir le fichier %s : ERR=%s\n"
 
-#: src/dird/ua_restore.c:705 src/dird/ua_restore.c:709
+#: src/dird/ua_restore.c:691 src/dird/ua_restore.c:695
 #, c-format
 msgid "Error occurred on line %d of %s\n"
-msgstr ""
+msgstr "Une erreur est survenue Ã  la ligne %d de %s\n"
 
-#: src/dird/ua_restore.c:751 src/dird/ua_restore.c:789
+#: src/dird/ua_restore.c:741 src/dird/ua_restore.c:779
 #, c-format
 msgid "No database record found for: %s\n"
-msgstr ""
+msgstr "Pas d'enregistrement trouvé en base pour : %s\n"
 
-#: src/dird/ua_restore.c:776
+#: src/dird/ua_restore.c:766
 msgid "No JobId specified cannot continue.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:895
+#: src/dird/ua_restore.c:810
+#, c-format
+msgid "No table found: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:915
 #, c-format
 msgid ""
 "\n"
 "Building directory tree for JobId %s ...  "
 msgstr ""
+"\n"
+"Analyse des répertoires pour le JobId %s..."
 
-#: src/dird/ua_restore.c:914
+#: src/dird/ua_restore.c:934
 msgid ""
 "\n"
 "There were no files inserted into the tree, so file selection\n"
 "is not possible.Most likely your retention policy pruned the files\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:916
+#: src/dird/ua_restore.c:936
 msgid ""
 "\n"
 "Do you want to restore all the files? (yes|no): "
 msgstr ""
+"\n"
+"Voulez vous restaurer tous les fichiers ? (oui|non) : "
 
-#: src/dird/ua_restore.c:932
+#: src/dird/ua_restore.c:952
 #, c-format
 msgid ""
 "\n"
 "1 Job, %s files inserted into the tree and marked for extraction.\n"
 msgstr ""
+"\n"
+"1 Job, %s fichiers analysés et sélectionnés pour la restauration.\n"
 
-#: src/dird/ua_restore.c:936
+#: src/dird/ua_restore.c:956
 #, c-format
 msgid ""
 "\n"
 "1 Job, %s files inserted into the tree.\n"
 msgstr ""
+"\n"
+"1 Job, %s fichiers analysés\n"
 
-#: src/dird/ua_restore.c:942
+#: src/dird/ua_restore.c:962
 #, c-format
 msgid ""
 "\n"
 "%d Jobs, %s files inserted into the tree and marked for extraction.\n"
 msgstr ""
+"\n"
+"%d Jobs, %s fichiers analysés et sélectionnés pour la restauration.\n"
 
-#: src/dird/ua_restore.c:946
+#: src/dird/ua_restore.c:966
 #, c-format
 msgid ""
 "\n"
 "%d Jobs, %s files inserted into the tree.\n"
 msgstr ""
+"\n"
+"%d Jobs, %s fichiers analysés.\n"
 
-#: src/dird/ua_restore.c:1023
+#: src/dird/ua_restore.c:1043
 #, c-format
 msgid "Error getting FileSet \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1031 src/dird/ua_select.c:165
+#: src/dird/ua_restore.c:1051 src/dird/ua_select.c:167
 msgid "The defined FileSet resources are:\n"
-msgstr ""
+msgstr "Les FileSet définis sont :\n"
 
-#: src/dird/ua_restore.c:1035 src/dird/ua_select.c:173
+#: src/dird/ua_restore.c:1055 src/dird/ua_run.c:644 src/dird/ua_select.c:175
+msgid "FileSet"
+msgstr "FileSet"
+
+#: src/dird/ua_restore.c:1055 src/dird/ua_select.c:175
 msgid "Select FileSet resource"
-msgstr ""
+msgstr "Sélectionnez le FileSet"
 
-#: src/dird/ua_restore.c:1042
+#: src/dird/ua_restore.c:1062
 #, c-format
 msgid "Error getting FileSet record: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1043
+#: src/dird/ua_restore.c:1063
 msgid ""
 "This probably means you modified the FileSet.\n"
 "Continuing anyway.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1058
+#: src/dird/ua_restore.c:1078
 #, c-format
 msgid "Pool \"%s\" not found, using any pool.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1084 src/dird/ua_restore.c:1100
+#: src/dird/ua_restore.c:1104 src/dird/ua_restore.c:1120
 #, c-format
 msgid "No Full backup before %s found.\n"
-msgstr ""
+msgstr "Pas de backup Full trouvé avant %s.\n"
 
-#: src/dird/ua_restore.c:1123
+#: src/dird/ua_restore.c:1143
 msgid "No jobs found.\n"
-msgstr ""
+msgstr "Pas de jobs trouvé.\n"
 
-#: src/dird/ua_restore.c:1289
+#: src/dird/ua_restore.c:1316
 msgid ""
 "Warning, the JobIds that you selected refer to more than one MediaType.\n"
 "Restore is not possible. The MediaTypes used are:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1297
+#: src/dird/ua_restore.c:1324
 msgid "No MediaType found for your JobIds.\n"
-msgstr ""
+msgstr "Pas de MediaType trouvé pour vos JobIds\n"
 
-#: src/dird/ua_restore.c:1329
+#: src/dird/ua_restore.c:1356
 #, c-format
 msgid "Warning default storage overridden by %s on command line.\n"
 msgstr ""
+"Attention, le storage par défaut est remplacé par %s en ligne de commande.\n"
 
-#: src/dird/ua_restore.c:1340
+#: src/dird/ua_restore.c:1367
 #, c-format
 msgid ""
 "\n"
@@ -3677,21 +3849,21 @@ msgstr ""
 #: src/dird/ua_run.c:268
 #, c-format
 msgid "Invalid keyword: %s\n"
-msgstr ""
+msgstr "Argument invalide : %s\n"
 
 #: src/dird/ua_run.c:280
 #, c-format
 msgid "Catalog \"%s\" not found\n"
-msgstr ""
+msgstr "Le catalogue Â«Â %s » est introuvable\n"
 
 #: src/dird/ua_run.c:291
 #, c-format
 msgid "Job \"%s\" not found\n"
-msgstr ""
+msgstr "Le job Â«Â %s » est introuvable\n"
 
 #: src/dird/ua_run.c:298
 msgid "A job name must be specified.\n"
-msgstr ""
+msgstr "Un nom de Job doit Ãªtre spécifié.\n"
 
 #: src/dird/ua_run.c:304
 #, c-format
@@ -3758,8 +3930,15 @@ msgid ""
 "When:     %s\n"
 "Priority: %d\n"
 msgstr ""
+"Lancement du job %s\n"
+"JobName : %s\n"
+"FileSet : %s\n"
+"Client   : %s\n"
+"Storage  : %s\n"
+"Quand    : %s\n"
+"Priorité : %d\n"
 
-#: src/dird/ua_run.c:507 src/lib/util.c:301
+#: src/dird/ua_run.c:507 src/lib/util.c:295
 msgid "Admin"
 msgstr ""
 
@@ -3776,13 +3955,22 @@ msgid ""
 "When:     %s\n"
 "Priority: %d\n"
 msgstr ""
-
-#: src/dird/ua_run.c:528 src/lib/util.c:292
+"Lancement du job %s\n"
+"JobName  : %s\n"
+"FileSet  : %s\n"
+"Type     : %s\n"
+"Client   : %s\n"
+"Storage  : %s\n"
+"Pool     : %s\n"
+"Quand    : %s\n"
+"Priorité : %d\n"
+
+#: src/dird/ua_run.c:528 src/lib/util.c:286
 msgid "Backup"
-msgstr ""
+msgstr "Backup"
 
 #: src/dird/ua_run.c:544
-#, c-format
+#, fuzzy, c-format
 msgid ""
 "Run %s job\n"
 "JobName:     %s\n"
@@ -3795,14 +3983,25 @@ msgid ""
 "When:        %s\n"
 "Priority:    %d\n"
 msgstr ""
-
-#: src/dird/ua_run.c:554 src/lib/util.c:295
+"Lancement du job %s\n"
+"JobName  : %s\n"
+"FileSet  : %s\n"
+"Type     : %s\n"
+"Client   : %s\n"
+"Storage  : %s\n"
+"Pool     : %s\n"
+"Verify Job: %s\n"
+"Verify List:%s\n"
+"Quand    : %s\n"
+"Priorité : %d\n"
+
+#: src/dird/ua_run.c:554 src/lib/util.c:289
 msgid "Verify"
 msgstr ""
 
 #: src/dird/ua_run.c:571
 msgid "Please enter a JobId for restore: "
-msgstr ""
+msgstr "Saisissez le JobId pour la restauration : "
 
 #: src/dird/ua_run.c:580
 #, c-format
@@ -3819,6 +4018,17 @@ msgid ""
 "Catalog:    %s\n"
 "Priority:   %d\n"
 msgstr ""
+"Lancement de la restauration\n"
+"JobName     : %s\n"
+"Bootstrap   : %s\n"
+"Destination : %s\n"
+"Écrasement  : %s\n"
+"FileSet     : %s\n"
+"Client      : %s\n"
+"Storage     : %s\n"
+"Quand       : %s\n"
+"Catalogue   : %s\n"
+"Priorité    : %d\n"
 
 #: src/dird/ua_run.c:602
 #, c-format
@@ -3835,112 +4045,162 @@ msgid ""
 "Catalog:    %s\n"
 "Priority:   %d\n"
 msgstr ""
+"Lancement de la restauration\n"
+"JobName     : %s\n"
+"Bootstrap   : %s\n"
+"Destination : %s\n"
+"Écrasement  : %s\n"
+"Client      : %s\n"
+"Storage     : %s\n"
+"JobId       : %s\n"
+"Quand       : %s\n"
+"Catalogue   : %s\n"
+"Priorité    : %d\n"
 
 #: src/dird/ua_run.c:626
 #, c-format
 msgid "Unknown Job Type=%d\n"
-msgstr ""
+msgstr "Job du Type=%d inconnu\n"
 
 #: src/dird/ua_run.c:631
 msgid "OK to run? (yes/mod/no): "
-msgstr ""
+msgstr "OK pour le lancement ? (oui/mod/non) : "
 
 #: src/dird/ua_run.c:637 src/dird/ua_select.c:44
 msgid "mod"
-msgstr ""
+msgstr "mod"
 
-#: src/dird/ua_run.c:640 src/dird/ua_update.c:415
+#: src/dird/ua_run.c:640 src/dird/ua_update.c:463
 msgid "Parameters to modify:\n"
-msgstr ""
+msgstr "Paramètre Ã  modifier :\n"
 
 #: src/dird/ua_run.c:641
 msgid "Level"
-msgstr ""
+msgstr "Type"
+
+#: src/dird/ua_run.c:642 src/dird/ua_select.c:152
+#: src/wx-console/wxbrestorepanel.cpp:321
+#: src/wx-console/wxbrestorepanel.cpp:337
+#: src/wx-console/wxbrestorepanel.cpp:458
+#: src/wx-console/wxbrestorepanel.cpp:459
+#: src/wx-console/wxbrestorepanel.cpp:469
+#: src/wx-console/wxbrestorepanel.cpp:470
+#: src/wx-console/wxbrestorepanel.cpp:1133
+#: src/wx-console/wxbrestorepanel.cpp:1794
+#: src/wx-console/wxbrestorepanel.cpp:1865
+msgid "Storage"
+msgstr "Stockage"
+
+#: src/dird/ua_run.c:645 src/dird/ua_select.c:282 src/dird/ua_select.c:391
+#: src/wx-console/wxbrestorepanel.cpp:318
+#: src/wx-console/wxbrestorepanel.cpp:336
+#: src/wx-console/wxbrestorepanel.cpp:410
+#: src/wx-console/wxbrestorepanel.cpp:411
+#: src/wx-console/wxbrestorepanel.cpp:421
+#: src/wx-console/wxbrestorepanel.cpp:422
+#: src/wx-console/wxbrestorepanel.cpp:669
+#: src/wx-console/wxbrestorepanel.cpp:1103
+#: src/wx-console/wxbrestorepanel.cpp:1190
+#: src/wx-console/wxbrestorepanel.cpp:1787
+#: src/wx-console/wxbrestorepanel.cpp:1789
+#: src/wx-console/wxbrestorepanel.cpp:1863
+#: src/wx-console/wxbrestorepanel.cpp:1918
+msgid "Client"
+msgstr "Agent"
 
-#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:380
-#: src/wx-console/wxbrestorepanel.cpp:808
-#: src/wx-console/wxbrestorepanel.cpp:1833
+#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:338
+#: src/wx-console/wxbrestorepanel.cpp:823
+#: src/wx-console/wxbrestorepanel.cpp:1867
 msgid "When"
-msgstr ""
+msgstr "Quand"
 
-#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:381
-#: src/wx-console/wxbrestorepanel.cpp:1079
-#: src/wx-console/wxbrestorepanel.cpp:1835
+#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:339
+#: src/wx-console/wxbrestorepanel.cpp:1096
+#: src/wx-console/wxbrestorepanel.cpp:1869
 msgid "Priority"
-msgstr ""
+msgstr "Priorité"
+
+#: src/dird/ua_run.c:650 src/dird/ua_select.c:476 src/dird/ua_select.c:566
+#: src/dird/ua_update.c:400 src/dird/ua_update.c:474
+#: src/wx-console/wxbrestorepanel.cpp:320
+#: src/wx-console/wxbrestorepanel.cpp:506
+#: src/wx-console/wxbrestorepanel.cpp:516
+#: src/wx-console/wxbrestorepanel.cpp:1783
+msgid "Pool"
+msgstr "Pool"
 
 #: src/dird/ua_run.c:652
 msgid "Verify Job"
-msgstr ""
+msgstr "Job de vérification"
 
-#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:373
-#: src/wx-console/wxbrestorepanel.cpp:1814
+#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:331
+#: src/wx-console/wxbrestorepanel.cpp:1848
 msgid "Bootstrap"
-msgstr ""
+msgstr "Bootstrap"
 
-#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:374
-#: src/wx-console/wxbrestorepanel.cpp:1055
-#: src/wx-console/wxbrestorepanel.cpp:1816
+#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:332
+#: src/wx-console/wxbrestorepanel.cpp:1072
+#: src/wx-console/wxbrestorepanel.cpp:1850
 msgid "Where"
-msgstr ""
-
-#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:376
-#: src/wx-console/wxbrestorepanel.cpp:1063
-#: src/wx-console/wxbrestorepanel.cpp:1820
-#: src/wx-console/wxbrestorepanel.cpp:1821
-#: src/wx-console/wxbrestorepanel.cpp:1822
-#: src/wx-console/wxbrestorepanel.cpp:1823
-#: src/wx-console/wxbrestorepanel.cpp:1824
+msgstr "Destination"
+
+#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:334
+#: src/wx-console/wxbrestorepanel.cpp:1080
+#: src/wx-console/wxbrestorepanel.cpp:1854
+#: src/wx-console/wxbrestorepanel.cpp:1855
+#: src/wx-console/wxbrestorepanel.cpp:1856
+#: src/wx-console/wxbrestorepanel.cpp:1857
+#: src/wx-console/wxbrestorepanel.cpp:1858
 msgid "Replace"
-msgstr ""
+msgstr "Écrasement"
 
 #: src/dird/ua_run.c:658
 msgid "JobId"
-msgstr ""
+msgstr "JobId"
 
-#: src/dird/ua_run.c:660 src/dird/ua_update.c:430
+#: src/dird/ua_run.c:660 src/dird/ua_update.c:478
 msgid "Select parameter to modify"
-msgstr ""
+msgstr "Sélectionnez le paramètre Ã  modifier"
 
 #: src/dird/ua_run.c:664 src/dird/ua_run.c:691
 msgid "Levels:\n"
-msgstr ""
+msgstr "Types :\n"
 
 #: src/dird/ua_run.c:665 src/filed/status.c:368 src/lib/util.c:319
-#: src/stored/status.c:406
+#: src/stored/status.c:451
 msgid "Base"
 msgstr ""
 
-#: src/dird/ua_run.c:666 src/dird/ua_update.c:106 src/dird/ua_update.c:438
-#: src/filed/status.c:370 src/lib/util.c:321 src/stored/status.c:408
+#: src/dird/ua_run.c:666 src/filed/status.c:370 src/lib/util.c:321
+#: src/stored/status.c:453
 msgid "Full"
 msgstr ""
 
 #: src/dird/ua_run.c:667 src/filed/status.c:373 src/lib/util.c:324
-#: src/stored/status.c:411
+#: src/stored/status.c:456
 msgid "Incremental"
 msgstr ""
 
 #: src/dird/ua_run.c:668 src/filed/status.c:376 src/lib/util.c:327
-#: src/stored/status.c:414
+#: src/stored/status.c:459
 msgid "Differential"
 msgstr ""
 
 #: src/dird/ua_run.c:669 src/filed/status.c:379 src/lib/util.c:330
-#: src/stored/status.c:417
+#: src/stored/status.c:462
 msgid "Since"
 msgstr ""
 
 #: src/dird/ua_run.c:670 src/dird/ua_run.c:697
 msgid "Select level"
-msgstr ""
+msgstr "Saisissez le type"
 
 #: src/dird/ua_run.c:692
 msgid "Initialize Catalog"
-msgstr ""
+msgstr "Initialisez le catalogue"
 
 #: src/dird/ua_run.c:693 src/filed/status.c:382 src/lib/util.c:333
-#: src/stored/status.c:420
+#: src/stored/status.c:465
 msgid "Verify Catalog"
 msgstr ""
 
@@ -3954,7 +4214,7 @@ msgstr ""
 
 #: src/dird/ua_run.c:696
 msgid "Verify Volume Data (not yet implemented)"
-msgstr ""
+msgstr "Vérification des données sur le volume (pas encore implémenté)"
 
 #: src/dird/ua_run.c:718
 msgid "Level not appropriate for this Job. Cannot be changed.\n"
@@ -3964,19 +4224,21 @@ msgstr ""
 msgid ""
 "Please enter desired start time as YYYY-MM-DD HH:MM:SS (return for now): "
 msgstr ""
+"Saisissez la date de lancement (YYYY-MM-DD HH:MM:SS) (ou maintenant) : "
 
 #: src/dird/ua_run.c:771
 msgid "Enter new Priority: "
-msgstr ""
+msgstr "Saisissez la nouvelle priorité : "
 
 #: src/dird/ua_run.c:775
 msgid "Priority must be a positive integer.\n"
-msgstr ""
+msgstr "La priorité doit Ãªtre un entier positif.\n"
 
 #: src/dird/ua_run.c:793
 msgid "Please enter the Bootstrap file name: "
-msgstr ""
+msgstr "Saisissez le nom du fichier Bootstrap : "
 
+# Impossible d'ouvrir %s : ERR=%s
 #: src/dird/ua_run.c:804
 #, c-format
 msgid "Warning cannot open %s: ERR=%s\n"
@@ -3984,256 +4246,265 @@ msgstr ""
 
 #: src/dird/ua_run.c:823
 msgid "Please enter path prefix for restore (/ for none): "
-msgstr ""
+msgstr "Saisissez le chemin (prefix) pour la restauration (/ pour aucun) : "
 
 #: src/dird/ua_run.c:837
 msgid "Replace:\n"
-msgstr ""
+msgstr "Écrasement :\n"
 
 #: src/dird/ua_run.c:841
 msgid "Select replace option"
-msgstr ""
+msgstr "Saisissez l'option d'écrasement"
 
 #: src/dird/ua_run.c:851
 msgid ""
 "You must set the bootstrap file to NULL to be able to specify a JobId.\n"
 msgstr ""
 
-#: src/dird/ua_run.c:867
+#: src/dird/ua_run.c:869
 msgid "Job failed.\n"
 msgstr ""
 
-#: src/dird/ua_run.c:870
+#: src/dird/ua_run.c:872
 #, c-format
 msgid "Job started. JobId=%s\n"
-msgstr ""
+msgstr "Job démarré. JobId=%s\n"
 
-#: src/dird/ua_run.c:876
+#: src/dird/ua_run.c:878
 msgid "Job not run.\n"
 msgstr ""
 
 #: src/dird/ua_select.c:39
 #, c-format
 msgid "The current %s retention period is: %s\n"
-msgstr ""
+msgstr "La période de rétention courante %s est : %s\n"
 
 #: src/dird/ua_select.c:41
 msgid "Continue? (yes/mod/no): "
-msgstr ""
+msgstr "Continuer ? (oui/mod/non) : "
 
 #: src/dird/ua_select.c:45
 msgid "Enter new retention period: "
-msgstr ""
+msgstr "Saisissez une nouvelle période de rétention : "
 
 #: src/dird/ua_select.c:49
 msgid "Invalid period.\n"
-msgstr ""
+msgstr "Période invalide.\n"
 
 #: src/dird/ua_select.c:128
 msgid "You have the following choices:\n"
-msgstr ""
+msgstr "Vous avez les choix suivants :\n"
 
 #: src/dird/ua_select.c:144
 msgid "The defined Storage resources are:\n"
-msgstr ""
+msgstr "Les ressources de Stockage définies sont :\n"
 
 #: src/dird/ua_select.c:152
 msgid "Select Storage resource"
-msgstr ""
+msgstr "Sélectionnez la ressource de Stockage"
 
-#: src/dird/ua_select.c:189
+#: src/dird/ua_select.c:193
 msgid "catalog"
-msgstr ""
+msgstr "catalogue"
 
-#: src/dird/ua_select.c:197
+#: src/dird/ua_select.c:201
 msgid "The defined Catalog resources are:\n"
-msgstr ""
+msgstr "Les Catalogues définis sont :\n"
 
-#: src/dird/ua_select.c:205
+#: src/dird/ua_select.c:209
 msgid "Catalog"
-msgstr ""
+msgstr "Catalogue"
 
-#: src/dird/ua_select.c:205
+#: src/dird/ua_select.c:209
 msgid "Select Catalog resource"
-msgstr ""
+msgstr "Sélectionnez le Catalogue"
 
-#: src/dird/ua_select.c:220
+#: src/dird/ua_select.c:226
 msgid "The defined Job resources are:\n"
-msgstr ""
+msgstr "Les Job définis sont :\n"
 
-#: src/dird/ua_select.c:228
+#: src/dird/ua_select.c:234
 msgid "Select Job resource"
-msgstr ""
+msgstr "Sélectionnez le Job"
 
-#: src/dird/ua_select.c:241
+#: src/dird/ua_select.c:249
 msgid "The defined Restore Job resources are:\n"
-msgstr ""
+msgstr "Les Job de restauration sont :\n"
 
-#: src/dird/ua_select.c:249
+#: src/dird/ua_select.c:257
 msgid "Select Restore Job"
-msgstr ""
+msgstr "Sélectionnez le Job de restauration"
 
-#: src/dird/ua_select.c:264
+#: src/dird/ua_select.c:274
 msgid "The defined Client resources are:\n"
-msgstr ""
+msgstr "Les agents (Clients) définis sont :\n"
 
-#: src/dird/ua_select.c:272
+#: src/dird/ua_select.c:282
 msgid "Select Client (File daemon) resource"
-msgstr ""
+msgstr "Sélectionnez l'agent (File daemon)"
 
-#: src/dird/ua_select.c:297
+#: src/dird/ua_select.c:309
 #, c-format
 msgid "Error: Client resource %s does not exist.\n"
-msgstr ""
+msgstr "Erreur : l'agent (Client) %s n'est pas définie.\n"
 
-#: src/dird/ua_select.c:322
+#: src/dird/ua_select.c:334
 #, c-format
 msgid "Could not find Client %s: ERR=%s"
-msgstr ""
+msgstr "Impossible de trouver l'agent (Client) %s : ERR=%s"
 
-#: src/dird/ua_select.c:325 src/lib/bnet_server.c:285
-#: src/lib/bnet_server.c:379
+#: src/dird/ua_select.c:337 src/lib/bnet_server.c:284
+#: src/lib/bnet_server.c:378
 msgid "client"
-msgstr ""
+msgstr "client"
 
-#: src/dird/ua_select.c:326
+#: src/dird/ua_select.c:338
 msgid "fd"
-msgstr ""
+msgstr "fd"
 
-#: src/dird/ua_select.c:332 src/dird/ua_select.c:386
+#: src/dird/ua_select.c:344 src/dird/ua_select.c:398
 #, c-format
 msgid "Could not find Client \"%s\": ERR=%s"
-msgstr ""
+msgstr "Impossible de trouver l'agent (Client) Â«Â %s » : ERR=%s"
 
-#: src/dird/ua_select.c:361
+#: src/dird/ua_select.c:373
 #, c-format
 msgid "Error obtaining client ids. ERR=%s\n"
 msgstr ""
+"Erreur pendant l'obtention de l'identifiant de l'agent (Client). ERR=%s\n"
 
-#: src/dird/ua_select.c:365
+#: src/dird/ua_select.c:377
 msgid "No clients defined. You must run a job before using this command.\n"
 msgstr ""
+"Pas d'agent défini. Vous devez lancer une sauvegarde avant d'utiliser cette "
+"commande.\n"
 
-#: src/dird/ua_select.c:369
+#: src/dird/ua_select.c:381
 msgid "Defined Clients:\n"
-msgstr ""
+msgstr "Agents définis :\n"
 
-#: src/dird/ua_select.c:379
+#: src/dird/ua_select.c:391
 msgid "Select the Client"
-msgstr ""
+msgstr "Sélectionnez l'agent"
 
-#: src/dird/ua_select.c:412 src/dird/ua_select.c:435 src/dird/ua_select.c:471
+#: src/dird/ua_select.c:424 src/dird/ua_select.c:447 src/dird/ua_select.c:483
 #, c-format
 msgid "Could not find Pool \"%s\": ERR=%s"
-msgstr ""
+msgstr "Impossible de trouver le Pool Â«Â %s » : ERR=%s"
 
-#: src/dird/ua_select.c:450
+#: src/dird/ua_select.c:462
 msgid "No pools defined. Use the \"create\" command to create one.\n"
 msgstr ""
+"Pas de Pool défini. Utilisez la commande Â«Â create » pour en créer un.\n"
 
-#: src/dird/ua_select.c:454
+#: src/dird/ua_select.c:466
 msgid "Defined Pools:\n"
-msgstr ""
+msgstr "Pools définis :\n"
 
-#: src/dird/ua_select.c:464
+#: src/dird/ua_select.c:476
 msgid "Select the Pool"
-msgstr ""
+msgstr "Sélectionnez le Pool"
 
-#: src/dird/ua_select.c:494
+#: src/dird/ua_select.c:506
 #, c-format
 msgid "No access to Pool \"%s\"\n"
-msgstr ""
+msgstr "Pas d'accès au Pool Â«Â %s »\n"
 
-#: src/dird/ua_select.c:520
+#: src/dird/ua_select.c:532
 msgid "Enter MediaId or Volume name: "
-msgstr ""
+msgstr "Saisissez le MediaId ou le nom du Volume : "
 
-#: src/dird/ua_select.c:546
+#: src/dird/ua_select.c:558
 msgid "The defined Pool resources are:\n"
-msgstr ""
+msgstr "Les Pools définis sont :\n"
 
-#: src/dird/ua_select.c:554
+#: src/dird/ua_select.c:566
 msgid "Select Pool resource"
-msgstr ""
+msgstr "Sélectionnez le Pool"
 
-#: src/dird/ua_select.c:587
+#: src/dird/ua_select.c:601
 msgid "Enter the JobId to select: "
-msgstr ""
+msgstr "Entrez le JobId Ã  sélectionner : "
 
-#: src/dird/ua_select.c:624
+#: src/dird/ua_select.c:639
 #, c-format
 msgid "Could not find Job \"%s\": ERR=%s"
-msgstr ""
+msgstr "Impossible de trouver le Job Â«Â %s » : ERR=%s"
 
-#: src/dird/ua_select.c:687
+#: src/dird/ua_select.c:717
 #, c-format
 msgid "Automatically selected %s: %s\n"
-msgstr ""
+msgstr "Sélection automatique %s : %s\n"
 
-#: src/dird/ua_select.c:692
+#: src/dird/ua_select.c:722
 #, c-format
 msgid "Cannot select %s in batch mode.\n"
-msgstr ""
+msgstr "Impossible de choisir %s en mode batch.\n"
 
-#: src/dird/ua_select.c:708
+#: src/dird/ua_select.c:736
 msgid "Selection is empty!\n"
-msgstr ""
+msgstr "La sélection est vide !\n"
 
-#: src/dird/ua_select.c:714
+#: src/dird/ua_select.c:742
 msgid "Item 1 selected automatically.\n"
-msgstr ""
+msgstr "Sélection automatique de l'objet 1.\n"
 
-#: src/dird/ua_select.c:725
+#: src/dird/ua_select.c:753
 msgid "Selection aborted, nothing done.\n"
-msgstr ""
+msgstr "Sélection annulée, rien de fait.\n"
 
-#: src/dird/ua_select.c:730
+#: src/dird/ua_select.c:758
 #, c-format
 msgid "Please enter a number between 1 and %d\n"
-msgstr ""
+msgstr "Merci de saisir un nombre entre 1 et %d\n"
 
-#: src/dird/ua_select.c:778
+#: src/dird/ua_select.c:807
 msgid "Storage name given twice.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:795
+#: src/dird/ua_select.c:824
 #, c-format
 msgid "Expecting jobid=nn command, got: %s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:799
+#: src/dird/ua_select.c:828
 #, c-format
 msgid "JobId %s is not running.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:808
+#: src/dird/ua_select.c:838
 #, c-format
 msgid "Expecting job=xxx, got: %s.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:812
+#: src/dird/ua_select.c:842 src/dird/ua_select.c:854
 #, c-format
 msgid "Job \"%s\" is not running.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:828
+#: src/dird/ua_select.c:850
+#, fuzzy, c-format
+msgid "Expecting ujobid=xxx, got: %s.\n"
+msgstr "Attendait %s, a pas : %s"
+
+#: src/dird/ua_select.c:870
 #, c-format
 msgid "Storage resource \"%s\": not found\n"
 msgstr ""
 
-#: src/dird/ua_select.c:850
+#: src/dird/ua_select.c:902
 msgid "Enter autochanger drive[0]: "
 msgstr ""
 
-#: src/dird/ua_select.c:879
+#: src/dird/ua_select.c:932
 msgid "Media Types defined in conf file:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:885
+#: src/dird/ua_select.c:938
 msgid "Media Type"
 msgstr ""
 
-#: src/dird/ua_select.c:885
+#: src/dird/ua_select.c:938
 msgid "Select the Media Type"
 msgstr ""
 
@@ -4244,41 +4515,41 @@ msgstr ""
 
 #: src/dird/ua_server.c:142
 msgid "You have messages.\n"
-msgstr ""
+msgstr "Vous avez des messages.\n"
 
 #: src/dird/ua_status.c:126
 msgid "Status available for:\n"
-msgstr ""
+msgstr "Statut disponible pour :\n"
 
 #: src/dird/ua_status.c:132
 msgid "Select daemon type for status"
-msgstr ""
+msgstr "Saisissez le composant Ã  afficher"
 
 #: src/dird/ua_status.c:245
 #, c-format
 msgid "%s Version: %s (%s) %s %s %s\n"
-msgstr ""
+msgstr "%s Version : %s (%s) %s %s %s\n"
 
-#: src/dird/ua_status.c:249 src/stored/status.c:70
+#: src/dird/ua_status.c:249 src/stored/status.c:71
 #, c-format
 msgid "Daemon started %s, 1 Job run since started.\n"
-msgstr ""
+msgstr "Démon démarré depuis %s, 1 job lancé depuis cette date.\n"
 
-#: src/dird/ua_status.c:252 src/stored/status.c:73
+#: src/dird/ua_status.c:252 src/stored/status.c:74
 #, c-format
 msgid "Daemon started %s, %d Jobs run since started.\n"
-msgstr ""
+msgstr "Démon démarré depuis %s, %d jobs lancés depuis cette date.\n"
 
-#: src/dird/ua_status.c:257 src/filed/status.c:119 src/stored/status.c:77
+#: src/dird/ua_status.c:257 src/filed/status.c:121 src/stored/status.c:78
 #, c-format
 msgid " Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"
-msgstr ""
+msgstr " Tas : bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"
 
-#: src/dird/ua_status.c:277 src/dird/ua_status.c:482 src/dird/ua_status.c:644
-#: src/filed/status.c:196 src/filed/status.c:275 src/stored/status.c:317
-#: src/stored/status.c:393
+#: src/dird/ua_status.c:277 src/dird/ua_status.c:502 src/dird/ua_status.c:664
+#: src/filed/status.c:198 src/filed/status.c:277 src/stored/status.c:345
+#: src/stored/status.c:361 src/stored/status.c:438
 msgid "====\n"
-msgstr ""
+msgstr "====\n"
 
 #: src/dird/ua_status.c:289
 #, c-format
@@ -4287,6 +4558,9 @@ msgid ""
 "Failed to connect to Storage daemon %s.\n"
 "====\n"
 msgstr ""
+"\n"
+"Impossible de se connecter au Storage Daemon %s.\n"
+"====\n"
 
 #: src/dird/ua_status.c:327
 #, c-format
@@ -4294,269 +4568,280 @@ msgid ""
 "Failed to connect to Client %s.\n"
 "====\n"
 msgstr ""
+"Impossible de se connecter Ã  l'agent %s.\n"
+"====\n"
 
 #: src/dird/ua_status.c:335
 msgid "Connected to file daemon\n"
-msgstr ""
+msgstr "Connecté avec le File Daemon\n"
 
 #: src/dird/ua_status.c:350
 msgid ""
 "\n"
 "Scheduled Jobs:\n"
 msgstr ""
+"\n"
+"Jobs planifiés :\n"
 
 #: src/dird/ua_status.c:351
 msgid ""
 "Level          Type     Pri  Scheduled          Name               Volume\n"
 msgstr ""
+"Type           Action   Pri  Planification      Nom                Volume\n"
 
 #: src/dird/ua_status.c:352
 msgid "===================================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:399
+#: src/dird/ua_status.c:401
 #, c-format
 msgid "%-14s %-8s %3d  %-18s %-18s %s\n"
-msgstr ""
+msgstr "%-14s %-8s %3d  %-18s %-18s %s\n"
 
-#: src/dird/ua_status.c:480
+#: src/dird/ua_status.c:500
 msgid "No Scheduled Jobs.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:497 src/stored/status.c:269
+#: src/dird/ua_status.c:517 src/stored/status.c:277
 msgid ""
 "\n"
 "Running Jobs:\n"
 msgstr ""
+"\n"
+"Job en cours :\n"
 
-#: src/dird/ua_status.c:506
+#: src/dird/ua_status.c:525
 #, c-format
 msgid "Console connected at %s\n"
-msgstr ""
+msgstr "Console connecté Ã  %s\n"
 
-#: src/dird/ua_status.c:514
+#: src/dird/ua_status.c:535
 msgid ""
 "No Jobs running.\n"
 "====\n"
 msgstr ""
+"Pas de job en cours.\n"
+"====\n"
 
-#: src/dird/ua_status.c:519
+#: src/dird/ua_status.c:540
 msgid " JobId Level   Name                       Status\n"
-msgstr ""
+msgstr " JobId Type    Nom                        Statut\n"
 
-#: src/dird/ua_status.c:520 src/filed/status.c:219 src/stored/status.c:337
+#: src/dird/ua_status.c:541 src/filed/status.c:221 src/stored/status.c:382
 msgid "======================================================================\n"
-msgstr ""
+msgstr "======================================================================\n"
 
-#: src/dird/ua_status.c:529
+#: src/dird/ua_status.c:549
 msgid "is waiting execution"
 msgstr ""
 
-#: src/dird/ua_status.c:532
+#: src/dird/ua_status.c:552
 msgid "is running"
-msgstr ""
+msgstr "est en cours"
 
-#: src/dird/ua_status.c:535
+#: src/dird/ua_status.c:555
 msgid "is blocked"
-msgstr ""
+msgstr "est bloqué"
 
-#: src/dird/ua_status.c:538
+#: src/dird/ua_status.c:558
 msgid "has terminated"
-msgstr ""
+msgstr "est terminé"
 
-#: src/dird/ua_status.c:541
+#: src/dird/ua_status.c:561
 msgid "has erred"
 msgstr ""
 
-#: src/dird/ua_status.c:544
+#: src/dird/ua_status.c:564
 msgid "has errors"
-msgstr ""
+msgstr "est en erreur"
 
-#: src/dird/ua_status.c:547
+#: src/dird/ua_status.c:567
 msgid "has a fatal error"
-msgstr ""
+msgstr "est en erreur (fatale)"
 
-#: src/dird/ua_status.c:550
+#: src/dird/ua_status.c:570
 msgid "has verify differences"
 msgstr ""
 
-#: src/dird/ua_status.c:553
+#: src/dird/ua_status.c:573
 msgid "has been canceled"
-msgstr ""
+msgstr "a Ã©té annulé"
 
-#: src/dird/ua_status.c:557
+#: src/dird/ua_status.c:577
 #, c-format
 msgid "is waiting on Client %s"
-msgstr ""
+msgstr "est en attente de l'agent %s"
 
-#: src/dird/ua_status.c:563
+#: src/dird/ua_status.c:583
 #, c-format
 msgid "is waiting on Storage %s"
-msgstr ""
+msgstr "est en attente du Storage %s"
 
-#: src/dird/ua_status.c:568
+#: src/dird/ua_status.c:588
 msgid "is waiting on max Storage jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:571
+#: src/dird/ua_status.c:591
 msgid "is waiting on max Client jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:574
+#: src/dird/ua_status.c:594
 msgid "is waiting on max Job jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:577
+#: src/dird/ua_status.c:597
 msgid "is waiting on max total jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:580
+#: src/dird/ua_status.c:600
 msgid "is waiting for its start time"
-msgstr ""
+msgstr "attend son heure de démarrage"
 
-#: src/dird/ua_status.c:583
+#: src/dird/ua_status.c:603
 msgid "is waiting for higher priority jobs to finish"
-msgstr ""
+msgstr "attend qu'un job plus prioritaire se termine"
 
-#: src/dird/ua_status.c:588
+#: src/dird/ua_status.c:608
 #, c-format
 msgid "is in unknown state %c"
-msgstr ""
+msgstr "est dans un Ã©tat inconnu %c"
 
-#: src/dird/ua_status.c:602
+#: src/dird/ua_status.c:622
 msgid "is waiting for a mount request"
-msgstr ""
+msgstr "est en attente d'un montage"
 
-#: src/dird/ua_status.c:609
+#: src/dird/ua_status.c:629
 msgid "is waiting for an appendable Volume"
 msgstr ""
 
-#: src/dird/ua_status.c:616
+#: src/dird/ua_status.c:636
 #, c-format
 msgid "is waiting for Client %s to connect to Storage %s"
-msgstr ""
+msgstr "attend que l'agent %s se connecte au Storage %s"
 
-#: src/dird/ua_status.c:632
+#: src/dird/ua_status.c:652
 #, c-format
 msgid "%6d %-6s  %-20s %s\n"
-msgstr ""
+msgstr "%6d %-6s  %-20s %s\n"
 
-#: src/dird/ua_status.c:654 src/filed/status.c:209 src/stored/status.c:328
+#: src/dird/ua_status.c:674 src/filed/status.c:211 src/stored/status.c:373
 msgid "No Terminated Jobs.\n"
-msgstr ""
+msgstr "Pas de job terminé.\n"
 
-#: src/dird/ua_status.c:659 src/stored/status.c:333
+#: src/dird/ua_status.c:679 src/stored/status.c:378
 msgid ""
 "\n"
 "Terminated Jobs:\n"
 msgstr ""
+"\n"
+"Job terminés :\n"
 
-#: src/dird/ua_status.c:660
+#: src/dird/ua_status.c:680
 msgid " JobId  Level     Files      Bytes     Status   Finished        Name \n"
-msgstr ""
+msgstr " JobId  Type      Fichiers   Octets    Statut   Finished        Nom\n"
 
-#: src/dird/ua_status.c:661
+#: src/dird/ua_status.c:681
 msgid "========================================================================\n"
-msgstr ""
+msgstr "========================================================================\n"
 
-#: src/dird/ua_status.c:692 src/filed/status.c:239 src/lib/util.c:184
-#: src/stored/status.c:357
+#: src/dird/ua_status.c:712 src/filed/status.c:241 src/lib/util.c:178
+#: src/stored/status.c:402
 msgid "Created"
-msgstr ""
+msgstr "Crée"
 
-#: src/dird/ua_status.c:696 src/filed/status.c:243 src/lib/util.c:197
-#: src/lib/util.c:264 src/stored/status.c:361
+#: src/dird/ua_status.c:716 src/filed/status.c:245 src/lib/util.c:191
+#: src/lib/util.c:258 src/stored/status.c:406
 msgid "Error"
-msgstr ""
+msgstr "Erreur"
 
-#: src/dird/ua_status.c:699 src/filed/status.c:246 src/stored/status.c:364
+#: src/dird/ua_status.c:719 src/filed/status.c:248 src/stored/status.c:409
 msgid "Diffs"
 msgstr ""
 
-#: src/dird/ua_status.c:705 src/filed/status.c:252 src/lib/util.c:193
-#: src/lib/util.c:260 src/stored/btape.c:1160 src/stored/status.c:370
+#: src/dird/ua_status.c:725 src/filed/status.c:254 src/lib/util.c:187
+#: src/lib/util.c:254 src/stored/btape.c:1158 src/stored/status.c:415
 #: src/wx-console/wxbconfigpanel.cpp:180
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
-#: src/dird/ua_status.c:708 src/filed/status.c:255 src/stored/status.c:373
+#: src/dird/ua_status.c:728 src/filed/status.c:257 src/stored/status.c:418
 msgid "Other"
-msgstr ""
+msgstr "Autre"
 
-#: src/dird/ua_status.c:711 src/filed/status.c:266 src/stored/status.c:384
+#: src/dird/ua_status.c:731 src/filed/status.c:268 src/stored/status.c:429
 #, c-format
 msgid "%6d  %-6s %8s %14s %-7s  %-8s %s\n"
-msgstr ""
+msgstr "%6d  %-6s %8s %14s %-7s  %-8s %s\n"
 
-#: src/dird/ua_status.c:719 src/stored/btape.c:180
+#: src/dird/ua_status.c:739 src/stored/btape.c:180
 msgid "\n"
-msgstr ""
+msgstr "\n"
 
-#: src/dird/ua_tree.c:57
+#: src/dird/ua_tree.c:58
 msgid "change current directory"
-msgstr ""
+msgstr "changer le répertoire courant"
 
-#: src/dird/ua_tree.c:58
+#: src/dird/ua_tree.c:59
 msgid "count marked files in and below the cd"
 msgstr ""
 
-#: src/dird/ua_tree.c:59
+#: src/dird/ua_tree.c:60 src/dird/ua_tree.c:61
 msgid "long list current directory, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:60
+#: src/dird/ua_tree.c:62
 msgid "leave file selection mode"
 msgstr ""
 
-#: src/dird/ua_tree.c:61
+#: src/dird/ua_tree.c:63
 msgid "estimate restore size"
-msgstr ""
+msgstr "estimer la taille de la restauration"
 
-#: src/dird/ua_tree.c:62
+#: src/dird/ua_tree.c:64
 msgid "same as done command"
 msgstr ""
 
-#: src/dird/ua_tree.c:63
+#: src/dird/ua_tree.c:65
 msgid "find files, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:64 src/dird/ua_tree.c:73
+#: src/dird/ua_tree.c:66 src/dird/ua_tree.c:75
 msgid "print help"
-msgstr ""
+msgstr "affiche l'aide"
 
-#: src/dird/ua_tree.c:65
+#: src/dird/ua_tree.c:67
 msgid "list current directory, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:66
+#: src/dird/ua_tree.c:68
 msgid "list the marked files in and below the cd"
 msgstr ""
 
-#: src/dird/ua_tree.c:67
-msgid "mark dir/file to be restored recursively in dirs"
+#: src/dird/ua_tree.c:69
+msgid "mark dir/file to be restored recursively, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:68
+#: src/dird/ua_tree.c:70
 msgid "mark directory name to be restored (no files)"
 msgstr ""
 
-#: src/dird/ua_tree.c:69
+#: src/dird/ua_tree.c:71
 msgid "print current working directory"
-msgstr ""
+msgstr "affiche le répertoire courant"
 
-#: src/dird/ua_tree.c:70
+#: src/dird/ua_tree.c:72
 msgid "unmark dir/file to be restored recursively in dir"
 msgstr ""
 
-#: src/dird/ua_tree.c:71
+#: src/dird/ua_tree.c:73
 msgid "unmark directory name only no recursion"
 msgstr ""
 
-#: src/dird/ua_tree.c:72
+#: src/dird/ua_tree.c:74
 msgid "quit and do not do restore"
-msgstr ""
+msgstr "quitte et annule la restauration"
 
-#: src/dird/ua_tree.c:92
+#: src/dird/ua_tree.c:94
 msgid ""
 "\n"
 "You are now entering file selection mode where you add (mark) and\n"
@@ -4565,764 +4850,728 @@ msgid ""
 "Enter \"done\" to leave this mode.\n"
 "\n"
 msgstr ""
+"\n"
+"Vous Ãªtes dans le mode de sélection des fichiers ou vous devez ajouter "
+"(mark)\n"
+"et supprimez (unmark) les fichiers Ã  restaurer. Aucun fichier n'est "
+"sélectionné\n"
+"par défaut sauf si vous avez utilisé l'option Â«Â all » dans la commande.\n"
+"Terminez votre saisie par Â«Â done »\n"
+"\n"
 
-#: src/dird/ua_tree.c:102 src/dird/ua_tree.c:633 src/dird/ua_tree.c:641
+#: src/dird/ua_tree.c:104 src/dird/ua_tree.c:671 src/dird/ua_tree.c:679
 #, c-format
 msgid "cwd is: %s\n"
-msgstr ""
+msgstr "Le répertoire courant est : %s\n"
 
-#: src/dird/ua_tree.c:123
+#: src/dird/ua_tree.c:125
 msgid "Illegal command. Enter \"done\" to exit.\n"
-msgstr ""
+msgstr "Commande invalide. Tapez Â«Â done » pour quitter.\n"
 
-#: src/dird/ua_tree.c:296 src/dird/ua_tree.c:307 src/dird/ua_tree.c:324
+#: src/dird/ua_tree.c:298 src/dird/ua_tree.c:309 src/dird/ua_tree.c:326
 msgid "No files marked.\n"
-msgstr ""
+msgstr "Aucun fichier sélectionné.\n"
 
-#: src/dird/ua_tree.c:309
+#: src/dird/ua_tree.c:311
 msgid "1 file marked.\n"
-msgstr ""
+msgstr "1 fichier sélectionné.\n"
 
-#: src/dird/ua_tree.c:311
+#: src/dird/ua_tree.c:313
 #, c-format
 msgid "%s files marked.\n"
-msgstr ""
+msgstr "%s fichiers sélectionnés.\n"
 
-#: src/dird/ua_tree.c:338
+#: src/dird/ua_tree.c:340
 msgid "No directories marked.\n"
-msgstr ""
+msgstr "Pas de répertoire sélectionné.\n"
 
-#: src/dird/ua_tree.c:340
+#: src/dird/ua_tree.c:342
 msgid "1 directory marked.\n"
-msgstr ""
+msgstr "1 répertoire sélectionné.\n"
 
-#: src/dird/ua_tree.c:342
+#: src/dird/ua_tree.c:344
 #, c-format
 msgid "%s directories marked.\n"
-msgstr ""
+msgstr "%s répertoires sélectionnés.\n"
 
-#: src/dird/ua_tree.c:363
+#: src/dird/ua_tree.c:365
 #, c-format
 msgid "%s total files/dirs. %s marked to be restored.\n"
 msgstr ""
+"%s fichiers/répertoires au total. %s sélectionné pour la restauration.\n"
 
-#: src/dird/ua_tree.c:374
+#: src/dird/ua_tree.c:376
 msgid "No file specification given.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:502
+#: src/dird/ua_tree.c:527
 #, c-format
 msgid "Node %s has no children.\n"
-msgstr ""
+msgstr "Le noeud %s n'a pas de fils.\n"
 
-#: src/dird/ua_tree.c:583
+#: src/dird/ua_tree.c:618
 #, c-format
 msgid "%d total files; %d marked to be restored; %s bytes.\n"
-msgstr ""
+msgstr "%d fichiers en tout ; %d marqués pour la restauration ; %s octets.\n"
 
-#: src/dird/ua_tree.c:625
+#: src/dird/ua_tree.c:663
 msgid "Invalid path given.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:652 src/dird/ua_tree.c:663
+#: src/dird/ua_tree.c:690 src/dird/ua_tree.c:701
 msgid "No files unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:665
+#: src/dird/ua_tree.c:703
 msgid "1 file unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:667
+#: src/dird/ua_tree.c:705
 #, c-format
 msgid "%d files unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:678 src/dird/ua_tree.c:694
+#: src/dird/ua_tree.c:716 src/dird/ua_tree.c:732
 msgid "No directories unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:696
+#: src/dird/ua_tree.c:734
 msgid "1 directory unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:698
+#: src/dird/ua_tree.c:736
 #, c-format
 msgid "%d directories unmarked.\n"
 msgstr ""
 
-#: src/dird/verify.c:87
-msgid ""
-"Unable to find JobId of previous InitCatalog Job.\n"
-"Please run a Verify with Level=InitCatalog before\n"
-"running the current Job.\n"
-msgstr ""
+#: src/dird/ua_update.c:79
+msgid "Update choice:\n"
+msgstr "Choix disponibles :\n"
 
-#: src/dird/verify.c:108
-#, c-format
-msgid "Could not get job record for previous Job. ERR=%s"
-msgstr ""
+#: src/dird/ua_update.c:80
+msgid "Volume parameters"
+msgstr "Paramètres d'un volume"
 
-#: src/dird/verify.c:113
-#, c-format
-msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
+#: src/dird/ua_update.c:81
+msgid "Pool from resource"
 msgstr ""
 
-#: src/dird/verify.c:117
-#, c-format
-msgid "Verifying against JobId=%d Job=%s\n"
+#: src/dird/ua_update.c:82
+msgid "Slots from autochanger"
 msgstr ""
 
-#: src/dird/verify.c:183
-#, c-format
-msgid "Start Verify JobId=%d Level=%s Job=%s\n"
+#: src/dird/ua_update.c:83
+msgid "item"
 msgstr ""
 
-#: src/dird/verify.c:262
-msgid "Deprecated feature ... use bootstrap.\n"
+#: src/dird/ua_update.c:83
+msgid "Choose catalog item to update"
 msgstr ""
 
-#: src/dird/verify.c:275
+#: src/dird/ua_update.c:122
 #, c-format
-msgid "Unimplemented Verify level %d(%c)\n"
+msgid "Invalid VolStatus specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:327
+#: src/dird/ua_update.c:131
 #, c-format
-msgid "Unimplemented verify level %d\n"
+msgid "New Volume status is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:382
-msgid "Verify OK"
-msgstr ""
+#: src/dird/ua_update.c:141
+#, c-format
+msgid "Invalid retention period specified: %s\n"
+msgstr "Période de rétention invalide : %s\n"
 
-#: src/dird/verify.c:386
-msgid "*** Verify Error ***"
-msgstr ""
+#: src/dird/ua_update.c:149
+#, c-format
+msgid "New retention period is: %s\n"
+msgstr "La nouvelle période de rétention est : %s\n"
 
-#: src/dird/verify.c:390
-msgid "Verify warnings"
-msgstr ""
+#: src/dird/ua_update.c:160
+#, c-format
+msgid "Invalid use duration specified: %s\n"
+msgstr "Durée d'utilisation invalide : %s\n"
 
-#: src/dird/verify.c:393
-msgid "Verify Canceled"
-msgstr ""
+#: src/dird/ua_update.c:168
+#, c-format
+msgid "New use duration is: %s\n"
+msgstr "La nouvelle durée d'utilisation est : %s\n"
 
-#: src/dird/verify.c:396
-msgid "Verify Differences"
+#: src/dird/ua_update.c:182
+#, c-format
+msgid "New max jobs is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:401
+#: src/dird/ua_update.c:195
 #, c-format
-msgid "Inappropriate term code: %d %c\n"
+msgid "New max files is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:415
+#: src/dird/ua_update.c:206
 #, c-format
-msgid ""
-"Bacula %s (%s): %s\n"
-"  JobId:                  %d\n"
-"  Job:                    %s\n"
-"  FileSet:                %s\n"
-"  Verify Level:           %s\n"
-"  Client:                 %s\n"
-"  Verify JobId:           %d\n"
-"  Verify Job:             %s\n"
-"  Start time:             %s\n"
-"  End time:               %s\n"
-"  Files Expected:         %s\n"
-"  Files Examined:         %s\n"
-"  Non-fatal FD errors:    %d\n"
-"  FD termination status:  %s\n"
-"  SD termination status:  %s\n"
-"  Termination:            %s\n"
-"\n"
+msgid "Invalid max. bytes specification: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:450
+#: src/dird/ua_update.c:214
 #, c-format
-msgid ""
-"Bacula %s (%s): %s\n"
-"  JobId:                  %d\n"
-"  Job:                    %s\n"
-"  FileSet:                %s\n"
-"  Verify Level:           %s\n"
-"  Client:                 %s\n"
-"  Verify JobId:           %d\n"
-"  Verify Job:             %s\n"
-"  Start time:             %s\n"
-"  End time:               %s\n"
-"  Files Examined:         %s\n"
-"  Non-fatal FD errors:    %d\n"
-"  FD termination status:  %s\n"
-"  Termination:            %s\n"
-"\n"
+msgid "New Max bytes is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:526
+#: src/dird/ua_update.c:228 src/dird/ua_update.c:252
+msgid "Invalid value. It must be yes or no.\n"
+msgstr "Saisie invalide. Veuillez répondre oui ou non.\n"
+
+#: src/dird/ua_update.c:236
 #, c-format
-msgid ""
-"bird<filed: bad attributes, expected 3 fields got %d\n"
-" mslen=%d msg=%s\n"
+msgid "New Recycle flag is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:570
+#: src/dird/ua_update.c:260
 #, c-format
-msgid "New file: %s\n"
+msgid "New InChanger flag is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:571
+#: src/dird/ua_update.c:278
 #, c-format
-msgid "File not in catalog: %s\n"
-msgstr ""
+msgid "Invalid slot, it must be between 0 and MaxVols=%d\n"
+msgstr "Slot invalide, il doit Ãªtre compris entre 0 et MaxVols=%d\n"
 
-#: src/dird/verify.c:595
+#: src/dird/ua_update.c:287 src/dird/ua_update.c:578
 #, c-format
-msgid "      st_ino   differ. Cat: %s File: %s\n"
+msgid "Error updating media record Slot: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:604
+#: src/dird/ua_update.c:289
 #, c-format
-msgid "      st_mode  differ. Cat: %x File: %x\n"
-msgstr ""
+msgid "New Slot is: %d\n"
+msgstr "Le nouveau slot est : %d\n"
 
-#: src/dird/verify.c:612
+#: src/dird/ua_update.c:316
 #, c-format
-msgid "      st_nlink differ. Cat: %d File: %d\n"
-msgstr ""
+msgid "New Pool is: %s\n"
+msgstr "Le nouveau pool est : %s\n"
 
-#: src/dird/verify.c:620
+#: src/dird/ua_update.c:345
 #, c-format
-msgid "      st_uid   differ. Cat: %u File: %u\n"
+msgid "Error updating Volume record: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:628
+#: src/dird/ua_update.c:347
 #, c-format
-msgid "      st_gid   differ. Cat: %u File: %u\n"
+msgid "Volume defaults updated from \"%s\" Pool record.\n"
 msgstr ""
 
-#: src/dird/verify.c:636
+#: src/dird/ua_update.c:369
 #, c-format
-msgid "      st_size  differ. Cat: %s File: %s\n"
+msgid "Error updating Volume records: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:645
-msgid "      st_atime differs\n"
+#: src/dird/ua_update.c:371
+msgid "All Volume defaults updated from Pool record.\n"
 msgstr ""
 
-#: src/dird/verify.c:652
-msgid "      st_mtime differs\n"
+#: src/dird/ua_update.c:391
+msgid "VolStatus"
 msgstr ""
 
-#: src/dird/verify.c:659
-msgid "      st_ctime differs\n"
+#: src/dird/ua_update.c:392
+msgid "VolRetention"
 msgstr ""
 
-#: src/dird/verify.c:666
-#, c-format
-msgid "      st_size  decrease. Cat: %s File: %s\n"
+#: src/dird/ua_update.c:393
+msgid "VolUse"
 msgstr ""
 
-#: src/dird/verify.c:705
-#, c-format
-msgid "      %s not same. File=%s Cat=%s\n"
+#: src/dird/ua_update.c:394
+msgid "MaxVolJobs"
 msgstr ""
 
-#: src/dird/verify.c:708
-#, c-format
-msgid "      %s differs.\n"
+#: src/dird/ua_update.c:395
+msgid "MaxVolFiles"
 msgstr ""
 
-#: src/dird/verify.c:720
-#, c-format
-msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
+#: src/dird/ua_update.c:396
+msgid "MaxVolBytes"
 msgstr ""
 
-#: src/dird/verify.c:757
-msgid "The following files are missing:\n"
+#: src/dird/ua_update.c:397
+msgid "Recycle"
 msgstr ""
 
-#: src/dird/verify.c:771 src/tools/testfind.c:338
-#, c-format
-msgid "File: %s\n"
+#: src/dird/ua_update.c:398
+msgid "InChanger"
 msgstr ""
 
-#: src/dird/ua_update.c:79
-msgid "Update choice:\n"
+#: src/dird/ua_update.c:399 src/dird/ua_update.c:471
+msgid "Slot"
 msgstr ""
 
-#: src/dird/ua_update.c:80
-msgid "Volume parameters"
-msgstr ""
-
-#: src/dird/ua_update.c:81
-msgid "Pool from resource"
-msgstr ""
-
-#: src/dird/ua_update.c:82
-msgid "Slots from autochanger"
-msgstr ""
-
-#: src/dird/ua_update.c:83
-msgid "item"
-msgstr ""
-
-#: src/dird/ua_update.c:83
-msgid "Choose catalog item to update"
-msgstr ""
-
-#: src/dird/ua_update.c:103 src/dird/ua_update.c:435
-msgid "Append"
-msgstr ""
-
-#: src/dird/ua_update.c:104 src/dird/ua_update.c:436
-msgid "Archive"
-msgstr ""
-
-#: src/dird/ua_update.c:105 src/dird/ua_update.c:437
-msgid "Disabled"
-msgstr ""
-
-#: src/dird/ua_update.c:107 src/dird/ua_update.c:439
-msgid "Used"
-msgstr ""
-
-#: src/dird/ua_update.c:108 src/dird/ua_update.c:440
-msgid "Cleaning"
-msgstr ""
-
-#: src/dird/ua_update.c:109 src/dird/ua_update.c:355 src/dird/ua_update.c:442
-msgid "Recycle"
-msgstr ""
-
-#: src/dird/ua_update.c:110 src/dird/ua_update.c:444
-msgid "Read-Only"
-msgstr ""
-
-#: src/dird/ua_update.c:122
-#, c-format
-msgid "Invalid VolStatus specified: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:131
-#, c-format
-msgid "New Volume status is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:142
-#, c-format
-msgid "Invalid retention period specified: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:151
-#, c-format
-msgid "New retention period is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:163
-#, c-format
-msgid "Invalid use duration specified: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:172
-#, c-format
-msgid "New use duration is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:187
-#, c-format
-msgid "New max jobs is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:201
-#, c-format
-msgid "New max files is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:213
-#, c-format
-msgid "Invalid max. bytes specification: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:222
-#, c-format
-msgid "New Max bytes is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:237
-msgid "Invalid value. It must by yes or no.\n"
-msgstr ""
-
-#: src/dird/ua_update.c:246
-#, c-format
-msgid "New Recycle flag is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:275
-#, c-format
-msgid "New Pool is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:304
-#, c-format
-msgid "Error updating Volume record: ERR=%s"
-msgstr ""
-
-#: src/dird/ua_update.c:306
-#, c-format
-msgid "Volume defaults updated from \"%s\" Pool record.\n"
-msgstr ""
-
-#: src/dird/ua_update.c:328
-#, c-format
-msgid "Error updating Volume records: ERR=%s"
-msgstr ""
-
-#: src/dird/ua_update.c:330
-msgid "All Volume defaults updated from Pool record.\n"
-msgstr ""
-
-#: src/dird/ua_update.c:349
-msgid "VolStatus"
-msgstr ""
-
-#: src/dird/ua_update.c:350
-msgid "VolRetention"
-msgstr ""
-
-#: src/dird/ua_update.c:351
-msgid "VolUse"
-msgstr ""
-
-#: src/dird/ua_update.c:352
-msgid "MaxVolJobs"
-msgstr ""
-
-#: src/dird/ua_update.c:353
-msgid "MaxVolFiles"
-msgstr ""
-
-#: src/dird/ua_update.c:354
-msgid "MaxVolBytes"
-msgstr ""
-
-#: src/dird/ua_update.c:357
+#: src/dird/ua_update.c:401
 msgid "FromPool"
 msgstr ""
 
-#: src/dird/ua_update.c:358
+#: src/dird/ua_update.c:402
 msgid "AllFromPool"
 msgstr ""
 
-#: src/dird/ua_update.c:414
-#, c-format
-msgid "Updating Volume \"%s\"\n"
-msgstr ""
-
-#: src/dird/ua_update.c:416
+#: src/dird/ua_update.c:464
 msgid "Volume Status"
 msgstr ""
 
-#: src/dird/ua_update.c:417
+#: src/dird/ua_update.c:465
 msgid "Volume Retention Period"
 msgstr ""
 
-#: src/dird/ua_update.c:418
+#: src/dird/ua_update.c:466
 msgid "Volume Use Duration"
 msgstr ""
 
-#: src/dird/ua_update.c:419
+#: src/dird/ua_update.c:467
 msgid "Maximum Volume Jobs"
 msgstr ""
 
-#: src/dird/ua_update.c:420
+#: src/dird/ua_update.c:468
 msgid "Maximum Volume Files"
 msgstr ""
 
-#: src/dird/ua_update.c:421
+#: src/dird/ua_update.c:469
 msgid "Maximum Volume Bytes"
 msgstr ""
 
-#: src/dird/ua_update.c:422
+#: src/dird/ua_update.c:470
 msgid "Recycle Flag"
 msgstr ""
 
-#: src/dird/ua_update.c:423
-msgid "Slot"
-msgstr ""
-
-#: src/dird/ua_update.c:424
+#: src/dird/ua_update.c:472
 msgid "InChanger Flag"
 msgstr ""
 
-#: src/dird/ua_update.c:425
+#: src/dird/ua_update.c:473
 msgid "Volume Files"
 msgstr ""
 
-#: src/dird/ua_update.c:427
+#: src/dird/ua_update.c:475
 msgid "Volume from Pool"
 msgstr ""
 
-#: src/dird/ua_update.c:428
+#: src/dird/ua_update.c:476
 msgid "All Volumes from Pool"
 msgstr ""
 
-#: src/dird/ua_update.c:429
+#: src/dird/ua_update.c:477
 msgid "Done"
+msgstr "Fin"
+
+#: src/dird/ua_update.c:485
+#, c-format
+msgid "Updating Volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:433
+#: src/dird/ua_update.c:490
 #, c-format
 msgid "Current Volume status is: %s\n"
-msgstr ""
+msgstr "Le statut actuel du volume (Volume status) est : %s\n"
 
-#: src/dird/ua_update.c:434
+#: src/dird/ua_update.c:491
 msgid "Possible Values are:\n"
-msgstr ""
-
-#: src/dird/ua_update.c:441
-msgid "Purged"
-msgstr ""
+msgstr "Les valeurs possibles sont :\n"
 
-#: src/dird/ua_update.c:445
+#: src/dird/ua_update.c:502
 msgid "Choose new Volume Status"
-msgstr ""
+msgstr "Saisissez le nouveau statut du volume (Volume Status)"
 
-#: src/dird/ua_update.c:451
+#: src/dird/ua_update.c:508
 #, c-format
 msgid "Current retention period is: %s\n"
-msgstr ""
+msgstr "La période de rétention actuelle est : %s\n"
 
-#: src/dird/ua_update.c:453
+#: src/dird/ua_update.c:510
 msgid "Enter Volume Retention period: "
-msgstr ""
+msgstr "Saisissez la période de rétention du volume : "
 
-#: src/dird/ua_update.c:460
+#: src/dird/ua_update.c:517
 #, c-format
 msgid "Current use duration is: %s\n"
-msgstr ""
+msgstr "La durée d'utilisation actuelle est : %s\n"
 
-#: src/dird/ua_update.c:462
+#: src/dird/ua_update.c:519
 msgid "Enter Volume Use Duration: "
-msgstr ""
+msgstr "Saisissez la durée d'utilisation du volume : "
 
-#: src/dird/ua_update.c:469
+#: src/dird/ua_update.c:526
 #, c-format
 msgid "Current max jobs is: %u\n"
-msgstr ""
+msgstr "Le nombre maximum de Job actuel est : %u\n"
 
-#: src/dird/ua_update.c:470
+#: src/dird/ua_update.c:527
 msgid "Enter new Maximum Jobs: "
-msgstr ""
+msgstr "Saisissez la valeur du nombre maximum de Job : "
 
-#: src/dird/ua_update.c:477
+#: src/dird/ua_update.c:534
 #, c-format
 msgid "Current max files is: %u\n"
-msgstr ""
+msgstr "Le nombre maximum de fichier actuel est : %u\n"
 
-#: src/dird/ua_update.c:478
+#: src/dird/ua_update.c:535
 msgid "Enter new Maximum Files: "
-msgstr ""
+msgstr "Saisissez la valeur du nombre maximum de fichier (Maximum Files) : "
 
-#: src/dird/ua_update.c:485
+#: src/dird/ua_update.c:542
 #, c-format
 msgid "Current value is: %s\n"
-msgstr ""
+msgstr "La valeur actuelle est : %s\n"
 
-#: src/dird/ua_update.c:486
+#: src/dird/ua_update.c:543
 msgid "Enter new Maximum Bytes: "
 msgstr ""
 
-#: src/dird/ua_update.c:494
+#: src/dird/ua_update.c:551
 #, c-format
 msgid "Current recycle flag is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:496
+#: src/dird/ua_update.c:553
 msgid "Enter new Recycle status: "
 msgstr ""
 
-#: src/dird/ua_update.c:511
+#: src/dird/ua_update.c:560
 #, c-format
 msgid "Current Slot is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:512
+#: src/dird/ua_update.c:561
 msgid "Enter new Slot: "
 msgstr ""
 
-#: src/dird/ua_update.c:517
-#, c-format
-msgid "Invalid slot, it must be between 0 and %d\n"
-msgstr ""
-
-#: src/dird/ua_update.c:527 src/dird/ua_update.c:544
-#, c-format
-msgid "Error updating media record Slot: ERR=%s"
-msgstr ""
-
-#: src/dird/ua_update.c:529
-#, c-format
-msgid "New Slot is: %d\n"
-msgstr ""
-
-#: src/dird/ua_update.c:534
+#: src/dird/ua_update.c:568
 #, c-format
 msgid "Current InChanger flag is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:535
+#: src/dird/ua_update.c:569
 msgid "Set InChanger flag? yes/no: "
 msgstr ""
 
-#: src/dird/ua_update.c:546
+#: src/dird/ua_update.c:580
 #, c-format
 msgid "New InChanger flag is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:553
+#: src/dird/ua_update.c:587
 msgid ""
 "Warning changing Volume Files can result\n"
 "in loss of data on your Volume\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_update.c:555
+#: src/dird/ua_update.c:589
 #, c-format
 msgid "Current Volume Files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:556
+#: src/dird/ua_update.c:590
 msgid "Enter new number of Files for Volume: "
 msgstr ""
 
-#: src/dird/ua_update.c:561
+#: src/dird/ua_update.c:595
 msgid "Normally, you should only increase Volume Files by one!\n"
 msgstr ""
 
-#: src/dird/ua_update.c:562
+#: src/dird/ua_update.c:596
 msgid "Continue? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_update.c:572
+#: src/dird/ua_update.c:606
 #, c-format
 msgid "New Volume Files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:584
+#: src/dird/ua_update.c:618
 #, c-format
 msgid "Current Pool is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:585
+#: src/dird/ua_update.c:619
 msgid "Enter new Pool name: "
 msgstr ""
 
-#: src/dird/ua_update.c:598
-msgid "Selection done.\n"
+#: src/dird/ua_update.c:632
+msgid "Selection terminated.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:631
+#: src/dird/ua_update.c:665
 #, c-format
 msgid "db_update_pool_record returned %d. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:638
+#: src/dird/ua_update.c:672
 msgid "Pool DB record updated from resource.\n"
 msgstr ""
 
-#: src/dird/pythondir.c:105 src/filed/pythonfd.c:102 src/filed/pythonfd.c:156
-#: src/filed/pythonfd.c:220 src/stored/pythonsd.c:95 src/stored/pythonsd.c:160
-msgid "Job pointer not found."
-msgstr ""
-
-#: src/dird/pythondir.c:137
-msgid "Pool record not found."
-msgstr ""
-
-#: src/dird/pythondir.c:166 src/filed/pythonfd.c:133 src/stored/pythonsd.c:137
-#, c-format
-msgid "Attribute %s not found."
-msgstr ""
-
-#: src/dird/pythondir.c:209 src/dird/pythondir.c:215 src/filed/pythonfd.c:175
-#: src/stored/pythonsd.c:177
-msgid "Read-only attribute"
+#: src/dird/verify.c:87
+msgid ""
+"Unable to find JobId of previous InitCatalog Job.\n"
+"Please run a Verify with Level=InitCatalog before\n"
+"running the current Job.\n"
 msgstr ""
+"Impossible de trouvé JobId d'un précédent Job Â«Â InitCatalog.\n"
+"Il faut lancer un Job Verify avec l'option Level=InitCatalog avant\n"
+"de lancer le Job courant.\n"
 
-#: src/filed/authenticate.c:50
+#: src/dird/verify.c:117
 #, c-format
-msgid "I only authenticate directors, not %d\n"
+msgid "Verifying against JobId=%d Job=%s\n"
 msgstr ""
 
-#: src/filed/authenticate.c:56 src/stored/authenticate.c:59
+#: src/dird/verify.c:180
 #, c-format
-msgid "Bad Hello command from Director at %s. Len=%d.\n"
+msgid "Start Verify JobId=%s Level=%s Job=%s\n"
 msgstr ""
 
-#: src/filed/authenticate.c:68 src/stored/authenticate.c:70
-#, c-format
-msgid "Bad Hello command from Director at %s: %s\n"
+#: src/dird/verify.c:263
+msgid "Deprecated feature ... use bootstrap.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:82 src/stored/authenticate.c:85
+#: src/dird/verify.c:276
 #, c-format
-msgid ""
-"Connection from unknown Director %s at %s rejected.\n"
-"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
-"help.\n"
+msgid "Unimplemented Verify level %d(%c)\n"
 msgstr ""
 
-#: src/filed/authenticate.c:115
+#: src/dird/verify.c:328
 #, c-format
-msgid ""
-"Incorrect password given by Director at %s.\n"
-"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
-"help.\n"
-msgstr ""
-
-#: src/filed/authenticate.c:169 src/stored/dircmd.c:184
-msgid "Unable to authenticate Director\n"
+msgid "Unimplemented verify level %d\n"
 msgstr ""
 
-#: src/filed/authenticate.c:213
-msgid ""
-"Authorization key rejected by Storage daemon.\n"
-"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
-"help.\n"
-msgstr ""
+#: src/dird/verify.c:383
+msgid "Verify OK"
+msgstr "Vérification OK"
 
-#: src/filed/backup.c:68
-msgid "Cannot set buffer size FD->SD.\n"
-msgstr ""
+#: src/dird/verify.c:387
+msgid "*** Verify Error ***"
+msgstr "*** Erreur de Vérification ***"
 
-#: src/filed/backup.c:155
-#, c-format
-msgid "     Recursion turned off. Will not descend into %s\n"
+#: src/dird/verify.c:391
+msgid "Verify warnings"
 msgstr ""
 
-#: src/filed/backup.c:162
-#, c-format
-msgid "     Filesystem change prohibited. Will not descend into %s\n"
-msgstr ""
+#: src/dird/verify.c:394
+msgid "Verify Canceled"
+msgstr "Vérification annulée"
 
-#: src/filed/backup.c:168
-#, c-format
-msgid "     Disallowed filesystem. Will not descend into %s\n"
+#: src/dird/verify.c:397
+msgid "Verify Differences"
 msgstr ""
 
-#: src/filed/backup.c:186 src/filed/verify.c:113
+#: src/dird/verify.c:402
 #, c-format
-msgid "     Could not access %s: ERR=%s\n"
+msgid "Inappropriate term code: %d %c\n"
 msgstr ""
 
-#: src/filed/backup.c:193 src/filed/verify.c:120
+#: src/dird/verify.c:416
 #, c-format
-msgid "     Could not follow link %s: ERR=%s\n"
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Expected:         %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
 msgstr ""
 
-#: src/filed/backup.c:200 src/filed/verify.c:127
+#: src/dird/verify.c:451
 #, c-format
-msgid "     Could not stat %s: ERR=%s\n"
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
+msgstr ""
+
+#: src/dird/verify.c:527
+#, c-format
+msgid ""
+"bird<filed: bad attributes, expected 3 fields got %d\n"
+" mslen=%d msg=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:571
+#, c-format
+msgid "New file: %s\n"
+msgstr "Nouveau Fichier : %s\n"
+
+#: src/dird/verify.c:572
+#, c-format
+msgid "File not in catalog: %s\n"
+msgstr "Fichier absent du catalogue : %s\n"
+
+#: src/dird/verify.c:596
+#, c-format
+msgid "      st_ino   differ. Cat: %s File: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:605
+#, c-format
+msgid "      st_mode  differ. Cat: %x File: %x\n"
+msgstr ""
+
+#: src/dird/verify.c:613
+#, c-format
+msgid "      st_nlink differ. Cat: %d File: %d\n"
+msgstr ""
+
+#: src/dird/verify.c:621
+#, c-format
+msgid "      st_uid   differ. Cat: %u File: %u\n"
+msgstr ""
+
+#: src/dird/verify.c:629
+#, c-format
+msgid "      st_gid   differ. Cat: %u File: %u\n"
+msgstr ""
+
+#: src/dird/verify.c:637
+#, c-format
+msgid "      st_size  differ. Cat: %s File: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:646
+msgid "      st_atime differs\n"
+msgstr ""
+
+#: src/dird/verify.c:653
+msgid "      st_mtime differs\n"
+msgstr ""
+
+#: src/dird/verify.c:660
+msgid "      st_ctime differs\n"
+msgstr ""
+
+#: src/dird/verify.c:667
+#, c-format
+msgid "      st_size  decrease. Cat: %s File: %s\n"
+msgstr ""
+
+#: src/dird/verify.c:706
+#, c-format
+msgid "      %s not same. File=%s Cat=%s\n"
+msgstr ""
+
+#: src/dird/verify.c:709
+#, c-format
+msgid "      %s differs.\n"
+msgstr ""
+
+#: src/dird/verify.c:721
+#, c-format
+msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
+msgstr ""
+
+#: src/dird/verify.c:758
+msgid "The following files are missing:\n"
+msgstr "Les fichiers suivants sont absents :\n"
+
+#: src/dird/verify.c:772 src/tools/testfind.c:338
+#, c-format
+msgid "File: %s\n"
+msgstr "Fichier : %s\n"
+
+#: src/filed/authenticate.c:45
+#, c-format
+msgid "I only authenticate directors, not %d\n"
+msgstr ""
+
+#: src/filed/authenticate.c:51 src/stored/authenticate.c:59
+#, c-format
+msgid "Bad Hello command from Director at %s. Len=%d.\n"
+msgstr ""
+
+#: src/filed/authenticate.c:63 src/stored/authenticate.c:70
+#, c-format
+msgid "Bad Hello command from Director at %s: %s\n"
+msgstr ""
+
+#: src/filed/authenticate.c:77 src/stored/authenticate.c:85
+#, c-format
+msgid ""
+"Connection from unknown Director %s at %s rejected.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/filed/authenticate.c:110
+#, c-format
+msgid ""
+"Incorrect password given by Director at %s.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/filed/authenticate.c:164 src/stored/dircmd.c:184
+msgid "Unable to authenticate Director\n"
+msgstr ""
+
+#: src/filed/authenticate.c:208
+msgid ""
+"Authorization key rejected by Storage daemon.\n"
+"Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
+"help.\n"
+msgstr ""
+
+#: src/filed/backup.c:68
+msgid "Cannot set buffer size FD->SD.\n"
+msgstr ""
+
+#: src/filed/backup.c:155
+#, c-format
+msgid "     Recursion turned off. Will not descend into %s\n"
+msgstr ""
+
+#: src/filed/backup.c:162
+#, c-format
+msgid "     Filesystem change prohibited. Will not descend into %s\n"
+msgstr ""
+
+#: src/filed/backup.c:168
+#, c-format
+msgid "     Disallowed filesystem. Will not descend into %s\n"
+msgstr ""
+
+#: src/filed/backup.c:186 src/filed/verify.c:113
+#, c-format
+msgid "     Could not access %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:193 src/filed/verify.c:120
+#, c-format
+msgid "     Could not follow link %s: ERR=%s\n"
+msgstr ""
+
+#: src/filed/backup.c:200 src/filed/verify.c:127
+#, c-format
+msgid "     Could not stat %s: ERR=%s\n"
 msgstr ""
 
 #: src/filed/backup.c:207 src/filed/verify.c:133
@@ -5345,48 +5594,48 @@ msgstr ""
 msgid "     Unknown file type %d; not saved: %s\n"
 msgstr ""
 
-#: src/filed/backup.c:243
+#: src/filed/backup.c:240
 #, c-format
 msgid "Python reader program \"%s\" not found.\n"
 msgstr ""
 
-#: src/filed/backup.c:268 src/filed/verify.c:214
+#: src/filed/backup.c:269 src/filed/verify.c:214
 #, c-format
 msgid "     Cannot open %s: ERR=%s.\n"
 msgstr ""
 
-#: src/filed/backup.c:297 src/filed/verify.c:229
+#: src/filed/backup.c:298 src/filed/verify.c:229
 #, c-format
 msgid "     Cannot open resource fork for %s: ERR=%s.\n"
 msgstr ""
 
-#: src/filed/backup.c:348
-#, c-format
+#: src/filed/backup.c:349
+#, fuzzy, c-format
 msgid "Unknown signature type %i.\n"
-msgstr ""
+msgstr "sig inconnu %d"
 
-#: src/filed/backup.c:410 src/filed/backup.c:493 src/filed/backup.c:519
-#: src/filed/backup.c:548 src/filed/backup.c:561 src/filed/backup.c:569
-#: src/filed/backup.c:610 src/filed/backup.c:644
+#: src/filed/backup.c:414 src/filed/backup.c:499 src/filed/backup.c:525
+#: src/filed/backup.c:557 src/filed/backup.c:570 src/filed/backup.c:578
+#: src/filed/backup.c:619 src/filed/backup.c:653
 #, c-format
 msgid "Network send error to SD. ERR=%s\n"
 msgstr ""
 
-#: src/filed/backup.c:473
+#: src/filed/backup.c:479
 #, c-format
 msgid "Compression error: %d\n"
 msgstr ""
 
-#: src/filed/backup.c:510
+#: src/filed/backup.c:516
 #, c-format
 msgid "Read error on file %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/backup.c:513
+#: src/filed/backup.c:519
 msgid "Too many errors.\n"
 msgstr ""
 
-#: src/filed/backup.c:539
+#: src/filed/backup.c:548
 #, c-format
 msgid "Error reading ACL of %s\n"
 msgstr ""
@@ -5436,224 +5685,239 @@ msgstr ""
 msgid "No Director resource defined in %s\n"
 msgstr ""
 
-#: src/filed/job.c:323
+#: src/filed/job.c:324
 #, c-format
 msgid "2901 Job %s not found.\n"
-msgstr ""
+msgstr "2901 Le job %s est introuvable.\n"
 
-#: src/filed/job.c:339
+#: src/filed/job.c:333
 #, c-format
 msgid "2001 Job %s marked to be canceled.\n"
-msgstr ""
+msgstr "2001 Le job %s va Ãªtre annulé.\n"
 
-#: src/filed/job.c:342
+#: src/filed/job.c:336
 msgid "2902 Error scanning cancel command.\n"
-msgstr ""
+msgstr "2902 Erreur dans le décodage de la commande d'annulation.\n"
 
-#: src/filed/job.c:361
+#: src/filed/job.c:355
 #, c-format
 msgid "2991 Bad setdebug command: %s\n"
-msgstr ""
+msgstr "2991 Erreur dans la commande setdebug : %s\n"
 
-#: src/filed/job.c:377
+#: src/filed/job.c:371
 #, c-format
 msgid "Bad estimate command: %s"
 msgstr ""
 
-#: src/filed/job.c:378
+#: src/filed/job.c:372
 msgid "2992 Bad estimate command.\n"
 msgstr ""
 
-#: src/filed/job.c:401
+#: src/filed/job.c:395
 #, c-format
 msgid "Bad Job Command: %s"
 msgstr ""
 
-#: src/filed/job.c:421
+#: src/filed/job.c:415
 #, c-format
 msgid "Bad RunBeforeJob command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:422 src/filed/job.c:435
+#: src/filed/job.c:416 src/filed/job.c:429
 msgid "2905 Bad RunBeforeJob command.\n"
 msgstr ""
 
-#: src/filed/job.c:448
+#: src/filed/job.c:442
 #, c-format
 msgid "Bad RunAfter command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:449
+#: src/filed/job.c:443
 msgid "2905 Bad RunAfterJob command.\n"
 msgstr ""
 
-#: src/filed/job.c:475
+#: src/filed/job.c:469
 #, c-format
 msgid "%s could not execute. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:484
+#: src/filed/job.c:478
 #, c-format
 msgid "%s: %s\n"
 msgstr ""
 
-#: src/filed/job.c:489
+#: src/filed/job.c:483
 #, c-format
 msgid "%s returned non-zero status=%d. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:574
+#: src/filed/job.c:568
 #, c-format
 msgid "Error running program: %s. RtnStat=%d ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:584
+#: src/filed/job.c:578
 #, c-format
 msgid "Cannot open FileSet input file: %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:678
+#: src/filed/job.c:672
 #, c-format
 msgid "REGEX %s compile error. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:732
+#: src/filed/job.c:726
 #, c-format
 msgid "Invalid FileSet command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:901 src/findlib/match.c:184
+#: src/filed/job.c:895 src/findlib/match.c:184
 #, c-format
 msgid "Unknown include/exclude option: %c\n"
 msgstr ""
 
-#: src/filed/job.c:961 src/stored/fd_cmds.c:329
+#: src/filed/job.c:955 src/stored/fd_cmds.c:329
 #, c-format
 msgid "Could not create bootstrap file %s: ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1060
+#: src/filed/job.c:1057
 #, c-format
 msgid "DIR and FD clocks differ by %d seconds, FD automatically adjusting.\n"
 msgstr ""
 
-#: src/filed/job.c:1068
+#: src/filed/job.c:1065
 #, c-format
 msgid "Unknown backup level: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1080
+#: src/filed/job.c:1077
 #, c-format
 msgid "Bad level command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1101
+#: src/filed/job.c:1098
 #, c-format
 msgid "Bad session command: %s"
 msgstr ""
 
-#: src/filed/job.c:1122
+#: src/filed/job.c:1119
 #, c-format
 msgid "Bad storage command: %s"
 msgstr ""
 
-#: src/filed/job.c:1131
+#: src/filed/job.c:1128
 #, c-format
 msgid "Failed to connect to Storage daemon: %s:%d\n"
 msgstr ""
 
-#: src/filed/job.c:1143
+#: src/filed/job.c:1140
 msgid "Failed to authenticate Storage daemon.\n"
 msgstr ""
 
-#: src/filed/job.c:1169
+#: src/filed/job.c:1178
 msgid "Cannot contact Storage daemon\n"
 msgstr ""
 
-#: src/filed/job.c:1187
+#: src/filed/job.c:1196
 #, c-format
 msgid "Bad response to append open: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1192
+#: src/filed/job.c:1201
 msgid "Bad response from stored to open command\n"
 msgstr ""
 
-#: src/filed/job.c:1219
+#: src/filed/job.c:1228
 #, c-format
 msgid "Generate VSS snapshots. Driver=\"%s\", Drive(s)=\"%s\"\n"
 msgstr ""
 
-#: src/filed/job.c:1222
-#, c-format
-msgid "Generate VSS snapshots failed. ERR=%s\n"
+#: src/filed/job.c:1230
+msgid "Generate VSS snapshots failed.\n"
 msgstr ""
 
-#: src/filed/job.c:1229
+#: src/filed/job.c:1237
 #, c-format
 msgid "Generate VSS snapshot of drive \"%c:\\\" failed\n"
 msgstr ""
 
-#: src/filed/job.c:1238
+#: src/filed/job.c:1244
 #, c-format
-msgid "VSS Writer: %s\n"
+msgid "VSS Writer (PrepareForBackup): %s\n"
 msgstr ""
 
-#: src/filed/job.c:1242
+#: src/filed/job.c:1249
 msgid "No drive letters found for generating VSS snapshots.\n"
 msgstr ""
 
-#: src/filed/job.c:1245
-msgid "VSS was not initialized properly. VSS support is disabled.\n"
+#: src/filed/job.c:1253
+#, c-format
+msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1294
+#: src/filed/job.c:1302
 msgid "Append Close with SD failed.\n"
 msgstr ""
 
-#: src/filed/job.c:1298
+#: src/filed/job.c:1306
 #, c-format
 msgid "Bad status %d returned from Storage Daemon.\n"
 msgstr ""
 
-#: src/filed/job.c:1331
+#: src/filed/job.c:1324
+#, c-format
+msgid "VSS Writer (BackupComplete): %s\n"
+msgstr ""
+
+#: src/filed/job.c:1351
 #, c-format
 msgid "2994 Bad verify command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1346 src/filed/job.c:1385
+#: src/filed/job.c:1366 src/filed/job.c:1405
 #, c-format
 msgid "2994 Bad verify level: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1425
+#: src/filed/job.c:1445
 #, c-format
 msgid "Bad replace command. CMD=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1502
+#: src/filed/job.c:1522
 msgid "Improper calling sequence.\n"
 msgstr ""
 
-#: src/filed/job.c:1522
+#: src/filed/job.c:1542
 #, c-format
 msgid "Bad response to SD read open: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1527
+#: src/filed/job.c:1547
 msgid "Bad response from stored to read open command\n"
 msgstr ""
 
-#: src/filed/job.c:1593
+#: src/filed/job.c:1613
 #, c-format
 msgid "Comm error with SD. bad response to %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1596
+#: src/filed/job.c:1616
 #, c-format
 msgid "Bad response to %s command. Wanted %s, got %s\n"
 msgstr ""
 
+#: src/filed/pythonfd.c:144 src/stored/pythonsd.c:149
+#, c-format
+msgid "Cannot delete attribute %s"
+msgstr ""
+
+#: src/filed/pythonfd.c:162 src/filed/pythonfd.c:178 src/stored/pythonsd.c:182
+#, c-format
+msgid "Cannot find attribute %s"
+msgstr ""
+
 #: src/filed/restore.c:55
 #, c-format
 msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n"
@@ -5683,7 +5947,7 @@ msgid "Logic error: output file should not be open\n"
 msgstr ""
 
 #: src/filed/restore.c:218 src/filed/verify_vol.c:142
-#: src/stored/bextract.c:289 src/stored/bls.c:372 src/stored/bscan.c:649
+#: src/stored/bextract.c:289 src/stored/bls.c:371 src/stored/bscan.c:651
 #, c-format
 msgid "Record header file index %ld not equal record index %ld\n"
 msgstr ""
@@ -5718,7 +5982,7 @@ msgstr ""
 msgid "Can't restore default ACL of %s\n"
 msgstr ""
 
-#: src/filed/restore.c:391 src/stored/bextract.c:449
+#: src/filed/restore.c:391 src/stored/bextract.c:455
 #, c-format
 msgid "Unknown stream=%d ignored. This shouldn't happen!\n"
 msgstr ""
@@ -5807,64 +6071,64 @@ msgstr ""
 msgid "Daemon started %s, %d Job%s run since started.\n"
 msgstr ""
 
-#: src/filed/status.c:125
+#: src/filed/status.c:127
 #, c-format
 msgid " Sizeof: off_t=%d size_t=%d debug=%d trace=%d\n"
 msgstr ""
 
-#: src/filed/status.c:136
+#: src/filed/status.c:138
 msgid "Running Jobs:\n"
 msgstr ""
 
-#: src/filed/status.c:147
+#: src/filed/status.c:149
 #, c-format
 msgid "Director connected at: %s\n"
 msgstr ""
 
-#: src/filed/status.c:149
+#: src/filed/status.c:151
 #, c-format
 msgid "JobId %d Job %s is running.\n"
 msgstr ""
 
-#: src/filed/status.c:152
+#: src/filed/status.c:154
 #, c-format
 msgid "    %s%s Job started: %s\n"
 msgstr ""
 
-#: src/filed/status.c:165 src/stored/status.c:296
+#: src/filed/status.c:166 src/stored/status.c:323
 #, c-format
 msgid "    Files=%s Bytes=%s Bytes/sec=%s\n"
 msgstr ""
 
-#: src/filed/status.c:170
+#: src/filed/status.c:171
 #, c-format
 msgid "    Files Examined=%s\n"
 msgstr ""
 
-#: src/filed/status.c:175
+#: src/filed/status.c:176
 #, c-format
 msgid "    Processing file: %s\n"
 msgstr ""
 
-#: src/filed/status.c:186
+#: src/filed/status.c:187
 msgid "    SDSocket closed.\n"
 msgstr ""
 
-#: src/filed/status.c:215
+#: src/filed/status.c:217
 msgid "Terminated Jobs:\n"
 msgstr ""
 
-#: src/filed/status.c:217
+#: src/filed/status.c:219
 msgid " JobId  Level     Files         Bytes  Status   Finished        Name \n"
 msgstr ""
 
-#: src/filed/status.c:321 src/filed/status.c:347 src/stored/status.c:468
-#: src/stored/status.c:493
+#: src/filed/status.c:323 src/filed/status.c:347 src/stored/status.c:513
+#: src/stored/status.c:536
 #, c-format
 msgid "Bad .status command: %s\n"
 msgstr ""
 
-#: src/filed/status.c:322
+#: src/filed/status.c:324
 msgid "2900 Bad .status command, missing argument.\n"
 msgstr ""
 
@@ -5872,23 +6136,23 @@ msgstr ""
 msgid "2900 Bad .status command, wrong argument.\n"
 msgstr ""
 
-#: src/filed/status.c:385 src/stored/status.c:423
+#: src/filed/status.c:385 src/stored/status.c:468
 msgid "Init Catalog"
 msgstr ""
 
-#: src/filed/status.c:388 src/stored/status.c:426
+#: src/filed/status.c:388 src/stored/status.c:471
 msgid "Volume to Catalog"
 msgstr ""
 
-#: src/filed/status.c:391 src/stored/status.c:429
+#: src/filed/status.c:391 src/stored/status.c:474
 msgid "Disk to Catalog"
 msgstr ""
 
-#: src/filed/status.c:394 src/stored/status.c:432
+#: src/filed/status.c:394 src/stored/status.c:477
 msgid "Data"
 msgstr ""
 
-#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:438
+#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:483
 msgid "Unknown Job Level"
 msgstr ""
 
@@ -5956,47 +6220,37 @@ msgstr ""
 msgid "Error scanning record header: %s\n"
 msgstr ""
 
-#: src/filed/pythonfd.c:150 src/stored/pythonsd.c:154
-#, c-format
-msgid "Cannot delete attribute %s"
-msgstr ""
-
-#: src/filed/pythonfd.c:168 src/filed/pythonfd.c:184 src/stored/pythonsd.c:187
-#, c-format
-msgid "Cannot find attribute %s"
-msgstr ""
-
-#: src/findlib/attribs.c:340
+#: src/findlib/attribs.c:335
 #, c-format
 msgid "File size of restored file %s not correct. Original %s, restored %s.\n"
 msgstr ""
 
-#: src/findlib/attribs.c:358 src/findlib/attribs.c:365
+#: src/findlib/attribs.c:353 src/findlib/attribs.c:360
 #, c-format
 msgid "Unable to set file owner %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:371
+#: src/findlib/attribs.c:366
 #, c-format
 msgid "Unable to set file modes %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:381
+#: src/findlib/attribs.c:376
 #, c-format
 msgid "Unable to set file times %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:395
+#: src/findlib/attribs.c:390
 #, c-format
 msgid "Unable to set file flags %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:640
+#: src/findlib/attribs.c:635
 #, c-format
 msgid "Error in %s file %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:657
+#: src/findlib/attribs.c:652
 #, c-format
 msgid "Error in %s: ERR=%s\n"
 msgstr ""
@@ -6088,9 +6342,9 @@ msgid "Could not save_dirn"
 msgstr ""
 
 #: src/findlib/create_file.c:207 src/findlib/create_file.c:220
-#, c-format
+#, fuzzy, c-format
 msgid "Could not chdir to %s: ERR=%s\n"
-msgstr ""
+msgstr "Impossible de trouver le Job Â«Â %s » : ERR=%s"
 
 #: src/findlib/create_file.c:240
 #, c-format
@@ -6127,7 +6381,7 @@ msgstr ""
 msgid "Unknown file type %d; not restored: %s\n"
 msgstr ""
 
-#: src/findlib/create_file.c:392
+#: src/findlib/create_file.c:402
 #, c-format
 msgid "Zero length filename: %s\n"
 msgstr ""
@@ -6141,11 +6395,6 @@ msgstr ""
 msgid "Top level directory \"%s\" has an unlisted fstype\n"
 msgstr ""
 
-#: src/findlib/find_one.c:241
-#, c-format
-msgid "Attempt to backup hard linked file %s twice ignored.\n"
-msgstr ""
-
 #: src/findlib/makepath.c:117
 #, c-format
 msgid "Cannot create directory %s: ERR=%s\n"
@@ -6253,54 +6502,54 @@ msgstr ""
 msgid "Pthread cond init error = %s\n"
 msgstr ""
 
-#: src/gnome2-console/console.c:361
+#: src/gnome2-console/console.c:357
 msgid " Not Connected"
 msgstr ""
 
-#: src/gnome2-console/console.c:482
+#: src/gnome2-console/console.c:478
 #, c-format
 msgid " Connecting to Director %s:%d"
 msgstr ""
 
-#: src/gnome2-console/console.c:483
+#: src/gnome2-console/console.c:479
 #, c-format
 msgid ""
 "Connecting to Director %s:%d\n"
 "\n"
 msgstr ""
 
-#: src/gnome2-console/console.c:498 src/wx-console/console_thread.cpp:357
+#: src/gnome2-console/console.c:494 src/wx-console/console_thread.cpp:360
 #, c-format
 msgid "Passphrase for Console \"%s\" TLS private key: "
 msgstr ""
 
-#: src/gnome2-console/console.c:520 src/wx-console/console_thread.cpp:378
+#: src/gnome2-console/console.c:516 src/wx-console/console_thread.cpp:381
 #, c-format
 msgid "Passphrase for Director \"%s\" TLS private key: "
 msgstr ""
 
-#: src/gnome2-console/console.c:539 src/tray-monitor/tray-monitor.c:860
-#: src/wx-console/console_thread.cpp:396
+#: src/gnome2-console/console.c:535 src/tray-monitor/tray-monitor.c:860
+#: src/wx-console/console_thread.cpp:399
 msgid "Director daemon"
 msgstr ""
 
-#: src/gnome2-console/console.c:551
+#: src/gnome2-console/console.c:547
 msgid " Initializing ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:587
+#: src/gnome2-console/console.c:583
 msgid " Connected"
 msgstr ""
 
-#: src/gnome2-console/console.c:595
+#: src/gnome2-console/console.c:591
 msgid " Processing command ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:630
+#: src/gnome2-console/console.c:626
 msgid " At prompt waiting for input ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:750
+#: src/gnome2-console/console.c:746
 msgid " Ready"
 msgstr ""
 
@@ -6314,218 +6563,205 @@ msgstr ""
 msgid "ConsoleFont: name=%s font face=%s\n"
 msgstr ""
 
-#: src/gnome2-console/interface.c:32
-msgid "_Connect"
-msgstr ""
-
-#: src/gnome2-console/interface.c:33 src/gnome2-console/interface.c:232
-msgid "Connect to Director"
-msgstr ""
-
-#: src/gnome2-console/interface.c:39
-msgid "_Disconnect"
-msgstr ""
-
-#: src/gnome2-console/interface.c:40
-msgid "Disconnect from Director"
-msgstr ""
-
-#: src/gnome2-console/interface.c:93
-msgid "_Display Messages"
-msgstr ""
-
-#: src/gnome2-console/interface.c:129
-msgid "_File"
-msgstr ""
-
-#: src/gnome2-console/interface.c:136
-msgid "_Edit"
-msgstr ""
-
-#: src/gnome2-console/interface.c:143
-msgid "_View"
+#: src/gnome2-console/interface.c:202
+msgid "Bacula Console"
 msgstr ""
 
-#: src/gnome2-console/interface.c:144 src/gnome2-console/interface.c:252
-msgid "Display Messages"
+#: src/gnome2-console/interface.c:235 src/wx-console/wxbmainframe.cpp:229
+#: src/wx-console/wxbmainframe.cpp:597
+msgid "Connect"
 msgstr ""
 
-#: src/gnome2-console/interface.c:150
-msgid "_Settings"
+#: src/gnome2-console/interface.c:238
+msgid "Connect to Director"
 msgstr ""
 
-#: src/gnome2-console/interface.c:157
-msgid "_Help"
+#: src/gnome2-console/interface.c:242
+msgid "Run"
 msgstr ""
 
-#: src/gnome2-console/interface.c:197
-msgid "Bacula Console"
+#: src/gnome2-console/interface.c:245 src/gnome2-console/interface.c:683
+#: src/gnome2-console/interface.c:697
+msgid "Run a Job"
 msgstr ""
 
-#: src/gnome2-console/interface.c:231 src/wx-console/wxbmainframe.cpp:229
-#: src/wx-console/wxbmainframe.cpp:590
-msgid "Connect"
-msgstr ""
+#: src/gnome2-console/interface.c:249
+#, fuzzy
+msgid "Dir Status"
+msgstr "Statut :\n"
 
-#: src/gnome2-console/interface.c:241
-msgid "Run"
+#: src/gnome2-console/interface.c:255 src/lib/util.c:292
+#: src/wx-console/wxbrestorepanel.cpp:384
+#: src/wx-console/wxbrestorepanel.cpp:1949
+msgid "Restore"
 msgstr ""
 
-#: src/gnome2-console/interface.c:242 src/gnome2-console/interface.c:677
-#: src/gnome2-console/interface.c:690
-msgid "Run a Job"
+#: src/gnome2-console/interface.c:261
+msgid "Label"
 msgstr ""
 
-#: src/gnome2-console/interface.c:251
+#: src/gnome2-console/interface.c:267
 msgid "Msgs"
 msgstr ""
 
-#: src/gnome2-console/interface.c:261 src/lib/util.c:298
-#: src/wx-console/wxbrestorepanel.cpp:426
-#: src/wx-console/wxbrestorepanel.cpp:1915
-msgid "Restore"
-msgstr ""
-
-#: src/gnome2-console/interface.c:271
-msgid "Label"
+#: src/gnome2-console/interface.c:270
+msgid "Display Messages"
 msgstr ""
 
-#: src/gnome2-console/interface.c:299
+#: src/gnome2-console/interface.c:294
 msgid " Command: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:307
+#: src/gnome2-console/interface.c:303
 msgid "Enter Commands Here"
 msgstr ""
 
-#: src/gnome2-console/interface.c:318
+#: src/gnome2-console/interface.c:314
 msgid " Status: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:326
+#: src/gnome2-console/interface.c:323 src/gnome2-console/interface.c:1716
 msgid "  "
 msgstr ""
 
-#: src/gnome2-console/interface.c:422
+#: src/gnome2-console/interface.c:424
 msgid "About Bacula Console"
 msgstr ""
 
-#: src/gnome2-console/interface.c:436
+#: src/gnome2-console/interface.c:439
 msgid "Bacula Console\n"
 msgstr ""
 
-#: src/gnome2-console/interface.c:444
+#: src/gnome2-console/interface.c:448
 msgid "Copyright (c) 2000 - 2004, Kern Sibbald and John Walker"
 msgstr ""
 
-#: src/gnome2-console/interface.c:450
+#: src/gnome2-console/interface.c:453
 msgid "Authors: Kern Sibbald and John Walker"
 msgstr ""
 
-#: src/gnome2-console/interface.c:456
+#: src/gnome2-console/interface.c:458
 msgid "It comes by night and sucks the essence from your computers"
 msgstr ""
 
-#: src/gnome2-console/interface.c:521 src/gnome2-console/interface.c:536
+#: src/gnome2-console/interface.c:523 src/gnome2-console/interface.c:540
 msgid "Select Director"
 msgstr ""
 
-#: src/gnome2-console/interface.c:708 src/gnome2-console/interface.c:1616
+#: src/gnome2-console/interface.c:570
+msgid "         "
+msgstr ""
+
+#: src/gnome2-console/interface.c:716 src/gnome2-console/interface.c:1638
 msgid "Job:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:728
+#: src/gnome2-console/interface.c:736
 msgid "   Type:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:757 src/gnome2-console/interface.c:1644
-#: src/wx-console/wxbrestorepanel.cpp:1828
+#: src/gnome2-console/interface.c:756 src/gnome2-console/interface.c:785
+#: src/gnome2-console/interface.c:1291 src/gnome2-console/interface.c:1687
+msgid " "
+msgstr ""
+
+#: src/gnome2-console/interface.c:765 src/gnome2-console/interface.c:1667
+#: src/wx-console/wxbrestorepanel.cpp:1862
 msgid "Client:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:787 src/gnome2-console/interface.c:1672
+#: src/gnome2-console/interface.c:796 src/gnome2-console/interface.c:1696
 msgid "FileSet: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:813 src/wx-console/wxbrestorepanel.cpp:1834
+#: src/gnome2-console/interface.c:821 src/wx-console/wxbrestorepanel.cpp:1868
 msgid "Priority:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:836
+#: src/gnome2-console/interface.c:842
 msgid "Level:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:866 src/gnome2-console/interface.c:1418
-#: src/gnome2-console/interface.c:1700
+#: src/gnome2-console/interface.c:863
+msgid "             "
+msgstr ""
+
+#: src/gnome2-console/interface.c:873 src/gnome2-console/interface.c:1440
+#: src/gnome2-console/interface.c:1725
 msgid "Pool:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:895 src/gnome2-console/interface.c:1393
-#: src/gnome2-console/interface.c:1728 src/wx-console/wxbrestorepanel.cpp:1830
+#: src/gnome2-console/interface.c:894 src/gnome2-console/interface.c:925
+#: src/gnome2-console/interface.c:955 src/gnome2-console/interface.c:975
+#: src/gnome2-console/interface.c:995 src/gnome2-console/interface.c:1015
+#: src/gnome2-console/interface.c:1020 src/gnome2-console/interface.c:1490
+#: src/gnome2-console/interface.c:1746 src/gnome2-console/interface.c:1776
+#: src/gnome2-console/interface.c:1795 src/gnome2-console/interface.c:1800
+msgid "   "
+msgstr ""
+
+#: src/gnome2-console/interface.c:904 src/gnome2-console/interface.c:1414
+#: src/gnome2-console/interface.c:1755 src/wx-console/wxbrestorepanel.cpp:1864
 msgid "Storage:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:924
+#: src/gnome2-console/interface.c:935
 msgid "Messages:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:952
+#: src/gnome2-console/interface.c:965
 msgid "Where: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:970 src/wx-console/wxbrestorepanel.cpp:1832
+#: src/gnome2-console/interface.c:985 src/wx-console/wxbrestorepanel.cpp:1866
 msgid "When:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:988 src/wx-console/wxbrestorepanel.cpp:1813
+#: src/gnome2-console/interface.c:1005 src/wx-console/wxbrestorepanel.cpp:1847
 msgid "Bootstrap:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1108
-msgid "_New"
-msgstr ""
-
-#: src/gnome2-console/interface.c:1177
+#: src/gnome2-console/interface.c:1201
 msgid "Restore File Selection"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1226
+#: src/gnome2-console/interface.c:1245
 msgid "Current dir:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1252
+#: src/gnome2-console/interface.c:1272
 msgid "Files Selected: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:1373 src/gnome2-console/interface.c:1383
+#: src/gnome2-console/interface.c:1392 src/gnome2-console/interface.c:1403
 msgid "Label a Volume"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1444
+#: src/gnome2-console/interface.c:1465
 msgid "Volume Name:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1459
+#: src/gnome2-console/interface.c:1479
 msgid "Slot:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1585
+#: src/gnome2-console/interface.c:1605
 msgid "Restore Files Dialog"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1599
+#: src/gnome2-console/interface.c:1620
 msgid "Restore Files"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1756
+#: src/gnome2-console/interface.c:1785
 msgid "Before:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1799
+#: src/gnome2-console/interface.c:1831
 msgid "Select Files"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1883
+#: src/gnome2-console/interface.c:1914
 msgid "Progress"
 msgstr ""
 
@@ -6533,196 +6769,289 @@ msgstr ""
 msgid "Mark"
 msgstr ""
 
+#: src/gnome2-console/restore.c:121
+msgid "File"
+msgstr ""
+
 #: src/gnome2-console/restore.c:121
 msgid "Mode"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:330
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:288
 msgid "User"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:334
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:292
 msgid "Group"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:318
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:276
 msgid "Size"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:322
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:280
 msgid "Date"
 msgstr ""
 
-#: src/gnome2-console/support.c:41
-#, c-format
-msgid "Widget not found: %s"
-msgstr ""
-
 #: src/gnome2-console/support.c:60 src/gnome2-console/support.c:85
 #, c-format
 msgid "Couldn't find pixmap file: %s"
 msgstr ""
 
-#: src/gnome2-console/support.c:92
+#: src/lib/tls.c:105
 #, c-format
-msgid "Failed to load pixbuf file: %s: %s\n"
+msgid ""
+"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
 msgstr ""
 
-#: src/lib/address_conf.c:55
-#, c-format
-msgid "Only ipv4 and ipv6 are supported (%d)\n"
-msgstr ""
+#: src/lib/tls.c:152
+msgid "Error initializing SSL context"
+msgstr "Erreur pendant l'initialisation du contexte SSL"
 
-#: src/lib/address_conf.c:59
-#, c-format
-msgid "Only ipv4 is supported (%d)\n"
+#: src/lib/tls.c:173
+msgid "Error loading certificate verification stores"
 msgstr ""
 
-#: src/lib/address_conf.c:167
-#, c-format
-msgid "It was tried to assign a ipv6 address to a ipv4(%d)\n"
+#: src/lib/tls.c:178
+msgid ""
+"Either a certificate file or a directory must be specified as a verification "
+"store\n"
 msgstr ""
 
-#: src/lib/address_conf.c:176
-#, c-format
+#: src/lib/tls.c:189
+msgid "Error loading certificate file"
+msgstr "Erreur dans le chargement du certificat"
+
+#: src/lib/tls.c:197
+msgid "Error loading private key"
+msgstr "Erreur dans le chargement de la clef privée"
+
+#: src/lib/tls.c:205
+msgid "Unable to open DH parameters file"
+msgstr "Impossible d'ouvrir le fichier de paramètre DH"
+
+#: src/lib/tls.c:211
+msgid "Unable to load DH parameters from specified file"
+msgstr "Impossible de charger les paramètres DH Ã  partir du fichier spécifié"
+
+#: src/lib/tls.c:215
+msgid "Failed to set TLS Diffie-Hellman parameters"
+msgstr "Impossible de positionner les paramètres TLS Diffie-Hellman"
+
+#: src/lib/tls.c:224
+msgid "Error setting cipher list, no valid ciphers available\n"
+msgstr ""
+
+#: src/lib/tls.c:272
+msgid "Peer failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:314
+#, c-format
+msgid "Peer %s failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:417
+msgid "Error creating file descriptor-based BIO"
+msgstr ""
+
+#: src/lib/tls.c:428
+msgid "Error creating new SSL object"
+msgstr "Erreur pendant la création d'un nouvel objet SSL"
+
+#: src/lib/tls.c:492 src/lib/tls.c:515
+msgid "Connect failure"
+msgstr "Erreur de connexion"
+
+#: src/lib/tls.c:592 src/lib/tls.c:596
+msgid "TLS shutdown failure."
+msgstr ""
+
+#: src/lib/tls.c:645 src/lib/tls.c:665
+msgid "TLS read/write failure."
+msgstr ""
+
+#: src/lib/tls.c:723 src/lib/tls.c:780 src/stored/dev.c:209
+#: src/stored/dev.c:227 src/stored/dev.c:233 src/stored/stored_conf.c:593
+#, c-format
+msgid "Unable to init mutex: ERR=%s\n"
+msgstr "Impossible d'initialiser le muxtex : ERR=%s\n"
+
+#: src/lib/tls.c:743 src/lib/tls.c:812
+#, c-format
+msgid "Unable to destroy mutex: ERR=%s\n"
+msgstr "Impossible de détruire le mutex : ERR=%s\n"
+
+#: src/lib/tls.c:877
+#, c-format
+msgid "Unable to init OpenSSL threading: ERR=%s\n"
+msgstr "Impossible d'initialiser le thread OpenSSL : ERR=%s\n"
+
+#: src/lib/tls.c:887
+msgid "Failed to seed OpenSSL PRNG\n"
+msgstr ""
+
+#: src/lib/tls.c:913
+msgid "Failed to save OpenSSL PRNG\n"
+msgstr "Impossible de sauvegarder le PRNG OpenSSL\n"
+
+#: src/lib/address_conf.c:50
+#, c-format
+msgid "Only ipv4 and ipv6 are supported (%d)\n"
+msgstr "Seulement l'ipv4 et l'ipv6 sont supportés (%d)\n"
+
+#: src/lib/address_conf.c:54
+#, c-format
+msgid "Only ipv4 is supported (%d)\n"
+msgstr "Seulement l'ipv4 est supporté (%d)\n"
+
+#: src/lib/address_conf.c:163
+#, c-format
+msgid "It was tried to assign a ipv6 address to a ipv4(%d)\n"
+msgstr ""
+
+#: src/lib/address_conf.c:172
+#, c-format
 msgid "It was tried to assign a ipv4 address to a ipv6(%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:255
+#: src/lib/address_conf.c:251
 #, c-format
 msgid "Can't add default address (%s)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:285
+#: src/lib/address_conf.c:281
 msgid "the old style addresses cannot be mixed with new style"
 msgstr ""
 
-#: src/lib/address_conf.c:308
+#: src/lib/address_conf.c:304
 #, c-format
 msgid "can't resolve service(%s)"
-msgstr ""
+msgstr "impossible de trouver une correspondance pour le service (%s)"
 
-#: src/lib/address_conf.c:318
+#: src/lib/address_conf.c:314
 #, c-format
 msgid "can't resolve hostname(%s) %s"
-msgstr ""
+msgstr "impossible de résoudre le hostname (%s) %s"
 
-#: src/lib/address_conf.c:407
+#: src/lib/address_conf.c:403
 #, c-format
 msgid "Expected a block begin { , got: %s"
-msgstr ""
+msgstr "Attendait un début de bloc {, pas : %s"
 
-#: src/lib/address_conf.c:412
+#: src/lib/address_conf.c:408
 msgid "Empty addr block is not allowed"
 msgstr ""
 
-#: src/lib/address_conf.c:416
+#: src/lib/address_conf.c:412
 #, c-format
 msgid "Expected a string, got: %s"
-msgstr ""
+msgstr "Attendait une chaîne, pas : %s"
 
-#: src/lib/address_conf.c:425
+#: src/lib/address_conf.c:421
 #, c-format
 msgid "Expected a string [ip|ipv4|ipv6], got: %s"
-msgstr ""
+msgstr "Attentait la chaîne [ip|ipv4|ipv6], pas : %s"
 
-#: src/lib/address_conf.c:429
+#: src/lib/address_conf.c:425
 #, c-format
 msgid "Expected a string [ip|ipv4], got: %s"
-msgstr ""
+msgstr "Attendait la chaîne [ip|ipv4], pas : %s"
 
-#: src/lib/address_conf.c:434 src/lib/address_conf.c:464
+#: src/lib/address_conf.c:430 src/lib/address_conf.c:460
 #, c-format
 msgid "Expected a equal =, got: %s"
-msgstr ""
+msgstr "Attendait un Ã©gal =, pas : %s"
 
-#: src/lib/address_conf.c:438
-#, c-format
+#: src/lib/address_conf.c:434
+#, fuzzy, c-format
 msgid "Expected a block beginn { , got: %s"
-msgstr ""
+msgstr "Attendait un début de bloc {, pas : %s"
 
-#: src/lib/address_conf.c:445 src/lib/address_conf.c:460
+#: src/lib/address_conf.c:441 src/lib/address_conf.c:456
 #, c-format
 msgid "Expected a identifier [addr|port], got: %s"
-msgstr ""
+msgstr "Attendait un identifiant [addr|port], pas : %s"
 
-#: src/lib/address_conf.c:450
+#: src/lib/address_conf.c:446
 msgid "Only one port per address block"
 msgstr ""
 
-#: src/lib/address_conf.c:456
+#: src/lib/address_conf.c:452
 msgid "Only one addr per address block"
 msgstr ""
 
-#: src/lib/address_conf.c:472
+#: src/lib/address_conf.c:468
 #, c-format
 msgid "Expected a number or a string, got: %s"
-msgstr ""
+msgstr "Attendait un nombre ou une chaîne, pas : %s"
 
-#: src/lib/address_conf.c:478
+#: src/lib/address_conf.c:474
 #, c-format
 msgid "Expected an IP number or a hostname, got: %s"
-msgstr ""
+msgstr "Attendait une adresse IP ou un nom de machine, pas : %s"
 
-#: src/lib/address_conf.c:484
+#: src/lib/address_conf.c:480
 msgid "State machine missmatch"
 msgstr ""
 
-#: src/lib/address_conf.c:490 src/lib/address_conf.c:503
+#: src/lib/address_conf.c:486 src/lib/address_conf.c:499
 #, c-format
 msgid "Expected a end of block }, got: %s"
-msgstr ""
+msgstr "Attendait une fin de bloque }, pas : %s"
 
-#: src/lib/address_conf.c:496
+#: src/lib/address_conf.c:492
 #, c-format
 msgid "Can't add hostname(%s) and port(%s) to addrlist (%s)"
 msgstr ""
+"Impossible d'ajouter le hostname (%s) et le port (%s) Ã  la liste d'adresse (%"
+"s)"
 
-#: src/lib/address_conf.c:512
-#, c-format
+#: src/lib/address_conf.c:508
+#, fuzzy, c-format
 msgid "Expected a hostname or IP nummer, got: %s"
-msgstr ""
+msgstr "attendait un nombre entier positif, pas : %s"
 
-#: src/lib/address_conf.c:517 src/lib/address_conf.c:531
+#: src/lib/address_conf.c:513 src/lib/address_conf.c:527
 #, c-format
 msgid "can't add port (%s) to (%s)"
-msgstr ""
+msgstr "impossible d'ajouter le port (%s) Ã  (%s)"
 
-#: src/lib/address_conf.c:526
+#: src/lib/address_conf.c:522
 #, c-format
 msgid "Expected a port number or string, got: %s"
-msgstr ""
+msgstr "Attendait un numéro de port ou une chaîne, pas : %s"
 
 #: src/lib/attr.c:64
 #, c-format
 msgid "Error scanning attributes: %s\n"
-msgstr ""
+msgstr "Erreur pendant la lecture des attributs : %s\n"
 
-#: src/lib/berrno.c:66
+#: src/lib/berrno.c:48
 msgid "Child exited normally."
 msgstr ""
 
-#: src/lib/berrno.c:73
+#: src/lib/berrno.c:55
 msgid "Unknown error during program execvp"
 msgstr ""
 
-#: src/lib/berrno.c:76
+#: src/lib/berrno.c:58
 #, c-format
 msgid "Child exited with code %d"
 msgstr ""
 
-#: src/lib/berrno.c:84
+#: src/lib/berrno.c:66
 #, c-format
 msgid "Child died from signal %d: %s"
-msgstr ""
+msgstr "Le processus fils est mort par le signal %d : %s"
 
-#: src/lib/berrno.c:90
+#: src/lib/berrno.c:72
 msgid "Invalid errno. No error message possible."
 msgstr ""
 
 #: src/lib/bget_msg.c:86
 msgid "Status OK\n"
-msgstr ""
+msgstr "Statut OK\n"
 
 #: src/lib/bget_msg.c:90
 #, c-format
@@ -6734,226 +7063,228 @@ msgstr ""
 msgid "Attr spool write error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:207 src/lib/bnet.c:264
+#: src/lib/bnet.c:209 src/lib/bnet.c:266
 #, c-format
 msgid "Read expected %d got %d from %s:%s:%d\n"
 msgstr ""
 
-#: src/lib/bnet.c:225
+#: src/lib/bnet.c:227
 #, c-format
 msgid "Packet size too big from \"%s:%s:%d. Terminating connection.\n"
 msgstr ""
 
-#: src/lib/bnet.c:254
+#: src/lib/bnet.c:256
 #, c-format
 msgid "Read error from %s:%s:%d: ERR=%s\n"
-msgstr ""
+msgstr "Erreur de lecture de %s:%s:%d : ERR=%s\n"
 
-#: src/lib/bnet.c:330 src/lib/bnet.c:346
+#: src/lib/bnet.c:332 src/lib/bnet.c:348
 #, c-format
 msgid "fread attr spool error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:390
+#: src/lib/bnet.c:392
 #, c-format
 msgid "Write error sending len to %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:395 src/lib/bnet.c:427
+#: src/lib/bnet.c:397 src/lib/bnet.c:430
 #, c-format
 msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"
 msgstr ""
 
-#: src/lib/bnet.c:421
+#: src/lib/bnet.c:424
 #, c-format
 msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:447 src/lib/bnet.c:487
+#: src/lib/bnet.c:450 src/lib/bnet.c:490
 msgid "TLS connection initialization failed.\n"
-msgstr ""
+msgstr "Initialisation de la connexion TLS Ã©chouée.\n"
 
-#: src/lib/bnet.c:455
+#: src/lib/bnet.c:458
 msgid "TLS Negotiation failed.\n"
-msgstr ""
+msgstr "Négociation TLS Ã©chouée.\n"
 
-#: src/lib/bnet.c:461
+#: src/lib/bnet.c:464
 msgid ""
 "TLS certificate verification failed. Peer certificate did not match a "
 "required commonName\n"
 msgstr ""
 
-#: src/lib/bnet.c:499
+#: src/lib/bnet.c:502
 #, c-format
 msgid ""
 "TLS host certificate verification failed. Host %s did not match presented "
 "certificate\n"
 msgstr ""
 
-#: src/lib/bnet.c:513 src/lib/bnet.c:518
+#: src/lib/bnet.c:516 src/lib/bnet.c:521
 msgid "TLS not configured.\n"
-msgstr ""
+msgstr "TLS non configuré.\n"
 
-#: src/lib/bnet.c:614
+#: src/lib/bnet.c:617
 msgid "No problem."
-msgstr ""
+msgstr "Pas de problème."
 
-#: src/lib/bnet.c:617
+#: src/lib/bnet.c:620
 msgid "Authoritative answer for host not found."
 msgstr ""
 
-#: src/lib/bnet.c:620
+#: src/lib/bnet.c:623
 msgid "Non-authoritative for host not found, or ServerFail."
 msgstr ""
 
-#: src/lib/bnet.c:623
+#: src/lib/bnet.c:626
 msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP."
 msgstr ""
 
-#: src/lib/bnet.c:626
+#: src/lib/bnet.c:629
 msgid "Valid name, no data record of resquested type."
 msgstr ""
 
-#: src/lib/bnet.c:629
+#: src/lib/bnet.c:632
 msgid "Unknown error."
-msgstr ""
+msgstr "Erreur inconnue."
 
-#: src/lib/bnet.c:764
+#: src/lib/bnet.c:767
 #, c-format
 msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:784
+#: src/lib/bnet.c:787
 #, c-format
 msgid "Socket open error. proto=%d port=%d. ERR=%s\n"
-msgstr ""
+msgstr "Ouverture de la socket en erreur. proto=%d port=%d. ERR=%s\n"
 
-#: src/lib/bnet.c:793 src/lib/bnet.c:818 src/lib/bnet_server.c:194
-#: src/lib/bnet_server.c:352
+#: src/lib/bnet.c:796 src/lib/bnet.c:821 src/lib/bnet_server.c:193
+#: src/lib/bnet_server.c:351
 #, c-format
 msgid "Cannot set SO_KEEPALIVE on socket: %s\n"
-msgstr ""
+msgstr "Impossible de positionner SO_KEEPALIVE sur la socket : %s\n"
 
-#: src/lib/bnet.c:849
+#: src/lib/bnet.c:852
 #, c-format
 msgid ""
 "Could not connect to %s on %s:%d. ERR=%s\n"
 "Retrying ...\n"
 msgstr ""
+"Impossible de se connecter Ã  %s sur %s:%d. ERR=%s\n"
+"Réessaie...\n"
 
-#: src/lib/bnet.c:855
+#: src/lib/bnet.c:858
 #, c-format
 msgid "Unable to connect to %s on %s:%d. ERR=%s\n"
-msgstr ""
+msgstr "Impossible de se connecter Ã  %s sur %s:%d. ERR=%s\n"
 
-#: src/lib/bnet.c:933
+#: src/lib/bnet.c:936
 msgid "Could not malloc BSOCK data buffer\n"
 msgstr ""
 
-#: src/lib/bnet.c:940 src/lib/bnet.c:964
+#: src/lib/bnet.c:943 src/lib/bnet.c:967
 #, c-format
 msgid "sockopt error: %s\n"
-msgstr ""
+msgstr "erreur sockopt : %s\n"
 
-#: src/lib/bnet.c:946 src/lib/bnet.c:970
+#: src/lib/bnet.c:949 src/lib/bnet.c:973
 #, c-format
 msgid "Warning network buffer = %d bytes not max size.\n"
 msgstr ""
 
-#: src/lib/bnet.c:950 src/lib/bnet.c:974
+#: src/lib/bnet.c:953 src/lib/bnet.c:977
 #, c-format
 msgid "Network buffer size %d not multiple of tape block size.\n"
 msgstr ""
 
-#: src/lib/bnet.c:994 src/lib/bnet.c:1028
+#: src/lib/bnet.c:997 src/lib/bnet.c:1031
 #, c-format
 msgid "fcntl F_GETFL error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:1000 src/lib/bnet.c:1034 src/lib/bnet.c:1059
+#: src/lib/bnet.c:1003 src/lib/bnet.c:1037 src/lib/bnet.c:1062
 #, c-format
 msgid "fcntl F_SETFL error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:1113
+#: src/lib/bnet.c:1116
 #, c-format
 msgid "Unknown sig %d"
-msgstr ""
+msgstr "sig inconnu %d"
 
 #: src/lib/bnet_pkt.c:89 src/lib/bnet_pkt.c:147
-#, c-format
+#, fuzzy, c-format
 msgid "Unknown BPKT type: %d\n"
-msgstr ""
+msgstr "Job du Type=%d inconnu\n"
 
 #: src/lib/bnet_server.c:96
 #, c-format
 msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:259
+#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:258
 #, c-format
 msgid "Cannot set SO_REUSEADDR on socket: %s\n"
-msgstr ""
+msgstr "Impossible de positionner l'option SO_REUSEADDR sur la socket : %s\n"
 
 #: src/lib/bnet_server.c:118
 #, c-format
 msgid "Cannot bind port %d: ERR=%s: Retrying ...\n"
-msgstr ""
+msgstr "Impossible de s'attacher au port %d : ERR=%s : Réessaie...\n"
 
 #: src/lib/bnet_server.c:123
 #, c-format
 msgid "Cannot bind port %d: ERR=%s.\n"
-msgstr ""
+msgstr "Impossible de s'attacher au port %d : ERR=%s.\n"
 
 #: src/lib/bnet_server.c:134
 #, c-format
 msgid "Could not init client queue: ERR=%s\n"
-msgstr ""
+msgstr "Impossible d'initialiser la queue cliente : ERR=%s\n"
 
-#: src/lib/bnet_server.c:158 src/lib/bnet_server.c:321
+#: src/lib/bnet_server.c:157 src/lib/bnet_server.c:320
 #, c-format
 msgid "Error in select: %s\n"
-msgstr ""
+msgstr "Erreur sur le select : %s\n"
 
-#: src/lib/bnet_server.c:179 src/lib/bnet_server.c:340
+#: src/lib/bnet_server.c:178 src/lib/bnet_server.c:339
 #, c-format
 msgid "Connection from %s:%d refused by hosts.access\n"
-msgstr ""
+msgstr "Connexion depuis %s:%d refusée par hosts.access\n"
 
-#: src/lib/bnet_server.c:205
+#: src/lib/bnet_server.c:204
 msgid "Could not create client BSOCK.\n"
-msgstr ""
+msgstr "Impossible de créer la structure BSOCK cliente.\n"
 
-#: src/lib/bnet_server.c:212
+#: src/lib/bnet_server.c:211
 #, c-format
 msgid "Could not add job to client queue: ERR=%s\n"
-msgstr ""
+msgstr "Impossible d'ajouter le job Ã  la queue cliente : ERR=%s\n"
 
-#: src/lib/bnet_server.c:223
+#: src/lib/bnet_server.c:222
 #, c-format
 msgid "Could not destroy client queue: ERR=%s\n"
-msgstr ""
+msgstr "Impossible de détruire la queue cliente : ERR=%s\n"
 
-#: src/lib/bnet_server.c:250
+#: src/lib/bnet_server.c:249
 #, c-format
 msgid "Cannot open stream socket: %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:279
+#: src/lib/bnet_server.c:278
 #, c-format
 msgid "Cannot bind port %d: ERR=%s: retrying ...\n"
-msgstr ""
+msgstr "Impossible de s'attacher au port %d : ERR=%s : Réessaie...\n"
 
-#: src/lib/bnet_server.c:285
+#: src/lib/bnet_server.c:284
 msgid "Server socket"
 msgstr ""
 
-#: src/lib/bnet_server.c:367
+#: src/lib/bnet_server.c:366
 #, c-format
 msgid "Socket accept error for %s. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bpipe.c:282 src/lib/bpipe.c:357
+#: src/lib/bpipe.c:283 src/lib/bpipe.c:362
 msgid "Program killed by Bacula watchdog (timeout)\n"
 msgstr ""
 
@@ -6965,7 +7296,7 @@ msgstr ""
 #: src/lib/bshm.c:77
 #, c-format
 msgid "Could not get %d bytes of shared memory: %s\n"
-msgstr ""
+msgstr "Impossible de récupérer %d octets de mémoire partagée : %s\n"
 
 #: src/lib/bshm.c:102
 #, c-format
@@ -6980,92 +7311,92 @@ msgstr ""
 #: src/lib/bshm.c:139
 #, c-format
 msgid "Could not destroy shared memory: %s\n"
-msgstr ""
+msgstr "Impossible de détruire la mémoire partagée : %s\n"
 
 #: src/lib/bsys.c:176 src/lib/bsys.c:192 src/lib/bsys.c:202 src/lib/bsys.c:214
 #, c-format
 msgid "Out of memory: ERR=%s\n"
-msgstr ""
+msgstr "Plus de mémoire : ERR=%s\n"
 
-#: src/lib/bsys.c:254
+#: src/lib/bsys.c:256
 msgid "Buffer overflow.\n"
-msgstr ""
+msgstr "Buffer overflow.\n"
 
-#: src/lib/bsys.c:319
+#: src/lib/bsys.c:322
 msgid "Bad errno"
-msgstr ""
+msgstr "Mauvais errno"
 
-#: src/lib/bsys.c:336
+#: src/lib/bsys.c:339
 msgid "Possible mutex deadlock.\n"
 msgstr ""
 
-#: src/lib/bsys.c:340 src/lib/bsys.c:372
+#: src/lib/bsys.c:343 src/lib/bsys.c:375
 #, c-format
 msgid "Mutex lock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:343
+#: src/lib/bsys.c:346
 msgid "Possible mutex deadlock resolved.\n"
 msgstr ""
 
-#: src/lib/bsys.c:355
+#: src/lib/bsys.c:358
 #, c-format
 msgid "Mutex unlock not locked. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:360 src/lib/bsys.c:382
+#: src/lib/bsys.c:363 src/lib/bsys.c:385
 #, c-format
 msgid "Mutex unlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:396
+#: src/lib/bsys.c:399
 #, c-format
 msgid "Memset for %d bytes at %s:%d\n"
 msgstr ""
 
-#: src/lib/bsys.c:425
+#: src/lib/bsys.c:428
 #, c-format
 msgid "Cannot open pid file. %s ERR=%s\n"
-msgstr ""
+msgstr "Impossible d'ouvrir le fichier contenant le pid. %s ERR=%s\n"
 
-#: src/lib/bsys.c:429
+#: src/lib/bsys.c:432
 #, c-format
 msgid ""
 "%s is already running. pid=%d\n"
 "Check file %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:442
+#: src/lib/bsys.c:445
 #, c-format
 msgid "Could not open pid file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:536
+#: src/lib/bsys.c:565
 #, c-format
 msgid "Could not create state file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:552
+#: src/lib/bsys.c:584
 #, c-format
 msgid "Write final hdr error: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:574
+#: src/lib/bsys.c:611
 #, c-format
 msgid "Could not find specified group: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:577 src/lib/bsys.c:581
+#: src/lib/bsys.c:614 src/lib/bsys.c:618
 #, c-format
 msgid "Could not set specified group: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:590
+#: src/lib/bsys.c:627
 #, c-format
 msgid "Could not find specified userid: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:593
+#: src/lib/bsys.c:630
 #, c-format
 msgid "Could not set specified userid: %s\n"
 msgstr ""
@@ -7074,62 +7405,68 @@ msgstr ""
 msgid "stop_btimer called with NULL btimer_id\n"
 msgstr ""
 
-#: src/lib/cram-md5.c:80 src/lib/cram-md5.c:105
+#: src/lib/cram-md5.c:76 src/lib/cram-md5.c:101
 msgid "1999 Authorization failed.\n"
 msgstr ""
 
-#: src/lib/daemon.c:58
+#: src/lib/daemon.c:53
 #, c-format
 msgid "Cannot fork to become daemon: %s\n"
-msgstr ""
+msgstr "Impossible de forker pour passer en mode démon : %s\n"
 
-#: src/lib/edit.c:400
+#: src/lib/edit.c:433
 #, c-format
 msgid "Illegal character \"%c\" in name.\n"
-msgstr ""
+msgstr "Caractère illégal Â«Â %c » dans le nom.\n"
 
-#: src/lib/edit.c:407
+#: src/lib/edit.c:440
 msgid "Name too long.\n"
-msgstr ""
+msgstr "Nom trop long.\n"
 
 #: src/lib/events.c:161
 msgid "Events not available"
 msgstr ""
 
-#: src/lib/jcr.c:277
+#: src/lib/jcr.c:279
 msgid "NULL jcr.\n"
-msgstr ""
+msgstr "NULL jcr.\n"
 
-#: src/lib/jcr.c:396
+#: src/lib/jcr.c:400
 #, c-format
 msgid "JCR use_count=%d JobId=%d\n"
-msgstr ""
+msgstr "JCR use_count=%d JobId=%d\n"
 
-#: src/lib/jcr.c:625
+#: src/lib/jcr.c:678
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading Storage "
 "daemon.\n"
 msgstr ""
+"Le watchdog a envoyé un signal après %d secs au thread bloqué en Ã©coute du "
+"SD.\n"
 
-#: src/lib/jcr.c:637
+#: src/lib/jcr.c:690
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading File daemon.\n"
 msgstr ""
+"Le watchdog a envoyé un signal après %d secs au thread bloqué en Ã©coute du "
+"FD.\n"
 
-#: src/lib/jcr.c:649
+#: src/lib/jcr.c:702
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading Director.\n"
 msgstr ""
+"Le watchdog a envoyé un signal après %d secs au thread bloqué en Ã©coute du "
+"Director.\n"
 
-#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:192
+#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:186
 #, c-format
 msgid "Problem probably begins at line %d.\n"
-msgstr ""
+msgstr "Le problème commence sûrement au début de la ligne %d.\n"
 
-#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:197
+#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:191
 #, c-format
 msgid ""
 "Config error: %s\n"
@@ -7137,11 +7474,15 @@ msgid ""
 "%s\n"
 "%s"
 msgstr ""
+"Erreur de config : %s\n"
+"                 : ligne %d, col %d du fichier %s\n"
+"%s\n"
+"%s"
 
 #: src/lib/lex.c:88
 #, c-format
 msgid "Config error: %s\n"
-msgstr ""
+msgstr "Erreur de config : %s\n"
 
 #: src/lib/lex.c:108
 msgid "Close of NULL file\n"
@@ -7149,92 +7490,93 @@ msgstr ""
 
 #: src/lib/lex.c:181
 msgid "get_char: called after EOF\n"
-msgstr ""
+msgstr "get_char : appelé après EOF\n"
 
 #: src/lib/lex.c:220
 #, c-format
 msgid "Config token too long, file: %s, line %d, begins at line %d\n"
-msgstr ""
+msgstr "Config token trop long, fichier : %s, ligne %d, débutant ligne %d\n"
 
 #: src/lib/lex.c:244
 msgid "none"
-msgstr ""
+msgstr "none"
 
 #: src/lib/lex.c:245
 msgid "comment"
-msgstr ""
+msgstr "comment"
 
 #: src/lib/lex.c:246
 msgid "number"
-msgstr ""
+msgstr "number"
 
 #: src/lib/lex.c:247
 msgid "ip_addr"
-msgstr ""
+msgstr "ip_addr"
 
+# identifiant
 #: src/lib/lex.c:248
 msgid "identifier"
-msgstr ""
+msgstr "identifier"
 
 #: src/lib/lex.c:249
 msgid "string"
-msgstr ""
+msgstr "string"
 
 #: src/lib/lex.c:250
 msgid "quoted_string"
-msgstr ""
+msgstr "quoted_string"
 
 #: src/lib/lex.c:286
 #, c-format
 msgid "expected a positive integer number, got: %s"
-msgstr ""
+msgstr "attendait un nombre entier positif, pas : %s"
 
 #: src/lib/lex.c:292
-#, c-format
+#, fuzzy, c-format
 msgid "expected a postive integer number, got: %s"
-msgstr ""
+msgstr "attendait un nombre entier positif, pas : %s"
 
 #: src/lib/lex.c:504
 #, c-format
 msgid "Cannot open included config file %s: %s\n"
-msgstr ""
+msgstr "Impossible d'ouvrir le fichier de configuration inclus %s : %s\n"
 
 #: src/lib/lex.c:539
 #, c-format
 msgid "expected an integer or a range, got %s: %s"
-msgstr ""
+msgstr "attendait un entier ou bien un intervalle, pas %s : %s"
 
 #: src/lib/lex.c:553 src/lib/lex.c:561 src/lib/lex.c:572 src/lib/lex.c:580
 #, c-format
 msgid "expected an integer number, got %s: %s"
-msgstr ""
+msgstr "attendait un nombre entier, pas %s : %s"
 
 #: src/lib/lex.c:590
 #, c-format
 msgid "expected a name, got %s: %s"
-msgstr ""
+msgstr "attendait un nom, pas %s : %s"
 
 #: src/lib/lex.c:594
 #, c-format
 msgid "name %s length %d too long, max is %d\n"
-msgstr ""
+msgstr "la longueur du nom %s (%d) est trop grande, le max est %d\n"
 
 #: src/lib/lex.c:602
 #, c-format
 msgid "expected a string, got %s: %s"
-msgstr ""
+msgstr "attendait une chaîne, pas %s : %s"
 
-#: src/lib/mem_pool.c:100
+#: src/lib/mem_pool.c:95
 #, c-format
 msgid "MemPool index %d larger than max %d\n"
 msgstr ""
 
-#: src/lib/mem_pool.c:118 src/lib/mem_pool.c:138 src/lib/mem_pool.c:173
-#: src/lib/mem_pool.c:244 src/lib/mem_pool.c:264 src/lib/mem_pool.c:302
-#: src/lib/mem_pool.c:521
+#: src/lib/mem_pool.c:113 src/lib/mem_pool.c:133 src/lib/mem_pool.c:168
+#: src/lib/mem_pool.c:239 src/lib/mem_pool.c:259 src/lib/mem_pool.c:297
+#: src/lib/mem_pool.c:550
 #, c-format
 msgid "Out of memory requesting %d bytes\n"
-msgstr ""
+msgstr "Plus de mémoire Ã  l'allocation de %d octets\n"
 
 #: src/lib/message.c:253 src/lib/message.c:263
 #, c-format
@@ -7262,7 +7604,7 @@ msgstr ""
 #: src/lib/message.c:443
 #, c-format
 msgid "close error: ERR=%s\n"
-msgstr ""
+msgstr "erreur de fermeture : ERR=%s\n"
 
 #: src/lib/message.c:454
 #, c-format
@@ -7288,7 +7630,7 @@ msgstr ""
 #: src/lib/message.c:667 src/lib/message.c:689 src/lib/message.c:705
 #, c-format
 msgid "fopen %s failed: ERR=%s\n"
-msgstr ""
+msgstr "fopen %s en erreur : ERR=%s\n"
 
 #: src/lib/message.c:933
 #, c-format
@@ -7303,27 +7645,27 @@ msgstr ""
 #: src/lib/message.c:942
 #, c-format
 msgid "%s: Fatal Error because: "
-msgstr ""
+msgstr "%s : Erreur Fatale car : "
 
 #: src/lib/message.c:944
 #, c-format
 msgid "%s: Fatal Error at %s:%d because:\n"
-msgstr ""
+msgstr "%s : Erreur Fatale Ã  %s:%d car :\n"
 
 #: src/lib/message.c:948
 #, c-format
 msgid "%s: ERROR: "
-msgstr ""
+msgstr "%s : ERREUR : "
 
 #: src/lib/message.c:950
 #, c-format
 msgid "%s: ERROR in %s:%d "
-msgstr ""
+msgstr "%s : ERREUR dans %s:%d "
 
 #: src/lib/message.c:953
 #, c-format
 msgid "%s: Warning: "
-msgstr ""
+msgstr "%s : Attention : "
 
 #: src/lib/message.c:956
 #, c-format
@@ -7348,7 +7690,7 @@ msgstr ""
 #: src/lib/message.c:1044
 #, c-format
 msgid "%s: %s Error: "
-msgstr ""
+msgstr "%s : %s Erreur : "
 
 #: src/lib/message.c:1050
 #, c-format
@@ -7430,24 +7772,24 @@ msgid "expected a time period, got: %s"
 msgstr ""
 
 #: src/lib/parse_conf.c:699
-#, c-format
+#, fuzzy, c-format
 msgid "Expect a %s or %s, got: %s"
-msgstr ""
+msgstr "Attendait %s, a pas : %s"
 
 #: src/lib/parse_conf.c:723
 #, c-format
 msgid "Expected a Tape Label keyword, got: %s"
-msgstr ""
+msgstr "Attendait un Label de lecteur, a pas : %s"
 
 #: src/lib/parse_conf.c:772
 #, c-format
 msgid "Cannot open config file \"%s\": %s\n"
-msgstr ""
+msgstr "Impossible d'ouvrir le fichier de configuration Â«Â %s » : %s\n"
 
 #: src/lib/parse_conf.c:785
 #, c-format
 msgid "Expected a Resource name identifier, got: %s"
-msgstr ""
+msgstr "Attendait un identifiant de Ressource, a pas : %s"
 
 #: src/lib/parse_conf.c:797
 #, c-format
@@ -7466,177 +7808,156 @@ msgid ""
 "Perhaps you left the trailing brace off of the previous resource."
 msgstr ""
 
-#: src/lib/parse_conf.c:850
+#: src/lib/parse_conf.c:844
+msgid "Name not specified for resource"
+msgstr ""
+
+#: src/lib/parse_conf.c:853
 #, c-format
 msgid "unexpected token %d %s in resource definition"
 msgstr ""
 
-#: src/lib/parse_conf.c:856
+#: src/lib/parse_conf.c:859
 #, c-format
 msgid "Unknown parser state %d\n"
 msgstr ""
 
-#: src/lib/parse_conf.c:861
+#: src/lib/parse_conf.c:864
 msgid "End of conf file reached with unclosed resource."
 msgstr ""
 
-#: src/lib/regex.c:1040
-msgid "Success"
-msgstr ""
-
-#: src/lib/regex.c:1043
-msgid "No match"
-msgstr ""
-
-#: src/lib/regex.c:1046
-msgid "Invalid regular expression"
-msgstr ""
-
-#: src/lib/regex.c:1049
-msgid "Invalid collation character"
-msgstr ""
-
-#: src/lib/regex.c:1052
-msgid "Invalid character class name"
-msgstr ""
-
-#: src/lib/regex.c:1055
-msgid "Trailing backslash"
-msgstr ""
-
-#: src/lib/regex.c:1058
-msgid "Invalid back reference"
-msgstr ""
-
-#: src/lib/regex.c:1061
-msgid "Unmatched [ or [^"
-msgstr ""
-
-#: src/lib/regex.c:1064
-msgid "Unmatched ( or \\("
-msgstr ""
+#: src/lib/pythonlib.c:114
+msgid "Could not initialize Python\n"
+msgstr "Impossible d'initialiser le Python\n"
 
-#: src/lib/regex.c:1067
-msgid "Unmatched \\{"
-msgstr ""
+#: src/lib/pythonlib.c:119
+#, c-format
+msgid "Could not Run Python string %s\n"
+msgstr "Impossible de lancer la commande Python %s\n"
 
-#: src/lib/regex.c:1070
-msgid "Invalid content of \\{\\}"
+#: src/lib/pythonlib.c:131
+msgid "Could not initialize Python Job type.\n"
 msgstr ""
 
-#: src/lib/regex.c:1073
-msgid "Invalid range end"
+#: src/lib/pythonlib.c:136
+#, c-format
+msgid "Could not import Python script %s/%s. Python disabled.\n"
 msgstr ""
 
-#: src/lib/regex.c:1076
-msgid "Memory exhausted"
+#: src/lib/pythonlib.c:239
+msgid "Could not create Python Job Object.\n"
 msgstr ""
 
-#: src/lib/regex.c:1079
-msgid "Invalid preceding regular expression"
+#: src/lib/pythonlib.c:252 src/lib/pythonlib.c:276
+#, c-format
+msgid "Python function \"%s\" not found.\n"
 msgstr ""
 
-#: src/lib/regex.c:1082
-msgid "Premature end of regular expression"
+#: src/lib/pythonlib.c:291
+#, c-format
+msgid "Unknown Python daemon event %s\n"
 msgstr ""
 
-#: src/lib/regex.c:1085
-msgid "Regular expression too big"
-msgstr ""
+#: src/lib/pythonlib.c:316
+#, fuzzy, c-format
+msgid "Unable to initialize the Python lock. ERR=%s\n"
+msgstr "Impossible d'initialiser le thread OpenSSL : ERR=%s\n"
 
-#: src/lib/regex.c:1088
-msgid "Unmatched ) or \\)"
-msgstr ""
+#: src/lib/res.c:66
+#, c-format
+msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
+msgstr "rwl_writelock en Ã©chec sur %s:%d : ERR=%s\n"
 
-#: src/lib/regex.c:5874
-msgid "No previous regular expression"
-msgstr ""
+#: src/lib/res.c:76
+#, c-format
+msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
+msgstr "rwl_writeunlock en Ã©chec sur %s:%d :. ERR=%s\n"
 
-#: src/lib/rwlock.c:289
+#: src/lib/rwlock.c:284
 msgid "rwl_writeunlock called too many times.\n"
 msgstr ""
 
-#: src/lib/rwlock.c:293
+#: src/lib/rwlock.c:288
 msgid "rwl_writeunlock by non-owner.\n"
 msgstr ""
 
-#: src/lib/rwlock.c:358 src/lib/semlock.c:248
+#: src/lib/rwlock.c:353 src/lib/semlock.c:248
 #, c-format
 msgid "Write lock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:365 src/lib/semlock.c:255
+#: src/lib/rwlock.c:360 src/lib/semlock.c:255
 #, c-format
 msgid "Write unlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:375 src/lib/semlock.c:265
+#: src/lib/rwlock.c:370 src/lib/semlock.c:265
 #, c-format
 msgid "Read lock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:382 src/lib/semlock.c:272
+#: src/lib/rwlock.c:377 src/lib/semlock.c:272
 #, c-format
 msgid "Read unlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:391 src/lib/semlock.c:281
+#: src/lib/rwlock.c:386 src/lib/semlock.c:281
 #, c-format
 msgid "Thread %d found unchanged elements %d times\n"
 msgstr ""
 
-#: src/lib/rwlock.c:423 src/lib/semlock.c:313
+#: src/lib/rwlock.c:418 src/lib/semlock.c:313
 #, c-format
 msgid "Init rwlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:438 src/lib/semlock.c:328
+#: src/lib/rwlock.c:433 src/lib/semlock.c:328
 #, c-format
 msgid "Create thread failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:449 src/lib/semlock.c:339
+#: src/lib/rwlock.c:444 src/lib/semlock.c:339
 #, c-format
 msgid "Join thread failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:452 src/lib/semlock.c:342
+#: src/lib/rwlock.c:447 src/lib/semlock.c:342
 #, c-format
 msgid "%02d: interval %d, writes %d, reads %d\n"
 msgstr ""
 
-#: src/lib/rwlock.c:462 src/lib/semlock.c:352
+#: src/lib/rwlock.c:457 src/lib/semlock.c:352
 #, c-format
 msgid "data %02d: value %d, %d writes\n"
 msgstr ""
 
-#: src/lib/rwlock.c:467 src/lib/semlock.c:357
+#: src/lib/rwlock.c:462 src/lib/semlock.c:357
 #, c-format
 msgid "Total: %d thread writes, %d data writes\n"
 msgstr ""
 
-#: src/lib/rwlock.c:539 src/lib/semlock.c:429
+#: src/lib/rwlock.c:534 src/lib/semlock.c:429
 msgid "Try write lock"
 msgstr ""
 
-#: src/lib/rwlock.c:545 src/lib/semlock.c:435
+#: src/lib/rwlock.c:540 src/lib/semlock.c:435
 msgid "Try read lock"
 msgstr ""
 
-#: src/lib/rwlock.c:600 src/lib/semlock.c:490
+#: src/lib/rwlock.c:595 src/lib/semlock.c:490
 msgid "Create thread"
 msgstr ""
 
-#: src/lib/rwlock.c:610 src/lib/semlock.c:500
+#: src/lib/rwlock.c:605 src/lib/semlock.c:500
 msgid "Join thread"
 msgstr ""
 
-#: src/lib/rwlock.c:612 src/lib/semlock.c:502
+#: src/lib/rwlock.c:607 src/lib/semlock.c:502
 #, c-format
 msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n"
 msgstr ""
 
-#: src/lib/rwlock.c:624 src/lib/semlock.c:514
+#: src/lib/rwlock.c:619 src/lib/semlock.c:514
 #, c-format
 msgid "data %02d: value %d, %d updates\n"
 msgstr ""
@@ -7652,32 +7973,32 @@ msgstr ""
 #: src/lib/signal.c:87
 #, c-format
 msgid "Bacula interrupted by signal %d: %s\n"
-msgstr ""
+msgstr "Bacula a reçu le signal %d : %s\n"
 
 #: src/lib/signal.c:100
 #, c-format
 msgid "Kaboom! %s, %s got signal %d. Attempting traceback.\n"
-msgstr ""
+msgstr "Kaboom ! %s, %s a reçu le signal %d. Tentative de dump des traces.\n"
 
 #: src/lib/signal.c:102
 #, c-format
 msgid "Kaboom! exepath=%s\n"
-msgstr ""
+msgstr "Kaboom ! exepath=%s\n"
 
 #: src/lib/signal.c:136
 #, c-format
 msgid "Fork error: ERR=%s\n"
-msgstr ""
+msgstr "Fork en erreur : ERR=%s\n"
 
 #: src/lib/signal.c:143
 #, c-format
 msgid "Calling: %s %s %s\n"
-msgstr ""
+msgstr "Exécution : %s %s %s\n"
 
 #: src/lib/signal.c:145
 #, c-format
 msgid "execv: %s failed: ERR=%s\n"
-msgstr ""
+msgstr "execv : %s en Ã©chec : ERR=%s\n"
 
 #: src/lib/signal.c:160
 #, c-format
@@ -7692,15 +8013,15 @@ msgstr ""
 #: src/lib/signal.c:197
 #, c-format
 msgid "BA_NSIG too small (%d) should be (%d)\n"
-msgstr ""
+msgstr "BA_NSIG trop petit (%d) devrait Ãªtre (%d)\n"
 
 #: src/lib/signal.c:203
 msgid "UNKNOWN SIGNAL"
-msgstr ""
+msgstr "SIGNAL INCONNU"
 
 #: src/lib/signal.c:204
 msgid "Hangup"
-msgstr ""
+msgstr "Hangup"
 
 #: src/lib/signal.c:205
 msgid "Interrupt"
@@ -7756,7 +8077,7 @@ msgstr ""
 
 #: src/lib/signal.c:222
 msgid "Broken pipe"
-msgstr ""
+msgstr "Tube brisé"
 
 #: src/lib/signal.c:223
 msgid "Alarm clock"
@@ -7850,41 +8171,41 @@ msgstr ""
 msgid "Resource Lost (e.g. record-lock lost)"
 msgstr ""
 
-#: src/lib/smartall.c:137 src/lib/smartall.c:228 src/lib/smartall.c:243
+#: src/lib/smartall.c:132 src/lib/smartall.c:225 src/lib/smartall.c:240
 msgid "Out of memory\n"
-msgstr ""
+msgstr "Plus de mémoire\n"
 
-#: src/lib/smartall.c:165
+#: src/lib/smartall.c:160
 #, c-format
 msgid "Attempt to free NULL called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:181
+#: src/lib/smartall.c:176
 #, c-format
 msgid "qp->qnext->qprev != qp called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:185
+#: src/lib/smartall.c:180
 #, c-format
 msgid "qp->qprev->qnext != qp called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:194
+#: src/lib/smartall.c:189
 #, c-format
 msgid "Buffer overrun called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:265
+#: src/lib/smartall.c:262
 #, c-format
 msgid "sm_realloc size: %d\n"
 msgstr ""
 
-#: src/lib/smartall.c:306
+#: src/lib/smartall.c:303
 #, c-format
 msgid "sm_realloc %d at %x from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:368
+#: src/lib/smartall.c:365
 #, c-format
 msgid ""
 "\n"
@@ -7893,126 +8214,134 @@ msgid ""
 "  Buffer address with bad links: %lx\n"
 msgstr ""
 
-#: src/lib/smartall.c:379
+#: src/lib/smartall.c:376
 #, c-format
 msgid "Orphaned buffer:  %6u bytes allocated at line %d of %s %s\n"
 msgstr ""
 
-#: src/lib/smartall.c:415
+#: src/lib/smartall.c:412
 #, c-format
 msgid "Damaged buffer found. Called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:445
+#: src/lib/smartall.c:442
 #, c-format
 msgid ""
 "\n"
 "Damaged buffers found at %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:448
+#: src/lib/smartall.c:445
 #, c-format
 msgid "  discovery of bad prev link.\n"
 msgstr ""
 
-#: src/lib/smartall.c:451
+#: src/lib/smartall.c:448
 #, c-format
 msgid "  discovery of bad next link.\n"
 msgstr ""
 
-#: src/lib/smartall.c:454
+#: src/lib/smartall.c:451
 #, c-format
 msgid "  discovery of data overrun.\n"
 msgstr ""
 
-#: src/lib/smartall.c:457
+#: src/lib/smartall.c:454
 #, c-format
 msgid "  Buffer address: %lx\n"
-msgstr ""
+msgstr "  Adresse du buffer : %lx\n"
 
-#: src/lib/smartall.c:464
+#: src/lib/smartall.c:461
 #, c-format
 msgid "Damaged buffer:  %6u bytes allocated at line %d of %s %s\n"
 msgstr ""
 
-#: src/lib/util.c:187
+#: src/lib/util.c:181
 msgid "Running"
-msgstr ""
+msgstr "En cours"
 
-#: src/lib/util.c:190
+#: src/lib/util.c:184
 msgid "Blocked"
-msgstr ""
+msgstr "Bloqué"
 
-#: src/lib/util.c:200
+#: src/lib/util.c:194
 msgid "Non-fatal error"
-msgstr ""
+msgstr "Erreur non fatale"
 
-#: src/lib/util.c:203 src/lib/util.c:270
+#: src/lib/util.c:197 src/lib/util.c:264
 msgid "Canceled"
-msgstr ""
+msgstr "Annulé"
 
-#: src/lib/util.c:206
+#: src/lib/util.c:200
 msgid "Verify differences"
-msgstr ""
+msgstr "Vérification des différences"
 
-#: src/lib/util.c:209
+#: src/lib/util.c:203
 msgid "Waiting on FD"
-msgstr ""
+msgstr "En attente du FD"
 
-#: src/lib/util.c:212
+#: src/lib/util.c:206
 msgid "Wait on SD"
-msgstr ""
+msgstr "En attente du SD"
 
-#: src/lib/util.c:215
+#: src/lib/util.c:209
 msgid "Wait for new Volume"
-msgstr ""
+msgstr "En attente d'un nouveau Volume"
 
-#: src/lib/util.c:218
+#: src/lib/util.c:212
 msgid "Waiting for mount"
-msgstr ""
+msgstr "En attente d'un montage"
 
-#: src/lib/util.c:221
+#: src/lib/util.c:215
 msgid "Waiting for Storage resource"
 msgstr ""
 
-#: src/lib/util.c:224
+#: src/lib/util.c:218
 msgid "Waiting for Job resource"
 msgstr ""
 
-#: src/lib/util.c:227
+#: src/lib/util.c:221
 msgid "Waiting for Client resource"
 msgstr ""
 
-#: src/lib/util.c:230
+#: src/lib/util.c:224
 msgid "Waiting on Max Jobs"
 msgstr ""
 
-#: src/lib/util.c:233
+#: src/lib/util.c:227
 msgid "Waiting for Start Time"
 msgstr ""
 
-#: src/lib/util.c:236
+#: src/lib/util.c:230
 msgid "Waiting on Priority"
 msgstr ""
 
-#: src/lib/util.c:243
+#: src/lib/util.c:237
 #, c-format
 msgid "Unknown Job termination status=%d"
 msgstr ""
 
-#: src/lib/util.c:267
+#: src/lib/util.c:261
 msgid "Fatal Error"
 msgstr ""
 
-#: src/lib/util.c:273
+#: src/lib/util.c:267
 msgid "Differences"
 msgstr ""
 
-#: src/lib/util.c:276
+#: src/lib/util.c:270
 msgid "Unknown term code"
 msgstr ""
 
-#: src/lib/util.c:304
+#: src/lib/util.c:298
+msgid "Migrate"
+msgstr ""
+
+#: src/lib/util.c:301
+msgid "Copy"
+msgstr ""
+
+#: src/lib/util.c:304
 msgid "Unknown Type"
 msgstr ""
 
@@ -8040,7 +8369,7 @@ msgstr ""
 
 #: src/lib/var.c:2659
 msgid "everything ok"
-msgstr ""
+msgstr "tout est ok"
 
 #: src/lib/var.c:2660
 msgid "incomplete named character"
@@ -8048,23 +8377,23 @@ msgstr ""
 
 #: src/lib/var.c:2661
 msgid "incomplete hexadecimal value"
-msgstr ""
+msgstr "valeur hexadécimale incomplète"
 
 #: src/lib/var.c:2662
 msgid "invalid hexadecimal value"
-msgstr ""
+msgstr "valeur hexadécimale invalide"
 
 #: src/lib/var.c:2663
 msgid "octal value too large"
-msgstr ""
+msgstr "valeur octal trop grande"
 
 #: src/lib/var.c:2664
 msgid "invalid octal value"
-msgstr ""
+msgstr "valeur octal invalide"
 
 #: src/lib/var.c:2665
 msgid "incomplete octal value"
-msgstr ""
+msgstr "valeur octal incomplète"
 
 #: src/lib/var.c:2666
 msgid "incomplete grouped hexadecimal value"
@@ -8080,7 +8409,7 @@ msgstr ""
 
 #: src/lib/var.c:2669
 msgid "out of memory"
-msgstr ""
+msgstr "plus de mémoire"
 
 #: src/lib/var.c:2670
 msgid "incomplete variable specification"
@@ -8088,11 +8417,11 @@ msgstr ""
 
 #: src/lib/var.c:2671
 msgid "undefined variable"
-msgstr ""
+msgstr "variable non définie"
 
 #: src/lib/var.c:2672
 msgid "input is neither text nor variable"
-msgstr ""
+msgstr "l'entrée n'est ni du texte ni une variable"
 
 #: src/lib/var.c:2673
 msgid "unknown command character in variable"
@@ -8176,7 +8505,7 @@ msgstr ""
 
 #: src/lib/var.c:2693
 msgid "invalid argument"
-msgstr ""
+msgstr "argument invalide"
 
 #: src/lib/var.c:2694
 msgid "incomplete quoted pair"
@@ -8216,7 +8545,7 @@ msgstr ""
 
 #: src/lib/var.c:2703
 msgid "undefined operation"
-msgstr ""
+msgstr "opération indéfinie"
 
 #: src/lib/var.c:2704
 msgid "formatting failure"
@@ -8224,313 +8553,249 @@ msgstr ""
 
 #: src/lib/var.c:2713
 msgid "unknown error"
-msgstr ""
+msgstr "erreur inconnue"
 
-#: src/lib/watchdog.c:74
+#: src/lib/watchdog.c:69
 #, c-format
 msgid "Unable to initialize watchdog lock. ERR=%s\n"
 msgstr ""
 
-#: src/lib/watchdog.c:170
+#: src/lib/watchdog.c:165
 msgid "BUG! register_watchdog called before start_watchdog\n"
 msgstr ""
 
-#: src/lib/watchdog.c:173
+#: src/lib/watchdog.c:168
 #, c-format
 msgid "BUG! Watchdog %p has NULL callback\n"
 msgstr ""
 
-#: src/lib/watchdog.c:176
+#: src/lib/watchdog.c:171
 #, c-format
 msgid "BUG! Watchdog %p has zero interval\n"
 msgstr ""
 
-#: src/lib/watchdog.c:196
+#: src/lib/watchdog.c:191
 msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n"
 msgstr ""
 
-#: src/lib/watchdog.c:313
+#: src/lib/watchdog.c:309
 #, c-format
 msgid "rwl_writelock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/watchdog.c:327
+#: src/lib/watchdog.c:323
 #, c-format
 msgid "rwl_writeunlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:108
-msgid "Could not initialize Python\n"
-msgstr ""
-
-#: src/lib/pythonlib.c:113
+#: src/stored/acquire.c:52
 #, c-format
-msgid "Could not Run Python string %s\n"
-msgstr ""
-
-#: src/lib/pythonlib.c:125
-msgid "Could not initialize Python Job type.\n"
+msgid "Num_writers=%d not zero. Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:130
+#: src/stored/acquire.c:60
 #, c-format
-msgid "Could not import Python script %s/%s. Python disabled.\n"
-msgstr ""
-
-#: src/lib/pythonlib.c:230
-msgid "Could not create Python Job Object.\n"
+msgid "No volumes specified. Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:243 src/lib/pythonlib.c:267
+#: src/stored/acquire.c:92 src/stored/mount.c:73
 #, c-format
-msgid "Python function \"%s\" not found.\n"
-msgstr ""
+msgid "Job %d canceled.\n"
+msgstr "Le job %d est annulé.\n"
 
-#: src/lib/pythonlib.c:282
+#: src/stored/acquire.c:103
 #, c-format
-msgid "Unknown Python daemon event %s\n"
+msgid "Read open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
 msgstr ""
 
-#: src/lib/res.c:66
+#: src/stored/acquire.c:108
 #, c-format
-msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
+msgid "Read open device %s Volume \"%s\" failed: ERR=%s\n"
 msgstr ""
 
-#: src/lib/res.c:76
+#: src/stored/acquire.c:179 src/stored/mount.c:67
 #, c-format
-msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
+msgid "Too many errors trying to mount device %s.\n"
 msgstr ""
 
-#: src/lib/tls.c:108
+#: src/stored/acquire.c:188
 #, c-format
-msgid ""
-"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
+msgid "Ready to read from volume \"%s\" on device %s.\n"
 msgstr ""
 
-#: src/lib/tls.c:155
-msgid "Error initializing SSL context"
+#: src/stored/acquire.c:232
+#, c-format
+msgid "Device %s is busy reading.\n"
 msgstr ""
 
-#: src/lib/tls.c:176
-msgid "Error loading certificate verification stores"
+#: src/stored/acquire.c:262
+#, c-format
+msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
 msgstr ""
 
-#: src/lib/tls.c:181
+#: src/stored/acquire.c:281
+#, c-format
 msgid ""
-"Either a certificate file or a directory must be specified as a verification "
-"store\n"
-msgstr ""
-
-#: src/lib/tls.c:192
-msgid "Error loading certificate file"
-msgstr ""
-
-#: src/lib/tls.c:200
-msgid "Error loading private key"
-msgstr ""
-
-#: src/lib/tls.c:208
-msgid "Unable to open DH parameters file"
-msgstr ""
-
-#: src/lib/tls.c:214
-msgid "Unable to load DH parameters from specified file"
-msgstr ""
-
-#: src/lib/tls.c:218
-msgid "Failed to set TLS Diffie-Hellman parameters"
-msgstr ""
-
-#: src/lib/tls.c:227
-msgid "Error setting cipher list, no valid ciphers available\n"
-msgstr ""
-
-#: src/lib/tls.c:275
-msgid "Peer failed to present a TLS certificate\n"
+"Cannot recycle volume \"%s\" on device %s because it is in use by another "
+"job.\n"
 msgstr ""
 
-#: src/lib/tls.c:317
+#: src/stored/acquire.c:303
 #, c-format
-msgid "Peer %s failed to present a TLS certificate\n"
-msgstr ""
-
-#: src/lib/tls.c:416
-msgid "Error creating file descriptor-based BIO"
-msgstr ""
-
-#: src/lib/tls.c:427
-msgid "Error creating new SSL object"
-msgstr ""
-
-#: src/lib/tls.c:493 src/lib/tls.c:510
-msgid "Connect failure"
-msgstr ""
-
-#: src/lib/tls.c:587 src/lib/tls.c:591
-msgid "TLS shutdown failure."
+msgid "Could not ready device %s for append.\n"
 msgstr ""
 
-#: src/lib/tls.c:642 src/lib/tls.c:658
-msgid "TLS read/write failure."
+#: src/stored/acquire.c:380 src/stored/block.c:354 src/stored/block.c:682
+#: src/stored/block.c:751
+#, c-format
+msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
 msgstr ""
 
-#: src/lib/tls.c:716 src/lib/tls.c:773 src/stored/dev.c:212
-#: src/stored/dev.c:230 src/stored/dev.c:236 src/stored/stored_conf.c:550
+#: src/stored/acquire.c:422
 #, c-format
-msgid "Unable to init mutex: ERR=%s\n"
+msgid "Alert: %s"
 msgstr ""
 
-#: src/lib/tls.c:736 src/lib/tls.c:805
+#: src/stored/acquire.c:430
 #, c-format
-msgid "Unable to destroy mutex: ERR=%s\n"
+msgid "3997 Bad alert command: %s: ERR=%s.\n"
 msgstr ""
 
-#: src/lib/tls.c:870
+#: src/stored/acquire.c:518
 #, c-format
-msgid "Unable to init OpenSSL threading: ERR=%s\n"
+msgid "Hey! num_writers=%d!!!!\n"
 msgstr ""
 
-#: src/lib/tls.c:880
-msgid "Failed to seed OpenSSL PRNG\n"
+#: src/stored/ansi_label.c:83
+#, c-format
+msgid "Read error on device %s in ANSI label. ERR=%s\n"
 msgstr ""
 
-#: src/lib/tls.c:906
-msgid "Failed to save OpenSSL PRNG\n"
+#: src/stored/ansi_label.c:93
+msgid "Insane! End of tape while reading ANSI label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:98
-#, c-format
-msgid "Hey! num_writers=%d!!!!\n"
+#: src/stored/ansi_label.c:117
+msgid "No VOL1 label while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:146
+#: src/stored/ansi_label.c:137
 #, c-format
-msgid "Num_writers=%d not zero. Job %d canceled.\n"
+msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
 msgstr ""
 
-#: src/stored/acquire.c:154
-#, c-format
-msgid "No volumes specified. Job %d canceled.\n"
+#: src/stored/ansi_label.c:148
+msgid "No HDR1 label while reading ANSI label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:182 src/stored/mount.c:72
+#: src/stored/ansi_label.c:154
 #, c-format
-msgid "Job %d canceled.\n"
+msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
 msgstr ""
 
-#: src/stored/acquire.c:193
-#, c-format
-msgid "Open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
+#: src/stored/ansi_label.c:165
+msgid "No HDR2 label while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:208
-#, c-format
-msgid "Open device %s Volume \"%s\" failed: ERR=%s\n"
+#: src/stored/ansi_label.c:179
+msgid "Unknown or bad ANSI/IBM label record.\n"
 msgstr ""
 
-#: src/stored/acquire.c:273 src/stored/mount.c:66
-#, c-format
-msgid "Too many errors trying to mount device %s.\n"
+#: src/stored/ansi_label.c:186
+msgid "Too many records in while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:282
+#: src/stored/ansi_label.c:285
 #, c-format
-msgid "Ready to read from volume \"%s\" on device %s.\n"
+msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
 msgstr ""
 
-#: src/stored/acquire.c:328 src/stored/reserve.c:664
+#: src/stored/ansi_label.c:302
 #, c-format
-msgid "Device %s is busy reading.\n"
+msgid "Could not write ANSI VOL1 label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/acquire.c:358
+#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
 #, c-format
-msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
+msgid "Could not write ANSI HDR1 label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/acquire.c:377
-#, c-format
-msgid ""
-"Cannot recycle volume \"%s\" on device %s because it is in use by another "
-"job.\n"
+#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
+msgid "Could not write ANSI HDR1 label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:399
+#: src/stored/ansi_label.c:381
 #, c-format
-msgid "Could not ready device %s for append.\n"
+msgid "Error writing EOF to tape. ERR=%s"
 msgstr ""
 
-#: src/stored/acquire.c:464 src/stored/block.c:353 src/stored/block.c:676
-#: src/stored/block.c:744
-#, c-format
-msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
+#: src/stored/ansi_label.c:386
+msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
 msgstr ""
 
-#: src/stored/acquire.c:506
-#, c-format
-msgid "Alert: %s"
+#: src/stored/append.c:49
+msgid "DCR is NULL!!!\n"
 msgstr ""
 
-#: src/stored/acquire.c:514
-#, c-format
-msgid "3997 Bad alert command: %s: ERR=%s.\n"
+#: src/stored/append.c:54
+msgid "DEVICE is NULL!!!\n"
 msgstr ""
 
-#: src/stored/append.c:60
+#: src/stored/append.c:66
 msgid "Unable to set network buffer size.\n"
 msgstr ""
 
-#: src/stored/append.c:73 src/stored/append.c:82 src/stored/append.c:94
-#: src/stored/append.c:249 src/stored/append.c:264 src/stored/append.c:276
-#: src/stored/askdir.c:284 src/stored/askdir.c:285
+#: src/stored/append.c:79 src/stored/append.c:88 src/stored/append.c:100
+#: src/stored/append.c:256 src/stored/append.c:271 src/stored/append.c:283
+#: src/stored/askdir.c:291 src/stored/askdir.c:292
 msgid "NULL Volume name. This shouldn't happen!!!\n"
 msgstr ""
 
-#: src/stored/append.c:88 src/stored/btape.c:1853
+#: src/stored/append.c:94 src/stored/btape.c:1854
 #, c-format
 msgid "Write session label failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:100
+#: src/stored/append.c:106
 #, c-format
 msgid "Network send error to FD. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:137
+#: src/stored/append.c:143
 #, c-format
 msgid "Error reading data header from FD. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:159
+#: src/stored/append.c:165
 #, c-format
 msgid "Malformed data header from FD: %s\n"
 msgstr ""
 
-#: src/stored/append.c:169
+#: src/stored/append.c:175
 msgid "File index from FD not positive or sequential\n"
 msgstr ""
 
-#: src/stored/append.c:199 src/stored/append.c:269 src/stored/spool.c:247
+#: src/stored/append.c:206 src/stored/append.c:276 src/stored/spool.c:248
 #, c-format
 msgid "Fatal append error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:224
+#: src/stored/append.c:231
 #, c-format
 msgid "Error updating file attributes. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:237
+#: src/stored/append.c:244
 #, c-format
 msgid "Network error on data channel. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:258 src/stored/btape.c:1969
+#: src/stored/append.c:265 src/stored/btape.c:1976
 #, c-format
 msgid "Error writting end session label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:271
+#: src/stored/append.c:278
 msgid "Set ok=FALSE after write_block_to_device.\n"
 msgstr ""
 
@@ -8540,41 +8805,34 @@ msgstr ""
 
 #: src/stored/askdir.c:178
 #, c-format
-msgid "Error getting Volume info: %s\n"
+msgid "Error getting Volume info: %s"
 msgstr ""
 
-#: src/stored/askdir.c:289 src/stored/askdir.c:290
+#: src/stored/askdir.c:296 src/stored/askdir.c:297
 msgid "Attempt to update_volume_info in read mode!!!\n"
 msgstr ""
 
-#: src/stored/askdir.c:318
+#: src/stored/askdir.c:325
 #, c-format
 msgid "Didn't get vol info vol=%s: ERR=%s"
 msgstr ""
 
-#: src/stored/askdir.c:349
+#: src/stored/askdir.c:356
 #, c-format
 msgid "Error creating JobMedia record: ERR=%s\n"
 msgstr ""
 
-#: src/stored/askdir.c:356
+#: src/stored/askdir.c:363
 #, c-format
 msgid "Error creating JobMedia record: %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:424
+#: src/stored/askdir.c:429
 #, c-format
 msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n"
 msgstr ""
 
-#: src/stored/askdir.c:452
-#, c-format
-msgid ""
-"Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
-"Use \"mount\" command to release Job.\n"
-msgstr ""
-
-#: src/stored/askdir.c:462
+#: src/stored/askdir.c:442
 #, c-format
 msgid ""
 "Job %s waiting. Cannot find any appendable volumes.\n"
@@ -8584,45 +8842,31 @@ msgid ""
 "    Pool:         %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:486 src/stored/askdir.c:588
+#: src/stored/askdir.c:466 src/stored/askdir.c:548
 #, c-format
 msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:496 src/stored/askdir.c:503
-#, c-format
-msgid "pthread error in mount_next_volume stat=%d ERR=%s\n"
-msgstr ""
-
-#: src/stored/askdir.c:514
-#, c-format
-msgid ""
-"Someone woke me up, but I cannot find any appendable\n"
-"volumes for Job=%s.\n"
+#: src/stored/askdir.c:476
+msgid "pthread error in mount_next_volume.\n"
 msgstr ""
 
-#: src/stored/askdir.c:558
+#: src/stored/askdir.c:508
 msgid "Cannot request another volume: no volume name given.\n"
 msgstr ""
 
-#: src/stored/askdir.c:564
+#: src/stored/askdir.c:514
 #, c-format
 msgid "Job %s canceled while waiting for mount on Storage Device %s.\n"
 msgstr ""
 
-#: src/stored/askdir.c:570
+#: src/stored/askdir.c:529
 #, c-format
 msgid "Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:598
-#, c-format
-msgid "pthread error in mount_volume stat=%d ERR=%s\n"
-msgstr ""
-
-#: src/stored/askdir.c:605
-#, c-format
-msgid "pthread error in mount_next_volume stat=%d: ERR=%s\n"
+#: src/stored/askdir.c:558
+msgid "pthread error in mount_volume\n"
 msgstr ""
 
 #: src/stored/authenticate.c:53
@@ -8650,71 +8894,91 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:95
+#: src/stored/autochanger.c:53
+#, c-format
+msgid "No Changer Name given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:59
+#, c-format
+msgid "No Changer Command given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:72
+#, c-format
+msgid ""
+"Media Type not the same for all devices in changer %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:152
 #, c-format
 msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:102
+#: src/stored/autochanger.c:161
 #, c-format
 msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:108
+#: src/stored/autochanger.c:167
 #, c-format
 msgid "3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:153
+#: src/stored/autochanger.c:208
+msgid "3992 Missing Changer command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:218
 #, c-format
 msgid "3301 Issuing autochanger \"loaded drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:162
+#: src/stored/autochanger.c:227
 #, c-format
 msgid "3302 Autochanger \"loaded drive %d\", result is Slot %d.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:166
+#: src/stored/autochanger.c:231
 #, c-format
 msgid "3302 Autochanger \"loaded drive %d\", result: nothing loaded.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:173
+#: src/stored/autochanger.c:238
 #, c-format
 msgid "3991 Bad autochanger \"loaded drive %d\" command: ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:234 src/stored/autochanger.c:304
+#: src/stored/autochanger.c:297 src/stored/autochanger.c:380
 #, c-format
 msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:247 src/stored/autochanger.c:325
+#: src/stored/autochanger.c:310 src/stored/autochanger.c:401
 #, c-format
 msgid "3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:290
-#, c-format
+#: src/stored/autochanger.c:369
+#, fuzzy, c-format
 msgid "Volume %s is in use by device %s\n"
-msgstr ""
+msgstr "Le volume Â«Â %s » n'est pas dans le device %s.\n"
 
-#: src/stored/autochanger.c:358
+#: src/stored/autochanger.c:439
 #, c-format
 msgid "3993 Device %s not an autochanger device.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:372
+#: src/stored/autochanger.c:464
 #, c-format
 msgid "3306 Issuing autochanger \"%s\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:377
+#: src/stored/autochanger.c:467
 msgid "3996 Open bpipe failed.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:401
+#: src/stored/autochanger.c:494
 #, c-format
 msgid "Autochanger error: ERR=%s\n"
 msgstr ""
@@ -8743,7 +9007,7 @@ msgstr ""
 msgid "Wrong number of arguments: \n"
 msgstr ""
 
-#: src/stored/bcopy.c:172 src/stored/btape.c:334 src/stored/device.c:273
+#: src/stored/bcopy.c:172 src/stored/btape.c:333 src/stored/device.c:266
 #, c-format
 msgid "dev open failed: %s\n"
 msgstr ""
@@ -8757,7 +9021,7 @@ msgstr ""
 msgid "%u Jobs copied. %u records copied.\n"
 msgstr ""
 
-#: src/stored/bcopy.c:205 src/stored/bscan.c:389
+#: src/stored/bcopy.c:205 src/stored/bscan.c:390
 #, c-format
 msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n"
 msgstr ""
@@ -8771,7 +9035,7 @@ msgid "Volume label not copied.\n"
 msgstr ""
 
 #: src/stored/bcopy.c:235 src/stored/bcopy.c:242 src/stored/bcopy.c:265
-#: src/stored/btape.c:2335
+#: src/stored/btape.c:2342
 #, c-format
 msgid "Cannot fixup device error. %s\n"
 msgstr ""
@@ -8784,8 +9048,8 @@ msgstr ""
 msgid "EOT label not copied.\n"
 msgstr ""
 
-#: src/stored/bcopy.c:290 src/stored/bextract.c:473 src/stored/bls.c:444
-#: src/stored/bscan.c:1227 src/stored/btape.c:2683
+#: src/stored/bcopy.c:287 src/stored/bextract.c:476 src/stored/bls.c:440
+#: src/stored/bscan.c:1231 src/stored/btape.c:2690
 #, c-format
 msgid "Mount Volume \"%s\" on device %s and press return when ready: "
 msgstr ""
@@ -8811,12 +9075,12 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bextract.c:127 src/stored/bls.c:129
+#: src/stored/bextract.c:127 src/stored/bls.c:128
 #, c-format
 msgid "Could not open exclude file: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/bextract.c:142 src/stored/bls.c:143
+#: src/stored/bextract.c:142 src/stored/bls.c:142
 #, c-format
 msgid "Could not open include file: %s, ERR=%s\n"
 msgstr ""
@@ -8846,11 +9110,11 @@ msgstr ""
 msgid "%u files restored.\n"
 msgstr ""
 
-#: src/stored/bextract.c:278 src/stored/bextract.c:444
+#: src/stored/bextract.c:278 src/stored/bextract.c:450
 msgid "Logic error output file should be open but is not.\n"
 msgstr ""
 
-#: src/stored/bextract.c:285 src/stored/bls.c:365 src/stored/bscan.c:645
+#: src/stored/bextract.c:285 src/stored/bls.c:364 src/stored/bscan.c:647
 msgid "Cannot continue.\n"
 msgstr ""
 
@@ -8868,176 +9132,178 @@ msgstr ""
 msgid "===Write error===\n"
 msgstr ""
 
-#: src/stored/bextract.c:435
+#: src/stored/bextract.c:441
 msgid "Got Program Name or Data Stream. Ignored.\n"
 msgstr ""
 
-#: src/stored/block.c:78
+#: src/stored/block.c:79
 #, c-format
 msgid ""
 "Dump block %s %x: size=%d BlkNum=%d\n"
 "               Hdrcksum=%x cksum=%x\n"
 msgstr ""
 
-#: src/stored/block.c:91
+#: src/stored/block.c:92
 #, c-format
 msgid "   Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n"
 msgstr ""
 
-#: src/stored/block.c:147
+#: src/stored/block.c:148
 #, c-format
 msgid "%d block read errors not printed.\n"
 msgstr ""
 
-#: src/stored/block.c:235 src/stored/block.c:251 src/stored/block.c:261
+#: src/stored/block.c:236 src/stored/block.c:252 src/stored/block.c:262
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer "
 "discarded.\n"
 msgstr ""
 
-#: src/stored/block.c:275
+#: src/stored/block.c:276
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Block length %u is insane (too large), probably "
 "due to a bad archive.\n"
 msgstr ""
 
-#: src/stored/block.c:301
+#: src/stored/block.c:302
 #, c-format
 msgid ""
 "Volume data error at %u:%u!\n"
 "Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n"
 msgstr ""
 
-#: src/stored/block.c:409
+#: src/stored/block.c:410
 msgid "Cannot write block. Device at EOM.\n"
 msgstr ""
 
-#: src/stored/block.c:414
+#: src/stored/block.c:415
 msgid "Attempt to write on read-only Volume.\n"
 msgstr ""
 
-#: src/stored/block.c:466
+#: src/stored/block.c:467
 #, c-format
 msgid "User defined maximum volume capacity %s exceeded on device %s.\n"
 msgstr ""
 
-#: src/stored/block.c:481
+#: src/stored/block.c:482
 #, c-format
 msgid "Unable to write EOF. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:507 src/stored/block.c:518
+#: src/stored/block.c:508 src/stored/block.c:519
 msgid "Write block header zeroed.\n"
 msgstr ""
 
-#: src/stored/block.c:536
+#: src/stored/block.c:537
 #, c-format
 msgid "Write error at %u:%u on device %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/block.c:543
+#: src/stored/block.c:544
 #, c-format
 msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"
 msgstr ""
 
-#: src/stored/block.c:618 src/stored/block.c:624
+#: src/stored/block.c:619 src/stored/block.c:625
 #, c-format
 msgid "Backspace file at EOT failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:631
+#: src/stored/block.c:632
 #, c-format
 msgid "Backspace record at EOT failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:648
+#: src/stored/block.c:649
 #, c-format
 msgid "Re-read last block at EOT failed. ERR=%s"
 msgstr ""
 
-#: src/stored/block.c:652
-msgid "Re-read of last block succeeded.\n"
+#: src/stored/block.c:659
+#, c-format
+msgid ""
+"Re-read of last block OK, but block numbers differ. Last block=%u Current "
+"block=%u.\n"
 msgstr ""
 
-#: src/stored/block.c:655
-#, c-format
-msgid "Re-read of last block failed. Last block=%u Current block=%u.\n"
+#: src/stored/block.c:662
+msgid "Re-read of last block succeeded.\n"
 msgstr ""
 
-#: src/stored/block.c:684
+#: src/stored/block.c:690
 #, c-format
 msgid ""
-"Error writing final EOF to tape. This tape may not be readable.\n"
+"Error writing final EOF to tape. This Volume may not be readable.\n"
 "%s"
 msgstr ""
 
-#: src/stored/block.c:790 src/stored/dvd.c:622
+#: src/stored/block.c:800 src/stored/dvd.c:689
 #, c-format
 msgid ""
 "Error while writing, current part number is less than the total number of "
 "parts (%d/%d, device=%s)\n"
 msgstr ""
 
-#: src/stored/block.c:798 src/stored/block.c:908
+#: src/stored/block.c:808 src/stored/block.c:918
 #, c-format
 msgid "Unable to open device next part %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:816
+#: src/stored/block.c:826
 #, c-format
 msgid ""
 "End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
 "free_space_errno=%d, errmsg=%s).\n"
 msgstr ""
 
-#: src/stored/block.c:829
+#: src/stored/block.c:839
 #, c-format
 msgid ""
 "End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
 "free_space_errno=%d).\n"
 msgstr ""
 
-#: src/stored/block.c:883
+#: src/stored/block.c:893
 #, c-format
 msgid "Block buffer size looping problem on device %s\n"
 msgstr ""
 
-#: src/stored/block.c:934
+#: src/stored/block.c:944
 #, c-format
 msgid "Read error at file:blk %u:%u on device %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/block.c:947
+#: src/stored/block.c:957
 #, c-format
 msgid "Read zero bytes at %u:%u on device %s.\n"
 msgstr ""
 
-#: src/stored/block.c:960
+#: src/stored/block.c:970
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Very short block of %d bytes on device %s "
 "discarded.\n"
 msgstr ""
 
-#: src/stored/block.c:985
+#: src/stored/block.c:995
 #, c-format
 msgid "Block length %u is greater than buffer %u. Attempting recovery.\n"
 msgstr ""
 
-#: src/stored/block.c:1004
+#: src/stored/block.c:1014
 #, c-format
 msgid "Setting block buffer size to %u bytes.\n"
 msgstr ""
 
-#: src/stored/block.c:1019
+#: src/stored/block.c:1029
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n"
 msgstr ""
 
-#: src/stored/bls.c:69
+#: src/stored/bls.c:68
 #, c-format
 msgid ""
 "Copyright (C) 2000-2005 Kern Sibbald.\n"
@@ -9061,74 +9327,74 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bls.c:190
+#: src/stored/bls.c:189
 msgid "No archive name specified\n"
 msgstr ""
 
-#: src/stored/bls.c:226
+#: src/stored/bls.c:224
 #, c-format
 msgid ""
 "\n"
 "Warning, this Volume is a continuation of Volume %s\n"
 msgstr ""
 
-#: src/stored/bls.c:268
+#: src/stored/bls.c:267
 #, c-format
 msgid "Got EOM at file %u on device %s, Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/bls.c:279
+#: src/stored/bls.c:278
 #, c-format
 msgid "Mounted Volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/bls.c:281
+#: src/stored/bls.c:280
 #, c-format
-msgid "Got EOF at file %u on device %s, Volume \"%s\"\n"
+msgid "End of file %u on device %s, Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/bls.c:305
+#: src/stored/bls.c:304
 #, c-format
 msgid ""
 "File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
 "s rlen=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:314
+#: src/stored/bls.c:313
 #, c-format
 msgid "Block: %d size=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:381
+#: src/stored/bls.c:380
 #, c-format
 msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:398 src/stored/read_record.c:321
+#: src/stored/bls.c:397 src/stored/read_record.c:322
 msgid "Fresh Volume Label"
 msgstr ""
 
-#: src/stored/bls.c:401 src/stored/read_record.c:324
+#: src/stored/bls.c:400 src/stored/read_record.c:325
 msgid "Volume Label"
 msgstr ""
 
-#: src/stored/bls.c:405 src/stored/label.c:959
+#: src/stored/bls.c:404 src/stored/label.c:969
 msgid "Begin Job Session"
 msgstr ""
 
-#: src/stored/bls.c:409 src/stored/label.c:962
+#: src/stored/bls.c:408 src/stored/label.c:972
 msgid "End Job Session"
 msgstr ""
 
-#: src/stored/bls.c:412
+#: src/stored/bls.c:411
 msgid "End of Medium"
 msgstr ""
 
-#: src/stored/bls.c:415 src/stored/label.c:971
+#: src/stored/bls.c:414 src/stored/label.c:981
 msgid "Unknown"
 msgstr ""
 
-#: src/stored/bls.c:421 src/stored/read_record.c:342
+#: src/stored/bls.c:420 src/stored/read_record.c:343
 #, c-format
 msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n"
 msgstr ""
@@ -9160,12 +9426,12 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bscan.c:234 src/stored/stored.c:266
+#: src/stored/bscan.c:234 src/stored/stored.c:267
 #, c-format
 msgid "No Storage resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/bscan.c:242 src/stored/stored.c:297
+#: src/stored/bscan.c:242 src/stored/stored.c:298
 #, c-format
 msgid "No Working Directory defined in %s. Cannot continue.\n"
 msgstr ""
@@ -9180,7 +9446,7 @@ msgstr ""
 msgid "Working Directory: %s is not a directory. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/bscan.c:268 src/stored/bscan.c:340
+#: src/stored/bscan.c:268 src/stored/bscan.c:341
 #, c-format
 msgid "First Volume Size = %sn"
 msgstr ""
@@ -9199,235 +9465,235 @@ msgstr ""
 msgid "Create JobMedia for Job %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:325
+#: src/stored/bscan.c:326
 #, c-format
 msgid "Could not create JobMedia record for Volume=%s Job=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:381
+#: src/stored/bscan.c:382
 #, c-format
 msgid "done: %d%%\n"
 msgstr ""
 
-#: src/stored/bscan.c:405
+#: src/stored/bscan.c:406
 msgid "Volume is prelabeled. This tape cannot be scanned.\n"
 msgstr ""
 
-#: src/stored/bscan.c:417
+#: src/stored/bscan.c:418
 #, c-format
 msgid "Pool record for %s found in DB.\n"
 msgstr ""
 
-#: src/stored/bscan.c:421
+#: src/stored/bscan.c:422
 #, c-format
 msgid "VOL_LABEL: Pool record not found for Pool: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:427
+#: src/stored/bscan.c:428
 #, c-format
 msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:431
+#: src/stored/bscan.c:432
 #, c-format
 msgid "Pool type \"%s\" is OK.\n"
 msgstr ""
 
-#: src/stored/bscan.c:441
+#: src/stored/bscan.c:442
 #, c-format
 msgid "Media record for %s found in DB.\n"
 msgstr ""
 
-#: src/stored/bscan.c:448
+#: src/stored/bscan.c:449
 #, c-format
 msgid "VOL_LABEL: Media record not found for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:455
+#: src/stored/bscan.c:456
 #, c-format
 msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:459
+#: src/stored/bscan.c:460
 #, c-format
 msgid "Media type \"%s\" is OK.\n"
 msgstr ""
 
-#: src/stored/bscan.c:468
+#: src/stored/bscan.c:469
 #, c-format
 msgid "VOL_LABEL: OK for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:475
+#: src/stored/bscan.c:476
 #, c-format
 msgid "%d \"errors\" ignored before first Start of Session record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:486
+#: src/stored/bscan.c:487
 #, c-format
 msgid "SOS_LABEL: Found Job record for JobId: %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:491
+#: src/stored/bscan.c:492
 #, c-format
 msgid "SOS_LABEL: Job record not found for JobId: %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:531
+#: src/stored/bscan.c:532
 #, c-format
 msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:537
+#: src/stored/bscan.c:538
 #, c-format
 msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:543
+#: src/stored/bscan.c:544
 #, c-format
 msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:561 src/stored/bscan.c:1007
+#: src/stored/bscan.c:562 src/stored/bscan.c:1013
 #, c-format
 msgid "Could not find SessId=%d SessTime=%d for EOS record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:604
+#: src/stored/bscan.c:606
 #, c-format
 msgid "Could not update job record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:615
+#: src/stored/bscan.c:617
 #, c-format
 msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:627
+#: src/stored/bscan.c:629
 #, c-format
 msgid "Could not find Job for SessId=%d SessTime=%d record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:663
+#: src/stored/bscan.c:665
 #, c-format
 msgid "%s file records. At file:blk=%s:%s bytes=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:706
+#: src/stored/bscan.c:708
 #, c-format
 msgid "Got MD5 record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:715
+#: src/stored/bscan.c:717
 #, c-format
 msgid "Got SHA1 record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:723
+#: src/stored/bscan.c:725
 #, c-format
 msgid "Got Prog Names Stream: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:729
+#: src/stored/bscan.c:731
 msgid "Got Prog Data Stream record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:733
+#: src/stored/bscan.c:735
 #, c-format
 msgid "Unknown stream type!!! stream=%d data=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:793
+#: src/stored/bscan.c:799
 #, c-format
 msgid "Could not create File Attributes record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:799
+#: src/stored/bscan.c:805
 #, c-format
 msgid "Created File record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:836
+#: src/stored/bscan.c:842
 #, c-format
 msgid "Could not create media record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:840 src/stored/bscan.c:861
+#: src/stored/bscan.c:846 src/stored/bscan.c:867
 #, c-format
 msgid "Could not update media record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:844
+#: src/stored/bscan.c:850
 #, c-format
 msgid "Created Media record for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:865
+#: src/stored/bscan.c:871
 #, c-format
 msgid "Updated Media record at end of Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:882
+#: src/stored/bscan.c:888
 #, c-format
 msgid "Could not create pool record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:886
+#: src/stored/bscan.c:892
 #, c-format
 msgid "Created Pool record for Pool: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:906
+#: src/stored/bscan.c:912
 #, c-format
 msgid "Created Client record for Client: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:923
+#: src/stored/bscan.c:929
 #, c-format
 msgid "Fileset \"%s\" already exists.\n"
 msgstr ""
 
-#: src/stored/bscan.c:927
+#: src/stored/bscan.c:933
 #, c-format
 msgid "Could not create FileSet record \"%s\". ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:932
+#: src/stored/bscan.c:938
 #, c-format
 msgid "Created FileSet record \"%s\"\n"
 msgstr ""
 
-#: src/stored/bscan.c:979
+#: src/stored/bscan.c:985
 #, c-format
 msgid "Could not create JobId record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:985
+#: src/stored/bscan.c:991
 #, c-format
 msgid "Could not update job start record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:988
+#: src/stored/bscan.c:994
 #, c-format
 msgid "Created new JobId=%u record for original JobId=%u\n"
 msgstr ""
 
-#: src/stored/bscan.c:1038
+#: src/stored/bscan.c:1044
 #, c-format
 msgid "Could not update JobId=%u record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1043
+#: src/stored/bscan.c:1049
 #, c-format
 msgid "Updated Job termination record for JobId=%u TermStat=%c\n"
 msgstr ""
 
-#: src/stored/bscan.c:1065
+#: src/stored/bscan.c:1071
 #, c-format
 msgid "Job Termination code: %d"
 msgstr ""
 
-#: src/stored/bscan.c:1070
+#: src/stored/bscan.c:1076
 #, c-format
 msgid ""
 "%s\n"
@@ -9447,27 +9713,27 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bscan.c:1134
+#: src/stored/bscan.c:1140
 #, c-format
 msgid "Could not create JobMedia record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1138
+#: src/stored/bscan.c:1144
 #, c-format
 msgid "Created JobMedia record JobId %d, MediaId %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:1154
+#: src/stored/bscan.c:1160
 #, c-format
 msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:1168
+#: src/stored/bscan.c:1174
 #, c-format
 msgid "Could not add MD5/SHA1 to File record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1173
+#: src/stored/bscan.c:1179
 msgid "Updated MD5/SHA1 record\n"
 msgstr ""
 
@@ -9518,140 +9784,140 @@ msgstr ""
 msgid "Improper number of arguments specified.\n"
 msgstr ""
 
-#: src/stored/btape.c:340
+#: src/stored/btape.c:338
 #, c-format
 msgid "open device %s: OK\n"
 msgstr ""
 
-#: src/stored/btape.c:361
+#: src/stored/btape.c:359
 msgid "Enter Volume Name: "
-msgstr ""
+msgstr "Saisissez un nom de Volume : "
 
-#: src/stored/btape.c:368
+#: src/stored/btape.c:366
 #, c-format
 msgid "Device open failed. ERR=%s\n"
-msgstr ""
+msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n"
 
-#: src/stored/btape.c:373
+#: src/stored/btape.c:371
 #, c-format
 msgid "Wrote Volume label for volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/btape.c:387
+#: src/stored/btape.c:385
 msgid "Volume has no label.\n"
-msgstr ""
+msgstr "Le Volume n'a pas de label.\n"
 
-#: src/stored/btape.c:390
+#: src/stored/btape.c:388
 msgid "Volume label read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:393
+#: src/stored/btape.c:391
 #, c-format
 msgid "I/O error on device: ERR=%s"
 msgstr ""
 
-#: src/stored/btape.c:396
+#: src/stored/btape.c:394
 msgid "Volume name error\n"
 msgstr ""
 
-#: src/stored/btape.c:399
+#: src/stored/btape.c:397
 #, c-format
 msgid "Error creating label. ERR=%s"
 msgstr ""
 
-#: src/stored/btape.c:402
+#: src/stored/btape.c:400
 msgid "Volume version error.\n"
 msgstr ""
 
-#: src/stored/btape.c:405
+#: src/stored/btape.c:403
 msgid "Bad Volume label type.\n"
 msgstr ""
 
-#: src/stored/btape.c:408
+#: src/stored/btape.c:406
 msgid "Unknown error.\n"
 msgstr ""
 
-#: src/stored/btape.c:426
+#: src/stored/btape.c:424
 #, c-format
 msgid "Bad status from load. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:428
+#: src/stored/btape.c:426
 #, c-format
 msgid "Loaded %s\n"
 msgstr ""
 
-#: src/stored/btape.c:437 src/stored/btape.c:777 src/stored/btape.c:819
-#: src/stored/btape.c:889 src/stored/btape.c:931 src/stored/btape.c:1200
+#: src/stored/btape.c:435 src/stored/btape.c:775 src/stored/btape.c:817
+#: src/stored/btape.c:887 src/stored/btape.c:929 src/stored/btape.c:1198
 #, c-format
 msgid "Bad status from rewind. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:440 src/stored/btape.c:1208
+#: src/stored/btape.c:438 src/stored/btape.c:1206
 #, c-format
 msgid "Rewound %s\n"
 msgstr ""
 
-#: src/stored/btape.c:467 src/stored/btape.c:1212
-#, c-format
+#: src/stored/btape.c:465 src/stored/btape.c:1210
+#, fuzzy, c-format
 msgid "Bad status from weof %d. ERR=%s\n"
-msgstr ""
+msgstr "Mauvaise réponse Ã  la commande Hello : ERR=%s\n"
 
-#: src/stored/btape.c:471
+#: src/stored/btape.c:469
 #, c-format
 msgid "Wrote 1 EOF to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:474
+#: src/stored/btape.c:472
 #, c-format
 msgid "Wrote %d EOFs to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:492
+#: src/stored/btape.c:490
 msgid "Moved to end of medium.\n"
 msgstr ""
 
-#: src/stored/btape.c:519
+#: src/stored/btape.c:517
 #, c-format
 msgid "Bad status from bsf. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:521
+#: src/stored/btape.c:519
 #, c-format
 msgid "Backspaced %d file%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:538
+#: src/stored/btape.c:536
 #, c-format
 msgid "Bad status from bsr. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:540
+#: src/stored/btape.c:538
 #, c-format
 msgid "Backspaced %d record%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:550 src/stored/status.c:220
+#: src/stored/btape.c:548 src/stored/status.c:227
 #, c-format
 msgid "Configured device capabilities:\n"
 msgstr ""
 
-#: src/stored/btape.c:568
+#: src/stored/btape.c:566
 #, c-format
 msgid "Device status:\n"
 msgstr ""
 
-#: src/stored/btape.c:582 src/stored/status.c:252
+#: src/stored/btape.c:580 src/stored/status.c:259
 #, c-format
 msgid "Device parameters:\n"
 msgstr ""
 
-#: src/stored/btape.c:587
+#: src/stored/btape.c:585
 #, c-format
 msgid "Status:\n"
-msgstr ""
+msgstr "Statut :\n"
 
-#: src/stored/btape.c:602
+#: src/stored/btape.c:600
 msgid ""
 "Test writting larger and larger records.\n"
 "This is a torture test for records.\n"
@@ -9660,20 +9926,20 @@ msgid ""
 "plus the header exceeds the block size (by default about 64K)\n"
 msgstr ""
 
-#: src/stored/btape.c:610 src/stored/btape.c:1814
+#: src/stored/btape.c:608 src/stored/btape.c:1815
 msgid "Command aborted.\n"
-msgstr ""
+msgstr "Commande annulée.\n"
 
-#: src/stored/btape.c:626
+#: src/stored/btape.c:624
 #, c-format
 msgid "Block %d i=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:652
+#: src/stored/btape.c:650
 msgid "Skipping read backwards test because BSR turned off.\n"
 msgstr ""
 
-#: src/stored/btape.c:656
+#: src/stored/btape.c:654
 msgid ""
 "\n"
 "=== Write, backup, and re-read test ===\n"
@@ -9687,73 +9953,73 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:669 src/stored/btape.c:680 src/stored/btape.c:691
-#: src/stored/btape.c:789 src/stored/btape.c:805 src/stored/btape.c:901
-#: src/stored/btape.c:917 src/stored/btape.c:1526 src/stored/btape.c:2400
+#: src/stored/btape.c:667 src/stored/btape.c:678 src/stored/btape.c:689
+#: src/stored/btape.c:787 src/stored/btape.c:803 src/stored/btape.c:899
+#: src/stored/btape.c:915 src/stored/btape.c:1524 src/stored/btape.c:2407
 msgid "Error writing record to block.\n"
 msgstr ""
 
-#: src/stored/btape.c:673 src/stored/btape.c:684 src/stored/btape.c:695
-#: src/stored/btape.c:793 src/stored/btape.c:809 src/stored/btape.c:905
-#: src/stored/btape.c:921 src/stored/btape.c:1530 src/stored/btape.c:2404
+#: src/stored/btape.c:671 src/stored/btape.c:682 src/stored/btape.c:693
+#: src/stored/btape.c:791 src/stored/btape.c:807 src/stored/btape.c:903
+#: src/stored/btape.c:919 src/stored/btape.c:1528 src/stored/btape.c:2411
 msgid "Error writing block to device.\n"
 msgstr ""
 
-#: src/stored/btape.c:676
+#: src/stored/btape.c:674
 #, c-format
 msgid "Wrote first record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:687
+#: src/stored/btape.c:685
 #, c-format
 msgid "Wrote second record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:698
+#: src/stored/btape.c:696
 #, c-format
 msgid "Wrote third record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:705 src/stored/btape.c:710
+#: src/stored/btape.c:703 src/stored/btape.c:708
 #, c-format
 msgid "Backspace file failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:714
+#: src/stored/btape.c:712
 msgid "Backspaced over EOF OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:716
+#: src/stored/btape.c:714
 #, c-format
 msgid "Backspace record failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:719
+#: src/stored/btape.c:717
 msgid "Backspace record OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:722 src/stored/btape.c:728
+#: src/stored/btape.c:720 src/stored/btape.c:726
 #, c-format
 msgid "Read block failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:733
+#: src/stored/btape.c:731
 msgid "Bad data in record. Test failed!\n"
 msgstr ""
 
-#: src/stored/btape.c:737
+#: src/stored/btape.c:735
 msgid ""
 "\n"
 "Block re-read correct. Test succeeded!\n"
 msgstr ""
 
-#: src/stored/btape.c:738
+#: src/stored/btape.c:736
 msgid ""
 "=== End Write, backup, and re-read test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:745
+#: src/stored/btape.c:743
 msgid ""
 "This is not terribly serious since Bacula only uses\n"
 "this function to verify the last block written to the\n"
@@ -9765,7 +10031,7 @@ msgid ""
 "to your Storage daemon's Device resource definition.\n"
 msgstr ""
 
-#: src/stored/btape.c:769
+#: src/stored/btape.c:767
 msgid ""
 "\n"
 "=== Write, rewind, and re-read test ===\n"
@@ -9778,46 +10044,46 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:797 src/stored/btape.c:813 src/stored/btape.c:909
-#: src/stored/btape.c:925
+#: src/stored/btape.c:795 src/stored/btape.c:811 src/stored/btape.c:907
+#: src/stored/btape.c:923
 #, c-format
 msgid "Wrote 1000 blocks of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:822 src/stored/btape.c:934
+#: src/stored/btape.c:820 src/stored/btape.c:932
 msgid "Rewind OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:829 src/stored/btape.c:983
+#: src/stored/btape.c:827 src/stored/btape.c:981
 msgid "Got EOF on tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:834
+#: src/stored/btape.c:832
 #, c-format
 msgid "Read block %d failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:840
+#: src/stored/btape.c:838
 #, c-format
 msgid "Read record failed. Block %d! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:846 src/stored/btape.c:1013
+#: src/stored/btape.c:844 src/stored/btape.c:1011
 #, c-format
 msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"
 msgstr ""
 
-#: src/stored/btape.c:853
+#: src/stored/btape.c:851
 msgid "1000 blocks re-read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:856 src/stored/btape.c:1020
+#: src/stored/btape.c:854 src/stored/btape.c:1018
 msgid ""
 "=== Test Succeeded. End Write, rewind, and re-read test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:881
+#: src/stored/btape.c:879
 msgid ""
 "\n"
 "=== Write, rewind, and position test ===\n"
@@ -9830,23 +10096,23 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:974
+#: src/stored/btape.c:972
 #, c-format
 msgid "Reposition to file:block %d:%d\n"
 msgstr ""
 
-#: src/stored/btape.c:976
+#: src/stored/btape.c:974
 msgid "Reposition error.\n"
 msgstr ""
 
-#: src/stored/btape.c:989
+#: src/stored/btape.c:987
 #, c-format
 msgid ""
 "Read block %d failed! file=%d blk=%d. ERR=%s\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:991
+#: src/stored/btape.c:989
 msgid ""
 "This may be because the tape drive block size is not\n"
 " set to variable blocking as normally used by Bacula.\n"
@@ -9860,17 +10126,17 @@ msgid ""
 " in your Device resource.\n"
 msgstr ""
 
-#: src/stored/btape.c:1007
+#: src/stored/btape.c:1005
 #, c-format
 msgid "Read record failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1018
+#: src/stored/btape.c:1016
 #, c-format
 msgid "Block %d re-read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:1039
+#: src/stored/btape.c:1037
 msgid ""
 "\n"
 "\n"
@@ -9884,58 +10150,58 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1063
+#: src/stored/btape.c:1061
 msgid "Now moving to end of medium.\n"
 msgstr ""
 
-#: src/stored/btape.c:1065 src/stored/btape.c:1295
+#: src/stored/btape.c:1063 src/stored/btape.c:1293
 #, c-format
 msgid "We should be in file 3. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1066 src/stored/btape.c:1084 src/stored/btape.c:1284
-#: src/stored/btape.c:1296 src/stored/btape.c:1309 src/stored/btape.c:1326
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
 msgid "This is correct!"
 msgstr ""
 
-#: src/stored/btape.c:1066 src/stored/btape.c:1084 src/stored/btape.c:1284
-#: src/stored/btape.c:1296 src/stored/btape.c:1309 src/stored/btape.c:1326
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
 msgid "This is NOT correct!!!!"
 msgstr ""
 
-#: src/stored/btape.c:1072
+#: src/stored/btape.c:1070
 msgid ""
 "\n"
 "Now the important part, I am going to attempt to append to the tape.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1079
+#: src/stored/btape.c:1077
 msgid ""
 "Done appending, there should be no I/O errors\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1080
+#: src/stored/btape.c:1078
 msgid "Doing Bacula scan of blocks:\n"
 msgstr ""
 
-#: src/stored/btape.c:1082
+#: src/stored/btape.c:1080
 msgid "End scanning the tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:1083 src/stored/btape.c:1308
+#: src/stored/btape.c:1081 src/stored/btape.c:1306
 #, c-format
 msgid "We should be in file 4. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1108
+#: src/stored/btape.c:1106
 msgid ""
 "\n"
 "Autochanger enabled, but no name or no command device specified.\n"
 msgstr ""
 
-#: src/stored/btape.c:1112
+#: src/stored/btape.c:1110
 msgid ""
 "\n"
 "Ah, I see you have an autochanger configured.\n"
@@ -9943,13 +10209,13 @@ msgid ""
 " that I can write on in Slot 1.\n"
 msgstr ""
 
-#: src/stored/btape.c:1115
+#: src/stored/btape.c:1113
 msgid ""
 "\n"
 "Do you wish to continue with the Autochanger test? (y/n): "
 msgstr ""
 
-#: src/stored/btape.c:1122
+#: src/stored/btape.c:1120
 msgid ""
 "\n"
 "\n"
@@ -9957,74 +10223,74 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1131
+#: src/stored/btape.c:1129
 msgid "3301 Issuing autochanger \"loaded\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1140
+#: src/stored/btape.c:1138
 #, c-format
 msgid "3991 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1141
+#: src/stored/btape.c:1139
 #, c-format
 msgid "3991 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1145
+#: src/stored/btape.c:1143
 #, c-format
 msgid "Slot %d loaded. I am going to unload it.\n"
 msgstr ""
 
-#: src/stored/btape.c:1147
+#: src/stored/btape.c:1145
 msgid "Nothing loaded in the drive. OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:1155
+#: src/stored/btape.c:1153
 #, c-format
 msgid "3302 Issuing autochanger \"unload %d %d\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1160
+#: src/stored/btape.c:1158
 #, c-format
 msgid "unload status=%s %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1160
+#: src/stored/btape.c:1158
 msgid "Bad"
 msgstr ""
 
-#: src/stored/btape.c:1163
+#: src/stored/btape.c:1161
 #, c-format
 msgid "3992 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1164
+#: src/stored/btape.c:1162
 #, c-format
 msgid "3992 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1174
+#: src/stored/btape.c:1172
 #, c-format
 msgid "3303 Issuing autochanger \"load %d %d\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1182
+#: src/stored/btape.c:1180
 #, c-format
 msgid "3303 Autochanger \"load %d %d\" status is OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:1186
+#: src/stored/btape.c:1184
 #, c-format
 msgid "3993 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1187
+#: src/stored/btape.c:1185
 #, c-format
 msgid "3993 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1202
+#: src/stored/btape.c:1200
 msgid ""
 "\n"
 "The test failed, probably because you need to put\n"
@@ -10032,12 +10298,12 @@ msgid ""
 "Adding a 30 second sleep and trying again ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1215
+#: src/stored/btape.c:1213
 #, c-format
 msgid "Wrote EOF to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1219
+#: src/stored/btape.c:1217
 #, c-format
 msgid ""
 "\n"
@@ -10049,18 +10315,18 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1224
+#: src/stored/btape.c:1222
 msgid ""
 "\n"
 "The test autochanger worked!!\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1235
+#: src/stored/btape.c:1233
 msgid "You must correct this error or the Autochanger will not work.\n"
 msgstr ""
 
-#: src/stored/btape.c:1253
+#: src/stored/btape.c:1251
 msgid ""
 "\n"
 "\n"
@@ -10072,30 +10338,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1278
+#: src/stored/btape.c:1276
 msgid "Now forward spacing 1 file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1280 src/stored/btape.c:1292 src/stored/btape.c:1305
-#: src/stored/btape.c:1323 src/stored/btape.c:1492
+#: src/stored/btape.c:1278 src/stored/btape.c:1290 src/stored/btape.c:1303
+#: src/stored/btape.c:1321 src/stored/btape.c:1490
 #, c-format
 msgid "Bad status from fsr. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1283
+#: src/stored/btape.c:1281
 #, c-format
 msgid "We should be in file 1. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1290
+#: src/stored/btape.c:1288
 msgid "Now forward spacing 2 files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1303
+#: src/stored/btape.c:1301
 msgid "Now forward spacing 4 files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1315
+#: src/stored/btape.c:1313
 msgid ""
 "The test worked this time. Please add:\n"
 "\n"
@@ -10104,35 +10370,35 @@ msgid ""
 "to your Device resource for this drive.\n"
 msgstr ""
 
-#: src/stored/btape.c:1321
+#: src/stored/btape.c:1319
 msgid "Now forward spacing 1 more file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1325
+#: src/stored/btape.c:1323
 #, c-format
 msgid "We should be in file 5. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1330
+#: src/stored/btape.c:1328
 msgid ""
 "\n"
 "=== End Forward space files test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1334
+#: src/stored/btape.c:1332
 msgid ""
 "\n"
 "The forward space file test failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1336
+#: src/stored/btape.c:1334
 msgid ""
 "You have Fast Forward Space File enabled.\n"
 "I am turning it off then retrying the test.\n"
 msgstr ""
 
-#: src/stored/btape.c:1342
+#: src/stored/btape.c:1340
 msgid ""
 "You must correct this error or Bacula will not work.\n"
 "Some systems, e.g. OpenBSD, require you to set\n"
@@ -10140,7 +10406,7 @@ msgid ""
 "in your device resource. Use with caution.\n"
 msgstr ""
 
-#: src/stored/btape.c:1374
+#: src/stored/btape.c:1372
 msgid ""
 "\n"
 "Append test failed. Attempting again.\n"
@@ -10150,7 +10416,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1382
+#: src/stored/btape.c:1380
 msgid ""
 "\n"
 "\n"
@@ -10162,14 +10428,14 @@ msgid ""
 "to your Device resource in the Storage conf file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1389
+#: src/stored/btape.c:1387
 msgid ""
 "\n"
 "\n"
 "That appears *NOT* to have corrected the problem.\n"
 msgstr ""
 
-#: src/stored/btape.c:1394
+#: src/stored/btape.c:1392
 msgid ""
 "\n"
 "\n"
@@ -10177,7 +10443,7 @@ msgid ""
 "Setting \"BSF at EOM = yes\" and retrying append test.\n"
 msgstr ""
 
-#: src/stored/btape.c:1399
+#: src/stored/btape.c:1397
 msgid ""
 "\n"
 "\n"
@@ -10190,7 +10456,7 @@ msgid ""
 "to your Device resource in the Storage conf file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1410
+#: src/stored/btape.c:1408
 msgid ""
 "\n"
 "Append test failed.\n"
@@ -10217,7 +10483,7 @@ msgid ""
 "in your device resource. Use with caution.\n"
 msgstr ""
 
-#: src/stored/btape.c:1431
+#: src/stored/btape.c:1429
 msgid ""
 "\n"
 "The above Bacula scan should have output identical to what follows.\n"
@@ -10241,116 +10507,116 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1470
+#: src/stored/btape.c:1468
 #, c-format
 msgid "Bad status from fsf. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1474
+#: src/stored/btape.c:1472
 msgid "Forward spaced 1 file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1477
+#: src/stored/btape.c:1475
 #, c-format
 msgid "Forward spaced %d files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1496
+#: src/stored/btape.c:1494
 msgid "Forward spaced 1 record.\n"
 msgstr ""
 
-#: src/stored/btape.c:1499
+#: src/stored/btape.c:1497
 #, c-format
 msgid "Forward spaced %d records.\n"
 msgstr ""
 
-#: src/stored/btape.c:1533
+#: src/stored/btape.c:1531
 #, c-format
 msgid "Wrote one record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:1535
+#: src/stored/btape.c:1533
 msgid "Wrote block to device.\n"
 msgstr ""
 
-#: src/stored/btape.c:1550
+#: src/stored/btape.c:1548
 msgid "Enter length to read: "
 msgstr ""
 
-#: src/stored/btape.c:1555
+#: src/stored/btape.c:1553
 msgid "Bad length entered, using default of 1024 bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:1564
+#: src/stored/btape.c:1562
 #, c-format
 msgid "Read of %d bytes gives stat=%d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1587 src/stored/btape.c:1636
+#: src/stored/btape.c:1585 src/stored/btape.c:1634
 #, c-format
 msgid "End of tape\n"
 msgstr ""
 
-#: src/stored/btape.c:1592
+#: src/stored/btape.c:1590
 #, c-format
 msgid "Starting scan at file %u\n"
 msgstr ""
 
-#: src/stored/btape.c:1597 src/stored/dev.c:1238
+#: src/stored/btape.c:1595 src/stored/dev.c:1229
 #, c-format
 msgid "read error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:1599
+#: src/stored/btape.c:1597
 #, c-format
 msgid "Bad status from read %d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1602 src/stored/btape.c:1616 src/stored/btape.c:1679
-#: src/stored/btape.c:1691 src/stored/btape.c:1704 src/stored/btape.c:1720
+#: src/stored/btape.c:1600 src/stored/btape.c:1614 src/stored/btape.c:1678
+#: src/stored/btape.c:1690 src/stored/btape.c:1703 src/stored/btape.c:1719
 #, c-format
 msgid "1 block of %d bytes in file %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1605 src/stored/btape.c:1619 src/stored/btape.c:1682
-#: src/stored/btape.c:1694 src/stored/btape.c:1707 src/stored/btape.c:1723
+#: src/stored/btape.c:1603 src/stored/btape.c:1617 src/stored/btape.c:1681
+#: src/stored/btape.c:1693 src/stored/btape.c:1706 src/stored/btape.c:1722
 #, c-format
 msgid "%d blocks of %d bytes in file %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1627 src/stored/btape.c:1698
+#: src/stored/btape.c:1625 src/stored/btape.c:1697
 #, c-format
 msgid "End of File mark.\n"
 msgstr ""
 
-#: src/stored/btape.c:1648 src/stored/btape.c:1751
+#: src/stored/btape.c:1646 src/stored/btape.c:1750
 #, c-format
 msgid "Total files=%d, blocks=%d, bytes = %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1711
+#: src/stored/btape.c:1710
 #, c-format
 msgid "Short block read.\n"
 msgstr ""
 
-#: src/stored/btape.c:1714
+#: src/stored/btape.c:1713
 #, c-format
 msgid "Error reading block. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1738
+#: src/stored/btape.c:1737
 #, c-format
 msgid ""
 "Blk_block: %u dev_blk=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
 "s rlen=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:1760
+#: src/stored/btape.c:1759
 #, c-format
 msgid "Device status: %u. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1788
+#: src/stored/btape.c:1789
 msgid ""
 "\n"
 "This command simulates Bacula writing to a tape.\n"
@@ -10375,95 +10641,98 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1805
+#: src/stored/btape.c:1806
 msgid ""
 "Do you want to run the simplified test (s) with one tape\n"
 "or the complete multiple tape (m) test: (s/m) "
 msgstr ""
 
-#: src/stored/btape.c:1808
+#: src/stored/btape.c:1809
 msgid "Simple test (single tape) selected.\n"
 msgstr ""
 
-#: src/stored/btape.c:1811
+#: src/stored/btape.c:1812
 msgid "Multiple tape test selected.\n"
 msgstr ""
 
-#: src/stored/btape.c:1827
+#: src/stored/btape.c:1828
 msgid "Rewind failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1830
+#: src/stored/btape.c:1831
 msgid "Write EOF failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1857
+#: src/stored/btape.c:1858
 msgid "Wrote Start of Session label.\n"
 msgstr ""
 
-#: src/stored/btape.c:1886
-msgid "Begin writing Bacula records to tape ...\n"
+#: src/stored/btape.c:1889
+#, c-format
+msgid "%s Begin writing Bacula records to tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1888
-msgid "Begin writing Bacula records to first tape ...\n"
+#: src/stored/btape.c:1891
+#, c-format
+msgid "%s Begin writing Bacula records to first tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1928
+#: src/stored/btape.c:1932
 #, c-format
 msgid "Wrote blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:1935
-msgid "Flush block, write EOF\n"
+#: src/stored/btape.c:1942
+#, c-format
+msgid "%s Flush block, write EOF\n"
 msgstr ""
 
-#: src/stored/btape.c:1946
+#: src/stored/btape.c:1953
 msgid "Not OK\n"
 msgstr ""
 
-#: src/stored/btape.c:1974
+#: src/stored/btape.c:1981
 msgid "Set ok=false after write_block_to_device.\n"
 msgstr ""
 
-#: src/stored/btape.c:1977
+#: src/stored/btape.c:1984
 msgid "Wrote End of Session label.\n"
 msgstr ""
 
-#: src/stored/btape.c:2001
+#: src/stored/btape.c:2008
 #, c-format
 msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2005
+#: src/stored/btape.c:2012
 #, c-format
 msgid "Could not create state file: %s ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2010
+#: src/stored/btape.c:2020
 #, c-format
 msgid ""
 "\n"
 "\n"
-"Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
+"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2014
+#: src/stored/btape.c:2024
 #, c-format
 msgid ""
 "\n"
 "\n"
-"Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
+"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2053
+#: src/stored/btape.c:2063
 msgid ""
 "\n"
 "The state file level has changed. You must redo\n"
 "the fill command.\n"
 msgstr ""
 
-#: src/stored/btape.c:2059
+#: src/stored/btape.c:2069
 #, c-format
 msgid ""
 "\n"
@@ -10471,95 +10740,95 @@ msgid ""
 "You must redo the fill command.\n"
 msgstr ""
 
-#: src/stored/btape.c:2101
+#: src/stored/btape.c:2111
 msgid "Mount first tape. Press enter when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2125
-msgid "Reading the first 10000 records.\n"
+#: src/stored/btape.c:2131
+msgid "Rewinding.\n"
+msgstr ""
+
+#: src/stored/btape.c:2136
+#, c-format
+msgid "Reading the first 10000 records from %u:%u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2128 src/stored/btape.c:2195
+#: src/stored/btape.c:2140 src/stored/btape.c:2207
 #, c-format
 msgid "Reposition from %u:%u to %u:%u\n"
 msgstr ""
 
-#: src/stored/btape.c:2131 src/stored/btape.c:2182 src/stored/btape.c:2198
+#: src/stored/btape.c:2143 src/stored/btape.c:2194 src/stored/btape.c:2210
 #, c-format
 msgid "Reposition error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2134
+#: src/stored/btape.c:2146
 #, c-format
 msgid "Reading block %u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2136 src/stored/btape.c:2187 src/stored/btape.c:2203
+#: src/stored/btape.c:2148 src/stored/btape.c:2199 src/stored/btape.c:2215
 #, c-format
 msgid "Error reading block: ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2141
+#: src/stored/btape.c:2153
 msgid ""
 "\n"
 "The last block on the tape matches. Test succeeded.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2143
+#: src/stored/btape.c:2155
 msgid ""
 "\n"
 "The last block of the first tape matches.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2168
+#: src/stored/btape.c:2180
 msgid "Mount second tape. Press enter when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2180
+#: src/stored/btape.c:2192
 #, c-format
 msgid "Reposition from %u:%u to 0:1\n"
 msgstr ""
 
-#: src/stored/btape.c:2185 src/stored/btape.c:2201
+#: src/stored/btape.c:2197 src/stored/btape.c:2213
 #, c-format
 msgid "Reading block %d.\n"
 msgstr ""
 
-#: src/stored/btape.c:2191
+#: src/stored/btape.c:2203
 msgid ""
 "\n"
 "The first block on the second tape matches.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2207
+#: src/stored/btape.c:2219
 msgid ""
 "\n"
 "The last block on the second tape matches. Test succeeded.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2221
-#, c-format
-msgid "ERROR! device at %d:%d count=%d\n"
-msgstr ""
-
-#: src/stored/btape.c:2227
+#: src/stored/btape.c:2234
 #, c-format
-msgid "1000 records read now at %d:%d\n"
+msgid "10000 records read now at %d:%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2250 src/stored/btape.c:2261 src/stored/btape.c:2309
+#: src/stored/btape.c:2257 src/stored/btape.c:2268 src/stored/btape.c:2316
 msgid "Last block written"
 msgstr ""
 
-#: src/stored/btape.c:2252 src/stored/btape.c:2262
+#: src/stored/btape.c:2259 src/stored/btape.c:2269
 msgid "Block read back"
 msgstr ""
 
-#: src/stored/btape.c:2253
+#: src/stored/btape.c:2260
 #, c-format
 msgid ""
 "\n"
@@ -10567,7 +10836,7 @@ msgid ""
 "The blocks differ at byte %u\n"
 msgstr ""
 
-#: src/stored/btape.c:2254
+#: src/stored/btape.c:2261
 msgid ""
 "\n"
 "\n"
@@ -10577,177 +10846,177 @@ msgid ""
 "to write multi-tape Volumes.!!!!\n"
 msgstr ""
 
-#: src/stored/btape.c:2293
+#: src/stored/btape.c:2300
 #, c-format
 msgid "Last block at: %u:%u this_dev_block_num=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2307
+#: src/stored/btape.c:2314
 #, c-format
 msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n"
 msgstr ""
 
-#: src/stored/btape.c:2311
+#: src/stored/btape.c:2318
 msgid "Block not written"
 msgstr ""
 
-#: src/stored/btape.c:2326
+#: src/stored/btape.c:2333
 #, c-format
 msgid "End of tape %d:%d. VolumeCapacity=%s. Write rate = %.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:2376
+#: src/stored/btape.c:2383
 msgid "Test writing blocks of 64512 bytes to tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:2378
+#: src/stored/btape.c:2385
 msgid "How many blocks do you want to write? (1000): "
 msgstr ""
 
-#: src/stored/btape.c:2393
+#: src/stored/btape.c:2400
 #, c-format
 msgid "Begin writing %d Bacula blocks to tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2445
+#: src/stored/btape.c:2452
 #, c-format
 msgid "Begin writing raw blocks of %u bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:2465
+#: src/stored/btape.c:2472
 #, c-format
 msgid "Write failed at block %u. stat=%d ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2495
+#: src/stored/btape.c:2502
 #, c-format
 msgid "Begin writing Bacula blocks of %u bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:2514
+#: src/stored/btape.c:2521
 #, c-format
 msgid "Write failed at block %u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2521
+#: src/stored/btape.c:2528
 msgid "test autochanger"
 msgstr ""
 
-#: src/stored/btape.c:2522
+#: src/stored/btape.c:2529
 msgid "backspace file"
 msgstr ""
 
-#: src/stored/btape.c:2523
+#: src/stored/btape.c:2530
 msgid "backspace record"
 msgstr ""
 
-#: src/stored/btape.c:2524
+#: src/stored/btape.c:2531
 msgid "fill tape using Bacula writes"
 msgstr ""
 
-#: src/stored/btape.c:2525
+#: src/stored/btape.c:2532
 msgid "list device capabilities"
 msgstr ""
 
-#: src/stored/btape.c:2526
+#: src/stored/btape.c:2533
 msgid "clear tape errors"
 msgstr ""
 
-#: src/stored/btape.c:2527
+#: src/stored/btape.c:2534
 msgid "go to end of Bacula data for append"
 msgstr ""
 
-#: src/stored/btape.c:2528
+#: src/stored/btape.c:2535
 msgid "go to the physical end of medium"
 msgstr ""
 
-#: src/stored/btape.c:2529
+#: src/stored/btape.c:2536
 msgid "fill tape, write onto second volume"
 msgstr ""
 
-#: src/stored/btape.c:2530
+#: src/stored/btape.c:2537
 msgid "read filled tape"
 msgstr ""
 
-#: src/stored/btape.c:2531
+#: src/stored/btape.c:2538
 msgid "forward space a file"
 msgstr ""
 
-#: src/stored/btape.c:2532
+#: src/stored/btape.c:2539
 msgid "forward space a record"
 msgstr ""
 
-#: src/stored/btape.c:2534
+#: src/stored/btape.c:2541
 msgid "write a Bacula label to the tape"
 msgstr ""
 
-#: src/stored/btape.c:2535
+#: src/stored/btape.c:2542
 msgid "load a tape"
 msgstr ""
 
-#: src/stored/btape.c:2536
+#: src/stored/btape.c:2543
 msgid "quit btape"
 msgstr ""
 
-#: src/stored/btape.c:2537
+#: src/stored/btape.c:2544
 msgid "use write() to fill tape"
 msgstr ""
 
-#: src/stored/btape.c:2538
+#: src/stored/btape.c:2545
 msgid "read and print the Bacula tape label"
 msgstr ""
 
-#: src/stored/btape.c:2539
+#: src/stored/btape.c:2546
 msgid "test record handling functions"
 msgstr ""
 
-#: src/stored/btape.c:2540
+#: src/stored/btape.c:2547
 msgid "rewind the tape"
 msgstr ""
 
-#: src/stored/btape.c:2541
+#: src/stored/btape.c:2548
 msgid "read() tape block by block to EOT and report"
 msgstr ""
 
-#: src/stored/btape.c:2542
+#: src/stored/btape.c:2549
 msgid "Bacula read block by block to EOT and report"
 msgstr ""
 
-#: src/stored/btape.c:2543
+#: src/stored/btape.c:2550
 msgid "print tape status"
 msgstr ""
 
-#: src/stored/btape.c:2544
+#: src/stored/btape.c:2551
 msgid "General test Bacula tape functions"
 msgstr ""
 
-#: src/stored/btape.c:2545
+#: src/stored/btape.c:2552
 msgid "write an EOF on the tape"
 msgstr ""
 
-#: src/stored/btape.c:2546
+#: src/stored/btape.c:2553
 msgid "write a single Bacula block"
 msgstr ""
 
-#: src/stored/btape.c:2547
+#: src/stored/btape.c:2554
 msgid "read a single record"
 msgstr ""
 
-#: src/stored/btape.c:2548
+#: src/stored/btape.c:2555
 msgid "quick fill command"
 msgstr ""
 
-#: src/stored/btape.c:2569
+#: src/stored/btape.c:2576
 #, c-format
 msgid "%s is an illegal command\n"
 msgstr ""
 
-#: src/stored/btape.c:2579
+#: src/stored/btape.c:2586
 #, c-format
 msgid "Interactive commands:\n"
 msgstr ""
 
-#: src/stored/btape.c:2589
+#: src/stored/btape.c:2596
 #, c-format
 msgid ""
 "Copyright (C) 2000-2005 Kern Sibbald.\n"
@@ -10765,27 +11034,27 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2680
+#: src/stored/btape.c:2687
 #, c-format
 msgid "Mount second Volume on device %s and press return when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2707
+#: src/stored/btape.c:2714
 #, c-format
 msgid "Mount blank Volume on device %s and press return when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2725
+#: src/stored/btape.c:2732
 #, c-format
 msgid "End of Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/btape.c:2737
+#: src/stored/btape.c:2744
 #, c-format
 msgid "Read block=%u, VolBytes=%s rate=%.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:2752 src/stored/mount.c:493
+#: src/stored/btape.c:2759 src/stored/mount.c:501
 #, c-format
 msgid "Cannot open Dev=%s, Vol=%s\n"
 msgstr ""
@@ -10810,370 +11079,357 @@ msgstr ""
 msgid "cont,"
 msgstr ""
 
-#: src/stored/butil.c:128
+#: src/stored/butil.c:133
 msgid "Volume name or names is too long. Please use a .bsr file.\n"
 msgstr ""
 
-#: src/stored/butil.c:148
+#: src/stored/butil.c:153
 #, c-format
 msgid "Cannot find device \"%s\" in config file %s.\n"
 msgstr ""
 
-#: src/stored/butil.c:155
+#: src/stored/butil.c:160
 #, c-format
 msgid "Cannot init device %s\n"
 msgstr ""
 
-#: src/stored/butil.c:174
+#: src/stored/butil.c:181
 #, c-format
 msgid "Cannot open %s\n"
 msgstr ""
 
-#: src/stored/butil.c:253
+#: src/stored/butil.c:264
 #, c-format
 msgid "Could not find device \"%s\" in config file %s.\n"
 msgstr ""
 
-#: src/stored/butil.c:258
+#: src/stored/butil.c:269
 #, c-format
 msgid "Using device: \"%s\" for reading.\n"
 msgstr ""
 
-#: src/stored/butil.c:261
+#: src/stored/butil.c:272
 #, c-format
 msgid "Using device: \"%s\" for writing.\n"
 msgstr ""
 
-#: src/stored/butil.c:277
+#: src/stored/butil.c:288
 msgid "Unexpected End of Data\n"
 msgstr ""
 
-#: src/stored/butil.c:279
+#: src/stored/butil.c:290
 msgid "Unexpected End of Tape\n"
 msgstr ""
 
-#: src/stored/butil.c:281
+#: src/stored/butil.c:292
 msgid "Unexpected End of File\n"
 msgstr ""
 
-#: src/stored/butil.c:283
+#: src/stored/butil.c:294
 msgid "Tape Door is Open\n"
 msgstr ""
 
-#: src/stored/butil.c:285
+#: src/stored/butil.c:296
 msgid "Unexpected Tape is Off-line\n"
 msgstr ""
 
-#: src/stored/dev.c:110
+#: src/stored/dev.c:112
 #, c-format
 msgid "Unable to stat device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:125
+#: src/stored/dev.c:123
 #, c-format
 msgid ""
 "%s is an unknown device type. Must be tape or directory\n"
 " or have RequiresMount=yes for DVD. st_mode=%x\n"
 msgstr ""
 
-#: src/stored/dev.c:183
+#: src/stored/dev.c:179
 #, c-format
 msgid "Unable to stat mount point %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:188
+#: src/stored/dev.c:186
 msgid ""
 "Mount and unmount commands must defined for a device which requires mount.\n"
 msgstr ""
 
-#: src/stored/dev.c:191
+#: src/stored/dev.c:189
 msgid "Write part command must be defined for a device which requires mount.\n"
 msgstr ""
 
-#: src/stored/dev.c:197
+#: src/stored/dev.c:194
 #, c-format
 msgid "Block size %u on device %s is too large, using default %u\n"
 msgstr ""
 
-#: src/stored/dev.c:202
+#: src/stored/dev.c:199
 #, c-format
 msgid "Max block size %u not multiple of device %s block size.\n"
 msgstr ""
 
-#: src/stored/dev.c:218 src/stored/dev.c:224
+#: src/stored/dev.c:215 src/stored/dev.c:221
 #, c-format
 msgid "Unable to init cond variable: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:310
+#: src/stored/dev.c:312
 msgid "Illegal mode given to open dev.\n"
 msgstr ""
 
-#: src/stored/dev.c:376 src/stored/device.c:302
+#: src/stored/dev.c:355 src/stored/device.c:295
 #, c-format
 msgid "Unable to open device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:396
-#, c-format
-msgid "fcntl error. ERR=%s\n"
-msgstr ""
-
-#: src/stored/dev.c:434 src/stored/dev.c:493
+#: src/stored/dev.c:423 src/stored/dev.c:481
 #, c-format
 msgid "Could not open file device %s. No Volume name given.\n"
 msgstr ""
 
-#: src/stored/dev.c:459 src/stored/dev.c:573
+#: src/stored/dev.c:449 src/stored/dev.c:562
 #, c-format
 msgid "Could not open: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:518
+#: src/stored/dev.c:506
 #, c-format
 msgid ""
 "The media in the device %s is not empty, please blank it before writing "
 "anything to it.\n"
 msgstr ""
 
-#: src/stored/dev.c:534
+#: src/stored/dev.c:523
 #, c-format
 msgid "There is no valid media in the device %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:541
+#: src/stored/dev.c:530
 #, c-format
 msgid "Could not mount device %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:599
+#: src/stored/dev.c:588
 #, c-format
 msgid "Could not fstat: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:652
+#: src/stored/dev.c:631
 #, c-format
-msgid "Bad call to rewind_dev. Device %s not open\n"
+msgid "Bad call to rewind. Device %s not open\n"
 msgstr ""
 
-#: src/stored/dev.c:681
+#: src/stored/dev.c:677
 #, c-format
 msgid "Rewind error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:691 src/stored/dev.c:804 src/stored/dev.c:941
-#: src/stored/dev.c:1466
+#: src/stored/dev.c:687 src/stored/dev.c:802 src/stored/dev.c:938
+#: src/stored/dev.c:1457
 #, c-format
 msgid "lseek_dev error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:731
+#: src/stored/dev.c:727
 msgid "unknown blocked code"
 msgstr ""
 
-#: src/stored/dev.c:774
+#: src/stored/dev.c:772
 #, c-format
 msgid "Bad call to eod_dev. Device %s not open\n"
 msgstr ""
 
-#: src/stored/dev.c:840
+#: src/stored/dev.c:838
 #, c-format
 msgid "ioctl MTEOM error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:848 src/stored/dev.c:981
+#: src/stored/dev.c:846 src/stored/dev.c:978
 #, c-format
 msgid "ioctl MTIOCGET error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:927
+#: src/stored/dev.c:924
 msgid "Bad device call. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:940
+#: src/stored/dev.c:937
 #, c-format
 msgid "Seek error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:976
+#: src/stored/dev.c:973
 msgid " Bacula status:"
 msgstr ""
 
-#: src/stored/dev.c:977 src/stored/dev.c:1026 src/stored/dev.c:1028
+#: src/stored/dev.c:974 src/stored/dev.c:1023 src/stored/dev.c:1025
 #, c-format
 msgid " file=%d block=%d\n"
 msgstr ""
 
-#: src/stored/dev.c:985
+#: src/stored/dev.c:982
 msgid " Device status:"
 msgstr ""
 
-#: src/stored/dev.c:1050
+#: src/stored/dev.c:1047
 msgid "Bad call to load_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1061 src/stored/dev.c:1074
+#: src/stored/dev.c:1058 src/stored/dev.c:1071
 #, c-format
 msgid "ioctl MTLOAD error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1093
-msgid "Bad call to offline_dev. Device not open\n"
-msgstr ""
-
-#: src/stored/dev.c:1116
+#: src/stored/dev.c:1107
 #, c-format
 msgid "ioctl MTOFFL error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1157
+#: src/stored/dev.c:1148
 msgid "Bad call to fsf_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1167 src/stored/dev.c:1288
+#: src/stored/dev.c:1158 src/stored/dev.c:1279
 #, c-format
 msgid "Device %s at End of Tape.\n"
 msgstr ""
 
-#: src/stored/dev.c:1192 src/stored/dev.c:1268
+#: src/stored/dev.c:1183 src/stored/dev.c:1259
 #, c-format
 msgid "ioctl MTFSF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1317
+#: src/stored/dev.c:1308
 msgid "Bad call to bsf_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1323
+#: src/stored/dev.c:1314
 #, c-format
 msgid "Device %s cannot BSF because it is not a tape.\n"
 msgstr ""
 
-#: src/stored/dev.c:1338
+#: src/stored/dev.c:1329
 #, c-format
 msgid "ioctl MTBSF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1358
+#: src/stored/dev.c:1349
 msgid "Bad call to fsr. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1367
+#: src/stored/dev.c:1358
 #, c-format
 msgid "ioctl MTFSR not permitted on %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1395
+#: src/stored/dev.c:1386
 #, c-format
 msgid "ioctl MTFSR %d error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1415
+#: src/stored/dev.c:1406
 msgid "Bad call to bsr_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1425
+#: src/stored/dev.c:1416
 #, c-format
 msgid "ioctl MTBSR not permitted on %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1438
+#: src/stored/dev.c:1429
 #, c-format
 msgid "ioctl MTBSR error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1455
+#: src/stored/dev.c:1446
 msgid "Bad call to reposition_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1523
+#: src/stored/dev.c:1514
 msgid "Bad call to weof_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1533
+#: src/stored/dev.c:1524
 msgid "Attempt to WEOF on non-appendable Volume\n"
 msgstr ""
 
-#: src/stored/dev.c:1550
+#: src/stored/dev.c:1541
 #, c-format
 msgid "ioctl MTWEOF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1592
+#: src/stored/dev.c:1583
 msgid "Got ENOTTY on read/write!\n"
 msgstr ""
 
-#: src/stored/dev.c:1639
+#: src/stored/dev.c:1630
 #, c-format
 msgid "unknown func code %d"
 msgstr ""
 
-#: src/stored/dev.c:1645
+#: src/stored/dev.c:1636
 #, c-format
 msgid "I/O function \"%s\" not supported on this device.\n"
 msgstr ""
 
-#: src/stored/dev.c:1783 src/stored/dvd.c:668
+#: src/stored/dev.c:1761 src/stored/dvd.c:734
 #, c-format
 msgid "Unable to truncate device %s. ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:1822
+#: src/stored/dev.c:1800
 msgid "Bad call to term_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/device.c:105
+#: src/stored/device.c:100
 #, c-format
 msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n"
 msgstr ""
 
-#: src/stored/device.c:119
+#: src/stored/device.c:114
 #, c-format
 msgid "New volume \"%s\" mounted on device %s at %s.\n"
 msgstr ""
 
-#: src/stored/device.c:131
+#: src/stored/device.c:126
 #, c-format
 msgid "write_block_to_device Volume label failed. ERR=%s"
 msgstr ""
 
-#: src/stored/device.c:168
+#: src/stored/device.c:162
 #, c-format
 msgid "write_block_to_device overflow block failed. ERR=%s"
 msgstr ""
 
-#: src/stored/device.c:304
+#: src/stored/device.c:297
 #, c-format
 msgid "Unable to open archive %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:328
-msgid "Bad call to force_close_dev. Device not open\n"
-msgstr ""
-
-#: src/stored/device.c:346
+#: src/stored/device.c:332
 #, c-format
 msgid "Device write lock failure. ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:354
+#: src/stored/device.c:340
 #, c-format
 msgid "Device write unlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:373
+#: src/stored/device.c:359
 #, c-format
 msgid "pthread_cond_wait failure. ERR=%s\n"
 msgstr ""
 
 #: src/stored/dircmd.c:140
 msgid "Connection request failed.\n"
-msgstr ""
+msgstr "Demande de connexion Ã©chouée.\n"
 
 #: src/stored/dircmd.c:149
 #, c-format
 msgid "Invalid connection. Len=%d\n"
-msgstr ""
+msgstr "Connexion invalide. Len=%d\n"
 
 #: src/stored/dircmd.c:241
 #, c-format
@@ -11182,72 +11438,74 @@ msgstr ""
 
 #: src/stored/dircmd.c:262
 #, c-format
-msgid "3902 Job %s not found.\n"
-msgstr ""
+msgid "3904 Job %s not found.\n"
+msgstr "3904 Job %s non trouvé.\n"
 
-#: src/stored/dircmd.c:279
+#: src/stored/dircmd.c:283
 #, c-format
 msgid "3000 Job %s marked to be canceled.\n"
-msgstr ""
+msgstr "3000 Job %s marqué pour Ãªtre annulé.\n"
 
-#: src/stored/dircmd.c:283
+#: src/stored/dircmd.c:287
 msgid "3903 Error scanning cancel command.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:356 src/stored/dircmd.c:655 src/stored/dircmd.c:720
-#: src/stored/dircmd.c:779 src/stored/dircmd.c:829 src/stored/dircmd.c:869
+#: src/stored/dircmd.c:364 src/stored/dircmd.c:680 src/stored/dircmd.c:756
+#: src/stored/dircmd.c:819 src/stored/dircmd.c:874 src/stored/dircmd.c:918
 #, c-format
-msgid "3999 Device \"%s\" not found\n"
+msgid "3999 Device \"%s\" not found or could not be opened.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:361
+#: src/stored/dircmd.c:369
 #, c-format
 msgid "3903 Error scanning label command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:405
+#: src/stored/dircmd.c:412
 #, c-format
 msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n"
 msgstr ""
+"3920 Impossible de labéliser le Volume car il possède déjà le label : Â«Â %"
+"s »\n"
 
-#: src/stored/dircmd.c:411
+#: src/stored/dircmd.c:419
 msgid "3921 Wrong volume mounted.\n"
-msgstr ""
+msgstr "3921 Mauvais volume monté.\n"
 
-#: src/stored/dircmd.c:415
+#: src/stored/dircmd.c:423
 msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n"
-msgstr ""
+msgstr "3922 Impossible de re-labéliser un Volume ANSI/IBM.\n"
 
-#: src/stored/dircmd.c:423 src/stored/dircmd.c:432
+#: src/stored/dircmd.c:431 src/stored/dircmd.c:440
 #, c-format
 msgid "3912 Failed to label Volume: ERR=%s\n"
-msgstr ""
+msgstr "3912 Impossible de labéliser le Volume : ERR=%s\n"
 
-#: src/stored/dircmd.c:435
+#: src/stored/dircmd.c:443
 #, c-format
 msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n"
 msgstr ""
 
-#: src/stored/dircmd.c:468
+#: src/stored/dircmd.c:476
 #, c-format
 msgid "3001 Mounted Volume: %s\n"
-msgstr ""
+msgstr "3001 Volume monté : %s\n"
 
-#: src/stored/dircmd.c:472 src/stored/dircmd.c:905
+#: src/stored/dircmd.c:480 src/stored/dircmd.c:954
 #, c-format
 msgid ""
 "3902 Cannot mount Volume on Storage Device %s because:\n"
 "%s"
 msgstr ""
 
-#: src/stored/dircmd.c:495 src/stored/reserve.c:554
+#: src/stored/dircmd.c:508 src/stored/reserve.c:674
 #, c-format
 msgid ""
 "\n"
 "     Device \"%s\" requested by DIR could not be opened or does not exist.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:516 src/stored/reserve.c:550
+#: src/stored/dircmd.c:529 src/stored/reserve.c:670
 #, c-format
 msgid ""
 "\n"
@@ -11255,177 +11513,241 @@ msgid ""
 "does not exist.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:575 src/stored/dircmd.c:623
+#: src/stored/dircmd.c:593 src/stored/dircmd.c:646
 #, c-format
 msgid "3901 open device failed: ERR=%s\n"
-msgstr ""
+msgstr "3901 l'ouverture du device a Ã©choué : ERR=%s\n"
 
-#: src/stored/dircmd.c:590 src/stored/dircmd.c:614
+#: src/stored/dircmd.c:613 src/stored/dircmd.c:637
 #, c-format
 msgid "3001 Device %s is mounted with Volume \"%s\"\n"
-msgstr ""
+msgstr "3001 Le device %s est monté avec le Volume Â«Â %s »\n"
 
-#: src/stored/dircmd.c:593 src/stored/dircmd.c:617 src/stored/dircmd.c:632
+#: src/stored/dircmd.c:616 src/stored/dircmd.c:640 src/stored/dircmd.c:655
 #, c-format
 msgid ""
 "3905 Device %s open but no Bacula volume is mounted.\n"
 "If this is not a blank tape, try unmounting and remounting the Volume.\n"
 msgstr ""
+"3905 Le device %s est ouvert mais il n'y a pas de volume Bacula monté.\n"
+"Si ce n'est pas une cartouche vierge, essayer de la démonter puis de la "
+"remonter.\n"
 
-#: src/stored/dircmd.c:602
+#: src/stored/dircmd.c:625
 #, c-format
 msgid "3001 Device %s is doing acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:607 src/stored/dircmd.c:698
+#: src/stored/dircmd.c:630 src/stored/dircmd.c:730
 #, c-format
 msgid "3903 Device %s is being labeled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:629
+#: src/stored/dircmd.c:652
 #, c-format
 msgid "3001 Device %s is already mounted with Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:638
+#: src/stored/dircmd.c:661
 #, c-format
 msgid "3002 Device %s is mounted.\n"
-msgstr ""
+msgstr "3002 Le device %s est monté.\n"
 
-#: src/stored/dircmd.c:641
+#: src/stored/dircmd.c:664
 #, c-format
 msgid "3907 %s"
-msgstr ""
+msgstr "3907 %s"
 
-#: src/stored/dircmd.c:644
+#: src/stored/dircmd.c:667
 #, c-format
 msgid "3906 File device %s is always mounted.\n"
-msgstr ""
+msgstr "3906 Le device fichier %s est toujours monté.\n"
 
-#: src/stored/dircmd.c:650
+#: src/stored/dircmd.c:673
 #, c-format
 msgid "3905 Bizarre wait state %d\n"
 msgstr ""
 
-#: src/stored/dircmd.c:659
+#: src/stored/dircmd.c:684
 #, c-format
 msgid "3909 Error scanning mount command: %s\n"
-msgstr ""
+msgstr "3909 Erreur pendant la lecture de la commande de montage : %s\n"
 
-#: src/stored/dircmd.c:681
+#: src/stored/dircmd.c:711
 #, c-format
 msgid "3901 Device %s is already unmounted.\n"
-msgstr ""
+msgstr "3901 Le device %s est déjà démonté.\n"
 
-#: src/stored/dircmd.c:690
+#: src/stored/dircmd.c:722
 #, c-format
 msgid "3001 Device %s unmounted.\n"
-msgstr ""
+msgstr "3001 Le device %s est démonté.\n"
 
-#: src/stored/dircmd.c:694
+#: src/stored/dircmd.c:726
 #, c-format
 msgid "3902 Device %s is busy in acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:715
+#: src/stored/dircmd.c:749
 #, c-format
 msgid "3002 Device %s unmounted.\n"
-msgstr ""
+msgstr "3002 Le device %s est démonté.\n"
 
-#: src/stored/dircmd.c:725
+#: src/stored/dircmd.c:761
 #, c-format
 msgid "3907 Error scanning unmount command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:751
+#: src/stored/dircmd.c:789
 #, c-format
-msgid "3911 Device %s already released.\n"
+msgid "3921 Device %s already released.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:758
+#: src/stored/dircmd.c:796
 #, c-format
-msgid "3912 Device %s waiting for mount.\n"
+msgid "3922 Device %s waiting for mount.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:762
+#: src/stored/dircmd.c:800
 #, c-format
-msgid "3913 Device %s is busy in acquire.\n"
+msgid "3923 Device %s is busy in acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:766
+#: src/stored/dircmd.c:804
 #, c-format
 msgid "3914 Device %s is being labeled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:774
+#: src/stored/dircmd.c:812
 #, c-format
-msgid "3012 Device %s released.\n"
-msgstr ""
+msgid "3022 Device %s released.\n"
+msgstr "3022 Le device %s est libéré.\n"
 
-#: src/stored/dircmd.c:784
+#: src/stored/dircmd.c:824
 #, c-format
-msgid "3917 Error scanning release command: %s\n"
+msgid "3927 Error scanning release command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:817
+#: src/stored/dircmd.c:860
 #, c-format
 msgid "3995 Device %s is not an autochanger.\n"
-msgstr ""
+msgstr "3995 Le Device %s n'est pas un autochangeur.\n"
 
-#: src/stored/dircmd.c:833
+#: src/stored/dircmd.c:878
 #, c-format
-msgid "3908 Error scanning autocharger list/slots command: %s\n"
+msgid "3908 Error scanning autocharger drives/list/slots command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:873
+#: src/stored/dircmd.c:922
 #, c-format
 msgid "3909 Error scanning readlabel command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:901
+#: src/stored/dircmd.c:950
 #, c-format
 msgid "3001 Volume=%s Slot=%d\n"
-msgstr ""
+msgstr "3001 Volume=%s Slot=%d\n"
 
-#: src/stored/dircmd.c:930
+#: src/stored/dircmd.c:979
 #, c-format
 msgid "3910 Unable to open device %s: ERR=%s\n"
+msgstr "3910 Impossible d'ouvrir le device %s : ERR=%s\n"
+
+#: src/stored/dircmd.c:991
+#, c-format
+msgid "3931 Device %s is BLOCKED. user unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:940
+#: src/stored/dircmd.c:995
 #, c-format
-msgid "3911 Device %s is busy reading.\n"
+msgid ""
+"3932 Device %s is BLOCKED. user unmounted during wait for media/mount.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:943
+#: src/stored/dircmd.c:999
 #, c-format
-msgid "3912 Device %s is busy with %d writer(s).\n"
+msgid "3933 Device %s is BLOCKED waiting for media.\n"
 msgstr ""
 
-#: src/stored/fd_cmds.c:340
-msgid "Error parsing bootstrap file.\n"
+#: src/stored/dircmd.c:1003
+#, c-format
+msgid "3934 Device %s is being initialized.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1007
+#, c-format
+msgid "3935 Device %s is blocked labeling a Volume.\n"
+msgstr ""
+
+#: src/stored/dircmd.c:1011
+#, c-format
+msgid "3935 Device %s is blocked for unknown reason.\n"
 msgstr ""
 
-#: src/stored/job.c:79
+#: src/stored/dircmd.c:1016
 #, c-format
-msgid "Bad Job Command from Director: %s\n"
+msgid "3936 Device %s is busy reading.\n"
 msgstr ""
 
-#: src/stored/job.c:189
+#: src/stored/dircmd.c:1019
+#, c-format
+msgid "3937 Device %s is busy with %d writer(s).\n"
+msgstr ""
+
+#: src/stored/dvd.c:153
+#, c-format
+msgid "Device %s cannot be mounted. ERR=%s\n"
+msgstr ""
+
+#: src/stored/dvd.c:271
+#, c-format
+msgid "Cannot run free space command (%s)\n"
+msgstr ""
+
+#: src/stored/dvd.c:374
+#, c-format
+msgid "Error while writing current part to the DVD: %s"
+msgstr ""
+
+#: src/stored/dvd.c:394
+#, c-format
+msgid "Remaining free space %s on %s\n"
+msgstr ""
+
+#: src/stored/dvd.c:464
+#, c-format
+msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
+msgstr ""
+
+#: src/stored/dvd.c:481
+#, c-format
+msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
+msgstr ""
+
+#: src/stored/dvd.c:700
+#, c-format
+msgid "Unable to write part %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/fd_cmds.c:340
+msgid "Error parsing bootstrap file.\n"
+msgstr ""
+
+#: src/stored/job.c:191
 #, c-format
 msgid "Job name not found: %s\n"
 msgstr ""
 
-#: src/stored/job.c:200
+#: src/stored/job.c:202
 #, c-format
 msgid "Hey!!!! JobId %u Job %s already authenticated.\n"
 msgstr ""
 
-#: src/stored/job.c:211
+#: src/stored/job.c:213
 msgid "Unable to authenticate File daemon\n"
 msgstr ""
 
-#: src/stored/job.c:338
+#: src/stored/job.c:334
 msgid "In free_jcr(), but still attached to device!!!!\n"
 msgstr ""
 
@@ -11483,52 +11805,52 @@ msgstr ""
 msgid "Cannot write Volume label to block for device %s\n"
 msgstr ""
 
-#: src/stored/label.c:393
+#: src/stored/label.c:400
 #, c-format
 msgid "Rewind error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:398
+#: src/stored/label.c:405
 #, c-format
 msgid "Truncate error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:420
+#: src/stored/label.c:427
 #, c-format
 msgid "Unable to write device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:448
+#: src/stored/label.c:455
 #, c-format
 msgid "Recycled volume \"%s\" on device %s, all previous data lost.\n"
 msgstr ""
 
-#: src/stored/label.c:451
+#: src/stored/label.c:458
 #, c-format
 msgid "Wrote label to prelabeled Volume \"%s\" on device %s\n"
 msgstr ""
 
-#: src/stored/label.c:648
+#: src/stored/label.c:657
 #, c-format
 msgid "Bad session label = %d\n"
 msgstr ""
 
-#: src/stored/label.c:666 src/stored/label.c:673
+#: src/stored/label.c:675 src/stored/label.c:682
 #, c-format
 msgid "Error writing Session label to %s: %s\n"
 msgstr ""
 
-#: src/stored/label.c:707
+#: src/stored/label.c:717
 #, c-format
 msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n"
 msgstr ""
 
-#: src/stored/label.c:834
+#: src/stored/label.c:844
 #, c-format
 msgid "Unknown %d"
 msgstr ""
 
-#: src/stored/label.c:838
+#: src/stored/label.c:848
 #, c-format
 msgid ""
 "\n"
@@ -11545,17 +11867,17 @@ msgid ""
 "HostName          : %s\n"
 msgstr ""
 
-#: src/stored/label.c:860
+#: src/stored/label.c:870
 #, c-format
 msgid "Date label written: %s\n"
 msgstr ""
 
-#: src/stored/label.c:866
+#: src/stored/label.c:876
 #, c-format
 msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n"
 msgstr ""
 
-#: src/stored/label.c:886
+#: src/stored/label.c:896
 #, c-format
 msgid ""
 "\n"
@@ -11568,7 +11890,7 @@ msgid ""
 "ClientName        : %s\n"
 msgstr ""
 
-#: src/stored/label.c:899
+#: src/stored/label.c:909
 #, c-format
 msgid ""
 "Job (unique name) : %s\n"
@@ -11577,7 +11899,7 @@ msgid ""
 "JobLevel          : %c\n"
 msgstr ""
 
-#: src/stored/label.c:908
+#: src/stored/label.c:918
 #, c-format
 msgid ""
 "JobFiles          : %s\n"
@@ -11590,118 +11912,132 @@ msgid ""
 "JobStatus         : %c\n"
 msgstr ""
 
-#: src/stored/label.c:929
+#: src/stored/label.c:939
 #, c-format
 msgid "Date written      : %s\n"
 msgstr ""
 
-#: src/stored/label.c:934
+#: src/stored/label.c:944
 #, c-format
 msgid "Date written      : %04d-%02d-%02d at %02d:%02d\n"
 msgstr ""
 
-#: src/stored/label.c:953
+#: src/stored/label.c:963
 msgid "Fresh Volume"
 msgstr ""
 
-#: src/stored/label.c:956
+#: src/stored/label.c:966
 msgid "Volume"
 msgstr ""
 
-#: src/stored/label.c:965 src/stored/read_record.c:335
+#: src/stored/label.c:975 src/stored/read_record.c:336
 msgid "End of Media"
 msgstr ""
 
-#: src/stored/label.c:968
+#: src/stored/label.c:978
 msgid "End of Tape"
 msgstr ""
 
-#: src/stored/label.c:988 src/stored/label.c:996 src/stored/label.c:1029
+#: src/stored/label.c:998 src/stored/label.c:1006 src/stored/label.c:1039
 #, c-format
 msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n"
 msgstr ""
 
-#: src/stored/label.c:993
+#: src/stored/label.c:1003
 msgid "End of physical tape.\n"
 msgstr ""
 
-#: src/stored/label.c:1008 src/stored/label.c:1017
+#: src/stored/label.c:1018 src/stored/label.c:1027
 #, c-format
 msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n"
 msgstr ""
 
-#: src/stored/label.c:1010
+#: src/stored/label.c:1020
 #, c-format
 msgid "   Job=%s Date=%s Level=%c Type=%c\n"
 msgstr ""
 
-#: src/stored/label.c:1019
+#: src/stored/label.c:1029
 #, c-format
 msgid "   Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n"
 msgstr ""
 
-#: src/stored/mount.c:197 src/stored/mount.c:294
+#: src/stored/mount.c:198 src/stored/mount.c:296
 #, c-format
 msgid "Volume \"%s\" not on device %s.\n"
-msgstr ""
+msgstr "Le volume Â«Â %s » n'est pas dans le device %s.\n"
 
-#: src/stored/mount.c:230
+#: src/stored/mount.c:225
 #, c-format
 msgid ""
-"Director wanted Volume \"%s\".\n"
+"Director wanted Volume \"%s\" for device %s.\n"
 "    Current Volume \"%s\" not acceptable because:\n"
 "    %s"
 msgstr ""
 
-#: src/stored/mount.c:284
+#: src/stored/mount.c:286
 #, c-format
 msgid "Labeled new Volume \"%s\" on device %s.\n"
 msgstr ""
 
-#: src/stored/mount.c:289
+#: src/stored/mount.c:291
 #, c-format
 msgid "Warning device %s not configured to autolabel Volumes.\n"
 msgstr ""
 
-#: src/stored/mount.c:340
+#: src/stored/mount.c:343
 #, c-format
 msgid "Volume \"%s\" previously written, moving to end of data.\n"
 msgstr ""
 
-#: src/stored/mount.c:343
+#: src/stored/mount.c:346
 #, c-format
 msgid "Unable to position to end of data on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/mount.c:355
+#: src/stored/mount.c:358
 #, c-format
 msgid "Ready to append to end of Volume \"%s\" at file=%d.\n"
 msgstr ""
 
-#: src/stored/mount.c:358
+#: src/stored/mount.c:361
 #, c-format
 msgid ""
 "I cannot write on Volume \"%s\" because:\n"
 "The number of files mismatch! Volume=%u Catalog=%u\n"
 msgstr ""
 
-#: src/stored/mount.c:411
+#: src/stored/mount.c:389
+#, c-format
+msgid "Ready to append to end of Volume \"%s\" at file address=%u.\n"
+msgstr ""
+
+#: src/stored/mount.c:393
+#, c-format
+msgid ""
+"I cannot write on Volume \"%s\" because:\n"
+"The EOD file address is wrong: Volume file address=%u != Catalog Endblock=%u"
+"(+1)\n"
+"You probably removed DVD last part in spool directory.\n"
+msgstr ""
+
+#: src/stored/mount.c:419
 #, c-format
 msgid "Marking Volume \"%s\" in Error in Catalog.\n"
 msgstr ""
 
-#: src/stored/mount.c:427
+#: src/stored/mount.c:435
 #, c-format
 msgid ""
 "Autochanger Volume \"%s\" not found in slot %d.\n"
 "    Setting InChanger to zero in catalog.\n"
 msgstr ""
 
-#: src/stored/mount.c:446
+#: src/stored/mount.c:454
 msgid "Hey!!!!! WroteVol non-zero !!!!!\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:104 src/stored/parse_bsr.c:108
+#: src/stored/parse_bsr.c:106 src/stored/parse_bsr.c:110
 #, c-format
 msgid ""
 "Bootstrap file error: %s\n"
@@ -11709,128 +12045,161 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:130
+#: src/stored/parse_bsr.c:132
 #, c-format
 msgid "Cannot open bootstrap file %s: %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:260
+#: src/stored/parse_bsr.c:262
 #, c-format
 msgid "MediaType %s in bsr at inappropriate place.\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:416
+#: src/stored/parse_bsr.c:283
+#, c-format
+msgid "Device \"%s\" in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:440
 msgid "JobType not yet implemented\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:424
+#: src/stored/parse_bsr.c:448
 msgid "JobLevel not yet implemented\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:626
+#: src/stored/parse_bsr.c:631
+#, c-format
+msgid "Slot %d in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:655
 #, c-format
 msgid "VolFile     : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:634
+#: src/stored/parse_bsr.c:663
 #, c-format
 msgid "VolBlock    : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:644
+#: src/stored/parse_bsr.c:673
 #, c-format
 msgid "FileIndex   : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:646
+#: src/stored/parse_bsr.c:675
 #, c-format
 msgid "FileIndex   : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:656
+#: src/stored/parse_bsr.c:685
 #, c-format
 msgid "JobId       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:658
+#: src/stored/parse_bsr.c:687
 #, c-format
 msgid "JobId       : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:668
+#: src/stored/parse_bsr.c:697
 #, c-format
 msgid "SessId      : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:670
+#: src/stored/parse_bsr.c:699
 #, c-format
 msgid "SessId      : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:679
+#: src/stored/parse_bsr.c:708
 #, c-format
 msgid "VolumeName  : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:688
+#: src/stored/parse_bsr.c:709
+#, c-format
+msgid "  MediaType : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:710
+#, c-format
+msgid "  Device    : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:711
+#, c-format
+msgid "  Slot      : %d\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:720
 #, c-format
 msgid "Client      : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:696
+#: src/stored/parse_bsr.c:728
 #, c-format
 msgid "Job          : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:704
+#: src/stored/parse_bsr.c:736
 #, c-format
 msgid "SessTime    : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:718
+#: src/stored/parse_bsr.c:750
 msgid "BSR is NULL\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:722
+#: src/stored/parse_bsr.c:754
 #, c-format
 msgid "Next        : 0x%x\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:723
+#: src/stored/parse_bsr.c:755
 #, c-format
 msgid "Root bsr    : 0x%x\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:734
-#, c-format
-msgid "Slot        : %u\n"
-msgstr ""
-
-#: src/stored/parse_bsr.c:737
+#: src/stored/parse_bsr.c:766
 #, c-format
 msgid "count       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:738
+#: src/stored/parse_bsr.c:767
 #, c-format
 msgid "found       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:741
+#: src/stored/parse_bsr.c:770
 #, c-format
 msgid "done        : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:742
+#: src/stored/parse_bsr.c:771
 #, c-format
 msgid "positioning : %d\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:743
+#: src/stored/parse_bsr.c:772
 #, c-format
 msgid "fast_reject : %d\n"
 msgstr ""
 
+#: src/stored/pythonsd.c:197
+msgid "Error in ParseTuple\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:213
+msgid "Parse tuple error in job_write\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:250
+#, c-format
+msgid "Error in Python method %s\n"
+msgstr ""
+
 #: src/stored/read.c:55
 msgid "No Volume names found for restore.\n"
 msgstr ""
@@ -11861,45 +12230,127 @@ msgstr ""
 
 #: src/stored/read_record.c:105
 #, c-format
-msgid "Got EOF at file %u  on device %s, Volume \"%s\"\n"
+msgid "End of file %u  on device %s, Volume \"%s\"\n"
 msgstr ""
 
 #: src/stored/read_record.c:119
 msgid "Did fsr\n"
 msgstr ""
 
-#: src/stored/read_record.c:275
+#: src/stored/read_record.c:276
 #, c-format
 msgid "Reposition from (file:block) %u:%u to %u:%u\n"
 msgstr ""
 
-#: src/stored/read_record.c:302
+#: src/stored/read_record.c:303
 #, c-format
 msgid "Forward spacing to file:block %u:%u.\n"
 msgstr ""
 
-#: src/stored/read_record.c:328
+#: src/stored/read_record.c:329
 msgid "Begin Session"
 msgstr ""
 
-#: src/stored/read_record.c:332
+#: src/stored/read_record.c:333
 msgid "End Session"
 msgstr ""
 
-#: src/stored/read_record.c:338
+#: src/stored/read_record.c:339
 #, c-format
 msgid "Unknown code %d\n"
 msgstr ""
 
-#: src/stored/record.c:61
+#: src/stored/record.c:60
 #, c-format
 msgid "unknown: %d"
 msgstr ""
 
-#: src/stored/record.c:332
+#: src/stored/record.c:343
 msgid "Damaged buffer\n"
 msgstr ""
 
+#: src/stored/reserve.c:75
+#, fuzzy, c-format
+msgid "Unable to initialize reservation lock. ERR=%s\n"
+msgstr "Impossible d'initialiser le thread OpenSSL : ERR=%s\n"
+
+#: src/stored/reserve.c:496 src/stored/reserve.c:507
+#, c-format
+msgid "Failed command: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:497
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
+"Device resources.\n"
+msgstr ""
+
+#: src/stored/reserve.c:687
+#, c-format
+msgid "3926 Could not get dcr for device: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:752
+#, c-format
+msgid "3601 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:761
+#, c-format
+msgid "3602 JobId=%u device %s is busy (already reading/writing).\n"
+msgstr ""
+
+#: src/stored/reserve.c:808
+#, c-format
+msgid "3603 JobId=%u device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/reserve.c:817
+#, c-format
+msgid "3604 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:883
+#, c-format
+msgid "3605 JobId=%u wants free drive but device %s is busy.\n"
+msgstr ""
+
+#: src/stored/reserve.c:891
+#, c-format
+msgid "3606 JobId=%u wants mounted, but drive %s has no Volume.\n"
+msgstr ""
+
+#: src/stored/reserve.c:901
+#, c-format
+msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:937
+#, c-format
+msgid "3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:980
+#, c-format
+msgid "3609 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:988 src/stored/reserve.c:992
+msgid "Logic error!!!! Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:989
+#, c-format
+msgid "3910 JobId=%u Logic error!!!! drive %s Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:995
+#, c-format
+msgid "3911 JobId=%u failed reserve drive %s.\n"
+msgstr ""
+
 #: src/stored/spool.c:69
 #, c-format
 msgid ""
@@ -11927,256 +12378,272 @@ msgstr ""
 
 #: src/stored/spool.c:199
 #, c-format
-msgid "Committing spooled data to Volume. Despooling %s bytes ...\n"
+msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:203
+#: src/stored/spool.c:204
 #, c-format
 msgid "Writing spooled data to Volume. Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:257 src/stored/spool.c:431 src/stored/spool.c:469
+#: src/stored/spool.c:258 src/stored/spool.c:432 src/stored/spool.c:470
 #, c-format
 msgid "Ftruncate spool file failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:259
+#: src/stored/spool.c:260
 #, c-format
 msgid "Bad return from ftruncate. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:308
+#: src/stored/spool.c:309
 #, c-format
 msgid "Spool header read error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:311
+#: src/stored/spool.c:312
 #, c-format
 msgid "Spool read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:312
+#: src/stored/spool.c:313
 #, c-format
 msgid "Spool header read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:318 src/stored/spool.c:319
+#: src/stored/spool.c:319 src/stored/spool.c:320
 #, c-format
 msgid "Spool block too big. Max %u bytes, got %u\n"
 msgstr ""
 
-#: src/stored/spool.c:324 src/stored/spool.c:325
+#: src/stored/spool.c:325 src/stored/spool.c:326
 #, c-format
 msgid "Spool data read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:382
+#: src/stored/spool.c:383
 msgid "User specified spool size reached.\n"
 msgstr ""
 
-#: src/stored/spool.c:384
+#: src/stored/spool.c:385
 msgid "Bad return from despool in write_block.\n"
 msgstr ""
 
-#: src/stored/spool.c:392
+#: src/stored/spool.c:393
 msgid "Spooling data again ...\n"
 msgstr ""
 
-#: src/stored/spool.c:423
+#: src/stored/spool.c:424
 #, c-format
 msgid "Error writing header to spool file. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:437 src/stored/spool.c:475
+#: src/stored/spool.c:438 src/stored/spool.c:476
 msgid "Fatal despooling error."
 msgstr ""
 
-#: src/stored/spool.c:444
+#: src/stored/spool.c:445
 msgid "Retrying after header spooling error failed.\n"
 msgstr ""
 
-#: src/stored/spool.c:458
+#: src/stored/spool.c:459
 #, c-format
 msgid "Error writing data to spool file. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:485
+#: src/stored/spool.c:486
 msgid "Retrying after data spooling error failed.\n"
 msgstr ""
 
-#: src/stored/spool.c:540 src/stored/spool.c:547
+#: src/stored/spool.c:541 src/stored/spool.c:548
 #, c-format
 msgid "Fseek on attributes file failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:557
+#: src/stored/spool.c:558
 #, c-format
 msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:584
+#: src/stored/spool.c:585
 #, c-format
 msgid "fopen attr spool file %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/status.c:66
+#: src/stored/status.c:67
 #, c-format
 msgid ""
 "\n"
 "%s Version: %s (%s) %s %s %s\n"
 msgstr ""
 
-#: src/stored/status.c:97
+#: src/stored/status.c:103
 msgid ""
 "\n"
 "Device status:\n"
 msgstr ""
 
-#: src/stored/status.c:99
+#: src/stored/status.c:105
 #, c-format
 msgid "Autochanger \"%s\" with devices:\n"
 msgstr ""
 
-#: src/stored/status.c:113
+#: src/stored/status.c:119
 #, c-format
-msgid "Device %s is mounted with Volume \"%s\"\n"
+msgid "Device %s is mounted with Volume=\"%s\" Pool=\"%s\"\n"
 msgstr ""
 
-#: src/stored/status.c:116
+#: src/stored/status.c:123
 #, c-format
 msgid "Device %s open but no Bacula volume is mounted.\n"
 msgstr ""
 
-#: src/stored/status.c:126
+#: src/stored/status.c:133
 #, c-format
 msgid "    Total Bytes=%s Blocks=%s Bytes/block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:140
+#: src/stored/status.c:147
 #, c-format
 msgid "    Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:145
+#: src/stored/status.c:152
 #, c-format
 msgid "    Positioned at File=%s Block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:151
-#, c-format
+#: src/stored/status.c:158
+#, fuzzy, c-format
 msgid "Device %s is not open or does not exist.\n"
-msgstr ""
+msgstr "3995 Le Device %s n'est pas un autochangeur.\n"
 
-#: src/stored/status.c:153
+#: src/stored/status.c:160
 #, c-format
 msgid "Device \"%s\" is not open or does not exist.\n"
 msgstr ""
 
-#: src/stored/status.c:158 src/stored/status.c:165 src/stored/status.c:168
+#: src/stored/status.c:165 src/stored/status.c:168 src/stored/status.c:172
+#: src/stored/status.c:174
 msgid ""
 "====\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:159
-msgid "Volume status:\n"
+#: src/stored/status.c:166
+msgid "In Use Volume status:\n"
 msgstr ""
 
-#: src/stored/status.c:183
+#: src/stored/status.c:190
 msgid ""
 "No DEVICE structure.\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:188
+#: src/stored/status.c:195
 msgid "    Device is BLOCKED. User unmounted.\n"
 msgstr ""
 
-#: src/stored/status.c:191
+#: src/stored/status.c:198
 msgid "    Device is BLOCKED. User unmounted during wait for media/mount.\n"
 msgstr ""
 
-#: src/stored/status.c:195
+#: src/stored/status.c:202
 #, c-format
 msgid "    Device is BLOCKED waiting for mount of volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/status.c:198
+#: src/stored/status.c:205
 msgid "    Device is BLOCKED waiting for media.\n"
 msgstr ""
 
-#: src/stored/status.c:202
+#: src/stored/status.c:209
 msgid "    Device is being initialized.\n"
 msgstr ""
 
-#: src/stored/status.c:205
+#: src/stored/status.c:212
 msgid "    Device is blocked labeling a Volume.\n"
 msgstr ""
 
-#: src/stored/status.c:213
+#: src/stored/status.c:220
 #, c-format
 msgid "    Slot %d is loaded in drive %d.\n"
 msgstr ""
 
-#: src/stored/status.c:216
+#: src/stored/status.c:223
 #, c-format
 msgid "    Drive %d is not loaded.\n"
 msgstr ""
 
-#: src/stored/status.c:235
+#: src/stored/status.c:242
 msgid "Device state:\n"
 msgstr ""
 
-#: src/stored/status.c:249
+#: src/stored/status.c:256
 #, c-format
 msgid ""
 "num_writers=%d JobStatus=%c block=%d\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:253
+#: src/stored/status.c:260
 #, c-format
 msgid "Archive name: %s Device name: %s\n"
 msgstr ""
 
-#: src/stored/status.c:255
+#: src/stored/status.c:262
 #, c-format
 msgid "File=%u block=%u\n"
 msgstr ""
 
-#: src/stored/status.c:256
+#: src/stored/status.c:263
 #, c-format
 msgid "Min block=%u Max block=%u\n"
 msgstr ""
 
-#: src/stored/status.c:272
+#: src/stored/status.c:280
 #, c-format
 msgid "%s Job %s waiting for Client connection.\n"
 msgstr ""
 
-#: src/stored/status.c:284
+#: src/stored/status.c:295
+#, c-format
+msgid ""
+"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:307
 #, c-format
-msgid "%s %s job %s JobId=%d Volume=\"%s\" device=\"%s\"\n"
+msgid ""
+"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
 msgstr ""
 
-#: src/stored/status.c:303
+#: src/stored/status.c:330
 #, c-format
 msgid "    FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n"
 msgstr ""
 
-#: src/stored/status.c:308
+#: src/stored/status.c:335
 msgid "    FDSocket closed\n"
 msgstr ""
 
-#: src/stored/status.c:335
+#: src/stored/status.c:352
+msgid ""
+"\n"
+"Jobs waiting to reserve a drive:\n"
+msgstr ""
+
+#: src/stored/status.c:380
 msgid " JobId  Level   Files          Bytes Status   Finished        Name \n"
 msgstr ""
 
-#: src/stored/status.c:469
+#: src/stored/status.c:514
 msgid "3900 Bad .status command, missing argument.\n"
 msgstr ""
 
-#: src/stored/status.c:494
+#: src/stored/status.c:537
 msgid "3900 Bad .status command, wrong argument.\n"
 msgstr ""
 
@@ -12201,46 +12668,46 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/stored.c:220
+#: src/stored/stored.c:222
 msgid "Volume Session Time is ZERO!\n"
 msgstr ""
 
-#: src/stored/stored.c:233
+#: src/stored/stored.c:235
 #, c-format
 msgid "Unable to create thread. ERR=%s\n"
 msgstr ""
 
-#: src/stored/stored.c:272
+#: src/stored/stored.c:273
 #, c-format
 msgid "Only one Storage resource permitted in %s\n"
 msgstr ""
 
-#: src/stored/stored.c:277
+#: src/stored/stored.c:278
 #, c-format
 msgid "No Director resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:282
+#: src/stored/stored.c:283
 #, c-format
 msgid "No Device resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:290
+#: src/stored/stored.c:291
 #, c-format
 msgid "No Messages resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:317
+#: src/stored/stored.c:318
 #, c-format
 msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/stored/stored.c:323
+#: src/stored/stored.c:324
 #, c-format
 msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/stored/stored.c:329
+#: src/stored/stored.c:330
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
@@ -12248,238 +12715,75 @@ msgid ""
 "using \"TLS Verify Peer\".\n"
 msgstr ""
 
-#: src/stored/stored.c:417
-#, c-format
-msgid "No Changer Name given for device %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:423
-#, c-format
-msgid "No Changer Command given for device %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:435
-#, c-format
-msgid ""
-"Media Type not the same for all devices in changer %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:496
+#: src/stored/stored.c:457
 #, c-format
 msgid "Could not initialize %s\n"
 msgstr ""
 
-#: src/stored/stored.c:509
+#: src/stored/stored.c:470
 #, c-format
 msgid "Could not open device %s\n"
 msgstr ""
 
-#: src/stored/stored.c:521
+#: src/stored/stored.c:483
 #, c-format
 msgid "Could not mount device %s\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:188
+#: src/stored/stored_conf.c:216
+#, c-format
+msgid "Expected a Device Type keyword, got: %s"
+msgstr ""
+
+#: src/stored/stored_conf.c:231
 #, c-format
 msgid "Warning: no \"%s\" resource (%d) defined.\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:191
+#: src/stored/stored_conf.c:234
 #, c-format
 msgid "dump_resource type=%d\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:307
+#: src/stored/stored_conf.c:350
 #, c-format
 msgid "Warning: unknown resource type %d\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:496
+#: src/stored/stored_conf.c:539
 #, c-format
 msgid "\"%s\" item is required in \"%s\" resource, but not found.\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:502
+#: src/stored/stored_conf.c:545
 #, c-format
 msgid "Too many items in \"%s\" resource\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:536
+#: src/stored/stored_conf.c:579
 #, c-format
 msgid "Cannot find AutoChanger resource %s\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:607
+#: src/stored/stored_conf.c:650
 #, c-format
 msgid ""
 "Attempt to define second \"%s\" resource named \"%s\" is not permitted.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:83
+#: src/stored/wait.c:114
 #, c-format
-msgid "Read error on device %s in ANSI label. ERR=%s\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:93
-msgid "Insane! End of tape while reading ANSI label.\n"
+msgid "pthread timedwait error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:117
-msgid "No VOL1 label while reading ANSI/IBM label.\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:137
+#: src/stored/wait.c:199
 #, c-format
-msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:148
-msgid "No HDR1 label while reading ANSI label.\n"
+msgid "Job %s waiting to reserve a device.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:154
+#: src/tools/bsmtp.c:85
 #, c-format
-msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:165
-msgid "No HDR2 label while reading ANSI/IBM label.\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:179
-msgid "Unknown or bad ANSI/IBM label record.\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:186
-msgid "Too many records in while reading ANSI/IBM label.\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:285
-#, c-format
-msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:302
-#, c-format
-msgid "Could not write ANSI VOL1 label. ERR=%s\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
-#, c-format
-msgid "Could not write ANSI HDR1 label. ERR=%s\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
-msgid "Could not write ANSI HDR1 label.\n"
-msgstr ""
-
-#: src/stored/ansi_label.c:381
-#, c-format
-msgid "Error writing EOF to tape. ERR=%s"
-msgstr ""
-
-#: src/stored/ansi_label.c:386
-msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
-msgstr ""
-
-#: src/stored/dvd.c:153
-#, c-format
-msgid "Device %s cannot be mounted. ERR=%s\n"
-msgstr ""
-
-#: src/stored/dvd.c:261
-#, c-format
-msgid "Cannot run free space command (%s)\n"
-msgstr ""
-
-#: src/stored/dvd.c:322
-#, c-format
-msgid "Error while writing current part to the DVD: %s"
-msgstr ""
-
-#: src/stored/dvd.c:343
-#, c-format
-msgid "Remaining free space %s on %s\n"
-msgstr ""
-
-#: src/stored/dvd.c:412
-#, c-format
-msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
-msgstr ""
-
-#: src/stored/dvd.c:430
-#, c-format
-msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
-msgstr ""
-
-#: src/stored/dvd.c:634
-#, c-format
-msgid "Unable to write part %s: ERR=%s\n"
-msgstr ""
-
-#: src/stored/wait.c:178 src/stored/wait.c:236
-#, c-format
-msgid "Job %s waiting to reserve a device.\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:202
-msgid "Error in ParseTuple\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:218
-msgid "Parse tuple error in job_write\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:254
-#, c-format
-msgid "Error in Python method %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:373 src/stored/reserve.c:390
-#, c-format
-msgid "Failed command: %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:375
-#, c-format
-msgid ""
-"\n"
-"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
-"Device resources.\n"
-msgstr ""
-
-#: src/stored/reserve.c:564
-#, c-format
-msgid "3926 Could not get dcr for device: %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:615 src/stored/reserve.c:670
-#, c-format
-msgid "Device %s is BLOCKED due to user unmount.\n"
-msgstr ""
-
-#: src/stored/reserve.c:623
-#, c-format
-msgid "Device %s is busy.\n"
-msgstr ""
-
-#: src/stored/reserve.c:678
-#, c-format
-msgid "Device %s is busy writing on another Volume.\n"
-msgstr ""
-
-#: src/stored/reserve.c:777
-#, c-format
-msgid "Wanted Pool \"%s\", but device %s is using Pool \"%s\" .\n"
-msgstr ""
-
-#: src/stored/reserve.c:784 src/stored/reserve.c:785
-msgid "Logic error!!!! Should not get here.\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:85
-#, c-format
-msgid "Fatal malformed reply from %s: %s\n"
+msgid "Fatal malformed reply from %s: %s\n"
 msgstr ""
 
 #: src/tools/bsmtp.c:121
@@ -12492,54 +12796,57 @@ msgid ""
 "       -f          set the From: field\n"
 "       -h          use mailhost:port as the SMTP server\n"
 "       -s          set the Subject: field\n"
+"       -r          set the Reply-To: field\n"
+"       -l          set the maximum number of lines that should be sent "
+"(default: unlimited)\n"
 "       -?          print this message.\n"
 "\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:204
+#: src/tools/bsmtp.c:213
 msgid "Fatal error: no recipient given.\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:225
+#: src/tools/bsmtp.c:234
 #, c-format
 msgid "Fatal gethostname error: ERR=%s\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:229
+#: src/tools/bsmtp.c:238
 #, c-format
 msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:254
+#: src/tools/bsmtp.c:263
 #, c-format
 msgid "Error unknown mail host \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:257
+#: src/tools/bsmtp.c:266
 msgid "Retrying connection using \"localhost\".\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:265
+#: src/tools/bsmtp.c:274
 #, c-format
 msgid "Fatal error: Unknown address family for smtp host: %d\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:273
+#: src/tools/bsmtp.c:282
 #, c-format
 msgid "Fatal socket error: ERR=%s\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:277
+#: src/tools/bsmtp.c:286
 #, c-format
 msgid "Fatal connect error to %s: ERR=%s\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:282
+#: src/tools/bsmtp.c:291
 #, c-format
 msgid "Fatal dup error: ERR=%s\n"
 msgstr ""
 
-#: src/tools/bsmtp.c:286 src/tools/bsmtp.c:290
+#: src/tools/bsmtp.c:295 src/tools/bsmtp.c:299
 #, c-format
 msgid "Fatal fdopen error: ERR=%s\n"
 msgstr ""
@@ -12888,6 +13195,25 @@ msgstr ""
 msgid "Found %d bad Path records.\n"
 msgstr ""
 
+#: src/tools/fstype.c:34
+#, c-format
+msgid ""
+"\n"
+"Usage: fstype [-d debug_level] path ...\n"
+"\n"
+"       Print the file system type a given file/directory is on.\n"
+"       The following options are supported:\n"
+"\n"
+"       -v     print both path and file system type.\n"
+"       -?     print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tools/fstype.c:86
+#, c-format
+msgid "%s: unknown\n"
+msgstr ""
+
 #: src/tools/testfind.c:49
 #, c-format
 msgid ""
@@ -13033,24 +13359,10 @@ msgstr ""
 msgid "Skip: File system change prohibited. Directory not entered. %s\n"
 msgstr ""
 
-#: src/tools/fstype.c:34
-#, c-format
-msgid ""
-"\n"
-"Usage: fstype [-d debug_level] path ...\n"
-"\n"
-"       Print the file system type a given file/directory is on.\n"
-"       The following options are supported:\n"
-"\n"
-"       -v     print both path and file system type.\n"
-"       -?     print this message.\n"
-"\n"
-msgstr ""
-
-#: src/tools/fstype.c:86
-#, c-format
-msgid "%s: unknown\n"
-msgstr ""
+#: src/tools/bwild.c:105 src/tools/bregex.c:121
+#, fuzzy, c-format
+msgid "Could not open data file: %s\n"
+msgstr "Impossible d'ouvrir la base de données Â«Â %s ».\n"
 
 #: src/tray-monitor/authenticate.c:78
 msgid ""
@@ -13178,24 +13490,11 @@ msgstr ""
 
 #: src/tray-monitor/tray-monitor.c:503 src/tray-monitor/tray-monitor.c:513
 msgid ""
-"Copyright (C) 2004 Kern Sibbald and John Walker\n"
+"Copyright (C) 2004-2005 Kern Sibbald\n"
 "Written by Nicolas Boichat\n"
 msgstr ""
 
-#: src/tray-monitor/tray-monitor.c:505
-msgid "Version"
-msgstr ""
-
-#: src/tray-monitor/tray-monitor.c:509
-#, c-format
-msgid ""
-"%s\n"
-"\n"
-"%s\n"
-"%s %s (%s) %s %s %s"
-msgstr ""
-
-#: src/tray-monitor/tray-monitor.c:515
+#: src/tray-monitor/tray-monitor.c:505 src/tray-monitor/tray-monitor.c:515
 msgid "Version:"
 msgstr ""
 
@@ -13391,7 +13690,7 @@ msgstr ""
 msgid "<< Error: BNET_PROMPT signal received. >>\n"
 msgstr ""
 
-#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:445
+#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:465
 msgid "<< Heartbeat signal received, answered. >>\n"
 msgstr ""
 
@@ -13436,710 +13735,1192 @@ msgstr ""
 msgid "Storage: name=%s address=%s SDport=%d\n"
 msgstr ""
 
-#: src/wx-console/authenticate.c:126
+#: src/wx-console/authenticate.c:129
 msgid "Bad response to Hello command: ERR="
 msgstr ""
 
-#: src/baconfig.h:52
+#: src/baconfig.h:55
 #, c-format
 msgid "Failed ASSERT: %s\n"
 msgstr ""
 
-#: src/baconfig.h:59
+#: src/baconfig.h:62
 msgid "*None*"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:103
+#: src/filed/win32/winmain.cpp:228 src/filed/win32/winmain.cpp:236
+msgid "Bacula Usage"
+msgstr ""
+
+#: src/filed/win32/winmain.cpp:233
+msgid "Bad Command Line Options"
+msgstr ""
+
+#: src/filed/win32/winmain.cpp:326
+msgid "Another instance of Bacula is already running"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:131 src/filed/win32/winservice.cpp:145
+msgid "No existing instance of Bacula could be contacted"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:218
+msgid "KERNEL32.DLL not found: Bacula service not started"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:228
+msgid "Registry service not found: Bacula service not started"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:230
+msgid "Registry service not found"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:260
+msgid "StartServiceCtrlDispatcher failed."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:278
+msgid "RegisterServiceCtlHandler failed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:279
+msgid "Contact Register Service Handler failure"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:295
+msgid "ReportStatus STOPPED failed 1"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:318
+msgid "Report Service failure"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:355
+msgid "Unable to install Bacula service"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:373
+msgid "Service command length too long"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:374
+msgid "Service command length too long. Service not registered."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:389
+msgid "Cannot write System Registry"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:390
+msgid ""
+"The System Registry could not be updated - the Bacula service was not "
+"installed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:397
+msgid "Cannot add Bacula key to System Registry"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:398 src/filed/win32/winservice.cpp:449
+msgid "The Bacula service could not be installed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:406
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started by double clicking on the\n"
+"Bacula \"Start\" icon and will be automatically\n"
+"be run the next time this machine is rebooted. "
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:424
+msgid ""
+"The Service Control Manager could not be contacted - the Bacula service was "
+"not installed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:455
+msgid ""
+"Provides file backup and restore services. Bacula -- the network backup "
+"solution."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:462
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started from the Control Panel and will\n"
+"automatically be run the next time this machine is rebooted."
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:471
+msgid ""
+"Unknown Windows operating system.\n"
+"Cannot install Bacula service.\n"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:496
+msgid ""
+"Could not find registry entry.\n"
+"Service probably not registerd - the Bacula service was not removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:501
+msgid ""
+"Could not delete Registry key.\n"
+"The Bacula service could not be removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:511
+msgid "Bacula could not be contacted, probably not running"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:517 src/filed/win32/winservice.cpp:553
+msgid "The Bacula service has been removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:547
+msgid "The Bacula service could not be stopped"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:555
+msgid "The Bacula service could not be removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:560
+msgid "The Bacula service could not be found"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:565
+msgid "The SCM could not be contacted - the Bacula service was not removed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:629
+msgid "SetServiceStatus failed"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:657
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s error: %ld at %s:%d"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:732
+#, c-format
+msgid "Locked by: %s, duration: %ld seconds\n"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:736
+#, c-format
+msgid "No longer locked\n"
+msgstr ""
+
+#: src/filed/win32/winservice.cpp:740
+msgid "Could not lock database"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:101
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
 "Director \"%s\" in config file.\n"
-" At least one CA certificate store is required.\n"
+"At least one CA certificate store is required.\n"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:112
+#: src/wx-console/console_thread.cpp:108
 msgid ""
 "No Director resource defined in config file.\n"
 "Without that I don't how to speak to the Director :-(\n"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:132
+#: src/wx-console/console_thread.cpp:127
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
 "Console \"%s\" in config file.\n"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:154
+#: src/wx-console/console_thread.cpp:148
 msgid "Error while initializing windows sockets...\n"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:169
+#: src/wx-console/console_thread.cpp:163
 msgid "Error while cleaning up windows sockets...\n"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:207
+#: src/wx-console/console_thread.cpp:201
 msgid "Error while initializing library."
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:237
+#: src/wx-console/console_thread.cpp:227
+msgid "Cryptographic library initialization failed.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:231
 msgid "Please correct configuration file.\n"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:270
+#: src/wx-console/console_thread.cpp:273
 msgid "Error : Library not initialized\n"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:281
-msgid "Error : No configuration file loaded\n"
+#: src/wx-console/console_thread.cpp:284
+msgid "Error : No configuration file loaded\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:294
+msgid "Connecting...\n"
+msgstr "Connexion...\n"
+
+#: src/wx-console/console_thread.cpp:310
+msgid "Error : No director defined in config file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:322
+msgid "Multiple directors found in your config file.\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:331
+#, c-format
+msgid "Please choose a director (1-%d): "
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:403
+msgid "Failed to connect to the director\n"
+msgstr "Impossible de se connecter au Director\n"
+
+#: src/wx-console/console_thread.cpp:413
+msgid "Connected\n"
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:470
+msgid "<< Unexpected signal received : "
+msgstr ""
+
+#: src/wx-console/console_thread.cpp:490
+msgid "Connection terminated\n"
+msgstr ""
+
+#: src/wx-console/main.cpp:101
+msgid "Bacula wx-console"
+msgstr ""
+
+#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
+#, c-format
+msgid "Welcome to bacula wx-console %s (%s)!\n"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:44
+msgid "Config file editor"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:54
+msgid "# Bacula wx-console Configuration File\n"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:90
+msgid "Save and close"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:91
+msgid "Close without saving"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:118
+#, c-format
+msgid "Unable to write to %s\n"
+msgstr ""
+
+#: src/wx-console/wxbconfigfileeditor.cpp:119
+msgid "Error while saving"
+msgstr ""
+
+#: src/wx-console/wxbconfigpanel.cpp:184
+msgid "Apply"
+msgstr ""
+
+#: src/wx-console/wxbhistorytextctrl.cpp:61
+#: src/wx-console/wxbhistorytextctrl.cpp:132
+#: src/wx-console/wxbmainframe.cpp:272
+msgid "Type your command below:"
+msgstr "Saisissez votre commande ci-dessous : "
+
+#: src/wx-console/wxbhistorytextctrl.cpp:96
+msgid "Unknown command."
+msgstr ""
+
+#: src/wx-console/wxbhistorytextctrl.cpp:105
+msgid "Possible completions: "
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "&About...\tF1"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "Show about dialog"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:598
+msgid "Connect to the director"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect of the director"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change of configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change your default configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:233
+msgid "Edit your configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "E&xit\tAlt-X"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "Quit this program"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:239
+msgid "&File"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:240
+msgid "&Help"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:257
+msgid "Console"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:264
+msgid ""
+"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:268
+msgid ""
+"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
+"support when handling non-ASCII filenames: Every non-ASCII character in such "
+"filenames will be replaced by an interrogation mark.\n"
+"If this behaviour disturbs you, please build wx-console against a Unicode "
+"version of wxWidgets for GTK+ 2.0.\n"
+"---\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:279
+msgid "Send"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
+msgid "Error while parsing command line arguments, using defaults.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
+msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:397
+#, c-format
+msgid ""
+"It seems that it is the first time you run wx-console.\n"
+"This file (%s) has been choosen as default configuration file.\n"
+"Do you want to edit it? (if you click No you will have to select another "
+"file)"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:399
+msgid "First run"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:416
+#, c-format
+msgid ""
+"Unable to read %s\n"
+"Error: %s\n"
+"Do you want to choose another one? (Press no to edit this file)"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:418
+msgid "Unable to read configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:430
+msgid "Please choose a configuration file to use"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:291
-msgid "Connecting...\n"
-msgstr "Connection...\n"
-
-#: src/wx-console/console_thread.cpp:307
-msgid "Error : No director defined in config file.\n"
+#: src/wx-console/wxbmainframe.cpp:443
+msgid "This configuration file has been successfully read, use it as default?"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:319
-msgid "Multiple directors found in your config file.\n"
+#: src/wx-console/wxbmainframe.cpp:444
+msgid "Configuration file read successfully"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:328
+#: src/wx-console/wxbmainframe.cpp:454
 #, c-format
-msgid "Please choose a director (1-%d): "
+msgid "Using this configuration file: %s\n"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:400
-msgid "Failed to connect to the director\n"
-msgstr "Impossible de se connecter au Director\n"
+#: src/wx-console/wxbmainframe.cpp:459
+msgid "Connecting to the director..."
+msgstr ""
 
-#: src/wx-console/console_thread.cpp:410
-msgid "Connected\n"
+#: src/wx-console/wxbmainframe.cpp:474
+msgid "Failed to unregister a data parser !"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:448
-msgid "<< Unexpected signal received : "
+#: src/wx-console/wxbmainframe.cpp:482
+msgid "Quitting.\n"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:466
-msgid "Connection terminated\n"
+#: src/wx-console/wxbmainframe.cpp:497
+msgid ""
+"Welcome to Bacula wx-console.\n"
+"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
+"(C) 2005 Kern Sibbald\n"
 msgstr ""
 
-#: src/wx-console/main.cpp:101
-msgid "Bacula wx-console"
+#: src/wx-console/wxbmainframe.cpp:499
+msgid "About Bacula wx-console"
 msgstr ""
 
-#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
-#, c-format
-msgid "Welcome to bacula wx-console %s (%s)!\n"
+#: src/wx-console/wxbmainframe.cpp:505
+msgid "Please choose your default configuration file"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:41
-msgid "Config file editor"
+#: src/wx-console/wxbmainframe.cpp:509
+msgid "Use this configuration file as default?"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:57
-msgid "Save and close"
+#: src/wx-console/wxbmainframe.cpp:510
+msgid "Configuration file"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:58
-msgid "Close without saving"
+#: src/wx-console/wxbmainframe.cpp:581
+msgid "Console thread terminated."
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:69
-msgid "# Bacula wx-console Configuration File\n"
+#: src/wx-console/wxbmainframe.cpp:589
+msgid "Connection to the director lost. Quit program?"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:100
-#, c-format
-msgid "Unable to write to %s\n"
+#: src/wx-console/wxbmainframe.cpp:590
+msgid "Connection lost"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:101
-msgid "Error while saving"
+#: src/wx-console/wxbmainframe.cpp:606
+msgid "Connected to the director."
 msgstr ""
 
-#: src/wx-console/wxbconfigpanel.cpp:184
-msgid "Apply"
+#: src/wx-console/wxbmainframe.cpp:629
+msgid "Reconnect"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:61
-#: src/wx-console/wxbhistorytextctrl.cpp:132
-#: src/wx-console/wxbmainframe.cpp:272
-msgid "Type your command below:"
-msgstr "Entrez votre commande ci-dessous :"
+#: src/wx-console/wxbmainframe.cpp:630
+msgid "Reconnect to the director"
+msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:96
-msgid "Unknown command."
+#: src/wx-console/wxbmainframe.cpp:644
+msgid "Disconnected of the director."
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:105
-msgid "Possible completions: "
+#: src/wx-console/wxbmainframe.cpp:663 src/wx-console/wxbrestorepanel.cpp:689
+msgid "Unexpected question has been received.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:258
-#: src/wx-console/wxbrestorepanel.cpp:1861
-#: src/wx-console/wxbrestorepanel.cpp:1890
+#: src/wx-console/wxbmainframe.cpp:686 src/wx-console/wxbmainframe.cpp:703
+msgid "wx-console: unexpected director's question."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:216
+#: src/wx-console/wxbrestorepanel.cpp:1895
+#: src/wx-console/wxbrestorepanel.cpp:1924
 msgid "Enter restore mode"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:261
+#: src/wx-console/wxbrestorepanel.cpp:219
 msgid "Cancel restore"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:287
-#: src/wx-console/wxbrestorepanel.cpp:341
+#: src/wx-console/wxbrestorepanel.cpp:245
+#: src/wx-console/wxbrestorepanel.cpp:299
 msgid "Add"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:289
-#: src/wx-console/wxbrestorepanel.cpp:343
+#: src/wx-console/wxbrestorepanel.cpp:247
+#: src/wx-console/wxbrestorepanel.cpp:301
 msgid "Remove"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:291
-#: src/wx-console/wxbrestorepanel.cpp:345
+#: src/wx-console/wxbrestorepanel.cpp:249
+#: src/wx-console/wxbrestorepanel.cpp:303
 msgid "Refresh"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:310
+#: src/wx-console/wxbrestorepanel.cpp:268
 msgid "M"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:326
+#: src/wx-console/wxbrestorepanel.cpp:272
+msgid "Filename"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:284
 msgid "Perm."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:359
-#: src/wx-console/wxbrestorepanel.cpp:372
-#: src/wx-console/wxbrestorepanel.cpp:524
-#: src/wx-console/wxbrestorepanel.cpp:534
-#: src/wx-console/wxbrestorepanel.cpp:537
-#: src/wx-console/wxbrestorepanel.cpp:1732
-#: src/wx-console/wxbrestorepanel.cpp:1812
+#: src/wx-console/wxbrestorepanel.cpp:317
+#: src/wx-console/wxbrestorepanel.cpp:330
+#: src/wx-console/wxbrestorepanel.cpp:482
+#: src/wx-console/wxbrestorepanel.cpp:492
+#: src/wx-console/wxbrestorepanel.cpp:495
+#: src/wx-console/wxbrestorepanel.cpp:1760
+#: src/wx-console/wxbrestorepanel.cpp:1846
 msgid "Job Name"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:361
-#: src/wx-console/wxbrestorepanel.cpp:377
-#: src/wx-console/wxbrestorepanel.cpp:476
-#: src/wx-console/wxbrestorepanel.cpp:477
-#: src/wx-console/wxbrestorepanel.cpp:487
-#: src/wx-console/wxbrestorepanel.cpp:488
-#: src/wx-console/wxbrestorepanel.cpp:1101
-#: src/wx-console/wxbrestorepanel.cpp:1768
-#: src/wx-console/wxbrestorepanel.cpp:1827
+#: src/wx-console/wxbrestorepanel.cpp:319
+#: src/wx-console/wxbrestorepanel.cpp:335
+#: src/wx-console/wxbrestorepanel.cpp:434
+#: src/wx-console/wxbrestorepanel.cpp:435
+#: src/wx-console/wxbrestorepanel.cpp:445
+#: src/wx-console/wxbrestorepanel.cpp:446
+#: src/wx-console/wxbrestorepanel.cpp:1118
+#: src/wx-console/wxbrestorepanel.cpp:1191
+#: src/wx-console/wxbrestorepanel.cpp:1798
+#: src/wx-console/wxbrestorepanel.cpp:1800
+#: src/wx-console/wxbrestorepanel.cpp:1861
 msgid "Fileset"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:364
-#: src/wx-console/wxbrestorepanel.cpp:1168
-#: src/wx-console/wxbrestorepanel.cpp:1183
+#: src/wx-console/wxbrestorepanel.cpp:322
 #: src/wx-console/wxbrestorepanel.cpp:1185
-#: src/wx-console/wxbrestorepanel.cpp:1193
-#: src/wx-console/wxbrestorepanel.cpp:1195
-#: src/wx-console/wxbrestorepanel.cpp:1212
-#: src/wx-console/wxbrestorepanel.cpp:1219
-#: src/wx-console/wxbrestorepanel.cpp:1759
-#: src/wx-console/wxbrestorepanel.cpp:1885
+#: src/wx-console/wxbrestorepanel.cpp:1201
+#: src/wx-console/wxbrestorepanel.cpp:1203
+#: src/wx-console/wxbrestorepanel.cpp:1211
+#: src/wx-console/wxbrestorepanel.cpp:1213
+#: src/wx-console/wxbrestorepanel.cpp:1232
+#: src/wx-console/wxbrestorepanel.cpp:1239
+#: src/wx-console/wxbrestorepanel.cpp:1788
+#: src/wx-console/wxbrestorepanel.cpp:1799
+#: src/wx-console/wxbrestorepanel.cpp:1919
 msgid "Before"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:366
+#: src/wx-console/wxbrestorepanel.cpp:324
 msgid "Please configure parameters concerning files to restore :"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-#: src/wx-console/wxbrestorepanel.cpp:1820
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1854
 msgid "always"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
+#: src/wx-console/wxbrestorepanel.cpp:333
 msgid "if newer"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
+#: src/wx-console/wxbrestorepanel.cpp:333
 msgid "if older"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-#: src/wx-console/wxbrestorepanel.cpp:1823
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1857
 msgid "never"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:383
+#: src/wx-console/wxbrestorepanel.cpp:341
 msgid "Please configure parameters concerning files restoration :"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:448
+#: src/wx-console/wxbrestorepanel.cpp:406
 msgid "Getting parameters list."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:456
+#: src/wx-console/wxbrestorepanel.cpp:414
 msgid "Error : no clients returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:480
+#: src/wx-console/wxbrestorepanel.cpp:438
 msgid "Error : no filesets returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:504
+#: src/wx-console/wxbrestorepanel.cpp:462
 msgid "Error : no storage returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:527
-#: src/wx-console/wxbrestorepanel.cpp:551
+#: src/wx-console/wxbrestorepanel.cpp:485
+#: src/wx-console/wxbrestorepanel.cpp:509
 msgid "Error : no jobs returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:537
+#: src/wx-console/wxbrestorepanel.cpp:495
 msgid "RestoreFiles"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:572
+#: src/wx-console/wxbrestorepanel.cpp:530
 msgid "Please configure your restore parameters."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:583
+#: src/wx-console/wxbrestorepanel.cpp:541
 msgid "Building restore tree..."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:622
+#: src/wx-console/wxbrestorepanel.cpp:584
 msgid "Error while starting restore: "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:712
+#: src/wx-console/wxbrestorepanel.cpp:674
 msgid ""
 "Right click on a file or on a directory, or double-click on its mark to add "
 "it to the restore list."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:729
+#: src/wx-console/wxbrestorepanel.cpp:711
+#: src/wx-console/wxbrestorepanel.cpp:733
+msgid "wx-console: unexpected restore question."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:744
 msgid " files selected to be restored."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:734
+#: src/wx-console/wxbrestorepanel.cpp:749
 msgid " file selected to be restored."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:741
+#: src/wx-console/wxbrestorepanel.cpp:756
 #, c-format
 msgid "Please configure your restore (%ld files selected to be restored)..."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:751
+#: src/wx-console/wxbrestorepanel.cpp:766
 msgid "Restore failed : no file selected.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:752
+#: src/wx-console/wxbrestorepanel.cpp:767
 msgid "Restore failed : no file selected."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:762
+#: src/wx-console/wxbrestorepanel.cpp:777
 msgid "Restoring, please wait..."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:775
+#: src/wx-console/wxbrestorepanel.cpp:790
 msgid "Job started. JobId="
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:777
+#: src/wx-console/wxbrestorepanel.cpp:792
 msgid "Restore started, jobid="
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:781
+#: src/wx-console/wxbrestorepanel.cpp:796
 msgid "Job failed."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:782
+#: src/wx-console/wxbrestorepanel.cpp:797
 msgid "Restore failed, please look at messages.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:783
+#: src/wx-console/wxbrestorepanel.cpp:798
 msgid "Restore failed, please look at messages in console."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:789
-#: src/wx-console/wxbrestorepanel.cpp:790
+#: src/wx-console/wxbrestorepanel.cpp:804
+#: src/wx-console/wxbrestorepanel.cpp:805
 msgid "Failed to retrieve jobid.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:816
+#: src/wx-console/wxbrestorepanel.cpp:831
 msgid ""
 "Restore is scheduled in more than two minutes, wx-console will not wait for "
 "its completion.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:817
+#: src/wx-console/wxbrestorepanel.cpp:832
 msgid ""
 "Restore is scheduled in more than two minutes, wx-console will not wait for "
 "its completion."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:841
+#: src/wx-console/wxbrestorepanel.cpp:858
 msgid "Restore job created, but not yet running."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:846
+#: src/wx-console/wxbrestorepanel.cpp:863
 #, c-format
 msgid "Restore job running, please wait (%ld of %ld files restored)..."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:850
+#: src/wx-console/wxbrestorepanel.cpp:867
 msgid "Restore job terminated successfully."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:851
+#: src/wx-console/wxbrestorepanel.cpp:868
 msgid "Restore job terminated successfully.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:856
+#: src/wx-console/wxbrestorepanel.cpp:873
 msgid "Restore job terminated in error, see messages in console."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:857
+#: src/wx-console/wxbrestorepanel.cpp:874
 msgid "Restore job terminated in error, see messages.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:862
+#: src/wx-console/wxbrestorepanel.cpp:879
 msgid "Restore job reported a non-fatal error."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:866
+#: src/wx-console/wxbrestorepanel.cpp:883
 msgid "Restore job reported a fatal error."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:871
+#: src/wx-console/wxbrestorepanel.cpp:888
 msgid "Restore job cancelled by user."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:872
+#: src/wx-console/wxbrestorepanel.cpp:889
 msgid "Restore job cancelled by user.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:877
+#: src/wx-console/wxbrestorepanel.cpp:894
 msgid "Restore job is waiting on File daemon."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:881
+#: src/wx-console/wxbrestorepanel.cpp:898
 msgid "Restore job is waiting for new media."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:885
+#: src/wx-console/wxbrestorepanel.cpp:902
 msgid "Restore job is waiting for storage resource."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:889
+#: src/wx-console/wxbrestorepanel.cpp:906
 msgid "Restore job is waiting for job resource."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:893
+#: src/wx-console/wxbrestorepanel.cpp:910
 msgid "Restore job is waiting for Client resource."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:897
+#: src/wx-console/wxbrestorepanel.cpp:914
 msgid "Restore job is waiting for maximum jobs."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:901
+#: src/wx-console/wxbrestorepanel.cpp:918
 msgid "Restore job is waiting for start time."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:905
+#: src/wx-console/wxbrestorepanel.cpp:922
 msgid "Restore job is waiting for higher priority jobs to finish."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:954
+#: src/wx-console/wxbrestorepanel.cpp:971
 msgid ""
 "The restore job has not been started within one minute, wx-console will not "
 "wait for its completion anymore.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:955
+#: src/wx-console/wxbrestorepanel.cpp:972
 msgid ""
 "The restore job has not been started within one minute, wx-console will not "
 "wait for its completion anymore."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:965
+#: src/wx-console/wxbrestorepanel.cpp:982
 msgid "Restore done successfully.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:966
+#: src/wx-console/wxbrestorepanel.cpp:983
 msgid "Restore done successfully."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1037
+#: src/wx-console/wxbrestorepanel.cpp:1054
 msgid "Applying restore configuration changes..."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1088
+#: src/wx-console/wxbrestorepanel.cpp:1105
 msgid "Failed to find the selected client."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1103
+#: src/wx-console/wxbrestorepanel.cpp:1120
 msgid "Failed to find the selected fileset."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1118
+#: src/wx-console/wxbrestorepanel.cpp:1135
 msgid "Failed to find the selected storage."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1135
-#: src/wx-console/wxbrestorepanel.cpp:1801
+#: src/wx-console/wxbrestorepanel.cpp:1152
+#: src/wx-console/wxbrestorepanel.cpp:1835
 msgid "Run Restore job"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1151
+#: src/wx-console/wxbrestorepanel.cpp:1168
 msgid "Restore configuration changes were applied."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1160
+#: src/wx-console/wxbrestorepanel.cpp:1177
 msgid "Restore cancelled.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1161
+#: src/wx-console/wxbrestorepanel.cpp:1178
 msgid "Restore cancelled."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1182
+#: src/wx-console/wxbrestorepanel.cpp:1200
 msgid "No results to list."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1184
+#: src/wx-console/wxbrestorepanel.cpp:1202
 msgid "No backup found for this client."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1191
+#: src/wx-console/wxbrestorepanel.cpp:1209
 msgid "ERROR"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1192
+#: src/wx-console/wxbrestorepanel.cpp:1210
 msgid "Query failed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1194
+#: src/wx-console/wxbrestorepanel.cpp:1212
 msgid "Cannot get previous backups list, see console."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1811
+#: src/wx-console/wxbrestorepanel.cpp:1845
 msgid "JobName:"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1815
+#: src/wx-console/wxbrestorepanel.cpp:1849
 msgid "Where:"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1818
+#: src/wx-console/wxbrestorepanel.cpp:1852
 msgid "Replace:"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1821
+#: src/wx-console/wxbrestorepanel.cpp:1855
 msgid "ifnewer"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1822
+#: src/wx-console/wxbrestorepanel.cpp:1856
 msgid "ifolder"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1826
+#: src/wx-console/wxbrestorepanel.cpp:1860
 msgid "FileSet:"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1942
+#: src/wx-console/wxbrestorepanel.cpp:1976
 msgid "Restoring..."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:227
-msgid "&About...\tF1"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:227
-msgid "Show about dialog"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:591
-msgid "Connect to the director"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:230
-msgid "Disconnect"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:230
-msgid "Disconnect of the director"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:232
-msgid "Change of configuration file"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:232
-msgid "Change your default configuration file"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:233
-msgid "Edit your configuration file"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:235
-msgid "E&xit\tAlt-X"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:235
-msgid "Quit this program"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:239
-msgid "&File"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:240
-msgid "&Help"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:257
-msgid "Console"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:264
-msgid ""
-"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:268
-msgid ""
-"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
-"support when handling non-ASCII filenames: Every non-ASCII character in such "
-"filenames will be replaced by an interrogation mark.\n"
-"If this behaviour disturbs you, please build wx-console against a Unicode "
-"version of wxWidgets for GTK+ 2.0.\n"
-"---\n"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:279
-msgid "Send"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
-msgid "Error while parsing command line arguments, using defaults.\n"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
-msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:397
-#, c-format
-msgid ""
-"It seems that it is the first time you run wx-console.\n"
-"This file (%s) has been choosen as default configuration file.\n"
-"Do you want to edit it? (if you click No you will have to select another "
-"file)"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:401
-msgid "First run"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:418
-#, c-format
-msgid ""
-"Unable to read %s\n"
-"Error: %s\n"
-"Do you want to choose another one? (Press no to edit this file)"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:422
-msgid "Unable to read configuration file"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:434
-msgid "Please choose a configuration file to use"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:447
-msgid "This configuration file has been successfully read, use it as default?"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:448
-msgid "Configuration file read successfully"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:458
-#, c-format
-msgid "Using this configuration file: %s\n"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:463
-msgid "Connecting to the director..."
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:478
-msgid "Failed to unregister a data parser !"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:486
-msgid "Quitting.\n"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:501
-msgid ""
-"Welcome to Bacula wx-console.\n"
-"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
-"(C) 2005 Kern Sibbald\n"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:503
-msgid "About Bacula wx-console"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:509
-msgid "Please choose your default configuration file"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:513
-msgid "Use this configuration file as default?"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:514
-msgid "Configuration file"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:578
-msgid "Console thread terminated."
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:582
-msgid "Connection to the director lost. Quit program?"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:583
-msgid "Connection lost"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:599
-msgid "Connected to the director."
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:613
-msgid "Reconnect"
-msgstr ""
-
-#: src/wx-console/wxbmainframe.cpp:614
-msgid "Reconnect to the director"
-msgstr ""
+#~ msgid "Expect %s, got: %s"
+#~ msgstr "Attendait %s, a pas : %s"
 
-#: src/wx-console/wxbmainframe.cpp:624
-msgid "Disconnected of the director."
-msgstr ""
+#~ msgid "Success"
+#~ msgstr "Succès"
 
-#: src/wx-console/wxbmainframe.cpp:643
-msgid "Unexpected question has been received.\n"
-msgstr ""
+#~ msgid "No match"
+#~ msgstr "Aucune correspondance"
 
-#: src/wx-console/wxbmainframe.cpp:666 src/wx-console/wxbmainframe.cpp:681
-msgid "wx-console: unexpected director's question."
-msgstr ""
+#~ msgid "Invalid regular expression"
+#~ msgstr "Expression régulière invalide"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Référence arrière invalide"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Expression régulière trop grande"
+
+#~ msgid "Unable to open certificate file"
+#~ msgstr "Impossible d'ouvrir de fichier de certificat"
+
+#~ msgid "Unable to read certificate from file"
+#~ msgstr "Impossible de lire le certificat Ã  partir du fichier"
+
+#~ msgid "Unable to extract public key from certificate"
+#~ msgstr "Impossible d'extraire la clef publique Ã  partir du certificat"
+
+#~ msgid ""
+#~ "Provided certificate does not include the required subjectKeyIdentifier "
+#~ "extension."
+#~ msgstr ""
+#~ "Le certificat fournis n'inclus pas l'extension subjectKeyIdentifier "
+#~ "requise"
+
+#~ msgid "Unsupported key type provided: %d\n"
+#~ msgstr "Type de clef fourni non supporté : %d\n"
+
+#~ msgid "Unable to open private key file"
+#~ msgstr "Impossible d'ouvrir le fichier de clef privée"
+
+#~ msgid "Unable to read private key from file"
+#~ msgstr "Impossible de lire la clef privée Ã  partir du fichier"
+
+#~ msgid "Unsupported digest type: %d\n"
+#~ msgstr "Le digest spécifié n'est pas supporté : %d\n"
+
+#~ msgid "OpenSSL error occured"
+#~ msgstr "Une erreur OpenSSL s'est produite"
+
+#~ msgid "Signature creation failed"
+#~ msgstr "La création de la signature a Ã©chouée"
+
+#~ msgid "Signature decoding failed"
+#~ msgstr "Le décodage de la signature a Ã©choué"
+
+#~ msgid "Unsupported cipher type specified\n"
+#~ msgstr "Le cipher spécifié est non supporté\n"
+
+#~ msgid "CryptoData decoding failed"
+#~ msgstr "Le décodage du CryptoData a Ã©choué"
+
+#~ msgid "Failure decrypting the session key"
+#~ msgstr "Impossible de décrypter la clef de session"
+
+#~ msgid "Unsupported contentEncryptionAlgorithm: %d\n"
+#~ msgstr "contentEncryptionAlgorithm non supporté : %d\n"
+
+#~ msgid "OpenSSL cipher context initialization failed"
+#~ msgstr "Initialisation du contexte clef/IV du cipher OpenSSL Ã  Ã©choué"
+
+#, fuzzy
+#~ msgid "Failed to allocate a new keypair object.\n"
+#~ msgstr "Impossible de se connecter au Director\n"
+
+#, fuzzy
+#~ msgid "Expected a Migration Job Type keyword, got: %s"
+#~ msgstr "Attendait un Label de lecteur, a pas : %s"
+
+#~ msgid ""
+#~ "Run %s job\n"
+#~ "JobName:     %s\n"
+#~ "FileSet:     %s\n"
+#~ "Level:       %s\n"
+#~ "Client:      %s\n"
+#~ "Storage:     %s\n"
+#~ "Pool:        %s\n"
+#~ "Verify Job:  %s\n"
+#~ "Verify List: %s\n"
+#~ "When:        %s\n"
+#~ "Priority:    %d\n"
+#~ msgstr ""
+#~ "Lancement du job %s\n"
+#~ "JobName  : %s\n"
+#~ "FileSet  : %s\n"
+#~ "Type     : %s\n"
+#~ "Client   : %s\n"
+#~ "Storage  : %s\n"
+#~ "Pool     : %s\n"
+#~ "Verify Job: %s\n"
+#~ "Verify List:%s\n"
+#~ "Quand    : %s\n"
+#~ "Priorité : %d\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Run Restore job\n"
+#~ "JobName:       %s\n"
+#~ "Bootstrap:     %s\n"
+#~ "Where:         %s\n"
+#~ "Replace:       %s\n"
+#~ "FileSet:       %s\n"
+#~ "Client:        %s\n"
+#~ "Storage:       %s\n"
+#~ "JobId:         %s\n"
+#~ "When:          %s\n"
+#~ "Catalog:       %s\n"
+#~ "Priority:      %d\n"
+#~ msgstr ""
+#~ "Lancement de la restauration\n"
+#~ "JobName     : %s\n"
+#~ "Bootstrap   : %s\n"
+#~ "Destination : %s\n"
+#~ "Écrasement  : %s\n"
+#~ "FileSet     : %s\n"
+#~ "Client      : %s\n"
+#~ "Storage     : %s\n"
+#~ "Migration Job : %s\n"
+#~ "Quand       : %s\n"
+#~ "Catalogue   : %s\n"
+#~ "Priorité    : %d\n"
+
+#, fuzzy
+#~ msgid "SQL to get Volume failed. ERR=%s\n"
+#~ msgstr "Impossible de supprimer le volume Â«Â %s ». ERR=%s"
+
+#, fuzzy
+#~ msgid "No Volumes found to migrate.\n"
+#~ msgstr "Aucun volume trouvé pour la restauration.\n"
+
+#, fuzzy
+#~ msgid "No Volume found to migrate.\n"
+#~ msgstr "Aucun volume trouvé pour la restauration.\n"
+
+#, fuzzy
+#~ msgid "No jobs found to migrate.\n"
+#~ msgstr "Pas de jobs trouvé.\n"
+
+#, fuzzy
+#~ msgid "Could not compile regex pattern \"%s\" ERR=%s\n"
+#~ msgstr "Impossible de trouver l'agent (Client) Â«Â %s » : ERR=%s"
+
+#, fuzzy
+#~ msgid "SQL to get Client failed. ERR=%s\n"
+#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n"
+
+#, fuzzy
+#~ msgid "SQL to get Job failed. ERR=%s\n"
+#~ msgstr "Erreur sur l'ouverture du périphérique. ERR=%s\n"
+
+#, fuzzy
+#~ msgid "SQL failed. ERR=%s\n"
+#~ msgstr "fopen %s en erreur : ERR=%s\n"
+
+#, fuzzy
+#~ msgid "Invalid JobId found.\n"
+#~ msgstr "Période invalide.\n"
+
+#, fuzzy
+#~ msgid "No JobIds found to migrate.\n"
+#~ msgstr "Aucun volume trouvé pour la restauration.\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Version: "
+#~ msgstr "%s Version : %s (%s)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ ")\n"
+#~ "\n"
+#~ "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n"
+#~ "       -c <file>   set configuration file to file\n"
+#~ "       -dnn        set debug level to nn\n"
+#~ "       -f          run in foreground (for debugging)\n"
+#~ "       -r <job>    run <job> now\n"
+#~ "       -s          no signals\n"
+#~ "       -t          test - read configuration and exit\n"
+#~ "       -?          print this message.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Copyright (C) 2000-2005 Kern Sibbald.\n"
+#~ "\n"
+#~ "Version : %s (%s)\n"
+#~ "\n"
+#~ "Usage : dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n"
+#~ "      -c <fich>      utilise fich comme fichier de configuration\n"
+#~ "      -dnn           positionne le niveau de debug Ã  nn\n"
+#~ "      -f             reste en avant-plan (pour debugger)\n"
+#~ "      -g             groupid\n"
+#~ "      -r <job>       lance <job> maintenant\n"
+#~ "      -s             pas de signaux\n"
+#~ "      -t             test - lit seulement le fichier de configuration\n"
+#~ "      -u             userid\n"
+#~ "      -v             affiche les messages utilisateurs\n"
+#~ "      -?             affiche ce message.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "No Client record defined for job %s\n"
+#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n"
+
+#, fuzzy
+#~ msgid "No FileSet record defined for job %s\n"
+#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n"
+
+#, fuzzy
+#~ msgid "No Storage resource defined for job %s\n"
+#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n"
+
+#, fuzzy
+#~ msgid "No Catalog resource defined for client %s\n"
+#~ msgstr "Pas d'enregistrement trouvé en base pour : %s\n"
+
+#, fuzzy
+#~ msgid "1 file (%s)"
+#~ msgstr "Nouveau Fichier : %s\n"
+
+#, fuzzy
+#~ msgid "%d files (%s)"
+#~ msgstr "Nouveau Fichier : %s\n"
+
+#, fuzzy
+#~ msgid "1 file selected (%s)"
+#~ msgstr ""
+#~ "\n"
+#~ "1 fichier sélectionne pour la restauration.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "%d files selected (%s)"
+#~ msgstr ""
+#~ "\n"
+#~ "%u fichiers sélectionnés pour la restauration.\n"
+
+#, fuzzy
+#~ msgid "Command not found."
+#~ msgstr "Commande annulée.\n"
+
+#, fuzzy
+#~ msgid "Command exited abnormally."
+#~ msgstr "Commande annulée.\n"
+
+#, fuzzy
+#~ msgid "Do you want to create a new archive with these files?"
+#~ msgstr ""
+#~ "\n"
+#~ "Voulez vous restaurer tous les fichiers ? (oui|non) : "
+
+#, fuzzy
+#~ msgid "Current Location:"
+#~ msgstr "La durée d'utilisation actuelle est : %s\n"
+
+#, fuzzy
+#~ msgid "Create _Folder"
+#~ msgstr "Crée"
+
+#, fuzzy
+#~ msgid "Unknown Job level=%c\n"
+#~ msgstr "Job du Type=%d inconnu\n"
+
+#, fuzzy
+#~ msgid "Invalid value. It must by yes or no.\n"
+#~ msgstr "Saisie invalide. Veuillez répondre oui ou non.\n"
+
+#, fuzzy
+#~ msgid "Invalid slot, it must be between 0 and %d\n"
+#~ msgstr "Slot invalide, il doit Ãªtre compris entre 0 et MaxVols=%d\n"
+
+#~ msgid "readlabel %s Slot=%d drive=%d\n"
+#~ msgstr "readlabel %s Slot=%d drive=%d\n"
+
+#~ msgid "autochanger list %s \n"
+#~ msgstr "autochanger list %s\n"
+
+#, fuzzy
+#~ msgid "Open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
+#~ msgstr "Impossible de supprimer le volume Â«Â %s ». ERR=%s"
+
+#, fuzzy
+#~ msgid "Open device %s Volume \"%s\" failed: ERR=%s\n"
+#~ msgstr "Impossible de supprimer le volume Â«Â %s ». ERR=%s"
index 75ad58929d24f2bfa3a6a0a3080a99901fb8b8eb..44a6195e49c792bff3726ba3b57daa0b78ec9d64 100644 (file)
Binary files a/bacula/po/it.gmo and b/bacula/po/it.gmo differ
index 08d79e305f5883df8893ce73b800648451242047..c3b056533104f998740cbfc9f75696edcb8afff3 100644 (file)
@@ -1,13 +1,13 @@
 # Italian translations for Bacula package
 # Traduzioni italiane per il pacchetto Bacula..
-# Copyright (C) 2005 Kern Sibbald
+# Copyright (C) 2005-2006 Kern Sibbald
 #  <fparacchini@alteanet.it>, 2005.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Bacula 1.38\n"
 "Report-Msgid-Bugs-To: bacula-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2005-08-19 11:20+0200\n"
+"POT-Creation-Date: 2006-05-02 16:47+0200\n"
 "PO-Revision-Date: 2005-08-08 17:50+0200\n"
 "Last-Translator:  <fparacchini@alteanet.it>\n"
 "Language-Team: Italian <bacula-devel@lists.sourceforge.net>\n"
@@ -16,35 +16,35 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/cats/bdb.c:135
+#: src/cats/bdb.c:128
 msgid "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
 msgstr ""
 
-#: src/cats/bdb.c:136
+#: src/cats/bdb.c:129
 msgid "WARNING!!!! The Internal Database is NOT OPERATIONAL!\n"
 msgstr ""
 
-#: src/cats/bdb.c:137
+#: src/cats/bdb.c:130
 msgid "You should use SQLite, PostgreSQL, or MySQL\n"
 msgstr ""
 
-#: src/cats/bdb.c:159 src/cats/mysql.c:130 src/cats/postgresql.c:128
+#: src/cats/bdb.c:152 src/cats/mysql.c:124 src/cats/postgresql.c:128
 #: src/cats/sqlite.c:122
 #, c-format
 msgid "Unable to initialize DB lock. ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:169
+#: src/cats/bdb.c:162
 #, c-format
 msgid "Unable to open Catalog DB control file %s: ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:224
+#: src/cats/bdb.c:217
 #, c-format
 msgid "Error reading catalog DB control file. ERR=%s\n"
 msgstr ""
 
-#: src/cats/bdb.c:227
+#: src/cats/bdb.c:220
 #, c-format
 msgid ""
 "Error, catalog DB control file wrong version. Wanted %d, got %d\n"
@@ -61,11 +61,11 @@ msgstr ""
 msgid "Error updating DB Media file. ERR=%s\n"
 msgstr ""
 
-#: src/cats/mysql.c:66
+#: src/cats/mysql.c:60
 msgid "A user name for MySQL must be supplied.\n"
 msgstr ""
 
-#: src/cats/mysql.c:167
+#: src/cats/mysql.c:161
 #, c-format
 msgid ""
 "Unable to connect to MySQL server. \n"
@@ -73,7 +73,7 @@ msgid ""
 "It is probably not running or your password is incorrect.\n"
 msgstr ""
 
-#: src/cats/mysql.c:326 src/cats/postgresql.c:264 src/cats/sqlite.c:323
+#: src/cats/mysql.c:321 src/cats/postgresql.c:266 src/cats/sqlite.c:323
 #, c-format
 msgid "Query failed: %s: ERR=%s\n"
 msgstr ""
@@ -90,7 +90,7 @@ msgid ""
 "It is probably not running or your password is incorrect.\n"
 msgstr ""
 
-#: src/cats/postgresql.c:506
+#: src/cats/postgresql.c:508
 #, c-format
 msgid "error fetching currval: %s\n"
 msgstr ""
@@ -133,15 +133,15 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:772
-#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:563
-#: src/cats/sql_get.c:638 src/cats/sql_get.c:865
+#: src/cats/sql.c:209 src/cats/sql.c:216 src/cats/sql_create.c:773
+#: src/cats/sql_get.c:180 src/cats/sql_get.c:231 src/cats/sql_get.c:564
+#: src/cats/sql_get.c:639 src/cats/sql_get.c:866
 #, c-format
 msgid "error fetching row: %s\n"
 msgstr ""
 
-#: src/cats/sql.c:326 src/dird/catreq.c:360 src/dird/catreq.c:392
-#: src/dird/catreq.c:417
+#: src/cats/sql.c:326 src/dird/catreq.c:367 src/dird/catreq.c:399
+#: src/dird/catreq.c:424
 #, c-format
 msgid "Attribute create error. %s"
 msgstr ""
@@ -160,215 +160,141 @@ msgstr ""
 msgid "Create DB Job record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:91 src/dird/dird_conf.c:532 src/dird/ua_cmds.c:422
-#: src/dird/ua_prune.c:454 src/dird/ua_run.c:643 src/dird/ua_select.c:228
-#: src/dird/ua_select.c:249
-msgid "Job"
-msgstr ""
-
-#: src/cats/sql_create.c:131
+#: src/cats/sql_create.c:132
 #, c-format
 msgid "Create JobMedia record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:140
+#: src/cats/sql_create.c:141
 #, c-format
 msgid "Update Media record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:170
+#: src/cats/sql_create.c:171
 #, c-format
 msgid "pool record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:196
+#: src/cats/sql_create.c:197
 #, c-format
 msgid "Create db Pool record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:201 src/dird/ua_run.c:650 src/dird/ua_select.c:464
-#: src/dird/ua_select.c:554 src/dird/ua_update.c:356 src/dird/ua_update.c:426
-#: src/wx-console/wxbrestorepanel.cpp:362
-#: src/wx-console/wxbrestorepanel.cpp:548
-#: src/wx-console/wxbrestorepanel.cpp:558
-#: src/wx-console/wxbrestorepanel.cpp:1754
-msgid "Pool"
-msgstr ""
-
-#: src/cats/sql_create.c:227
+#: src/cats/sql_create.c:228
 #, c-format
 msgid "Device record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:243
+#: src/cats/sql_create.c:244
 #, c-format
 msgid "Create db Device record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:248
-msgid "Device"
-msgstr ""
-
-#: src/cats/sql_create.c:276
+#: src/cats/sql_create.c:277
 #, c-format
 msgid "More than one Storage record!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:281
+#: src/cats/sql_create.c:282
 #, c-format
 msgid "error fetching Storage row: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:301
+#: src/cats/sql_create.c:302
 #, c-format
 msgid "Create DB Storage record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:306 src/dird/ua_run.c:642 src/dird/ua_select.c:152
-#: src/wx-console/wxbrestorepanel.cpp:363
-#: src/wx-console/wxbrestorepanel.cpp:379
-#: src/wx-console/wxbrestorepanel.cpp:500
-#: src/wx-console/wxbrestorepanel.cpp:501
-#: src/wx-console/wxbrestorepanel.cpp:511
-#: src/wx-console/wxbrestorepanel.cpp:512
-#: src/wx-console/wxbrestorepanel.cpp:1116
-#: src/wx-console/wxbrestorepanel.cpp:1765
-#: src/wx-console/wxbrestorepanel.cpp:1831
-msgid "Storage"
-msgstr ""
-
-#: src/cats/sql_create.c:333
+#: src/cats/sql_create.c:334
 #, c-format
 msgid "mediatype record %s already exists\n"
 msgstr ""
 
-#: src/cats/sql_create.c:349
+#: src/cats/sql_create.c:350
 #, c-format
 msgid "Create db mediatype record %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:354
-msgid "MediaType"
-msgstr ""
-
-#: src/cats/sql_create.c:383
+#: src/cats/sql_create.c:384
 #, c-format
 msgid "Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/cats/sql_create.c:421
+#: src/cats/sql_create.c:422
 #, c-format
 msgid "Create DB Media record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:425
-msgid "Media"
-msgstr ""
-
-#: src/cats/sql_create.c:469
+#: src/cats/sql_create.c:470
 #, c-format
 msgid "More than one Client!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:474
+#: src/cats/sql_create.c:475
 #, c-format
 msgid "error fetching Client row: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:501
+#: src/cats/sql_create.c:502
 #, c-format
 msgid "Create DB Client record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:507 src/dird/ua_run.c:645 src/dird/ua_select.c:272
-#: src/dird/ua_select.c:379 src/wx-console/wxbrestorepanel.cpp:360
-#: src/wx-console/wxbrestorepanel.cpp:378
-#: src/wx-console/wxbrestorepanel.cpp:452
-#: src/wx-console/wxbrestorepanel.cpp:453
-#: src/wx-console/wxbrestorepanel.cpp:463
-#: src/wx-console/wxbrestorepanel.cpp:464
-#: src/wx-console/wxbrestorepanel.cpp:707
-#: src/wx-console/wxbrestorepanel.cpp:1086
-#: src/wx-console/wxbrestorepanel.cpp:1173
-#: src/wx-console/wxbrestorepanel.cpp:1758
-#: src/wx-console/wxbrestorepanel.cpp:1760
-#: src/wx-console/wxbrestorepanel.cpp:1829
-#: src/wx-console/wxbrestorepanel.cpp:1884
-msgid "Client"
-msgstr ""
-
-#: src/cats/sql_create.c:544
+#: src/cats/sql_create.c:545
 #, c-format
 msgid "Create DB Counters record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:577
+#: src/cats/sql_create.c:578
 #, c-format
 msgid "More than one FileSet!: %d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:582
+#: src/cats/sql_create.c:583
 #, c-format
 msgid "error fetching FileSet row: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:612
+#: src/cats/sql_create.c:613
 #, c-format
 msgid "Create DB FileSet record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:618 src/dird/ua_restore.c:1035 src/dird/ua_run.c:644
-#: src/dird/ua_select.c:173
-msgid "FileSet"
-msgstr ""
-
-#: src/cats/sql_create.c:669
+#: src/cats/sql_create.c:670
 #, c-format
 msgid "Attempt to put non-attributes into catalog. Stream=%d\n"
 msgstr ""
 
-#: src/cats/sql_create.c:732
+#: src/cats/sql_create.c:733
 #, c-format
 msgid "Create db File record %s failed. ERR=%s"
 msgstr ""
 
-#: src/cats/sql_create.c:738 src/gnome2-console/restore.c:121
-msgid "File"
-msgstr ""
-
-#: src/cats/sql_create.c:765 src/cats/sql_get.c:224
+#: src/cats/sql_create.c:766 src/cats/sql_get.c:224
 #, c-format
 msgid "More than one Path!: %s for path: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:796
+#: src/cats/sql_create.c:797
 #, c-format
 msgid "Create db Path record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:802
-msgid "Path"
-msgstr ""
-
-#: src/cats/sql_create.c:829
+#: src/cats/sql_create.c:830
 #, c-format
 msgid "More than one Filename! %s for file: %s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:835
+#: src/cats/sql_create.c:836
 #, c-format
 msgid "Error fetching row for file=%s: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:851
+#: src/cats/sql_create.c:852
 #, c-format
 msgid "Create db Filename record %s failed. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_create.c:856 src/wx-console/wxbrestorepanel.cpp:314
-msgid "Filename"
-msgstr ""
-
 #: src/cats/sql_delete.c:79
 #, c-format
 msgid "No pool record %s exists\n"
@@ -407,27 +333,27 @@ msgid ""
 "CMD=%s\n"
 msgstr ""
 
-#: src/cats/sql_find.c:222
+#: src/cats/sql_find.c:224
 #, c-format
-msgid "Unknown Job level=%c\n"
+msgid "Unknown Job level=%d\n"
 msgstr ""
 
-#: src/cats/sql_find.c:232
+#: src/cats/sql_find.c:234
 #, c-format
 msgid "No Job found for: %s.\n"
 msgstr ""
 
-#: src/cats/sql_find.c:243
+#: src/cats/sql_find.c:245
 #, c-format
 msgid "No Job found for: %s\n"
 msgstr ""
 
-#: src/cats/sql_find.c:312
+#: src/cats/sql_find.c:317
 #, c-format
-msgid "Request for Volume item %d greater than max %d\n"
+msgid "Request for Volume item %d greater than max %d or less than 1.\n"
 msgstr ""
 
-#: src/cats/sql_find.c:324
+#: src/cats/sql_find.c:331
 #, c-format
 msgid "No Volume record found for item %d.\n"
 msgstr ""
@@ -491,104 +417,104 @@ msgstr ""
 msgid "No Job found for JobId %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:343 src/cats/sql_get.c:398
+#: src/cats/sql_get.c:344 src/cats/sql_get.c:399
 #, c-format
 msgid "No volumes found for JobId=%d\n"
 msgstr ""
 
-#: src/cats/sql_get.c:349 src/cats/sql_get.c:407
+#: src/cats/sql_get.c:350 src/cats/sql_get.c:408
 #, c-format
 msgid "Error fetching row %d: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:363
+#: src/cats/sql_get.c:364
 #, c-format
 msgid "No Volume for JobId %d found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:479
+#: src/cats/sql_get.c:480
 #, c-format
 msgid "Pool id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:516
+#: src/cats/sql_get.c:517
 #, c-format
 msgid "Client id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:558
+#: src/cats/sql_get.c:559
 #, c-format
 msgid "More than one Pool!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:599
+#: src/cats/sql_get.c:600
 msgid "Pool record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:633
+#: src/cats/sql_get.c:634
 #, c-format
 msgid "More than one Client!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:650 src/cats/sql_get.c:654
+#: src/cats/sql_get.c:651 src/cats/sql_get.c:655
 msgid "Client record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:679
+#: src/cats/sql_get.c:680
 #, c-format
 msgid "More than one Counter!: %d\n"
 msgstr ""
 
-#: src/cats/sql_get.c:684
+#: src/cats/sql_get.c:685
 #, c-format
 msgid "error fetching Counter row: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:704
+#: src/cats/sql_get.c:705
 #, c-format
 msgid "Counter record: %s not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:740
+#: src/cats/sql_get.c:741
 #, c-format
 msgid "Error got %s FileSets but expected only one!\n"
 msgstr ""
 
-#: src/cats/sql_get.c:745
+#: src/cats/sql_get.c:746
 #, c-format
 msgid "FileSet record \"%s\" not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:755
+#: src/cats/sql_get.c:756
 msgid "FileSet record not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:812
+#: src/cats/sql_get.c:813
 #, c-format
 msgid "Media id select failed: ERR=%s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:860
+#: src/cats/sql_get.c:861
 #, c-format
 msgid "More than one Volume!: %s\n"
 msgstr ""
 
-#: src/cats/sql_get.c:905
+#: src/cats/sql_get.c:906
 #, c-format
 msgid "Media record MediaId=%s not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:908
+#: src/cats/sql_get.c:909
 #, c-format
 msgid "Media record for Volume \"%s\" not found.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:915
+#: src/cats/sql_get.c:916
 #, c-format
 msgid "Media record for MediaId=%u not found in Catalog.\n"
 msgstr ""
 
-#: src/cats/sql_get.c:918
+#: src/cats/sql_get.c:919
 #, c-format
 msgid "Media record for Vol=%s not found in Catalog.\n"
 msgstr ""
@@ -608,7 +534,7 @@ msgstr ""
 msgid "Unable to open Database=%s. ERR=%s\n"
 msgstr ""
 
-#: src/cats/sqlite.c:162 src/lib/bnet_server.c:372
+#: src/cats/sqlite.c:162 src/lib/bnet_server.c:371
 msgid "unknown"
 msgstr ""
 
@@ -627,38 +553,38 @@ msgstr ""
 msgid "next_index update error: ERR=%s\n"
 msgstr ""
 
-#: src/console/authenticate.c:104 src/dird/authenticate.c:106
-#: src/dird/authenticate.c:206 src/filed/authenticate.c:124
-#: src/filed/authenticate.c:220 src/stored/authenticate.c:128
-#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:101
+#: src/console/authenticate.c:100 src/dird/authenticate.c:106
+#: src/dird/authenticate.c:206 src/filed/authenticate.c:119
+#: src/filed/authenticate.c:215 src/stored/authenticate.c:128
+#: src/stored/authenticate.c:232 src/wx-console/authenticate.c:106
 msgid ""
 "Authorization problem: Remote server did not advertise required TLS "
 "support.\n"
 msgstr ""
 
-#: src/console/authenticate.c:111 src/dird/authenticate.c:113
-#: src/dird/authenticate.c:213 src/filed/authenticate.c:132
-#: src/filed/authenticate.c:228 src/stored/authenticate.c:136
-#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:108
+#: src/console/authenticate.c:107 src/dird/authenticate.c:113
+#: src/dird/authenticate.c:213 src/filed/authenticate.c:127
+#: src/filed/authenticate.c:223 src/stored/authenticate.c:136
+#: src/stored/authenticate.c:240 src/wx-console/authenticate.c:112
 msgid "Authorization problem: Remote server requires TLS.\n"
 msgstr ""
 
-#: src/console/authenticate.c:121 src/wx-console/authenticate.c:118
+#: src/console/authenticate.c:117 src/wx-console/authenticate.c:121
 msgid "TLS negotiation failed\n"
 msgstr ""
 
-#: src/console/authenticate.c:133 src/gnome2-console/authenticate.c:85
+#: src/console/authenticate.c:129 src/gnome2-console/authenticate.c:85
 #: src/tray-monitor/authenticate.c:87
 #, c-format
 msgid "Bad response to Hello command: ERR=%s\n"
 msgstr ""
 
-#: src/console/authenticate.c:140 src/gnome2-console/authenticate.c:95
-#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:133
+#: src/console/authenticate.c:136 src/gnome2-console/authenticate.c:95
+#: src/tray-monitor/authenticate.c:94 src/wx-console/authenticate.c:136
 msgid "Director rejected Hello command\n"
 msgstr ""
 
-#: src/console/authenticate.c:150 src/wx-console/authenticate.c:143
+#: src/console/authenticate.c:146 src/wx-console/authenticate.c:146
 msgid ""
 "Director authorization problem.\n"
 "Most likely the passwords do not agree.\n"
@@ -703,7 +629,7 @@ msgstr ""
 msgid "output to file"
 msgstr ""
 
-#: src/console/console.c:152 src/dird/ua_cmds.c:106
+#: src/console/console.c:152 src/dird/ua_cmds.c:110
 msgid "quit"
 msgstr ""
 
@@ -715,7 +641,7 @@ msgstr ""
 msgid "sleep specified time"
 msgstr ""
 
-#: src/console/console.c:155 src/dird/ua_cmds.c:118
+#: src/console/console.c:155 src/dird/ua_cmds.c:122
 msgid "print current time"
 msgstr ""
 
@@ -723,7 +649,7 @@ msgstr ""
 msgid "print Console's version"
 msgstr ""
 
-#: src/console/console.c:157 src/dird/ua_cmds.c:95
+#: src/console/console.c:157 src/dird/ua_cmds.c:99
 msgid "exit = quit"
 msgstr ""
 
@@ -731,13 +657,12 @@ msgstr ""
 msgid "zed_keys = use zed keys instead of bash keys"
 msgstr ""
 
-#: src/console/console.c:191 src/dird/ua_dotcmds.c:106
+#: src/console/console.c:191 src/dird/ua_dotcmds.c:108
 msgid ": is an illegal command\n"
 msgstr ""
 
-#: src/console/console.c:400 src/dird/dird.c:196 src/filed/filed.c:183
-#: src/gnome2-console/console.c:271 src/stored/stored.c:189
-#: src/wx-console/console_thread.cpp:233
+#: src/console/console.c:400 src/filed/filed.c:183
+#: src/gnome2-console/console.c:271
 msgid "TLS library initialization failed.\n"
 msgstr ""
 
@@ -771,14 +696,14 @@ msgstr ""
 msgid "Connecting to Director %s:%d\n"
 msgstr ""
 
-#: src/console/console.c:471 src/gnome2-console/console.c:508
-#: src/wx-console/console_thread.cpp:367
+#: src/console/console.c:471 src/gnome2-console/console.c:504
+#: src/wx-console/console_thread.cpp:370
 #, c-format
 msgid "Failed to initialize TLS context for Console \"%s\".\n"
 msgstr ""
 
-#: src/console/console.c:492 src/gnome2-console/console.c:530
-#: src/wx-console/console_thread.cpp:388
+#: src/console/console.c:492 src/gnome2-console/console.c:526
+#: src/wx-console/console_thread.cpp:391
 #, c-format
 msgid "Failed to initialize TLS context for Director \"%s\".\n"
 msgstr ""
@@ -791,8 +716,8 @@ msgstr ""
 #: src/dird/dird.c:711 src/dird/dird.c:777 src/dird/dird.c:829
 #: src/filed/filed.c:302 src/filed/filed.c:348
 #: src/gnome2-console/console.c:140 src/gnome2-console/console.c:169
-#: src/stored/stored.c:310 src/wx-console/console_thread.cpp:96
-#: src/wx-console/console_thread.cpp:125
+#: src/stored/stored.c:311 src/wx-console/console_thread.cpp:94
+#: src/wx-console/console_thread.cpp:120
 msgid "TLS required but not configured in Bacula.\n"
 msgstr ""
 
@@ -840,18 +765,18 @@ msgid "Cannot open file %s for output. ERR=%s\n"
 msgstr ""
 
 #: src/console/console_conf.c:123 src/gnome2-console/console_conf.c:122
-#: src/wx-console/console_conf.c:124
+#: src/wx-console/console_conf.c:128
 #, c-format
 msgid "No record for %d %s\n"
 msgstr ""
 
-#: src/console/console_conf.c:132 src/wx-console/console_conf.c:133
+#: src/console/console_conf.c:132 src/wx-console/console_conf.c:137
 #, c-format
 msgid "Console: name=%s rcfile=%s histfile=%s\n"
 msgstr ""
 
 #: src/console/console_conf.c:136 src/gnome2-console/console_conf.c:131
-#: src/wx-console/console_conf.c:137
+#: src/wx-console/console_conf.c:141
 #, c-format
 msgid "Director: name=%s address=%s DIRport=%d\n"
 msgstr ""
@@ -861,25 +786,25 @@ msgstr ""
 #: src/filed/filed_conf.c:268 src/filed/filed_conf.c:327
 #: src/filed/filed_conf.c:357 src/gnome2-console/console_conf.c:142
 #: src/gnome2-console/console_conf.c:220 src/gnome2-console/console_conf.c:268
-#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:467
-#: src/stored/stored_conf.c:555 src/stored/stored_conf.c:590
-#: src/wx-console/console_conf.c:141 src/wx-console/console_conf.c:216
-#: src/wx-console/console_conf.c:261 src/wx-console/console_conf.c:288
+#: src/gnome2-console/console_conf.c:298 src/stored/stored_conf.c:510
+#: src/stored/stored_conf.c:598 src/stored/stored_conf.c:633
+#: src/wx-console/console_conf.c:145 src/wx-console/console_conf.c:220
+#: src/wx-console/console_conf.c:265 src/wx-console/console_conf.c:292
 #, c-format
 msgid "Unknown resource type %d\n"
 msgstr ""
 
-#: src/console/console_conf.c:242 src/dird/dird_conf.c:1109
-#: src/dird/dird_conf.c:1124 src/filed/filed_conf.c:296
+#: src/console/console_conf.c:242 src/dird/dird_conf.c:1112
+#: src/dird/dird_conf.c:1127 src/filed/filed_conf.c:296
 #: src/gnome2-console/console_conf.c:246 src/tray-monitor/tray_conf.c:262
-#: src/wx-console/console_conf.c:242
+#: src/wx-console/console_conf.c:246
 #, c-format
 msgid "%s item is required in %s resource, but not found.\n"
 msgstr ""
 
-#: src/console/console_conf.c:304 src/dird/dird_conf.c:1296
+#: src/console/console_conf.c:304 src/dird/dird_conf.c:1299
 #: src/filed/filed_conf.c:374 src/gnome2-console/console_conf.c:314
-#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:304
+#: src/tray-monitor/tray_conf.c:341 src/wx-console/console_conf.c:308
 #, c-format
 msgid "Attempt to define second %s resource named \"%s\" is not permitted.\n"
 msgstr ""
@@ -889,7 +814,7 @@ msgstr ""
 msgid "Start Admin JobId %d, Job=%s\n"
 msgstr ""
 
-#: src/dird/admin.c:82 src/dird/backup.c:339 src/dird/mac.c:228
+#: src/dird/admin.c:82 src/dird/backup.c:372 src/dird/mac.c:280
 #, c-format
 msgid "Error getting job record for stats: %s"
 msgstr ""
@@ -906,8 +831,8 @@ msgstr ""
 msgid "Admin Canceled"
 msgstr ""
 
-#: src/dird/admin.c:102 src/dird/backup.c:451 src/dird/mac.c:330
-#: src/dird/restore.c:258
+#: src/dird/admin.c:102 src/dird/backup.c:423 src/dird/mac.c:382
+#: src/dird/restore.c:250
 #, c-format
 msgid "Inappropriate term code: %c\n"
 msgstr ""
@@ -940,7 +865,7 @@ msgstr ""
 
 #: src/dird/authenticate.c:95
 msgid ""
-"Unable to authenticate with Storage daemon. Possible causes:\n"
+"Director unable to authenticate with Storage daemon. Possible causes:\n"
 "Passwords or names not the same or\n"
 "Maximum Concurrent Jobs exceeded on the SD or\n"
 "SD networking messed up (restart daemon).\n"
@@ -949,8 +874,8 @@ msgid ""
 msgstr ""
 
 #: src/dird/authenticate.c:123 src/dird/authenticate.c:223
-#: src/dird/authenticate.c:356 src/filed/authenticate.c:141
-#: src/filed/authenticate.c:237 src/stored/authenticate.c:145
+#: src/dird/authenticate.c:356 src/filed/authenticate.c:136
+#: src/filed/authenticate.c:232 src/stored/authenticate.c:145
 #: src/stored/authenticate.c:249
 msgid "TLS negotiation failed.\n"
 msgstr ""
@@ -1039,84 +964,72 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:92
-#: src/dird/ua_output.c:609
+#: src/dird/backup.c:88 src/dird/backup.c:94 src/dird/mac.c:124
+#: src/dird/ua_output.c:623
 #, c-format
 msgid "Pool %s not in database. %s"
 msgstr ""
 
-#: src/dird/backup.c:92 src/dird/mac.c:96 src/dird/ua_output.c:617
+#: src/dird/backup.c:92 src/dird/mac.c:128 src/dird/ua_output.c:631
 #, c-format
 msgid "Pool %s created in database.\n"
 msgstr ""
 
-#: src/dird/backup.c:117
+#: src/dird/backup.c:120
 msgid "Could not start clone job.\n"
 msgstr ""
 
-#: src/dird/backup.c:119
+#: src/dird/backup.c:122
 #, c-format
 msgid "Clone JobId %d started.\n"
 msgstr ""
 
-#: src/dird/backup.c:144
+#: src/dird/backup.c:148
 #, c-format
-msgid "Start Backup JobId %u, Job=%s\n"
+msgid "Start Backup JobId %s, Job=%s\n"
 msgstr ""
 
-#: src/dird/backup.c:272
+#: src/dird/backup.c:304
 #, c-format
 msgid "Unexpected Client Job message: %s\n"
 msgstr ""
 
-#: src/dird/backup.c:280
+#: src/dird/backup.c:312
 #, c-format
 msgid "Network error with FD during %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/backup.c:296
+#: src/dird/backup.c:328
 msgid "No Job status returned from FD.\n"
 msgstr ""
 
-#: src/dird/backup.c:346
+#: src/dird/backup.c:379
 #, c-format
 msgid "Error getting client record for stats: %s"
 msgstr ""
 
-#: src/dird/backup.c:352 src/dird/mac.c:235
+#: src/dird/backup.c:385 src/dird/mac.c:287
 #, c-format
 msgid "Error getting Media record for Volume \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/backup.c:380 src/dird/mac.c:263
-#, c-format
-msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
-msgstr ""
-
-#: src/dird/backup.c:414 src/dird/mac.c:293
-#, c-format
-msgid ""
-"Could not open WriteBootstrap file:\n"
-"%s: ERR=%s\n"
-msgstr ""
-
-#: src/dird/backup.c:424 src/dird/mac.c:303
+#: src/dird/backup.c:396 src/dird/mac.c:355
 msgid "Backup OK -- with warnings"
 msgstr ""
 
-#: src/dird/backup.c:426 src/dird/mac.c:305 src/stored/bscan.c:1054
+#: src/dird/backup.c:398 src/dird/mac.c:357 src/stored/bscan.c:1060
 msgid "Backup OK"
 msgstr ""
 
-#: src/dird/backup.c:431 src/dird/mac.c:310 src/stored/bscan.c:1058
+#: src/dird/backup.c:403 src/dird/mac.c:362 src/stored/bscan.c:1064
 msgid "*** Backup Error ***"
 msgstr ""
 
-#: src/dird/backup.c:441 src/dird/mac.c:320 src/stored/bscan.c:1061
+#: src/dird/backup.c:413 src/dird/mac.c:372 src/stored/bscan.c:1067
 msgid "Backup Canceled"
 msgstr ""
 
-#: src/dird/backup.c:491
+#: src/dird/backup.c:463
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -1130,17 +1043,18 @@ msgid ""
 "  Scheduled time:         %s\n"
 "  Start time:             %s\n"
 "  End time:               %s\n"
+"  Elapsed time:           %s\n"
 "  Priority:               %d\n"
 "  FD Files Written:       %s\n"
 "  SD Files Written:       %s\n"
-"  FD Bytes Written:       %s\n"
-"  SD Bytes Written:       %s\n"
+"  FD Bytes Written:       %s (%sB)\n"
+"  SD Bytes Written:       %s (%sB)\n"
 "  Rate:                   %.1f KB/s\n"
 "  Software Compression:   %s\n"
 "  Volume name(s):         %s\n"
 "  Volume Session Id:      %d\n"
 "  Volume Session Time:    %d\n"
-"  Last Volume Bytes:      %s\n"
+"  Last Volume Bytes:      %s (%sB)\n"
 "  Non-fatal FD errors:    %d\n"
 "  SD Errors:              %d\n"
 "  FD termination status:  %s\n"
@@ -1149,6 +1063,18 @@ msgid ""
 "\n"
 msgstr ""
 
+#: src/dird/backup.c:554 src/dird/mac.c:315
+#, c-format
+msgid "Could not get Job Volume Parameters to update Bootstrap file. ERR=%s\n"
+msgstr ""
+
+#: src/dird/backup.c:588 src/dird/mac.c:345
+#, c-format
+msgid ""
+"Could not open WriteBootstrap file:\n"
+"%s: ERR=%s\n"
+msgstr ""
+
 #: src/dird/bsr.c:155
 #, c-format
 msgid "Unable to get Job record. ERR=%s\n"
@@ -1159,29 +1085,29 @@ msgstr ""
 msgid "Unable to get Job Volume Parameters. ERR=%s\n"
 msgstr ""
 
-#: src/dird/bsr.c:201
+#: src/dird/bsr.c:212
 #, c-format
 msgid "Unable to create bootstrap file %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/bsr.c:210
+#: src/dird/bsr.c:221
 msgid "Error writing bsr file.\n"
 msgstr ""
 
-#: src/dird/bsr.c:216
+#: src/dird/bsr.c:227
 #, c-format
 msgid "Bootstrap records written to %s\n"
 msgstr ""
 
-#: src/dird/bsr.c:220
+#: src/dird/bsr.c:231
 msgid "The job will require the following Volumes:\n"
 msgstr ""
 
-#: src/dird/bsr.c:235
+#: src/dird/bsr.c:263
 msgid "No Volumes found to restore.\n"
 msgstr ""
 
-#: src/dird/catreq.c:109 src/dird/catreq.c:298
+#: src/dird/catreq.c:109 src/dird/catreq.c:295
 #, c-format
 msgid "1990 Invalid Catalog Request: %s"
 msgstr ""
@@ -1191,72 +1117,87 @@ msgstr ""
 msgid "Invalid Catalog request; DB not open: %s"
 msgstr ""
 
-#: src/dird/catreq.c:131
+#: src/dird/catreq.c:133
 msgid "1901 No Media.\n"
 msgstr ""
 
-#: src/dird/catreq.c:159
+#: src/dird/catreq.c:161
 msgid "not in Pool"
 msgstr ""
 
-#: src/dird/catreq.c:161
+#: src/dird/catreq.c:163
 msgid "not correct MediaType"
 msgstr ""
 
-#: src/dird/catreq.c:187
+#: src/dird/catreq.c:179
 #, c-format
 msgid "1998 Volume \"%s\" status is %s, %s.\n"
 msgstr ""
 
-#: src/dird/catreq.c:192
+#: src/dird/catreq.c:184
 #, c-format
 msgid "1997 Volume \"%s\" not in catalog.\n"
 msgstr ""
 
-#: src/dird/catreq.c:213
+#: src/dird/catreq.c:205
 #, c-format
 msgid "Unable to get Media record for Volume %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/catreq.c:215
+#: src/dird/catreq.c:207
 #, c-format
 msgid "1991 Catalog Request for vol=%s failed: %s"
 msgstr ""
 
-#: src/dird/catreq.c:235
+#: src/dird/catreq.c:227
 #, c-format
 msgid ""
 "Volume Files at %u being set to %u for Volume \"%s\". This is incorrect.\n"
 msgstr ""
 
-#: src/dird/catreq.c:238 src/dird/catreq.c:270
-msgid "1992 Update Media error\n"
+#: src/dird/catreq.c:230
+#, c-format
+msgid "1992 Update Media error. VolFiles=%u, CatFiles=%u\n"
 msgstr ""
 
-#: src/dird/catreq.c:268
+#: src/dird/catreq.c:262
 #, c-format
 msgid "Catalog error updating Media record. %s"
 msgstr ""
 
-#: src/dird/catreq.c:287
+#: src/dird/catreq.c:264
+msgid "1993 Update Media error\n"
+msgstr ""
+
+#: src/dird/catreq.c:284
 #, c-format
 msgid "Catalog error creating JobMedia record. %s"
 msgstr ""
 
-#: src/dird/catreq.c:289
+#: src/dird/catreq.c:286
 msgid "1991 Update JobMedia error\n"
 msgstr ""
 
-#: src/dird/catreq.c:299
+#: src/dird/catreq.c:296
 #, c-format
 msgid "Invalid Catalog request: %s"
 msgstr ""
 
-#: src/dird/catreq.c:398
+#: src/dird/catreq.c:330
+#, c-format
+msgid "1991 Invalid Catalog Update: %s"
+msgstr ""
+
+#: src/dird/catreq.c:331
+#, c-format
+msgid "Invalid Catalog Update; DB not open: %s"
+msgstr ""
+
+#: src/dird/catreq.c:405
 msgid "Got MD5/SHA1 but not same File as attributes\n"
 msgstr ""
 
-#: src/dird/catreq.c:422
+#: src/dird/catreq.c:429
 #, c-format
 msgid "Catalog error updating MD5/SHA1. %s"
 msgstr ""
@@ -1282,6 +1223,10 @@ msgid ""
 "\n"
 msgstr ""
 
+#: src/dird/dird.c:196 src/stored/stored.c:189
+msgid "Cryptography library initialization failed.\n"
+msgstr ""
+
 #: src/dird/dird.c:396
 msgid "Too many open reload requests. Request ignored.\n"
 msgstr ""
@@ -1311,17 +1256,17 @@ msgstr ""
 msgid "Only one Director resource permitted in %s\n"
 msgstr ""
 
-#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:362
+#: src/dird/dird.c:502 src/filed/filed.c:357 src/stored/stored.c:363
 #, c-format
 msgid "\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:368
+#: src/dird/dird.c:508 src/filed/filed.c:363 src/stored/stored.c:369
 #, c-format
 msgid "\"TLS Key\" file not defined for Director \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:374
+#: src/dird/dird.c:514 src/filed/filed.c:369 src/stored/stored.c:375
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
@@ -1329,7 +1274,7 @@ msgid ""
 "using \"TLS Verify Peer\".\n"
 msgstr ""
 
-#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:393
+#: src/dird/dird.c:533 src/filed/filed.c:388 src/stored/stored.c:394
 #, c-format
 msgid "Failed to initialize TLS context for Director \"%s\" in %s.\n"
 msgstr ""
@@ -1353,8 +1298,8 @@ msgstr ""
 msgid "Too many items in Job resource\n"
 msgstr ""
 
-#: src/dird/dird.c:672 src/dird/job.c:101 src/dird/ua_cmds.c:1425
-#: src/dird/ua_output.c:598
+#: src/dird/dird.c:672 src/dird/job.c:104 src/dird/ua_cmds.c:1621
+#: src/dird/ua_output.c:612
 #, c-format
 msgid "Could not open database \"%s\".\n"
 msgstr ""
@@ -1371,7 +1316,7 @@ msgid ""
 "Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird.c:733 src/stored/stored.c:348
+#: src/dird/dird.c:733 src/stored/stored.c:349
 #, c-format
 msgid "Failed to initialize TLS context for Storage \"%s\" in %s.\n"
 msgstr ""
@@ -1406,55 +1351,55 @@ msgid ""
 "File daemon \"%s\" in %s.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:441 src/tray-monitor/tray_conf.c:152
+#: src/dird/dird_conf.c:443 src/tray-monitor/tray_conf.c:152
 #, c-format
 msgid "No %s resource defined\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:450
+#: src/dird/dird_conf.c:452
 #, c-format
 msgid "Director: name=%s MaxJobs=%d FDtimeout=%s SDtimeout=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:455
+#: src/dird/dird_conf.c:457
 #, c-format
 msgid "   query_file=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:458 src/dird/dird_conf.c:483 src/dird/dird_conf.c:497
-#: src/dird/dird_conf.c:541 src/dird/dird_conf.c:545 src/dird/dird_conf.c:549
-#: src/dird/dird_conf.c:573 src/dird/dird_conf.c:578 src/dird/dird_conf.c:582
-#: src/dird/dird_conf.c:586 src/dird/dird_conf.c:590 src/dird/dird_conf.c:594
-#: src/dird/dird_conf.c:604
+#: src/dird/dird_conf.c:460 src/dird/dird_conf.c:485 src/dird/dird_conf.c:499
+#: src/dird/dird_conf.c:544 src/dird/dird_conf.c:548 src/dird/dird_conf.c:552
+#: src/dird/dird_conf.c:576 src/dird/dird_conf.c:581 src/dird/dird_conf.c:585
+#: src/dird/dird_conf.c:589 src/dird/dird_conf.c:593 src/dird/dird_conf.c:597
+#: src/dird/dird_conf.c:607
 msgid "  --> "
 msgstr ""
 
-#: src/dird/dird_conf.c:464 src/dird/dird_conf.c:467
+#: src/dird/dird_conf.c:466 src/dird/dird_conf.c:469
 #, c-format
 msgid "Console: name=%s SSL=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:473
+#: src/dird/dird_conf.c:475
 #, c-format
 msgid "Counter: name=%s min=%d max=%d cur=%d wrapcntr=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:478
+#: src/dird/dird_conf.c:480
 #, c-format
 msgid "Counter: name=%s min=%d max=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:489
+#: src/dird/dird_conf.c:491
 #, c-format
 msgid "Client: name=%s address=%s FDport=%d MaxJobs=%u\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:492
+#: src/dird/dird_conf.c:494
 #, c-format
 msgid "      JobRetention=%s FileRetention=%s AutoPrune=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:504
+#: src/dird/dird_conf.c:506
 #, c-format
 msgid ""
 "Device: name=%s ok=%d num_writers=%d max_writers=%d\n"
@@ -1463,245 +1408,252 @@ msgid ""
 "      poolid=%s volname=%s MediaType=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:514
+#: src/dird/dird_conf.c:516
 #, c-format
 msgid ""
 "Storage: name=%s address=%s SDport=%d MaxJobs=%u\n"
 "      DeviceName=%s MediaType=%s StorageId=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:523
+#: src/dird/dird_conf.c:525
 #, c-format
 msgid ""
 "Catalog: name=%s address=%s DBport=%d db_name=%s\n"
 "      db_user=%s MutliDBConn=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:531
+#: src/dird/dird_conf.c:533
 #, c-format
-msgid "%s: name=%s JobType=%d level=%s Priority=%d MaxJobs=%u\n"
+msgid "%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n"
+msgstr ""
+
+#: src/dird/dird_conf.c:534 src/dird/ua_cmds.c:441 src/dird/ua_prune.c:454
+#: src/dird/ua_run.c:643 src/dird/ua_select.c:234 src/dird/ua_select.c:257
+msgid "Job"
 msgstr ""
 
-#: src/dird/dird_conf.c:532
+#: src/dird/dird_conf.c:534
 msgid "JobDefs"
 msgstr ""
 
-#: src/dird/dird_conf.c:536
+#: src/dird/dird_conf.c:538
 #, c-format
-msgid "     Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%d\n"
+msgid ""
+"     MaxJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%"
+"d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:553
+#: src/dird/dird_conf.c:556
 #, c-format
 msgid "  --> Where=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:556
+#: src/dird/dird_conf.c:559
 #, c-format
 msgid "  --> Bootstrap=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:559
+#: src/dird/dird_conf.c:562
 #, c-format
 msgid "  --> RunBefore=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:562
+#: src/dird/dird_conf.c:565
 #, c-format
 msgid "  --> RunAfter=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:565
+#: src/dird/dird_conf.c:568
 #, c-format
 msgid "  --> RunAfterFailed=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:568
+#: src/dird/dird_conf.c:571
 #, c-format
 msgid "  --> WriteBootstrap=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:600
+#: src/dird/dird_conf.c:603
 #, c-format
 msgid "  --> Run=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:611
+#: src/dird/dird_conf.c:614
 #, c-format
 msgid "FileSet: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:673 src/dird/dird_conf.c:752
+#: src/dird/dird_conf.c:676 src/dird/dird_conf.c:755
 #, c-format
 msgid "Schedule: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:678
+#: src/dird/dird_conf.c:681
 #, c-format
 msgid "  --> Run Level=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:679
+#: src/dird/dird_conf.c:682
 msgid "      hour="
 msgstr ""
 
-#: src/dird/dird_conf.c:688
+#: src/dird/dird_conf.c:691
 msgid "      mday="
 msgstr ""
 
-#: src/dird/dird_conf.c:697
+#: src/dird/dird_conf.c:700
 msgid "      month="
 msgstr ""
 
-#: src/dird/dird_conf.c:706
+#: src/dird/dird_conf.c:709
 msgid "      wday="
 msgstr ""
 
-#: src/dird/dird_conf.c:715
+#: src/dird/dird_conf.c:718
 msgid "      wom="
 msgstr ""
 
-#: src/dird/dird_conf.c:724
+#: src/dird/dird_conf.c:727
 msgid "      woy="
 msgstr ""
 
-#: src/dird/dird_conf.c:733
+#: src/dird/dird_conf.c:736
 #, c-format
 msgid "      mins=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:735 src/dird/dird_conf.c:739 src/dird/dird_conf.c:743
+#: src/dird/dird_conf.c:738 src/dird/dird_conf.c:742 src/dird/dird_conf.c:746
 msgid "     --> "
 msgstr ""
 
-#: src/dird/dird_conf.c:756
+#: src/dird/dird_conf.c:759
 #, c-format
 msgid "Pool: name=%s PoolType=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:758
+#: src/dird/dird_conf.c:761
 #, c-format
 msgid "      use_cat=%d use_once=%d acpt_any=%d cat_files=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:761
+#: src/dird/dird_conf.c:764
 #, c-format
 msgid "      max_vols=%d auto_prune=%d VolRetention=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:764
+#: src/dird/dird_conf.c:767
 #, c-format
 msgid "      VolUse=%s recycle=%d LabelFormat=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:768
+#: src/dird/dird_conf.c:771
 #, c-format
 msgid "      CleaningPrefix=%s LabelType=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:770
+#: src/dird/dird_conf.c:773
 #, c-format
 msgid "      RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:776
+#: src/dird/dird_conf.c:779
 #, c-format
 msgid "Messages: name=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:778
+#: src/dird/dird_conf.c:781
 #, c-format
 msgid "      mailcmd=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:780
+#: src/dird/dird_conf.c:783
 #, c-format
 msgid "      opcmd=%s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:783 src/tray-monitor/tray_conf.c:179
+#: src/dird/dird_conf.c:786 src/tray-monitor/tray_conf.c:179
 #, c-format
 msgid "Unknown resource type %d in dump_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1077 src/tray-monitor/tray_conf.c:232
+#: src/dird/dird_conf.c:1080 src/tray-monitor/tray_conf.c:232
 #, c-format
 msgid "Unknown resource type %d in free_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1115 src/lib/parse_conf.c:211
+#: src/dird/dird_conf.c:1118 src/lib/parse_conf.c:211
 #: src/tray-monitor/tray_conf.c:268
 #, c-format
 msgid "Too many items in %s resource\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1149
+#: src/dird/dird_conf.c:1152
 #, c-format
 msgid "Cannot find Console resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1155 src/filed/filed_conf.c:316
-#: src/stored/stored_conf.c:523
+#: src/dird/dird_conf.c:1158 src/filed/filed_conf.c:316
+#: src/stored/stored_conf.c:566
 #, c-format
 msgid "Cannot find Director resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1162 src/stored/stored_conf.c:529
+#: src/dird/dird_conf.c:1165 src/stored/stored_conf.c:572
 #, c-format
 msgid "Cannot find Storage resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1171
+#: src/dird/dird_conf.c:1174
 #, c-format
 msgid "Cannot find Job resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1189
+#: src/dird/dird_conf.c:1192
 #, c-format
 msgid "Cannot find Counter resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1197 src/filed/filed_conf.c:322
+#: src/dird/dird_conf.c:1200 src/filed/filed_conf.c:322
 #, c-format
 msgid "Cannot find Client resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1209
+#: src/dird/dird_conf.c:1212
 #, c-format
 msgid "Cannot find Schedule resource %s\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1214 src/tray-monitor/tray_conf.c:287
+#: src/dird/dird_conf.c:1217 src/tray-monitor/tray_conf.c:287
 #, c-format
 msgid "Unknown resource type %d in save_resource.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1274 src/tray-monitor/tray_conf.c:322
+#: src/dird/dird_conf.c:1277 src/tray-monitor/tray_conf.c:322
 #, c-format
 msgid "Unknown resource type %d in save_resrouce.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1289
+#: src/dird/dird_conf.c:1292
 #, c-format
 msgid "Name item is required in %s resource, but not found.\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1301
+#: src/dird/dird_conf.c:1304
 #, c-format
 msgid "Inserting %s res: %s index=%d pass=%d\n"
 msgstr ""
 
-#: src/dird/dird_conf.c:1374
+#: src/dird/dird_conf.c:1377
 #, c-format
 msgid "Expected a Job Type keyword, got: %s"
 msgstr ""
 
-#: src/dird/dird_conf.c:1398
+#: src/dird/dird_conf.c:1401
 #, c-format
 msgid "Expected a Job Level keyword, got: %s"
 msgstr ""
 
-#: src/dird/dird_conf.c:1418
+#: src/dird/dird_conf.c:1421
 #, c-format
 msgid "Expected a Restore replacement option, got: %s"
 msgstr ""
@@ -1741,174 +1693,179 @@ msgstr ""
 msgid "Cannot destroy var context: ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:73 src/tray-monitor/tray-monitor.c:867
+#: src/dird/fd_cmds.c:74 src/tray-monitor/tray-monitor.c:867
 msgid "File daemon"
 msgstr ""
 
-#: src/dird/fd_cmds.c:104
+#: src/dird/fd_cmds.c:105
 #, c-format
 msgid "File daemon \"%s\" rejected Job command: %s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:117
+#: src/dird/fd_cmds.c:118
 #, c-format
 msgid "Error updating Client record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:122
+#: src/dird/fd_cmds.c:123
 #, c-format
 msgid "FD gave bad response to JobId command: %s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:144 src/dird/fd_cmds.c:180
+#: src/dird/fd_cmds.c:145 src/dird/fd_cmds.c:181
 msgid ", since="
 msgstr ""
 
-#: src/dird/fd_cmds.c:164
+#: src/dird/fd_cmds.c:165
 msgid "No prior or suitable Full backup found. Doing FULL backup.\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:165 src/dird/fd_cmds.c:173
+#: src/dird/fd_cmds.c:166 src/dird/fd_cmds.c:174
 #, c-format
 msgid " (upgraded from %s)"
 msgstr ""
 
-#: src/dird/fd_cmds.c:171
+#: src/dird/fd_cmds.c:172
 #, c-format
 msgid "Prior failed job found. Upgrading to %s.\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:196
+#: src/dird/fd_cmds.c:197
 msgid "since_utime "
 msgstr ""
 
-#: src/dird/fd_cmds.c:232
+#: src/dird/fd_cmds.c:233
 #, c-format
 msgid "Unimplemented backup level %d %c\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:320 src/filed/job.c:565
+#: src/dird/fd_cmds.c:321 src/filed/job.c:559
 #, c-format
 msgid "Cannot run program: %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:331 src/dird/fd_cmds.c:356 src/dird/fd_cmds.c:370
+#: src/dird/fd_cmds.c:332 src/dird/fd_cmds.c:357 src/dird/fd_cmds.c:371
 msgid ">filed: write error on socket\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:337
+#: src/dird/fd_cmds.c:338
 #, c-format
 msgid "Error running program: %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:346
+#: src/dird/fd_cmds.c:347
 #, c-format
 msgid "Cannot open included file: %s. ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:441 src/filed/job.c:1617
+#: src/dird/fd_cmds.c:442 src/filed/job.c:1637
 #, c-format
 msgid "Could not open bootstrap file %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:526
+#: src/dird/fd_cmds.c:527
 #, c-format
 msgid ""
 "<filed: bad attributes, expected 3 fields got %d\n"
 "msglen=%d msg=%s\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:571 src/dird/verify.c:696
+#: src/dird/fd_cmds.c:572 src/dird/verify.c:697
 #, c-format
 msgid "MD5/SHA1 index %d not same as attributes %d\n"
 msgstr ""
 
-#: src/dird/fd_cmds.c:588
+#: src/dird/fd_cmds.c:589
 #, c-format
 msgid "<filed: Network error getting attributes. ERR=%s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:135
+#: src/dird/getmsg.c:130
 #, c-format
 msgid "bget_dirmsg: unknown bnet signal %d\n"
 msgstr ""
 
-#: src/dird/getmsg.c:153 src/dird/getmsg.c:166 src/dird/getmsg.c:178
-#: src/dird/getmsg.c:225 src/dird/getmsg.c:249
+#: src/dird/getmsg.c:148 src/dird/getmsg.c:161 src/dird/getmsg.c:173
+#: src/dird/getmsg.c:220 src/dird/getmsg.c:244
 #, c-format
 msgid "Malformed message: %s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:159
+#: src/dird/getmsg.c:154
 #, c-format
 msgid "Job not found: %s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:318
+#: src/dird/getmsg.c:313
 #, c-format
 msgid "Bad response to %s command: wanted %s, got %s\n"
 msgstr ""
 
-#: src/dird/getmsg.c:323
+#: src/dird/getmsg.c:318
 #, c-format
 msgid "Socket error on %s command: ERR=%s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:249
+#: src/dird/inc_conf.c:251
 #, c-format
 msgid "Expected a FileSet option keyword, got:%s:"
 msgstr ""
 
-#: src/dird/inc_conf.c:282
+#: src/dird/inc_conf.c:284
 msgid "Old style Include/Exclude not supported\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:310 src/dird/inc_conf.c:577
+#: src/dird/inc_conf.c:312 src/dird/inc_conf.c:584
 #, c-format
 msgid "Expecting keyword, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:318 src/dird/inc_conf.c:583 src/lib/parse_conf.c:819
+#: src/dird/inc_conf.c:320 src/dird/inc_conf.c:590 src/lib/parse_conf.c:819
 #, c-format
 msgid "expected an equals, got: %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:328 src/dird/inc_conf.c:592
+#: src/dird/inc_conf.c:330 src/dird/inc_conf.c:599
 #, c-format
 msgid "Keyword %s not permitted in this resource"
 msgstr ""
 
-#: src/dird/inc_conf.c:381
+#: src/dird/inc_conf.c:383
 #, c-format
 msgid "Regex compile error. ERR=%s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:402
+#: src/dird/inc_conf.c:404
 #, c-format
 msgid "Expected a regex string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:488
+#: src/dird/inc_conf.c:490
 #, c-format
 msgid "Expected a wild-card string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:511
+#: src/dird/inc_conf.c:513
 #, c-format
 msgid "Expected an fstype string, got: %s\n"
 msgstr ""
 
-#: src/dird/inc_conf.c:546
+#: src/dird/inc_conf.c:537
+#, c-format
+msgid "Backslash found. Use forward slashes or quote the string.: %s\n"
+msgstr ""
+
+#: src/dird/inc_conf.c:552
 #, c-format
 msgid "Expected a filename, got: %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:562
+#: src/dird/inc_conf.c:569
 #, c-format
 msgid "Expecting open brace. Got %s"
 msgstr ""
 
-#: src/dird/inc_conf.c:617
+#: src/dird/inc_conf.c:624
 #, c-format
 msgid "Expected a FileSet keyword, got: %s"
 msgstr ""
@@ -1918,159 +1875,174 @@ msgstr ""
 msgid "Could not init job queue: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:488
+#: src/dird/job.c:86 src/stored/dircmd.c:174 src/stored/stored.c:449
 #, c-format
 msgid "Unable to init job cond variable: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:139
+#: src/dird/job.c:140
 #, c-format
 msgid "Could not add job queue: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:178
+#: src/dird/job.c:177
 msgid "Job canceled because max start delay time exceeded.\n"
 msgstr ""
 
-#: src/dird/job.c:229 src/dird/job.c:307
+#: src/dird/job.c:228 src/dird/job.c:321
 #, c-format
 msgid "Unimplemented job type: %d\n"
 msgstr ""
 
-#: src/dird/job.c:254
+#: src/dird/job.c:253
 #, c-format
 msgid "RunBefore: %s"
 msgstr ""
 
-#: src/dird/job.c:259
+#: src/dird/job.c:258
 #, c-format
 msgid "RunBeforeJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:325
+#: src/dird/job.c:339
 #, c-format
 msgid "RunAfter: %s"
 msgstr ""
 
-#: src/dird/job.c:335
+#: src/dird/job.c:349
 #, c-format
 msgid "RunAfterJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:337
+#: src/dird/job.c:351
 #, c-format
 msgid "RunAfterFailedJob error: ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:376
+#: src/dird/job.c:390
 #, c-format
 msgid "JobId %d, Job %s marked to be canceled.\n"
 msgstr ""
 
-#: src/dird/job.c:387
+#: src/dird/job.c:401
 msgid "Failed to connect to File daemon.\n"
 msgstr ""
 
-#: src/dird/job.c:409 src/dird/ua_cmds.c:619 src/dird/ua_cmds.c:1266
-#: src/dird/ua_label.c:691
+#: src/dird/job.c:423 src/dird/ua_cmds.c:680 src/dird/ua_cmds.c:1327
+#: src/dird/ua_label.c:712
 msgid "Failed to connect to Storage daemon.\n"
 msgstr ""
 
-#: src/dird/job.c:545 src/dird/job.c:593
+#: src/dird/job.c:557 src/dird/job.c:605
 #, c-format
 msgid "Unhandled job status code %d\n"
 msgstr ""
 
-#: src/dird/job.c:621 src/stored/bscan.c:902
+#: src/dird/job.c:633 src/stored/bscan.c:908
 #, c-format
 msgid "Could not create Client record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:653
+#: src/dird/job.c:665
 msgid "FileSet MD5 signature not found.\n"
 msgstr ""
 
-#: src/dird/job.c:658
+#: src/dird/job.c:670
 #, c-format
 msgid "Could not create FileSet \"%s\" record. ERR=%s\n"
 msgstr ""
 
-#: src/dird/job.c:697
+#: src/dird/job.c:709
 #, c-format
 msgid "Error updating job record. %s"
 msgstr ""
 
-#: src/dird/jobq.c:67
+#: src/dird/jobq.c:62
 #, c-format
 msgid "pthread_attr_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:76
+#: src/dird/jobq.c:71
 #, c-format
 msgid "pthread_mutex_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:82
+#: src/dird/jobq.c:77
 #, c-format
 msgid "pthread_cond_init: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:115 src/dird/jobq.c:242 src/dird/jobq.c:307
-#: src/dird/jobq.c:388
+#: src/dird/jobq.c:110 src/dird/jobq.c:234 src/dird/jobq.c:299
+#: src/dird/jobq.c:380
 #, c-format
 msgid "pthread_mutex_lock: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:128
+#: src/dird/jobq.c:123
 #, c-format
 msgid "pthread_cond_broadcast: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:136
+#: src/dird/jobq.c:131
 #, c-format
 msgid "pthread_cond_wait: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:144
+#: src/dird/jobq.c:139
 #, c-format
 msgid "pthread_mutex_unlock: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:180
+#: src/dird/jobq.c:175
 #, c-format
 msgid "Job %s waiting %d seconds for scheduled start time.\n"
 msgstr ""
 
-#: src/dird/jobq.c:235
+#: src/dird/jobq.c:227
 #, c-format
 msgid "pthread_thread_create: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:353
+#: src/dird/jobq.c:345
 #, c-format
 msgid "pthread_cond_signal: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:362
+#: src/dird/jobq.c:354
 #, c-format
 msgid "pthread_create: ERR=%s\n"
 msgstr ""
 
-#: src/dird/jobq.c:487
+#: src/dird/jobq.c:481
 #, c-format
 msgid "Rescheduled Job %s at %s to re-run in %d seconds.\n"
 msgstr ""
 
-#: src/dird/mac.c:59 src/dird/verify.c:92
+#: src/dird/mac.c:77 src/dird/verify.c:92
 msgid "Unable to find JobId of previous Job for this client.\n"
 msgstr ""
 
-#: src/dird/mac.c:133
+#: src/dird/mac.c:85 src/dird/verify.c:108
+#, c-format
+msgid "Could not get job record for previous Job. ERR=%s"
+msgstr ""
+
+#: src/dird/mac.c:90 src/dird/verify.c:113
+#, c-format
+msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
+msgstr ""
+
+#: src/dird/mac.c:94
+#, c-format
+msgid "%s using JobId=%d Job=%s\n"
+msgstr ""
+
+#: src/dird/mac.c:185
 #, c-format
-msgid "Start %s JobId %u, Job=%s\n"
+msgid "Start %s JobId %s, Job=%s\n"
 msgstr ""
 
-#: src/dird/mac.c:369
+#: src/dird/mac.c:421
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -2100,22 +2072,22 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/msgchan.c:78 src/filed/job.c:1128
+#: src/dird/msgchan.c:80 src/filed/job.c:1125
 #: src/tray-monitor/tray-monitor.c:874
 msgid "Storage daemon"
 msgstr ""
 
-#: src/dird/msgchan.c:157
+#: src/dird/msgchan.c:171
 #, c-format
 msgid "Storage daemon rejected Job command: %s\n"
 msgstr ""
 
-#: src/dird/msgchan.c:164
+#: src/dird/msgchan.c:178
 #, c-format
 msgid "<stored: bad response to Job command: %s\n"
 msgstr ""
 
-#: src/dird/msgchan.c:211
+#: src/dird/msgchan.c:262
 #, c-format
 msgid ""
 "\n"
@@ -2123,7 +2095,14 @@ msgid ""
 "     %s"
 msgstr ""
 
-#: src/dird/msgchan.c:241 src/dird/msgchan.c:382
+#: src/dird/msgchan.c:266
+#, c-format
+msgid ""
+"\n"
+"     Storage daemon didn't accept Device \"%s\" command.\n"
+msgstr ""
+
+#: src/dird/msgchan.c:289 src/dird/msgchan.c:434
 #, c-format
 msgid "Cannot create message thread: %s\n"
 msgstr ""
@@ -2147,85 +2126,137 @@ msgstr ""
 msgid "Too many failures. Giving up creating Volume name.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:124
-#, c-format
-msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
-msgstr ""
-
-#: src/dird/next_vol.c:150
+#: src/dird/next_vol.c:128
 #, c-format
 msgid "Purging oldest volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:156
+#: src/dird/next_vol.c:134
 #, c-format
 msgid "Pruning oldest volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:175
+#: src/dird/next_vol.c:153
 msgid "We seem to be looping trying to find the next volume. I give up.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:200
+#: src/dird/next_vol.c:178
 #, c-format
 msgid "Max Volume bytes exceeded. Marking Volume \"%s\" as Full.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:207
+#: src/dird/next_vol.c:185
 #, c-format
 msgid "Volume used once. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:214
+#: src/dird/next_vol.c:192
 #, c-format
 msgid "Max Volume jobs exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:221
+#: src/dird/next_vol.c:199
 #, c-format
 msgid "Max Volume files exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:231
+#: src/dird/next_vol.c:209
 #, c-format
 msgid "Max configured use duration exceeded. Marking Volume \"%s\" as Used.\n"
 msgstr ""
 
-#: src/dird/next_vol.c:241
+#: src/dird/next_vol.c:219
 #, c-format
 msgid "Catalog error updating volume \"%s\". ERR=%s"
 msgstr ""
 
-#: src/dird/next_vol.c:262
+#: src/dird/next_vol.c:240
 msgid "volume has expired"
 msgstr ""
 
-#: src/dird/next_vol.c:280 src/dird/next_vol.c:316
+#: src/dird/next_vol.c:258 src/dird/next_vol.c:294
 #, c-format
 msgid "Recycled current volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/next_vol.c:285
+#: src/dird/next_vol.c:263
 msgid "and recycling of current volume failed"
 msgstr ""
 
-#: src/dird/next_vol.c:291
+#: src/dird/next_vol.c:269
 msgid "but should be Append, Purged or Recycle"
 msgstr ""
 
-#: src/dird/next_vol.c:319
+#: src/dird/next_vol.c:297
 msgid ""
 "but should be Append, Purged or Recycle (recycling of the current volume "
 "failed)"
 msgstr ""
 
-#: src/dird/next_vol.c:323
+#: src/dird/next_vol.c:301
 msgid ""
 "but should be Append, Purged or Recycle (cannot automatically recycle "
-"current volume, as it still contains unpruned data)"
+"current volume, as it still contains unpruned data or the Volume Retention "
+"time has not expired.)"
+msgstr ""
+
+#: src/dird/next_vol.c:342
+#, c-format
+msgid "Unable to get Pool record: ERR=%s"
+msgstr ""
+
+#: src/dird/next_vol.c:347
+#, c-format
+msgid "Unable add Scratch Volume, Pool \"%s\" full MaxVols=%d\n"
+msgstr ""
+
+#: src/dird/next_vol.c:360
+#, c-format
+msgid "Failed to move Scratch Volume. ERR=%s\n"
+msgstr ""
+
+#: src/dird/next_vol.c:364
+#, c-format
+msgid "Using Volume \"%s\" from 'Scratch' pool.\n"
+msgstr ""
+
+#: src/dird/next_vol.c:372
+#, c-format
+msgid "Unable to update Volume record: ERR=%s"
+msgstr ""
+
+#: src/dird/pythondir.c:107 src/filed/pythonfd.c:96 src/filed/pythonfd.c:150
+#: src/filed/pythonfd.c:214 src/stored/pythonsd.c:90 src/stored/pythonsd.c:155
+msgid "Job pointer not found."
+msgstr ""
+
+#: src/dird/pythondir.c:139
+msgid "Pool record not found."
+msgstr ""
+
+#: src/dird/pythondir.c:168 src/filed/pythonfd.c:127 src/stored/pythonsd.c:132
+#, c-format
+msgid "Attribute %s not found."
+msgstr ""
+
+#: src/dird/pythondir.c:211 src/dird/pythondir.c:217 src/filed/pythonfd.c:169
+#: src/stored/pythonsd.c:172
+msgid "Read-only attribute"
+msgstr ""
+
+#: src/dird/pythondir.c:243
+msgid "Priority must be 1-100"
+msgstr ""
+
+#: src/dird/pythondir.c:248
+msgid "Job Level can be set only during JobInit"
 msgstr ""
 
-#: src/dird/recycle.c:102
+#: src/dird/pythondir.c:259
+msgid "Bad JobLevel string"
+msgstr ""
+
+#: src/dird/recycle.c:99
 #, c-format
 msgid "Recycled volume \"%s\"\n"
 msgstr ""
@@ -2239,23 +2270,23 @@ msgstr ""
 msgid "Start Restore Job %s\n"
 msgstr ""
 
-#: src/dird/restore.c:231
+#: src/dird/restore.c:223
 msgid "Restore OK -- warning file count mismatch"
 msgstr ""
 
-#: src/dird/restore.c:233
+#: src/dird/restore.c:225
 msgid "Restore OK"
 msgstr ""
 
-#: src/dird/restore.c:238
+#: src/dird/restore.c:230
 msgid "*** Restore Error ***"
 msgstr ""
 
-#: src/dird/restore.c:248
+#: src/dird/restore.c:240
 msgid "Restore Canceled"
 msgstr ""
 
-#: src/dird/restore.c:275
+#: src/dird/restore.c:267
 #, c-format
 msgid ""
 "Bacula %s (%s): %s\n"
@@ -2365,15 +2396,15 @@ msgstr ""
 msgid "Job %s not found\n"
 msgstr ""
 
-#: src/dird/scheduler.c:102
+#: src/dird/scheduler.c:103
 msgid "Walk queue"
 msgstr ""
 
-#: src/dird/scheduler.c:112
+#: src/dird/scheduler.c:113
 msgid "Dequeued job"
 msgstr ""
 
-#: src/dird/scheduler.c:115
+#: src/dird/scheduler.c:116
 msgid "Scheduler logic error\n"
 msgstr ""
 
@@ -2381,170 +2412,180 @@ msgstr ""
 msgid "Run job"
 msgstr ""
 
-#: src/dird/scheduler.c:345
+#: src/dird/scheduler.c:349
 msgid "Inserted job"
 msgstr ""
 
-#: src/dird/scheduler.c:353
+#: src/dird/scheduler.c:357
 msgid "Appended job"
 msgstr ""
 
-#: src/dird/scheduler.c:357
+#: src/dird/scheduler.c:361
 msgid "Run queue"
 msgstr ""
 
-#: src/dird/ua_cmds.c:88
+#: src/dird/ua_cmds.c:90
 msgid "add media to a pool"
 msgstr ""
 
-#: src/dird/ua_cmds.c:89
+#: src/dird/ua_cmds.c:91
 msgid "autodisplay [on|off] -- console messages"
 msgstr ""
 
-#: src/dird/ua_cmds.c:90
+#: src/dird/ua_cmds.c:92
 msgid "automount [on|off] -- after label"
 msgstr ""
 
-#: src/dird/ua_cmds.c:91
+#: src/dird/ua_cmds.c:93
 msgid "cancel [<jobid=nnn> | <job=name>] -- cancel a job"
 msgstr ""
 
-#: src/dird/ua_cmds.c:92
+#: src/dird/ua_cmds.c:94
 msgid "create DB Pool from resource"
 msgstr ""
 
-#: src/dird/ua_cmds.c:93
+#: src/dird/ua_cmds.c:95
 msgid "delete [pool=<pool-name> | media volume=<volume-name>]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:94
+#: src/dird/ua_cmds.c:96
+msgid "disable <job=name> -- disable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:97
+msgid "enable <job=name> -- enable a job"
+msgstr ""
+
+#: src/dird/ua_cmds.c:98
 msgid "performs FileSet estimate, listing gives full listing"
 msgstr ""
 
-#: src/dird/ua_cmds.c:96
+#: src/dird/ua_cmds.c:100
 msgid "gui [on|off] -- non-interactive gui mode"
 msgstr ""
 
-#: src/dird/ua_cmds.c:97 src/stored/btape.c:2533
+#: src/dird/ua_cmds.c:101 src/stored/btape.c:2540
 msgid "print this command"
 msgstr ""
 
-#: src/dird/ua_cmds.c:98
+#: src/dird/ua_cmds.c:102
 msgid ""
 "list [pools | jobs | jobtotals | media <pool=pool-name> | files <jobid=nn>]; "
 "from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:99
+#: src/dird/ua_cmds.c:103
 msgid "label a tape"
 msgstr ""
 
-#: src/dird/ua_cmds.c:100
+#: src/dird/ua_cmds.c:104
 msgid "full or long list like list command"
 msgstr ""
 
-#: src/dird/ua_cmds.c:101
+#: src/dird/ua_cmds.c:105
 msgid "messages"
 msgstr ""
 
-#: src/dird/ua_cmds.c:102
+#: src/dird/ua_cmds.c:106
 msgid "mount <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:103
+#: src/dird/ua_cmds.c:107
 msgid "prune expired records from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:104
+#: src/dird/ua_cmds.c:108
 msgid "purge records from catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:105
+#: src/dird/ua_cmds.c:109
 msgid "python control commands"
 msgstr ""
 
-#: src/dird/ua_cmds.c:107
+#: src/dird/ua_cmds.c:111
 msgid "query catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:108
+#: src/dird/ua_cmds.c:112
 msgid "restore files"
 msgstr ""
 
-#: src/dird/ua_cmds.c:109
+#: src/dird/ua_cmds.c:113
 msgid "relabel a tape"
 msgstr ""
 
-#: src/dird/ua_cmds.c:110
+#: src/dird/ua_cmds.c:114
 msgid "release <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:111
+#: src/dird/ua_cmds.c:115
 msgid "reload conf file"
 msgstr ""
 
-#: src/dird/ua_cmds.c:112
+#: src/dird/ua_cmds.c:116
 msgid "run <job-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:113
+#: src/dird/ua_cmds.c:117
 msgid "status [storage | client]=<name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:114
+#: src/dird/ua_cmds.c:118
 msgid "sets debug level"
 msgstr ""
 
-#: src/dird/ua_cmds.c:115
+#: src/dird/ua_cmds.c:119
 msgid "sets new client address -- if authorized"
 msgstr ""
 
-#: src/dird/ua_cmds.c:116
+#: src/dird/ua_cmds.c:120
 msgid "show (resource records) [jobs | pools | ... | all]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:117
+#: src/dird/ua_cmds.c:121
 msgid "use SQL to query catalog"
 msgstr ""
 
-#: src/dird/ua_cmds.c:119
+#: src/dird/ua_cmds.c:123
 msgid "turn on/off trace to file"
 msgstr ""
 
-#: src/dird/ua_cmds.c:120
+#: src/dird/ua_cmds.c:124
 msgid "unmount <storage-name>"
 msgstr ""
 
-#: src/dird/ua_cmds.c:121
+#: src/dird/ua_cmds.c:125
 msgid "umount <storage-name> for old-time Unix guys"
 msgstr ""
 
-#: src/dird/ua_cmds.c:122
+#: src/dird/ua_cmds.c:126
 msgid "update Volume, Pool or slots"
 msgstr ""
 
-#: src/dird/ua_cmds.c:123
+#: src/dird/ua_cmds.c:127
 msgid "use catalog xxx"
 msgstr ""
 
-#: src/dird/ua_cmds.c:124
+#: src/dird/ua_cmds.c:128
 msgid "does variable expansion"
 msgstr ""
 
-#: src/dird/ua_cmds.c:125
+#: src/dird/ua_cmds.c:129
 msgid "print Director version"
 msgstr ""
 
-#: src/dird/ua_cmds.c:126
-msgid "wait until no jobs are running"
+#: src/dird/ua_cmds.c:130
+msgid ""
+"wait until no jobs are running [<jobname=name> | <jobid=nnn> | "
+"<ujobid=complete_name>]"
 msgstr ""
 
-#: src/dird/ua_cmds.c:158
+#: src/dird/ua_cmds.c:168
 #, c-format
 msgid "%s: is an illegal command.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:196
+#: src/dird/ua_cmds.c:206
 msgid ""
 "You probably don't want to be using this command since it\n"
 "creates database records without labeling the Volumes.\n"
@@ -2552,220 +2593,234 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:215
+#: src/dird/ua_cmds.c:225
 #, c-format
-msgid "Pool already has maximum volumes = %d\n"
+msgid "Pool already has maximum volumes=%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:217
+#: src/dird/ua_cmds.c:227
 msgid "Enter new maximum (zero for unlimited): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:238
+#: src/dird/ua_cmds.c:248
 #, c-format
 msgid "Enter number of Volumes to create. 0=>fixed name. Max=%d: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:244
+#: src/dird/ua_cmds.c:254
 #, c-format
 msgid "The number must be between 0 and %d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:251
+#: src/dird/ua_cmds.c:261
 msgid "Enter Volume name: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:255
+#: src/dird/ua_cmds.c:265
 msgid "Enter base volume name: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:264 src/dird/ua_label.c:590
+#: src/dird/ua_cmds.c:274 src/dird/ua_label.c:609
 msgid "Volume name too long.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:268 src/dird/ua_label.c:596 src/lib/edit.c:413
+#: src/dird/ua_cmds.c:278 src/dird/ua_label.c:615 src/lib/edit.c:446
 msgid "Volume name must be at least one character long.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:277
+#: src/dird/ua_cmds.c:287
 msgid "Enter the starting number: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:282
+#: src/dird/ua_cmds.c:292
 msgid "Start number must be greater than zero.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:293
+#: src/dird/ua_cmds.c:303
 msgid "Enter slot (0 for none): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:297
+#: src/dird/ua_cmds.c:307
 msgid "InChanger? yes/no: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:324
+#: src/dird/ua_cmds.c:334
 #, c-format
 msgid "%d Volumes created in pool %s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:340 src/dird/ua_cmds.c:866
+#: src/dird/ua_cmds.c:350 src/dird/ua_cmds.c:927
 msgid "Turn on or off? "
 msgstr ""
 
-#: src/dird/ua_cmds.c:348 src/dird/ua_cmds.c:874
+#: src/dird/ua_cmds.c:358 src/dird/ua_cmds.c:935
 msgid "off"
 msgstr ""
 
-#: src/dird/ua_cmds.c:368
+#: src/dird/ua_cmds.c:378
 msgid "jobid"
 msgstr ""
 
-#: src/dird/ua_cmds.c:375
+#: src/dird/ua_cmds.c:385
 #, c-format
 msgid "JobId %s is not running. Use Job name to cancel inactive jobs.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:379
+#: src/dird/ua_cmds.c:389
 msgid "job"
 msgstr ""
 
-#: src/dird/ua_cmds.c:384
+#: src/dird/ua_cmds.c:394 src/dird/ua_cmds.c:404
 #, c-format
 msgid "Warning Job %s is not running. Continuing anyway ...\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:407 src/filed/status.c:193 src/stored/status.c:315
+#: src/dird/ua_cmds.c:399
+msgid "ujobid"
+msgstr ""
+
+#: src/dird/ua_cmds.c:427 src/filed/status.c:195 src/stored/status.c:343
 msgid "No Jobs running.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:410
+#: src/dird/ua_cmds.c:430
 msgid "Select Job:\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:417
+#: src/dird/ua_cmds.c:436
 #, c-format
 msgid "JobId=%s Job=%s"
 msgstr ""
 
-#: src/dird/ua_cmds.c:422
+#: src/dird/ua_cmds.c:441
 msgid "Choose Job to cancel"
 msgstr ""
 
-#: src/dird/ua_cmds.c:426
+#: src/dird/ua_cmds.c:445
 msgid "Confirm cancel (yes/no): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:434
+#: src/dird/ua_cmds.c:452
 #, c-format
 msgid "Job %s not found.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:539
+#: src/dird/ua_cmds.c:557
 #, c-format
 msgid ""
 "Error: Pool %s already exists.\n"
 "Use update to change it.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:550
+#: src/dird/ua_cmds.c:568
 #, c-format
 msgid "Pool %s created.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:563
+#: src/dird/ua_cmds.c:581
 msgid "restart"
 msgstr ""
 
-#: src/dird/ua_cmds.c:567
+#: src/dird/ua_cmds.c:585
 msgid "Python interpreter restarted.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:569 src/dird/ua_cmds.c:1094
+#: src/dird/ua_cmds.c:587 src/dird/ua_cmds.c:1155
 msgid "Nothing done.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:585
+#: src/dird/ua_cmds.c:603 src/dird/ua_cmds.c:649
 msgid "Illegal command from this console.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:592 src/dird/ua_run.c:353
+#: src/dird/ua_cmds.c:610 src/dird/ua_run.c:353
 #, c-format
 msgid "Client \"%s\" not found.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:601
+#: src/dird/ua_cmds.c:619
 #, c-format
 msgid "Client \"%s\" address set to %s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:616 src/dird/ua_status.c:286
+#: src/dird/ua_cmds.c:644
+#, c-format
+msgid "Job \"%s\" not found.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:653
+#, c-format
+msgid "Job \"%s\" %sabled\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:677 src/dird/ua_status.c:286
 #, c-format
 msgid "Connecting to Storage daemon %s at %s:%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:622 src/dird/ua_status.c:297
+#: src/dird/ua_cmds.c:683 src/dird/ua_status.c:297
 msgid "Connected to storage daemon\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:642 src/dird/ua_cmds.c:981 src/dird/ua_status.c:324
+#: src/dird/ua_cmds.c:703 src/dird/ua_cmds.c:1042 src/dird/ua_status.c:324
 #, c-format
 msgid "Connecting to Client %s at %s:%d\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:645 src/dird/ua_cmds.c:984
+#: src/dird/ua_cmds.c:706 src/dird/ua_cmds.c:1045
 msgid "Failed to connect to Client.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:761
+#: src/dird/ua_cmds.c:822
 msgid "Enter new debug level: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:827
+#: src/dird/ua_cmds.c:888
 msgid "Available daemons are: \n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:832
+#: src/dird/ua_cmds.c:893
 msgid "Select daemon type to set debug level"
 msgstr ""
 
-#: src/dird/ua_cmds.c:936 src/dird/ua_run.c:478
+#: src/dird/ua_cmds.c:997 src/dird/ua_run.c:478
 #, c-format
 msgid "Level %s not valid.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:949
+#: src/dird/ua_cmds.c:1010
 msgid "No job specified.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:989
+#: src/dird/ua_cmds.c:1050
 msgid "Error sending include list.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:994
+#: src/dird/ua_cmds.c:1055
 msgid "Error sending exclude list.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1080
+#: src/dird/ua_cmds.c:1141
 msgid ""
 "In general it is not a good idea to delete either a\n"
 "Pool or a Volume since they may contain data.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1083
+#: src/dird/ua_cmds.c:1144
 msgid "Choose catalog item to delete"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1151
+#: src/dird/ua_cmds.c:1212
 msgid "Enter JobId to delete: "
 msgstr ""
 
-#: src/dird/ua_cmds.c:1194
+#: src/dird/ua_cmds.c:1255
 #, c-format
 msgid "Job %s and associated records deleted from the catalog.\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1207
+#: src/dird/ua_cmds.c:1268
 #, c-format
 msgid ""
 "\n"
@@ -2773,58 +2828,70 @@ msgid ""
 "and all Jobs saved on that volume from the Catalog\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1211
+#: src/dird/ua_cmds.c:1272
 msgid "Are you sure you want to delete this Volume? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:1232
+#: src/dird/ua_cmds.c:1293
 msgid "Are you sure you want to delete this Pool? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_cmds.c:1329
+#: src/dird/ua_cmds.c:1390
 #, c-format
 msgid "Using Catalog name=%s DB=%s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1370 src/dird/ua_tree.c:594 src/stored/btape.c:2580
+#: src/dird/ua_cmds.c:1450
+msgid "ERR: Can't open db\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1486
+msgid "ERR: Job was not found\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1562 src/dird/ua_tree.c:629 src/stored/btape.c:2587
 #, c-format
 msgid ""
 "  Command    Description\n"
 "  =======    ===========\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1372
+#: src/dird/ua_cmds.c:1564
 #, c-format
 msgid "  %-10s %s\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1374
+#: src/dird/ua_cmds.c:1566
 msgid ""
 "\n"
 "When at a prompt, entering a period cancels the command.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1390
+#: src/dird/ua_cmds.c:1582
 #, c-format
 msgid "%s Version: %s (%s)\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1409
+#: src/dird/ua_cmds.c:1601
 msgid "Could not find a Catalog resource\n"
 msgstr ""
 
-#: src/dird/ua_cmds.c:1412
+#: src/dird/ua_cmds.c:1604
+msgid "You must specify a \"use <catalog-name>\" command before continuing.\n"
+msgstr ""
+
+#: src/dird/ua_cmds.c:1608
 #, c-format
 msgid "Using default Catalog name=%s DB=%s\n"
 msgstr ""
 
-#: src/dird/ua_dotcmds.c:121
+#: src/dird/ua_dotcmds.c:131
 msgid "The Director will segment fault.\n"
 msgstr ""
 
-#: src/dird/ua_dotcmds.c:221 src/dird/ua_restore.c:747
-#: src/dird/ua_restore.c:785
+#: src/dird/ua_dotcmds.c:245 src/dird/ua_restore.c:737
+#: src/dird/ua_restore.c:775 src/dird/ua_restore.c:806
 #, c-format
 msgid "Query failed: %s. ERR=%s\n"
 msgstr ""
@@ -2838,15 +2905,16 @@ msgstr ""
 msgid "Expected a positive integer, got: %s\n"
 msgstr ""
 
-#: src/dird/ua_input.c:120 src/dird/ua_run.c:860 src/dird/ua_select.c:54
-#: src/dird/ua_update.c:232 src/dird/ua_update.c:247 src/dird/ua_update.c:495
-#: src/stored/parse_bsr.c:741 src/tools/dbcheck.c:1098
+#: src/dird/ua_input.c:120 src/dird/ua_run.c:862 src/dird/ua_select.c:54
+#: src/dird/ua_update.c:223 src/dird/ua_update.c:237 src/dird/ua_update.c:247
+#: src/dird/ua_update.c:261 src/dird/ua_update.c:552
+#: src/stored/parse_bsr.c:770 src/tools/dbcheck.c:1098
 msgid "yes"
 msgstr ""
 
-#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:234
-#: src/dird/ua_update.c:247 src/dird/ua_update.c:495
-#: src/stored/parse_bsr.c:741
+#: src/dird/ua_input.c:124 src/dird/ua_select.c:57 src/dird/ua_update.c:225
+#: src/dird/ua_update.c:237 src/dird/ua_update.c:249 src/dird/ua_update.c:261
+#: src/dird/ua_update.c:552 src/stored/parse_bsr.c:770
 msgid "no"
 msgstr ""
 
@@ -2854,220 +2922,210 @@ msgstr ""
 msgid "Invalid response. You must answer yes or no.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:88
+#: src/dird/ua_label.c:89
 msgid "Negative numbers not permitted\n"
 msgstr ""
 
-#: src/dird/ua_label.c:94
+#: src/dird/ua_label.c:95
 msgid "Range end is not integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:99
+#: src/dird/ua_label.c:100
 msgid "Range start is not an integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:105
+#: src/dird/ua_label.c:106
 msgid "Range end not bigger than start.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:111
+#: src/dird/ua_label.c:112
 msgid "Input value is not an integer.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:117
+#: src/dird/ua_label.c:118
 msgid "Values must be be greater than zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:121
+#: src/dird/ua_label.c:122
 msgid "Slot too large.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:176 src/dird/ua_label.c:463
+#: src/dird/ua_label.c:176 src/dird/ua_label.c:477
 msgid "No slots in changer to scan.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:188 src/dird/ua_label.c:474
+#: src/dird/ua_label.c:188 src/dird/ua_label.c:488
 msgid "No Volumes found to label, or no barcodes.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:195
+#: src/dird/ua_label.c:198
 #, c-format
-msgid "Slot %d larger than max %d ignored.\n"
+msgid "Slot %d greater than max %d ignored.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:224
+#: src/dird/ua_label.c:227
 #, c-format
-msgid "No VolName for Slot=%d set InChanger to zero.\n"
+msgid "No VolName for Slot=%d InChanger set to zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:239
+#: src/dird/ua_label.c:242
 #, c-format
 msgid "Catalog record for Volume \"%s\" updated to reference slot %d.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:243
+#: src/dird/ua_label.c:246
 #, c-format
 msgid "Catalog record for Volume \"%s\" is up to date.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:249
+#: src/dird/ua_label.c:252
 #, c-format
-msgid "Record for Volume \"%s\" not found in catalog.\n"
+msgid "Volume \"%s\" not found in catalog. Slot=%d InChanger set to zero.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:334
+#: src/dird/ua_label.c:348
 #, c-format
 msgid ""
 "Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before "
 "relabeling.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:350
+#: src/dird/ua_label.c:364
 msgid "Enter new Volume name: "
 msgstr ""
 
-#: src/dird/ua_label.c:363
+#: src/dird/ua_label.c:377
 #, c-format
 msgid "Media record for new Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:378
+#: src/dird/ua_label.c:392
 msgid "Enter slot (0 or Enter for none): "
 msgstr ""
 
-#: src/dird/ua_label.c:403
+#: src/dird/ua_label.c:417
 #, c-format
 msgid "Delete of Volume \"%s\" failed. ERR=%s"
 msgstr ""
 
-#: src/dird/ua_label.c:406
+#: src/dird/ua_label.c:420
 #, c-format
 msgid "Old volume \"%s\" deleted from catalog.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:417
+#: src/dird/ua_label.c:431
 #, c-format
 msgid "Requesting to mount %s ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:439
+#: src/dird/ua_label.c:453
 msgid "Do not forget to mount the drive!!!\n"
 msgstr ""
 
-#: src/dird/ua_label.c:479
+#: src/dird/ua_label.c:493
 msgid ""
 "The following Volumes will be labeled:\n"
 "Slot  Volume\n"
 "==============\n"
 msgstr ""
 
-#: src/dird/ua_label.c:488 src/stored/btape.c:608
+#: src/dird/ua_label.c:502 src/stored/btape.c:606
 msgid "Do you want to continue? (y/n): "
 msgstr ""
 
-#: src/dird/ua_label.c:509
+#: src/dird/ua_label.c:523
 #, c-format
 msgid "Media record for Slot %d Volume \"%s\" already exists.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:515
+#: src/dird/ua_label.c:529
 #, c-format
 msgid "Error setting InChanger: ERR=%s"
 msgstr ""
 
-#: src/dird/ua_label.c:540
+#: src/dird/ua_label.c:552
+#, c-format
+msgid "Maximum pool Volumes=%d reached.\n"
+msgstr ""
+
+#: src/dird/ua_label.c:559
 #, c-format
 msgid "Catalog record for cleaning tape \"%s\" successfully created.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:547
+#: src/dird/ua_label.c:566
 #, c-format
 msgid "Catalog error on cleaning tape: %s"
 msgstr ""
 
-#: src/dird/ua_label.c:583
+#: src/dird/ua_label.c:602
 #, c-format
 msgid "Illegal character \"%c\" in a volume name.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:628
+#: src/dird/ua_label.c:647
 #, c-format
 msgid "Sending relabel command from \"%s\" to \"%s\" ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:635
+#: src/dird/ua_label.c:654
 #, c-format
 msgid "Sending label command for Volume \"%s\" Slot %d ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:665
+#: src/dird/ua_label.c:686
 #, c-format
 msgid "Catalog record for Volume \"%s\", Slot %d  successfully created.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:678
+#: src/dird/ua_label.c:699
 #, c-format
 msgid "Label command failed for Volume %s.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:688
+#: src/dird/ua_label.c:709
 #, c-format
 msgid "Connecting to Storage daemon %s at %s:%d ...\n"
 msgstr ""
 
-#: src/dird/ua_label.c:716
+#: src/dird/ua_label.c:737
 msgid "Could not open SD socket.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:722
-#, c-format
-msgid "readlabel %s Slot=%d drive=%d\n"
-msgstr ""
-
-#: src/dird/ua_label.c:764
-#, c-format
-msgid "autochanger list %s \n"
-msgstr ""
-
-#: src/dird/ua_label.c:788 src/dird/ua_label.c:798
+#: src/dird/ua_label.c:809 src/dird/ua_label.c:819
 #, c-format
 msgid "Invalid Slot number: %s\n"
 msgstr ""
 
-#: src/dird/ua_label.c:807
+#: src/dird/ua_label.c:828
 #, c-format
 msgid "Invalid Volume name: %s\n"
 msgstr ""
 
-#: src/dird/ua_label.c:876
-#, c-format
-msgid "autochanger slots %s \n"
-msgstr ""
-
-#: src/dird/ua_label.c:886
+#: src/dird/ua_label.c:907
 #, c-format
 msgid "Device \"%s\" has %d slots.\n"
 msgstr ""
 
-#: src/dird/ua_label.c:902
+#: src/dird/ua_label.c:956
 #, c-format
 msgid "Pool \"%s\" resource not found!\n"
 msgstr ""
 
-#: src/dird/ua_output.c:64 src/dird/ua_output.c:90
+#: src/dird/ua_output.c:64 src/dird/ua_output.c:88
 msgid "ON or OFF keyword missing.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:178
+#: src/dird/ua_output.c:176
 msgid "Keywords for the show command are:\n"
 msgstr ""
 
-#: src/dird/ua_output.c:184
+#: src/dird/ua_output.c:182
 #, c-format
 msgid "%s resource %s not found.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:187
+#: src/dird/ua_output.c:185
 #, c-format
 msgid "Resource %s not found\n"
 msgstr ""
@@ -3076,49 +3134,55 @@ msgstr ""
 msgid "Hey! DB is NULL\n"
 msgstr ""
 
-#: src/dird/ua_output.c:353
+#: src/dird/ua_output.c:367
 #, c-format
 msgid "Jobid %d used %d Volume(s): %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:365
+#: src/dird/ua_output.c:385
 msgid "No Pool specified.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:375 src/dird/ua_select.c:446
+#: src/dird/ua_output.c:396 src/dird/ua_select.c:458
 #, c-format
 msgid "Error obtaining pool ids. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:385
+#: src/dird/ua_output.c:406
 #, c-format
 msgid "Pool: %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:396
-msgid "No Volume Name specified.\n"
+#: src/dird/ua_output.c:422 src/dird/ua_status.c:455
+msgid "Ignoring illegal value for days.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:409
+#: src/dird/ua_output.c:431
 #, c-format
 msgid "Unknown list keyword: %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:434
+#: src/dird/ua_output.c:457
 #, c-format
 msgid "%s is not a job name.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:450 src/dird/ua_output.c:462
-msgid "Could not find next Volume.\n"
+#: src/dird/ua_output.c:481
+#, c-format
+msgid "Could not find next Volume for Job %s (%s, %s).\n"
+msgstr ""
+
+#: src/dird/ua_output.c:485
+#, c-format
+msgid "The next Volume to be used by Job \"%s\" (%s, %s) will be %s\n"
 msgstr ""
 
-#: src/dird/ua_output.c:452
+#: src/dird/ua_output.c:495
 #, c-format
-msgid "The next Volume to be used by Job \"%s\" will be %s\n"
+msgid "Could not find next Volume for Job %s.\n"
 msgstr ""
 
-#: src/dird/ua_output.c:671
+#: src/dird/ua_output.c:685
 msgid "You have no messages.\n"
 msgstr ""
 
@@ -3278,32 +3342,32 @@ msgstr ""
 msgid "End query mode.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:151
+#: src/dird/ua_restore.c:115
 msgid ""
 "No Restore Job Resource found in bacula-dir.conf.\n"
 "You must create at least one before running this command.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:167
+#: src/dird/ua_restore.c:131
 msgid "Restore not done.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:178
+#: src/dird/ua_restore.c:142
 msgid "Unable to construct a valid BSR. Cannot continue.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:182 src/dird/ua_restore.c:196
+#: src/dird/ua_restore.c:146 src/dird/ua_restore.c:160
 msgid "No files selected to be restored.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:190
+#: src/dird/ua_restore.c:154
 msgid ""
 "\n"
 "1 file selected to be restored.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:193
+#: src/dird/ua_restore.c:157
 #, c-format
 msgid ""
 "\n"
@@ -3311,80 +3375,85 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:211
+#: src/dird/ua_restore.c:175
 msgid "No Restore Job resource found!\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:309
+#: src/dird/ua_restore.c:234
+#, c-format
+msgid "Missing value for keyword: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:283
 msgid "List last 20 Jobs run"
 msgstr ""
 
-#: src/dird/ua_restore.c:310
+#: src/dird/ua_restore.c:284
 msgid "List Jobs where a given File is saved"
 msgstr ""
 
-#: src/dird/ua_restore.c:311
+#: src/dird/ua_restore.c:285
 msgid "Enter list of comma separated JobIds to select"
 msgstr ""
 
-#: src/dird/ua_restore.c:312
+#: src/dird/ua_restore.c:286
 msgid "Enter SQL list command"
 msgstr ""
 
-#: src/dird/ua_restore.c:313
+#: src/dird/ua_restore.c:287
 msgid "Select the most recent backup for a client"
 msgstr ""
 
-#: src/dird/ua_restore.c:314
+#: src/dird/ua_restore.c:288
 msgid "Select backup for a client before a specified time"
 msgstr ""
 
-#: src/dird/ua_restore.c:315
+#: src/dird/ua_restore.c:289
 msgid "Enter a list of files to restore"
 msgstr ""
 
-#: src/dird/ua_restore.c:316
+#: src/dird/ua_restore.c:290
 msgid "Enter a list of files to restore before a specified time"
 msgstr ""
 
-#: src/dird/ua_restore.c:317
+#: src/dird/ua_restore.c:291
 msgid "Find the JobIds of the most recent backup for a client"
 msgstr ""
 
-#: src/dird/ua_restore.c:318
+#: src/dird/ua_restore.c:292
 msgid "Find the JobIds for a backup for a client before a specified time"
 msgstr ""
 
-#: src/dird/ua_restore.c:319
+#: src/dird/ua_restore.c:293
 msgid "Enter a list of directories to restore for found JobIds"
 msgstr ""
 
-#: src/dird/ua_restore.c:320 src/dird/ua_status.c:702 src/filed/status.c:249
-#: src/stored/status.c:367 src/wx-console/wxbconfigpanel.cpp:191
+#: src/dird/ua_restore.c:294 src/dird/ua_status.c:722 src/filed/status.c:251
+#: src/stored/status.c:412 src/wx-console/wxbconfigpanel.cpp:191
 msgid "Cancel"
 msgstr ""
 
-#: src/dird/ua_restore.c:356
+#: src/dird/ua_restore.c:330
 #, c-format
 msgid "Unknown keyword: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:374
+#: src/dird/ua_restore.c:354
 #, c-format
 msgid "Improper date format: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:408 src/dird/ua_select.c:576
+#: src/dird/ua_restore.c:394 src/dird/ua_select.c:590
 #, c-format
 msgid "Error: Pool resource \"%s\" does not exist.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:413
+#: src/dird/ua_restore.c:399
 #, c-format
 msgid "Error: Pool resource \"%s\" access not allowed.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:432
+#: src/dird/ua_restore.c:418
 msgid ""
 "\n"
 "First you select one or more JobIds that contain files\n"
@@ -3394,217 +3463,226 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:444
+#: src/dird/ua_restore.c:430
 msgid "To select the JobIds, you have the following choices:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:449
+#: src/dird/ua_restore.c:435
 msgid "Select item: "
 msgstr ""
 
-#: src/dird/ua_restore.c:463
+#: src/dird/ua_restore.c:449
 msgid "Enter Filename (no path):"
 msgstr ""
 
-#: src/dird/ua_restore.c:478 src/dird/ua_restore.c:578
+#: src/dird/ua_restore.c:464 src/dird/ua_restore.c:564
 msgid "Enter JobId(s), comma separated, to restore: "
 msgstr ""
 
-#: src/dird/ua_restore.c:484
+#: src/dird/ua_restore.c:470
 msgid "Enter SQL list command: "
 msgstr ""
 
-#: src/dird/ua_restore.c:512 src/dird/ua_restore.c:537
+#: src/dird/ua_restore.c:498 src/dird/ua_restore.c:523
 msgid ""
 "Enter file names with paths, or < to enter a filename\n"
-"containg a list of file names with paths, and terminate\n"
+"containing a list of file names with paths, and terminate\n"
 "them with a blank line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:516 src/dird/ua_restore.c:541
+#: src/dird/ua_restore.c:502 src/dird/ua_restore.c:527
 msgid "Enter full filename: "
 msgstr ""
 
-#: src/dird/ua_restore.c:576
+#: src/dird/ua_restore.c:562
 #, c-format
 msgid "You have already seleted the following JobIds: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:591
+#: src/dird/ua_restore.c:577
 msgid ""
 "Enter full directory names or start the name\n"
-"with a < to indicate it is a filename containg a list\n"
+"with a < to indicate it is a filename containing a list\n"
 "of directories and terminate them with a blank line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:595
+#: src/dird/ua_restore.c:581
 msgid "Enter directory name: "
 msgstr ""
 
-#: src/dird/ua_restore.c:620
+#: src/dird/ua_restore.c:606
 msgid "No Jobs selected.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:624
+#: src/dird/ua_restore.c:610
 #, c-format
 msgid "You have selected the following JobIds: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:627
+#: src/dird/ua_restore.c:613
 #, c-format
 msgid "You have selected the following JobId: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:636
+#: src/dird/ua_restore.c:621
 msgid "Invalid JobId in list.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:648
+#: src/dird/ua_restore.c:634
 #, c-format
 msgid "Unable to get Job record for JobId=%s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:653
+#: src/dird/ua_restore.c:639
 #, c-format
 msgid "No authorization. Job \"%s\" not selected.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:667
+#: src/dird/ua_restore.c:653
 msgid ""
 "The restored files will the most current backup\n"
 "BEFORE the date you specify below.\n"
 "\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:670
+#: src/dird/ua_restore.c:656
 msgid "Enter date as YYYY-MM-DD HH:MM:SS :"
 msgstr ""
 
-#: src/dird/ua_restore.c:676
+#: src/dird/ua_restore.c:662
 msgid "Improper date format.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:697
+#: src/dird/ua_restore.c:683
 #, c-format
 msgid "Cannot open file %s: ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:705 src/dird/ua_restore.c:709
+#: src/dird/ua_restore.c:691 src/dird/ua_restore.c:695
 #, c-format
 msgid "Error occurred on line %d of %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:751 src/dird/ua_restore.c:789
+#: src/dird/ua_restore.c:741 src/dird/ua_restore.c:779
 #, c-format
 msgid "No database record found for: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:776
+#: src/dird/ua_restore.c:766
 msgid "No JobId specified cannot continue.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:895
+#: src/dird/ua_restore.c:810
+#, c-format
+msgid "No table found: %s\n"
+msgstr ""
+
+#: src/dird/ua_restore.c:915
 #, c-format
 msgid ""
 "\n"
 "Building directory tree for JobId %s ...  "
 msgstr ""
 
-#: src/dird/ua_restore.c:914
+#: src/dird/ua_restore.c:934
 msgid ""
 "\n"
 "There were no files inserted into the tree, so file selection\n"
 "is not possible.Most likely your retention policy pruned the files\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:916
+#: src/dird/ua_restore.c:936
 msgid ""
 "\n"
 "Do you want to restore all the files? (yes|no): "
 msgstr ""
 
-#: src/dird/ua_restore.c:932
+#: src/dird/ua_restore.c:952
 #, c-format
 msgid ""
 "\n"
 "1 Job, %s files inserted into the tree and marked for extraction.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:936
+#: src/dird/ua_restore.c:956
 #, c-format
 msgid ""
 "\n"
 "1 Job, %s files inserted into the tree.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:942
+#: src/dird/ua_restore.c:962
 #, c-format
 msgid ""
 "\n"
 "%d Jobs, %s files inserted into the tree and marked for extraction.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:946
+#: src/dird/ua_restore.c:966
 #, c-format
 msgid ""
 "\n"
 "%d Jobs, %s files inserted into the tree.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1023
+#: src/dird/ua_restore.c:1043
 #, c-format
 msgid "Error getting FileSet \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1031 src/dird/ua_select.c:165
+#: src/dird/ua_restore.c:1051 src/dird/ua_select.c:167
 msgid "The defined FileSet resources are:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1035 src/dird/ua_select.c:173
+#: src/dird/ua_restore.c:1055 src/dird/ua_run.c:644 src/dird/ua_select.c:175
+msgid "FileSet"
+msgstr ""
+
+#: src/dird/ua_restore.c:1055 src/dird/ua_select.c:175
 msgid "Select FileSet resource"
 msgstr ""
 
-#: src/dird/ua_restore.c:1042
+#: src/dird/ua_restore.c:1062
 #, c-format
 msgid "Error getting FileSet record: %s\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1043
+#: src/dird/ua_restore.c:1063
 msgid ""
 "This probably means you modified the FileSet.\n"
 "Continuing anyway.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1058
+#: src/dird/ua_restore.c:1078
 #, c-format
 msgid "Pool \"%s\" not found, using any pool.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1084 src/dird/ua_restore.c:1100
+#: src/dird/ua_restore.c:1104 src/dird/ua_restore.c:1120
 #, c-format
 msgid "No Full backup before %s found.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1123
+#: src/dird/ua_restore.c:1143
 msgid "No jobs found.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1289
+#: src/dird/ua_restore.c:1316
 msgid ""
 "Warning, the JobIds that you selected refer to more than one MediaType.\n"
 "Restore is not possible. The MediaTypes used are:\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1297
+#: src/dird/ua_restore.c:1324
 msgid "No MediaType found for your JobIds.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1329
+#: src/dird/ua_restore.c:1356
 #, c-format
 msgid "Warning default storage overridden by %s on command line.\n"
 msgstr ""
 
-#: src/dird/ua_restore.c:1340
+#: src/dird/ua_restore.c:1367
 #, c-format
 msgid ""
 "\n"
@@ -3759,7 +3837,7 @@ msgid ""
 "Priority: %d\n"
 msgstr ""
 
-#: src/dird/ua_run.c:507 src/lib/util.c:301
+#: src/dird/ua_run.c:507 src/lib/util.c:295
 msgid "Admin"
 msgstr ""
 
@@ -3777,7 +3855,7 @@ msgid ""
 "Priority: %d\n"
 msgstr ""
 
-#: src/dird/ua_run.c:528 src/lib/util.c:292
+#: src/dird/ua_run.c:528 src/lib/util.c:286
 msgid "Backup"
 msgstr ""
 
@@ -3796,7 +3874,7 @@ msgid ""
 "Priority:    %d\n"
 msgstr ""
 
-#: src/dird/ua_run.c:554 src/lib/util.c:295
+#: src/dird/ua_run.c:554 src/lib/util.c:289
 msgid "Verify"
 msgstr ""
 
@@ -3849,7 +3927,7 @@ msgstr ""
 msgid "mod"
 msgstr ""
 
-#: src/dird/ua_run.c:640 src/dird/ua_update.c:415
+#: src/dird/ua_run.c:640 src/dird/ua_update.c:463
 msgid "Parameters to modify:\n"
 msgstr ""
 
@@ -3857,40 +3935,79 @@ msgstr ""
 msgid "Level"
 msgstr ""
 
-#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:380
-#: src/wx-console/wxbrestorepanel.cpp:808
-#: src/wx-console/wxbrestorepanel.cpp:1833
+#: src/dird/ua_run.c:642 src/dird/ua_select.c:152
+#: src/wx-console/wxbrestorepanel.cpp:321
+#: src/wx-console/wxbrestorepanel.cpp:337
+#: src/wx-console/wxbrestorepanel.cpp:458
+#: src/wx-console/wxbrestorepanel.cpp:459
+#: src/wx-console/wxbrestorepanel.cpp:469
+#: src/wx-console/wxbrestorepanel.cpp:470
+#: src/wx-console/wxbrestorepanel.cpp:1133
+#: src/wx-console/wxbrestorepanel.cpp:1794
+#: src/wx-console/wxbrestorepanel.cpp:1865
+msgid "Storage"
+msgstr ""
+
+#: src/dird/ua_run.c:645 src/dird/ua_select.c:282 src/dird/ua_select.c:391
+#: src/wx-console/wxbrestorepanel.cpp:318
+#: src/wx-console/wxbrestorepanel.cpp:336
+#: src/wx-console/wxbrestorepanel.cpp:410
+#: src/wx-console/wxbrestorepanel.cpp:411
+#: src/wx-console/wxbrestorepanel.cpp:421
+#: src/wx-console/wxbrestorepanel.cpp:422
+#: src/wx-console/wxbrestorepanel.cpp:669
+#: src/wx-console/wxbrestorepanel.cpp:1103
+#: src/wx-console/wxbrestorepanel.cpp:1190
+#: src/wx-console/wxbrestorepanel.cpp:1787
+#: src/wx-console/wxbrestorepanel.cpp:1789
+#: src/wx-console/wxbrestorepanel.cpp:1863
+#: src/wx-console/wxbrestorepanel.cpp:1918
+msgid "Client"
+msgstr ""
+
+#: src/dird/ua_run.c:646 src/wx-console/wxbrestorepanel.cpp:338
+#: src/wx-console/wxbrestorepanel.cpp:823
+#: src/wx-console/wxbrestorepanel.cpp:1867
 msgid "When"
 msgstr ""
 
-#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:381
-#: src/wx-console/wxbrestorepanel.cpp:1079
-#: src/wx-console/wxbrestorepanel.cpp:1835
+#: src/dird/ua_run.c:647 src/wx-console/wxbrestorepanel.cpp:339
+#: src/wx-console/wxbrestorepanel.cpp:1096
+#: src/wx-console/wxbrestorepanel.cpp:1869
 msgid "Priority"
 msgstr ""
 
+#: src/dird/ua_run.c:650 src/dird/ua_select.c:476 src/dird/ua_select.c:566
+#: src/dird/ua_update.c:400 src/dird/ua_update.c:474
+#: src/wx-console/wxbrestorepanel.cpp:320
+#: src/wx-console/wxbrestorepanel.cpp:506
+#: src/wx-console/wxbrestorepanel.cpp:516
+#: src/wx-console/wxbrestorepanel.cpp:1783
+msgid "Pool"
+msgstr ""
+
 #: src/dird/ua_run.c:652
 msgid "Verify Job"
 msgstr ""
 
-#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:373
-#: src/wx-console/wxbrestorepanel.cpp:1814
+#: src/dird/ua_run.c:655 src/wx-console/wxbrestorepanel.cpp:331
+#: src/wx-console/wxbrestorepanel.cpp:1848
 msgid "Bootstrap"
 msgstr ""
 
-#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:374
-#: src/wx-console/wxbrestorepanel.cpp:1055
-#: src/wx-console/wxbrestorepanel.cpp:1816
+#: src/dird/ua_run.c:656 src/wx-console/wxbrestorepanel.cpp:332
+#: src/wx-console/wxbrestorepanel.cpp:1072
+#: src/wx-console/wxbrestorepanel.cpp:1850
 msgid "Where"
 msgstr ""
 
-#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:376
-#: src/wx-console/wxbrestorepanel.cpp:1063
-#: src/wx-console/wxbrestorepanel.cpp:1820
-#: src/wx-console/wxbrestorepanel.cpp:1821
-#: src/wx-console/wxbrestorepanel.cpp:1822
-#: src/wx-console/wxbrestorepanel.cpp:1823
-#: src/wx-console/wxbrestorepanel.cpp:1824
+#: src/dird/ua_run.c:657 src/wx-console/wxbrestorepanel.cpp:334
+#: src/wx-console/wxbrestorepanel.cpp:1080
+#: src/wx-console/wxbrestorepanel.cpp:1854
+#: src/wx-console/wxbrestorepanel.cpp:1855
+#: src/wx-console/wxbrestorepanel.cpp:1856
+#: src/wx-console/wxbrestorepanel.cpp:1857
+#: src/wx-console/wxbrestorepanel.cpp:1858
 msgid "Replace"
 msgstr ""
 
@@ -3898,7 +4015,7 @@ msgstr ""
 msgid "JobId"
 msgstr ""
 
-#: src/dird/ua_run.c:660 src/dird/ua_update.c:430
+#: src/dird/ua_run.c:660 src/dird/ua_update.c:478
 msgid "Select parameter to modify"
 msgstr ""
 
@@ -3907,27 +4024,27 @@ msgid "Levels:\n"
 msgstr ""
 
 #: src/dird/ua_run.c:665 src/filed/status.c:368 src/lib/util.c:319
-#: src/stored/status.c:406
+#: src/stored/status.c:451
 msgid "Base"
 msgstr ""
 
-#: src/dird/ua_run.c:666 src/dird/ua_update.c:106 src/dird/ua_update.c:438
-#: src/filed/status.c:370 src/lib/util.c:321 src/stored/status.c:408
+#: src/dird/ua_run.c:666 src/filed/status.c:370 src/lib/util.c:321
+#: src/stored/status.c:453
 msgid "Full"
 msgstr ""
 
 #: src/dird/ua_run.c:667 src/filed/status.c:373 src/lib/util.c:324
-#: src/stored/status.c:411
+#: src/stored/status.c:456
 msgid "Incremental"
 msgstr ""
 
 #: src/dird/ua_run.c:668 src/filed/status.c:376 src/lib/util.c:327
-#: src/stored/status.c:414
+#: src/stored/status.c:459
 msgid "Differential"
 msgstr ""
 
 #: src/dird/ua_run.c:669 src/filed/status.c:379 src/lib/util.c:330
-#: src/stored/status.c:417
+#: src/stored/status.c:462
 msgid "Since"
 msgstr ""
 
@@ -3940,7 +4057,7 @@ msgid "Initialize Catalog"
 msgstr ""
 
 #: src/dird/ua_run.c:693 src/filed/status.c:382 src/lib/util.c:333
-#: src/stored/status.c:420
+#: src/stored/status.c:465
 msgid "Verify Catalog"
 msgstr ""
 
@@ -3999,16 +4116,16 @@ msgid ""
 "You must set the bootstrap file to NULL to be able to specify a JobId.\n"
 msgstr ""
 
-#: src/dird/ua_run.c:867
+#: src/dird/ua_run.c:869
 msgid "Job failed.\n"
 msgstr ""
 
-#: src/dird/ua_run.c:870
+#: src/dird/ua_run.c:872
 #, c-format
 msgid "Job started. JobId=%s\n"
 msgstr ""
 
-#: src/dird/ua_run.c:876
+#: src/dird/ua_run.c:878
 msgid "Job not run.\n"
 msgstr ""
 
@@ -4041,199 +4158,204 @@ msgstr ""
 msgid "Select Storage resource"
 msgstr ""
 
-#: src/dird/ua_select.c:189
+#: src/dird/ua_select.c:193
 msgid "catalog"
 msgstr ""
 
-#: src/dird/ua_select.c:197
+#: src/dird/ua_select.c:201
 msgid "The defined Catalog resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:205
+#: src/dird/ua_select.c:209
 msgid "Catalog"
 msgstr ""
 
-#: src/dird/ua_select.c:205
+#: src/dird/ua_select.c:209
 msgid "Select Catalog resource"
 msgstr ""
 
-#: src/dird/ua_select.c:220
+#: src/dird/ua_select.c:226
 msgid "The defined Job resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:228
+#: src/dird/ua_select.c:234
 msgid "Select Job resource"
 msgstr ""
 
-#: src/dird/ua_select.c:241
+#: src/dird/ua_select.c:249
 msgid "The defined Restore Job resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:249
+#: src/dird/ua_select.c:257
 msgid "Select Restore Job"
 msgstr ""
 
-#: src/dird/ua_select.c:264
+#: src/dird/ua_select.c:274
 msgid "The defined Client resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:272
+#: src/dird/ua_select.c:282
 msgid "Select Client (File daemon) resource"
 msgstr ""
 
-#: src/dird/ua_select.c:297
+#: src/dird/ua_select.c:309
 #, c-format
 msgid "Error: Client resource %s does not exist.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:322
+#: src/dird/ua_select.c:334
 #, c-format
 msgid "Could not find Client %s: ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:325 src/lib/bnet_server.c:285
-#: src/lib/bnet_server.c:379
+#: src/dird/ua_select.c:337 src/lib/bnet_server.c:284
+#: src/lib/bnet_server.c:378
 msgid "client"
 msgstr ""
 
-#: src/dird/ua_select.c:326
+#: src/dird/ua_select.c:338
 msgid "fd"
 msgstr ""
 
-#: src/dird/ua_select.c:332 src/dird/ua_select.c:386
+#: src/dird/ua_select.c:344 src/dird/ua_select.c:398
 #, c-format
 msgid "Could not find Client \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:361
+#: src/dird/ua_select.c:373
 #, c-format
 msgid "Error obtaining client ids. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:365
+#: src/dird/ua_select.c:377
 msgid "No clients defined. You must run a job before using this command.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:369
+#: src/dird/ua_select.c:381
 msgid "Defined Clients:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:379
+#: src/dird/ua_select.c:391
 msgid "Select the Client"
 msgstr ""
 
-#: src/dird/ua_select.c:412 src/dird/ua_select.c:435 src/dird/ua_select.c:471
+#: src/dird/ua_select.c:424 src/dird/ua_select.c:447 src/dird/ua_select.c:483
 #, c-format
 msgid "Could not find Pool \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:450
+#: src/dird/ua_select.c:462
 msgid "No pools defined. Use the \"create\" command to create one.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:454
+#: src/dird/ua_select.c:466
 msgid "Defined Pools:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:464
+#: src/dird/ua_select.c:476
 msgid "Select the Pool"
 msgstr ""
 
-#: src/dird/ua_select.c:494
+#: src/dird/ua_select.c:506
 #, c-format
 msgid "No access to Pool \"%s\"\n"
 msgstr ""
 
-#: src/dird/ua_select.c:520
+#: src/dird/ua_select.c:532
 msgid "Enter MediaId or Volume name: "
 msgstr ""
 
-#: src/dird/ua_select.c:546
+#: src/dird/ua_select.c:558
 msgid "The defined Pool resources are:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:554
+#: src/dird/ua_select.c:566
 msgid "Select Pool resource"
 msgstr ""
 
-#: src/dird/ua_select.c:587
+#: src/dird/ua_select.c:601
 msgid "Enter the JobId to select: "
 msgstr ""
 
-#: src/dird/ua_select.c:624
+#: src/dird/ua_select.c:639
 #, c-format
 msgid "Could not find Job \"%s\": ERR=%s"
 msgstr ""
 
-#: src/dird/ua_select.c:687
+#: src/dird/ua_select.c:717
 #, c-format
 msgid "Automatically selected %s: %s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:692
+#: src/dird/ua_select.c:722
 #, c-format
 msgid "Cannot select %s in batch mode.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:708
+#: src/dird/ua_select.c:736
 msgid "Selection is empty!\n"
 msgstr ""
 
-#: src/dird/ua_select.c:714
+#: src/dird/ua_select.c:742
 msgid "Item 1 selected automatically.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:725
+#: src/dird/ua_select.c:753
 msgid "Selection aborted, nothing done.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:730
+#: src/dird/ua_select.c:758
 #, c-format
 msgid "Please enter a number between 1 and %d\n"
 msgstr ""
 
-#: src/dird/ua_select.c:778
+#: src/dird/ua_select.c:807
 msgid "Storage name given twice.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:795
+#: src/dird/ua_select.c:824
 #, c-format
 msgid "Expecting jobid=nn command, got: %s\n"
 msgstr ""
 
-#: src/dird/ua_select.c:799
+#: src/dird/ua_select.c:828
 #, c-format
 msgid "JobId %s is not running.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:808
+#: src/dird/ua_select.c:838
 #, c-format
 msgid "Expecting job=xxx, got: %s.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:812
+#: src/dird/ua_select.c:842 src/dird/ua_select.c:854
 #, c-format
 msgid "Job \"%s\" is not running.\n"
 msgstr ""
 
-#: src/dird/ua_select.c:828
+#: src/dird/ua_select.c:850
+#, c-format
+msgid "Expecting ujobid=xxx, got: %s.\n"
+msgstr ""
+
+#: src/dird/ua_select.c:870
 #, c-format
 msgid "Storage resource \"%s\": not found\n"
 msgstr ""
 
-#: src/dird/ua_select.c:850
+#: src/dird/ua_select.c:902
 msgid "Enter autochanger drive[0]: "
 msgstr ""
 
-#: src/dird/ua_select.c:879
+#: src/dird/ua_select.c:932
 msgid "Media Types defined in conf file:\n"
 msgstr ""
 
-#: src/dird/ua_select.c:885
+#: src/dird/ua_select.c:938
 msgid "Media Type"
 msgstr ""
 
-#: src/dird/ua_select.c:885
+#: src/dird/ua_select.c:938
 msgid "Select the Media Type"
 msgstr ""
 
@@ -4259,24 +4381,24 @@ msgstr ""
 msgid "%s Version: %s (%s) %s %s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:249 src/stored/status.c:70
+#: src/dird/ua_status.c:249 src/stored/status.c:71
 #, c-format
 msgid "Daemon started %s, 1 Job run since started.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:252 src/stored/status.c:73
+#: src/dird/ua_status.c:252 src/stored/status.c:74
 #, c-format
 msgid "Daemon started %s, %d Jobs run since started.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:257 src/filed/status.c:119 src/stored/status.c:77
+#: src/dird/ua_status.c:257 src/filed/status.c:121 src/stored/status.c:78
 #, c-format
 msgid " Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:277 src/dird/ua_status.c:482 src/dird/ua_status.c:644
-#: src/filed/status.c:196 src/filed/status.c:275 src/stored/status.c:317
-#: src/stored/status.c:393
+#: src/dird/ua_status.c:277 src/dird/ua_status.c:502 src/dird/ua_status.c:664
+#: src/filed/status.c:198 src/filed/status.c:277 src/stored/status.c:345
+#: src/stored/status.c:361 src/stored/status.c:438
 msgid "====\n"
 msgstr ""
 
@@ -4314,249 +4436,249 @@ msgstr ""
 msgid "===================================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:399
+#: src/dird/ua_status.c:401
 #, c-format
 msgid "%-14s %-8s %3d  %-18s %-18s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:480
+#: src/dird/ua_status.c:500
 msgid "No Scheduled Jobs.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:497 src/stored/status.c:269
+#: src/dird/ua_status.c:517 src/stored/status.c:277
 msgid ""
 "\n"
 "Running Jobs:\n"
 msgstr ""
 
-#: src/dird/ua_status.c:506
+#: src/dird/ua_status.c:525
 #, c-format
 msgid "Console connected at %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:514
+#: src/dird/ua_status.c:535
 msgid ""
 "No Jobs running.\n"
 "====\n"
 msgstr ""
 
-#: src/dird/ua_status.c:519
+#: src/dird/ua_status.c:540
 msgid " JobId Level   Name                       Status\n"
 msgstr ""
 
-#: src/dird/ua_status.c:520 src/filed/status.c:219 src/stored/status.c:337
+#: src/dird/ua_status.c:541 src/filed/status.c:221 src/stored/status.c:382
 msgid "======================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:529
+#: src/dird/ua_status.c:549
 msgid "is waiting execution"
 msgstr ""
 
-#: src/dird/ua_status.c:532
+#: src/dird/ua_status.c:552
 msgid "is running"
 msgstr ""
 
-#: src/dird/ua_status.c:535
+#: src/dird/ua_status.c:555
 msgid "is blocked"
 msgstr ""
 
-#: src/dird/ua_status.c:538
+#: src/dird/ua_status.c:558
 msgid "has terminated"
 msgstr ""
 
-#: src/dird/ua_status.c:541
+#: src/dird/ua_status.c:561
 msgid "has erred"
 msgstr ""
 
-#: src/dird/ua_status.c:544
+#: src/dird/ua_status.c:564
 msgid "has errors"
 msgstr ""
 
-#: src/dird/ua_status.c:547
+#: src/dird/ua_status.c:567
 msgid "has a fatal error"
 msgstr ""
 
-#: src/dird/ua_status.c:550
+#: src/dird/ua_status.c:570
 msgid "has verify differences"
 msgstr ""
 
-#: src/dird/ua_status.c:553
+#: src/dird/ua_status.c:573
 msgid "has been canceled"
 msgstr ""
 
-#: src/dird/ua_status.c:557
+#: src/dird/ua_status.c:577
 #, c-format
 msgid "is waiting on Client %s"
 msgstr ""
 
-#: src/dird/ua_status.c:563
+#: src/dird/ua_status.c:583
 #, c-format
 msgid "is waiting on Storage %s"
 msgstr ""
 
-#: src/dird/ua_status.c:568
+#: src/dird/ua_status.c:588
 msgid "is waiting on max Storage jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:571
+#: src/dird/ua_status.c:591
 msgid "is waiting on max Client jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:574
+#: src/dird/ua_status.c:594
 msgid "is waiting on max Job jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:577
+#: src/dird/ua_status.c:597
 msgid "is waiting on max total jobs"
 msgstr ""
 
-#: src/dird/ua_status.c:580
+#: src/dird/ua_status.c:600
 msgid "is waiting for its start time"
 msgstr ""
 
-#: src/dird/ua_status.c:583
+#: src/dird/ua_status.c:603
 msgid "is waiting for higher priority jobs to finish"
 msgstr ""
 
-#: src/dird/ua_status.c:588
+#: src/dird/ua_status.c:608
 #, c-format
 msgid "is in unknown state %c"
 msgstr ""
 
-#: src/dird/ua_status.c:602
+#: src/dird/ua_status.c:622
 msgid "is waiting for a mount request"
 msgstr ""
 
-#: src/dird/ua_status.c:609
+#: src/dird/ua_status.c:629
 msgid "is waiting for an appendable Volume"
 msgstr ""
 
-#: src/dird/ua_status.c:616
+#: src/dird/ua_status.c:636
 #, c-format
 msgid "is waiting for Client %s to connect to Storage %s"
 msgstr ""
 
-#: src/dird/ua_status.c:632
+#: src/dird/ua_status.c:652
 #, c-format
 msgid "%6d %-6s  %-20s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:654 src/filed/status.c:209 src/stored/status.c:328
+#: src/dird/ua_status.c:674 src/filed/status.c:211 src/stored/status.c:373
 msgid "No Terminated Jobs.\n"
 msgstr ""
 
-#: src/dird/ua_status.c:659 src/stored/status.c:333
+#: src/dird/ua_status.c:679 src/stored/status.c:378
 msgid ""
 "\n"
 "Terminated Jobs:\n"
 msgstr ""
 
-#: src/dird/ua_status.c:660
+#: src/dird/ua_status.c:680
 msgid " JobId  Level     Files      Bytes     Status   Finished        Name \n"
 msgstr ""
 
-#: src/dird/ua_status.c:661
+#: src/dird/ua_status.c:681
 msgid "========================================================================\n"
 msgstr ""
 
-#: src/dird/ua_status.c:692 src/filed/status.c:239 src/lib/util.c:184
-#: src/stored/status.c:357
+#: src/dird/ua_status.c:712 src/filed/status.c:241 src/lib/util.c:178
+#: src/stored/status.c:402
 msgid "Created"
 msgstr ""
 
-#: src/dird/ua_status.c:696 src/filed/status.c:243 src/lib/util.c:197
-#: src/lib/util.c:264 src/stored/status.c:361
+#: src/dird/ua_status.c:716 src/filed/status.c:245 src/lib/util.c:191
+#: src/lib/util.c:258 src/stored/status.c:406
 msgid "Error"
 msgstr ""
 
-#: src/dird/ua_status.c:699 src/filed/status.c:246 src/stored/status.c:364
+#: src/dird/ua_status.c:719 src/filed/status.c:248 src/stored/status.c:409
 msgid "Diffs"
 msgstr ""
 
-#: src/dird/ua_status.c:705 src/filed/status.c:252 src/lib/util.c:193
-#: src/lib/util.c:260 src/stored/btape.c:1160 src/stored/status.c:370
+#: src/dird/ua_status.c:725 src/filed/status.c:254 src/lib/util.c:187
+#: src/lib/util.c:254 src/stored/btape.c:1158 src/stored/status.c:415
 #: src/wx-console/wxbconfigpanel.cpp:180
 msgid "OK"
 msgstr ""
 
-#: src/dird/ua_status.c:708 src/filed/status.c:255 src/stored/status.c:373
+#: src/dird/ua_status.c:728 src/filed/status.c:257 src/stored/status.c:418
 msgid "Other"
 msgstr ""
 
-#: src/dird/ua_status.c:711 src/filed/status.c:266 src/stored/status.c:384
+#: src/dird/ua_status.c:731 src/filed/status.c:268 src/stored/status.c:429
 #, c-format
 msgid "%6d  %-6s %8s %14s %-7s  %-8s %s\n"
 msgstr ""
 
-#: src/dird/ua_status.c:719 src/stored/btape.c:180
+#: src/dird/ua_status.c:739 src/stored/btape.c:180
 msgid "\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:57
+#: src/dird/ua_tree.c:58
 msgid "change current directory"
 msgstr ""
 
-#: src/dird/ua_tree.c:58
+#: src/dird/ua_tree.c:59
 msgid "count marked files in and below the cd"
 msgstr ""
 
-#: src/dird/ua_tree.c:59
+#: src/dird/ua_tree.c:60 src/dird/ua_tree.c:61
 msgid "long list current directory, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:60
+#: src/dird/ua_tree.c:62
 msgid "leave file selection mode"
 msgstr ""
 
-#: src/dird/ua_tree.c:61
+#: src/dird/ua_tree.c:63
 msgid "estimate restore size"
 msgstr ""
 
-#: src/dird/ua_tree.c:62
+#: src/dird/ua_tree.c:64
 msgid "same as done command"
 msgstr ""
 
-#: src/dird/ua_tree.c:63
+#: src/dird/ua_tree.c:65
 msgid "find files, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:64 src/dird/ua_tree.c:73
+#: src/dird/ua_tree.c:66 src/dird/ua_tree.c:75
 msgid "print help"
 msgstr ""
 
-#: src/dird/ua_tree.c:65
+#: src/dird/ua_tree.c:67
 msgid "list current directory, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:66
+#: src/dird/ua_tree.c:68
 msgid "list the marked files in and below the cd"
 msgstr ""
 
-#: src/dird/ua_tree.c:67
-msgid "mark dir/file to be restored recursively in dirs"
+#: src/dird/ua_tree.c:69
+msgid "mark dir/file to be restored recursively, wildcards allowed"
 msgstr ""
 
-#: src/dird/ua_tree.c:68
+#: src/dird/ua_tree.c:70
 msgid "mark directory name to be restored (no files)"
 msgstr ""
 
-#: src/dird/ua_tree.c:69
+#: src/dird/ua_tree.c:71
 msgid "print current working directory"
 msgstr ""
 
-#: src/dird/ua_tree.c:70
+#: src/dird/ua_tree.c:72
 msgid "unmark dir/file to be restored recursively in dir"
 msgstr ""
 
-#: src/dird/ua_tree.c:71
+#: src/dird/ua_tree.c:73
 msgid "unmark directory name only no recursion"
 msgstr ""
 
-#: src/dird/ua_tree.c:72
+#: src/dird/ua_tree.c:74
 msgid "quit and do not do restore"
 msgstr ""
 
-#: src/dird/ua_tree.c:92
+#: src/dird/ua_tree.c:94
 msgid ""
 "\n"
 "You are now entering file selection mode where you add (mark) and\n"
@@ -4566,705 +4688,657 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:102 src/dird/ua_tree.c:633 src/dird/ua_tree.c:641
+#: src/dird/ua_tree.c:104 src/dird/ua_tree.c:671 src/dird/ua_tree.c:679
 #, c-format
 msgid "cwd is: %s\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:123
+#: src/dird/ua_tree.c:125
 msgid "Illegal command. Enter \"done\" to exit.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:296 src/dird/ua_tree.c:307 src/dird/ua_tree.c:324
+#: src/dird/ua_tree.c:298 src/dird/ua_tree.c:309 src/dird/ua_tree.c:326
 msgid "No files marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:309
+#: src/dird/ua_tree.c:311
 msgid "1 file marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:311
+#: src/dird/ua_tree.c:313
 #, c-format
 msgid "%s files marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:338
+#: src/dird/ua_tree.c:340
 msgid "No directories marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:340
+#: src/dird/ua_tree.c:342
 msgid "1 directory marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:342
+#: src/dird/ua_tree.c:344
 #, c-format
 msgid "%s directories marked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:363
+#: src/dird/ua_tree.c:365
 #, c-format
 msgid "%s total files/dirs. %s marked to be restored.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:374
+#: src/dird/ua_tree.c:376
 msgid "No file specification given.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:502
+#: src/dird/ua_tree.c:527
 #, c-format
 msgid "Node %s has no children.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:583
+#: src/dird/ua_tree.c:618
 #, c-format
 msgid "%d total files; %d marked to be restored; %s bytes.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:625
+#: src/dird/ua_tree.c:663
 msgid "Invalid path given.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:652 src/dird/ua_tree.c:663
+#: src/dird/ua_tree.c:690 src/dird/ua_tree.c:701
 msgid "No files unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:665
+#: src/dird/ua_tree.c:703
 msgid "1 file unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:667
+#: src/dird/ua_tree.c:705
 #, c-format
 msgid "%d files unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:678 src/dird/ua_tree.c:694
+#: src/dird/ua_tree.c:716 src/dird/ua_tree.c:732
 msgid "No directories unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:696
+#: src/dird/ua_tree.c:734
 msgid "1 directory unmarked.\n"
 msgstr ""
 
-#: src/dird/ua_tree.c:698
+#: src/dird/ua_tree.c:736
 #, c-format
 msgid "%d directories unmarked.\n"
 msgstr ""
 
-#: src/dird/verify.c:87
-msgid ""
-"Unable to find JobId of previous InitCatalog Job.\n"
-"Please run a Verify with Level=InitCatalog before\n"
-"running the current Job.\n"
+#: src/dird/ua_update.c:79
+msgid "Update choice:\n"
 msgstr ""
 
-#: src/dird/verify.c:108
-#, c-format
-msgid "Could not get job record for previous Job. ERR=%s"
+#: src/dird/ua_update.c:80
+msgid "Volume parameters"
 msgstr ""
 
-#: src/dird/verify.c:113
-#, c-format
-msgid "Last Job %d did not terminate normally. JobStatus=%c\n"
+#: src/dird/ua_update.c:81
+msgid "Pool from resource"
 msgstr ""
 
-#: src/dird/verify.c:117
-#, c-format
-msgid "Verifying against JobId=%d Job=%s\n"
+#: src/dird/ua_update.c:82
+msgid "Slots from autochanger"
 msgstr ""
 
-#: src/dird/verify.c:183
-#, c-format
-msgid "Start Verify JobId=%d Level=%s Job=%s\n"
+#: src/dird/ua_update.c:83
+msgid "item"
 msgstr ""
 
-#: src/dird/verify.c:262
-msgid "Deprecated feature ... use bootstrap.\n"
+#: src/dird/ua_update.c:83
+msgid "Choose catalog item to update"
 msgstr ""
 
-#: src/dird/verify.c:275
+#: src/dird/ua_update.c:122
 #, c-format
-msgid "Unimplemented Verify level %d(%c)\n"
+msgid "Invalid VolStatus specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:327
+#: src/dird/ua_update.c:131
 #, c-format
-msgid "Unimplemented verify level %d\n"
+msgid "New Volume status is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:382
-msgid "Verify OK"
+#: src/dird/ua_update.c:141
+#, c-format
+msgid "Invalid retention period specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:386
-msgid "*** Verify Error ***"
+#: src/dird/ua_update.c:149
+#, c-format
+msgid "New retention period is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:390
-msgid "Verify warnings"
+#: src/dird/ua_update.c:160
+#, c-format
+msgid "Invalid use duration specified: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:393
-msgid "Verify Canceled"
+#: src/dird/ua_update.c:168
+#, c-format
+msgid "New use duration is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:396
-msgid "Verify Differences"
+#: src/dird/ua_update.c:182
+#, c-format
+msgid "New max jobs is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:401
+#: src/dird/ua_update.c:195
 #, c-format
-msgid "Inappropriate term code: %d %c\n"
+msgid "New max files is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:415
+#: src/dird/ua_update.c:206
 #, c-format
-msgid ""
-"Bacula %s (%s): %s\n"
-"  JobId:                  %d\n"
-"  Job:                    %s\n"
-"  FileSet:                %s\n"
-"  Verify Level:           %s\n"
-"  Client:                 %s\n"
-"  Verify JobId:           %d\n"
-"  Verify Job:             %s\n"
-"  Start time:             %s\n"
-"  End time:               %s\n"
-"  Files Expected:         %s\n"
-"  Files Examined:         %s\n"
-"  Non-fatal FD errors:    %d\n"
-"  FD termination status:  %s\n"
-"  SD termination status:  %s\n"
-"  Termination:            %s\n"
-"\n"
+msgid "Invalid max. bytes specification: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:450
+#: src/dird/ua_update.c:214
 #, c-format
-msgid ""
-"Bacula %s (%s): %s\n"
-"  JobId:                  %d\n"
-"  Job:                    %s\n"
-"  FileSet:                %s\n"
-"  Verify Level:           %s\n"
-"  Client:                 %s\n"
-"  Verify JobId:           %d\n"
-"  Verify Job:             %s\n"
-"  Start time:             %s\n"
-"  End time:               %s\n"
-"  Files Examined:         %s\n"
-"  Non-fatal FD errors:    %d\n"
-"  FD termination status:  %s\n"
-"  Termination:            %s\n"
-"\n"
+msgid "New Max bytes is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:526
-#, c-format
-msgid ""
-"bird<filed: bad attributes, expected 3 fields got %d\n"
-" mslen=%d msg=%s\n"
+#: src/dird/ua_update.c:228 src/dird/ua_update.c:252
+msgid "Invalid value. It must be yes or no.\n"
 msgstr ""
 
-#: src/dird/verify.c:570
+#: src/dird/ua_update.c:236
 #, c-format
-msgid "New file: %s\n"
+msgid "New Recycle flag is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:571
+#: src/dird/ua_update.c:260
 #, c-format
-msgid "File not in catalog: %s\n"
+msgid "New InChanger flag is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:595
+#: src/dird/ua_update.c:278
 #, c-format
-msgid "      st_ino   differ. Cat: %s File: %s\n"
+msgid "Invalid slot, it must be between 0 and MaxVols=%d\n"
 msgstr ""
 
-#: src/dird/verify.c:604
+#: src/dird/ua_update.c:287 src/dird/ua_update.c:578
 #, c-format
-msgid "      st_mode  differ. Cat: %x File: %x\n"
+msgid "Error updating media record Slot: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:612
+#: src/dird/ua_update.c:289
 #, c-format
-msgid "      st_nlink differ. Cat: %d File: %d\n"
+msgid "New Slot is: %d\n"
 msgstr ""
 
-#: src/dird/verify.c:620
+#: src/dird/ua_update.c:316
 #, c-format
-msgid "      st_uid   differ. Cat: %u File: %u\n"
+msgid "New Pool is: %s\n"
 msgstr ""
 
-#: src/dird/verify.c:628
+#: src/dird/ua_update.c:345
 #, c-format
-msgid "      st_gid   differ. Cat: %u File: %u\n"
+msgid "Error updating Volume record: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:636
+#: src/dird/ua_update.c:347
 #, c-format
-msgid "      st_size  differ. Cat: %s File: %s\n"
+msgid "Volume defaults updated from \"%s\" Pool record.\n"
 msgstr ""
 
-#: src/dird/verify.c:645
-msgid "      st_atime differs\n"
+#: src/dird/ua_update.c:369
+#, c-format
+msgid "Error updating Volume records: ERR=%s"
 msgstr ""
 
-#: src/dird/verify.c:652
-msgid "      st_mtime differs\n"
+#: src/dird/ua_update.c:371
+msgid "All Volume defaults updated from Pool record.\n"
 msgstr ""
 
-#: src/dird/verify.c:659
-msgid "      st_ctime differs\n"
+#: src/dird/ua_update.c:391
+msgid "VolStatus"
 msgstr ""
 
-#: src/dird/verify.c:666
-#, c-format
-msgid "      st_size  decrease. Cat: %s File: %s\n"
+#: src/dird/ua_update.c:392
+msgid "VolRetention"
 msgstr ""
 
-#: src/dird/verify.c:705
-#, c-format
-msgid "      %s not same. File=%s Cat=%s\n"
+#: src/dird/ua_update.c:393
+msgid "VolUse"
 msgstr ""
 
-#: src/dird/verify.c:708
-#, c-format
-msgid "      %s differs.\n"
+#: src/dird/ua_update.c:394
+msgid "MaxVolJobs"
 msgstr ""
 
-#: src/dird/verify.c:720
-#, c-format
-msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
+#: src/dird/ua_update.c:395
+msgid "MaxVolFiles"
 msgstr ""
 
-#: src/dird/verify.c:757
-msgid "The following files are missing:\n"
+#: src/dird/ua_update.c:396
+msgid "MaxVolBytes"
 msgstr ""
 
-#: src/dird/verify.c:771 src/tools/testfind.c:338
-#, c-format
-msgid "File: %s\n"
+#: src/dird/ua_update.c:397
+msgid "Recycle"
 msgstr ""
 
-#: src/dird/ua_update.c:79
-msgid "Update choice:\n"
+#: src/dird/ua_update.c:398
+msgid "InChanger"
 msgstr ""
 
-#: src/dird/ua_update.c:80
-msgid "Volume parameters"
+#: src/dird/ua_update.c:399 src/dird/ua_update.c:471
+msgid "Slot"
 msgstr ""
 
-#: src/dird/ua_update.c:81
-msgid "Pool from resource"
+#: src/dird/ua_update.c:401
+msgid "FromPool"
 msgstr ""
 
-#: src/dird/ua_update.c:82
-msgid "Slots from autochanger"
+#: src/dird/ua_update.c:402
+msgid "AllFromPool"
 msgstr ""
 
-#: src/dird/ua_update.c:83
-msgid "item"
+#: src/dird/ua_update.c:464
+msgid "Volume Status"
 msgstr ""
 
-#: src/dird/ua_update.c:83
-msgid "Choose catalog item to update"
+#: src/dird/ua_update.c:465
+msgid "Volume Retention Period"
 msgstr ""
 
-#: src/dird/ua_update.c:103 src/dird/ua_update.c:435
-msgid "Append"
+#: src/dird/ua_update.c:466
+msgid "Volume Use Duration"
 msgstr ""
 
-#: src/dird/ua_update.c:104 src/dird/ua_update.c:436
-msgid "Archive"
+#: src/dird/ua_update.c:467
+msgid "Maximum Volume Jobs"
 msgstr ""
 
-#: src/dird/ua_update.c:105 src/dird/ua_update.c:437
-msgid "Disabled"
+#: src/dird/ua_update.c:468
+msgid "Maximum Volume Files"
 msgstr ""
 
-#: src/dird/ua_update.c:107 src/dird/ua_update.c:439
-msgid "Used"
+#: src/dird/ua_update.c:469
+msgid "Maximum Volume Bytes"
 msgstr ""
 
-#: src/dird/ua_update.c:108 src/dird/ua_update.c:440
-msgid "Cleaning"
+#: src/dird/ua_update.c:470
+msgid "Recycle Flag"
 msgstr ""
 
-#: src/dird/ua_update.c:109 src/dird/ua_update.c:355 src/dird/ua_update.c:442
-msgid "Recycle"
+#: src/dird/ua_update.c:472
+msgid "InChanger Flag"
 msgstr ""
 
-#: src/dird/ua_update.c:110 src/dird/ua_update.c:444
-msgid "Read-Only"
+#: src/dird/ua_update.c:473
+msgid "Volume Files"
 msgstr ""
 
-#: src/dird/ua_update.c:122
-#, c-format
-msgid "Invalid VolStatus specified: %s\n"
+#: src/dird/ua_update.c:475
+msgid "Volume from Pool"
 msgstr ""
 
-#: src/dird/ua_update.c:131
-#, c-format
-msgid "New Volume status is: %s\n"
+#: src/dird/ua_update.c:476
+msgid "All Volumes from Pool"
 msgstr ""
 
-#: src/dird/ua_update.c:142
-#, c-format
-msgid "Invalid retention period specified: %s\n"
+#: src/dird/ua_update.c:477
+msgid "Done"
 msgstr ""
 
-#: src/dird/ua_update.c:151
+#: src/dird/ua_update.c:485
 #, c-format
-msgid "New retention period is: %s\n"
+msgid "Updating Volume \"%s\"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:163
+#: src/dird/ua_update.c:490
 #, c-format
-msgid "Invalid use duration specified: %s\n"
+msgid "Current Volume status is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:172
-#, c-format
-msgid "New use duration is: %s\n"
+#: src/dird/ua_update.c:491
+msgid "Possible Values are:\n"
 msgstr ""
 
-#: src/dird/ua_update.c:187
-#, c-format
-msgid "New max jobs is: %s\n"
+#: src/dird/ua_update.c:502
+msgid "Choose new Volume Status"
 msgstr ""
 
-#: src/dird/ua_update.c:201
+#: src/dird/ua_update.c:508
 #, c-format
-msgid "New max files is: %s\n"
+msgid "Current retention period is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:213
-#, c-format
-msgid "Invalid max. bytes specification: %s\n"
+#: src/dird/ua_update.c:510
+msgid "Enter Volume Retention period: "
 msgstr ""
 
-#: src/dird/ua_update.c:222
+#: src/dird/ua_update.c:517
 #, c-format
-msgid "New Max bytes is: %s\n"
+msgid "Current use duration is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:237
-msgid "Invalid value. It must by yes or no.\n"
+#: src/dird/ua_update.c:519
+msgid "Enter Volume Use Duration: "
 msgstr ""
 
-#: src/dird/ua_update.c:246
+#: src/dird/ua_update.c:526
 #, c-format
-msgid "New Recycle flag is: %s\n"
+msgid "Current max jobs is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:275
-#, c-format
-msgid "New Pool is: %s\n"
+#: src/dird/ua_update.c:527
+msgid "Enter new Maximum Jobs: "
 msgstr ""
 
-#: src/dird/ua_update.c:304
+#: src/dird/ua_update.c:534
 #, c-format
-msgid "Error updating Volume record: ERR=%s"
+msgid "Current max files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:306
-#, c-format
-msgid "Volume defaults updated from \"%s\" Pool record.\n"
+#: src/dird/ua_update.c:535
+msgid "Enter new Maximum Files: "
 msgstr ""
 
-#: src/dird/ua_update.c:328
+#: src/dird/ua_update.c:542
 #, c-format
-msgid "Error updating Volume records: ERR=%s"
-msgstr ""
-
-#: src/dird/ua_update.c:330
-msgid "All Volume defaults updated from Pool record.\n"
-msgstr ""
-
-#: src/dird/ua_update.c:349
-msgid "VolStatus"
-msgstr ""
-
-#: src/dird/ua_update.c:350
-msgid "VolRetention"
-msgstr ""
-
-#: src/dird/ua_update.c:351
-msgid "VolUse"
-msgstr ""
-
-#: src/dird/ua_update.c:352
-msgid "MaxVolJobs"
-msgstr ""
-
-#: src/dird/ua_update.c:353
-msgid "MaxVolFiles"
+msgid "Current value is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:354
-msgid "MaxVolBytes"
+#: src/dird/ua_update.c:543
+msgid "Enter new Maximum Bytes: "
 msgstr ""
 
-#: src/dird/ua_update.c:357
-msgid "FromPool"
+#: src/dird/ua_update.c:551
+#, c-format
+msgid "Current recycle flag is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:358
-msgid "AllFromPool"
+#: src/dird/ua_update.c:553
+msgid "Enter new Recycle status: "
 msgstr ""
 
-#: src/dird/ua_update.c:414
+#: src/dird/ua_update.c:560
 #, c-format
-msgid "Updating Volume \"%s\"\n"
+msgid "Current Slot is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:416
-msgid "Volume Status"
+#: src/dird/ua_update.c:561
+msgid "Enter new Slot: "
 msgstr ""
 
-#: src/dird/ua_update.c:417
-msgid "Volume Retention Period"
+#: src/dird/ua_update.c:568
+#, c-format
+msgid "Current InChanger flag is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:418
-msgid "Volume Use Duration"
+#: src/dird/ua_update.c:569
+msgid "Set InChanger flag? yes/no: "
 msgstr ""
 
-#: src/dird/ua_update.c:419
-msgid "Maximum Volume Jobs"
+#: src/dird/ua_update.c:580
+#, c-format
+msgid "New InChanger flag is: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:420
-msgid "Maximum Volume Files"
+#: src/dird/ua_update.c:587
+msgid ""
+"Warning changing Volume Files can result\n"
+"in loss of data on your Volume\n"
+"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:421
-msgid "Maximum Volume Bytes"
+#: src/dird/ua_update.c:589
+#, c-format
+msgid "Current Volume Files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:422
-msgid "Recycle Flag"
+#: src/dird/ua_update.c:590
+msgid "Enter new number of Files for Volume: "
 msgstr ""
 
-#: src/dird/ua_update.c:423
-msgid "Slot"
+#: src/dird/ua_update.c:595
+msgid "Normally, you should only increase Volume Files by one!\n"
 msgstr ""
 
-#: src/dird/ua_update.c:424
-msgid "InChanger Flag"
+#: src/dird/ua_update.c:596
+msgid "Continue? (yes/no): "
 msgstr ""
 
-#: src/dird/ua_update.c:425
-msgid "Volume Files"
+#: src/dird/ua_update.c:606
+#, c-format
+msgid "New Volume Files is: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:427
-msgid "Volume from Pool"
+#: src/dird/ua_update.c:618
+#, c-format
+msgid "Current Pool is: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:428
-msgid "All Volumes from Pool"
+#: src/dird/ua_update.c:619
+msgid "Enter new Pool name: "
 msgstr ""
 
-#: src/dird/ua_update.c:429
-msgid "Done"
+#: src/dird/ua_update.c:632
+msgid "Selection terminated.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:433
+#: src/dird/ua_update.c:665
 #, c-format
-msgid "Current Volume status is: %s\n"
+msgid "db_update_pool_record returned %d. ERR=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:434
-msgid "Possible Values are:\n"
+#: src/dird/ua_update.c:672
+msgid "Pool DB record updated from resource.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:441
-msgid "Purged"
+#: src/dird/verify.c:87
+msgid ""
+"Unable to find JobId of previous InitCatalog Job.\n"
+"Please run a Verify with Level=InitCatalog before\n"
+"running the current Job.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:445
-msgid "Choose new Volume Status"
+#: src/dird/verify.c:117
+#, c-format
+msgid "Verifying against JobId=%d Job=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:451
+#: src/dird/verify.c:180
 #, c-format
-msgid "Current retention period is: %s\n"
+msgid "Start Verify JobId=%s Level=%s Job=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:453
-msgid "Enter Volume Retention period: "
+#: src/dird/verify.c:263
+msgid "Deprecated feature ... use bootstrap.\n"
 msgstr ""
 
-#: src/dird/ua_update.c:460
+#: src/dird/verify.c:276
 #, c-format
-msgid "Current use duration is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:462
-msgid "Enter Volume Use Duration: "
+msgid "Unimplemented Verify level %d(%c)\n"
 msgstr ""
 
-#: src/dird/ua_update.c:469
+#: src/dird/verify.c:328
 #, c-format
-msgid "Current max jobs is: %u\n"
+msgid "Unimplemented verify level %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:470
-msgid "Enter new Maximum Jobs: "
+#: src/dird/verify.c:383
+msgid "Verify OK"
 msgstr ""
 
-#: src/dird/ua_update.c:477
-#, c-format
-msgid "Current max files is: %u\n"
+#: src/dird/verify.c:387
+msgid "*** Verify Error ***"
 msgstr ""
 
-#: src/dird/ua_update.c:478
-msgid "Enter new Maximum Files: "
+#: src/dird/verify.c:391
+msgid "Verify warnings"
 msgstr ""
 
-#: src/dird/ua_update.c:485
-#, c-format
-msgid "Current value is: %s\n"
+#: src/dird/verify.c:394
+msgid "Verify Canceled"
 msgstr ""
 
-#: src/dird/ua_update.c:486
-msgid "Enter new Maximum Bytes: "
+#: src/dird/verify.c:397
+msgid "Verify Differences"
 msgstr ""
 
-#: src/dird/ua_update.c:494
+#: src/dird/verify.c:402
 #, c-format
-msgid "Current recycle flag is: %s\n"
+msgid "Inappropriate term code: %d %c\n"
 msgstr ""
 
-#: src/dird/ua_update.c:496
-msgid "Enter new Recycle status: "
+#: src/dird/verify.c:416
+#, c-format
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Expected:         %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  SD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:511
+#: src/dird/verify.c:451
 #, c-format
-msgid "Current Slot is: %d\n"
+msgid ""
+"Bacula %s (%s): %s\n"
+"  JobId:                  %d\n"
+"  Job:                    %s\n"
+"  FileSet:                %s\n"
+"  Verify Level:           %s\n"
+"  Client:                 %s\n"
+"  Verify JobId:           %d\n"
+"  Verify Job:             %s\n"
+"  Start time:             %s\n"
+"  End time:               %s\n"
+"  Files Examined:         %s\n"
+"  Non-fatal FD errors:    %d\n"
+"  FD termination status:  %s\n"
+"  Termination:            %s\n"
+"\n"
 msgstr ""
 
-#: src/dird/ua_update.c:512
-msgid "Enter new Slot: "
+#: src/dird/verify.c:527
+#, c-format
+msgid ""
+"bird<filed: bad attributes, expected 3 fields got %d\n"
+" mslen=%d msg=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:517
+#: src/dird/verify.c:571
 #, c-format
-msgid "Invalid slot, it must be between 0 and %d\n"
+msgid "New file: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:527 src/dird/ua_update.c:544
+#: src/dird/verify.c:572
 #, c-format
-msgid "Error updating media record Slot: ERR=%s"
+msgid "File not in catalog: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:529
+#: src/dird/verify.c:596
 #, c-format
-msgid "New Slot is: %d\n"
+msgid "      st_ino   differ. Cat: %s File: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:534
+#: src/dird/verify.c:605
 #, c-format
-msgid "Current InChanger flag is: %d\n"
+msgid "      st_mode  differ. Cat: %x File: %x\n"
 msgstr ""
 
-#: src/dird/ua_update.c:535
-msgid "Set InChanger flag? yes/no: "
+#: src/dird/verify.c:613
+#, c-format
+msgid "      st_nlink differ. Cat: %d File: %d\n"
 msgstr ""
 
-#: src/dird/ua_update.c:546
+#: src/dird/verify.c:621
 #, c-format
-msgid "New InChanger flag is: %d\n"
+msgid "      st_uid   differ. Cat: %u File: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:553
-msgid ""
-"Warning changing Volume Files can result\n"
-"in loss of data on your Volume\n"
-"\n"
+#: src/dird/verify.c:629
+#, c-format
+msgid "      st_gid   differ. Cat: %u File: %u\n"
 msgstr ""
 
-#: src/dird/ua_update.c:555
+#: src/dird/verify.c:637
 #, c-format
-msgid "Current Volume Files is: %u\n"
+msgid "      st_size  differ. Cat: %s File: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:556
-msgid "Enter new number of Files for Volume: "
+#: src/dird/verify.c:646
+msgid "      st_atime differs\n"
 msgstr ""
 
-#: src/dird/ua_update.c:561
-msgid "Normally, you should only increase Volume Files by one!\n"
+#: src/dird/verify.c:653
+msgid "      st_mtime differs\n"
 msgstr ""
 
-#: src/dird/ua_update.c:562
-msgid "Continue? (yes/no): "
+#: src/dird/verify.c:660
+msgid "      st_ctime differs\n"
 msgstr ""
 
-#: src/dird/ua_update.c:572
+#: src/dird/verify.c:667
 #, c-format
-msgid "New Volume Files is: %u\n"
+msgid "      st_size  decrease. Cat: %s File: %s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:584
+#: src/dird/verify.c:706
 #, c-format
-msgid "Current Pool is: %s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:585
-msgid "Enter new Pool name: "
-msgstr ""
-
-#: src/dird/ua_update.c:598
-msgid "Selection done.\n"
+msgid "      %s not same. File=%s Cat=%s\n"
 msgstr ""
 
-#: src/dird/ua_update.c:631
+#: src/dird/verify.c:709
 #, c-format
-msgid "db_update_pool_record returned %d. ERR=%s\n"
-msgstr ""
-
-#: src/dird/ua_update.c:638
-msgid "Pool DB record updated from resource.\n"
+msgid "      %s differs.\n"
 msgstr ""
 
-#: src/dird/pythondir.c:105 src/filed/pythonfd.c:102 src/filed/pythonfd.c:156
-#: src/filed/pythonfd.c:220 src/stored/pythonsd.c:95 src/stored/pythonsd.c:160
-msgid "Job pointer not found."
+#: src/dird/verify.c:721
+#, c-format
+msgid "bdird<filed: bad attributes from filed n=%d : %s\n"
 msgstr ""
 
-#: src/dird/pythondir.c:137
-msgid "Pool record not found."
+#: src/dird/verify.c:758
+msgid "The following files are missing:\n"
 msgstr ""
 
-#: src/dird/pythondir.c:166 src/filed/pythonfd.c:133 src/stored/pythonsd.c:137
+#: src/dird/verify.c:772 src/tools/testfind.c:338
 #, c-format
-msgid "Attribute %s not found."
-msgstr ""
-
-#: src/dird/pythondir.c:209 src/dird/pythondir.c:215 src/filed/pythonfd.c:175
-#: src/stored/pythonsd.c:177
-msgid "Read-only attribute"
+msgid "File: %s\n"
 msgstr ""
 
-#: src/filed/authenticate.c:50
+#: src/filed/authenticate.c:45
 #, c-format
 msgid "I only authenticate directors, not %d\n"
 msgstr ""
 
-#: src/filed/authenticate.c:56 src/stored/authenticate.c:59
+#: src/filed/authenticate.c:51 src/stored/authenticate.c:59
 #, c-format
 msgid "Bad Hello command from Director at %s. Len=%d.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:68 src/stored/authenticate.c:70
+#: src/filed/authenticate.c:63 src/stored/authenticate.c:70
 #, c-format
 msgid "Bad Hello command from Director at %s: %s\n"
 msgstr ""
 
-#: src/filed/authenticate.c:82 src/stored/authenticate.c:85
+#: src/filed/authenticate.c:77 src/stored/authenticate.c:85
 #, c-format
 msgid ""
 "Connection from unknown Director %s at %s rejected.\n"
@@ -5272,7 +5346,7 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:115
+#: src/filed/authenticate.c:110
 #, c-format
 msgid ""
 "Incorrect password given by Director at %s.\n"
@@ -5280,11 +5354,11 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/filed/authenticate.c:169 src/stored/dircmd.c:184
+#: src/filed/authenticate.c:164 src/stored/dircmd.c:184
 msgid "Unable to authenticate Director\n"
 msgstr ""
 
-#: src/filed/authenticate.c:213
+#: src/filed/authenticate.c:208
 msgid ""
 "Authorization key rejected by Storage daemon.\n"
 "Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for "
@@ -5345,48 +5419,48 @@ msgstr ""
 msgid "     Unknown file type %d; not saved: %s\n"
 msgstr ""
 
-#: src/filed/backup.c:243
+#: src/filed/backup.c:240
 #, c-format
 msgid "Python reader program \"%s\" not found.\n"
 msgstr ""
 
-#: src/filed/backup.c:268 src/filed/verify.c:214
+#: src/filed/backup.c:269 src/filed/verify.c:214
 #, c-format
 msgid "     Cannot open %s: ERR=%s.\n"
 msgstr ""
 
-#: src/filed/backup.c:297 src/filed/verify.c:229
+#: src/filed/backup.c:298 src/filed/verify.c:229
 #, c-format
 msgid "     Cannot open resource fork for %s: ERR=%s.\n"
 msgstr ""
 
-#: src/filed/backup.c:348
+#: src/filed/backup.c:349
 #, c-format
 msgid "Unknown signature type %i.\n"
 msgstr ""
 
-#: src/filed/backup.c:410 src/filed/backup.c:493 src/filed/backup.c:519
-#: src/filed/backup.c:548 src/filed/backup.c:561 src/filed/backup.c:569
-#: src/filed/backup.c:610 src/filed/backup.c:644
+#: src/filed/backup.c:414 src/filed/backup.c:499 src/filed/backup.c:525
+#: src/filed/backup.c:557 src/filed/backup.c:570 src/filed/backup.c:578
+#: src/filed/backup.c:619 src/filed/backup.c:653
 #, c-format
 msgid "Network send error to SD. ERR=%s\n"
 msgstr ""
 
-#: src/filed/backup.c:473
+#: src/filed/backup.c:479
 #, c-format
 msgid "Compression error: %d\n"
 msgstr ""
 
-#: src/filed/backup.c:510
+#: src/filed/backup.c:516
 #, c-format
 msgid "Read error on file %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/backup.c:513
+#: src/filed/backup.c:519
 msgid "Too many errors.\n"
 msgstr ""
 
-#: src/filed/backup.c:539
+#: src/filed/backup.c:548
 #, c-format
 msgid "Error reading ACL of %s\n"
 msgstr ""
@@ -5436,224 +5510,239 @@ msgstr ""
 msgid "No Director resource defined in %s\n"
 msgstr ""
 
-#: src/filed/job.c:323
+#: src/filed/job.c:324
 #, c-format
 msgid "2901 Job %s not found.\n"
 msgstr ""
 
-#: src/filed/job.c:339
+#: src/filed/job.c:333
 #, c-format
 msgid "2001 Job %s marked to be canceled.\n"
 msgstr ""
 
-#: src/filed/job.c:342
+#: src/filed/job.c:336
 msgid "2902 Error scanning cancel command.\n"
 msgstr ""
 
-#: src/filed/job.c:361
+#: src/filed/job.c:355
 #, c-format
 msgid "2991 Bad setdebug command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:377
+#: src/filed/job.c:371
 #, c-format
 msgid "Bad estimate command: %s"
 msgstr ""
 
-#: src/filed/job.c:378
+#: src/filed/job.c:372
 msgid "2992 Bad estimate command.\n"
 msgstr ""
 
-#: src/filed/job.c:401
+#: src/filed/job.c:395
 #, c-format
 msgid "Bad Job Command: %s"
 msgstr ""
 
-#: src/filed/job.c:421
+#: src/filed/job.c:415
 #, c-format
 msgid "Bad RunBeforeJob command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:422 src/filed/job.c:435
+#: src/filed/job.c:416 src/filed/job.c:429
 msgid "2905 Bad RunBeforeJob command.\n"
 msgstr ""
 
-#: src/filed/job.c:448
+#: src/filed/job.c:442
 #, c-format
 msgid "Bad RunAfter command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:449
+#: src/filed/job.c:443
 msgid "2905 Bad RunAfterJob command.\n"
 msgstr ""
 
-#: src/filed/job.c:475
+#: src/filed/job.c:469
 #, c-format
 msgid "%s could not execute. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:484
+#: src/filed/job.c:478
 #, c-format
 msgid "%s: %s\n"
 msgstr ""
 
-#: src/filed/job.c:489
+#: src/filed/job.c:483
 #, c-format
 msgid "%s returned non-zero status=%d. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:574
+#: src/filed/job.c:568
 #, c-format
 msgid "Error running program: %s. RtnStat=%d ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:584
+#: src/filed/job.c:578
 #, c-format
 msgid "Cannot open FileSet input file: %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:678
+#: src/filed/job.c:672
 #, c-format
 msgid "REGEX %s compile error. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:732
+#: src/filed/job.c:726
 #, c-format
 msgid "Invalid FileSet command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:901 src/findlib/match.c:184
+#: src/filed/job.c:895 src/findlib/match.c:184
 #, c-format
 msgid "Unknown include/exclude option: %c\n"
 msgstr ""
 
-#: src/filed/job.c:961 src/stored/fd_cmds.c:329
+#: src/filed/job.c:955 src/stored/fd_cmds.c:329
 #, c-format
 msgid "Could not create bootstrap file %s: ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1060
+#: src/filed/job.c:1057
 #, c-format
 msgid "DIR and FD clocks differ by %d seconds, FD automatically adjusting.\n"
 msgstr ""
 
-#: src/filed/job.c:1068
+#: src/filed/job.c:1065
 #, c-format
 msgid "Unknown backup level: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1080
+#: src/filed/job.c:1077
 #, c-format
 msgid "Bad level command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1101
+#: src/filed/job.c:1098
 #, c-format
 msgid "Bad session command: %s"
 msgstr ""
 
-#: src/filed/job.c:1122
+#: src/filed/job.c:1119
 #, c-format
 msgid "Bad storage command: %s"
 msgstr ""
 
-#: src/filed/job.c:1131
+#: src/filed/job.c:1128
 #, c-format
 msgid "Failed to connect to Storage daemon: %s:%d\n"
 msgstr ""
 
-#: src/filed/job.c:1143
+#: src/filed/job.c:1140
 msgid "Failed to authenticate Storage daemon.\n"
 msgstr ""
 
-#: src/filed/job.c:1169
+#: src/filed/job.c:1178
 msgid "Cannot contact Storage daemon\n"
 msgstr ""
 
-#: src/filed/job.c:1187
+#: src/filed/job.c:1196
 #, c-format
 msgid "Bad response to append open: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1192
+#: src/filed/job.c:1201
 msgid "Bad response from stored to open command\n"
 msgstr ""
 
-#: src/filed/job.c:1219
+#: src/filed/job.c:1228
 #, c-format
 msgid "Generate VSS snapshots. Driver=\"%s\", Drive(s)=\"%s\"\n"
 msgstr ""
 
-#: src/filed/job.c:1222
-#, c-format
-msgid "Generate VSS snapshots failed. ERR=%s\n"
+#: src/filed/job.c:1230
+msgid "Generate VSS snapshots failed.\n"
 msgstr ""
 
-#: src/filed/job.c:1229
+#: src/filed/job.c:1237
 #, c-format
 msgid "Generate VSS snapshot of drive \"%c:\\\" failed\n"
 msgstr ""
 
-#: src/filed/job.c:1238
+#: src/filed/job.c:1244
 #, c-format
-msgid "VSS Writer: %s\n"
+msgid "VSS Writer (PrepareForBackup): %s\n"
 msgstr ""
 
-#: src/filed/job.c:1242
+#: src/filed/job.c:1249
 msgid "No drive letters found for generating VSS snapshots.\n"
 msgstr ""
 
-#: src/filed/job.c:1245
-msgid "VSS was not initialized properly. VSS support is disabled.\n"
+#: src/filed/job.c:1253
+#, c-format
+msgid "VSS was not initialized properly. VSS support is disabled. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1294
+#: src/filed/job.c:1302
 msgid "Append Close with SD failed.\n"
 msgstr ""
 
-#: src/filed/job.c:1298
+#: src/filed/job.c:1306
 #, c-format
 msgid "Bad status %d returned from Storage Daemon.\n"
 msgstr ""
 
-#: src/filed/job.c:1331
+#: src/filed/job.c:1324
+#, c-format
+msgid "VSS Writer (BackupComplete): %s\n"
+msgstr ""
+
+#: src/filed/job.c:1351
 #, c-format
 msgid "2994 Bad verify command: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1346 src/filed/job.c:1385
+#: src/filed/job.c:1366 src/filed/job.c:1405
 #, c-format
 msgid "2994 Bad verify level: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1425
+#: src/filed/job.c:1445
 #, c-format
 msgid "Bad replace command. CMD=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1502
+#: src/filed/job.c:1522
 msgid "Improper calling sequence.\n"
 msgstr ""
 
-#: src/filed/job.c:1522
+#: src/filed/job.c:1542
 #, c-format
 msgid "Bad response to SD read open: %s\n"
 msgstr ""
 
-#: src/filed/job.c:1527
+#: src/filed/job.c:1547
 msgid "Bad response from stored to read open command\n"
 msgstr ""
 
-#: src/filed/job.c:1593
+#: src/filed/job.c:1613
 #, c-format
 msgid "Comm error with SD. bad response to %s. ERR=%s\n"
 msgstr ""
 
-#: src/filed/job.c:1596
+#: src/filed/job.c:1616
 #, c-format
 msgid "Bad response to %s command. Wanted %s, got %s\n"
 msgstr ""
 
+#: src/filed/pythonfd.c:144 src/stored/pythonsd.c:149
+#, c-format
+msgid "Cannot delete attribute %s"
+msgstr ""
+
+#: src/filed/pythonfd.c:162 src/filed/pythonfd.c:178 src/stored/pythonsd.c:182
+#, c-format
+msgid "Cannot find attribute %s"
+msgstr ""
+
 #: src/filed/restore.c:55
 #, c-format
 msgid "Size of data or stream of %s not correct. Original %s, restored %s.\n"
@@ -5683,7 +5772,7 @@ msgid "Logic error: output file should not be open\n"
 msgstr ""
 
 #: src/filed/restore.c:218 src/filed/verify_vol.c:142
-#: src/stored/bextract.c:289 src/stored/bls.c:372 src/stored/bscan.c:649
+#: src/stored/bextract.c:289 src/stored/bls.c:371 src/stored/bscan.c:651
 #, c-format
 msgid "Record header file index %ld not equal record index %ld\n"
 msgstr ""
@@ -5718,7 +5807,7 @@ msgstr ""
 msgid "Can't restore default ACL of %s\n"
 msgstr ""
 
-#: src/filed/restore.c:391 src/stored/bextract.c:449
+#: src/filed/restore.c:391 src/stored/bextract.c:455
 #, c-format
 msgid "Unknown stream=%d ignored. This shouldn't happen!\n"
 msgstr ""
@@ -5807,64 +5896,64 @@ msgstr ""
 msgid "Daemon started %s, %d Job%s run since started.\n"
 msgstr ""
 
-#: src/filed/status.c:125
+#: src/filed/status.c:127
 #, c-format
 msgid " Sizeof: off_t=%d size_t=%d debug=%d trace=%d\n"
 msgstr ""
 
-#: src/filed/status.c:136
+#: src/filed/status.c:138
 msgid "Running Jobs:\n"
 msgstr ""
 
-#: src/filed/status.c:147
+#: src/filed/status.c:149
 #, c-format
 msgid "Director connected at: %s\n"
 msgstr ""
 
-#: src/filed/status.c:149
+#: src/filed/status.c:151
 #, c-format
 msgid "JobId %d Job %s is running.\n"
 msgstr ""
 
-#: src/filed/status.c:152
+#: src/filed/status.c:154
 #, c-format
 msgid "    %s%s Job started: %s\n"
 msgstr ""
 
-#: src/filed/status.c:165 src/stored/status.c:296
+#: src/filed/status.c:166 src/stored/status.c:323
 #, c-format
 msgid "    Files=%s Bytes=%s Bytes/sec=%s\n"
 msgstr ""
 
-#: src/filed/status.c:170
+#: src/filed/status.c:171
 #, c-format
 msgid "    Files Examined=%s\n"
 msgstr ""
 
-#: src/filed/status.c:175
+#: src/filed/status.c:176
 #, c-format
 msgid "    Processing file: %s\n"
 msgstr ""
 
-#: src/filed/status.c:186
+#: src/filed/status.c:187
 msgid "    SDSocket closed.\n"
 msgstr ""
 
-#: src/filed/status.c:215
+#: src/filed/status.c:217
 msgid "Terminated Jobs:\n"
 msgstr ""
 
-#: src/filed/status.c:217
+#: src/filed/status.c:219
 msgid " JobId  Level     Files         Bytes  Status   Finished        Name \n"
 msgstr ""
 
-#: src/filed/status.c:321 src/filed/status.c:347 src/stored/status.c:468
-#: src/stored/status.c:493
+#: src/filed/status.c:323 src/filed/status.c:347 src/stored/status.c:513
+#: src/stored/status.c:536
 #, c-format
 msgid "Bad .status command: %s\n"
 msgstr ""
 
-#: src/filed/status.c:322
+#: src/filed/status.c:324
 msgid "2900 Bad .status command, missing argument.\n"
 msgstr ""
 
@@ -5872,23 +5961,23 @@ msgstr ""
 msgid "2900 Bad .status command, wrong argument.\n"
 msgstr ""
 
-#: src/filed/status.c:385 src/stored/status.c:423
+#: src/filed/status.c:385 src/stored/status.c:468
 msgid "Init Catalog"
 msgstr ""
 
-#: src/filed/status.c:388 src/stored/status.c:426
+#: src/filed/status.c:388 src/stored/status.c:471
 msgid "Volume to Catalog"
 msgstr ""
 
-#: src/filed/status.c:391 src/stored/status.c:429
+#: src/filed/status.c:391 src/stored/status.c:474
 msgid "Disk to Catalog"
 msgstr ""
 
-#: src/filed/status.c:394 src/stored/status.c:432
+#: src/filed/status.c:394 src/stored/status.c:477
 msgid "Data"
 msgstr ""
 
-#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:438
+#: src/filed/status.c:400 src/lib/util.c:351 src/stored/status.c:483
 msgid "Unknown Job Level"
 msgstr ""
 
@@ -5956,47 +6045,37 @@ msgstr ""
 msgid "Error scanning record header: %s\n"
 msgstr ""
 
-#: src/filed/pythonfd.c:150 src/stored/pythonsd.c:154
-#, c-format
-msgid "Cannot delete attribute %s"
-msgstr ""
-
-#: src/filed/pythonfd.c:168 src/filed/pythonfd.c:184 src/stored/pythonsd.c:187
-#, c-format
-msgid "Cannot find attribute %s"
-msgstr ""
-
-#: src/findlib/attribs.c:340
+#: src/findlib/attribs.c:335
 #, c-format
 msgid "File size of restored file %s not correct. Original %s, restored %s.\n"
 msgstr ""
 
-#: src/findlib/attribs.c:358 src/findlib/attribs.c:365
+#: src/findlib/attribs.c:353 src/findlib/attribs.c:360
 #, c-format
 msgid "Unable to set file owner %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:371
+#: src/findlib/attribs.c:366
 #, c-format
 msgid "Unable to set file modes %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:381
+#: src/findlib/attribs.c:376
 #, c-format
 msgid "Unable to set file times %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:395
+#: src/findlib/attribs.c:390
 #, c-format
 msgid "Unable to set file flags %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:640
+#: src/findlib/attribs.c:635
 #, c-format
 msgid "Error in %s file %s: ERR=%s\n"
 msgstr ""
 
-#: src/findlib/attribs.c:657
+#: src/findlib/attribs.c:652
 #, c-format
 msgid "Error in %s: ERR=%s\n"
 msgstr ""
@@ -6127,7 +6206,7 @@ msgstr ""
 msgid "Unknown file type %d; not restored: %s\n"
 msgstr ""
 
-#: src/findlib/create_file.c:392
+#: src/findlib/create_file.c:402
 #, c-format
 msgid "Zero length filename: %s\n"
 msgstr ""
@@ -6141,11 +6220,6 @@ msgstr ""
 msgid "Top level directory \"%s\" has an unlisted fstype\n"
 msgstr ""
 
-#: src/findlib/find_one.c:241
-#, c-format
-msgid "Attempt to backup hard linked file %s twice ignored.\n"
-msgstr ""
-
 #: src/findlib/makepath.c:117
 #, c-format
 msgid "Cannot create directory %s: ERR=%s\n"
@@ -6253,54 +6327,54 @@ msgstr ""
 msgid "Pthread cond init error = %s\n"
 msgstr ""
 
-#: src/gnome2-console/console.c:361
+#: src/gnome2-console/console.c:357
 msgid " Not Connected"
 msgstr ""
 
-#: src/gnome2-console/console.c:482
+#: src/gnome2-console/console.c:478
 #, c-format
 msgid " Connecting to Director %s:%d"
 msgstr ""
 
-#: src/gnome2-console/console.c:483
+#: src/gnome2-console/console.c:479
 #, c-format
 msgid ""
 "Connecting to Director %s:%d\n"
 "\n"
 msgstr ""
 
-#: src/gnome2-console/console.c:498 src/wx-console/console_thread.cpp:357
+#: src/gnome2-console/console.c:494 src/wx-console/console_thread.cpp:360
 #, c-format
 msgid "Passphrase for Console \"%s\" TLS private key: "
 msgstr ""
 
-#: src/gnome2-console/console.c:520 src/wx-console/console_thread.cpp:378
+#: src/gnome2-console/console.c:516 src/wx-console/console_thread.cpp:381
 #, c-format
 msgid "Passphrase for Director \"%s\" TLS private key: "
 msgstr ""
 
-#: src/gnome2-console/console.c:539 src/tray-monitor/tray-monitor.c:860
-#: src/wx-console/console_thread.cpp:396
+#: src/gnome2-console/console.c:535 src/tray-monitor/tray-monitor.c:860
+#: src/wx-console/console_thread.cpp:399
 msgid "Director daemon"
 msgstr ""
 
-#: src/gnome2-console/console.c:551
+#: src/gnome2-console/console.c:547
 msgid " Initializing ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:587
+#: src/gnome2-console/console.c:583
 msgid " Connected"
 msgstr ""
 
-#: src/gnome2-console/console.c:595
+#: src/gnome2-console/console.c:591
 msgid " Processing command ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:630
+#: src/gnome2-console/console.c:626
 msgid " At prompt waiting for input ..."
 msgstr ""
 
-#: src/gnome2-console/console.c:750
+#: src/gnome2-console/console.c:746
 msgid " Ready"
 msgstr ""
 
@@ -6314,218 +6388,204 @@ msgstr ""
 msgid "ConsoleFont: name=%s font face=%s\n"
 msgstr ""
 
-#: src/gnome2-console/interface.c:32
-msgid "_Connect"
+#: src/gnome2-console/interface.c:202
+msgid "Bacula Console"
+msgstr ""
+
+#: src/gnome2-console/interface.c:235 src/wx-console/wxbmainframe.cpp:229
+#: src/wx-console/wxbmainframe.cpp:597
+msgid "Connect"
 msgstr ""
 
-#: src/gnome2-console/interface.c:33 src/gnome2-console/interface.c:232
+#: src/gnome2-console/interface.c:238
 msgid "Connect to Director"
 msgstr ""
 
-#: src/gnome2-console/interface.c:39
-msgid "_Disconnect"
+#: src/gnome2-console/interface.c:242
+msgid "Run"
 msgstr ""
 
-#: src/gnome2-console/interface.c:40
-msgid "Disconnect from Director"
+#: src/gnome2-console/interface.c:245 src/gnome2-console/interface.c:683
+#: src/gnome2-console/interface.c:697
+msgid "Run a Job"
 msgstr ""
 
-#: src/gnome2-console/interface.c:93
-msgid "_Display Messages"
+#: src/gnome2-console/interface.c:249
+msgid "Dir Status"
 msgstr ""
 
-#: src/gnome2-console/interface.c:129
-msgid "_File"
+#: src/gnome2-console/interface.c:255 src/lib/util.c:292
+#: src/wx-console/wxbrestorepanel.cpp:384
+#: src/wx-console/wxbrestorepanel.cpp:1949
+msgid "Restore"
 msgstr ""
 
-#: src/gnome2-console/interface.c:136
-msgid "_Edit"
+#: src/gnome2-console/interface.c:261
+msgid "Label"
 msgstr ""
 
-#: src/gnome2-console/interface.c:143
-msgid "_View"
+#: src/gnome2-console/interface.c:267
+msgid "Msgs"
 msgstr ""
 
-#: src/gnome2-console/interface.c:144 src/gnome2-console/interface.c:252
+#: src/gnome2-console/interface.c:270
 msgid "Display Messages"
 msgstr ""
 
-#: src/gnome2-console/interface.c:150
-msgid "_Settings"
+#: src/gnome2-console/interface.c:294
+msgid " Command: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:157
-msgid "_Help"
+#: src/gnome2-console/interface.c:303
+msgid "Enter Commands Here"
 msgstr ""
 
-#: src/gnome2-console/interface.c:197
-msgid "Bacula Console"
+#: src/gnome2-console/interface.c:314
+msgid " Status: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:231 src/wx-console/wxbmainframe.cpp:229
-#: src/wx-console/wxbmainframe.cpp:590
-msgid "Connect"
-msgstr ""
-
-#: src/gnome2-console/interface.c:241
-msgid "Run"
-msgstr ""
-
-#: src/gnome2-console/interface.c:242 src/gnome2-console/interface.c:677
-#: src/gnome2-console/interface.c:690
-msgid "Run a Job"
-msgstr ""
-
-#: src/gnome2-console/interface.c:251
-msgid "Msgs"
-msgstr ""
-
-#: src/gnome2-console/interface.c:261 src/lib/util.c:298
-#: src/wx-console/wxbrestorepanel.cpp:426
-#: src/wx-console/wxbrestorepanel.cpp:1915
-msgid "Restore"
-msgstr ""
-
-#: src/gnome2-console/interface.c:271
-msgid "Label"
-msgstr ""
-
-#: src/gnome2-console/interface.c:299
-msgid " Command: "
-msgstr ""
-
-#: src/gnome2-console/interface.c:307
-msgid "Enter Commands Here"
-msgstr ""
-
-#: src/gnome2-console/interface.c:318
-msgid " Status: "
-msgstr ""
-
-#: src/gnome2-console/interface.c:326
+#: src/gnome2-console/interface.c:323 src/gnome2-console/interface.c:1716
 msgid "  "
 msgstr ""
 
-#: src/gnome2-console/interface.c:422
+#: src/gnome2-console/interface.c:424
 msgid "About Bacula Console"
 msgstr ""
 
-#: src/gnome2-console/interface.c:436
+#: src/gnome2-console/interface.c:439
 msgid "Bacula Console\n"
 msgstr ""
 
-#: src/gnome2-console/interface.c:444
+#: src/gnome2-console/interface.c:448
 msgid "Copyright (c) 2000 - 2004, Kern Sibbald and John Walker"
 msgstr ""
 
-#: src/gnome2-console/interface.c:450
+#: src/gnome2-console/interface.c:453
 msgid "Authors: Kern Sibbald and John Walker"
 msgstr ""
 
-#: src/gnome2-console/interface.c:456
+#: src/gnome2-console/interface.c:458
 msgid "It comes by night and sucks the essence from your computers"
 msgstr ""
 
-#: src/gnome2-console/interface.c:521 src/gnome2-console/interface.c:536
+#: src/gnome2-console/interface.c:523 src/gnome2-console/interface.c:540
 msgid "Select Director"
 msgstr ""
 
-#: src/gnome2-console/interface.c:708 src/gnome2-console/interface.c:1616
+#: src/gnome2-console/interface.c:570
+msgid "         "
+msgstr ""
+
+#: src/gnome2-console/interface.c:716 src/gnome2-console/interface.c:1638
 msgid "Job:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:728
+#: src/gnome2-console/interface.c:736
 msgid "   Type:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:757 src/gnome2-console/interface.c:1644
-#: src/wx-console/wxbrestorepanel.cpp:1828
+#: src/gnome2-console/interface.c:756 src/gnome2-console/interface.c:785
+#: src/gnome2-console/interface.c:1291 src/gnome2-console/interface.c:1687
+msgid " "
+msgstr ""
+
+#: src/gnome2-console/interface.c:765 src/gnome2-console/interface.c:1667
+#: src/wx-console/wxbrestorepanel.cpp:1862
 msgid "Client:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:787 src/gnome2-console/interface.c:1672
+#: src/gnome2-console/interface.c:796 src/gnome2-console/interface.c:1696
 msgid "FileSet: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:813 src/wx-console/wxbrestorepanel.cpp:1834
+#: src/gnome2-console/interface.c:821 src/wx-console/wxbrestorepanel.cpp:1868
 msgid "Priority:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:836
+#: src/gnome2-console/interface.c:842
 msgid "Level:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:866 src/gnome2-console/interface.c:1418
-#: src/gnome2-console/interface.c:1700
+#: src/gnome2-console/interface.c:863
+msgid "             "
+msgstr ""
+
+#: src/gnome2-console/interface.c:873 src/gnome2-console/interface.c:1440
+#: src/gnome2-console/interface.c:1725
 msgid "Pool:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:895 src/gnome2-console/interface.c:1393
-#: src/gnome2-console/interface.c:1728 src/wx-console/wxbrestorepanel.cpp:1830
+#: src/gnome2-console/interface.c:894 src/gnome2-console/interface.c:925
+#: src/gnome2-console/interface.c:955 src/gnome2-console/interface.c:975
+#: src/gnome2-console/interface.c:995 src/gnome2-console/interface.c:1015
+#: src/gnome2-console/interface.c:1020 src/gnome2-console/interface.c:1490
+#: src/gnome2-console/interface.c:1746 src/gnome2-console/interface.c:1776
+#: src/gnome2-console/interface.c:1795 src/gnome2-console/interface.c:1800
+msgid "   "
+msgstr ""
+
+#: src/gnome2-console/interface.c:904 src/gnome2-console/interface.c:1414
+#: src/gnome2-console/interface.c:1755 src/wx-console/wxbrestorepanel.cpp:1864
 msgid "Storage:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:924
+#: src/gnome2-console/interface.c:935
 msgid "Messages:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:952
+#: src/gnome2-console/interface.c:965
 msgid "Where: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:970 src/wx-console/wxbrestorepanel.cpp:1832
+#: src/gnome2-console/interface.c:985 src/wx-console/wxbrestorepanel.cpp:1866
 msgid "When:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:988 src/wx-console/wxbrestorepanel.cpp:1813
+#: src/gnome2-console/interface.c:1005 src/wx-console/wxbrestorepanel.cpp:1847
 msgid "Bootstrap:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1108
-msgid "_New"
-msgstr ""
-
-#: src/gnome2-console/interface.c:1177
+#: src/gnome2-console/interface.c:1201
 msgid "Restore File Selection"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1226
+#: src/gnome2-console/interface.c:1245
 msgid "Current dir:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1252
+#: src/gnome2-console/interface.c:1272
 msgid "Files Selected: "
 msgstr ""
 
-#: src/gnome2-console/interface.c:1373 src/gnome2-console/interface.c:1383
+#: src/gnome2-console/interface.c:1392 src/gnome2-console/interface.c:1403
 msgid "Label a Volume"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1444
+#: src/gnome2-console/interface.c:1465
 msgid "Volume Name:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1459
+#: src/gnome2-console/interface.c:1479
 msgid "Slot:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1585
+#: src/gnome2-console/interface.c:1605
 msgid "Restore Files Dialog"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1599
+#: src/gnome2-console/interface.c:1620
 msgid "Restore Files"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1756
+#: src/gnome2-console/interface.c:1785
 msgid "Before:"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1799
+#: src/gnome2-console/interface.c:1831
 msgid "Select Files"
 msgstr ""
 
-#: src/gnome2-console/interface.c:1883
+#: src/gnome2-console/interface.c:1914
 msgid "Progress"
 msgstr ""
 
@@ -6533,162 +6593,253 @@ msgstr ""
 msgid "Mark"
 msgstr ""
 
+#: src/gnome2-console/restore.c:121
+msgid "File"
+msgstr ""
+
 #: src/gnome2-console/restore.c:121
 msgid "Mode"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:330
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:288
 msgid "User"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:334
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:292
 msgid "Group"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:318
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:276
 msgid "Size"
 msgstr ""
 
-#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:322
+#: src/gnome2-console/restore.c:121 src/wx-console/wxbrestorepanel.cpp:280
 msgid "Date"
 msgstr ""
 
-#: src/gnome2-console/support.c:41
+#: src/gnome2-console/support.c:60 src/gnome2-console/support.c:85
 #, c-format
-msgid "Widget not found: %s"
+msgid "Couldn't find pixmap file: %s"
 msgstr ""
 
-#: src/gnome2-console/support.c:60 src/gnome2-console/support.c:85
+#: src/lib/tls.c:105
 #, c-format
-msgid "Couldn't find pixmap file: %s"
+msgid ""
+"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
+msgstr ""
+
+#: src/lib/tls.c:152
+msgid "Error initializing SSL context"
+msgstr ""
+
+#: src/lib/tls.c:173
+msgid "Error loading certificate verification stores"
+msgstr ""
+
+#: src/lib/tls.c:178
+msgid ""
+"Either a certificate file or a directory must be specified as a verification "
+"store\n"
+msgstr ""
+
+#: src/lib/tls.c:189
+msgid "Error loading certificate file"
+msgstr ""
+
+#: src/lib/tls.c:197
+msgid "Error loading private key"
 msgstr ""
 
-#: src/gnome2-console/support.c:92
+#: src/lib/tls.c:205
+msgid "Unable to open DH parameters file"
+msgstr ""
+
+#: src/lib/tls.c:211
+msgid "Unable to load DH parameters from specified file"
+msgstr ""
+
+#: src/lib/tls.c:215
+msgid "Failed to set TLS Diffie-Hellman parameters"
+msgstr ""
+
+#: src/lib/tls.c:224
+msgid "Error setting cipher list, no valid ciphers available\n"
+msgstr ""
+
+#: src/lib/tls.c:272
+msgid "Peer failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:314
+#, c-format
+msgid "Peer %s failed to present a TLS certificate\n"
+msgstr ""
+
+#: src/lib/tls.c:417
+msgid "Error creating file descriptor-based BIO"
+msgstr ""
+
+#: src/lib/tls.c:428
+msgid "Error creating new SSL object"
+msgstr ""
+
+#: src/lib/tls.c:492 src/lib/tls.c:515
+msgid "Connect failure"
+msgstr ""
+
+#: src/lib/tls.c:592 src/lib/tls.c:596
+msgid "TLS shutdown failure."
+msgstr ""
+
+#: src/lib/tls.c:645 src/lib/tls.c:665
+msgid "TLS read/write failure."
+msgstr ""
+
+#: src/lib/tls.c:723 src/lib/tls.c:780 src/stored/dev.c:209
+#: src/stored/dev.c:227 src/stored/dev.c:233 src/stored/stored_conf.c:593
+#, c-format
+msgid "Unable to init mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:743 src/lib/tls.c:812
+#, c-format
+msgid "Unable to destroy mutex: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:877
 #, c-format
-msgid "Failed to load pixbuf file: %s: %s\n"
+msgid "Unable to init OpenSSL threading: ERR=%s\n"
+msgstr ""
+
+#: src/lib/tls.c:887
+msgid "Failed to seed OpenSSL PRNG\n"
+msgstr ""
+
+#: src/lib/tls.c:913
+msgid "Failed to save OpenSSL PRNG\n"
 msgstr ""
 
-#: src/lib/address_conf.c:55
+#: src/lib/address_conf.c:50
 #, c-format
 msgid "Only ipv4 and ipv6 are supported (%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:59
+#: src/lib/address_conf.c:54
 #, c-format
 msgid "Only ipv4 is supported (%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:167
+#: src/lib/address_conf.c:163
 #, c-format
 msgid "It was tried to assign a ipv6 address to a ipv4(%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:176
+#: src/lib/address_conf.c:172
 #, c-format
 msgid "It was tried to assign a ipv4 address to a ipv6(%d)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:255
+#: src/lib/address_conf.c:251
 #, c-format
 msgid "Can't add default address (%s)\n"
 msgstr ""
 
-#: src/lib/address_conf.c:285
+#: src/lib/address_conf.c:281
 msgid "the old style addresses cannot be mixed with new style"
 msgstr ""
 
-#: src/lib/address_conf.c:308
+#: src/lib/address_conf.c:304
 #, c-format
 msgid "can't resolve service(%s)"
 msgstr ""
 
-#: src/lib/address_conf.c:318
+#: src/lib/address_conf.c:314
 #, c-format
 msgid "can't resolve hostname(%s) %s"
 msgstr ""
 
-#: src/lib/address_conf.c:407
+#: src/lib/address_conf.c:403
 #, c-format
 msgid "Expected a block begin { , got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:412
+#: src/lib/address_conf.c:408
 msgid "Empty addr block is not allowed"
 msgstr ""
 
-#: src/lib/address_conf.c:416
+#: src/lib/address_conf.c:412
 #, c-format
 msgid "Expected a string, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:425
+#: src/lib/address_conf.c:421
 #, c-format
 msgid "Expected a string [ip|ipv4|ipv6], got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:429
+#: src/lib/address_conf.c:425
 #, c-format
 msgid "Expected a string [ip|ipv4], got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:434 src/lib/address_conf.c:464
+#: src/lib/address_conf.c:430 src/lib/address_conf.c:460
 #, c-format
 msgid "Expected a equal =, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:438
+#: src/lib/address_conf.c:434
 #, c-format
 msgid "Expected a block beginn { , got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:445 src/lib/address_conf.c:460
+#: src/lib/address_conf.c:441 src/lib/address_conf.c:456
 #, c-format
 msgid "Expected a identifier [addr|port], got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:450
+#: src/lib/address_conf.c:446
 msgid "Only one port per address block"
 msgstr ""
 
-#: src/lib/address_conf.c:456
+#: src/lib/address_conf.c:452
 msgid "Only one addr per address block"
 msgstr ""
 
-#: src/lib/address_conf.c:472
+#: src/lib/address_conf.c:468
 #, c-format
 msgid "Expected a number or a string, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:478
+#: src/lib/address_conf.c:474
 #, c-format
 msgid "Expected an IP number or a hostname, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:484
+#: src/lib/address_conf.c:480
 msgid "State machine missmatch"
 msgstr ""
 
-#: src/lib/address_conf.c:490 src/lib/address_conf.c:503
+#: src/lib/address_conf.c:486 src/lib/address_conf.c:499
 #, c-format
 msgid "Expected a end of block }, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:496
+#: src/lib/address_conf.c:492
 #, c-format
 msgid "Can't add hostname(%s) and port(%s) to addrlist (%s)"
 msgstr ""
 
-#: src/lib/address_conf.c:512
+#: src/lib/address_conf.c:508
 #, c-format
 msgid "Expected a hostname or IP nummer, got: %s"
 msgstr ""
 
-#: src/lib/address_conf.c:517 src/lib/address_conf.c:531
+#: src/lib/address_conf.c:513 src/lib/address_conf.c:527
 #, c-format
 msgid "can't add port (%s) to (%s)"
 msgstr ""
 
-#: src/lib/address_conf.c:526
+#: src/lib/address_conf.c:522
 #, c-format
 msgid "Expected a port number or string, got: %s"
 msgstr ""
@@ -6698,25 +6849,25 @@ msgstr ""
 msgid "Error scanning attributes: %s\n"
 msgstr ""
 
-#: src/lib/berrno.c:66
+#: src/lib/berrno.c:48
 msgid "Child exited normally."
 msgstr ""
 
-#: src/lib/berrno.c:73
+#: src/lib/berrno.c:55
 msgid "Unknown error during program execvp"
 msgstr ""
 
-#: src/lib/berrno.c:76
+#: src/lib/berrno.c:58
 #, c-format
 msgid "Child exited with code %d"
 msgstr ""
 
-#: src/lib/berrno.c:84
+#: src/lib/berrno.c:66
 #, c-format
 msgid "Child died from signal %d: %s"
 msgstr ""
 
-#: src/lib/berrno.c:90
+#: src/lib/berrno.c:72
 msgid "Invalid errno. No error message possible."
 msgstr ""
 
@@ -6734,148 +6885,148 @@ msgstr ""
 msgid "Attr spool write error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:207 src/lib/bnet.c:264
+#: src/lib/bnet.c:209 src/lib/bnet.c:266
 #, c-format
 msgid "Read expected %d got %d from %s:%s:%d\n"
 msgstr ""
 
-#: src/lib/bnet.c:225
+#: src/lib/bnet.c:227
 #, c-format
 msgid "Packet size too big from \"%s:%s:%d. Terminating connection.\n"
 msgstr ""
 
-#: src/lib/bnet.c:254
+#: src/lib/bnet.c:256
 #, c-format
 msgid "Read error from %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:330 src/lib/bnet.c:346
+#: src/lib/bnet.c:332 src/lib/bnet.c:348
 #, c-format
 msgid "fread attr spool error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:390
+#: src/lib/bnet.c:392
 #, c-format
 msgid "Write error sending len to %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:395 src/lib/bnet.c:427
+#: src/lib/bnet.c:397 src/lib/bnet.c:430
 #, c-format
 msgid "Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"
 msgstr ""
 
-#: src/lib/bnet.c:421
+#: src/lib/bnet.c:424
 #, c-format
 msgid "Write error sending %d bytes to %s:%s:%d: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:447 src/lib/bnet.c:487
+#: src/lib/bnet.c:450 src/lib/bnet.c:490
 msgid "TLS connection initialization failed.\n"
 msgstr ""
 
-#: src/lib/bnet.c:455
+#: src/lib/bnet.c:458
 msgid "TLS Negotiation failed.\n"
 msgstr ""
 
-#: src/lib/bnet.c:461
+#: src/lib/bnet.c:464
 msgid ""
 "TLS certificate verification failed. Peer certificate did not match a "
 "required commonName\n"
 msgstr ""
 
-#: src/lib/bnet.c:499
+#: src/lib/bnet.c:502
 #, c-format
 msgid ""
 "TLS host certificate verification failed. Host %s did not match presented "
 "certificate\n"
 msgstr ""
 
-#: src/lib/bnet.c:513 src/lib/bnet.c:518
+#: src/lib/bnet.c:516 src/lib/bnet.c:521
 msgid "TLS not configured.\n"
 msgstr ""
 
-#: src/lib/bnet.c:614
+#: src/lib/bnet.c:617
 msgid "No problem."
 msgstr ""
 
-#: src/lib/bnet.c:617
+#: src/lib/bnet.c:620
 msgid "Authoritative answer for host not found."
 msgstr ""
 
-#: src/lib/bnet.c:620
+#: src/lib/bnet.c:623
 msgid "Non-authoritative for host not found, or ServerFail."
 msgstr ""
 
-#: src/lib/bnet.c:623
+#: src/lib/bnet.c:626
 msgid "Non-recoverable errors, FORMERR, REFUSED, or NOTIMP."
 msgstr ""
 
-#: src/lib/bnet.c:626
+#: src/lib/bnet.c:629
 msgid "Valid name, no data record of resquested type."
 msgstr ""
 
-#: src/lib/bnet.c:629
+#: src/lib/bnet.c:632
 msgid "Unknown error."
 msgstr ""
 
-#: src/lib/bnet.c:764
+#: src/lib/bnet.c:767
 #, c-format
 msgid "gethostbyname() for host \"%s\" failed: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:784
+#: src/lib/bnet.c:787
 #, c-format
 msgid "Socket open error. proto=%d port=%d. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:793 src/lib/bnet.c:818 src/lib/bnet_server.c:194
-#: src/lib/bnet_server.c:352
+#: src/lib/bnet.c:796 src/lib/bnet.c:821 src/lib/bnet_server.c:193
+#: src/lib/bnet_server.c:351
 #, c-format
 msgid "Cannot set SO_KEEPALIVE on socket: %s\n"
 msgstr ""
 
-#: src/lib/bnet.c:849
+#: src/lib/bnet.c:852
 #, c-format
 msgid ""
 "Could not connect to %s on %s:%d. ERR=%s\n"
 "Retrying ...\n"
 msgstr ""
 
-#: src/lib/bnet.c:855
+#: src/lib/bnet.c:858
 #, c-format
 msgid "Unable to connect to %s on %s:%d. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:933
+#: src/lib/bnet.c:936
 msgid "Could not malloc BSOCK data buffer\n"
 msgstr ""
 
-#: src/lib/bnet.c:940 src/lib/bnet.c:964
+#: src/lib/bnet.c:943 src/lib/bnet.c:967
 #, c-format
 msgid "sockopt error: %s\n"
 msgstr ""
 
-#: src/lib/bnet.c:946 src/lib/bnet.c:970
+#: src/lib/bnet.c:949 src/lib/bnet.c:973
 #, c-format
 msgid "Warning network buffer = %d bytes not max size.\n"
 msgstr ""
 
-#: src/lib/bnet.c:950 src/lib/bnet.c:974
+#: src/lib/bnet.c:953 src/lib/bnet.c:977
 #, c-format
 msgid "Network buffer size %d not multiple of tape block size.\n"
 msgstr ""
 
-#: src/lib/bnet.c:994 src/lib/bnet.c:1028
+#: src/lib/bnet.c:997 src/lib/bnet.c:1031
 #, c-format
 msgid "fcntl F_GETFL error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:1000 src/lib/bnet.c:1034 src/lib/bnet.c:1059
+#: src/lib/bnet.c:1003 src/lib/bnet.c:1037 src/lib/bnet.c:1062
 #, c-format
 msgid "fcntl F_SETFL error. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet.c:1113
+#: src/lib/bnet.c:1116
 #, c-format
 msgid "Unknown sig %d"
 msgstr ""
@@ -6890,7 +7041,7 @@ msgstr ""
 msgid "Cannot open stream socket. ERR=%s. Current %s All %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:259
+#: src/lib/bnet_server.c:109 src/lib/bnet_server.c:258
 #, c-format
 msgid "Cannot set SO_REUSEADDR on socket: %s\n"
 msgstr ""
@@ -6910,50 +7061,50 @@ msgstr ""
 msgid "Could not init client queue: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:158 src/lib/bnet_server.c:321
+#: src/lib/bnet_server.c:157 src/lib/bnet_server.c:320
 #, c-format
 msgid "Error in select: %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:179 src/lib/bnet_server.c:340
+#: src/lib/bnet_server.c:178 src/lib/bnet_server.c:339
 #, c-format
 msgid "Connection from %s:%d refused by hosts.access\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:205
+#: src/lib/bnet_server.c:204
 msgid "Could not create client BSOCK.\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:212
+#: src/lib/bnet_server.c:211
 #, c-format
 msgid "Could not add job to client queue: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:223
+#: src/lib/bnet_server.c:222
 #, c-format
 msgid "Could not destroy client queue: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:250
+#: src/lib/bnet_server.c:249
 #, c-format
 msgid "Cannot open stream socket: %s\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:279
+#: src/lib/bnet_server.c:278
 #, c-format
 msgid "Cannot bind port %d: ERR=%s: retrying ...\n"
 msgstr ""
 
-#: src/lib/bnet_server.c:285
+#: src/lib/bnet_server.c:284
 msgid "Server socket"
 msgstr ""
 
-#: src/lib/bnet_server.c:367
+#: src/lib/bnet_server.c:366
 #, c-format
 msgid "Socket accept error for %s. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bpipe.c:282 src/lib/bpipe.c:357
+#: src/lib/bpipe.c:283 src/lib/bpipe.c:362
 msgid "Program killed by Bacula watchdog (timeout)\n"
 msgstr ""
 
@@ -6987,85 +7138,85 @@ msgstr ""
 msgid "Out of memory: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:254
+#: src/lib/bsys.c:256
 msgid "Buffer overflow.\n"
 msgstr ""
 
-#: src/lib/bsys.c:319
+#: src/lib/bsys.c:322
 msgid "Bad errno"
 msgstr ""
 
-#: src/lib/bsys.c:336
+#: src/lib/bsys.c:339
 msgid "Possible mutex deadlock.\n"
 msgstr ""
 
-#: src/lib/bsys.c:340 src/lib/bsys.c:372
+#: src/lib/bsys.c:343 src/lib/bsys.c:375
 #, c-format
 msgid "Mutex lock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:343
+#: src/lib/bsys.c:346
 msgid "Possible mutex deadlock resolved.\n"
 msgstr ""
 
-#: src/lib/bsys.c:355
+#: src/lib/bsys.c:358
 #, c-format
 msgid "Mutex unlock not locked. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:360 src/lib/bsys.c:382
+#: src/lib/bsys.c:363 src/lib/bsys.c:385
 #, c-format
 msgid "Mutex unlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:396
+#: src/lib/bsys.c:399
 #, c-format
 msgid "Memset for %d bytes at %s:%d\n"
 msgstr ""
 
-#: src/lib/bsys.c:425
+#: src/lib/bsys.c:428
 #, c-format
 msgid "Cannot open pid file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:429
+#: src/lib/bsys.c:432
 #, c-format
 msgid ""
 "%s is already running. pid=%d\n"
 "Check file %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:442
+#: src/lib/bsys.c:445
 #, c-format
 msgid "Could not open pid file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:536
+#: src/lib/bsys.c:565
 #, c-format
 msgid "Could not create state file. %s ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:552
+#: src/lib/bsys.c:584
 #, c-format
 msgid "Write final hdr error: ERR=%s\n"
 msgstr ""
 
-#: src/lib/bsys.c:574
+#: src/lib/bsys.c:611
 #, c-format
 msgid "Could not find specified group: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:577 src/lib/bsys.c:581
+#: src/lib/bsys.c:614 src/lib/bsys.c:618
 #, c-format
 msgid "Could not set specified group: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:590
+#: src/lib/bsys.c:627
 #, c-format
 msgid "Could not find specified userid: %s\n"
 msgstr ""
 
-#: src/lib/bsys.c:593
+#: src/lib/bsys.c:630
 #, c-format
 msgid "Could not set specified userid: %s\n"
 msgstr ""
@@ -7074,21 +7225,21 @@ msgstr ""
 msgid "stop_btimer called with NULL btimer_id\n"
 msgstr ""
 
-#: src/lib/cram-md5.c:80 src/lib/cram-md5.c:105
+#: src/lib/cram-md5.c:76 src/lib/cram-md5.c:101
 msgid "1999 Authorization failed.\n"
 msgstr ""
 
-#: src/lib/daemon.c:58
+#: src/lib/daemon.c:53
 #, c-format
 msgid "Cannot fork to become daemon: %s\n"
 msgstr ""
 
-#: src/lib/edit.c:400
+#: src/lib/edit.c:433
 #, c-format
 msgid "Illegal character \"%c\" in name.\n"
 msgstr ""
 
-#: src/lib/edit.c:407
+#: src/lib/edit.c:440
 msgid "Name too long.\n"
 msgstr ""
 
@@ -7096,40 +7247,40 @@ msgstr ""
 msgid "Events not available"
 msgstr ""
 
-#: src/lib/jcr.c:277
+#: src/lib/jcr.c:279
 msgid "NULL jcr.\n"
 msgstr ""
 
-#: src/lib/jcr.c:396
+#: src/lib/jcr.c:400
 #, c-format
 msgid "JCR use_count=%d JobId=%d\n"
 msgstr ""
 
-#: src/lib/jcr.c:625
+#: src/lib/jcr.c:678
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading Storage "
 "daemon.\n"
 msgstr ""
 
-#: src/lib/jcr.c:637
+#: src/lib/jcr.c:690
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading File daemon.\n"
 msgstr ""
 
-#: src/lib/jcr.c:649
+#: src/lib/jcr.c:702
 #, c-format
 msgid ""
 "Watchdog sending kill after %d secs to thread stalled reading Director.\n"
 msgstr ""
 
-#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:192
+#: src/lib/lex.c:79 src/wx-console/console_thread.cpp:186
 #, c-format
 msgid "Problem probably begins at line %d.\n"
 msgstr ""
 
-#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:197
+#: src/lib/lex.c:84 src/wx-console/console_thread.cpp:191
 #, c-format
 msgid ""
 "Config error: %s\n"
@@ -7224,14 +7375,14 @@ msgstr ""
 msgid "expected a string, got %s: %s"
 msgstr ""
 
-#: src/lib/mem_pool.c:100
+#: src/lib/mem_pool.c:95
 #, c-format
 msgid "MemPool index %d larger than max %d\n"
 msgstr ""
 
-#: src/lib/mem_pool.c:118 src/lib/mem_pool.c:138 src/lib/mem_pool.c:173
-#: src/lib/mem_pool.c:244 src/lib/mem_pool.c:264 src/lib/mem_pool.c:302
-#: src/lib/mem_pool.c:521
+#: src/lib/mem_pool.c:113 src/lib/mem_pool.c:133 src/lib/mem_pool.c:168
+#: src/lib/mem_pool.c:239 src/lib/mem_pool.c:259 src/lib/mem_pool.c:297
+#: src/lib/mem_pool.c:550
 #, c-format
 msgid "Out of memory requesting %d bytes\n"
 msgstr ""
@@ -7466,177 +7617,156 @@ msgid ""
 "Perhaps you left the trailing brace off of the previous resource."
 msgstr ""
 
-#: src/lib/parse_conf.c:850
+#: src/lib/parse_conf.c:844
+msgid "Name not specified for resource"
+msgstr ""
+
+#: src/lib/parse_conf.c:853
 #, c-format
 msgid "unexpected token %d %s in resource definition"
 msgstr ""
 
-#: src/lib/parse_conf.c:856
+#: src/lib/parse_conf.c:859
 #, c-format
 msgid "Unknown parser state %d\n"
 msgstr ""
 
-#: src/lib/parse_conf.c:861
+#: src/lib/parse_conf.c:864
 msgid "End of conf file reached with unclosed resource."
 msgstr ""
 
-#: src/lib/regex.c:1040
-msgid "Success"
-msgstr ""
-
-#: src/lib/regex.c:1043
-msgid "No match"
-msgstr ""
-
-#: src/lib/regex.c:1046
-msgid "Invalid regular expression"
-msgstr ""
-
-#: src/lib/regex.c:1049
-msgid "Invalid collation character"
-msgstr ""
-
-#: src/lib/regex.c:1052
-msgid "Invalid character class name"
-msgstr ""
-
-#: src/lib/regex.c:1055
-msgid "Trailing backslash"
-msgstr ""
-
-#: src/lib/regex.c:1058
-msgid "Invalid back reference"
-msgstr ""
-
-#: src/lib/regex.c:1061
-msgid "Unmatched [ or [^"
-msgstr ""
-
-#: src/lib/regex.c:1064
-msgid "Unmatched ( or \\("
+#: src/lib/pythonlib.c:114
+msgid "Could not initialize Python\n"
 msgstr ""
 
-#: src/lib/regex.c:1067
-msgid "Unmatched \\{"
+#: src/lib/pythonlib.c:119
+#, c-format
+msgid "Could not Run Python string %s\n"
 msgstr ""
 
-#: src/lib/regex.c:1070
-msgid "Invalid content of \\{\\}"
+#: src/lib/pythonlib.c:131
+msgid "Could not initialize Python Job type.\n"
 msgstr ""
 
-#: src/lib/regex.c:1073
-msgid "Invalid range end"
+#: src/lib/pythonlib.c:136
+#, c-format
+msgid "Could not import Python script %s/%s. Python disabled.\n"
 msgstr ""
 
-#: src/lib/regex.c:1076
-msgid "Memory exhausted"
+#: src/lib/pythonlib.c:239
+msgid "Could not create Python Job Object.\n"
 msgstr ""
 
-#: src/lib/regex.c:1079
-msgid "Invalid preceding regular expression"
+#: src/lib/pythonlib.c:252 src/lib/pythonlib.c:276
+#, c-format
+msgid "Python function \"%s\" not found.\n"
 msgstr ""
 
-#: src/lib/regex.c:1082
-msgid "Premature end of regular expression"
+#: src/lib/pythonlib.c:291
+#, c-format
+msgid "Unknown Python daemon event %s\n"
 msgstr ""
 
-#: src/lib/regex.c:1085
-msgid "Regular expression too big"
+#: src/lib/pythonlib.c:316
+#, c-format
+msgid "Unable to initialize the Python lock. ERR=%s\n"
 msgstr ""
 
-#: src/lib/regex.c:1088
-msgid "Unmatched ) or \\)"
+#: src/lib/res.c:66
+#, c-format
+msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
 msgstr ""
 
-#: src/lib/regex.c:5874
-msgid "No previous regular expression"
+#: src/lib/res.c:76
+#, c-format
+msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:289
+#: src/lib/rwlock.c:284
 msgid "rwl_writeunlock called too many times.\n"
 msgstr ""
 
-#: src/lib/rwlock.c:293
+#: src/lib/rwlock.c:288
 msgid "rwl_writeunlock by non-owner.\n"
 msgstr ""
 
-#: src/lib/rwlock.c:358 src/lib/semlock.c:248
+#: src/lib/rwlock.c:353 src/lib/semlock.c:248
 #, c-format
 msgid "Write lock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:365 src/lib/semlock.c:255
+#: src/lib/rwlock.c:360 src/lib/semlock.c:255
 #, c-format
 msgid "Write unlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:375 src/lib/semlock.c:265
+#: src/lib/rwlock.c:370 src/lib/semlock.c:265
 #, c-format
 msgid "Read lock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:382 src/lib/semlock.c:272
+#: src/lib/rwlock.c:377 src/lib/semlock.c:272
 #, c-format
 msgid "Read unlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:391 src/lib/semlock.c:281
+#: src/lib/rwlock.c:386 src/lib/semlock.c:281
 #, c-format
 msgid "Thread %d found unchanged elements %d times\n"
 msgstr ""
 
-#: src/lib/rwlock.c:423 src/lib/semlock.c:313
+#: src/lib/rwlock.c:418 src/lib/semlock.c:313
 #, c-format
 msgid "Init rwlock failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:438 src/lib/semlock.c:328
+#: src/lib/rwlock.c:433 src/lib/semlock.c:328
 #, c-format
 msgid "Create thread failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:449 src/lib/semlock.c:339
+#: src/lib/rwlock.c:444 src/lib/semlock.c:339
 #, c-format
 msgid "Join thread failed. ERR=%s\n"
 msgstr ""
 
-#: src/lib/rwlock.c:452 src/lib/semlock.c:342
+#: src/lib/rwlock.c:447 src/lib/semlock.c:342
 #, c-format
 msgid "%02d: interval %d, writes %d, reads %d\n"
 msgstr ""
 
-#: src/lib/rwlock.c:462 src/lib/semlock.c:352
+#: src/lib/rwlock.c:457 src/lib/semlock.c:352
 #, c-format
 msgid "data %02d: value %d, %d writes\n"
 msgstr ""
 
-#: src/lib/rwlock.c:467 src/lib/semlock.c:357
+#: src/lib/rwlock.c:462 src/lib/semlock.c:357
 #, c-format
 msgid "Total: %d thread writes, %d data writes\n"
 msgstr ""
 
-#: src/lib/rwlock.c:539 src/lib/semlock.c:429
+#: src/lib/rwlock.c:534 src/lib/semlock.c:429
 msgid "Try write lock"
 msgstr ""
 
-#: src/lib/rwlock.c:545 src/lib/semlock.c:435
+#: src/lib/rwlock.c:540 src/lib/semlock.c:435
 msgid "Try read lock"
 msgstr ""
 
-#: src/lib/rwlock.c:600 src/lib/semlock.c:490
+#: src/lib/rwlock.c:595 src/lib/semlock.c:490
 msgid "Create thread"
 msgstr ""
 
-#: src/lib/rwlock.c:610 src/lib/semlock.c:500
+#: src/lib/rwlock.c:605 src/lib/semlock.c:500
 msgid "Join thread"
 msgstr ""
 
-#: src/lib/rwlock.c:612 src/lib/semlock.c:502
+#: src/lib/rwlock.c:607 src/lib/semlock.c:502
 #, c-format
 msgid "%02d: interval %d, updates %d, r_collisions %d, w_collisions %d\n"
 msgstr ""
 
-#: src/lib/rwlock.c:624 src/lib/semlock.c:514
+#: src/lib/rwlock.c:619 src/lib/semlock.c:514
 #, c-format
 msgid "data %02d: value %d, %d updates\n"
 msgstr ""
@@ -7850,41 +7980,41 @@ msgstr ""
 msgid "Resource Lost (e.g. record-lock lost)"
 msgstr ""
 
-#: src/lib/smartall.c:137 src/lib/smartall.c:228 src/lib/smartall.c:243
+#: src/lib/smartall.c:132 src/lib/smartall.c:225 src/lib/smartall.c:240
 msgid "Out of memory\n"
 msgstr ""
 
-#: src/lib/smartall.c:165
+#: src/lib/smartall.c:160
 #, c-format
 msgid "Attempt to free NULL called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:181
+#: src/lib/smartall.c:176
 #, c-format
 msgid "qp->qnext->qprev != qp called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:185
+#: src/lib/smartall.c:180
 #, c-format
 msgid "qp->qprev->qnext != qp called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:194
+#: src/lib/smartall.c:189
 #, c-format
 msgid "Buffer overrun called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:265
+#: src/lib/smartall.c:262
 #, c-format
 msgid "sm_realloc size: %d\n"
 msgstr ""
 
-#: src/lib/smartall.c:306
+#: src/lib/smartall.c:303
 #, c-format
 msgid "sm_realloc %d at %x from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:368
+#: src/lib/smartall.c:365
 #, c-format
 msgid ""
 "\n"
@@ -7893,125 +8023,133 @@ msgid ""
 "  Buffer address with bad links: %lx\n"
 msgstr ""
 
-#: src/lib/smartall.c:379
+#: src/lib/smartall.c:376
 #, c-format
 msgid "Orphaned buffer:  %6u bytes allocated at line %d of %s %s\n"
 msgstr ""
 
-#: src/lib/smartall.c:415
+#: src/lib/smartall.c:412
 #, c-format
 msgid "Damaged buffer found. Called from %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:445
+#: src/lib/smartall.c:442
 #, c-format
 msgid ""
 "\n"
 "Damaged buffers found at %s:%d\n"
 msgstr ""
 
-#: src/lib/smartall.c:448
+#: src/lib/smartall.c:445
 #, c-format
 msgid "  discovery of bad prev link.\n"
 msgstr ""
 
-#: src/lib/smartall.c:451
+#: src/lib/smartall.c:448
 #, c-format
 msgid "  discovery of bad next link.\n"
 msgstr ""
 
-#: src/lib/smartall.c:454
+#: src/lib/smartall.c:451
 #, c-format
 msgid "  discovery of data overrun.\n"
 msgstr ""
 
-#: src/lib/smartall.c:457
+#: src/lib/smartall.c:454
 #, c-format
 msgid "  Buffer address: %lx\n"
 msgstr ""
 
-#: src/lib/smartall.c:464
+#: src/lib/smartall.c:461
 #, c-format
 msgid "Damaged buffer:  %6u bytes allocated at line %d of %s %s\n"
 msgstr ""
 
-#: src/lib/util.c:187
+#: src/lib/util.c:181
 msgid "Running"
 msgstr ""
 
-#: src/lib/util.c:190
+#: src/lib/util.c:184
 msgid "Blocked"
 msgstr ""
 
-#: src/lib/util.c:200
+#: src/lib/util.c:194
 msgid "Non-fatal error"
 msgstr ""
 
-#: src/lib/util.c:203 src/lib/util.c:270
+#: src/lib/util.c:197 src/lib/util.c:264
 msgid "Canceled"
 msgstr ""
 
-#: src/lib/util.c:206
+#: src/lib/util.c:200
 msgid "Verify differences"
 msgstr ""
 
-#: src/lib/util.c:209
+#: src/lib/util.c:203
 msgid "Waiting on FD"
 msgstr ""
 
-#: src/lib/util.c:212
+#: src/lib/util.c:206
 msgid "Wait on SD"
 msgstr ""
 
-#: src/lib/util.c:215
+#: src/lib/util.c:209
 msgid "Wait for new Volume"
 msgstr ""
 
-#: src/lib/util.c:218
+#: src/lib/util.c:212
 msgid "Waiting for mount"
 msgstr ""
 
-#: src/lib/util.c:221
+#: src/lib/util.c:215
 msgid "Waiting for Storage resource"
 msgstr ""
 
-#: src/lib/util.c:224
+#: src/lib/util.c:218
 msgid "Waiting for Job resource"
 msgstr ""
 
-#: src/lib/util.c:227
+#: src/lib/util.c:221
 msgid "Waiting for Client resource"
 msgstr ""
 
-#: src/lib/util.c:230
+#: src/lib/util.c:224
 msgid "Waiting on Max Jobs"
 msgstr ""
 
-#: src/lib/util.c:233
+#: src/lib/util.c:227
 msgid "Waiting for Start Time"
 msgstr ""
 
-#: src/lib/util.c:236
+#: src/lib/util.c:230
 msgid "Waiting on Priority"
 msgstr ""
 
-#: src/lib/util.c:243
+#: src/lib/util.c:237
 #, c-format
 msgid "Unknown Job termination status=%d"
 msgstr ""
 
-#: src/lib/util.c:267
+#: src/lib/util.c:261
 msgid "Fatal Error"
 msgstr ""
 
-#: src/lib/util.c:273
+#: src/lib/util.c:267
 msgid "Differences"
 msgstr ""
 
-#: src/lib/util.c:276
+#: src/lib/util.c:270
 msgid "Unknown term code"
 msgstr ""
 
+#: src/lib/util.c:298
+msgid "Migrate"
+msgstr ""
+
+#: src/lib/util.c:301
+msgid "Copy"
+msgstr ""
+
 #: src/lib/util.c:304
 msgid "Unknown Type"
 msgstr ""
@@ -8226,311 +8364,247 @@ msgstr ""
 msgid "unknown error"
 msgstr ""
 
-#: src/lib/watchdog.c:74
+#: src/lib/watchdog.c:69
 #, c-format
 msgid "Unable to initialize watchdog lock. ERR=%s\n"
 msgstr ""
 
-#: src/lib/watchdog.c:170
+#: src/lib/watchdog.c:165
 msgid "BUG! register_watchdog called before start_watchdog\n"
 msgstr ""
 
-#: src/lib/watchdog.c:173
+#: src/lib/watchdog.c:168
 #, c-format
 msgid "BUG! Watchdog %p has NULL callback\n"
 msgstr ""
 
-#: src/lib/watchdog.c:176
+#: src/lib/watchdog.c:171
 #, c-format
 msgid "BUG! Watchdog %p has zero interval\n"
 msgstr ""
 
-#: src/lib/watchdog.c:196
+#: src/lib/watchdog.c:191
 msgid "BUG! unregister_watchdog_unlocked called before start_watchdog\n"
 msgstr ""
 
-#: src/lib/watchdog.c:313
+#: src/lib/watchdog.c:309
 #, c-format
 msgid "rwl_writelock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/watchdog.c:327
+#: src/lib/watchdog.c:323
 #, c-format
 msgid "rwl_writeunlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:108
-msgid "Could not initialize Python\n"
+#: src/stored/acquire.c:52
+#, c-format
+msgid "Num_writers=%d not zero. Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:113
+#: src/stored/acquire.c:60
 #, c-format
-msgid "Could not Run Python string %s\n"
+msgid "No volumes specified. Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:125
-msgid "Could not initialize Python Job type.\n"
+#: src/stored/acquire.c:92 src/stored/mount.c:73
+#, c-format
+msgid "Job %d canceled.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:130
+#: src/stored/acquire.c:103
 #, c-format
-msgid "Could not import Python script %s/%s. Python disabled.\n"
+msgid "Read open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:230
-msgid "Could not create Python Job Object.\n"
+#: src/stored/acquire.c:108
+#, c-format
+msgid "Read open device %s Volume \"%s\" failed: ERR=%s\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:243 src/lib/pythonlib.c:267
+#: src/stored/acquire.c:179 src/stored/mount.c:67
 #, c-format
-msgid "Python function \"%s\" not found.\n"
+msgid "Too many errors trying to mount device %s.\n"
 msgstr ""
 
-#: src/lib/pythonlib.c:282
+#: src/stored/acquire.c:188
 #, c-format
-msgid "Unknown Python daemon event %s\n"
+msgid "Ready to read from volume \"%s\" on device %s.\n"
 msgstr ""
 
-#: src/lib/res.c:66
+#: src/stored/acquire.c:232
 #, c-format
-msgid "rwl_writelock failure at %s:%d:  ERR=%s\n"
+msgid "Device %s is busy reading.\n"
 msgstr ""
 
-#: src/lib/res.c:76
+#: src/stored/acquire.c:262
 #, c-format
-msgid "rwl_writeunlock failure at %s:%d:. ERR=%s\n"
+msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
 msgstr ""
 
-#: src/lib/tls.c:108
+#: src/stored/acquire.c:281
 #, c-format
 msgid ""
-"Error with certificate at depth: %d, issuer = %s, subject = %s, ERR=%d:%s\n"
+"Cannot recycle volume \"%s\" on device %s because it is in use by another "
+"job.\n"
 msgstr ""
 
-#: src/lib/tls.c:155
-msgid "Error initializing SSL context"
+#: src/stored/acquire.c:303
+#, c-format
+msgid "Could not ready device %s for append.\n"
 msgstr ""
 
-#: src/lib/tls.c:176
-msgid "Error loading certificate verification stores"
+#: src/stored/acquire.c:380 src/stored/block.c:354 src/stored/block.c:682
+#: src/stored/block.c:751
+#, c-format
+msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
 msgstr ""
 
-#: src/lib/tls.c:181
-msgid ""
-"Either a certificate file or a directory must be specified as a verification "
-"store\n"
+#: src/stored/acquire.c:422
+#, c-format
+msgid "Alert: %s"
 msgstr ""
 
-#: src/lib/tls.c:192
-msgid "Error loading certificate file"
+#: src/stored/acquire.c:430
+#, c-format
+msgid "3997 Bad alert command: %s: ERR=%s.\n"
 msgstr ""
 
-#: src/lib/tls.c:200
-msgid "Error loading private key"
+#: src/stored/acquire.c:518
+#, c-format
+msgid "Hey! num_writers=%d!!!!\n"
 msgstr ""
 
-#: src/lib/tls.c:208
-msgid "Unable to open DH parameters file"
+#: src/stored/ansi_label.c:83
+#, c-format
+msgid "Read error on device %s in ANSI label. ERR=%s\n"
 msgstr ""
 
-#: src/lib/tls.c:214
-msgid "Unable to load DH parameters from specified file"
+#: src/stored/ansi_label.c:93
+msgid "Insane! End of tape while reading ANSI label.\n"
 msgstr ""
 
-#: src/lib/tls.c:218
-msgid "Failed to set TLS Diffie-Hellman parameters"
+#: src/stored/ansi_label.c:117
+msgid "No VOL1 label while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/lib/tls.c:227
-msgid "Error setting cipher list, no valid ciphers available\n"
+#: src/stored/ansi_label.c:137
+#, c-format
+msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
 msgstr ""
 
-#: src/lib/tls.c:275
-msgid "Peer failed to present a TLS certificate\n"
-msgstr ""
-
-#: src/lib/tls.c:317
-#, c-format
-msgid "Peer %s failed to present a TLS certificate\n"
-msgstr ""
-
-#: src/lib/tls.c:416
-msgid "Error creating file descriptor-based BIO"
-msgstr ""
-
-#: src/lib/tls.c:427
-msgid "Error creating new SSL object"
-msgstr ""
-
-#: src/lib/tls.c:493 src/lib/tls.c:510
-msgid "Connect failure"
-msgstr ""
-
-#: src/lib/tls.c:587 src/lib/tls.c:591
-msgid "TLS shutdown failure."
-msgstr ""
-
-#: src/lib/tls.c:642 src/lib/tls.c:658
-msgid "TLS read/write failure."
-msgstr ""
-
-#: src/lib/tls.c:716 src/lib/tls.c:773 src/stored/dev.c:212
-#: src/stored/dev.c:230 src/stored/dev.c:236 src/stored/stored_conf.c:550
-#, c-format
-msgid "Unable to init mutex: ERR=%s\n"
-msgstr ""
-
-#: src/lib/tls.c:736 src/lib/tls.c:805
-#, c-format
-msgid "Unable to destroy mutex: ERR=%s\n"
-msgstr ""
-
-#: src/lib/tls.c:870
-#, c-format
-msgid "Unable to init OpenSSL threading: ERR=%s\n"
-msgstr ""
-
-#: src/lib/tls.c:880
-msgid "Failed to seed OpenSSL PRNG\n"
-msgstr ""
-
-#: src/lib/tls.c:906
-msgid "Failed to save OpenSSL PRNG\n"
-msgstr ""
-
-#: src/stored/acquire.c:98
-#, c-format
-msgid "Hey! num_writers=%d!!!!\n"
-msgstr ""
-
-#: src/stored/acquire.c:146
-#, c-format
-msgid "Num_writers=%d not zero. Job %d canceled.\n"
-msgstr ""
-
-#: src/stored/acquire.c:154
-#, c-format
-msgid "No volumes specified. Job %d canceled.\n"
+#: src/stored/ansi_label.c:148
+msgid "No HDR1 label while reading ANSI label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:182 src/stored/mount.c:72
+#: src/stored/ansi_label.c:154
 #, c-format
-msgid "Job %d canceled.\n"
+msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
 msgstr ""
 
-#: src/stored/acquire.c:193
-#, c-format
-msgid "Open device %s Volume \"%s\" failed (EIO): ERR=%s\n"
+#: src/stored/ansi_label.c:165
+msgid "No HDR2 label while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:208
-#, c-format
-msgid "Open device %s Volume \"%s\" failed: ERR=%s\n"
+#: src/stored/ansi_label.c:179
+msgid "Unknown or bad ANSI/IBM label record.\n"
 msgstr ""
 
-#: src/stored/acquire.c:273 src/stored/mount.c:66
-#, c-format
-msgid "Too many errors trying to mount device %s.\n"
+#: src/stored/ansi_label.c:186
+msgid "Too many records in while reading ANSI/IBM label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:282
+#: src/stored/ansi_label.c:285
 #, c-format
-msgid "Ready to read from volume \"%s\" on device %s.\n"
+msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
 msgstr ""
 
-#: src/stored/acquire.c:328 src/stored/reserve.c:664
+#: src/stored/ansi_label.c:302
 #, c-format
-msgid "Device %s is busy reading.\n"
+msgid "Could not write ANSI VOL1 label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/acquire.c:358
+#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
 #, c-format
-msgid "Wanted Volume \"%s\", but device %s is busy writing on \"%s\" .\n"
+msgid "Could not write ANSI HDR1 label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/acquire.c:377
-#, c-format
-msgid ""
-"Cannot recycle volume \"%s\" on device %s because it is in use by another "
-"job.\n"
+#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
+msgid "Could not write ANSI HDR1 label.\n"
 msgstr ""
 
-#: src/stored/acquire.c:399
+#: src/stored/ansi_label.c:381
 #, c-format
-msgid "Could not ready device %s for append.\n"
+msgid "Error writing EOF to tape. ERR=%s"
 msgstr ""
 
-#: src/stored/acquire.c:464 src/stored/block.c:353 src/stored/block.c:676
-#: src/stored/block.c:744
-#, c-format
-msgid "Could not create JobMedia record for Volume=\"%s\" Job=%s\n"
+#: src/stored/ansi_label.c:386
+msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
 msgstr ""
 
-#: src/stored/acquire.c:506
-#, c-format
-msgid "Alert: %s"
+#: src/stored/append.c:49
+msgid "DCR is NULL!!!\n"
 msgstr ""
 
-#: src/stored/acquire.c:514
-#, c-format
-msgid "3997 Bad alert command: %s: ERR=%s.\n"
+#: src/stored/append.c:54
+msgid "DEVICE is NULL!!!\n"
 msgstr ""
 
-#: src/stored/append.c:60
+#: src/stored/append.c:66
 msgid "Unable to set network buffer size.\n"
 msgstr ""
 
-#: src/stored/append.c:73 src/stored/append.c:82 src/stored/append.c:94
-#: src/stored/append.c:249 src/stored/append.c:264 src/stored/append.c:276
-#: src/stored/askdir.c:284 src/stored/askdir.c:285
+#: src/stored/append.c:79 src/stored/append.c:88 src/stored/append.c:100
+#: src/stored/append.c:256 src/stored/append.c:271 src/stored/append.c:283
+#: src/stored/askdir.c:291 src/stored/askdir.c:292
 msgid "NULL Volume name. This shouldn't happen!!!\n"
 msgstr ""
 
-#: src/stored/append.c:88 src/stored/btape.c:1853
+#: src/stored/append.c:94 src/stored/btape.c:1854
 #, c-format
 msgid "Write session label failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:100
+#: src/stored/append.c:106
 #, c-format
 msgid "Network send error to FD. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:137
+#: src/stored/append.c:143
 #, c-format
 msgid "Error reading data header from FD. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:159
+#: src/stored/append.c:165
 #, c-format
 msgid "Malformed data header from FD: %s\n"
 msgstr ""
 
-#: src/stored/append.c:169
+#: src/stored/append.c:175
 msgid "File index from FD not positive or sequential\n"
 msgstr ""
 
-#: src/stored/append.c:199 src/stored/append.c:269 src/stored/spool.c:247
+#: src/stored/append.c:206 src/stored/append.c:276 src/stored/spool.c:248
 #, c-format
 msgid "Fatal append error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:224
+#: src/stored/append.c:231
 #, c-format
 msgid "Error updating file attributes. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:237
+#: src/stored/append.c:244
 #, c-format
 msgid "Network error on data channel. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:258 src/stored/btape.c:1969
+#: src/stored/append.c:265 src/stored/btape.c:1976
 #, c-format
 msgid "Error writting end session label. ERR=%s\n"
 msgstr ""
 
-#: src/stored/append.c:271
+#: src/stored/append.c:278
 msgid "Set ok=FALSE after write_block_to_device.\n"
 msgstr ""
 
@@ -8540,41 +8614,34 @@ msgstr ""
 
 #: src/stored/askdir.c:178
 #, c-format
-msgid "Error getting Volume info: %s\n"
+msgid "Error getting Volume info: %s"
 msgstr ""
 
-#: src/stored/askdir.c:289 src/stored/askdir.c:290
+#: src/stored/askdir.c:296 src/stored/askdir.c:297
 msgid "Attempt to update_volume_info in read mode!!!\n"
 msgstr ""
 
-#: src/stored/askdir.c:318
+#: src/stored/askdir.c:325
 #, c-format
 msgid "Didn't get vol info vol=%s: ERR=%s"
 msgstr ""
 
-#: src/stored/askdir.c:349
+#: src/stored/askdir.c:356
 #, c-format
 msgid "Error creating JobMedia record: ERR=%s\n"
 msgstr ""
 
-#: src/stored/askdir.c:356
+#: src/stored/askdir.c:363
 #, c-format
 msgid "Error creating JobMedia record: %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:424
+#: src/stored/askdir.c:429
 #, c-format
 msgid "Job %s canceled while waiting for mount on Storage Device \"%s\".\n"
 msgstr ""
 
-#: src/stored/askdir.c:452
-#, c-format
-msgid ""
-"Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
-"Use \"mount\" command to release Job.\n"
-msgstr ""
-
-#: src/stored/askdir.c:462
+#: src/stored/askdir.c:442
 #, c-format
 msgid ""
 "Job %s waiting. Cannot find any appendable volumes.\n"
@@ -8584,45 +8651,31 @@ msgid ""
 "    Pool:         %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:486 src/stored/askdir.c:588
+#: src/stored/askdir.c:466 src/stored/askdir.c:548
 #, c-format
 msgid "Max time exceeded waiting to mount Storage Device %s for Job %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:496 src/stored/askdir.c:503
-#, c-format
-msgid "pthread error in mount_next_volume stat=%d ERR=%s\n"
-msgstr ""
-
-#: src/stored/askdir.c:514
-#, c-format
-msgid ""
-"Someone woke me up, but I cannot find any appendable\n"
-"volumes for Job=%s.\n"
+#: src/stored/askdir.c:476
+msgid "pthread error in mount_next_volume.\n"
 msgstr ""
 
-#: src/stored/askdir.c:558
+#: src/stored/askdir.c:508
 msgid "Cannot request another volume: no volume name given.\n"
 msgstr ""
 
-#: src/stored/askdir.c:564
+#: src/stored/askdir.c:514
 #, c-format
 msgid "Job %s canceled while waiting for mount on Storage Device %s.\n"
 msgstr ""
 
-#: src/stored/askdir.c:570
+#: src/stored/askdir.c:529
 #, c-format
 msgid "Please mount Volume \"%s\" on Storage Device %s for Job %s\n"
 msgstr ""
 
-#: src/stored/askdir.c:598
-#, c-format
-msgid "pthread error in mount_volume stat=%d ERR=%s\n"
-msgstr ""
-
-#: src/stored/askdir.c:605
-#, c-format
-msgid "pthread error in mount_next_volume stat=%d: ERR=%s\n"
+#: src/stored/askdir.c:558
+msgid "pthread error in mount_volume\n"
 msgstr ""
 
 #: src/stored/authenticate.c:53
@@ -8650,71 +8703,91 @@ msgid ""
 "help.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:95
+#: src/stored/autochanger.c:53
+#, c-format
+msgid "No Changer Name given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:59
+#, c-format
+msgid "No Changer Command given for device %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:72
+#, c-format
+msgid ""
+"Media Type not the same for all devices in changer %s. Cannot continue.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:152
 #, c-format
 msgid "3304 Issuing autochanger \"load slot %d, drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:102
+#: src/stored/autochanger.c:161
 #, c-format
 msgid "3305 Autochanger \"load slot %d, drive %d\", status is OK.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:108
+#: src/stored/autochanger.c:167
 #, c-format
 msgid "3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:153
+#: src/stored/autochanger.c:208
+msgid "3992 Missing Changer command.\n"
+msgstr ""
+
+#: src/stored/autochanger.c:218
 #, c-format
 msgid "3301 Issuing autochanger \"loaded drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:162
+#: src/stored/autochanger.c:227
 #, c-format
 msgid "3302 Autochanger \"loaded drive %d\", result is Slot %d.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:166
+#: src/stored/autochanger.c:231
 #, c-format
 msgid "3302 Autochanger \"loaded drive %d\", result: nothing loaded.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:173
+#: src/stored/autochanger.c:238
 #, c-format
 msgid "3991 Bad autochanger \"loaded drive %d\" command: ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:234 src/stored/autochanger.c:304
+#: src/stored/autochanger.c:297 src/stored/autochanger.c:380
 #, c-format
 msgid "3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:247 src/stored/autochanger.c:325
+#: src/stored/autochanger.c:310 src/stored/autochanger.c:401
 #, c-format
 msgid "3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:290
+#: src/stored/autochanger.c:369
 #, c-format
 msgid "Volume %s is in use by device %s\n"
 msgstr ""
 
-#: src/stored/autochanger.c:358
+#: src/stored/autochanger.c:439
 #, c-format
 msgid "3993 Device %s not an autochanger device.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:372
+#: src/stored/autochanger.c:464
 #, c-format
 msgid "3306 Issuing autochanger \"%s\" command.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:377
+#: src/stored/autochanger.c:467
 msgid "3996 Open bpipe failed.\n"
 msgstr ""
 
-#: src/stored/autochanger.c:401
+#: src/stored/autochanger.c:494
 #, c-format
 msgid "Autochanger error: ERR=%s\n"
 msgstr ""
@@ -8743,7 +8816,7 @@ msgstr ""
 msgid "Wrong number of arguments: \n"
 msgstr ""
 
-#: src/stored/bcopy.c:172 src/stored/btape.c:334 src/stored/device.c:273
+#: src/stored/bcopy.c:172 src/stored/btape.c:333 src/stored/device.c:266
 #, c-format
 msgid "dev open failed: %s\n"
 msgstr ""
@@ -8757,7 +8830,7 @@ msgstr ""
 msgid "%u Jobs copied. %u records copied.\n"
 msgstr ""
 
-#: src/stored/bcopy.c:205 src/stored/bscan.c:389
+#: src/stored/bcopy.c:205 src/stored/bscan.c:390
 #, c-format
 msgid "Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n"
 msgstr ""
@@ -8771,7 +8844,7 @@ msgid "Volume label not copied.\n"
 msgstr ""
 
 #: src/stored/bcopy.c:235 src/stored/bcopy.c:242 src/stored/bcopy.c:265
-#: src/stored/btape.c:2335
+#: src/stored/btape.c:2342
 #, c-format
 msgid "Cannot fixup device error. %s\n"
 msgstr ""
@@ -8784,8 +8857,8 @@ msgstr ""
 msgid "EOT label not copied.\n"
 msgstr ""
 
-#: src/stored/bcopy.c:290 src/stored/bextract.c:473 src/stored/bls.c:444
-#: src/stored/bscan.c:1227 src/stored/btape.c:2683
+#: src/stored/bcopy.c:287 src/stored/bextract.c:476 src/stored/bls.c:440
+#: src/stored/bscan.c:1231 src/stored/btape.c:2690
 #, c-format
 msgid "Mount Volume \"%s\" on device %s and press return when ready: "
 msgstr ""
@@ -8811,12 +8884,12 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bextract.c:127 src/stored/bls.c:129
+#: src/stored/bextract.c:127 src/stored/bls.c:128
 #, c-format
 msgid "Could not open exclude file: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/bextract.c:142 src/stored/bls.c:143
+#: src/stored/bextract.c:142 src/stored/bls.c:142
 #, c-format
 msgid "Could not open include file: %s, ERR=%s\n"
 msgstr ""
@@ -8846,11 +8919,11 @@ msgstr ""
 msgid "%u files restored.\n"
 msgstr ""
 
-#: src/stored/bextract.c:278 src/stored/bextract.c:444
+#: src/stored/bextract.c:278 src/stored/bextract.c:450
 msgid "Logic error output file should be open but is not.\n"
 msgstr ""
 
-#: src/stored/bextract.c:285 src/stored/bls.c:365 src/stored/bscan.c:645
+#: src/stored/bextract.c:285 src/stored/bls.c:364 src/stored/bscan.c:647
 msgid "Cannot continue.\n"
 msgstr ""
 
@@ -8868,176 +8941,178 @@ msgstr ""
 msgid "===Write error===\n"
 msgstr ""
 
-#: src/stored/bextract.c:435
+#: src/stored/bextract.c:441
 msgid "Got Program Name or Data Stream. Ignored.\n"
 msgstr ""
 
-#: src/stored/block.c:78
+#: src/stored/block.c:79
 #, c-format
 msgid ""
 "Dump block %s %x: size=%d BlkNum=%d\n"
 "               Hdrcksum=%x cksum=%x\n"
 msgstr ""
 
-#: src/stored/block.c:91
+#: src/stored/block.c:92
 #, c-format
 msgid "   Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n"
 msgstr ""
 
-#: src/stored/block.c:147
+#: src/stored/block.c:148
 #, c-format
 msgid "%d block read errors not printed.\n"
 msgstr ""
 
-#: src/stored/block.c:235 src/stored/block.c:251 src/stored/block.c:261
+#: src/stored/block.c:236 src/stored/block.c:252 src/stored/block.c:262
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer "
 "discarded.\n"
 msgstr ""
 
-#: src/stored/block.c:275
+#: src/stored/block.c:276
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Block length %u is insane (too large), probably "
 "due to a bad archive.\n"
 msgstr ""
 
-#: src/stored/block.c:301
+#: src/stored/block.c:302
 #, c-format
 msgid ""
 "Volume data error at %u:%u!\n"
 "Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n"
 msgstr ""
 
-#: src/stored/block.c:409
+#: src/stored/block.c:410
 msgid "Cannot write block. Device at EOM.\n"
 msgstr ""
 
-#: src/stored/block.c:414
+#: src/stored/block.c:415
 msgid "Attempt to write on read-only Volume.\n"
 msgstr ""
 
-#: src/stored/block.c:466
+#: src/stored/block.c:467
 #, c-format
 msgid "User defined maximum volume capacity %s exceeded on device %s.\n"
 msgstr ""
 
-#: src/stored/block.c:481
+#: src/stored/block.c:482
 #, c-format
 msgid "Unable to write EOF. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:507 src/stored/block.c:518
+#: src/stored/block.c:508 src/stored/block.c:519
 msgid "Write block header zeroed.\n"
 msgstr ""
 
-#: src/stored/block.c:536
+#: src/stored/block.c:537
 #, c-format
 msgid "Write error at %u:%u on device %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/block.c:543
+#: src/stored/block.c:544
 #, c-format
 msgid "End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"
 msgstr ""
 
-#: src/stored/block.c:618 src/stored/block.c:624
+#: src/stored/block.c:619 src/stored/block.c:625
 #, c-format
 msgid "Backspace file at EOT failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:631
+#: src/stored/block.c:632
 #, c-format
 msgid "Backspace record at EOT failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:648
+#: src/stored/block.c:649
 #, c-format
 msgid "Re-read last block at EOT failed. ERR=%s"
 msgstr ""
 
-#: src/stored/block.c:652
-msgid "Re-read of last block succeeded.\n"
+#: src/stored/block.c:659
+#, c-format
+msgid ""
+"Re-read of last block OK, but block numbers differ. Last block=%u Current "
+"block=%u.\n"
 msgstr ""
 
-#: src/stored/block.c:655
-#, c-format
-msgid "Re-read of last block failed. Last block=%u Current block=%u.\n"
+#: src/stored/block.c:662
+msgid "Re-read of last block succeeded.\n"
 msgstr ""
 
-#: src/stored/block.c:684
+#: src/stored/block.c:690
 #, c-format
 msgid ""
-"Error writing final EOF to tape. This tape may not be readable.\n"
+"Error writing final EOF to tape. This Volume may not be readable.\n"
 "%s"
 msgstr ""
 
-#: src/stored/block.c:790 src/stored/dvd.c:622
+#: src/stored/block.c:800 src/stored/dvd.c:689
 #, c-format
 msgid ""
 "Error while writing, current part number is less than the total number of "
 "parts (%d/%d, device=%s)\n"
 msgstr ""
 
-#: src/stored/block.c:798 src/stored/block.c:908
+#: src/stored/block.c:808 src/stored/block.c:918
 #, c-format
 msgid "Unable to open device next part %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/block.c:816
+#: src/stored/block.c:826
 #, c-format
 msgid ""
 "End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
 "free_space_errno=%d, errmsg=%s).\n"
 msgstr ""
 
-#: src/stored/block.c:829
+#: src/stored/block.c:839
 #, c-format
 msgid ""
 "End of Volume \"%s\" at %u:%u on device %s (part_size=%s, free_space=%s, "
 "free_space_errno=%d).\n"
 msgstr ""
 
-#: src/stored/block.c:883
+#: src/stored/block.c:893
 #, c-format
 msgid "Block buffer size looping problem on device %s\n"
 msgstr ""
 
-#: src/stored/block.c:934
+#: src/stored/block.c:944
 #, c-format
 msgid "Read error at file:blk %u:%u on device %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/block.c:947
+#: src/stored/block.c:957
 #, c-format
 msgid "Read zero bytes at %u:%u on device %s.\n"
 msgstr ""
 
-#: src/stored/block.c:960
+#: src/stored/block.c:970
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Very short block of %d bytes on device %s "
 "discarded.\n"
 msgstr ""
 
-#: src/stored/block.c:985
+#: src/stored/block.c:995
 #, c-format
 msgid "Block length %u is greater than buffer %u. Attempting recovery.\n"
 msgstr ""
 
-#: src/stored/block.c:1004
+#: src/stored/block.c:1014
 #, c-format
 msgid "Setting block buffer size to %u bytes.\n"
 msgstr ""
 
-#: src/stored/block.c:1019
+#: src/stored/block.c:1029
 #, c-format
 msgid ""
 "Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n"
 msgstr ""
 
-#: src/stored/bls.c:69
+#: src/stored/bls.c:68
 #, c-format
 msgid ""
 "Copyright (C) 2000-2005 Kern Sibbald.\n"
@@ -9061,74 +9136,74 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bls.c:190
+#: src/stored/bls.c:189
 msgid "No archive name specified\n"
 msgstr ""
 
-#: src/stored/bls.c:226
+#: src/stored/bls.c:224
 #, c-format
 msgid ""
 "\n"
 "Warning, this Volume is a continuation of Volume %s\n"
 msgstr ""
 
-#: src/stored/bls.c:268
+#: src/stored/bls.c:267
 #, c-format
 msgid "Got EOM at file %u on device %s, Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/bls.c:279
+#: src/stored/bls.c:278
 #, c-format
 msgid "Mounted Volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/bls.c:281
+#: src/stored/bls.c:280
 #, c-format
-msgid "Got EOF at file %u on device %s, Volume \"%s\"\n"
+msgid "End of file %u on device %s, Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/bls.c:305
+#: src/stored/bls.c:304
 #, c-format
 msgid ""
 "File:blk=%u:%u blk_num=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
 "s rlen=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:314
+#: src/stored/bls.c:313
 #, c-format
 msgid "Block: %d size=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:381
+#: src/stored/bls.c:380
 #, c-format
 msgid "FileIndex=%d VolSessionId=%d VolSessionTime=%d Stream=%d DataLen=%d\n"
 msgstr ""
 
-#: src/stored/bls.c:398 src/stored/read_record.c:321
+#: src/stored/bls.c:397 src/stored/read_record.c:322
 msgid "Fresh Volume Label"
 msgstr ""
 
-#: src/stored/bls.c:401 src/stored/read_record.c:324
+#: src/stored/bls.c:400 src/stored/read_record.c:325
 msgid "Volume Label"
 msgstr ""
 
-#: src/stored/bls.c:405 src/stored/label.c:959
+#: src/stored/bls.c:404 src/stored/label.c:969
 msgid "Begin Job Session"
 msgstr ""
 
-#: src/stored/bls.c:409 src/stored/label.c:962
+#: src/stored/bls.c:408 src/stored/label.c:972
 msgid "End Job Session"
 msgstr ""
 
-#: src/stored/bls.c:412
+#: src/stored/bls.c:411
 msgid "End of Medium"
 msgstr ""
 
-#: src/stored/bls.c:415 src/stored/label.c:971
+#: src/stored/bls.c:414 src/stored/label.c:981
 msgid "Unknown"
 msgstr ""
 
-#: src/stored/bls.c:421 src/stored/read_record.c:342
+#: src/stored/bls.c:420 src/stored/read_record.c:343
 #, c-format
 msgid "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n"
 msgstr ""
@@ -9160,12 +9235,12 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bscan.c:234 src/stored/stored.c:266
+#: src/stored/bscan.c:234 src/stored/stored.c:267
 #, c-format
 msgid "No Storage resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/bscan.c:242 src/stored/stored.c:297
+#: src/stored/bscan.c:242 src/stored/stored.c:298
 #, c-format
 msgid "No Working Directory defined in %s. Cannot continue.\n"
 msgstr ""
@@ -9180,7 +9255,7 @@ msgstr ""
 msgid "Working Directory: %s is not a directory. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/bscan.c:268 src/stored/bscan.c:340
+#: src/stored/bscan.c:268 src/stored/bscan.c:341
 #, c-format
 msgid "First Volume Size = %sn"
 msgstr ""
@@ -9199,235 +9274,235 @@ msgstr ""
 msgid "Create JobMedia for Job %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:325
+#: src/stored/bscan.c:326
 #, c-format
 msgid "Could not create JobMedia record for Volume=%s Job=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:381
+#: src/stored/bscan.c:382
 #, c-format
 msgid "done: %d%%\n"
 msgstr ""
 
-#: src/stored/bscan.c:405
+#: src/stored/bscan.c:406
 msgid "Volume is prelabeled. This tape cannot be scanned.\n"
 msgstr ""
 
-#: src/stored/bscan.c:417
+#: src/stored/bscan.c:418
 #, c-format
 msgid "Pool record for %s found in DB.\n"
 msgstr ""
 
-#: src/stored/bscan.c:421
+#: src/stored/bscan.c:422
 #, c-format
 msgid "VOL_LABEL: Pool record not found for Pool: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:427
+#: src/stored/bscan.c:428
 #, c-format
 msgid "VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:431
+#: src/stored/bscan.c:432
 #, c-format
 msgid "Pool type \"%s\" is OK.\n"
 msgstr ""
 
-#: src/stored/bscan.c:441
+#: src/stored/bscan.c:442
 #, c-format
 msgid "Media record for %s found in DB.\n"
 msgstr ""
 
-#: src/stored/bscan.c:448
+#: src/stored/bscan.c:449
 #, c-format
 msgid "VOL_LABEL: Media record not found for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:455
+#: src/stored/bscan.c:456
 #, c-format
 msgid "VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:459
+#: src/stored/bscan.c:460
 #, c-format
 msgid "Media type \"%s\" is OK.\n"
 msgstr ""
 
-#: src/stored/bscan.c:468
+#: src/stored/bscan.c:469
 #, c-format
 msgid "VOL_LABEL: OK for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:475
+#: src/stored/bscan.c:476
 #, c-format
 msgid "%d \"errors\" ignored before first Start of Session record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:486
+#: src/stored/bscan.c:487
 #, c-format
 msgid "SOS_LABEL: Found Job record for JobId: %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:491
+#: src/stored/bscan.c:492
 #, c-format
 msgid "SOS_LABEL: Job record not found for JobId: %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:531
+#: src/stored/bscan.c:532
 #, c-format
 msgid "SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:537
+#: src/stored/bscan.c:538
 #, c-format
 msgid "SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:543
+#: src/stored/bscan.c:544
 #, c-format
 msgid "SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n"
 msgstr ""
 
-#: src/stored/bscan.c:561 src/stored/bscan.c:1007
+#: src/stored/bscan.c:562 src/stored/bscan.c:1013
 #, c-format
 msgid "Could not find SessId=%d SessTime=%d for EOS record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:604
+#: src/stored/bscan.c:606
 #, c-format
 msgid "Could not update job record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:615
+#: src/stored/bscan.c:617
 #, c-format
 msgid "End of all Volumes. VolFiles=%u VolBlocks=%u VolBytes=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:627
+#: src/stored/bscan.c:629
 #, c-format
 msgid "Could not find Job for SessId=%d SessTime=%d record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:663
+#: src/stored/bscan.c:665
 #, c-format
 msgid "%s file records. At file:blk=%s:%s bytes=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:706
+#: src/stored/bscan.c:708
 #, c-format
 msgid "Got MD5 record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:715
+#: src/stored/bscan.c:717
 #, c-format
 msgid "Got SHA1 record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:723
+#: src/stored/bscan.c:725
 #, c-format
 msgid "Got Prog Names Stream: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:729
+#: src/stored/bscan.c:731
 msgid "Got Prog Data Stream record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:733
+#: src/stored/bscan.c:735
 #, c-format
 msgid "Unknown stream type!!! stream=%d data=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:793
+#: src/stored/bscan.c:799
 #, c-format
 msgid "Could not create File Attributes record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:799
+#: src/stored/bscan.c:805
 #, c-format
 msgid "Created File record: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:836
+#: src/stored/bscan.c:842
 #, c-format
 msgid "Could not create media record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:840 src/stored/bscan.c:861
+#: src/stored/bscan.c:846 src/stored/bscan.c:867
 #, c-format
 msgid "Could not update media record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:844
+#: src/stored/bscan.c:850
 #, c-format
 msgid "Created Media record for Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:865
+#: src/stored/bscan.c:871
 #, c-format
 msgid "Updated Media record at end of Volume: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:882
+#: src/stored/bscan.c:888
 #, c-format
 msgid "Could not create pool record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:886
+#: src/stored/bscan.c:892
 #, c-format
 msgid "Created Pool record for Pool: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:906
+#: src/stored/bscan.c:912
 #, c-format
 msgid "Created Client record for Client: %s\n"
 msgstr ""
 
-#: src/stored/bscan.c:923
+#: src/stored/bscan.c:929
 #, c-format
 msgid "Fileset \"%s\" already exists.\n"
 msgstr ""
 
-#: src/stored/bscan.c:927
+#: src/stored/bscan.c:933
 #, c-format
 msgid "Could not create FileSet record \"%s\". ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:932
+#: src/stored/bscan.c:938
 #, c-format
 msgid "Created FileSet record \"%s\"\n"
 msgstr ""
 
-#: src/stored/bscan.c:979
+#: src/stored/bscan.c:985
 #, c-format
 msgid "Could not create JobId record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:985
+#: src/stored/bscan.c:991
 #, c-format
 msgid "Could not update job start record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:988
+#: src/stored/bscan.c:994
 #, c-format
 msgid "Created new JobId=%u record for original JobId=%u\n"
 msgstr ""
 
-#: src/stored/bscan.c:1038
+#: src/stored/bscan.c:1044
 #, c-format
 msgid "Could not update JobId=%u record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1043
+#: src/stored/bscan.c:1049
 #, c-format
 msgid "Updated Job termination record for JobId=%u TermStat=%c\n"
 msgstr ""
 
-#: src/stored/bscan.c:1065
+#: src/stored/bscan.c:1071
 #, c-format
 msgid "Job Termination code: %d"
 msgstr ""
 
-#: src/stored/bscan.c:1070
+#: src/stored/bscan.c:1076
 #, c-format
 msgid ""
 "%s\n"
@@ -9447,27 +9522,27 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/bscan.c:1134
+#: src/stored/bscan.c:1140
 #, c-format
 msgid "Could not create JobMedia record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1138
+#: src/stored/bscan.c:1144
 #, c-format
 msgid "Created JobMedia record JobId %d, MediaId %d\n"
 msgstr ""
 
-#: src/stored/bscan.c:1154
+#: src/stored/bscan.c:1160
 #, c-format
 msgid "Could not find SessId=%d SessTime=%d for MD5/SHA1 record.\n"
 msgstr ""
 
-#: src/stored/bscan.c:1168
+#: src/stored/bscan.c:1174
 #, c-format
 msgid "Could not add MD5/SHA1 to File record. ERR=%s\n"
 msgstr ""
 
-#: src/stored/bscan.c:1173
+#: src/stored/bscan.c:1179
 msgid "Updated MD5/SHA1 record\n"
 msgstr ""
 
@@ -9518,140 +9593,140 @@ msgstr ""
 msgid "Improper number of arguments specified.\n"
 msgstr ""
 
-#: src/stored/btape.c:340
+#: src/stored/btape.c:338
 #, c-format
 msgid "open device %s: OK\n"
 msgstr ""
 
-#: src/stored/btape.c:361
+#: src/stored/btape.c:359
 msgid "Enter Volume Name: "
 msgstr ""
 
-#: src/stored/btape.c:368
+#: src/stored/btape.c:366
 #, c-format
 msgid "Device open failed. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:373
+#: src/stored/btape.c:371
 #, c-format
 msgid "Wrote Volume label for volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/btape.c:387
+#: src/stored/btape.c:385
 msgid "Volume has no label.\n"
 msgstr ""
 
-#: src/stored/btape.c:390
+#: src/stored/btape.c:388
 msgid "Volume label read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:393
+#: src/stored/btape.c:391
 #, c-format
 msgid "I/O error on device: ERR=%s"
 msgstr ""
 
-#: src/stored/btape.c:396
+#: src/stored/btape.c:394
 msgid "Volume name error\n"
 msgstr ""
 
-#: src/stored/btape.c:399
+#: src/stored/btape.c:397
 #, c-format
 msgid "Error creating label. ERR=%s"
 msgstr ""
 
-#: src/stored/btape.c:402
+#: src/stored/btape.c:400
 msgid "Volume version error.\n"
 msgstr ""
 
-#: src/stored/btape.c:405
+#: src/stored/btape.c:403
 msgid "Bad Volume label type.\n"
 msgstr ""
 
-#: src/stored/btape.c:408
+#: src/stored/btape.c:406
 msgid "Unknown error.\n"
 msgstr ""
 
-#: src/stored/btape.c:426
+#: src/stored/btape.c:424
 #, c-format
 msgid "Bad status from load. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:428
+#: src/stored/btape.c:426
 #, c-format
 msgid "Loaded %s\n"
 msgstr ""
 
-#: src/stored/btape.c:437 src/stored/btape.c:777 src/stored/btape.c:819
-#: src/stored/btape.c:889 src/stored/btape.c:931 src/stored/btape.c:1200
+#: src/stored/btape.c:435 src/stored/btape.c:775 src/stored/btape.c:817
+#: src/stored/btape.c:887 src/stored/btape.c:929 src/stored/btape.c:1198
 #, c-format
 msgid "Bad status from rewind. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:440 src/stored/btape.c:1208
+#: src/stored/btape.c:438 src/stored/btape.c:1206
 #, c-format
 msgid "Rewound %s\n"
 msgstr ""
 
-#: src/stored/btape.c:467 src/stored/btape.c:1212
+#: src/stored/btape.c:465 src/stored/btape.c:1210
 #, c-format
 msgid "Bad status from weof %d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:471
+#: src/stored/btape.c:469
 #, c-format
 msgid "Wrote 1 EOF to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:474
+#: src/stored/btape.c:472
 #, c-format
 msgid "Wrote %d EOFs to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:492
+#: src/stored/btape.c:490
 msgid "Moved to end of medium.\n"
 msgstr ""
 
-#: src/stored/btape.c:519
+#: src/stored/btape.c:517
 #, c-format
 msgid "Bad status from bsf. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:521
+#: src/stored/btape.c:519
 #, c-format
 msgid "Backspaced %d file%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:538
+#: src/stored/btape.c:536
 #, c-format
 msgid "Bad status from bsr. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:540
+#: src/stored/btape.c:538
 #, c-format
 msgid "Backspaced %d record%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:550 src/stored/status.c:220
+#: src/stored/btape.c:548 src/stored/status.c:227
 #, c-format
 msgid "Configured device capabilities:\n"
 msgstr ""
 
-#: src/stored/btape.c:568
+#: src/stored/btape.c:566
 #, c-format
 msgid "Device status:\n"
 msgstr ""
 
-#: src/stored/btape.c:582 src/stored/status.c:252
+#: src/stored/btape.c:580 src/stored/status.c:259
 #, c-format
 msgid "Device parameters:\n"
 msgstr ""
 
-#: src/stored/btape.c:587
+#: src/stored/btape.c:585
 #, c-format
 msgid "Status:\n"
 msgstr ""
 
-#: src/stored/btape.c:602
+#: src/stored/btape.c:600
 msgid ""
 "Test writting larger and larger records.\n"
 "This is a torture test for records.\n"
@@ -9660,20 +9735,20 @@ msgid ""
 "plus the header exceeds the block size (by default about 64K)\n"
 msgstr ""
 
-#: src/stored/btape.c:610 src/stored/btape.c:1814
+#: src/stored/btape.c:608 src/stored/btape.c:1815
 msgid "Command aborted.\n"
 msgstr ""
 
-#: src/stored/btape.c:626
+#: src/stored/btape.c:624
 #, c-format
 msgid "Block %d i=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:652
+#: src/stored/btape.c:650
 msgid "Skipping read backwards test because BSR turned off.\n"
 msgstr ""
 
-#: src/stored/btape.c:656
+#: src/stored/btape.c:654
 msgid ""
 "\n"
 "=== Write, backup, and re-read test ===\n"
@@ -9687,73 +9762,73 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:669 src/stored/btape.c:680 src/stored/btape.c:691
-#: src/stored/btape.c:789 src/stored/btape.c:805 src/stored/btape.c:901
-#: src/stored/btape.c:917 src/stored/btape.c:1526 src/stored/btape.c:2400
+#: src/stored/btape.c:667 src/stored/btape.c:678 src/stored/btape.c:689
+#: src/stored/btape.c:787 src/stored/btape.c:803 src/stored/btape.c:899
+#: src/stored/btape.c:915 src/stored/btape.c:1524 src/stored/btape.c:2407
 msgid "Error writing record to block.\n"
 msgstr ""
 
-#: src/stored/btape.c:673 src/stored/btape.c:684 src/stored/btape.c:695
-#: src/stored/btape.c:793 src/stored/btape.c:809 src/stored/btape.c:905
-#: src/stored/btape.c:921 src/stored/btape.c:1530 src/stored/btape.c:2404
+#: src/stored/btape.c:671 src/stored/btape.c:682 src/stored/btape.c:693
+#: src/stored/btape.c:791 src/stored/btape.c:807 src/stored/btape.c:903
+#: src/stored/btape.c:919 src/stored/btape.c:1528 src/stored/btape.c:2411
 msgid "Error writing block to device.\n"
 msgstr ""
 
-#: src/stored/btape.c:676
+#: src/stored/btape.c:674
 #, c-format
 msgid "Wrote first record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:687
+#: src/stored/btape.c:685
 #, c-format
 msgid "Wrote second record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:698
+#: src/stored/btape.c:696
 #, c-format
 msgid "Wrote third record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:705 src/stored/btape.c:710
+#: src/stored/btape.c:703 src/stored/btape.c:708
 #, c-format
 msgid "Backspace file failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:714
+#: src/stored/btape.c:712
 msgid "Backspaced over EOF OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:716
+#: src/stored/btape.c:714
 #, c-format
 msgid "Backspace record failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:719
+#: src/stored/btape.c:717
 msgid "Backspace record OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:722 src/stored/btape.c:728
+#: src/stored/btape.c:720 src/stored/btape.c:726
 #, c-format
 msgid "Read block failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:733
+#: src/stored/btape.c:731
 msgid "Bad data in record. Test failed!\n"
 msgstr ""
 
-#: src/stored/btape.c:737
+#: src/stored/btape.c:735
 msgid ""
 "\n"
 "Block re-read correct. Test succeeded!\n"
 msgstr ""
 
-#: src/stored/btape.c:738
+#: src/stored/btape.c:736
 msgid ""
 "=== End Write, backup, and re-read test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:745
+#: src/stored/btape.c:743
 msgid ""
 "This is not terribly serious since Bacula only uses\n"
 "this function to verify the last block written to the\n"
@@ -9765,7 +9840,7 @@ msgid ""
 "to your Storage daemon's Device resource definition.\n"
 msgstr ""
 
-#: src/stored/btape.c:769
+#: src/stored/btape.c:767
 msgid ""
 "\n"
 "=== Write, rewind, and re-read test ===\n"
@@ -9778,46 +9853,46 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:797 src/stored/btape.c:813 src/stored/btape.c:909
-#: src/stored/btape.c:925
+#: src/stored/btape.c:795 src/stored/btape.c:811 src/stored/btape.c:907
+#: src/stored/btape.c:923
 #, c-format
 msgid "Wrote 1000 blocks of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:822 src/stored/btape.c:934
+#: src/stored/btape.c:820 src/stored/btape.c:932
 msgid "Rewind OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:829 src/stored/btape.c:983
+#: src/stored/btape.c:827 src/stored/btape.c:981
 msgid "Got EOF on tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:834
+#: src/stored/btape.c:832
 #, c-format
 msgid "Read block %d failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:840
+#: src/stored/btape.c:838
 #, c-format
 msgid "Read record failed. Block %d! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:846 src/stored/btape.c:1013
+#: src/stored/btape.c:844 src/stored/btape.c:1011
 #, c-format
 msgid "Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"
 msgstr ""
 
-#: src/stored/btape.c:853
+#: src/stored/btape.c:851
 msgid "1000 blocks re-read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:856 src/stored/btape.c:1020
+#: src/stored/btape.c:854 src/stored/btape.c:1018
 msgid ""
 "=== Test Succeeded. End Write, rewind, and re-read test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:881
+#: src/stored/btape.c:879
 msgid ""
 "\n"
 "=== Write, rewind, and position test ===\n"
@@ -9830,23 +9905,23 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:974
+#: src/stored/btape.c:972
 #, c-format
 msgid "Reposition to file:block %d:%d\n"
 msgstr ""
 
-#: src/stored/btape.c:976
+#: src/stored/btape.c:974
 msgid "Reposition error.\n"
 msgstr ""
 
-#: src/stored/btape.c:989
+#: src/stored/btape.c:987
 #, c-format
 msgid ""
 "Read block %d failed! file=%d blk=%d. ERR=%s\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:991
+#: src/stored/btape.c:989
 msgid ""
 "This may be because the tape drive block size is not\n"
 " set to variable blocking as normally used by Bacula.\n"
@@ -9860,17 +9935,17 @@ msgid ""
 " in your Device resource.\n"
 msgstr ""
 
-#: src/stored/btape.c:1007
+#: src/stored/btape.c:1005
 #, c-format
 msgid "Read record failed! ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1018
+#: src/stored/btape.c:1016
 #, c-format
 msgid "Block %d re-read correctly.\n"
 msgstr ""
 
-#: src/stored/btape.c:1039
+#: src/stored/btape.c:1037
 msgid ""
 "\n"
 "\n"
@@ -9884,58 +9959,58 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1063
+#: src/stored/btape.c:1061
 msgid "Now moving to end of medium.\n"
 msgstr ""
 
-#: src/stored/btape.c:1065 src/stored/btape.c:1295
+#: src/stored/btape.c:1063 src/stored/btape.c:1293
 #, c-format
 msgid "We should be in file 3. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1066 src/stored/btape.c:1084 src/stored/btape.c:1284
-#: src/stored/btape.c:1296 src/stored/btape.c:1309 src/stored/btape.c:1326
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
 msgid "This is correct!"
 msgstr ""
 
-#: src/stored/btape.c:1066 src/stored/btape.c:1084 src/stored/btape.c:1284
-#: src/stored/btape.c:1296 src/stored/btape.c:1309 src/stored/btape.c:1326
+#: src/stored/btape.c:1064 src/stored/btape.c:1082 src/stored/btape.c:1282
+#: src/stored/btape.c:1294 src/stored/btape.c:1307 src/stored/btape.c:1324
 msgid "This is NOT correct!!!!"
 msgstr ""
 
-#: src/stored/btape.c:1072
+#: src/stored/btape.c:1070
 msgid ""
 "\n"
 "Now the important part, I am going to attempt to append to the tape.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1079
+#: src/stored/btape.c:1077
 msgid ""
 "Done appending, there should be no I/O errors\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1080
+#: src/stored/btape.c:1078
 msgid "Doing Bacula scan of blocks:\n"
 msgstr ""
 
-#: src/stored/btape.c:1082
+#: src/stored/btape.c:1080
 msgid "End scanning the tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:1083 src/stored/btape.c:1308
+#: src/stored/btape.c:1081 src/stored/btape.c:1306
 #, c-format
 msgid "We should be in file 4. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1108
+#: src/stored/btape.c:1106
 msgid ""
 "\n"
 "Autochanger enabled, but no name or no command device specified.\n"
 msgstr ""
 
-#: src/stored/btape.c:1112
+#: src/stored/btape.c:1110
 msgid ""
 "\n"
 "Ah, I see you have an autochanger configured.\n"
@@ -9943,13 +10018,13 @@ msgid ""
 " that I can write on in Slot 1.\n"
 msgstr ""
 
-#: src/stored/btape.c:1115
+#: src/stored/btape.c:1113
 msgid ""
 "\n"
 "Do you wish to continue with the Autochanger test? (y/n): "
 msgstr ""
 
-#: src/stored/btape.c:1122
+#: src/stored/btape.c:1120
 msgid ""
 "\n"
 "\n"
@@ -9957,74 +10032,74 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1131
+#: src/stored/btape.c:1129
 msgid "3301 Issuing autochanger \"loaded\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1140
+#: src/stored/btape.c:1138
 #, c-format
 msgid "3991 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1141
+#: src/stored/btape.c:1139
 #, c-format
 msgid "3991 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1145
+#: src/stored/btape.c:1143
 #, c-format
 msgid "Slot %d loaded. I am going to unload it.\n"
 msgstr ""
 
-#: src/stored/btape.c:1147
+#: src/stored/btape.c:1145
 msgid "Nothing loaded in the drive. OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:1155
+#: src/stored/btape.c:1153
 #, c-format
 msgid "3302 Issuing autochanger \"unload %d %d\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1160
+#: src/stored/btape.c:1158
 #, c-format
 msgid "unload status=%s %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1160
+#: src/stored/btape.c:1158
 msgid "Bad"
 msgstr ""
 
-#: src/stored/btape.c:1163
+#: src/stored/btape.c:1161
 #, c-format
 msgid "3992 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1164
+#: src/stored/btape.c:1162
 #, c-format
 msgid "3992 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1174
+#: src/stored/btape.c:1172
 #, c-format
 msgid "3303 Issuing autochanger \"load %d %d\" command.\n"
 msgstr ""
 
-#: src/stored/btape.c:1182
+#: src/stored/btape.c:1180
 #, c-format
 msgid "3303 Autochanger \"load %d %d\" status is OK.\n"
 msgstr ""
 
-#: src/stored/btape.c:1186
+#: src/stored/btape.c:1184
 #, c-format
 msgid "3993 Bad autochanger command: %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1187
+#: src/stored/btape.c:1185
 #, c-format
 msgid "3993 result=\"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1202
+#: src/stored/btape.c:1200
 msgid ""
 "\n"
 "The test failed, probably because you need to put\n"
@@ -10032,12 +10107,12 @@ msgid ""
 "Adding a 30 second sleep and trying again ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1215
+#: src/stored/btape.c:1213
 #, c-format
 msgid "Wrote EOF to %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1219
+#: src/stored/btape.c:1217
 #, c-format
 msgid ""
 "\n"
@@ -10049,18 +10124,18 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1224
+#: src/stored/btape.c:1222
 msgid ""
 "\n"
 "The test autochanger worked!!\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1235
+#: src/stored/btape.c:1233
 msgid "You must correct this error or the Autochanger will not work.\n"
 msgstr ""
 
-#: src/stored/btape.c:1253
+#: src/stored/btape.c:1251
 msgid ""
 "\n"
 "\n"
@@ -10072,30 +10147,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1278
+#: src/stored/btape.c:1276
 msgid "Now forward spacing 1 file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1280 src/stored/btape.c:1292 src/stored/btape.c:1305
-#: src/stored/btape.c:1323 src/stored/btape.c:1492
+#: src/stored/btape.c:1278 src/stored/btape.c:1290 src/stored/btape.c:1303
+#: src/stored/btape.c:1321 src/stored/btape.c:1490
 #, c-format
 msgid "Bad status from fsr. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1283
+#: src/stored/btape.c:1281
 #, c-format
 msgid "We should be in file 1. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1290
+#: src/stored/btape.c:1288
 msgid "Now forward spacing 2 files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1303
+#: src/stored/btape.c:1301
 msgid "Now forward spacing 4 files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1315
+#: src/stored/btape.c:1313
 msgid ""
 "The test worked this time. Please add:\n"
 "\n"
@@ -10104,35 +10179,35 @@ msgid ""
 "to your Device resource for this drive.\n"
 msgstr ""
 
-#: src/stored/btape.c:1321
+#: src/stored/btape.c:1319
 msgid "Now forward spacing 1 more file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1325
+#: src/stored/btape.c:1323
 #, c-format
 msgid "We should be in file 5. I am at file %d. %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1330
+#: src/stored/btape.c:1328
 msgid ""
 "\n"
 "=== End Forward space files test ===\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1334
+#: src/stored/btape.c:1332
 msgid ""
 "\n"
 "The forward space file test failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1336
+#: src/stored/btape.c:1334
 msgid ""
 "You have Fast Forward Space File enabled.\n"
 "I am turning it off then retrying the test.\n"
 msgstr ""
 
-#: src/stored/btape.c:1342
+#: src/stored/btape.c:1340
 msgid ""
 "You must correct this error or Bacula will not work.\n"
 "Some systems, e.g. OpenBSD, require you to set\n"
@@ -10140,7 +10215,7 @@ msgid ""
 "in your device resource. Use with caution.\n"
 msgstr ""
 
-#: src/stored/btape.c:1374
+#: src/stored/btape.c:1372
 msgid ""
 "\n"
 "Append test failed. Attempting again.\n"
@@ -10150,7 +10225,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1382
+#: src/stored/btape.c:1380
 msgid ""
 "\n"
 "\n"
@@ -10162,14 +10237,14 @@ msgid ""
 "to your Device resource in the Storage conf file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1389
+#: src/stored/btape.c:1387
 msgid ""
 "\n"
 "\n"
 "That appears *NOT* to have corrected the problem.\n"
 msgstr ""
 
-#: src/stored/btape.c:1394
+#: src/stored/btape.c:1392
 msgid ""
 "\n"
 "\n"
@@ -10177,7 +10252,7 @@ msgid ""
 "Setting \"BSF at EOM = yes\" and retrying append test.\n"
 msgstr ""
 
-#: src/stored/btape.c:1399
+#: src/stored/btape.c:1397
 msgid ""
 "\n"
 "\n"
@@ -10190,7 +10265,7 @@ msgid ""
 "to your Device resource in the Storage conf file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1410
+#: src/stored/btape.c:1408
 msgid ""
 "\n"
 "Append test failed.\n"
@@ -10217,7 +10292,7 @@ msgid ""
 "in your device resource. Use with caution.\n"
 msgstr ""
 
-#: src/stored/btape.c:1431
+#: src/stored/btape.c:1429
 msgid ""
 "\n"
 "The above Bacula scan should have output identical to what follows.\n"
@@ -10241,116 +10316,116 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1470
+#: src/stored/btape.c:1468
 #, c-format
 msgid "Bad status from fsf. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1474
+#: src/stored/btape.c:1472
 msgid "Forward spaced 1 file.\n"
 msgstr ""
 
-#: src/stored/btape.c:1477
+#: src/stored/btape.c:1475
 #, c-format
 msgid "Forward spaced %d files.\n"
 msgstr ""
 
-#: src/stored/btape.c:1496
+#: src/stored/btape.c:1494
 msgid "Forward spaced 1 record.\n"
 msgstr ""
 
-#: src/stored/btape.c:1499
+#: src/stored/btape.c:1497
 #, c-format
 msgid "Forward spaced %d records.\n"
 msgstr ""
 
-#: src/stored/btape.c:1533
+#: src/stored/btape.c:1531
 #, c-format
 msgid "Wrote one record of %d bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:1535
+#: src/stored/btape.c:1533
 msgid "Wrote block to device.\n"
 msgstr ""
 
-#: src/stored/btape.c:1550
+#: src/stored/btape.c:1548
 msgid "Enter length to read: "
 msgstr ""
 
-#: src/stored/btape.c:1555
+#: src/stored/btape.c:1553
 msgid "Bad length entered, using default of 1024 bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:1564
+#: src/stored/btape.c:1562
 #, c-format
 msgid "Read of %d bytes gives stat=%d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1587 src/stored/btape.c:1636
+#: src/stored/btape.c:1585 src/stored/btape.c:1634
 #, c-format
 msgid "End of tape\n"
 msgstr ""
 
-#: src/stored/btape.c:1592
+#: src/stored/btape.c:1590
 #, c-format
 msgid "Starting scan at file %u\n"
 msgstr ""
 
-#: src/stored/btape.c:1597 src/stored/dev.c:1238
+#: src/stored/btape.c:1595 src/stored/dev.c:1229
 #, c-format
 msgid "read error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/btape.c:1599
+#: src/stored/btape.c:1597
 #, c-format
 msgid "Bad status from read %d. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1602 src/stored/btape.c:1616 src/stored/btape.c:1679
-#: src/stored/btape.c:1691 src/stored/btape.c:1704 src/stored/btape.c:1720
+#: src/stored/btape.c:1600 src/stored/btape.c:1614 src/stored/btape.c:1678
+#: src/stored/btape.c:1690 src/stored/btape.c:1703 src/stored/btape.c:1719
 #, c-format
 msgid "1 block of %d bytes in file %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1605 src/stored/btape.c:1619 src/stored/btape.c:1682
-#: src/stored/btape.c:1694 src/stored/btape.c:1707 src/stored/btape.c:1723
+#: src/stored/btape.c:1603 src/stored/btape.c:1617 src/stored/btape.c:1681
+#: src/stored/btape.c:1693 src/stored/btape.c:1706 src/stored/btape.c:1722
 #, c-format
 msgid "%d blocks of %d bytes in file %d\n"
 msgstr ""
 
-#: src/stored/btape.c:1627 src/stored/btape.c:1698
+#: src/stored/btape.c:1625 src/stored/btape.c:1697
 #, c-format
 msgid "End of File mark.\n"
 msgstr ""
 
-#: src/stored/btape.c:1648 src/stored/btape.c:1751
+#: src/stored/btape.c:1646 src/stored/btape.c:1750
 #, c-format
 msgid "Total files=%d, blocks=%d, bytes = %s\n"
 msgstr ""
 
-#: src/stored/btape.c:1711
+#: src/stored/btape.c:1710
 #, c-format
 msgid "Short block read.\n"
 msgstr ""
 
-#: src/stored/btape.c:1714
+#: src/stored/btape.c:1713
 #, c-format
 msgid "Error reading block. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1738
+#: src/stored/btape.c:1737
 #, c-format
 msgid ""
 "Blk_block: %u dev_blk=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%"
 "s rlen=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:1760
+#: src/stored/btape.c:1759
 #, c-format
 msgid "Device status: %u. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:1788
+#: src/stored/btape.c:1789
 msgid ""
 "\n"
 "This command simulates Bacula writing to a tape.\n"
@@ -10375,95 +10450,98 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:1805
+#: src/stored/btape.c:1806
 msgid ""
 "Do you want to run the simplified test (s) with one tape\n"
 "or the complete multiple tape (m) test: (s/m) "
 msgstr ""
 
-#: src/stored/btape.c:1808
+#: src/stored/btape.c:1809
 msgid "Simple test (single tape) selected.\n"
 msgstr ""
 
-#: src/stored/btape.c:1811
+#: src/stored/btape.c:1812
 msgid "Multiple tape test selected.\n"
 msgstr ""
 
-#: src/stored/btape.c:1827
+#: src/stored/btape.c:1828
 msgid "Rewind failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1830
+#: src/stored/btape.c:1831
 msgid "Write EOF failed.\n"
 msgstr ""
 
-#: src/stored/btape.c:1857
+#: src/stored/btape.c:1858
 msgid "Wrote Start of Session label.\n"
 msgstr ""
 
-#: src/stored/btape.c:1886
-msgid "Begin writing Bacula records to tape ...\n"
+#: src/stored/btape.c:1889
+#, c-format
+msgid "%s Begin writing Bacula records to tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1888
-msgid "Begin writing Bacula records to first tape ...\n"
+#: src/stored/btape.c:1891
+#, c-format
+msgid "%s Begin writing Bacula records to first tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:1928
+#: src/stored/btape.c:1932
 #, c-format
 msgid "Wrote blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:1935
-msgid "Flush block, write EOF\n"
+#: src/stored/btape.c:1942
+#, c-format
+msgid "%s Flush block, write EOF\n"
 msgstr ""
 
-#: src/stored/btape.c:1946
+#: src/stored/btape.c:1953
 msgid "Not OK\n"
 msgstr ""
 
-#: src/stored/btape.c:1974
+#: src/stored/btape.c:1981
 msgid "Set ok=false after write_block_to_device.\n"
 msgstr ""
 
-#: src/stored/btape.c:1977
+#: src/stored/btape.c:1984
 msgid "Wrote End of Session label.\n"
 msgstr ""
 
-#: src/stored/btape.c:2001
+#: src/stored/btape.c:2008
 #, c-format
 msgid "Wrote state file last_block_num1=%d last_block_num2=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2005
+#: src/stored/btape.c:2012
 #, c-format
 msgid "Could not create state file: %s ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2010
+#: src/stored/btape.c:2020
 #, c-format
 msgid ""
 "\n"
 "\n"
-"Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
+"%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2014
+#: src/stored/btape.c:2024
 #, c-format
 msgid ""
 "\n"
 "\n"
-"Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
+"%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2053
+#: src/stored/btape.c:2063
 msgid ""
 "\n"
 "The state file level has changed. You must redo\n"
 "the fill command.\n"
 msgstr ""
 
-#: src/stored/btape.c:2059
+#: src/stored/btape.c:2069
 #, c-format
 msgid ""
 "\n"
@@ -10471,95 +10549,95 @@ msgid ""
 "You must redo the fill command.\n"
 msgstr ""
 
-#: src/stored/btape.c:2101
+#: src/stored/btape.c:2111
 msgid "Mount first tape. Press enter when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2125
-msgid "Reading the first 10000 records.\n"
+#: src/stored/btape.c:2131
+msgid "Rewinding.\n"
+msgstr ""
+
+#: src/stored/btape.c:2136
+#, c-format
+msgid "Reading the first 10000 records from %u:%u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2128 src/stored/btape.c:2195
+#: src/stored/btape.c:2140 src/stored/btape.c:2207
 #, c-format
 msgid "Reposition from %u:%u to %u:%u\n"
 msgstr ""
 
-#: src/stored/btape.c:2131 src/stored/btape.c:2182 src/stored/btape.c:2198
+#: src/stored/btape.c:2143 src/stored/btape.c:2194 src/stored/btape.c:2210
 #, c-format
 msgid "Reposition error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2134
+#: src/stored/btape.c:2146
 #, c-format
 msgid "Reading block %u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2136 src/stored/btape.c:2187 src/stored/btape.c:2203
+#: src/stored/btape.c:2148 src/stored/btape.c:2199 src/stored/btape.c:2215
 #, c-format
 msgid "Error reading block: ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2141
+#: src/stored/btape.c:2153
 msgid ""
 "\n"
 "The last block on the tape matches. Test succeeded.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2143
+#: src/stored/btape.c:2155
 msgid ""
 "\n"
 "The last block of the first tape matches.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2168
+#: src/stored/btape.c:2180
 msgid "Mount second tape. Press enter when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2180
+#: src/stored/btape.c:2192
 #, c-format
 msgid "Reposition from %u:%u to 0:1\n"
 msgstr ""
 
-#: src/stored/btape.c:2185 src/stored/btape.c:2201
+#: src/stored/btape.c:2197 src/stored/btape.c:2213
 #, c-format
 msgid "Reading block %d.\n"
 msgstr ""
 
-#: src/stored/btape.c:2191
+#: src/stored/btape.c:2203
 msgid ""
 "\n"
 "The first block on the second tape matches.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2207
+#: src/stored/btape.c:2219
 msgid ""
 "\n"
 "The last block on the second tape matches. Test succeeded.\n"
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2221
+#: src/stored/btape.c:2234
 #, c-format
-msgid "ERROR! device at %d:%d count=%d\n"
+msgid "10000 records read now at %d:%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2227
-#, c-format
-msgid "1000 records read now at %d:%d\n"
-msgstr ""
-
-#: src/stored/btape.c:2250 src/stored/btape.c:2261 src/stored/btape.c:2309
+#: src/stored/btape.c:2257 src/stored/btape.c:2268 src/stored/btape.c:2316
 msgid "Last block written"
 msgstr ""
 
-#: src/stored/btape.c:2252 src/stored/btape.c:2262
+#: src/stored/btape.c:2259 src/stored/btape.c:2269
 msgid "Block read back"
 msgstr ""
 
-#: src/stored/btape.c:2253
+#: src/stored/btape.c:2260
 #, c-format
 msgid ""
 "\n"
@@ -10567,7 +10645,7 @@ msgid ""
 "The blocks differ at byte %u\n"
 msgstr ""
 
-#: src/stored/btape.c:2254
+#: src/stored/btape.c:2261
 msgid ""
 "\n"
 "\n"
@@ -10577,177 +10655,177 @@ msgid ""
 "to write multi-tape Volumes.!!!!\n"
 msgstr ""
 
-#: src/stored/btape.c:2293
+#: src/stored/btape.c:2300
 #, c-format
 msgid "Last block at: %u:%u this_dev_block_num=%d\n"
 msgstr ""
 
-#: src/stored/btape.c:2307
+#: src/stored/btape.c:2314
 #, c-format
 msgid "Block not written: FileIndex=%u blk_block=%u Size=%u\n"
 msgstr ""
 
-#: src/stored/btape.c:2311
+#: src/stored/btape.c:2318
 msgid "Block not written"
 msgstr ""
 
-#: src/stored/btape.c:2326
+#: src/stored/btape.c:2333
 #, c-format
 msgid "End of tape %d:%d. VolumeCapacity=%s. Write rate = %.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:2376
+#: src/stored/btape.c:2383
 msgid "Test writing blocks of 64512 bytes to tape.\n"
 msgstr ""
 
-#: src/stored/btape.c:2378
+#: src/stored/btape.c:2385
 msgid "How many blocks do you want to write? (1000): "
 msgstr ""
 
-#: src/stored/btape.c:2393
+#: src/stored/btape.c:2400
 #, c-format
 msgid "Begin writing %d Bacula blocks to tape ...\n"
 msgstr ""
 
-#: src/stored/btape.c:2445
+#: src/stored/btape.c:2452
 #, c-format
 msgid "Begin writing raw blocks of %u bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:2465
+#: src/stored/btape.c:2472
 #, c-format
 msgid "Write failed at block %u. stat=%d ERR=%s\n"
 msgstr ""
 
-#: src/stored/btape.c:2495
+#: src/stored/btape.c:2502
 #, c-format
 msgid "Begin writing Bacula blocks of %u bytes.\n"
 msgstr ""
 
-#: src/stored/btape.c:2514
+#: src/stored/btape.c:2521
 #, c-format
 msgid "Write failed at block %u.\n"
 msgstr ""
 
-#: src/stored/btape.c:2521
+#: src/stored/btape.c:2528
 msgid "test autochanger"
 msgstr ""
 
-#: src/stored/btape.c:2522
+#: src/stored/btape.c:2529
 msgid "backspace file"
 msgstr ""
 
-#: src/stored/btape.c:2523
+#: src/stored/btape.c:2530
 msgid "backspace record"
 msgstr ""
 
-#: src/stored/btape.c:2524
+#: src/stored/btape.c:2531
 msgid "fill tape using Bacula writes"
 msgstr ""
 
-#: src/stored/btape.c:2525
+#: src/stored/btape.c:2532
 msgid "list device capabilities"
 msgstr ""
 
-#: src/stored/btape.c:2526
+#: src/stored/btape.c:2533
 msgid "clear tape errors"
 msgstr ""
 
-#: src/stored/btape.c:2527
+#: src/stored/btape.c:2534
 msgid "go to end of Bacula data for append"
 msgstr ""
 
-#: src/stored/btape.c:2528
+#: src/stored/btape.c:2535
 msgid "go to the physical end of medium"
 msgstr ""
 
-#: src/stored/btape.c:2529
+#: src/stored/btape.c:2536
 msgid "fill tape, write onto second volume"
 msgstr ""
 
-#: src/stored/btape.c:2530
+#: src/stored/btape.c:2537
 msgid "read filled tape"
 msgstr ""
 
-#: src/stored/btape.c:2531
+#: src/stored/btape.c:2538
 msgid "forward space a file"
 msgstr ""
 
-#: src/stored/btape.c:2532
+#: src/stored/btape.c:2539
 msgid "forward space a record"
 msgstr ""
 
-#: src/stored/btape.c:2534
+#: src/stored/btape.c:2541
 msgid "write a Bacula label to the tape"
 msgstr ""
 
-#: src/stored/btape.c:2535
+#: src/stored/btape.c:2542
 msgid "load a tape"
 msgstr ""
 
-#: src/stored/btape.c:2536
+#: src/stored/btape.c:2543
 msgid "quit btape"
 msgstr ""
 
-#: src/stored/btape.c:2537
+#: src/stored/btape.c:2544
 msgid "use write() to fill tape"
 msgstr ""
 
-#: src/stored/btape.c:2538
+#: src/stored/btape.c:2545
 msgid "read and print the Bacula tape label"
 msgstr ""
 
-#: src/stored/btape.c:2539
+#: src/stored/btape.c:2546
 msgid "test record handling functions"
 msgstr ""
 
-#: src/stored/btape.c:2540
+#: src/stored/btape.c:2547
 msgid "rewind the tape"
 msgstr ""
 
-#: src/stored/btape.c:2541
+#: src/stored/btape.c:2548
 msgid "read() tape block by block to EOT and report"
 msgstr ""
 
-#: src/stored/btape.c:2542
+#: src/stored/btape.c:2549
 msgid "Bacula read block by block to EOT and report"
 msgstr ""
 
-#: src/stored/btape.c:2543
+#: src/stored/btape.c:2550
 msgid "print tape status"
 msgstr ""
 
-#: src/stored/btape.c:2544
+#: src/stored/btape.c:2551
 msgid "General test Bacula tape functions"
 msgstr ""
 
-#: src/stored/btape.c:2545
+#: src/stored/btape.c:2552
 msgid "write an EOF on the tape"
 msgstr ""
 
-#: src/stored/btape.c:2546
+#: src/stored/btape.c:2553
 msgid "write a single Bacula block"
 msgstr ""
 
-#: src/stored/btape.c:2547
+#: src/stored/btape.c:2554
 msgid "read a single record"
 msgstr ""
 
-#: src/stored/btape.c:2548
+#: src/stored/btape.c:2555
 msgid "quick fill command"
 msgstr ""
 
-#: src/stored/btape.c:2569
+#: src/stored/btape.c:2576
 #, c-format
 msgid "%s is an illegal command\n"
 msgstr ""
 
-#: src/stored/btape.c:2579
+#: src/stored/btape.c:2586
 #, c-format
 msgid "Interactive commands:\n"
 msgstr ""
 
-#: src/stored/btape.c:2589
+#: src/stored/btape.c:2596
 #, c-format
 msgid ""
 "Copyright (C) 2000-2005 Kern Sibbald.\n"
@@ -10765,27 +10843,27 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/btape.c:2680
+#: src/stored/btape.c:2687
 #, c-format
 msgid "Mount second Volume on device %s and press return when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2707
+#: src/stored/btape.c:2714
 #, c-format
 msgid "Mount blank Volume on device %s and press return when ready: "
 msgstr ""
 
-#: src/stored/btape.c:2725
+#: src/stored/btape.c:2732
 #, c-format
 msgid "End of Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/btape.c:2737
+#: src/stored/btape.c:2744
 #, c-format
 msgid "Read block=%u, VolBytes=%s rate=%.1f KB/s\n"
 msgstr ""
 
-#: src/stored/btape.c:2752 src/stored/mount.c:493
+#: src/stored/btape.c:2759 src/stored/mount.c:501
 #, c-format
 msgid "Cannot open Dev=%s, Vol=%s\n"
 msgstr ""
@@ -10810,358 +10888,345 @@ msgstr ""
 msgid "cont,"
 msgstr ""
 
-#: src/stored/butil.c:128
+#: src/stored/butil.c:133
 msgid "Volume name or names is too long. Please use a .bsr file.\n"
 msgstr ""
 
-#: src/stored/butil.c:148
+#: src/stored/butil.c:153
 #, c-format
 msgid "Cannot find device \"%s\" in config file %s.\n"
 msgstr ""
 
-#: src/stored/butil.c:155
+#: src/stored/butil.c:160
 #, c-format
 msgid "Cannot init device %s\n"
 msgstr ""
 
-#: src/stored/butil.c:174
+#: src/stored/butil.c:181
 #, c-format
 msgid "Cannot open %s\n"
 msgstr ""
 
-#: src/stored/butil.c:253
+#: src/stored/butil.c:264
 #, c-format
 msgid "Could not find device \"%s\" in config file %s.\n"
 msgstr ""
 
-#: src/stored/butil.c:258
+#: src/stored/butil.c:269
 #, c-format
 msgid "Using device: \"%s\" for reading.\n"
 msgstr ""
 
-#: src/stored/butil.c:261
+#: src/stored/butil.c:272
 #, c-format
 msgid "Using device: \"%s\" for writing.\n"
 msgstr ""
 
-#: src/stored/butil.c:277
+#: src/stored/butil.c:288
 msgid "Unexpected End of Data\n"
 msgstr ""
 
-#: src/stored/butil.c:279
+#: src/stored/butil.c:290
 msgid "Unexpected End of Tape\n"
 msgstr ""
 
-#: src/stored/butil.c:281
+#: src/stored/butil.c:292
 msgid "Unexpected End of File\n"
 msgstr ""
 
-#: src/stored/butil.c:283
+#: src/stored/butil.c:294
 msgid "Tape Door is Open\n"
 msgstr ""
 
-#: src/stored/butil.c:285
+#: src/stored/butil.c:296
 msgid "Unexpected Tape is Off-line\n"
 msgstr ""
 
-#: src/stored/dev.c:110
+#: src/stored/dev.c:112
 #, c-format
 msgid "Unable to stat device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:125
+#: src/stored/dev.c:123
 #, c-format
 msgid ""
 "%s is an unknown device type. Must be tape or directory\n"
 " or have RequiresMount=yes for DVD. st_mode=%x\n"
 msgstr ""
 
-#: src/stored/dev.c:183
+#: src/stored/dev.c:179
 #, c-format
 msgid "Unable to stat mount point %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:188
+#: src/stored/dev.c:186
 msgid ""
 "Mount and unmount commands must defined for a device which requires mount.\n"
 msgstr ""
 
-#: src/stored/dev.c:191
+#: src/stored/dev.c:189
 msgid "Write part command must be defined for a device which requires mount.\n"
 msgstr ""
 
-#: src/stored/dev.c:197
+#: src/stored/dev.c:194
 #, c-format
 msgid "Block size %u on device %s is too large, using default %u\n"
 msgstr ""
 
-#: src/stored/dev.c:202
+#: src/stored/dev.c:199
 #, c-format
 msgid "Max block size %u not multiple of device %s block size.\n"
 msgstr ""
 
-#: src/stored/dev.c:218 src/stored/dev.c:224
+#: src/stored/dev.c:215 src/stored/dev.c:221
 #, c-format
 msgid "Unable to init cond variable: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:310
+#: src/stored/dev.c:312
 msgid "Illegal mode given to open dev.\n"
 msgstr ""
 
-#: src/stored/dev.c:376 src/stored/device.c:302
+#: src/stored/dev.c:355 src/stored/device.c:295
 #, c-format
 msgid "Unable to open device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:396
-#, c-format
-msgid "fcntl error. ERR=%s\n"
-msgstr ""
-
-#: src/stored/dev.c:434 src/stored/dev.c:493
+#: src/stored/dev.c:423 src/stored/dev.c:481
 #, c-format
 msgid "Could not open file device %s. No Volume name given.\n"
 msgstr ""
 
-#: src/stored/dev.c:459 src/stored/dev.c:573
+#: src/stored/dev.c:449 src/stored/dev.c:562
 #, c-format
 msgid "Could not open: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:518
+#: src/stored/dev.c:506
 #, c-format
 msgid ""
 "The media in the device %s is not empty, please blank it before writing "
 "anything to it.\n"
 msgstr ""
 
-#: src/stored/dev.c:534
+#: src/stored/dev.c:523
 #, c-format
 msgid "There is no valid media in the device %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:541
+#: src/stored/dev.c:530
 #, c-format
 msgid "Could not mount device %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:599
+#: src/stored/dev.c:588
 #, c-format
 msgid "Could not fstat: %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:652
+#: src/stored/dev.c:631
 #, c-format
-msgid "Bad call to rewind_dev. Device %s not open\n"
+msgid "Bad call to rewind. Device %s not open\n"
 msgstr ""
 
-#: src/stored/dev.c:681
+#: src/stored/dev.c:677
 #, c-format
 msgid "Rewind error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:691 src/stored/dev.c:804 src/stored/dev.c:941
-#: src/stored/dev.c:1466
+#: src/stored/dev.c:687 src/stored/dev.c:802 src/stored/dev.c:938
+#: src/stored/dev.c:1457
 #, c-format
 msgid "lseek_dev error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:731
+#: src/stored/dev.c:727
 msgid "unknown blocked code"
 msgstr ""
 
-#: src/stored/dev.c:774
+#: src/stored/dev.c:772
 #, c-format
 msgid "Bad call to eod_dev. Device %s not open\n"
 msgstr ""
 
-#: src/stored/dev.c:840
+#: src/stored/dev.c:838
 #, c-format
 msgid "ioctl MTEOM error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:848 src/stored/dev.c:981
+#: src/stored/dev.c:846 src/stored/dev.c:978
 #, c-format
 msgid "ioctl MTIOCGET error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:927
+#: src/stored/dev.c:924
 msgid "Bad device call. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:940
+#: src/stored/dev.c:937
 #, c-format
 msgid "Seek error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:976
+#: src/stored/dev.c:973
 msgid " Bacula status:"
 msgstr ""
 
-#: src/stored/dev.c:977 src/stored/dev.c:1026 src/stored/dev.c:1028
+#: src/stored/dev.c:974 src/stored/dev.c:1023 src/stored/dev.c:1025
 #, c-format
 msgid " file=%d block=%d\n"
 msgstr ""
 
-#: src/stored/dev.c:985
+#: src/stored/dev.c:982
 msgid " Device status:"
 msgstr ""
 
-#: src/stored/dev.c:1050
+#: src/stored/dev.c:1047
 msgid "Bad call to load_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1061 src/stored/dev.c:1074
+#: src/stored/dev.c:1058 src/stored/dev.c:1071
 #, c-format
 msgid "ioctl MTLOAD error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1093
-msgid "Bad call to offline_dev. Device not open\n"
-msgstr ""
-
-#: src/stored/dev.c:1116
+#: src/stored/dev.c:1107
 #, c-format
 msgid "ioctl MTOFFL error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1157
+#: src/stored/dev.c:1148
 msgid "Bad call to fsf_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1167 src/stored/dev.c:1288
+#: src/stored/dev.c:1158 src/stored/dev.c:1279
 #, c-format
 msgid "Device %s at End of Tape.\n"
 msgstr ""
 
-#: src/stored/dev.c:1192 src/stored/dev.c:1268
+#: src/stored/dev.c:1183 src/stored/dev.c:1259
 #, c-format
 msgid "ioctl MTFSF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1317
+#: src/stored/dev.c:1308
 msgid "Bad call to bsf_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1323
+#: src/stored/dev.c:1314
 #, c-format
 msgid "Device %s cannot BSF because it is not a tape.\n"
 msgstr ""
 
-#: src/stored/dev.c:1338
+#: src/stored/dev.c:1329
 #, c-format
 msgid "ioctl MTBSF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1358
+#: src/stored/dev.c:1349
 msgid "Bad call to fsr. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1367
+#: src/stored/dev.c:1358
 #, c-format
 msgid "ioctl MTFSR not permitted on %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1395
+#: src/stored/dev.c:1386
 #, c-format
 msgid "ioctl MTFSR %d error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1415
+#: src/stored/dev.c:1406
 msgid "Bad call to bsr_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1425
+#: src/stored/dev.c:1416
 #, c-format
 msgid "ioctl MTBSR not permitted on %s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1438
+#: src/stored/dev.c:1429
 #, c-format
 msgid "ioctl MTBSR error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1455
+#: src/stored/dev.c:1446
 msgid "Bad call to reposition_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1523
+#: src/stored/dev.c:1514
 msgid "Bad call to weof_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/dev.c:1533
+#: src/stored/dev.c:1524
 msgid "Attempt to WEOF on non-appendable Volume\n"
 msgstr ""
 
-#: src/stored/dev.c:1550
+#: src/stored/dev.c:1541
 #, c-format
 msgid "ioctl MTWEOF error on %s. ERR=%s.\n"
 msgstr ""
 
-#: src/stored/dev.c:1592
+#: src/stored/dev.c:1583
 msgid "Got ENOTTY on read/write!\n"
 msgstr ""
 
-#: src/stored/dev.c:1639
+#: src/stored/dev.c:1630
 #, c-format
 msgid "unknown func code %d"
 msgstr ""
 
-#: src/stored/dev.c:1645
+#: src/stored/dev.c:1636
 #, c-format
 msgid "I/O function \"%s\" not supported on this device.\n"
 msgstr ""
 
-#: src/stored/dev.c:1783 src/stored/dvd.c:668
+#: src/stored/dev.c:1761 src/stored/dvd.c:734
 #, c-format
 msgid "Unable to truncate device %s. ERR=%s\n"
 msgstr ""
 
-#: src/stored/dev.c:1822
+#: src/stored/dev.c:1800
 msgid "Bad call to term_dev. Device not open\n"
 msgstr ""
 
-#: src/stored/device.c:105
+#: src/stored/device.c:100
 #, c-format
 msgid "End of medium on Volume \"%s\" Bytes=%s Blocks=%s at %s.\n"
 msgstr ""
 
-#: src/stored/device.c:119
+#: src/stored/device.c:114
 #, c-format
 msgid "New volume \"%s\" mounted on device %s at %s.\n"
 msgstr ""
 
-#: src/stored/device.c:131
+#: src/stored/device.c:126
 #, c-format
 msgid "write_block_to_device Volume label failed. ERR=%s"
 msgstr ""
 
-#: src/stored/device.c:168
+#: src/stored/device.c:162
 #, c-format
 msgid "write_block_to_device overflow block failed. ERR=%s"
 msgstr ""
 
-#: src/stored/device.c:304
+#: src/stored/device.c:297
 #, c-format
 msgid "Unable to open archive %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:328
-msgid "Bad call to force_close_dev. Device not open\n"
-msgstr ""
-
-#: src/stored/device.c:346
+#: src/stored/device.c:332
 #, c-format
 msgid "Device write lock failure. ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:354
+#: src/stored/device.c:340
 #, c-format
 msgid "Device write unlock failure. ERR=%s\n"
 msgstr ""
 
-#: src/stored/device.c:373
+#: src/stored/device.c:359
 #, c-format
 msgid "pthread_cond_wait failure. ERR=%s\n"
 msgstr ""
@@ -11182,72 +11247,72 @@ msgstr ""
 
 #: src/stored/dircmd.c:262
 #, c-format
-msgid "3902 Job %s not found.\n"
+msgid "3904 Job %s not found.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:279
+#: src/stored/dircmd.c:283
 #, c-format
 msgid "3000 Job %s marked to be canceled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:283
+#: src/stored/dircmd.c:287
 msgid "3903 Error scanning cancel command.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:356 src/stored/dircmd.c:655 src/stored/dircmd.c:720
-#: src/stored/dircmd.c:779 src/stored/dircmd.c:829 src/stored/dircmd.c:869
+#: src/stored/dircmd.c:364 src/stored/dircmd.c:680 src/stored/dircmd.c:756
+#: src/stored/dircmd.c:819 src/stored/dircmd.c:874 src/stored/dircmd.c:918
 #, c-format
-msgid "3999 Device \"%s\" not found\n"
+msgid "3999 Device \"%s\" not found or could not be opened.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:361
+#: src/stored/dircmd.c:369
 #, c-format
 msgid "3903 Error scanning label command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:405
+#: src/stored/dircmd.c:412
 #, c-format
 msgid "3920 Cannot label Volume because it is already labeled: \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:411
+#: src/stored/dircmd.c:419
 msgid "3921 Wrong volume mounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:415
+#: src/stored/dircmd.c:423
 msgid "3922 Cannot relabel an ANSI/IBM labeled Volume.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:423 src/stored/dircmd.c:432
+#: src/stored/dircmd.c:431 src/stored/dircmd.c:440
 #, c-format
 msgid "3912 Failed to label Volume: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:435
+#: src/stored/dircmd.c:443
 #, c-format
 msgid "3913 Cannot label Volume. Unknown status %d from read_volume_label()\n"
 msgstr ""
 
-#: src/stored/dircmd.c:468
+#: src/stored/dircmd.c:476
 #, c-format
 msgid "3001 Mounted Volume: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:472 src/stored/dircmd.c:905
+#: src/stored/dircmd.c:480 src/stored/dircmd.c:954
 #, c-format
 msgid ""
 "3902 Cannot mount Volume on Storage Device %s because:\n"
 "%s"
 msgstr ""
 
-#: src/stored/dircmd.c:495 src/stored/reserve.c:554
+#: src/stored/dircmd.c:508 src/stored/reserve.c:674
 #, c-format
 msgid ""
 "\n"
 "     Device \"%s\" requested by DIR could not be opened or does not exist.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:516 src/stored/reserve.c:550
+#: src/stored/dircmd.c:529 src/stored/reserve.c:670
 #, c-format
 msgid ""
 "\n"
@@ -11255,222 +11320,283 @@ msgid ""
 "does not exist.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:575 src/stored/dircmd.c:623
+#: src/stored/dircmd.c:593 src/stored/dircmd.c:646
 #, c-format
 msgid "3901 open device failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:590 src/stored/dircmd.c:614
+#: src/stored/dircmd.c:613 src/stored/dircmd.c:637
 #, c-format
 msgid "3001 Device %s is mounted with Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:593 src/stored/dircmd.c:617 src/stored/dircmd.c:632
+#: src/stored/dircmd.c:616 src/stored/dircmd.c:640 src/stored/dircmd.c:655
 #, c-format
 msgid ""
 "3905 Device %s open but no Bacula volume is mounted.\n"
 "If this is not a blank tape, try unmounting and remounting the Volume.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:602
+#: src/stored/dircmd.c:625
 #, c-format
 msgid "3001 Device %s is doing acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:607 src/stored/dircmd.c:698
+#: src/stored/dircmd.c:630 src/stored/dircmd.c:730
 #, c-format
 msgid "3903 Device %s is being labeled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:629
+#: src/stored/dircmd.c:652
 #, c-format
 msgid "3001 Device %s is already mounted with Volume \"%s\"\n"
 msgstr ""
 
-#: src/stored/dircmd.c:638
+#: src/stored/dircmd.c:661
 #, c-format
 msgid "3002 Device %s is mounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:641
+#: src/stored/dircmd.c:664
 #, c-format
 msgid "3907 %s"
 msgstr ""
 
-#: src/stored/dircmd.c:644
+#: src/stored/dircmd.c:667
 #, c-format
 msgid "3906 File device %s is always mounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:650
+#: src/stored/dircmd.c:673
 #, c-format
 msgid "3905 Bizarre wait state %d\n"
 msgstr ""
 
-#: src/stored/dircmd.c:659
+#: src/stored/dircmd.c:684
 #, c-format
 msgid "3909 Error scanning mount command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:681
+#: src/stored/dircmd.c:711
 #, c-format
 msgid "3901 Device %s is already unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:690
+#: src/stored/dircmd.c:722
 #, c-format
 msgid "3001 Device %s unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:694
+#: src/stored/dircmd.c:726
 #, c-format
 msgid "3902 Device %s is busy in acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:715
+#: src/stored/dircmd.c:749
 #, c-format
 msgid "3002 Device %s unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:725
+#: src/stored/dircmd.c:761
 #, c-format
 msgid "3907 Error scanning unmount command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:751
+#: src/stored/dircmd.c:789
 #, c-format
-msgid "3911 Device %s already released.\n"
+msgid "3921 Device %s already released.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:758
+#: src/stored/dircmd.c:796
 #, c-format
-msgid "3912 Device %s waiting for mount.\n"
+msgid "3922 Device %s waiting for mount.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:762
+#: src/stored/dircmd.c:800
 #, c-format
-msgid "3913 Device %s is busy in acquire.\n"
+msgid "3923 Device %s is busy in acquire.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:766
+#: src/stored/dircmd.c:804
 #, c-format
 msgid "3914 Device %s is being labeled.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:774
+#: src/stored/dircmd.c:812
 #, c-format
-msgid "3012 Device %s released.\n"
+msgid "3022 Device %s released.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:784
+#: src/stored/dircmd.c:824
 #, c-format
-msgid "3917 Error scanning release command: %s\n"
+msgid "3927 Error scanning release command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:817
+#: src/stored/dircmd.c:860
 #, c-format
 msgid "3995 Device %s is not an autochanger.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:833
+#: src/stored/dircmd.c:878
 #, c-format
-msgid "3908 Error scanning autocharger list/slots command: %s\n"
+msgid "3908 Error scanning autocharger drives/list/slots command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:873
+#: src/stored/dircmd.c:922
 #, c-format
 msgid "3909 Error scanning readlabel command: %s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:901
+#: src/stored/dircmd.c:950
 #, c-format
 msgid "3001 Volume=%s Slot=%d\n"
 msgstr ""
 
-#: src/stored/dircmd.c:930
+#: src/stored/dircmd.c:979
 #, c-format
 msgid "3910 Unable to open device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/dircmd.c:940
+#: src/stored/dircmd.c:991
 #, c-format
-msgid "3911 Device %s is busy reading.\n"
+msgid "3931 Device %s is BLOCKED. user unmounted.\n"
 msgstr ""
 
-#: src/stored/dircmd.c:943
+#: src/stored/dircmd.c:995
 #, c-format
-msgid "3912 Device %s is busy with %d writer(s).\n"
+msgid ""
+"3932 Device %s is BLOCKED. user unmounted during wait for media/mount.\n"
 msgstr ""
 
-#: src/stored/fd_cmds.c:340
-msgid "Error parsing bootstrap file.\n"
+#: src/stored/dircmd.c:999
+#, c-format
+msgid "3933 Device %s is BLOCKED waiting for media.\n"
 msgstr ""
 
-#: src/stored/job.c:79
+#: src/stored/dircmd.c:1003
 #, c-format
-msgid "Bad Job Command from Director: %s\n"
+msgid "3934 Device %s is being initialized.\n"
 msgstr ""
 
-#: src/stored/job.c:189
+#: src/stored/dircmd.c:1007
 #, c-format
-msgid "Job name not found: %s\n"
+msgid "3935 Device %s is blocked labeling a Volume.\n"
 msgstr ""
 
-#: src/stored/job.c:200
+#: src/stored/dircmd.c:1011
 #, c-format
-msgid "Hey!!!! JobId %u Job %s already authenticated.\n"
+msgid "3935 Device %s is blocked for unknown reason.\n"
 msgstr ""
 
-#: src/stored/job.c:211
-msgid "Unable to authenticate File daemon\n"
+#: src/stored/dircmd.c:1016
+#, c-format
+msgid "3936 Device %s is busy reading.\n"
 msgstr ""
 
-#: src/stored/job.c:338
-msgid "In free_jcr(), but still attached to device!!!!\n"
+#: src/stored/dircmd.c:1019
+#, c-format
+msgid "3937 Device %s is busy with %d writer(s).\n"
 msgstr ""
 
-#: src/stored/label.c:74
-msgid "BAD call to read_dev_volume_label\n"
+#: src/stored/dvd.c:153
+#, c-format
+msgid "Device %s cannot be mounted. ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:79 src/stored/label.c:120 src/stored/label.c:208
+#: src/stored/dvd.c:271
 #, c-format
-msgid "Wrong Volume mounted on device %s: Wanted %s have %s\n"
+msgid "Cannot run free space command (%s)\n"
 msgstr ""
 
-#: src/stored/label.c:86 src/stored/label.c:123 src/stored/label.c:195
+#: src/stored/dvd.c:374
 #, c-format
-msgid "Too many tries: %s"
+msgid "Error while writing current part to the DVD: %s"
 msgstr ""
 
-#: src/stored/label.c:102
+#: src/stored/dvd.c:394
 #, c-format
-msgid "Couldn't rewind device %s: ERR=%s\n"
+msgid "Remaining free space %s on %s\n"
 msgstr ""
 
-#: src/stored/label.c:140
+#: src/stored/dvd.c:464
 #, c-format
-msgid ""
-"Requested Volume \"%s\" on %s is not a Bacula labeled Volume, because: ERR=%s"
+msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
 msgstr ""
 
-#: src/stored/label.c:145
-msgid "Could not read Volume label from block.\n"
+#: src/stored/dvd.c:481
+#, c-format
+msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:148
+#: src/stored/dvd.c:700
 #, c-format
-msgid "Could not unserialize Volume label: ERR=%s\n"
+msgid "Unable to write part %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:153
-#, c-format
-msgid "Volume Header Id bad: %s\n"
+#: src/stored/fd_cmds.c:340
+msgid "Error parsing bootstrap file.\n"
 msgstr ""
 
-#: src/stored/label.c:180
+#: src/stored/job.c:191
 #, c-format
-msgid "Volume on %s has wrong Bacula version. Wanted %d got %d\n"
+msgid "Job name not found: %s\n"
+msgstr ""
+
+#: src/stored/job.c:202
+#, c-format
+msgid "Hey!!!! JobId %u Job %s already authenticated.\n"
+msgstr ""
+
+#: src/stored/job.c:213
+msgid "Unable to authenticate File daemon\n"
+msgstr ""
+
+#: src/stored/job.c:334
+msgid "In free_jcr(), but still attached to device!!!!\n"
+msgstr ""
+
+#: src/stored/label.c:74
+msgid "BAD call to read_dev_volume_label\n"
+msgstr ""
+
+#: src/stored/label.c:79 src/stored/label.c:120 src/stored/label.c:208
+#, c-format
+msgid "Wrong Volume mounted on device %s: Wanted %s have %s\n"
+msgstr ""
+
+#: src/stored/label.c:86 src/stored/label.c:123 src/stored/label.c:195
+#, c-format
+msgid "Too many tries: %s"
+msgstr ""
+
+#: src/stored/label.c:102
+#, c-format
+msgid "Couldn't rewind device %s: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:140
+#, c-format
+msgid ""
+"Requested Volume \"%s\" on %s is not a Bacula labeled Volume, because: ERR=%s"
+msgstr ""
+
+#: src/stored/label.c:145
+msgid "Could not read Volume label from block.\n"
+msgstr ""
+
+#: src/stored/label.c:148
+#, c-format
+msgid "Could not unserialize Volume label: ERR=%s\n"
+msgstr ""
+
+#: src/stored/label.c:153
+#, c-format
+msgid "Volume Header Id bad: %s\n"
+msgstr ""
+
+#: src/stored/label.c:180
+#, c-format
+msgid "Volume on %s has wrong Bacula version. Wanted %d got %d\n"
 msgstr ""
 
 #: src/stored/label.c:191
@@ -11483,52 +11609,52 @@ msgstr ""
 msgid "Cannot write Volume label to block for device %s\n"
 msgstr ""
 
-#: src/stored/label.c:393
+#: src/stored/label.c:400
 #, c-format
 msgid "Rewind error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:398
+#: src/stored/label.c:405
 #, c-format
 msgid "Truncate error on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:420
+#: src/stored/label.c:427
 #, c-format
 msgid "Unable to write device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/label.c:448
+#: src/stored/label.c:455
 #, c-format
 msgid "Recycled volume \"%s\" on device %s, all previous data lost.\n"
 msgstr ""
 
-#: src/stored/label.c:451
+#: src/stored/label.c:458
 #, c-format
 msgid "Wrote label to prelabeled Volume \"%s\" on device %s\n"
 msgstr ""
 
-#: src/stored/label.c:648
+#: src/stored/label.c:657
 #, c-format
 msgid "Bad session label = %d\n"
 msgstr ""
 
-#: src/stored/label.c:666 src/stored/label.c:673
+#: src/stored/label.c:675 src/stored/label.c:682
 #, c-format
 msgid "Error writing Session label to %s: %s\n"
 msgstr ""
 
-#: src/stored/label.c:707
+#: src/stored/label.c:717
 #, c-format
 msgid "Expecting Volume Label, got FI=%s Stream=%s len=%d\n"
 msgstr ""
 
-#: src/stored/label.c:834
+#: src/stored/label.c:844
 #, c-format
 msgid "Unknown %d"
 msgstr ""
 
-#: src/stored/label.c:838
+#: src/stored/label.c:848
 #, c-format
 msgid ""
 "\n"
@@ -11545,17 +11671,17 @@ msgid ""
 "HostName          : %s\n"
 msgstr ""
 
-#: src/stored/label.c:860
+#: src/stored/label.c:870
 #, c-format
 msgid "Date label written: %s\n"
 msgstr ""
 
-#: src/stored/label.c:866
+#: src/stored/label.c:876
 #, c-format
 msgid "Date label written: %04d-%02d-%02d at %02d:%02d\n"
 msgstr ""
 
-#: src/stored/label.c:886
+#: src/stored/label.c:896
 #, c-format
 msgid ""
 "\n"
@@ -11568,7 +11694,7 @@ msgid ""
 "ClientName        : %s\n"
 msgstr ""
 
-#: src/stored/label.c:899
+#: src/stored/label.c:909
 #, c-format
 msgid ""
 "Job (unique name) : %s\n"
@@ -11577,7 +11703,7 @@ msgid ""
 "JobLevel          : %c\n"
 msgstr ""
 
-#: src/stored/label.c:908
+#: src/stored/label.c:918
 #, c-format
 msgid ""
 "JobFiles          : %s\n"
@@ -11590,118 +11716,132 @@ msgid ""
 "JobStatus         : %c\n"
 msgstr ""
 
-#: src/stored/label.c:929
+#: src/stored/label.c:939
 #, c-format
 msgid "Date written      : %s\n"
 msgstr ""
 
-#: src/stored/label.c:934
+#: src/stored/label.c:944
 #, c-format
 msgid "Date written      : %04d-%02d-%02d at %02d:%02d\n"
 msgstr ""
 
-#: src/stored/label.c:953
+#: src/stored/label.c:963
 msgid "Fresh Volume"
 msgstr ""
 
-#: src/stored/label.c:956
+#: src/stored/label.c:966
 msgid "Volume"
 msgstr ""
 
-#: src/stored/label.c:965 src/stored/read_record.c:335
+#: src/stored/label.c:975 src/stored/read_record.c:336
 msgid "End of Media"
 msgstr ""
 
-#: src/stored/label.c:968
+#: src/stored/label.c:978
 msgid "End of Tape"
 msgstr ""
 
-#: src/stored/label.c:988 src/stored/label.c:996 src/stored/label.c:1029
+#: src/stored/label.c:998 src/stored/label.c:1006 src/stored/label.c:1039
 #, c-format
 msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d DataLen=%d\n"
 msgstr ""
 
-#: src/stored/label.c:993
+#: src/stored/label.c:1003
 msgid "End of physical tape.\n"
 msgstr ""
 
-#: src/stored/label.c:1008 src/stored/label.c:1017
+#: src/stored/label.c:1018 src/stored/label.c:1027
 #, c-format
 msgid "%s Record: File:blk=%u:%u SessId=%d SessTime=%d JobId=%d\n"
 msgstr ""
 
-#: src/stored/label.c:1010
+#: src/stored/label.c:1020
 #, c-format
 msgid "   Job=%s Date=%s Level=%c Type=%c\n"
 msgstr ""
 
-#: src/stored/label.c:1019
+#: src/stored/label.c:1029
 #, c-format
 msgid "   Date=%s Level=%c Type=%c Files=%s Bytes=%s Errors=%d Status=%c\n"
 msgstr ""
 
-#: src/stored/mount.c:197 src/stored/mount.c:294
+#: src/stored/mount.c:198 src/stored/mount.c:296
 #, c-format
 msgid "Volume \"%s\" not on device %s.\n"
 msgstr ""
 
-#: src/stored/mount.c:230
+#: src/stored/mount.c:225
 #, c-format
 msgid ""
-"Director wanted Volume \"%s\".\n"
+"Director wanted Volume \"%s\" for device %s.\n"
 "    Current Volume \"%s\" not acceptable because:\n"
 "    %s"
 msgstr ""
 
-#: src/stored/mount.c:284
+#: src/stored/mount.c:286
 #, c-format
 msgid "Labeled new Volume \"%s\" on device %s.\n"
 msgstr ""
 
-#: src/stored/mount.c:289
+#: src/stored/mount.c:291
 #, c-format
 msgid "Warning device %s not configured to autolabel Volumes.\n"
 msgstr ""
 
-#: src/stored/mount.c:340
+#: src/stored/mount.c:343
 #, c-format
 msgid "Volume \"%s\" previously written, moving to end of data.\n"
 msgstr ""
 
-#: src/stored/mount.c:343
+#: src/stored/mount.c:346
 #, c-format
 msgid "Unable to position to end of data on device %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/mount.c:355
+#: src/stored/mount.c:358
 #, c-format
 msgid "Ready to append to end of Volume \"%s\" at file=%d.\n"
 msgstr ""
 
-#: src/stored/mount.c:358
+#: src/stored/mount.c:361
 #, c-format
 msgid ""
 "I cannot write on Volume \"%s\" because:\n"
 "The number of files mismatch! Volume=%u Catalog=%u\n"
 msgstr ""
 
-#: src/stored/mount.c:411
+#: src/stored/mount.c:389
+#, c-format
+msgid "Ready to append to end of Volume \"%s\" at file address=%u.\n"
+msgstr ""
+
+#: src/stored/mount.c:393
+#, c-format
+msgid ""
+"I cannot write on Volume \"%s\" because:\n"
+"The EOD file address is wrong: Volume file address=%u != Catalog Endblock=%u"
+"(+1)\n"
+"You probably removed DVD last part in spool directory.\n"
+msgstr ""
+
+#: src/stored/mount.c:419
 #, c-format
 msgid "Marking Volume \"%s\" in Error in Catalog.\n"
 msgstr ""
 
-#: src/stored/mount.c:427
+#: src/stored/mount.c:435
 #, c-format
 msgid ""
 "Autochanger Volume \"%s\" not found in slot %d.\n"
 "    Setting InChanger to zero in catalog.\n"
 msgstr ""
 
-#: src/stored/mount.c:446
+#: src/stored/mount.c:454
 msgid "Hey!!!!! WroteVol non-zero !!!!!\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:104 src/stored/parse_bsr.c:108
+#: src/stored/parse_bsr.c:106 src/stored/parse_bsr.c:110
 #, c-format
 msgid ""
 "Bootstrap file error: %s\n"
@@ -11709,128 +11849,161 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:130
+#: src/stored/parse_bsr.c:132
 #, c-format
 msgid "Cannot open bootstrap file %s: %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:260
+#: src/stored/parse_bsr.c:262
 #, c-format
 msgid "MediaType %s in bsr at inappropriate place.\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:416
+#: src/stored/parse_bsr.c:283
+#, c-format
+msgid "Device \"%s\" in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:440
 msgid "JobType not yet implemented\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:424
+#: src/stored/parse_bsr.c:448
 msgid "JobLevel not yet implemented\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:626
+#: src/stored/parse_bsr.c:631
+#, c-format
+msgid "Slot %d in bsr at inappropriate place.\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:655
 #, c-format
 msgid "VolFile     : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:634
+#: src/stored/parse_bsr.c:663
 #, c-format
 msgid "VolBlock    : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:644
+#: src/stored/parse_bsr.c:673
 #, c-format
 msgid "FileIndex   : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:646
+#: src/stored/parse_bsr.c:675
 #, c-format
 msgid "FileIndex   : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:656
+#: src/stored/parse_bsr.c:685
 #, c-format
 msgid "JobId       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:658
+#: src/stored/parse_bsr.c:687
 #, c-format
 msgid "JobId       : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:668
+#: src/stored/parse_bsr.c:697
 #, c-format
 msgid "SessId      : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:670
+#: src/stored/parse_bsr.c:699
 #, c-format
 msgid "SessId      : %u-%u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:679
+#: src/stored/parse_bsr.c:708
 #, c-format
 msgid "VolumeName  : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:688
+#: src/stored/parse_bsr.c:709
+#, c-format
+msgid "  MediaType : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:710
+#, c-format
+msgid "  Device    : %s\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:711
+#, c-format
+msgid "  Slot      : %d\n"
+msgstr ""
+
+#: src/stored/parse_bsr.c:720
 #, c-format
 msgid "Client      : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:696
+#: src/stored/parse_bsr.c:728
 #, c-format
 msgid "Job          : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:704
+#: src/stored/parse_bsr.c:736
 #, c-format
 msgid "SessTime    : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:718
+#: src/stored/parse_bsr.c:750
 msgid "BSR is NULL\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:722
+#: src/stored/parse_bsr.c:754
 #, c-format
 msgid "Next        : 0x%x\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:723
+#: src/stored/parse_bsr.c:755
 #, c-format
 msgid "Root bsr    : 0x%x\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:734
-#, c-format
-msgid "Slot        : %u\n"
-msgstr ""
-
-#: src/stored/parse_bsr.c:737
+#: src/stored/parse_bsr.c:766
 #, c-format
 msgid "count       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:738
+#: src/stored/parse_bsr.c:767
 #, c-format
 msgid "found       : %u\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:741
+#: src/stored/parse_bsr.c:770
 #, c-format
 msgid "done        : %s\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:742
+#: src/stored/parse_bsr.c:771
 #, c-format
 msgid "positioning : %d\n"
 msgstr ""
 
-#: src/stored/parse_bsr.c:743
+#: src/stored/parse_bsr.c:772
 #, c-format
 msgid "fast_reject : %d\n"
 msgstr ""
 
+#: src/stored/pythonsd.c:197
+msgid "Error in ParseTuple\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:213
+msgid "Parse tuple error in job_write\n"
+msgstr ""
+
+#: src/stored/pythonsd.c:250
+#, c-format
+msgid "Error in Python method %s\n"
+msgstr ""
+
 #: src/stored/read.c:55
 msgid "No Volume names found for restore.\n"
 msgstr ""
@@ -11861,45 +12034,127 @@ msgstr ""
 
 #: src/stored/read_record.c:105
 #, c-format
-msgid "Got EOF at file %u  on device %s, Volume \"%s\"\n"
+msgid "End of file %u  on device %s, Volume \"%s\"\n"
 msgstr ""
 
 #: src/stored/read_record.c:119
 msgid "Did fsr\n"
 msgstr ""
 
-#: src/stored/read_record.c:275
+#: src/stored/read_record.c:276
 #, c-format
 msgid "Reposition from (file:block) %u:%u to %u:%u\n"
 msgstr ""
 
-#: src/stored/read_record.c:302
+#: src/stored/read_record.c:303
 #, c-format
 msgid "Forward spacing to file:block %u:%u.\n"
 msgstr ""
 
-#: src/stored/read_record.c:328
+#: src/stored/read_record.c:329
 msgid "Begin Session"
 msgstr ""
 
-#: src/stored/read_record.c:332
+#: src/stored/read_record.c:333
 msgid "End Session"
 msgstr ""
 
-#: src/stored/read_record.c:338
+#: src/stored/read_record.c:339
 #, c-format
 msgid "Unknown code %d\n"
 msgstr ""
 
-#: src/stored/record.c:61
+#: src/stored/record.c:60
 #, c-format
 msgid "unknown: %d"
 msgstr ""
 
-#: src/stored/record.c:332
+#: src/stored/record.c:343
 msgid "Damaged buffer\n"
 msgstr ""
 
+#: src/stored/reserve.c:75
+#, c-format
+msgid "Unable to initialize reservation lock. ERR=%s\n"
+msgstr ""
+
+#: src/stored/reserve.c:496 src/stored/reserve.c:507
+#, c-format
+msgid "Failed command: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:497
+#, c-format
+msgid ""
+"\n"
+"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
+"Device resources.\n"
+msgstr ""
+
+#: src/stored/reserve.c:687
+#, c-format
+msgid "3926 Could not get dcr for device: %s\n"
+msgstr ""
+
+#: src/stored/reserve.c:752
+#, c-format
+msgid "3601 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:761
+#, c-format
+msgid "3602 JobId=%u device %s is busy (already reading/writing).\n"
+msgstr ""
+
+#: src/stored/reserve.c:808
+#, c-format
+msgid "3603 JobId=%u device %s is busy reading.\n"
+msgstr ""
+
+#: src/stored/reserve.c:817
+#, c-format
+msgid "3604 JobId=%u device %s is BLOCKED due to user unmount.\n"
+msgstr ""
+
+#: src/stored/reserve.c:883
+#, c-format
+msgid "3605 JobId=%u wants free drive but device %s is busy.\n"
+msgstr ""
+
+#: src/stored/reserve.c:891
+#, c-format
+msgid "3606 JobId=%u wants mounted, but drive %s has no Volume.\n"
+msgstr ""
+
+#: src/stored/reserve.c:901
+#, c-format
+msgid "3607 JobId=%u wants Vol=\"%s\" drive has Vol=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:937
+#, c-format
+msgid "3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:980
+#, c-format
+msgid "3609 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"
+msgstr ""
+
+#: src/stored/reserve.c:988 src/stored/reserve.c:992
+msgid "Logic error!!!! Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:989
+#, c-format
+msgid "3910 JobId=%u Logic error!!!! drive %s Should not get here.\n"
+msgstr ""
+
+#: src/stored/reserve.c:995
+#, c-format
+msgid "3911 JobId=%u failed reserve drive %s.\n"
+msgstr ""
+
 #: src/stored/spool.c:69
 #, c-format
 msgid ""
@@ -11927,256 +12182,272 @@ msgstr ""
 
 #: src/stored/spool.c:199
 #, c-format
-msgid "Committing spooled data to Volume. Despooling %s bytes ...\n"
+msgid "Committing spooled data to Volume \"%s\". Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:203
+#: src/stored/spool.c:204
 #, c-format
 msgid "Writing spooled data to Volume. Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:257 src/stored/spool.c:431 src/stored/spool.c:469
+#: src/stored/spool.c:258 src/stored/spool.c:432 src/stored/spool.c:470
 #, c-format
 msgid "Ftruncate spool file failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:259
+#: src/stored/spool.c:260
 #, c-format
 msgid "Bad return from ftruncate. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:308
+#: src/stored/spool.c:309
 #, c-format
 msgid "Spool header read error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:311
+#: src/stored/spool.c:312
 #, c-format
 msgid "Spool read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:312
+#: src/stored/spool.c:313
 #, c-format
 msgid "Spool header read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:318 src/stored/spool.c:319
+#: src/stored/spool.c:319 src/stored/spool.c:320
 #, c-format
 msgid "Spool block too big. Max %u bytes, got %u\n"
 msgstr ""
 
-#: src/stored/spool.c:324 src/stored/spool.c:325
+#: src/stored/spool.c:325 src/stored/spool.c:326
 #, c-format
 msgid "Spool data read error. Wanted %u bytes, got %d\n"
 msgstr ""
 
-#: src/stored/spool.c:382
+#: src/stored/spool.c:383
 msgid "User specified spool size reached.\n"
 msgstr ""
 
-#: src/stored/spool.c:384
+#: src/stored/spool.c:385
 msgid "Bad return from despool in write_block.\n"
 msgstr ""
 
-#: src/stored/spool.c:392
+#: src/stored/spool.c:393
 msgid "Spooling data again ...\n"
 msgstr ""
 
-#: src/stored/spool.c:423
+#: src/stored/spool.c:424
 #, c-format
 msgid "Error writing header to spool file. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:437 src/stored/spool.c:475
+#: src/stored/spool.c:438 src/stored/spool.c:476
 msgid "Fatal despooling error."
 msgstr ""
 
-#: src/stored/spool.c:444
+#: src/stored/spool.c:445
 msgid "Retrying after header spooling error failed.\n"
 msgstr ""
 
-#: src/stored/spool.c:458
+#: src/stored/spool.c:459
 #, c-format
 msgid "Error writing data to spool file. ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:485
+#: src/stored/spool.c:486
 msgid "Retrying after data spooling error failed.\n"
 msgstr ""
 
-#: src/stored/spool.c:540 src/stored/spool.c:547
+#: src/stored/spool.c:541 src/stored/spool.c:548
 #, c-format
 msgid "Fseek on attributes file failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/spool.c:557
+#: src/stored/spool.c:558
 #, c-format
 msgid "Sending spooled attrs to the Director. Despooling %s bytes ...\n"
 msgstr ""
 
-#: src/stored/spool.c:584
+#: src/stored/spool.c:585
 #, c-format
 msgid "fopen attr spool file %s failed: ERR=%s\n"
 msgstr ""
 
-#: src/stored/status.c:66
+#: src/stored/status.c:67
 #, c-format
 msgid ""
 "\n"
 "%s Version: %s (%s) %s %s %s\n"
 msgstr ""
 
-#: src/stored/status.c:97
+#: src/stored/status.c:103
 msgid ""
 "\n"
 "Device status:\n"
 msgstr ""
 
-#: src/stored/status.c:99
+#: src/stored/status.c:105
 #, c-format
 msgid "Autochanger \"%s\" with devices:\n"
 msgstr ""
 
-#: src/stored/status.c:113
+#: src/stored/status.c:119
 #, c-format
-msgid "Device %s is mounted with Volume \"%s\"\n"
+msgid "Device %s is mounted with Volume=\"%s\" Pool=\"%s\"\n"
 msgstr ""
 
-#: src/stored/status.c:116
+#: src/stored/status.c:123
 #, c-format
 msgid "Device %s open but no Bacula volume is mounted.\n"
 msgstr ""
 
-#: src/stored/status.c:126
+#: src/stored/status.c:133
 #, c-format
 msgid "    Total Bytes=%s Blocks=%s Bytes/block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:140
+#: src/stored/status.c:147
 #, c-format
 msgid "    Total Bytes Read=%s Blocks Read=%s Bytes/block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:145
+#: src/stored/status.c:152
 #, c-format
 msgid "    Positioned at File=%s Block=%s\n"
 msgstr ""
 
-#: src/stored/status.c:151
+#: src/stored/status.c:158
 #, c-format
 msgid "Device %s is not open or does not exist.\n"
 msgstr ""
 
-#: src/stored/status.c:153
+#: src/stored/status.c:160
 #, c-format
 msgid "Device \"%s\" is not open or does not exist.\n"
 msgstr ""
 
-#: src/stored/status.c:158 src/stored/status.c:165 src/stored/status.c:168
+#: src/stored/status.c:165 src/stored/status.c:168 src/stored/status.c:172
+#: src/stored/status.c:174
 msgid ""
 "====\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:159
-msgid "Volume status:\n"
+#: src/stored/status.c:166
+msgid "In Use Volume status:\n"
 msgstr ""
 
-#: src/stored/status.c:183
+#: src/stored/status.c:190
 msgid ""
 "No DEVICE structure.\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:188
+#: src/stored/status.c:195
 msgid "    Device is BLOCKED. User unmounted.\n"
 msgstr ""
 
-#: src/stored/status.c:191
+#: src/stored/status.c:198
 msgid "    Device is BLOCKED. User unmounted during wait for media/mount.\n"
 msgstr ""
 
-#: src/stored/status.c:195
+#: src/stored/status.c:202
 #, c-format
 msgid "    Device is BLOCKED waiting for mount of volume \"%s\".\n"
 msgstr ""
 
-#: src/stored/status.c:198
+#: src/stored/status.c:205
 msgid "    Device is BLOCKED waiting for media.\n"
 msgstr ""
 
-#: src/stored/status.c:202
+#: src/stored/status.c:209
 msgid "    Device is being initialized.\n"
 msgstr ""
 
-#: src/stored/status.c:205
+#: src/stored/status.c:212
 msgid "    Device is blocked labeling a Volume.\n"
 msgstr ""
 
-#: src/stored/status.c:213
+#: src/stored/status.c:220
 #, c-format
 msgid "    Slot %d is loaded in drive %d.\n"
 msgstr ""
 
-#: src/stored/status.c:216
+#: src/stored/status.c:223
 #, c-format
 msgid "    Drive %d is not loaded.\n"
 msgstr ""
 
-#: src/stored/status.c:235
+#: src/stored/status.c:242
 msgid "Device state:\n"
 msgstr ""
 
-#: src/stored/status.c:249
+#: src/stored/status.c:256
 #, c-format
 msgid ""
 "num_writers=%d JobStatus=%c block=%d\n"
 "\n"
 msgstr ""
 
-#: src/stored/status.c:253
+#: src/stored/status.c:260
 #, c-format
 msgid "Archive name: %s Device name: %s\n"
 msgstr ""
 
-#: src/stored/status.c:255
+#: src/stored/status.c:262
 #, c-format
 msgid "File=%u block=%u\n"
 msgstr ""
 
-#: src/stored/status.c:256
+#: src/stored/status.c:263
 #, c-format
 msgid "Min block=%u Max block=%u\n"
 msgstr ""
 
-#: src/stored/status.c:272
+#: src/stored/status.c:280
 #, c-format
 msgid "%s Job %s waiting for Client connection.\n"
 msgstr ""
 
-#: src/stored/status.c:284
+#: src/stored/status.c:295
+#, c-format
+msgid ""
+"Reading: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
+msgstr ""
+
+#: src/stored/status.c:307
 #, c-format
-msgid "%s %s job %s JobId=%d Volume=\"%s\" device=\"%s\"\n"
+msgid ""
+"Writing: %s %s job %s JobId=%d Volume=\"%s\"\n"
+"    pool=\"%s\" device=\"%s\"\n"
 msgstr ""
 
-#: src/stored/status.c:303
+#: src/stored/status.c:330
 #, c-format
 msgid "    FDReadSeqNo=%s in_msg=%u out_msg=%d fd=%d\n"
 msgstr ""
 
-#: src/stored/status.c:308
+#: src/stored/status.c:335
 msgid "    FDSocket closed\n"
 msgstr ""
 
-#: src/stored/status.c:335
+#: src/stored/status.c:352
+msgid ""
+"\n"
+"Jobs waiting to reserve a drive:\n"
+msgstr ""
+
+#: src/stored/status.c:380
 msgid " JobId  Level   Files          Bytes Status   Finished        Name \n"
 msgstr ""
 
-#: src/stored/status.c:469
+#: src/stored/status.c:514
 msgid "3900 Bad .status command, missing argument.\n"
 msgstr ""
 
-#: src/stored/status.c:494
+#: src/stored/status.c:537
 msgid "3900 Bad .status command, wrong argument.\n"
 msgstr ""
 
@@ -12201,46 +12472,46 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/stored/stored.c:220
+#: src/stored/stored.c:222
 msgid "Volume Session Time is ZERO!\n"
 msgstr ""
 
-#: src/stored/stored.c:233
+#: src/stored/stored.c:235
 #, c-format
 msgid "Unable to create thread. ERR=%s\n"
 msgstr ""
 
-#: src/stored/stored.c:272
+#: src/stored/stored.c:273
 #, c-format
 msgid "Only one Storage resource permitted in %s\n"
 msgstr ""
 
-#: src/stored/stored.c:277
+#: src/stored/stored.c:278
 #, c-format
 msgid "No Director resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:282
+#: src/stored/stored.c:283
 #, c-format
 msgid "No Device resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:290
+#: src/stored/stored.c:291
 #, c-format
 msgid "No Messages resource defined in %s. Cannot continue.\n"
 msgstr ""
 
-#: src/stored/stored.c:317
+#: src/stored/stored.c:318
 #, c-format
 msgid "\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/stored/stored.c:323
+#: src/stored/stored.c:324
 #, c-format
 msgid "\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"
 msgstr ""
 
-#: src/stored/stored.c:329
+#: src/stored/stored.c:330
 #, c-format
 msgid ""
 "Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
@@ -12248,311 +12519,151 @@ msgid ""
 "using \"TLS Verify Peer\".\n"
 msgstr ""
 
-#: src/stored/stored.c:417
-#, c-format
-msgid "No Changer Name given for device %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:423
-#, c-format
-msgid "No Changer Command given for device %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:435
-#, c-format
-msgid ""
-"Media Type not the same for all devices in changer %s. Cannot continue.\n"
-msgstr ""
-
-#: src/stored/stored.c:496
+#: src/stored/stored.c:457
 #, c-format
 msgid "Could not initialize %s\n"
 msgstr ""
 
-#: src/stored/stored.c:509
+#: src/stored/stored.c:470
 #, c-format
 msgid "Could not open device %s\n"
 msgstr ""
 
-#: src/stored/stored.c:521
+#: src/stored/stored.c:483
 #, c-format
 msgid "Could not mount device %s\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:188
+#: src/stored/stored_conf.c:216
+#, c-format
+msgid "Expected a Device Type keyword, got: %s"
+msgstr ""
+
+#: src/stored/stored_conf.c:231
 #, c-format
 msgid "Warning: no \"%s\" resource (%d) defined.\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:191
+#: src/stored/stored_conf.c:234
 #, c-format
 msgid "dump_resource type=%d\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:307
+#: src/stored/stored_conf.c:350
 #, c-format
 msgid "Warning: unknown resource type %d\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:496
+#: src/stored/stored_conf.c:539
 #, c-format
 msgid "\"%s\" item is required in \"%s\" resource, but not found.\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:502
+#: src/stored/stored_conf.c:545
 #, c-format
 msgid "Too many items in \"%s\" resource\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:536
+#: src/stored/stored_conf.c:579
 #, c-format
 msgid "Cannot find AutoChanger resource %s\n"
 msgstr ""
 
-#: src/stored/stored_conf.c:607
+#: src/stored/stored_conf.c:650
 #, c-format
 msgid ""
 "Attempt to define second \"%s\" resource named \"%s\" is not permitted.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:83
+#: src/stored/wait.c:114
 #, c-format
-msgid "Read error on device %s in ANSI label. ERR=%s\n"
+msgid "pthread timedwait error. ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:93
-msgid "Insane! End of tape while reading ANSI label.\n"
+#: src/stored/wait.c:199
+#, c-format
+msgid "Job %s waiting to reserve a device.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:117
-msgid "No VOL1 label while reading ANSI/IBM label.\n"
+#: src/tools/bsmtp.c:85
+#, c-format
+msgid "Fatal malformed reply from %s: %s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:137
+#: src/tools/bsmtp.c:121
 #, c-format
-msgid "Wanted ANSI Volume \"%s\" got \"%s\"\n"
+msgid ""
+"\n"
+"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n"
+"       -c          set the Cc: field\n"
+"       -dnn        set debug level to nn\n"
+"       -f          set the From: field\n"
+"       -h          use mailhost:port as the SMTP server\n"
+"       -s          set the Subject: field\n"
+"       -r          set the Reply-To: field\n"
+"       -l          set the maximum number of lines that should be sent "
+"(default: unlimited)\n"
+"       -?          print this message.\n"
+"\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:148
-msgid "No HDR1 label while reading ANSI label.\n"
+#: src/tools/bsmtp.c:213
+msgid "Fatal error: no recipient given.\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:154
+#: src/tools/bsmtp.c:234
 #, c-format
-msgid "ANSI/IBM Volume \"%s\" does not belong to Bacula.\n"
+msgid "Fatal gethostname error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:165
-msgid "No HDR2 label while reading ANSI/IBM label.\n"
+#: src/tools/bsmtp.c:238
+#, c-format
+msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:179
-msgid "Unknown or bad ANSI/IBM label record.\n"
+#: src/tools/bsmtp.c:263
+#, c-format
+msgid "Error unknown mail host \"%s\": ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:186
-msgid "Too many records in while reading ANSI/IBM label.\n"
+#: src/tools/bsmtp.c:266
+msgid "Retrying connection using \"localhost\".\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:285
+#: src/tools/bsmtp.c:274
 #, c-format
-msgid "ANSI Volume label name \"%s\" longer than 6 chars.\n"
+msgid "Fatal error: Unknown address family for smtp host: %d\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:302
+#: src/tools/bsmtp.c:282
 #, c-format
-msgid "Could not write ANSI VOL1 label. ERR=%s\n"
+msgid "Fatal socket error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:340 src/stored/ansi_label.c:369
+#: src/tools/bsmtp.c:286
 #, c-format
-msgid "Could not write ANSI HDR1 label. ERR=%s\n"
+msgid "Fatal connect error to %s: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:345 src/stored/ansi_label.c:376
-msgid "Could not write ANSI HDR1 label.\n"
+#: src/tools/bsmtp.c:291
+#, c-format
+msgid "Fatal dup error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:381
+#: src/tools/bsmtp.c:295 src/tools/bsmtp.c:299
 #, c-format
-msgid "Error writing EOF to tape. ERR=%s"
+msgid "Fatal fdopen error: ERR=%s\n"
 msgstr ""
 
-#: src/stored/ansi_label.c:386
-msgid "write_ansi_ibm_label called for non-ANSI/IBM type\n"
+#: src/tools/dbcheck.c:158
+msgid ""
+"Warning skipping the additional parameters for working directory/dbname/user/"
+"password/host.\n"
 msgstr ""
 
-#: src/stored/dvd.c:153
+#: src/tools/dbcheck.c:174
 #, c-format
-msgid "Device %s cannot be mounted. ERR=%s\n"
-msgstr ""
-
-#: src/stored/dvd.c:261
-#, c-format
-msgid "Cannot run free space command (%s)\n"
-msgstr ""
-
-#: src/stored/dvd.c:322
-#, c-format
-msgid "Error while writing current part to the DVD: %s"
-msgstr ""
-
-#: src/stored/dvd.c:343
-#, c-format
-msgid "Remaining free space %s on %s\n"
-msgstr ""
-
-#: src/stored/dvd.c:412
-#, c-format
-msgid "Next Volume part already exists on DVD. Cannot continue: %s\n"
-msgstr ""
-
-#: src/stored/dvd.c:430
-#, c-format
-msgid "open_next_part can't unlink existing part %s, ERR=%s\n"
-msgstr ""
-
-#: src/stored/dvd.c:634
-#, c-format
-msgid "Unable to write part %s: ERR=%s\n"
-msgstr ""
-
-#: src/stored/wait.c:178 src/stored/wait.c:236
-#, c-format
-msgid "Job %s waiting to reserve a device.\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:202
-msgid "Error in ParseTuple\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:218
-msgid "Parse tuple error in job_write\n"
-msgstr ""
-
-#: src/stored/pythonsd.c:254
-#, c-format
-msgid "Error in Python method %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:373 src/stored/reserve.c:390
-#, c-format
-msgid "Failed command: %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:375
-#, c-format
-msgid ""
-"\n"
-"     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD "
-"Device resources.\n"
-msgstr ""
-
-#: src/stored/reserve.c:564
-#, c-format
-msgid "3926 Could not get dcr for device: %s\n"
-msgstr ""
-
-#: src/stored/reserve.c:615 src/stored/reserve.c:670
-#, c-format
-msgid "Device %s is BLOCKED due to user unmount.\n"
-msgstr ""
-
-#: src/stored/reserve.c:623
-#, c-format
-msgid "Device %s is busy.\n"
-msgstr ""
-
-#: src/stored/reserve.c:678
-#, c-format
-msgid "Device %s is busy writing on another Volume.\n"
-msgstr ""
-
-#: src/stored/reserve.c:777
-#, c-format
-msgid "Wanted Pool \"%s\", but device %s is using Pool \"%s\" .\n"
-msgstr ""
-
-#: src/stored/reserve.c:784 src/stored/reserve.c:785
-msgid "Logic error!!!! Should not get here.\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:85
-#, c-format
-msgid "Fatal malformed reply from %s: %s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:121
-#, c-format
-msgid ""
-"\n"
-"Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n"
-"       -c          set the Cc: field\n"
-"       -dnn        set debug level to nn\n"
-"       -f          set the From: field\n"
-"       -h          use mailhost:port as the SMTP server\n"
-"       -s          set the Subject: field\n"
-"       -?          print this message.\n"
-"\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:204
-msgid "Fatal error: no recipient given.\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:225
-#, c-format
-msgid "Fatal gethostname error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:229
-#, c-format
-msgid "Fatal gethostbyname for myself failed \"%s\": ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:254
-#, c-format
-msgid "Error unknown mail host \"%s\": ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:257
-msgid "Retrying connection using \"localhost\".\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:265
-#, c-format
-msgid "Fatal error: Unknown address family for smtp host: %d\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:273
-#, c-format
-msgid "Fatal socket error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:277
-#, c-format
-msgid "Fatal connect error to %s: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:282
-#, c-format
-msgid "Fatal dup error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/bsmtp.c:286 src/tools/bsmtp.c:290
-#, c-format
-msgid "Fatal fdopen error: ERR=%s\n"
-msgstr ""
-
-#: src/tools/dbcheck.c:158
-msgid ""
-"Warning skipping the additional parameters for working directory/dbname/user/"
-"password/host.\n"
-msgstr ""
-
-#: src/tools/dbcheck.c:174
-#, c-format
-msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n"
+msgid "Error can not find the Catalog name[%s] in the given config file [%s]\n"
 msgstr ""
 
 #: src/tools/dbcheck.c:176
@@ -12888,6 +12999,25 @@ msgstr ""
 msgid "Found %d bad Path records.\n"
 msgstr ""
 
+#: src/tools/fstype.c:34
+#, c-format
+msgid ""
+"\n"
+"Usage: fstype [-d debug_level] path ...\n"
+"\n"
+"       Print the file system type a given file/directory is on.\n"
+"       The following options are supported:\n"
+"\n"
+"       -v     print both path and file system type.\n"
+"       -?     print this message.\n"
+"\n"
+msgstr ""
+
+#: src/tools/fstype.c:86
+#, c-format
+msgid "%s: unknown\n"
+msgstr ""
+
 #: src/tools/testfind.c:49
 #, c-format
 msgid ""
@@ -13033,23 +13163,9 @@ msgstr ""
 msgid "Skip: File system change prohibited. Directory not entered. %s\n"
 msgstr ""
 
-#: src/tools/fstype.c:34
-#, c-format
-msgid ""
-"\n"
-"Usage: fstype [-d debug_level] path ...\n"
-"\n"
-"       Print the file system type a given file/directory is on.\n"
-"       The following options are supported:\n"
-"\n"
-"       -v     print both path and file system type.\n"
-"       -?     print this message.\n"
-"\n"
-msgstr ""
-
-#: src/tools/fstype.c:86
+#: src/tools/bwild.c:105 src/tools/bregex.c:121
 #, c-format
-msgid "%s: unknown\n"
+msgid "Could not open data file: %s\n"
 msgstr ""
 
 #: src/tray-monitor/authenticate.c:78
@@ -13178,24 +13294,11 @@ msgstr ""
 
 #: src/tray-monitor/tray-monitor.c:503 src/tray-monitor/tray-monitor.c:513
 msgid ""
-"Copyright (C) 2004 Kern Sibbald and John Walker\n"
+"Copyright (C) 2004-2005 Kern Sibbald\n"
 "Written by Nicolas Boichat\n"
 msgstr ""
 
-#: src/tray-monitor/tray-monitor.c:505
-msgid "Version"
-msgstr ""
-
-#: src/tray-monitor/tray-monitor.c:509
-#, c-format
-msgid ""
-"%s\n"
-"\n"
-"%s\n"
-"%s %s (%s) %s %s %s"
-msgstr ""
-
-#: src/tray-monitor/tray-monitor.c:515
+#: src/tray-monitor/tray-monitor.c:505 src/tray-monitor/tray-monitor.c:515
 msgid "Version:"
 msgstr ""
 
@@ -13391,7 +13494,7 @@ msgstr ""
 msgid "<< Error: BNET_PROMPT signal received. >>\n"
 msgstr ""
 
-#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:445
+#: src/tray-monitor/tray-monitor.c:953 src/wx-console/console_thread.cpp:465
 msgid "<< Heartbeat signal received, answered. >>\n"
 msgstr ""
 
@@ -13436,710 +13539,899 @@ msgstr ""
 msgid "Storage: name=%s address=%s SDport=%d\n"
 msgstr ""
 
-#: src/wx-console/authenticate.c:126
+#: src/wx-console/authenticate.c:129
 msgid "Bad response to Hello command: ERR="
 msgstr ""
 
-#: src/baconfig.h:52
+#: src/baconfig.h:55
 #, c-format
 msgid "Failed ASSERT: %s\n"
 msgstr ""
 
-#: src/baconfig.h:59
+#: src/baconfig.h:62
 msgid "*None*"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:103
-#, c-format
-msgid ""
-"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
-"Director \"%s\" in config file.\n"
-" At least one CA certificate store is required.\n"
-msgstr ""
-
-#: src/wx-console/console_thread.cpp:112
-msgid ""
-"No Director resource defined in config file.\n"
-"Without that I don't how to speak to the Director :-(\n"
+#: src/filed/win32/winmain.cpp:228 src/filed/win32/winmain.cpp:236
+msgid "Bacula Usage"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:132
-#, c-format
-msgid ""
-"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
-"Console \"%s\" in config file.\n"
+#: src/filed/win32/winmain.cpp:233
+msgid "Bad Command Line Options"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:154
-msgid "Error while initializing windows sockets...\n"
+#: src/filed/win32/winmain.cpp:326
+msgid "Another instance of Bacula is already running"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:169
-msgid "Error while cleaning up windows sockets...\n"
+#: src/filed/win32/winservice.cpp:131 src/filed/win32/winservice.cpp:145
+msgid "No existing instance of Bacula could be contacted"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:207
-msgid "Error while initializing library."
+#: src/filed/win32/winservice.cpp:218
+msgid "KERNEL32.DLL not found: Bacula service not started"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:237
-msgid "Please correct configuration file.\n"
+#: src/filed/win32/winservice.cpp:228
+msgid "Registry service not found: Bacula service not started"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:270
-msgid "Error : Library not initialized\n"
+#: src/filed/win32/winservice.cpp:230
+msgid "Registry service not found"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:281
-msgid "Error : No configuration file loaded\n"
+#: src/filed/win32/winservice.cpp:260
+msgid "StartServiceCtrlDispatcher failed."
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:291
-msgid "Connecting...\n"
+#: src/filed/win32/winservice.cpp:278
+msgid "RegisterServiceCtlHandler failed"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:307
-msgid "Error : No director defined in config file.\n"
+#: src/filed/win32/winservice.cpp:279
+msgid "Contact Register Service Handler failure"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:319
-msgid "Multiple directors found in your config file.\n"
+#: src/filed/win32/winservice.cpp:295
+msgid "ReportStatus STOPPED failed 1"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:328
-#, c-format
-msgid "Please choose a director (1-%d): "
+#: src/filed/win32/winservice.cpp:318
+msgid "Report Service failure"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:400
-msgid "Failed to connect to the director\n"
+#: src/filed/win32/winservice.cpp:355
+msgid "Unable to install Bacula service"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:410
-msgid "Connected\n"
+#: src/filed/win32/winservice.cpp:373
+msgid "Service command length too long"
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:448
-msgid "<< Unexpected signal received : "
+#: src/filed/win32/winservice.cpp:374
+msgid "Service command length too long. Service not registered."
 msgstr ""
 
-#: src/wx-console/console_thread.cpp:466
-msgid "Connection terminated\n"
+#: src/filed/win32/winservice.cpp:389
+msgid "Cannot write System Registry"
 msgstr ""
 
-#: src/wx-console/main.cpp:101
-msgid "Bacula wx-console"
+#: src/filed/win32/winservice.cpp:390
+msgid ""
+"The System Registry could not be updated - the Bacula service was not "
+"installed"
 msgstr ""
 
-#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
-#, c-format
-msgid "Welcome to bacula wx-console %s (%s)!\n"
+#: src/filed/win32/winservice.cpp:397
+msgid "Cannot add Bacula key to System Registry"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:41
-msgid "Config file editor"
+#: src/filed/win32/winservice.cpp:398 src/filed/win32/winservice.cpp:449
+msgid "The Bacula service could not be installed"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:57
-msgid "Save and close"
+#: src/filed/win32/winservice.cpp:406
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started by double clicking on the\n"
+"Bacula \"Start\" icon and will be automatically\n"
+"be run the next time this machine is rebooted. "
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:58
-msgid "Close without saving"
+#: src/filed/win32/winservice.cpp:424
+msgid ""
+"The Service Control Manager could not be contacted - the Bacula service was "
+"not installed"
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:69
-msgid "# Bacula wx-console Configuration File\n"
+#: src/filed/win32/winservice.cpp:455
+msgid ""
+"Provides file backup and restore services. Bacula -- the network backup "
+"solution."
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:100
-#, c-format
-msgid "Unable to write to %s\n"
+#: src/filed/win32/winservice.cpp:462
+msgid ""
+"The Bacula File service was successfully installed.\n"
+"The service may be started from the Control Panel and will\n"
+"automatically be run the next time this machine is rebooted."
 msgstr ""
 
-#: src/wx-console/wxbconfigfileeditor.cpp:101
-msgid "Error while saving"
+#: src/filed/win32/winservice.cpp:471
+msgid ""
+"Unknown Windows operating system.\n"
+"Cannot install Bacula service.\n"
 msgstr ""
 
-#: src/wx-console/wxbconfigpanel.cpp:184
-msgid "Apply"
+#: src/filed/win32/winservice.cpp:496
+msgid ""
+"Could not find registry entry.\n"
+"Service probably not registerd - the Bacula service was not removed"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:61
-#: src/wx-console/wxbhistorytextctrl.cpp:132
-#: src/wx-console/wxbmainframe.cpp:272
-msgid "Type your command below:"
+#: src/filed/win32/winservice.cpp:501
+msgid ""
+"Could not delete Registry key.\n"
+"The Bacula service could not be removed"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:96
-msgid "Unknown command."
+#: src/filed/win32/winservice.cpp:511
+msgid "Bacula could not be contacted, probably not running"
 msgstr ""
 
-#: src/wx-console/wxbhistorytextctrl.cpp:105
-msgid "Possible completions: "
+#: src/filed/win32/winservice.cpp:517 src/filed/win32/winservice.cpp:553
+msgid "The Bacula service has been removed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:258
-#: src/wx-console/wxbrestorepanel.cpp:1861
-#: src/wx-console/wxbrestorepanel.cpp:1890
-msgid "Enter restore mode"
+#: src/filed/win32/winservice.cpp:547
+msgid "The Bacula service could not be stopped"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:261
-msgid "Cancel restore"
+#: src/filed/win32/winservice.cpp:555
+msgid "The Bacula service could not be removed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:287
-#: src/wx-console/wxbrestorepanel.cpp:341
-msgid "Add"
+#: src/filed/win32/winservice.cpp:560
+msgid "The Bacula service could not be found"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:289
-#: src/wx-console/wxbrestorepanel.cpp:343
-msgid "Remove"
+#: src/filed/win32/winservice.cpp:565
+msgid "The SCM could not be contacted - the Bacula service was not removed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:291
-#: src/wx-console/wxbrestorepanel.cpp:345
-msgid "Refresh"
+#: src/filed/win32/winservice.cpp:629
+msgid "SetServiceStatus failed"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:310
-msgid "M"
+#: src/filed/win32/winservice.cpp:657
+#, c-format
+msgid ""
+"\n"
+"\n"
+"%s error: %ld at %s:%d"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:326
-msgid "Perm."
+#: src/filed/win32/winservice.cpp:732
+#, c-format
+msgid "Locked by: %s, duration: %ld seconds\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:359
-#: src/wx-console/wxbrestorepanel.cpp:372
-#: src/wx-console/wxbrestorepanel.cpp:524
-#: src/wx-console/wxbrestorepanel.cpp:534
-#: src/wx-console/wxbrestorepanel.cpp:537
-#: src/wx-console/wxbrestorepanel.cpp:1732
-#: src/wx-console/wxbrestorepanel.cpp:1812
-msgid "Job Name"
+#: src/filed/win32/winservice.cpp:736
+#, c-format
+msgid "No longer locked\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:361
-#: src/wx-console/wxbrestorepanel.cpp:377
-#: src/wx-console/wxbrestorepanel.cpp:476
-#: src/wx-console/wxbrestorepanel.cpp:477
-#: src/wx-console/wxbrestorepanel.cpp:487
-#: src/wx-console/wxbrestorepanel.cpp:488
-#: src/wx-console/wxbrestorepanel.cpp:1101
-#: src/wx-console/wxbrestorepanel.cpp:1768
-#: src/wx-console/wxbrestorepanel.cpp:1827
-msgid "Fileset"
+#: src/filed/win32/winservice.cpp:740
+msgid "Could not lock database"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:364
-#: src/wx-console/wxbrestorepanel.cpp:1168
-#: src/wx-console/wxbrestorepanel.cpp:1183
-#: src/wx-console/wxbrestorepanel.cpp:1185
-#: src/wx-console/wxbrestorepanel.cpp:1193
-#: src/wx-console/wxbrestorepanel.cpp:1195
-#: src/wx-console/wxbrestorepanel.cpp:1212
-#: src/wx-console/wxbrestorepanel.cpp:1219
-#: src/wx-console/wxbrestorepanel.cpp:1759
-#: src/wx-console/wxbrestorepanel.cpp:1885
-msgid "Before"
+#: src/wx-console/console_thread.cpp:101
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Director \"%s\" in config file.\n"
+"At least one CA certificate store is required.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:366
-msgid "Please configure parameters concerning files to restore :"
+#: src/wx-console/console_thread.cpp:108
+msgid ""
+"No Director resource defined in config file.\n"
+"Without that I don't how to speak to the Director :-(\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-#: src/wx-console/wxbrestorepanel.cpp:1820
-msgid "always"
+#: src/wx-console/console_thread.cpp:127
+#, c-format
+msgid ""
+"Neither \"TLS CA Certificate\" or \"TLS CA Certificate Dir\" are defined for "
+"Console \"%s\" in config file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-msgid "if newer"
+#: src/wx-console/console_thread.cpp:148
+msgid "Error while initializing windows sockets...\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-msgid "if older"
+#: src/wx-console/console_thread.cpp:163
+msgid "Error while cleaning up windows sockets...\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:375
-#: src/wx-console/wxbrestorepanel.cpp:1823
-msgid "never"
+#: src/wx-console/console_thread.cpp:201
+msgid "Error while initializing library."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:383
-msgid "Please configure parameters concerning files restoration :"
+#: src/wx-console/console_thread.cpp:227
+msgid "Cryptographic library initialization failed.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:448
-msgid "Getting parameters list."
+#: src/wx-console/console_thread.cpp:231
+msgid "Please correct configuration file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:456
-msgid "Error : no clients returned by the director."
+#: src/wx-console/console_thread.cpp:273
+msgid "Error : Library not initialized\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:480
-msgid "Error : no filesets returned by the director."
+#: src/wx-console/console_thread.cpp:284
+msgid "Error : No configuration file loaded\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:504
-msgid "Error : no storage returned by the director."
+#: src/wx-console/console_thread.cpp:294
+msgid "Connecting...\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:527
-#: src/wx-console/wxbrestorepanel.cpp:551
-msgid "Error : no jobs returned by the director."
+#: src/wx-console/console_thread.cpp:310
+msgid "Error : No director defined in config file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:537
-msgid "RestoreFiles"
+#: src/wx-console/console_thread.cpp:322
+msgid "Multiple directors found in your config file.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:572
-msgid "Please configure your restore parameters."
+#: src/wx-console/console_thread.cpp:331
+#, c-format
+msgid "Please choose a director (1-%d): "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:583
-msgid "Building restore tree..."
+#: src/wx-console/console_thread.cpp:403
+msgid "Failed to connect to the director\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:622
-msgid "Error while starting restore: "
+#: src/wx-console/console_thread.cpp:413
+msgid "Connected\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:712
-msgid ""
-"Right click on a file or on a directory, or double-click on its mark to add "
-"it to the restore list."
+#: src/wx-console/console_thread.cpp:470
+msgid "<< Unexpected signal received : "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:729
-msgid " files selected to be restored."
+#: src/wx-console/console_thread.cpp:490
+msgid "Connection terminated\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:734
-msgid " file selected to be restored."
+#: src/wx-console/main.cpp:101
+msgid "Bacula wx-console"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:741
+#: src/wx-console/main.cpp:106 src/wx-console/wxbmainframe.cpp:248
 #, c-format
-msgid "Please configure your restore (%ld files selected to be restored)..."
+msgid "Welcome to bacula wx-console %s (%s)!\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:751
-msgid "Restore failed : no file selected.\n"
+#: src/wx-console/wxbconfigfileeditor.cpp:44
+msgid "Config file editor"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:752
-msgid "Restore failed : no file selected."
+#: src/wx-console/wxbconfigfileeditor.cpp:54
+msgid "# Bacula wx-console Configuration File\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:762
-msgid "Restoring, please wait..."
+#: src/wx-console/wxbconfigfileeditor.cpp:90
+msgid "Save and close"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:775
-msgid "Job started. JobId="
+#: src/wx-console/wxbconfigfileeditor.cpp:91
+msgid "Close without saving"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:777
-msgid "Restore started, jobid="
+#: src/wx-console/wxbconfigfileeditor.cpp:118
+#, c-format
+msgid "Unable to write to %s\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:781
-msgid "Job failed."
+#: src/wx-console/wxbconfigfileeditor.cpp:119
+msgid "Error while saving"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:782
-msgid "Restore failed, please look at messages.\n"
+#: src/wx-console/wxbconfigpanel.cpp:184
+msgid "Apply"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:783
-msgid "Restore failed, please look at messages in console."
+#: src/wx-console/wxbhistorytextctrl.cpp:61
+#: src/wx-console/wxbhistorytextctrl.cpp:132
+#: src/wx-console/wxbmainframe.cpp:272
+msgid "Type your command below:"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:789
-#: src/wx-console/wxbrestorepanel.cpp:790
-msgid "Failed to retrieve jobid.\n"
+#: src/wx-console/wxbhistorytextctrl.cpp:96
+msgid "Unknown command."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:816
-msgid ""
-"Restore is scheduled in more than two minutes, wx-console will not wait for "
-"its completion.\n"
+#: src/wx-console/wxbhistorytextctrl.cpp:105
+msgid "Possible completions: "
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:817
-msgid ""
-"Restore is scheduled in more than two minutes, wx-console will not wait for "
-"its completion."
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "&About...\tF1"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:841
-msgid "Restore job created, but not yet running."
+#: src/wx-console/wxbmainframe.cpp:227
+msgid "Show about dialog"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:846
-#, c-format
-msgid "Restore job running, please wait (%ld of %ld files restored)..."
+#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:598
+msgid "Connect to the director"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:850
-msgid "Restore job terminated successfully."
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:851
-msgid "Restore job terminated successfully.\n"
+#: src/wx-console/wxbmainframe.cpp:230
+msgid "Disconnect of the director"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:856
-msgid "Restore job terminated in error, see messages in console."
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change of configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:857
-msgid "Restore job terminated in error, see messages.\n"
+#: src/wx-console/wxbmainframe.cpp:232
+msgid "Change your default configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:862
-msgid "Restore job reported a non-fatal error."
+#: src/wx-console/wxbmainframe.cpp:233
+msgid "Edit your configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:866
-msgid "Restore job reported a fatal error."
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "E&xit\tAlt-X"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:871
-msgid "Restore job cancelled by user."
+#: src/wx-console/wxbmainframe.cpp:235
+msgid "Quit this program"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:872
-msgid "Restore job cancelled by user.\n"
+#: src/wx-console/wxbmainframe.cpp:239
+msgid "&File"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:877
-msgid "Restore job is waiting on File daemon."
+#: src/wx-console/wxbmainframe.cpp:240
+msgid "&Help"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:881
-msgid "Restore job is waiting for new media."
+#: src/wx-console/wxbmainframe.cpp:257
+msgid "Console"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:885
-msgid "Restore job is waiting for storage resource."
+#: src/wx-console/wxbmainframe.cpp:264
+msgid ""
+"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:889
-msgid "Restore job is waiting for job resource."
+#: src/wx-console/wxbmainframe.cpp:268
+msgid ""
+"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
+"support when handling non-ASCII filenames: Every non-ASCII character in such "
+"filenames will be replaced by an interrogation mark.\n"
+"If this behaviour disturbs you, please build wx-console against a Unicode "
+"version of wxWidgets for GTK+ 2.0.\n"
+"---\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:893
-msgid "Restore job is waiting for Client resource."
+#: src/wx-console/wxbmainframe.cpp:279
+msgid "Send"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:897
-msgid "Restore job is waiting for maximum jobs."
+#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
+msgid "Error while parsing command line arguments, using defaults.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:901
-msgid "Restore job is waiting for start time."
+#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
+msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:905
-msgid "Restore job is waiting for higher priority jobs to finish."
+#: src/wx-console/wxbmainframe.cpp:397
+#, c-format
+msgid ""
+"It seems that it is the first time you run wx-console.\n"
+"This file (%s) has been choosen as default configuration file.\n"
+"Do you want to edit it? (if you click No you will have to select another "
+"file)"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:954
+#: src/wx-console/wxbmainframe.cpp:399
+msgid "First run"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:416
+#, c-format
 msgid ""
-"The restore job has not been started within one minute, wx-console will not "
-"wait for its completion anymore.\n"
+"Unable to read %s\n"
+"Error: %s\n"
+"Do you want to choose another one? (Press no to edit this file)"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:955
+#: src/wx-console/wxbmainframe.cpp:418
+msgid "Unable to read configuration file"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:430
+msgid "Please choose a configuration file to use"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:443
+msgid "This configuration file has been successfully read, use it as default?"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:444
+msgid "Configuration file read successfully"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:454
+#, c-format
+msgid "Using this configuration file: %s\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:459
+msgid "Connecting to the director..."
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:474
+msgid "Failed to unregister a data parser !"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:482
+msgid "Quitting.\n"
+msgstr ""
+
+#: src/wx-console/wxbmainframe.cpp:497
 msgid ""
-"The restore job has not been started within one minute, wx-console will not "
-"wait for its completion anymore."
+"Welcome to Bacula wx-console.\n"
+"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
+"(C) 2005 Kern Sibbald\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:965
-msgid "Restore done successfully.\n"
+#: src/wx-console/wxbmainframe.cpp:499
+msgid "About Bacula wx-console"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:966
-msgid "Restore done successfully."
+#: src/wx-console/wxbmainframe.cpp:505
+msgid "Please choose your default configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1037
-msgid "Applying restore configuration changes..."
+#: src/wx-console/wxbmainframe.cpp:509
+msgid "Use this configuration file as default?"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1088
-msgid "Failed to find the selected client."
+#: src/wx-console/wxbmainframe.cpp:510
+msgid "Configuration file"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1103
-msgid "Failed to find the selected fileset."
+#: src/wx-console/wxbmainframe.cpp:581
+msgid "Console thread terminated."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1118
-msgid "Failed to find the selected storage."
+#: src/wx-console/wxbmainframe.cpp:589
+msgid "Connection to the director lost. Quit program?"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1135
-#: src/wx-console/wxbrestorepanel.cpp:1801
-msgid "Run Restore job"
+#: src/wx-console/wxbmainframe.cpp:590
+msgid "Connection lost"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1151
-msgid "Restore configuration changes were applied."
+#: src/wx-console/wxbmainframe.cpp:606
+msgid "Connected to the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1160
-msgid "Restore cancelled.\n"
+#: src/wx-console/wxbmainframe.cpp:629
+msgid "Reconnect"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1161
-msgid "Restore cancelled."
+#: src/wx-console/wxbmainframe.cpp:630
+msgid "Reconnect to the director"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1182
-msgid "No results to list."
+#: src/wx-console/wxbmainframe.cpp:644
+msgid "Disconnected of the director."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1184
-msgid "No backup found for this client."
+#: src/wx-console/wxbmainframe.cpp:663 src/wx-console/wxbrestorepanel.cpp:689
+msgid "Unexpected question has been received.\n"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1191
-msgid "ERROR"
+#: src/wx-console/wxbmainframe.cpp:686 src/wx-console/wxbmainframe.cpp:703
+msgid "wx-console: unexpected director's question."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1192
-msgid "Query failed"
+#: src/wx-console/wxbrestorepanel.cpp:216
+#: src/wx-console/wxbrestorepanel.cpp:1895
+#: src/wx-console/wxbrestorepanel.cpp:1924
+msgid "Enter restore mode"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1194
-msgid "Cannot get previous backups list, see console."
+#: src/wx-console/wxbrestorepanel.cpp:219
+msgid "Cancel restore"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1811
-msgid "JobName:"
+#: src/wx-console/wxbrestorepanel.cpp:245
+#: src/wx-console/wxbrestorepanel.cpp:299
+msgid "Add"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1815
-msgid "Where:"
+#: src/wx-console/wxbrestorepanel.cpp:247
+#: src/wx-console/wxbrestorepanel.cpp:301
+msgid "Remove"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1818
-msgid "Replace:"
+#: src/wx-console/wxbrestorepanel.cpp:249
+#: src/wx-console/wxbrestorepanel.cpp:303
+msgid "Refresh"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1821
-msgid "ifnewer"
+#: src/wx-console/wxbrestorepanel.cpp:268
+msgid "M"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1822
-msgid "ifolder"
+#: src/wx-console/wxbrestorepanel.cpp:272
+msgid "Filename"
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1826
-msgid "FileSet:"
+#: src/wx-console/wxbrestorepanel.cpp:284
+msgid "Perm."
 msgstr ""
 
-#: src/wx-console/wxbrestorepanel.cpp:1942
-msgid "Restoring..."
+#: src/wx-console/wxbrestorepanel.cpp:317
+#: src/wx-console/wxbrestorepanel.cpp:330
+#: src/wx-console/wxbrestorepanel.cpp:482
+#: src/wx-console/wxbrestorepanel.cpp:492
+#: src/wx-console/wxbrestorepanel.cpp:495
+#: src/wx-console/wxbrestorepanel.cpp:1760
+#: src/wx-console/wxbrestorepanel.cpp:1846
+msgid "Job Name"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:227
-msgid "&About...\tF1"
+#: src/wx-console/wxbrestorepanel.cpp:319
+#: src/wx-console/wxbrestorepanel.cpp:335
+#: src/wx-console/wxbrestorepanel.cpp:434
+#: src/wx-console/wxbrestorepanel.cpp:435
+#: src/wx-console/wxbrestorepanel.cpp:445
+#: src/wx-console/wxbrestorepanel.cpp:446
+#: src/wx-console/wxbrestorepanel.cpp:1118
+#: src/wx-console/wxbrestorepanel.cpp:1191
+#: src/wx-console/wxbrestorepanel.cpp:1798
+#: src/wx-console/wxbrestorepanel.cpp:1800
+#: src/wx-console/wxbrestorepanel.cpp:1861
+msgid "Fileset"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:227
-msgid "Show about dialog"
+#: src/wx-console/wxbrestorepanel.cpp:322
+#: src/wx-console/wxbrestorepanel.cpp:1185
+#: src/wx-console/wxbrestorepanel.cpp:1201
+#: src/wx-console/wxbrestorepanel.cpp:1203
+#: src/wx-console/wxbrestorepanel.cpp:1211
+#: src/wx-console/wxbrestorepanel.cpp:1213
+#: src/wx-console/wxbrestorepanel.cpp:1232
+#: src/wx-console/wxbrestorepanel.cpp:1239
+#: src/wx-console/wxbrestorepanel.cpp:1788
+#: src/wx-console/wxbrestorepanel.cpp:1799
+#: src/wx-console/wxbrestorepanel.cpp:1919
+msgid "Before"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:229 src/wx-console/wxbmainframe.cpp:591
-msgid "Connect to the director"
+#: src/wx-console/wxbrestorepanel.cpp:324
+msgid "Please configure parameters concerning files to restore :"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:230
-msgid "Disconnect"
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1854
+msgid "always"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:230
-msgid "Disconnect of the director"
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if newer"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:232
-msgid "Change of configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:333
+msgid "if older"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:232
-msgid "Change your default configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:333
+#: src/wx-console/wxbrestorepanel.cpp:1857
+msgid "never"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:233
-msgid "Edit your configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:341
+msgid "Please configure parameters concerning files restoration :"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:235
-msgid "E&xit\tAlt-X"
+#: src/wx-console/wxbrestorepanel.cpp:406
+msgid "Getting parameters list."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:235
-msgid "Quit this program"
+#: src/wx-console/wxbrestorepanel.cpp:414
+msgid "Error : no clients returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:239
-msgid "&File"
+#: src/wx-console/wxbrestorepanel.cpp:438
+msgid "Error : no filesets returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:240
-msgid "&Help"
+#: src/wx-console/wxbrestorepanel.cpp:462
+msgid "Error : no storage returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:257
-msgid "Console"
+#: src/wx-console/wxbrestorepanel.cpp:485
+#: src/wx-console/wxbrestorepanel.cpp:509
+msgid "Error : no jobs returned by the director."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:264
-msgid ""
-"Warning : Unicode is disabled because you are using wxWidgets for GTK+ 1.2.\n"
+#: src/wx-console/wxbrestorepanel.cpp:495
+msgid "RestoreFiles"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:268
+#: src/wx-console/wxbrestorepanel.cpp:530
+msgid "Please configure your restore parameters."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:541
+msgid "Building restore tree..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:584
+msgid "Error while starting restore: "
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:674
 msgid ""
-"Warning : There is a problem with wxWidgets for GTK+ 2.0 without Unicode "
-"support when handling non-ASCII filenames: Every non-ASCII character in such "
-"filenames will be replaced by an interrogation mark.\n"
-"If this behaviour disturbs you, please build wx-console against a Unicode "
-"version of wxWidgets for GTK+ 2.0.\n"
-"---\n"
+"Right click on a file or on a directory, or double-click on its mark to add "
+"it to the restore list."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:279
-msgid "Send"
+#: src/wx-console/wxbrestorepanel.cpp:711
+#: src/wx-console/wxbrestorepanel.cpp:733
+msgid "wx-console: unexpected restore question."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:356 src/wx-console/wxbmainframe.cpp:368
-msgid "Error while parsing command line arguments, using defaults.\n"
+#: src/wx-console/wxbrestorepanel.cpp:744
+msgid " files selected to be restored."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:357 src/wx-console/wxbmainframe.cpp:369
-msgid "Usage: wx-console [-c configfile] [-w tmp]\n"
+#: src/wx-console/wxbrestorepanel.cpp:749
+msgid " file selected to be restored."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:397
+#: src/wx-console/wxbrestorepanel.cpp:756
 #, c-format
+msgid "Please configure your restore (%ld files selected to be restored)..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:766
+msgid "Restore failed : no file selected.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:767
+msgid "Restore failed : no file selected."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:777
+msgid "Restoring, please wait..."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:790
+msgid "Job started. JobId="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:792
+msgid "Restore started, jobid="
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:796
+msgid "Job failed."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:797
+msgid "Restore failed, please look at messages.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:798
+msgid "Restore failed, please look at messages in console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:804
+#: src/wx-console/wxbrestorepanel.cpp:805
+msgid "Failed to retrieve jobid.\n"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:831
 msgid ""
-"It seems that it is the first time you run wx-console.\n"
-"This file (%s) has been choosen as default configuration file.\n"
-"Do you want to edit it? (if you click No you will have to select another "
-"file)"
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:401
-msgid "First run"
+#: src/wx-console/wxbrestorepanel.cpp:832
+msgid ""
+"Restore is scheduled in more than two minutes, wx-console will not wait for "
+"its completion."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:418
+#: src/wx-console/wxbrestorepanel.cpp:858
+msgid "Restore job created, but not yet running."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:863
 #, c-format
-msgid ""
-"Unable to read %s\n"
-"Error: %s\n"
-"Do you want to choose another one? (Press no to edit this file)"
+msgid "Restore job running, please wait (%ld of %ld files restored)..."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:422
-msgid "Unable to read configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:867
+msgid "Restore job terminated successfully."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:434
-msgid "Please choose a configuration file to use"
+#: src/wx-console/wxbrestorepanel.cpp:868
+msgid "Restore job terminated successfully.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:447
-msgid "This configuration file has been successfully read, use it as default?"
+#: src/wx-console/wxbrestorepanel.cpp:873
+msgid "Restore job terminated in error, see messages in console."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:448
-msgid "Configuration file read successfully"
+#: src/wx-console/wxbrestorepanel.cpp:874
+msgid "Restore job terminated in error, see messages.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:458
-#, c-format
-msgid "Using this configuration file: %s\n"
+#: src/wx-console/wxbrestorepanel.cpp:879
+msgid "Restore job reported a non-fatal error."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:463
-msgid "Connecting to the director..."
+#: src/wx-console/wxbrestorepanel.cpp:883
+msgid "Restore job reported a fatal error."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:478
-msgid "Failed to unregister a data parser !"
+#: src/wx-console/wxbrestorepanel.cpp:888
+msgid "Restore job cancelled by user."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:486
-msgid "Quitting.\n"
+#: src/wx-console/wxbrestorepanel.cpp:889
+msgid "Restore job cancelled by user.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:501
+#: src/wx-console/wxbrestorepanel.cpp:894
+msgid "Restore job is waiting on File daemon."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:898
+msgid "Restore job is waiting for new media."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:902
+msgid "Restore job is waiting for storage resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:906
+msgid "Restore job is waiting for job resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:910
+msgid "Restore job is waiting for Client resource."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:914
+msgid "Restore job is waiting for maximum jobs."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:918
+msgid "Restore job is waiting for start time."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:922
+msgid "Restore job is waiting for higher priority jobs to finish."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:971
 msgid ""
-"Welcome to Bacula wx-console.\n"
-"Written by Nicolas Boichat <nicolas@boichat.ch>\n"
-"(C) 2005 Kern Sibbald\n"
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:503
-msgid "About Bacula wx-console"
+#: src/wx-console/wxbrestorepanel.cpp:972
+msgid ""
+"The restore job has not been started within one minute, wx-console will not "
+"wait for its completion anymore."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:509
-msgid "Please choose your default configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:982
+msgid "Restore done successfully.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:513
-msgid "Use this configuration file as default?"
+#: src/wx-console/wxbrestorepanel.cpp:983
+msgid "Restore done successfully."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:514
-msgid "Configuration file"
+#: src/wx-console/wxbrestorepanel.cpp:1054
+msgid "Applying restore configuration changes..."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:578
-msgid "Console thread terminated."
+#: src/wx-console/wxbrestorepanel.cpp:1105
+msgid "Failed to find the selected client."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:582
-msgid "Connection to the director lost. Quit program?"
+#: src/wx-console/wxbrestorepanel.cpp:1120
+msgid "Failed to find the selected fileset."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:583
-msgid "Connection lost"
+#: src/wx-console/wxbrestorepanel.cpp:1135
+msgid "Failed to find the selected storage."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:599
-msgid "Connected to the director."
+#: src/wx-console/wxbrestorepanel.cpp:1152
+#: src/wx-console/wxbrestorepanel.cpp:1835
+msgid "Run Restore job"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:613
-msgid "Reconnect"
+#: src/wx-console/wxbrestorepanel.cpp:1168
+msgid "Restore configuration changes were applied."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:614
-msgid "Reconnect to the director"
+#: src/wx-console/wxbrestorepanel.cpp:1177
+msgid "Restore cancelled.\n"
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:624
-msgid "Disconnected of the director."
+#: src/wx-console/wxbrestorepanel.cpp:1178
+msgid "Restore cancelled."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:643
-msgid "Unexpected question has been received.\n"
+#: src/wx-console/wxbrestorepanel.cpp:1200
+msgid "No results to list."
 msgstr ""
 
-#: src/wx-console/wxbmainframe.cpp:666 src/wx-console/wxbmainframe.cpp:681
-msgid "wx-console: unexpected director's question."
+#: src/wx-console/wxbrestorepanel.cpp:1202
+msgid "No backup found for this client."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1209
+msgid "ERROR"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1210
+msgid "Query failed"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1212
+msgid "Cannot get previous backups list, see console."
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1845
+msgid "JobName:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1849
+msgid "Where:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1852
+msgid "Replace:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1855
+msgid "ifnewer"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1856
+msgid "ifolder"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1860
+msgid "FileSet:"
+msgstr ""
+
+#: src/wx-console/wxbrestorepanel.cpp:1976
+msgid "Restoring..."
 msgstr ""
index e39d44a262e03fac28da57315b1dc542f262014d..fc317cd451a0b8990e78c649f06152214c76b55d 100644 (file)
@@ -24,3 +24,6 @@ bacula.desktop.gnome2.xsu
 bacula.desktop.gnome2.consolehelper
 bacula.desktop.gnome1.xsu
 bacula.desktop.gnome1.consolehelper
+bacula-ctl-sd
+bacula-ctl-fd
+bacula-ctl-dir
index 1bf17739fca92e2b556a2a44a067e9db2ab0641a..19aa7e3f9675c6b3ac27387130102425f1117884 100755 (executable)
@@ -38,6 +38,9 @@ install: installdirs
        $(INSTALL_SCRIPT) bconsole $(DESTDIR)$(scriptdir)/bconsole
        $(INSTALL_SCRIPT) gconsole $(DESTDIR)$(scriptdir)/gconsole
        $(INSTALL_SCRIPT) bacula $(DESTDIR)$(scriptdir)/bacula
+       $(INSTALL_SCRIPT) bacula-ctl-dir $(DESTDIR)$(scriptdir)/bacula-ctl-dir
+       $(INSTALL_SCRIPT) bacula-ctl-fd $(DESTDIR)$(scriptdir)/bacula-ctl-fd
+       $(INSTALL_SCRIPT) bacula-ctl-sd $(DESTDIR)$(scriptdir)/bacula-ctl-sd
        @if  test -f ${DESTDIR}${scriptdir}/mtx-changer; then \
           echo "  ==> Saving existing mtx-changer to mtx-changer.old"; \
           $(MV) -f ${DESTDIR}${scriptdir}/mtx-changer ${DESTDIR}${scriptdir}/mtx-changer.old; \
@@ -69,6 +72,9 @@ uninstall:
        (cd $(DESTDIR)$(scriptdir); $(RMF) bconsole)
        (cd $(DESTDIR)$(scriptdir); $(RMF) gconsole)
        (cd $(DESTDIR)$(scriptdir); $(RMF) bacula)
+       (cd $(DESTDIR)$(scriptdir); $(RMF) bacula-ctl-dir)
+       (cd $(DESTDIR)$(scriptdir); $(RMF) bacula-ctl-fd)
+       (cd $(DESTDIR)$(scriptdir); $(RMF) bacula-ctl-sd)
        (cd $(DESTDIR)$(scriptdir); $(RMF) fd)
        (cd $(DESTDIR)$(scriptdir); $(RMF) mtx-changer)
        (cd $(DESTDIR)$(scriptdir); $(RMF) disk-changer)
@@ -82,11 +88,13 @@ Makefile: Makefile.in
        cd $(topdir) \
            && CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
        chmod 755 startmysql stopmysql bacula startit stopit btraceback
+       chmod 755 bacula-ctl-dir bacula-ctl-fd bacula-ctl-sd
        chmod 755 disk-changer mtx-changer dvd-handler bconsole gconsole
 
 Makefiles:
        $(SHELL) config.status
        chmod 755 startmysql stopmysql bacula startit stopit btraceback
+       chmod 755 bacula-ctl-dir bacula-ctl-fd bacula-ctl-sd
        chmod 755 mtx-changer dvd-handler bconsole gconsole
 
 clean:
@@ -95,6 +103,7 @@ clean:
 # clean for distribution
 distclean: clean
        @$(RMF) startmysql stopmysql bacula fd startit stopit btraceback
+       @$(RMF) bacula-ctl-dir bacula-ctl-fd bacula-ctl-sd
        @$(RMF) bconsole gconsole logrotate bacula.desktop 
        @$(RMF) bacula.desktop.gnome1 bacula.desktop.gnome2 mtx-changer dvd-handler
        @$(RMF) gnome-console.console_apps bacula.desktop.gnome2.xsu
diff --git a/bacula/scripts/bacula-ctl-dir.in b/bacula/scripts/bacula-ctl-dir.in
new file mode 100644 (file)
index 0000000..37d22af
--- /dev/null
@@ -0,0 +1,237 @@
+#! /bin/sh
+#
+# bacula-ctl-dir This shell script takes care of starting and stopping
+#               the bacula Director daemon
+#
+#   This is pretty much watered down version of the RedHat script
+#   that works on Solaris as well as Linux, but it won't work everywhere.
+#
+# description: It comes by night and sucks the vital essence from your computers.
+#
+
+PSCMD="@PSCMD@"
+PS="ps"
+
+#
+# On Solaris, you may need to use nawk, or alternatively,
+#  add the GNU binaries to your path, such as /usr/xpg4/bin
+#
+AWK=@AWK@
+
+# All these are not *really* needed but it makes it
+#  easier to "steal" this code for the development 
+#  environment where they are different.
+#  
+BACDIRBIN=@sbindir@
+BACDIRCFG=@sysconfdir@
+PIDDIR=@piddir@
+SUBSYSDIR=@subsysdir@
+
+DIR_PORT=@dir_port@
+
+DIR_USER=@dir_user@
+DIR_GROUP=@dir_group@
+
+PIDOF=@PIDOF@  
+
+# A function to stop a program.
+killproc() {
+   RC=0
+   # Test syntax.
+   if [ $# = 0 ]; then
+      echo "Usage: killproc {program} {port} [signal]"
+      return 1
+   fi
+
+   notset=0
+   # check for third arg to be kill level
+   if [ "$3" != "" ] ; then
+      killlevel=$3
+   else
+      notset=1
+      killlevel="-9"
+   fi
+
+   # Get base program name
+   base=`basename $1`
+
+   # Find pid.
+   pid=`pidofproc $base $2`
+
+   # Kill it.
+   if [ "$pid" != "" ] ; then
+      if [ "$notset" = "1" ] ; then
+        if ${PS} -p "$pid">/dev/null 2>&1; then
+            # TERM first, then KILL if not dead
+            kill -TERM $pid 2>/dev/null
+            sleep 1
+            if ${PS} -p "$pid" >/dev/null 2>&1 ; then
+                sleep 1
+                if ${PS} -p "$pid" >/dev/null 2>&1 ; then
+                    sleep 3
+                    if ${PS} -p "$pid" >/dev/null 2>&1 ; then
+                        kill -KILL $pid 2>/dev/null
+                    fi
+                fi
+            fi
+         fi
+         ${PS} -p "$pid" >/dev/null 2>&1
+         RC=$?
+         [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown"
+      #    RC=$((! $RC))
+      # use specified level only
+      else
+        if ${PS} -p "$pid" >/dev/null 2>&1; then
+           kill $killlevel $pid 2>/dev/null
+           RC=$?
+           [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel"
+        fi
+      fi
+   else
+      failure "$base shutdown"
+   fi
+   # Remove pid file if any.
+   if [ "$notset" = "1" ]; then
+      rm -f ${PIDDIR}/$base.$2.pid
+   fi
+   return $RC
+}
+
+# A function to find the pid of a program.
+pidofproc() {
+   pid=""
+   # Test syntax.
+   if [ $# = 0 ] ; then
+      echo "Usage: pidofproc {program}"
+      return 1
+   fi
+
+   # Get base program name
+   base=`basename $1`
+
+   # First try PID file
+   if [ -f ${PIDDIR}/$base.$2.pid ] ; then
+      pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
+      if [ "$pid" != "" ] ; then
+        echo $pid
+        return 0
+      fi
+   fi
+
+   # Next try "pidof"
+   if [ -x ${PIDOF} ] ; then
+      pid=`${PIDOF} $1`
+   fi
+   if [ "$pid" != "" ] ; then
+      echo $pid
+      return 0
+   fi
+
+   # Finally try to extract it from ps
+   ${PSCMD} | grep $1 | ${AWK} '{ print $1 }' | tr '\n' ' '
+   return 0
+}
+
+status() {
+   pid=""
+   # Test syntax.
+   if [ $# = 0 ] ; then
+       echo "Usage: status {program} {port}"
+       return 1
+   fi
+
+   # Get base program name
+   base=`basename $1`
+
+   # First try "pidof"
+   if [ -x ${PIDOF} ] ; then
+      pid=`${PIDOF} $1`
+   fi
+   if [ "$pid" != "" ] ; then
+      echo "$base (pid $pid) is running..."
+      return 0
+   else
+      pid=`${PSCMD} | ${AWK} 'BEGIN { prog=ARGV[1]; ARGC=1 } 
+           { if ((prog == $2) || (("(" prog ")") == $2) ||
+                (("[" prog "]") == $2) ||
+                ((prog ":") == $2)) { print $1 ; exit 0 } }' $1`
+      if [ "$pid" != "" ] ; then
+        echo "$base (pid $pid) is running..."
+        return 0
+      fi
+   fi
+
+   # Next try the PID files
+   if [ -f ${PIDDIR}/$base.$2.pid ] ; then
+      pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
+      if [ "$pid" != "" ] ; then
+        echo "$base dead but pid file exists"
+        return 1
+      fi
+   fi
+   # See if the subsys lock exists
+   if [ -f ${SUBSYSDIR}/$base ] ; then
+      echo "$base dead but subsys locked"
+      return 2
+   fi
+   echo "$base is stopped"
+   return 3
+}
+
+success() {
+   return 0
+}
+
+failure() {
+   rc=$?
+   return $rc
+}
+
+OS=`uname -s`
+
+# if /lib/tls exists, force Bacula to use the glibc pthreads instead
+if [ -d "/lib/tls" -a $OS = "Linux" -a `uname -r | cut -c1-3` = "2.4" ] ; then
+   export LD_ASSUME_KERNEL=2.4.19
+fi
+
+case "$1" in
+   start)
+      [ -x ${BACDIRBIN}/bacula-dir ] && { 
+         sleep 2
+         echo "Starting the Bacula Director daemon"
+        OPTIONS=''
+        if [ "${DIR_USER}" != '' ]; then
+           OPTIONS="${OPTIONS} -u ${DIR_USER}"
+        fi
+
+        if [ "${DIR_GROUP}" != '' ]; then
+           OPTIONS="${OPTIONS} -g ${DIR_GROUP}"
+        fi
+
+        ${BACDIRBIN}/bacula-dir $2 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf
+      }
+      ;;
+
+   stop)
+      [ -x ${BACDIRBIN}/bacula-dir ] && {
+        echo "Stopping the Bacula Director daemon"
+        killproc ${BACDIRBIN}/bacula-dir ${DIR_PORT}
+      }
+      ;;
+
+   restart)
+      $0 stop
+      sleep 5
+      $0 start
+      ;;
+
+   status)
+      [ -x ${BACDIRBIN}/bacula-dir ] && status ${BACDIRBIN}/bacula-dir ${DIR_PORT}
+      ;;
+
+   *)
+      echo "Usage: $0 {start|stop|restart|status}"
+      exit 1
+      ;;
+esac
+exit 0
diff --git a/bacula/scripts/bacula-ctl-fd.in b/bacula/scripts/bacula-ctl-fd.in
new file mode 100644 (file)
index 0000000..f3552c3
--- /dev/null
@@ -0,0 +1,237 @@
+#! /bin/sh
+#
+# bacula-ctl-fd This shell script takes care of starting and stopping
+#              the bacula File daemon.
+#
+#   This is pretty much watered down version of the RedHat script
+#   that works on Solaris as well as Linux, but it won't work everywhere.
+#
+# description: It comes by night and sucks the vital essence from your computers.
+#
+
+PSCMD="@PSCMD@"
+PS="ps"
+
+#
+# On Solaris, you may need to use nawk, or alternatively,
+#  add the GNU binaries to your path, such as /usr/xpg4/bin
+#
+AWK=@AWK@
+
+# All these are not *really* needed but it makes it
+#  easier to "steal" this code for the development 
+#  environment where they are different.
+#  
+BACFDBIN=@sbindir@
+BACFDCFG=@sysconfdir@
+PIDDIR=@piddir@
+SUBSYSDIR=@subsysdir@
+
+FD_PORT=@fd_port@
+
+FD_USER=@fd_user@
+FD_GROUP=@fd_group@
+
+PIDOF=@PIDOF@  
+
+# A function to stop a program.
+killproc() {
+   RC=0
+   # Test syntax.
+   if [ $# = 0 ]; then
+      echo "Usage: killproc {program} {port} [signal]"
+      return 1
+   fi
+
+   notset=0
+   # check for third arg to be kill level
+   if [ "$3" != "" ] ; then
+      killlevel=$3
+   else
+      notset=1
+      killlevel="-9"
+   fi
+
+   # Get base program name
+   base=`basename $1`
+
+   # Find pid.
+   pid=`pidofproc $base $2`
+
+   # Kill it.
+   if [ "$pid" != "" ] ; then
+      if [ "$notset" = "1" ] ; then
+        if ${PS} -p "$pid">/dev/null 2>&1; then
+            # TERM first, then KILL if not dead
+            kill -TERM $pid 2>/dev/null
+            sleep 1
+            if ${PS} -p "$pid" >/dev/null 2>&1 ; then
+                sleep 1
+                if ${PS} -p "$pid" >/dev/null 2>&1 ; then
+                    sleep 3
+                    if ${PS} -p "$pid" >/dev/null 2>&1 ; then
+                        kill -KILL $pid 2>/dev/null
+                    fi
+                fi
+            fi
+         fi
+         ${PS} -p "$pid" >/dev/null 2>&1
+         RC=$?
+         [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown"
+      #    RC=$((! $RC))
+      # use specified level only
+      else
+        if ${PS} -p "$pid" >/dev/null 2>&1; then
+           kill $killlevel $pid 2>/dev/null
+           RC=$?
+           [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel"
+        fi
+      fi
+   else
+      failure "$base shutdown"
+   fi
+   # Remove pid file if any.
+   if [ "$notset" = "1" ]; then
+      rm -f ${PIDDIR}/$base.$2.pid
+   fi
+   return $RC
+}
+
+# A function to find the pid of a program.
+pidofproc() {
+   pid=""
+   # Test syntax.
+   if [ $# = 0 ] ; then
+      echo "Usage: pidofproc {program}"
+      return 1
+   fi
+
+   # Get base program name
+   base=`basename $1`
+
+   # First try PID file
+   if [ -f ${PIDDIR}/$base.$2.pid ] ; then
+      pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
+      if [ "$pid" != "" ] ; then
+        echo $pid
+        return 0
+      fi
+   fi
+
+   # Next try "pidof"
+   if [ -x ${PIDOF} ] ; then
+      pid=`${PIDOF} $1`
+   fi
+   if [ "$pid" != "" ] ; then
+      echo $pid
+      return 0
+   fi
+
+   # Finally try to extract it from ps
+   ${PSCMD} | grep $1 | ${AWK} '{ print $1 }' | tr '\n' ' '
+   return 0
+}
+
+status() {
+   pid=""
+   # Test syntax.
+   if [ $# = 0 ] ; then
+       echo "Usage: status {program} {port}"
+       return 1
+   fi
+
+   # Get base program name
+   base=`basename $1`
+
+   # First try "pidof"
+   if [ -x ${PIDOF} ] ; then
+      pid=`${PIDOF} $1`
+   fi
+   if [ "$pid" != "" ] ; then
+      echo "$base (pid $pid) is running..."
+      return 0
+   else
+      pid=`${PSCMD} | ${AWK} 'BEGIN { prog=ARGV[1]; ARGC=1 } 
+           { if ((prog == $2) || (("(" prog ")") == $2) ||
+                (("[" prog "]") == $2) ||
+                ((prog ":") == $2)) { print $1 ; exit 0 } }' $1`
+      if [ "$pid" != "" ] ; then
+        echo "$base (pid $pid) is running..."
+        return 0
+      fi
+   fi
+
+   # Next try the PID files
+   if [ -f ${PIDDIR}/$base.$2.pid ] ; then
+      pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
+      if [ "$pid" != "" ] ; then
+        echo "$base dead but pid file exists"
+        return 1
+      fi
+   fi
+   # See if the subsys lock exists
+   if [ -f ${SUBSYSDIR}/$base ] ; then
+      echo "$base dead but subsys locked"
+      return 2
+   fi
+   echo "$base is stopped"
+   return 3
+}
+
+success() {
+   return 0
+}
+
+failure() {
+   rc=$?
+   return $rc
+}
+
+OS=`uname -s`
+
+# if /lib/tls exists, force Bacula to use the glibc pthreads instead
+if [ -d "/lib/tls" -a $OS = "Linux" -a `uname -r | cut -c1-3` = "2.4" ] ; then
+   export LD_ASSUME_KERNEL=2.4.19
+fi
+
+case "$1" in
+   start)
+      [ -x ${BACFDBIN}/bacula-fd ] && {
+        echo "Starting the Bacula File daemon"
+        OPTIONS=''
+        if [ "${FD_USER}" != '' ]; then
+           OPTIONS="${OPTIONS} -u ${FD_USER}"
+        fi
+
+        if [ "${FD_GROUP}" != '' ]; then
+           OPTIONS="${OPTIONS} -g ${FD_GROUP}"
+        fi
+
+        ${BACFDBIN}/bacula-fd $2 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf
+      }
+      ;;
+
+   stop)
+      # Stop the FD first so that SD will fail jobs and update catalog
+      [ -x ${BACFDBIN}/bacula-fd ] && {
+        echo "Stopping the Bacula File daemon"
+        killproc ${BACFDBIN}/bacula-fd ${FD_PORT}
+      }
+      ;;
+
+   restart)
+      $0 stop
+      sleep 5
+      $0 start
+      ;;
+
+   status)
+      [ -x ${BACFDBIN}/bacula-fd   ] && status ${BACFDBIN}/bacula-fd  ${FD_PORT}
+      ;;
+
+   *)
+      echo "Usage: $0 {start|stop|restart|status}"
+      exit 1
+      ;;
+esac
+exit 0
diff --git a/bacula/scripts/bacula-ctl-sd.in b/bacula/scripts/bacula-ctl-sd.in
new file mode 100644 (file)
index 0000000..9586bfc
--- /dev/null
@@ -0,0 +1,237 @@
+#! /bin/sh
+#
+# bacula-ctl-sd This shell script takes care of starting and stopping
+#              the bacula Storage daemon
+#
+#   This is pretty much watered down version of the RedHat script
+#   that works on Solaris as well as Linux, but it won't work everywhere.
+#
+# description: It comes by night and sucks the vital essence from your computers.
+#
+
+PSCMD="@PSCMD@"
+PS="ps"
+
+#
+# On Solaris, you may need to use nawk, or alternatively,
+#  add the GNU binaries to your path, such as /usr/xpg4/bin
+#
+AWK=@AWK@
+
+# All these are not *really* needed but it makes it
+#  easier to "steal" this code for the development 
+#  environment where they are different.
+#  
+BACSDBIN=@sbindir@
+BACSDCFG=@sysconfdir@
+PIDDIR=@piddir@
+SUBSYSDIR=@subsysdir@
+
+SD_PORT=@sd_port@
+
+SD_USER=@sd_user@
+SD_GROUP=@sd_group@
+
+PIDOF=@PIDOF@  
+
+# A function to stop a program.
+killproc() {
+   RC=0
+   # Test syntax.
+   if [ $# = 0 ]; then
+      echo "Usage: killproc {program} {port} [signal]"
+      return 1
+   fi
+
+   notset=0
+   # check for third arg to be kill level
+   if [ "$3" != "" ] ; then
+      killlevel=$3
+   else
+      notset=1
+      killlevel="-9"
+   fi
+
+   # Get base program name
+   base=`basename $1`
+
+   # Find pid.
+   pid=`pidofproc $base $2`
+
+   # Kill it.
+   if [ "$pid" != "" ] ; then
+      if [ "$notset" = "1" ] ; then
+        if ${PS} -p "$pid">/dev/null 2>&1; then
+            # TERM first, then KILL if not dead
+            kill -TERM $pid 2>/dev/null
+            sleep 1
+            if ${PS} -p "$pid" >/dev/null 2>&1 ; then
+                sleep 1
+                if ${PS} -p "$pid" >/dev/null 2>&1 ; then
+                    sleep 3
+                    if ${PS} -p "$pid" >/dev/null 2>&1 ; then
+                        kill -KILL $pid 2>/dev/null
+                    fi
+                fi
+            fi
+         fi
+         ${PS} -p "$pid" >/dev/null 2>&1
+         RC=$?
+         [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown"
+      #    RC=$((! $RC))
+      # use specified level only
+      else
+        if ${PS} -p "$pid" >/dev/null 2>&1; then
+           kill $killlevel $pid 2>/dev/null
+           RC=$?
+           [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel"
+        fi
+      fi
+   else
+      failure "$base shutdown"
+   fi
+   # Remove pid file if any.
+   if [ "$notset" = "1" ]; then
+      rm -f ${PIDDIR}/$base.$2.pid
+   fi
+   return $RC
+}
+
+# A function to find the pid of a program.
+pidofproc() {
+   pid=""
+   # Test syntax.
+   if [ $# = 0 ] ; then
+      echo "Usage: pidofproc {program}"
+      return 1
+   fi
+
+   # Get base program name
+   base=`basename $1`
+
+   # First try PID file
+   if [ -f ${PIDDIR}/$base.$2.pid ] ; then
+      pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
+      if [ "$pid" != "" ] ; then
+        echo $pid
+        return 0
+      fi
+   fi
+
+   # Next try "pidof"
+   if [ -x ${PIDOF} ] ; then
+      pid=`${PIDOF} $1`
+   fi
+   if [ "$pid" != "" ] ; then
+      echo $pid
+      return 0
+   fi
+
+   # Finally try to extract it from ps
+   ${PSCMD} | grep $1 | ${AWK} '{ print $1 }' | tr '\n' ' '
+   return 0
+}
+
+status() {
+   pid=""
+   # Test syntax.
+   if [ $# = 0 ] ; then
+       echo "Usage: status {program} {port}"
+       return 1
+   fi
+
+   # Get base program name
+   base=`basename $1`
+
+   # First try "pidof"
+   if [ -x ${PIDOF} ] ; then
+      pid=`${PIDOF} $1`
+   fi
+   if [ "$pid" != "" ] ; then
+      echo "$base (pid $pid) is running..."
+      return 0
+   else
+      pid=`${PSCMD} | ${AWK} 'BEGIN { prog=ARGV[1]; ARGC=1 } 
+           { if ((prog == $2) || (("(" prog ")") == $2) ||
+                (("[" prog "]") == $2) ||
+                ((prog ":") == $2)) { print $1 ; exit 0 } }' $1`
+      if [ "$pid" != "" ] ; then
+        echo "$base (pid $pid) is running..."
+        return 0
+      fi
+   fi
+
+   # Next try the PID files
+   if [ -f ${PIDDIR}/$base.$2.pid ] ; then
+      pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
+      if [ "$pid" != "" ] ; then
+        echo "$base dead but pid file exists"
+        return 1
+      fi
+   fi
+   # See if the subsys lock exists
+   if [ -f ${SUBSYSDIR}/$base ] ; then
+      echo "$base dead but subsys locked"
+      return 2
+   fi
+   echo "$base is stopped"
+   return 3
+}
+
+success() {
+   return 0
+}
+
+failure() {
+   rc=$?
+   return $rc
+}
+
+OS=`uname -s`
+
+# if /lib/tls exists, force Bacula to use the glibc pthreads instead
+if [ -d "/lib/tls" -a $OS = "Linux" -a `uname -r | cut -c1-3` = "2.4" ] ; then
+   export LD_ASSUME_KERNEL=2.4.19
+fi
+
+case "$1" in
+   start)
+      [ -x ${BACSDBIN}/bacula-sd ] && {
+        echo "Starting the Bacula Storage daemon"
+        OPTIONS=''
+        if [ "${SD_USER}" != '' ]; then
+           OPTIONS="${OPTIONS} -u ${SD_USER}"
+        fi
+
+        if [ "${SD_GROUP}" != '' ]; then
+           OPTIONS="${OPTIONS} -g ${SD_GROUP}"
+        fi
+
+        ${BACSDBIN}/bacula-sd $2 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf
+      }
+      ;;
+
+
+   stop)
+      [ -x ${BACSDBIN}/bacula-sd ] && {
+        echo "Stopping the Bacula Storage daemon"
+        killproc ${BACSDBIN}/bacula-sd ${SD_PORT}
+      }
+      ;;
+
+   restart)
+      $0 stop
+      sleep 5
+      $0 start
+      ;;
+
+   status)
+      [ -x ${BACSDBIN}/bacula-sd   ] && status ${BACSDBIN}/bacula-sd  ${SD_PORT}
+      ;;
+
+   *)
+      echo "Usage: $0 {start|stop|restart|status}"
+      exit 1
+      ;;
+esac
+exit 0
index 8aa6b5c5d84d54f27f82778f3ba73f56fcde2e6b..0382ab8f20577053461960f824842ac6ac0d9f85 100755 (executable)
 # description: It comes by night and sucks the vital essence from your computers.
 #
 
-PSCMD="@PSCMD@"
-PS="ps"
-
-#
-# On Solaris, you may need to use nawk, or alternatively,
-#  add the GNU binaries to your path, such as /usr/xpg4/bin
-#
-AWK=@AWK@
-
 # All these are not *really* needed but it makes it
 #  easier to "steal" this code for the development 
 #  environment where they are different.
 #  
-BACFDBIN=@sbindir@
 BACFDCFG=@sysconfdir@
-BACSDBIN=@sbindir@
 BACSDCFG=@sysconfdir@
-BACDIRBIN=@sbindir@
 BACDIRCFG=@sysconfdir@
-PIDDIR=@piddir@
-SUBSYSDIR=@subsysdir@
-
-DIR_PORT=@dir_port@
-FD_PORT=@fd_port@
-SD_PORT=@sd_port@
-
-DIR_USER=@dir_user@
-DIR_GROUP=@dir_group@
-FD_USER=@fd_user@
-FD_GROUP=@fd_group@
-SD_USER=@sd_user@
-SD_GROUP=@sd_group@
-
-PIDOF=@PIDOF@  
-
-# A function to stop a program.
-killproc() {
-   RC=0
-   # Test syntax.
-   if [ $# = 0 ]; then
-      echo "Usage: killproc {program} {port} [signal]"
-      return 1
-   fi
-
-   notset=0
-   # check for third arg to be kill level
-   if [ "$3" != "" ] ; then
-      killlevel=$3
-   else
-      notset=1
-      killlevel="-9"
-   fi
-
-   # Get base program name
-   base=`basename $1`
-
-   # Find pid.
-   pid=`pidofproc $base $2`
-
-   # Kill it.
-   if [ "$pid" != "" ] ; then
-      if [ "$notset" = "1" ] ; then
-        if ${PS} -p $pid>/dev/null 2>&1; then
-            # TERM first, then KILL if not dead
-            kill -TERM $pid 2>/dev/null
-            sleep 1
-            if ${PS} -p $pid >/dev/null 2>&1 ; then
-                sleep 1
-                if ${PS} -p $pid >/dev/null 2>&1 ; then
-                    sleep 3
-                    if ${PS} -p $pid >/dev/null 2>&1 ; then
-                        kill -KILL $pid 2>/dev/null
-                    fi
-                fi
-            fi
-         fi
-         ${PS} -p $pid >/dev/null 2>&1
-         RC=$?
-         [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown"
-      #    RC=$((! $RC))
-      # use specified level only
-      else
-        if ${PS} -p $pid >/dev/null 2>&1; then
-           kill $killlevel $pid 2>/dev/null
-           RC=$?
-           [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel"
-        fi
-      fi
-   else
-      failure "$base shutdown"
-   fi
-   # Remove pid file if any.
-   if [ "$notset" = "1" ]; then
-      rm -f ${PIDDIR}/$base.$2.pid
-   fi
-   return $RC
-}
-
-# A function to find the pid of a program.
-pidofproc() {
-   pid=""
-   # Test syntax.
-   if [ $# = 0 ] ; then
-      echo "Usage: pidofproc {program}"
-      return 1
-   fi
-
-   # Get base program name
-   base=`basename $1`
-
-   # First try PID file
-   if [ -f ${PIDDIR}/$base.$2.pid ] ; then
-      pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
-      if [ "$pid" != "" ] ; then
-        echo $pid
-        return 0
-      fi
-   fi
-
-   # Next try "pidof"
-   if [ -x ${PIDOF} ] ; then
-      pid=`${PIDOF} $1`
-   fi
-   if [ "$pid" != "" ] ; then
-      echo $pid
-      return 0
-   fi
-
-   # Finally try to extract it from ps
-   ${PSCMD} | grep $1 | ${AWK} '{ print $1 }' | tr '\n' ' '
-   return 0
-}
-
-status() {
-   pid=""
-   # Test syntax.
-   if [ $# = 0 ] ; then
-       echo "Usage: status {program} {port}"
-       return 1
-   fi
-
-   # Get base program name
-   base=`basename $1`
-
-   # First try "pidof"
-   if [ -x ${PIDOF} ] ; then
-      pid=`${PIDOF} $1`
-   fi
-   if [ "$pid" != "" ] ; then
-      echo "$base (pid $pid) is running..."
-      return 0
-   else
-      pid=`${PSCMD} | ${AWK} 'BEGIN { prog=ARGV[1]; ARGC=1 } 
-           { if ((prog == $2) || (("(" prog ")") == $2) ||
-                (("[" prog "]") == $2) ||
-                ((prog ":") == $2)) { print $1 ; exit 0 } }' $1`
-      if [ "$pid" != "" ] ; then
-        echo "$base (pid $pid) is running..."
-        return 0
-      fi
-   fi
-
-   # Next try the PID files
-   if [ -f ${PIDDIR}/$base.$2.pid ] ; then
-      pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
-      if [ "$pid" != "" ] ; then
-        echo "$base dead but pid file exists"
-        return 1
-      fi
-   fi
-   # See if the subsys lock exists
-   if [ -f ${SUBSYSDIR}/$base ] ; then
-      echo "$base dead but subsys locked"
-      return 2
-   fi
-   echo "$base is stopped"
-   return 3
-}
-
-success() {
-   return 0
-}
-
-failure() {
-   rc=$?
-   return $rc
-}
-
-OS=`uname -s`
-
-# if /lib/tls exists, force Bacula to use the glibc pthreads instead
-if [ -d "/lib/tls" -a $OS = "Linux" -a `uname -r | cut -c1-3` = "2.4" ] ; then
-   export LD_ASSUME_KERNEL=2.4.19
-fi
 
 case "$1" in
    start)
-      [ -x ${BACSDBIN}/bacula-sd ] && {
-        echo "Starting the Bacula Storage daemon"
-        OPTIONS=''
-        if [ "${SD_USER}" != '' ]; then
-           OPTIONS="${OPTIONS} -u ${SD_USER}"
-        fi
-
-        if [ "${SD_GROUP}" != '' ]; then
-           OPTIONS="${OPTIONS} -g ${SD_GROUP}"
-        fi
-
-        ${BACSDBIN}/bacula-sd $2 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf
-      }
-
-      [ -x ${BACFDBIN}/bacula-fd ] && {
-        echo "Starting the Bacula File daemon"
-        OPTIONS=''
-        if [ "${FD_USER}" != '' ]; then
-           OPTIONS="${OPTIONS} -u ${FD_USER}"
-        fi
-
-        if [ "${FD_GROUP}" != '' ]; then
-           OPTIONS="${OPTIONS} -g ${FD_GROUP}"
-        fi
-
-        ${BACFDBIN}/bacula-fd $2 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf
-      }
-
-      [ -x ${BACDIRBIN}/bacula-dir ] && { 
-         sleep 2
-         echo "Starting the Bacula Director daemon"
-        OPTIONS=''
-        if [ "${DIR_USER}" != '' ]; then
-           OPTIONS="${OPTIONS} -u ${DIR_USER}"
-        fi
-
-        if [ "${DIR_GROUP}" != '' ]; then
-           OPTIONS="${OPTIONS} -g ${DIR_GROUP}"
-        fi
-
-        ${BACDIRBIN}/bacula-dir $2 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf
-      }
+      [ -x ${BACSDCFG}/bacula-ctl-sd ] && ${BACSDCFG}/bacula-ctl-sd $1 $2
+      [ -x ${BACFDCFG}/bacula-ctl-fd ] && ${BACFDCFG}/bacula-ctl-fd $1 $2
+      [ -x ${BACDIRCFG}/bacula-ctl-dir ] && ${BACDIRCFG}/bacula-ctl-dir $1 $2
       ;;
 
    stop)
       # Stop the FD first so that SD will fail jobs and update catalog
-      [ -x ${BACFDBIN}/bacula-fd ] && {
-        echo "Stopping the Bacula File daemon"
-        killproc ${BACFDBIN}/bacula-fd ${FD_PORT}
-      }
-
-      [ -x ${BACSDBIN}/bacula-sd ] && {
-        echo "Stopping the Bacula Storage daemon"
-        killproc ${BACSDBIN}/bacula-sd ${SD_PORT}
-      }
-
-      [ -x ${BACDIRBIN}/bacula-dir ] && {
-        echo "Stopping the Bacula Director daemon"
-        killproc ${BACDIRBIN}/bacula-dir ${DIR_PORT}
-      }
+      [ -x ${BACFDCFG}/bacula-ctl-fd ] && ${BACFDCFG}/bacula-ctl-fd $1 $2
+      [ -x ${BACSDCFG}/bacula-ctl-sd ] && ${BACSDCFG}/bacula-ctl-sd $1 $2
+      [ -x ${BACDIRCFG}/bacula-ctl-dir ] && ${BACDIRCFG}/bacula-ctl-dir $1 $2
       echo
+      sleep 6
       ;;
 
    restart)
       $0 stop
-      sleep 5
       $0 start
       ;;
 
    status)
-      [ -x ${BACSDBIN}/bacula-sd   ] && status ${BACSDBIN}/bacula-sd  ${SD_PORT}
-      [ -x ${BACFDBIN}/bacula-fd   ] && status ${BACFDBIN}/bacula-fd  ${FD_PORT}
-      [ -x ${BACDIRBIN}/bacula-dir ] && status ${BACDIRBIN}/bacula-dir ${DIR_PORT}
+      [ -x ${BACSDCFG}/bacula-ctl-sd ] && ${BACSDCFG}/bacula-ctl-sd status
+      [ -x ${BACFDCFG}/bacula-ctl-fd ] && ${BACFDCFG}/bacula-ctl-fd status
+      [ -x ${BACDIRCFG}/bacula-ctl-dir ] && ${BACDIRCFG}/bacula-ctl-dir status
       ;;
 
    *)
index 48eccb8a788b003e1e8aa7316caa7fad10da4b2a..5bd399fec70132a18673720c2ffa6866a0a99932 100644 (file)
@@ -44,7 +44,7 @@ MTX=@MTX@
 #
 dbgfile="@working_dir@/mtx.log"
 debug() {
-    if test -e $dbgfile; then
+    if test -f $dbgfile; then
        echo "`date +\"%Y%m%d-%H:%M:%S\"` $*" >> $dbgfile
     fi
 }
@@ -54,7 +54,7 @@ debug() {
 # Create a temporary file
 #
 make_temp_file() {
-  TMPFILE=`mktemp -t mtx.XXXXXXXXXX`
+  TMPFILE=`mktemp @working_dir@/mtx.XXXXXXXXXX`
   if test x${TMPFILE} = x; then
      TMPFILE="@working_dir@/mtx.$$"
      if test -f ${TMPFILE}; then
index 0e1ce6562784c6ee8553e4e0c8d06b8301b22e45..cf9a392bac7a4a928cda494d0bcc74ca3ff385ec 100644 (file)
 #define TRUE  1
 #define FALSE 0
 
-#ifndef MAX
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#endif
-#ifndef MIN
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-
 #ifdef HAVE_TLS
 #define have_tls 1
 #else
 #define have_tls 0
 #endif
+/* For compatibility with 1.39 */
+#define cleanup_crypto cleanup_tls
+#define init_crypto init_tls
 
 #ifndef ETIME
 #define ETIME ETIMEDOUT
@@ -95,6 +91,8 @@
       #define setlocale(p, d)
    #endif
 #endif /* ENABLE_NLS */
+/* Use the following for strings not to be translated */
+#define NT_(s) (s)   
 
 /* This should go away! ****FIXME***** */
 #define MAXSTRING 500
  *   STREAM_SHA256_DIGEST
  *   STREAM_SHA512_DIGEST
  */
-#define STREAM_NONE               0    /* Reserved Non-Stream */
 #define STREAM_UNIX_ATTRIBUTES    1    /* Generic Unix attributes */
 #define STREAM_FILE_DATA          2    /* Standard uncompressed data */
 #define STREAM_MD5_SIGNATURE      3    /* deprecated */
 #define STREAM_UNIX_ATTRIBUTES_ACCESS_ACL 15 /* Standard ACL attributes on UNIX */
 #define STREAM_UNIX_ATTRIBUTES_DEFAULT_ACL 16 /* Default ACL attributes on UNIX */
 /*** FIXME ***/
-#define STREAM_SHA256_DIGEST              17   /* SHA-256 digest for the file */
-#define STREAM_SHA512_DIGEST              18   /* SHA-512 digest for the file */
-#define STREAM_SIGNED_DIGEST              19   /* Signed File Digest, ASN.1, DER Encoded */
-#define STREAM_ENCRYPTED_FILE_DATA        20   /* Encrypted, uncompressed data */
-#define STREAM_ENCRYPTED_WIN32_DATA       21   /* Encrypted, uncompressed Win32 BackupRead data */
-#define STREAM_ENCRYPTED_SESSION_DATA     22   /* Encrypted Session Data, ASN.1, DER Encoded */
-#define STREAM_ENCRYPTED_FILE_GZIP_DATA   23   /* Encrypted, compressed data */
-#define STREAM_ENCRYPTED_WIN32_GZIP_DATA  24   /* Encrypted, compressed Win32 BackupRead data */
-#define STREAM_ENCRYPTED_MACOS_FORK_DATA  25   /* Encrypted, uncompressed Mac resource fork */
+#define STREAM_SHA256_DIGEST     17    /* SHA-256 digest for the file */
+#define STREAM_SHA512_DIGEST     18    /* SHA-512 digest for the file */
+#define STREAM_SIGNED_DIGEST     19    /* Signed File Digest, ASN.1 Encoded */
+#define STREAM_ENCRYPTED_FILE_DATA 20  /* Encrypted, uncompressed data */
+#define STREAM_ENCRYPTED_WIN32_DATA 21 /* Encrypted, uncompressed Win32 BackupRead data */
 
 
 /*
 /* Definitions for upper part of type word (see above). */
 #define AR_DATA_STREAM (1<<16)        /* Data stream id present */
 
+/*
+ * Internal code for Signature types
+ */
+#define NO_SIG   0
+#define MD5_SIG  1
+#define SHA1_SIG 2
+
 /*
  * Tape label types -- stored in catalog
  */
index 6225d44e11d64bdac605acbd8071cc40bbff6b47..e820a93c0e7f811ca84f3c8b2673a4545f6791dc 100644 (file)
 #include <openssl/x509v3.h>
 #include <openssl/rand.h>
 #include <openssl/err.h>
-#include <openssl/asn1.h>
-#include <openssl/asn1t.h>
 #undef STORE
 #endif
 
index 7b1f054f8d88e41f8ed1abb8a5759498e9554ea1..bea9cc8bec097a7c8fdfcee7e4c5a4f65651ece4 100755 (executable)
@@ -197,7 +197,7 @@ int db_update_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr)
    return stat;
 }
 
-int db_add_digest_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *digest, int type)
+int db_add_SIG_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *SIG, int type)
 {
    return 1;
 }
index 25d5b53ea4b8e7d38067ca7865f7a21fcfb3f273..00097ccaed7f5ea5b31401ba8f30d40839f31072 100644 (file)
@@ -14,7 +14,7 @@
  *    Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -546,8 +546,6 @@ struct JOB_DBR {
    uint32_t JobErrors;
    uint32_t JobMissingFiles;
    uint64_t JobBytes;
-   int PurgedFiles;
-   int HasBase;
 
    /* Note, FirstIndex, LastIndex, Start/End File and Block
     * are only used in the JobMedia record.
@@ -567,33 +565,6 @@ struct JOB_DBR {
    faddr_t rec_addr;
 };
 
-/* 
- * Suplementary record for Migration, archive, copy jobs
- */
-/* MAC record */
-struct MAC_DBR {
-   JobId_t JobId;                     /* Id of this job */
-   JobId_t OriginalJobId;             /* Id of job migrated, copied or archived */
-   /* 
-    * The following are the actual values for this job. This
-    *  is needed because the values in the corresponding Job
-    *  record were set to the values of the original backup job.
-    */
-   int JobType;                       /* Actual job type */
-   int JobLevel;                      /* Actual job level */
-   time_t SchedTime;                  /* Actual time job scheduled */
-   time_t StartTime;                  /* Actual Job start time */
-   time_t EndTime;                    /* Actual Job termination time */
-   utime_t JobTDate;                  /* Actual Backup time/date in seconds */
-
-   char cSchedTime[MAX_TIME_LENGTH];
-   char cStartTime[MAX_TIME_LENGTH];
-   char cEndTime[MAX_TIME_LENGTH];
-
-};
-
-
-
 /* Job Media information used to create the media records
  * for each Volume used for the job.
  */
@@ -617,7 +588,6 @@ struct JOBMEDIA_DBR {
 struct VOL_PARAMS {
    char VolumeName[MAX_NAME_LENGTH];  /* Volume name */
    char MediaType[MAX_NAME_LENGTH];   /* Media Type */
-   char Storage[MAX_NAME_LENGTH];     /* Storage name */
    uint32_t VolIndex;                 /* Volume seqence no. */
    uint32_t FirstIndex;               /* First index this Volume */
    uint32_t LastIndex;                /* Last index this Volume */
@@ -625,7 +595,6 @@ struct VOL_PARAMS {
    uint32_t EndFile;                  /* End file on Volume */
    uint32_t StartBlock;               /* start block on tape */
    uint32_t EndBlock;                 /* last block */
-   int32_t Slot;                      /* Slot */
 // uint32_t Copy;                     /* identical copy */
 // uint32_t Stripe;                   /* RAIT strip number */
 };
@@ -646,8 +615,8 @@ struct ATTR_DBR {
    DBId_t PathId;
    DBId_t FilenameId;
    FileId_t FileId;
-   char *Digest;
-   int DigestType;
+   char *Sig;
+   int SigType;
 };
 
 
@@ -660,8 +629,8 @@ struct FILE_DBR {
    DBId_t PathId;
    JobId_t  MarkId;
    char LStat[256];
-   char Digest[BASE64_SIZE(CRYPTO_DIGEST_MAX_SIZE)];
-   int DigestType;                    /* NO_SIG/MD5_SIG/SHA1_SIG */
+   char SIG[50];
+   int SigType;                       /* NO_SIG/MD5_SIG/SHA1_SIG */
 };
 
 /* Pool record -- same format as database */
index 1cbe61e9e6a4f9de938f9707a7c3f61b1b1b8930..8ee437d85f695d74a59819fb44857e30d7fc5b99 100644 (file)
@@ -5,8 +5,18 @@
 
 bindir=@SQL_BINDIR@
 
+# use SQL_ASCII to be able to put any filename into
+#  the database even those created with unusual character sets
+ENCODING="ENCODING 'SQL_ASCII'"
+# use UTF8 if you are using standard Unix/Linux LANG specifications
+#  that use UTF8 -- this is normally the default and *should* be
+#  your standard.  Bacula consoles work correctly *only* with UTF8.
+#ENCODING="ENCODING 'UTF8'"
+     
+
 if $bindir/psql -f - -d template1 $* <<END-OF-DATA
-CREATE DATABASE bacula;
+CREATE DATABASE bacula $ENCODING;
+ALTER DATABASE bacula SET datestyle TO 'ISO, YMD';
 END-OF-DATA
 then
    echo "Creation of bacula database succeeded."
index 7e4aeae7b882fb7ae2a06efb695f0dd933cb2469..ca4fb29f961b7e565483e5c933298672fd4b7c9c 100644 (file)
@@ -112,19 +112,6 @@ CREATE TABLE Job (
    INDEX (Name(128))
    );
 
-CREATE TABLE MAC (
-   JobId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
-   OriginalJobId INTEGER UNSIGNED NOT NULL,
-   JobType BINARY(1) NOT NULL,
-   JobLevel BINARY(1) NOT NULL,
-   SchedTime DATETIME NOT NULL,
-   StartTime DATETIME NOT NULL,
-   EndTime DATETIME NOT NULL,
-   JobTDate BIGINT UNSIGNED NOT NULL,
-   PRIMARY KEY(JobId)
-   );
-
-
 # 
 CREATE TABLE FileSet (
    FileSetId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
@@ -158,7 +145,6 @@ CREATE TABLE Media (
    Slot INTEGER NOT NULL DEFAULT 0,
    PoolId INTEGER UNSIGNED NOT NULL REFERENCES Pool,
    MediaType TINYBLOB NOT NULL,
-   MediaTypeId INTEGER UNSIGNED NOT NULL REFERENCES MediaType,
    LabelType TINYINT NOT NULL DEFAULT 0,
    FirstWritten DATETIME NOT NULL,
    LastWritten DATETIME NOT NULL,
@@ -182,13 +168,11 @@ CREATE TABLE Media (
    MaxVolBytes BIGINT UNSIGNED NOT NULL DEFAULT 0,
    InChanger TINYINT NOT NULL DEFAULT 0,
    StorageId INTEGER UNSIGNED NOT NULL REFERENCES Storage,
-   DeviceId INTEGER UNSIGNED NOT NULL REFERENCES Device,
    MediaAddressing TINYINT NOT NULL DEFAULT 0,
    VolReadTime BIGINT UNSIGNED NOT NULL DEFAULT 0,
    VolWriteTime BIGINT UNSIGNED NOT NULL DEFAULT 0,
    EndFile INTEGER UNSIGNED NOT NULL DEFAULT 0,
    EndBlock INTEGER UNSIGNED NOT NULL DEFAULT 0,
-   LocationId INTEGER UNSIGNED NOT NULL REFERENCES Location,
    PRIMARY KEY(MediaId),
    INDEX (PoolId)
    );
index cf13ce73176439e5b499ec386214a42cf903446b..be0e9f5840ae962d9990a55f5fd88204fb1c38f9 100644 (file)
@@ -76,19 +76,6 @@ CREATE TABLE job
 
 CREATE INDEX job_name_idx on job (name);
 
-CREATE TABLE MAC (
-    JobId            serial      not null,
-    OriginalJobId     serial     not null,
-    JobType          char(1)     not null,
-    JobLevel         char(1)     not null,
-    schedtime        timestamp   without time zone not null,
-    starttime        timestamp   without time zone,
-    endtime          timestamp   without time zone,
-    jobtdate         bigint      not null,
-    primary key (jobid)
-);
-
-
 CREATE TABLE fileset
 (
     filesetid        serial      not null,
@@ -126,7 +113,6 @@ CREATE TABLE media
     slot             integer     not null default 0,
     poolid           integer     not null,
     mediatype        text        not null,
-    mediatypeid       integer    not null,
     labeltype        integer     not null default 0,
     firstwritten      timestamp   without time zone,
     lastwritten       timestamp   without time zone,
@@ -152,13 +138,11 @@ CREATE TABLE media
     maxvolbytes       bigint     not null default 0,
     inchanger        smallint    not null default 0,
     StorageId        integer              default 0,
-    DeviceId         integer              default 0,
     mediaaddressing   smallint   not null default 0,
     volreadtime       bigint     not null default 0,
     volwritetime      bigint     not null default 0,
     endfile          integer     not null default 0,
     endblock         bigint      not null default 0,
-    LocationId       integer              default 0,
     primary key (mediaid)
 );
 
index 38ed334dff0f47371d93e6b988728a337506a4c7..6f54ff397ebe377504ddb5ee861750f757012112 100644 (file)
@@ -73,19 +73,6 @@ CREATE TABLE Job (
 
 CREATE INDEX inx6 ON Job (Name);
 
-CREATE TABLE MAC (
-   JobId INTEGER,
-   OriginalJobId INTEGER,
-   JobType CHAR NOT NULL,
-   JobLevel CHAR NOT NULL,
-   SchedTime DATETIME NOT NULL,
-   StartTime DATETIME DEFAULT 0,
-   EndTime DATETIME DEFAULT 0,
-   JobTDate BIGINT UNSIGNED DEFAULT 0,
-   PRIMARY KEY(JobId)
-   );
-
-
 CREATE TABLE FileSet (
    FileSetId INTEGER,
    FileSet VARCHAR(128) NOT NULL,
@@ -119,7 +106,6 @@ CREATE TABLE Media (
    Slot INTEGER DEFAULT 0,
    PoolId INTEGER UNSIGNED REFERENCES Pool NOT NULL,
    MediaType VARCHAR(128) NOT NULL,
-   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType NOT NULL,
    LabelType TINYINT DEFAULT 0,
    FirstWritten DATETIME DEFAULT 0,
    LastWritten DATETIME DEFAULT 0,
@@ -142,13 +128,11 @@ CREATE TABLE Media (
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    StorageId INTEGER UNSIGNED REFERENCES Storage,        
-   DeviceId INTEGER UNSIGNED REFERENCES Device,
    MediaAddressing TINYINT DEFAULT 0,
    VolReadTime BIGINT UNSIGNED DEFAULT 0,
    VolWriteTime BIGINT UNSIGNED DEFAULT 0,
    EndFile INTEGER UNSIGNED DEFAULT 0,
    EndBlock INTEGER UNSIGNED DEFAULT 0,
-   LocationId INTEGER UNSIGNED REFERENCES Location,
    PRIMARY KEY(MediaId)
    );
 
@@ -329,6 +313,7 @@ INSERT INTO Version (VersionId) VALUES (9);
 
 PRAGMA default_synchronous = OFF;
 PRAGMA default_cache_size = 10000;
+PRAGMA synchronous = NORMAL;
 
 END-OF-DATA
 
index 38ed334dff0f47371d93e6b988728a337506a4c7..25afc6b7f2a2c911b374903460889354cf76efa4 100644 (file)
@@ -73,19 +73,6 @@ CREATE TABLE Job (
 
 CREATE INDEX inx6 ON Job (Name);
 
-CREATE TABLE MAC (
-   JobId INTEGER,
-   OriginalJobId INTEGER,
-   JobType CHAR NOT NULL,
-   JobLevel CHAR NOT NULL,
-   SchedTime DATETIME NOT NULL,
-   StartTime DATETIME DEFAULT 0,
-   EndTime DATETIME DEFAULT 0,
-   JobTDate BIGINT UNSIGNED DEFAULT 0,
-   PRIMARY KEY(JobId)
-   );
-
-
 CREATE TABLE FileSet (
    FileSetId INTEGER,
    FileSet VARCHAR(128) NOT NULL,
@@ -119,7 +106,6 @@ CREATE TABLE Media (
    Slot INTEGER DEFAULT 0,
    PoolId INTEGER UNSIGNED REFERENCES Pool NOT NULL,
    MediaType VARCHAR(128) NOT NULL,
-   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType NOT NULL,
    LabelType TINYINT DEFAULT 0,
    FirstWritten DATETIME DEFAULT 0,
    LastWritten DATETIME DEFAULT 0,
@@ -142,13 +128,11 @@ CREATE TABLE Media (
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    StorageId INTEGER UNSIGNED REFERENCES Storage,        
-   DeviceId INTEGER UNSIGNED REFERENCES Device,
    MediaAddressing TINYINT DEFAULT 0,
    VolReadTime BIGINT UNSIGNED DEFAULT 0,
    VolWriteTime BIGINT UNSIGNED DEFAULT 0,
    EndFile INTEGER UNSIGNED DEFAULT 0,
    EndBlock INTEGER UNSIGNED DEFAULT 0,
-   LocationId INTEGER UNSIGNED REFERENCES Location,
    PRIMARY KEY(MediaId)
    );
 
index 9d24a11658587023e4196bab11931683c38350d4..0ff62087f8684bcc066e7223f9db1043e8f82437 100644 (file)
@@ -132,7 +132,6 @@ db_open_database(JCR *jcr, B_DB *mdb)
    mysql_server_init(0, NULL, NULL);
 #endif
    mysql_init(&(mdb->mysql));
-   mdb->mysql.reconnect = 1;             /* so connection does not timeout */
    Dmsg0(50, "mysql_init done\n");
    /* If connection fails, try at 5 sec intervals for 30 seconds. */
    for (int retry=0; retry < 6; retry++) {
@@ -153,6 +152,7 @@ db_open_database(JCR *jcr, B_DB *mdb)
       bmicrosleep(5,0);
    }
 
+   mdb->mysql.reconnect = 1;             /* so connection does not timeout */
    Dmsg0(50, "mysql_real_connect done\n");
    Dmsg3(50, "db_user=%s db_name=%s db_password=%s\n", mdb->db_user, mdb->db_name,
             mdb->db_password==NULL?"(NULL)":mdb->db_password);
@@ -314,6 +314,7 @@ unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from,
 int db_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler, void *ctx)
 {
    SQL_ROW row;
+   bool send = true;
 
    db_lock(mdb);
    if (sql_query(mdb, query) != 0) {
@@ -323,11 +324,20 @@ int db_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler
    }
    if (result_handler != NULL) {
       if ((mdb->result = sql_use_result(mdb)) != NULL) {
-         int num_fields = sql_num_fields(mdb);
+         int num_fields = 0;                     
 
+         /* We *must* fetch all rows */
          while ((row = sql_fetch_row(mdb)) != NULL) {
-            if (result_handler(ctx, num_fields, row))
-               break;
+            if (send) {
+               /* the result handler returns 1 when it has
+                *  seen all the data it wants.  However, we
+                *  loop to the end of the data.
+                */
+               num_fields++;
+               if (result_handler(ctx, num_fields, row)) {
+                  send = false;
+               }
+            }
          }
 
          sql_free_result(mdb);
index 43a43bd2fe5d706acf8368dbf13b4ccf285c9491..ddcd2cda32de439128e2689306a077f5fe679bb7 100644 (file)
@@ -8,7 +8,7 @@
  *    Version $Id$
  */
 /*
-   Copyright (C) 2003-2005 Kern Sibbald
+   Copyright (C) 2003-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
@@ -175,6 +175,8 @@ db_open_database(JCR *jcr, B_DB *mdb)
       return 0;
    }
 
+   sql_query(mdb, "SET datestyle TO 'ISO, YMD'");
+
    mdb->connected = true;
    V(mutex);
    return 1;
index 464af82d1b69b2663315754041b204a3ee1a2fa2..aae4d38cf1a7f3ae7e34282e581a964b11b882f7 100644 (file)
@@ -6,17 +6,22 @@
  *    Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000, 2001, 2002 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
-   version 2 as amended with additional clauses defined in the
-   file LICENSE in the main source directory.
+   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.
 
    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.
+   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.
 
  */
 
@@ -43,8 +48,7 @@ void db_end_transaction(JCR *jcr, B_DB *mdb);
 
 /* create.c */
 int db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
-bool db_create_job_record(JCR *jcr, B_DB *db, JOB_DBR *jr);
-bool db_create_mac_record(JCR *jcr, B_DB *db, MAC_DBR *mr);
+int db_create_job_record(JCR *jcr, B_DB *db, JOB_DBR *jr);
 int db_create_media_record(JCR *jcr, B_DB *db, MEDIA_DBR *media_dbr);
 int db_create_client_record(JCR *jcr, B_DB *db, CLIENT_DBR *cr);
 bool db_create_fileset_record(JCR *jcr, B_DB *db, FILESET_DBR *fsr);
@@ -68,8 +72,7 @@ bool db_find_failed_job_since(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM *stime,
 /* get.c */
 bool db_get_pool_record(JCR *jcr, B_DB *db, POOL_DBR *pdbr);
 int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr);
-bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr);
-bool db_get_mac_record(JCR *jcr, B_DB *mdb, MAC_DBR *mr);
+int db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr);
 int db_get_job_volume_names(JCR *jcr, B_DB *mdb, JobId_t JobId, POOLMEM **VolumeNames);
 int db_get_file_attributes_record(JCR *jcr, B_DB *mdb, char *fname, JOB_DBR *jr, FILE_DBR *fdbr);
 int db_get_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr);
@@ -107,7 +110,7 @@ bool db_update_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr);
 int  db_update_media_record(JCR *jcr, B_DB *db, MEDIA_DBR *mr);
 int  db_update_media_defaults(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr);
 int  db_update_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr);
-int  db_add_digest_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *digest, int type);
+int  db_add_SIG_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *SIG, int type);
 int  db_mark_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, JobId_t JobId);
 void db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr);
 
index a3a877da1010e8eb19b5b793bb5ce2cfc5a7f5b5..da5c18d793227836f22e563aa9d8d63a36f23cfb 100644 (file)
@@ -53,16 +53,16 @@ extern void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname);
 
 
 /* Create a new record for the Job
- * Returns: false on failure
- *          true  on success
+ * Returns: 0 on failure
+ *          1 on success
  */
-bool
+int
 db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
 {
    char dt[MAX_TIME_LENGTH];
    time_t stime;
    struct tm tm;
-   bool ok;
+   int stat;
    utime_t JobTDate;
    char ed1[30];
 
@@ -86,65 +86,15 @@ db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
       Mmsg2(&mdb->errmsg, _("Create DB Job record %s failed. ERR=%s\n"),
             mdb->cmd, sql_strerror(mdb));
       jr->JobId = 0;
-      ok = false;
-   } else {
-      jr->JobId = sql_insert_id(mdb, N_("Job"));
-      ok = true;
-   }
-   db_unlock(mdb);
-   return ok;
-}
-
-/* Create a new migration, archive, copy
- * Returns: false on failure
- *          true  on success
- */
-bool
-db_create_mac_record(JCR *jcr, B_DB *mdb, MAC_DBR *mr)
-{
-   char schedt[MAX_TIME_LENGTH], sdt[MAX_TIME_LENGTH], edt[MAX_TIME_LENGTH];
-   time_t stime;
-   struct tm tm;
-   bool ok;
-   utime_t JobTDate;
-   char ed1[30], ed2[30];
-
-   db_lock(mdb);
-
-   stime = mr->SchedTime;
-   ASSERT(stime != 0);
-
-   localtime_r(&stime, &tm);
-   strftime(schedt, sizeof(schedt), "%Y-%m-%d %T", &tm);
-   JobTDate = (utime_t)stime;
-   localtime_r(&mr->StartTime, &tm);
-   strftime(sdt, sizeof(sdt), "%Y-%m-%d %T", &tm);
-   localtime_r(&mr->EndTime, &tm);
-   strftime(edt, sizeof(edt), "%Y-%m-%d %T", &tm);
-
-   /* Must create it */
-   Mmsg(mdb->cmd,
-"INSERT INTO MAC (OriginaJobId,JobType,JobLevel,SchedTime,"
-"StartTime,EndTime,JobTDate) VALUES "
-"('%s','%c','%c','%s','%s','%s',%s)",
-           edit_int64(mr->OriginalJobId, ed1),
-           (char)(mr->JobType), (char)(mr->JobLevel),
-           schedt, sdt, edt, edit_uint64(JobTDate, ed2));
-
-   if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
-      Mmsg2(&mdb->errmsg, _("Create DB MAC record %s failed. ERR=%s\n"),
-            mdb->cmd, sql_strerror(mdb));
-      mr->JobId = 0;
-      ok = false;
+      stat = 0;
    } else {
-      mr->JobId = sql_insert_id(mdb, N_("Job"));
-      ok = true;
+      jr->JobId = sql_insert_id(mdb, NT_("Job"));
+      stat = 1;
    }
    db_unlock(mdb);
-   return ok;
+   return stat;
 }
 
-
 /* Create a JobMedia record for medium used this job
  * Returns: false on failure
  *          true  on success
@@ -249,7 +199,7 @@ db_create_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr)
       pr->PoolId = 0;
       stat = false;
    } else {
-      pr->PoolId = sql_insert_id(mdb, N_("Pool"));
+      pr->PoolId = sql_insert_id(mdb, NT_("Pool"));
       stat = true;
    }
    db_unlock(mdb);
@@ -296,7 +246,7 @@ db_create_device_record(JCR *jcr, B_DB *mdb, DEVICE_DBR *dr)
       dr->DeviceId = 0;
       ok = false;
    } else {
-      dr->DeviceId = sql_insert_id(mdb, N_("Device"));
+      dr->DeviceId = sql_insert_id(mdb, NT_("Device"));
       ok = true;
    }
    db_unlock(mdb);
@@ -354,7 +304,7 @@ bool db_create_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr)
       Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
       ok = false;
    } else {
-      sr->StorageId = sql_insert_id(mdb, N_("Storage"));
+      sr->StorageId = sql_insert_id(mdb, NT_("Storage"));
       sr->created = true;
       ok = true;
    }
@@ -402,7 +352,7 @@ db_create_mediatype_record(JCR *jcr, B_DB *mdb, MEDIATYPE_DBR *mr)
       mr->MediaTypeId = 0;
       stat = false;
    } else {
-      mr->MediaTypeId = sql_insert_id(mdb, N_("MediaType"));
+      mr->MediaTypeId = sql_insert_id(mdb, NT_("MediaType"));
       stat = true;
    }
    db_unlock(mdb);
@@ -441,11 +391,11 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
 
    /* Must create it */
    Mmsg(mdb->cmd,
-"INSERT INTO Media (VolumeName,MediaType,MediaTypeId,PoolId,MaxVolBytes,"
-"VolCapacityBytes,Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,"
+"INSERT INTO Media (VolumeName,MediaType,PoolId,MaxVolBytes,VolCapacityBytes,"
+"Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,"
 "VolStatus,Slot,VolBytes,InChanger,VolReadTime,VolWriteTime,VolParts,"
-"EndFile,EndBlock,LabelType,StorageId,DeviceId,LocationId) "
-"VALUES ('%s','%s',0,%u,%s,%s,%d,%s,%s,%u,%u,'%s',%d,%s,%d,%s,%s,%d,0,0,%d,%s,0,0)",
+"EndFile,EndBlock,LabelType,StorageId) "
+"VALUES ('%s','%s',%u,%s,%s,%d,%s,%s,%u,%u,'%s',%d,%s,%d,%s,%s,%d,0,0,%d,%s)",
           mr->VolumeName,
           mr->MediaType, mr->PoolId,
           edit_uint64(mr->MaxVolBytes,ed1),
@@ -473,7 +423,7 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
             mdb->cmd, sql_strerror(mdb));
       stat = 0;
    } else {
-      mr->MediaId = sql_insert_id(mdb, N_("Media"));
+      mr->MediaId = sql_insert_id(mdb, NT_("Media"));
       stat = 1;
       if (mr->set_label_date) {
          char dt[MAX_TIME_LENGTH];
@@ -555,7 +505,7 @@ int db_create_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr)
       cr->ClientId = 0;
       stat = 0;
    } else {
-      cr->ClientId = sql_insert_id(mdb, N_("Client"));
+      cr->ClientId = sql_insert_id(mdb, NT_("Client"));
       stat = 1;
    }
    db_unlock(mdb);
@@ -666,7 +616,7 @@ bool db_create_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr)
       fsr->FileSetId = 0;
       stat = false;
    } else {
-      fsr->FileSetId = sql_insert_id(mdb, N_("FileSet"));
+      fsr->FileSetId = sql_insert_id(mdb, NT_("FileSet"));
       fsr->created = true;
       stat = true;
    }
@@ -759,17 +709,17 @@ bail_out:
 static int db_create_file_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
 {
    int stat;
-   static char *no_digest = "0";
-   char *digest;
+   static char *no_sig = "0";
+   char *sig;
 
    ASSERT(ar->JobId);
    ASSERT(ar->PathId);
    ASSERT(ar->FilenameId);
 
-   if (ar->Digest == NULL) {
-      digest = no_digest;
+   if (ar->Sig == NULL || ar->Sig[0] == 0) {
+      sig = no_sig;
    } else {
-      digest = ar->Digest;
+      sig = ar->Sig;
    }
 
    /* Must create it */
@@ -777,7 +727,7 @@ static int db_create_file_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
         "INSERT INTO File (FileIndex,JobId,PathId,FilenameId,"
         "LStat,MD5) VALUES (%u,%u,%u,%u,'%s','%s')",
         ar->FileIndex, ar->JobId, ar->PathId, ar->FilenameId,
-        ar->attr, digest);
+        ar->attr, sig);
 
    if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
       Mmsg2(&mdb->errmsg, _("Create db File record %s failed. ERR=%s"),
@@ -786,7 +736,7 @@ static int db_create_file_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
       ar->FileId = 0;
       stat = 0;
    } else {
-      ar->FileId = sql_insert_id(mdb, N_("File"));
+      ar->FileId = sql_insert_id(mdb, NT_("File"));
       stat = 1;
    }
    return stat;
@@ -850,7 +800,7 @@ static int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
       ar->PathId = 0;
       stat = 0;
    } else {
-      ar->PathId = sql_insert_id(mdb, N_("Path"));
+      ar->PathId = sql_insert_id(mdb, NT_("Path"));
       stat = 1;
    }
 
@@ -904,7 +854,7 @@ static int db_create_filename_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
       Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
       ar->FilenameId = 0;
    } else {
-      ar->FilenameId = sql_insert_id(mdb, N_("Filename"));
+      ar->FilenameId = sql_insert_id(mdb, NT_("Filename"));
    }
    return ar->FilenameId > 0;
 }
index 641a1e77007f98aa913bfc76ee4b7c559d90cced..19c95eee71ef81e390dc1b926e9f2020eaaff4d2 100644 (file)
@@ -10,7 +10,7 @@
  *    Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -262,7 +262,7 @@ db_find_last_jobid(JCR *jcr, B_DB *mdb, const char *Name, JOB_DBR *jr)
 int
 db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr)
 {
-   SQL_ROW row;
+   SQL_ROW row = NULL;
    int numrows;
    const char *order;
 
@@ -313,23 +313,26 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr
    }
 
    numrows = sql_num_rows(mdb);
-   if (item > numrows) {
-      Mmsg2(&mdb->errmsg, _("Request for Volume item %d greater than max %d\n"),
+   if (item > numrows || item < 1) {
+      Mmsg2(&mdb->errmsg, _("Request for Volume item %d greater than max %d or less than 1.\n"), 
          item, numrows);
       db_unlock(mdb);
       return 0;
    }
 
-   /* Seek to desired item
-    * Note, we use base 1; SQL uses base 0
+   /* Note, we previously seeked to the row using:
+    *  sql_data_seek(mdb, item-1);
+    * but this failed on PostgreSQL, so now we loop
+    * over all the records.  This should not be too horrible since
+    * the maximum Volumes we look at in any case is 20.
     */
-   sql_data_seek(mdb, item-1);
-
-   if ((row = sql_fetch_row(mdb)) == NULL) {
-      Mmsg1(&mdb->errmsg, _("No Volume record found for item %d.\n"), item);
-      sql_free_result(mdb);
-      db_unlock(mdb);
-      return 0;
+   while (item-- > 0) {
+      if ((row = sql_fetch_row(mdb)) == NULL) {
+         Mmsg1(&mdb->errmsg, _("No Volume record found for item %d.\n"), item);
+         sql_free_result(mdb);
+         db_unlock(mdb);
+         return 0;
+      }
    }
 
    /* Return fields in Media Record */
index f2bd3d9dd9152b40984d4f870c7ea44a0b507049..701332e2d56609d1822957571cfee238dcaa1af0 100644 (file)
@@ -10,7 +10,7 @@
  */
 
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -136,7 +136,7 @@ int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr)
          } else {
             fdbr->FileId = (FileId_t)str_to_int64(row[0]);
             bstrncpy(fdbr->LStat, row[1], sizeof(fdbr->LStat));
-            bstrncpy(fdbr->Digest, row[2], sizeof(fdbr->Digest));
+            bstrncpy(fdbr->SIG, row[2], sizeof(fdbr->SIG));
             stat = 1;
          }
       } else {
@@ -257,10 +257,10 @@ static int db_get_path_record(JCR *jcr, B_DB *mdb)
 
 /*
  * Get Job record for given JobId or Job name
- * Returns: false on failure
- *          true  on success
+ * Returns: 0 on failure
+ *          1 on success
  */
-bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
+int db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
 {
    SQL_ROW row;
    char ed1[50];
@@ -281,13 +281,13 @@ bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
 
    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
-      return false;                   /* failed */
+      return 0;                       /* failed */
    }
    if ((row = sql_fetch_row(mdb)) == NULL) {
       Mmsg1(mdb->errmsg, _("No Job found for JobId %s\n"), edit_int64(jr->JobId, ed1));
       sql_free_result(mdb);
       db_unlock(mdb);
-      return false;                   /* failed */
+      return 0;                       /* failed */
    }
 
    jr->VolSessionId = str_to_uint64(row[0]);
@@ -306,51 +306,10 @@ bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
    bstrncpy(jr->Name, row[13]!=NULL?row[13]:"", sizeof(jr->Name));
    sql_free_result(mdb);
 
-   db_unlock(mdb);
-   return true;
-}
-
-/*
- * Get MAC record for given JobId
- * Returns: false on failure
- *          true  on success
- */
-bool db_get_mac_record(JCR *jcr, B_DB *mdb, MAC_DBR *mr)
-{
-   SQL_ROW row;
-   char ed1[50];
-
-   db_lock(mdb);
-   Mmsg(mdb->cmd, "SELECT OriginalJobId,JobType,JobLevel,"
-"SchedTime,StartTime,EndTime,JobTDate"
-"FROM MAC WHERE JobId=%s", 
-      edit_int64(mr->JobId, ed1));
-
-   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
-      db_unlock(mdb);
-      return 0;                       /* failed */
-   }
-   if ((row = sql_fetch_row(mdb)) == NULL) {
-      Mmsg1(mdb->errmsg, _("No MAC record found for JobId %s\n"), ed1);
-      sql_free_result(mdb);
-      db_unlock(mdb);
-      return false;                   /* failed */
-   }
-
-   mr->OriginalJobId = str_to_int64(row[0]);
-   mr->JobType = (int)*row[1];
-   mr->JobLevel = (int)*row[2];
-   bstrncpy(mr->cSchedTime, row[3]!=NULL?row[3]:"", sizeof(mr->cSchedTime));
-   bstrncpy(mr->cStartTime, row[4]!=NULL?row[4]:"", sizeof(mr->cStartTime));
-   bstrncpy(mr->cEndTime, row[5]!=NULL?row[5]:"", sizeof(mr->cEndTime));
-   mr->JobTDate = str_to_int64(row[6]);
-   sql_free_result(mdb);
-
    db_unlock(mdb);
    return 1;
 }
 
-
 /*
  * Find VolumeNames for a given JobId
  *  Returns: 0 on error or no Volumes found
@@ -427,8 +386,7 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS
    db_lock(mdb);
    Mmsg(mdb->cmd,
 "SELECT VolumeName,MediaType,FirstIndex,LastIndex,StartFile,"
-"JobMedia.EndFile,StartBlock,JobMedia.EndBlock,Copy,Stripe,"
-"Slot,StorageId"
+"JobMedia.EndFile,StartBlock,JobMedia.EndBlock,Copy,Stripe"
 " FROM JobMedia,Media WHERE JobMedia.JobId=%s"
 " AND JobMedia.MediaId=Media.MediaId ORDER BY VolIndex,JobMediaId",
         edit_int64(JobId, ed1));
@@ -436,16 +394,14 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS
    Dmsg1(130, "VolNam=%s\n", mdb->cmd);
    if (QUERY_DB(jcr, mdb, mdb->cmd)) {
       mdb->num_rows = sql_num_rows(mdb);
-      Dmsg1(200, "Num rows=%d\n", mdb->num_rows);
+      Dmsg1(130, "Num rows=%d\n", mdb->num_rows);
       if (mdb->num_rows <= 0) {
          Mmsg1(mdb->errmsg, _("No volumes found for JobId=%d\n"), JobId);
          stat = 0;
       } else {
          stat = mdb->num_rows;
-         DBId_t *SId;
          if (stat > 0) {
             *VolParams = Vols = (VOL_PARAMS *)malloc(stat * sizeof(VOL_PARAMS));
-            SId = (DBId_t *)malloc(stat * sizeof(DBId_t));
          }
          for (i=0; i < stat; i++) {
             if ((row = sql_fetch_row(mdb)) == NULL) {
@@ -454,7 +410,6 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS
                stat = 0;
                break;
             } else {
-               DBId_t StorageId;
                bstrncpy(Vols[i].VolumeName, row[0], MAX_NAME_LENGTH);
                bstrncpy(Vols[i].MediaType, row[1], MAX_NAME_LENGTH);
                Vols[i].FirstIndex = str_to_uint64(row[2]);
@@ -465,21 +420,6 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS
                Vols[i].EndBlock = str_to_uint64(row[7]);
 //             Vols[i].Copy = str_to_uint64(row[8]);
 //             Vols[i].Stripe = str_to_uint64(row[9]);
-               Vols[i].Slot = str_to_uint64(row[10]);
-               StorageId = str_to_uint64(row[11]);
-               Vols[i].Storage[0] = 0;
-               SId[i] = StorageId;
-            }
-         }
-         for (i=0; i < stat; i++) {
-            if (SId[i] != 0) {
-               Mmsg(mdb->cmd, "SELECT Name from Storage WHERE StorageId=%s",
-                  edit_int64(SId[i], ed1));
-               if (QUERY_DB(jcr, mdb, mdb->cmd)) {
-                  if ((row = sql_fetch_row(mdb)) != NULL) {
-                     bstrncpy(Vols[i].Storage, row[0], MAX_NAME_LENGTH);
-                  }
-               }
             }
          }
       }
index 8d180198dc420b207ed897740b1bb22335ec0c4f..c1b451e3196176b742e921400909f64b322b905d 100644 (file)
@@ -6,7 +6,7 @@
  *    Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   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
@@ -282,7 +282,7 @@ db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit,
          Mmsg(mdb->cmd, 
             "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
             "FROM Job WHERE JobId=%s", edit_int64(jr->JobId, ed1));
-      } else {                           /* single record */
+      } else {                           /* all records */
          Mmsg(mdb->cmd,
            "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
            "FROM Job ORDER BY StartTime,JobId ASC%s", limit);
index 7cd3dedf5bf9813c7e65a26c1657f7e350bbb381..cabb9d36dbb2e818f26a259ea65fd17c6bac62a4 100644 (file)
@@ -49,7 +49,7 @@ extern int UpdateDB(const char *file, int line, JCR *jcr, B_DB *db, char *update
  */
 /* Update the attributes record by adding the file digest */
 int
-db_add_digest_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *digest,
+db_add_SIG_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *digest,
                           int type)
 {
    int stat;
@@ -64,7 +64,7 @@ db_add_digest_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *digest,
 }
 
 /* Mark the file record as being visited during database
- * verify compare. Stuff JobId into MarkedId field
+ * verify compare. Stuff JobId into MarkId field
  */
 int db_mark_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, JobId_t JobId)
 {
index bb3123f4a1dbb5033b949b9a18b3a303ce0b7a24..6fcafa766d554b104d10bd13b2d520ac41d58da9 100755 (executable)
@@ -1,9 +1,9 @@
 #!/bin/sh
 #
-# Shell script to update MySQL tables from version 1.38 to 1.39  
+# Shell script to update MySQL tables from version 1.36 to 1.38  
 #
 echo " "
-echo "This script will update a Bacula MySQL database from version 9 to 9"
+echo "This script will update a Bacula MySQL database from version 8 to 9"
 echo "Depending on the size of your database,"
 echo "this script may take several minutes to run."
 echo " "
@@ -12,29 +12,80 @@ bindir=@SQL_BINDIR@
 if $bindir/mysql $* -f <<END-OF-DATA
 USE bacula;
 
-ALTER TABLE Media ADD COLUMN MediaTypeId INTEGER UNSIGNED DEFAULT 0 REFERENCES MediaType;
-ALTER TABLE Media ADD COLUMN DeviceId INTEGER UNSIGNED DEFAULT 0 REFERENCES Device;
-ALTER TABLE Media ADD COLUMN LocationId INTEGER UNSIGNED DEFAULT 0 REFERENCES Location;
-
-
-CREATE TABLE MAC (
-   JobId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
-   OriginalJobId INTEGER UNSIGNED NOT NULL,
-   JobType BINARY(1) NOT NULL,
-   JobLevel BINARY(1) NOT NULL,
-   SchedTime DATETIME NOT NULL,
-   StartTime DATETIME NOT NULL,
-   EndTime DATETIME NOT NULL,
-   JobTDate BIGINT UNSIGNED NOT NULL,
-   PRIMARY KEY(JobId)
+ALTER TABLE Media ADD COLUMN LabelType INTEGER UNSIGNED NOT NULL DEFAULT 0;
+ALTER TABLE Media ADD COLUMN StorageId INTEGER UNSIGNED DEFAULT 0 REFERENCES Storage;
+ALTER TABLE Media ADD COLUMN VolParts INTEGER UNSIGNED NOT NULL DEFAULT 0;
+
+ALTER TABLE Pool  ADD COLUMN LabelType INTEGER UNSIGNED NOT NULL DEFAULT 0;
+ALTER TABLE Pool  ADD COLUMN NextPoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool;
+ALTER TABLE Pool  ADD COLUMN MigrationHighBytes BIGINT UNSIGNED DEFAULT 0;
+ALTER TABLE Pool  ADD COLUMN MigrationLowBytes BIGINT UNSIGNED DEFAULT 0;
+ALTER TABLE Pool  ADD COLUMN MigrationTime BIGINT UNSIGNED DEFAULT 0;
+
+ALTER TABLE JobMedia ADD COLUMN Copy INTEGER UNSIGNED NOT NULL DEFAULT 0;
+ALTER TABLE JobMedia ADD COLUMN Stripe INTEGER UNSIGNED NOT NULL DEFAULT 0;
+
+
+CREATE TABLE MediaType (
+   MediaTypeId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
+   MediaType VARCHAR(128) NOT NULL,
+   ReadOnly TINYINT DEFAULT 0,
+   PRIMARY KEY(MediaTypeId)
    );
 
-CREATE TABLE Location (
-   LocationId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
-   Location TINYBLOB NOT NULL,
-   PRIMARY KEY(LocationId)
+CREATE TABLE Storage (
+   StorageId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
+   Name VARCHAR(128) NOT NULL,
+   AutoChanger TINYINT DEFAULT 0,
+   PRIMARY KEY(StorageId)
    );
 
+CREATE TABLE Device (
+   DeviceId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
+   Name VARCHAR(128) NOT NULL,
+   MediaTypeId INTEGER UNSIGNED NOT NULL REFERENCES MediaType,
+   StorageId INTEGER UNSIGNED REFERENCES Storage,
+   DevMounts INTEGER UNSIGNED DEFAULT 0,
+   DevReadBytes BIGINT UNSIGNED DEFAULT 0,
+   DevWriteBytes BIGINT UNSIGNED DEFAULT 0,
+   DevReadBytesSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   DevWriteBytesSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   DevReadTime BIGINT UNSIGNED DEFAULT 0,
+   DevWriteTime BIGINT UNSIGNED DEFAULT 0,
+   DevReadTimeSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   DevWriteTimeSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   CleaningDate DATETIME DEFAULT 0,
+   CleaningPeriod BIGINT UNSIGNED DEFAULT 0,
+   PRIMARY KEY(DeviceId)
+   );
+
+CREATE TABLE Status (
+   JobStatus CHAR(1) BINARY NOT NULL,
+   JobStatusLong BLOB, 
+   PRIMARY KEY (JobStatus)
+   );
+
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('C', 'Created, not yet running'),
+   ('R', 'Running'),
+   ('B', 'Blocked'),
+   ('T', 'Completed successfully'),
+   ('E', 'Terminated with errors'),
+   ('e', 'Non-fatal error'),
+   ('f', 'Fatal error'),
+   ('D', 'Verify found differences'),
+   ('A', 'Canceled by user'),
+   ('F', 'Waiting for Client'),
+   ('S', 'Waiting for Storage daemon'),
+   ('m', 'Waiting for new media'),
+   ('M', 'Waiting for media mount'),
+   ('s', 'Waiting for storage resource'),
+   ('j', 'Waiting for job resource'),
+   ('c', 'Waiting for client resource'),
+   ('d', 'Waiting on maximum jobs'),
+   ('t', 'Waiting on start time'),
+   ('p', 'Waiting on higher priority jobs');
+
 
 DELETE FROM Version;
 INSERT INTO Version (VersionId) VALUES (9);
index 847559241f72e0994e45499091c7ade76ed04cd1..e98062f51bdf026e50c9960e24684e551c4f2304 100755 (executable)
@@ -1,9 +1,9 @@
 #!/bin/sh
 #
-# Shell script to update PostgreSQL tables from version 1.38 to 1.39
+# Shell script to update PostgreSQL tables from version 1.36 to 1.38
 #
 echo " "
-echo "This script will update a Bacula PostgreSQL database from version 9 to 9"
+echo "This script will update a Bacula PostgreSQL database from version 8 to 9"
 echo "Depending on the size of your database,"
 echo "this script may take several minutes to run."
 echo " "
@@ -11,33 +11,115 @@ bindir=@SQL_BINDIR@
 
 if $bindir/psql -f - -d bacula $* <<END-OF-DATA
 
-ALTER TABLE media ADD COLUMN DeviceId integer;
-UPDATE media SET DeviceId=0;
-ALTER TABLE media ADD COLUMN MediaTypeId integer;
-UPDATE media SET MediaTypeId=0;
-ALTER TABLE media ADD COLUMN LocationId integer;
-UPDATE media SET LocationId=0;
-
-
-CREATE TABLE MAC (
-    JobId            serial      not null,
-    OriginalJobId     serial     not null,
-    JobType          char(1)     not null,
-    JobLevel         char(1)     not null,
-    SchedTime        timestamp   without time zone not null,
-    StartTime        timestamp   without time zone,
-    EndTime          timestamp   without time zone,
-    JobTDate         bigint      not null,
-    primary key (JobId)
-);
-
-CREATE TABLE Location (
-   LocationId SERIAL,
-   Location TEXT NOT NULL,
-   PRIMARY KEY(LocationId)
+ALTER TABLE media ADD COLUMN labeltype integer;
+UPDATE media SET labeltype=0;
+ALTER TABLE media ALTER COLUMN labeltype SET NOT NULL;
+ALTER TABLE media ADD COLUMN StorageId integer;
+UPDATE media SET StorageId=0;
+
+ALTER TABLE pool ADD COLUMN labeltype integer;
+UPDATE pool set labeltype=0;
+ALTER TABLE pool ALTER COLUMN labeltype SET NOT NULL;
+ALTER TABLE pool ADD COLUMN NextPoolId       integer;
+UPDATE pool SET NextPoolId=0;
+ALTER TABLE pool ADD COLUMN MigrationHighBytes BIGINT;
+UPDATE pool SET MigrationHighBytes=0;
+ALTER TABLE pool ADD COLUMN MigrationLowBytes  BIGINT;
+UPDATE pool SET MigrationLowBytes=0;
+ALTER TABLE pool ADD COLUMN MigrationTime      BIGINT;
+UPDATE pool SET MigrationTime=0;
+
+
+ALTER TABLE jobmedia ADD COLUMN Copy integer;
+UPDATE jobmedia SET Copy=0;
+ALTER TABLE jobmedia ADD COLUMN Stripe integer;
+UPDATE jobmedia SET Stripe=0;
+
+
+ALTER TABLE media ADD COLUMN volparts integer;
+UPDATE media SET volparts=0;
+ALTER TABLE media ALTER COLUMN volparts SET NOT NULL;
+
+CREATE TABLE MediaType (
+   MediaTypeId SERIAL,
+   MediaType TEXT NOT NULL,
+   ReadOnly INTEGER DEFAULT 0,
+   PRIMARY KEY(MediaTypeId)
    );
 
+CREATE TABLE Device (
+   DeviceId SERIAL,
+   Name TEXT NOT NULL,
+   MediaTypeId INTEGER NOT NULL,
+   StorageId INTEGER,
+   DevMounts INTEGER NOT NULL DEFAULT 0,
+   DevReadBytes BIGINT NOT NULL DEFAULT 0,
+   DevWriteBytes BIGINT NOT NULL DEFAULT 0,
+   DevReadBytesSinceCleaning BIGINT NOT NULL DEFAULT 0,
+   DevWriteBytesSinceCleaning BIGINT NOT NULL DEFAULT 0,
+   DevReadTime BIGINT NOT NULL DEFAULT 0,
+   DevWriteTime BIGINT NOT NULL DEFAULT 0,
+   DevReadTimeSinceCleaning BIGINT NOT NULL DEFAULT 0,
+   DevWriteTimeSinceCleaning BIGINT DEFAULT 0,
+   CleaningDate TIMESTAMP WITHOUT TIME ZONE,
+   CleaningPeriod BIGINT NOT NULL DEFAULT 0,
+   PRIMARY KEY(DeviceId)
+   );
+
+CREATE TABLE Storage (
+   StorageId SERIAL,
+   Name TEXT NOT NULL,
+   AutoChanger INTEGER DEFAULT 0,
+   PRIMARY KEY(StorageId)
+   );
+
+CREATE TABLE Status (
+   JobStatus CHAR(1) NOT NULL,
+   JobStatusLong TEXT, 
+   PRIMARY KEY (JobStatus)
+   );
+
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('C', 'Created, not yet running');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('R', 'Running');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('B', 'Blocked');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('T', 'Completed successfully');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('E', 'Terminated with errors');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('e', 'Non-fatal error');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('f', 'Fatal error');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('D', 'Verify found differences');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('A', 'Canceled by user');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('F', 'Waiting for Client');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('S', 'Waiting for Storage daemon');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('m', 'Waiting for new media');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('M', 'Waiting for media mount');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('s', 'Waiting for storage resource');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('j', 'Waiting for job resource');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('c', 'Waiting for client resource');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('d', 'Waiting on maximum jobs');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('t', 'Waiting on start time');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('p', 'Waiting on higher priority jobs');
+
 
+DELETE FROM version;
 INSERT INTO version (versionId) VALUES (9);
 
 vacuum;
index 019132840641eaa05f6ff5548daabd4d5b74b0ad..37be54689a249a16d939eeccc6f783000e4a1e8d 100755 (executable)
@@ -1,9 +1,9 @@
 #!/bin/sh
 #
-# shell script to update SQLite from version 1.38 to 1.39
+# shell script to update SQLite from version 1.36 to 1.38
 #
 echo " "
-echo "This script will update a Bacula SQLite database from version 9 to 9"
+echo "This script will update a Bacula SQLite database from version 8 to 9"
 echo "Depending on the size of your database,"
 echo "this script may take several minutes to run."
 echo " "
@@ -14,14 +14,12 @@ sqlite=@DB_NAME@
 
 ${bindir}/${sqlite} $* bacula.db <<END-OF-DATA
 BEGIN TRANSACTION;
-
 CREATE TEMPORARY TABLE Media_backup (
    MediaId INTEGER UNSIGNED AUTOINCREMENT,
    VolumeName VARCHAR(128) NOT NULL,
    Slot INTEGER DEFAULT 0,
    PoolId INTEGER UNSIGNED REFERENCES Pool NOT NULL,
    MediaType VARCHAR(128) NOT NULL,
-   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType NOT NULL,
    LabelType TINYINT DEFAULT 0,
    FirstWritten DATETIME DEFAULT 0,
    LastWritten DATETIME DEFAULT 0,
@@ -44,26 +42,23 @@ CREATE TEMPORARY TABLE Media_backup (
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    StorageId INTEGER UNSIGNED REFERENCES Storage,
-   DeviceId INTEGER UNSIGNED REFERENCES Device,
    MediaAddressing TINYINT DEFAULT 0,
    VolReadTime BIGINT UNSIGNED DEFAULT 0,
    VolWriteTime BIGINT UNSIGNED DEFAULT 0,
    EndFile INTEGER UNSIGNED DEFAULT 0,
    EndBlock INTEGER UNSIGNED DEFAULT 0,
-   LocationId INTEGER UNSIGNED REFERENCES Location,
    PRIMARY KEY(MediaId)
    );
 
 INSERT INTO Media_backup SELECT 
    MediaId, VolumeName, Slot, PoolId,
-   MediaType, LabelType, 0, FirstWritten, LastWritten,
+   MediaType, 0, FirstWritten, LastWritten,
    LabelDate, VolJobs, VolFiles, VolBlocks,
-   VolMounts, VolBytes, VolParts, VolErrors, VolWrites,
+   VolMounts, VolBytes, 0, VolErrors, VolWrites,
    VolCapacityBytes, VolStatus, Recycle,
    VolRetention, VolUseDuration, MaxVolJobs,
-   MaxVolFiles, MaxVolBytes, InChanger, 
-   StorageId, 0, MediaAddressing,
-   VolReadTime, VolWriteTime, EndFile, EndBlock, 0
+   MaxVolFiles, MaxVolBytes, InChanger, 0, MediaAddressing,
+   VolReadTime, VolWriteTime, EndFile, EndBlock
    FROM Media;
 
 
@@ -75,7 +70,6 @@ CREATE TABLE Media (
    Slot INTEGER DEFAULT 0,
    PoolId INTEGER UNSIGNED REFERENCES Pool NOT NULL,
    MediaType VARCHAR(128) NOT NULL,
-   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType NOT NULL,
    LabelType TINYINT DEFAULT 0,
    FirstWritten DATETIME DEFAULT 0,
    LastWritten DATETIME DEFAULT 0,
@@ -98,51 +92,243 @@ CREATE TABLE Media (
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    StorageId INTEGER UNSIGNED REFERENCES Storage,
-   DeviceId INTEGER UNSIGNED REFERENCES Device,
    MediaAddressing TINYINT DEFAULT 0,
    VolReadTime BIGINT UNSIGNED DEFAULT 0,
    VolWriteTime BIGINT UNSIGNED DEFAULT 0,
    EndFile INTEGER UNSIGNED DEFAULT 0,
    EndBlock INTEGER UNSIGNED DEFAULT 0,
-   LocationId INTEGER UNSIGNED REFERENCES Location,
    PRIMARY KEY(MediaId)
    );
 
 INSERT INTO Media (
    MediaId, VolumeName, Slot, PoolId,
-   MediaType, MediaTypeId, LabelType, FirstWritten, LastWritten,
+   MediaType, LabelType, FirstWritten, LastWritten,
    LabelDate, VolJobs, VolFiles, VolBlocks,
    VolMounts, VolBytes, VolParts, VolErrors, VolWrites,
    VolCapacityBytes, VolStatus, Recycle,
    VolRetention, VolUseDuration, MaxVolJobs,
    MaxVolFiles, MaxVolBytes,
-   InChanger, StorageId, DeviceId, MediaAddressing,
+   InChanger, StorageId, MediaAddressing,
    VolReadTime, VolWriteTime,      
-   EndFile, EndBlock, LocationId)
+   EndFile, EndBlock)
    SELECT * FROM Media_backup;
 
 DROP TABLE Media_backup;
 CREATE INDEX inx8 ON Media (PoolId);
 
 
-CREATE TABLE MAC (
-   JobId INTEGER,
-   OriginalJobId INTEGER,
-   JobType CHAR NOT NULL,
-   JobLevel CHAR NOT NULL,
-   SchedTime DATETIME NOT NULL,
-   StartTime DATETIME DEFAULT 0,
-   EndTime DATETIME DEFAULT 0,
-   JobTDate BIGINT UNSIGNED DEFAULT 0,
-   PRIMARY KEY(JobId)
+CREATE TEMPORARY TABLE JobMedia_backup (
+   JobMediaId INTEGER,
+   JobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
+   MediaId INTEGER UNSIGNED REFERENCES Media NOT NULL,
+   FirstIndex INTEGER UNSIGNED NOT NULL,
+   LastIndex INTEGER UNSIGNED NOT NULL,
+   StartFile INTEGER UNSIGNED DEFAULT 0,
+   EndFile INTEGER UNSIGNED DEFAULT 0,
+   StartBlock INTEGER UNSIGNED DEFAULT 0,
+   EndBlock INTEGER UNSIGNED DEFAULT 0,
+   VolIndex INTEGER UNSIGNED DEFAULT 0,
+   Copy     INTEGER UNSIGNED DEFAULT 0,
+   Stripe   INTEGER UNSIGNED DEFAULT 0,
+   PRIMARY KEY(JobMediaId) 
+   );
+
+INSERT INTO JobMedia_backup SELECT
+   JobMediaId, JobId, MediaId,
+   FirstIndex, LastIndex, StartFile,
+   EndFile, StartBlock, EndBlock,
+   VolIndex, 0, 0 
+   FROM JobMedia;
+
+DROP TABLE JobMedia;
+
+CREATE TABLE JobMedia (
+   JobMediaId INTEGER,
+   JobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
+   MediaId INTEGER UNSIGNED REFERENCES Media NOT NULL,
+   FirstIndex INTEGER UNSIGNED NOT NULL,
+   LastIndex INTEGER UNSIGNED NOT NULL,
+   StartFile INTEGER UNSIGNED DEFAULT 0,
+   EndFile INTEGER UNSIGNED DEFAULT 0,
+   StartBlock INTEGER UNSIGNED DEFAULT 0,
+   EndBlock INTEGER UNSIGNED DEFAULT 0,
+   VolIndex INTEGER UNSIGNED DEFAULT 0,
+   Copy     INTEGER UNSIGNED DEFAULT 0,
+   Stripe   INTEGER UNSIGNED DEFAULT 0,
+   PRIMARY KEY(JobMediaId) 
+   );
+
+INSERT INTO JobMedia (
+   JobMediaId, JobId, MediaId,
+   FirstIndex, LastIndex, StartFile,
+   EndFile, StartBlock, EndBlock,
+   VolIndex, Copy, Stripe)
+   SELECT * FROM JobMedia_backup;
+
+DROP TABLE JobMedia_backup;
+
+CREATE TEMPORARY TABLE Pool_backup (
+   PoolId INTEGER,
+   Name VARCHAR(128) NOT NULL,
+   NumVols INTEGER UNSIGNED DEFAULT 0,
+   MaxVols INTEGER UNSIGNED DEFAULT 0,
+   UseOnce TINYINT DEFAULT 0,
+   UseCatalog TINYINT DEFAULT 1,
+   AcceptAnyVolume TINYINT DEFAULT 0,
+   VolRetention BIGINT UNSIGNED DEFAULT 0,
+   VolUseDuration BIGINT UNSIGNED DEFAULT 0,
+   MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
+   MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
+   MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
+   AutoPrune TINYINT DEFAULT 0,
+   Recycle TINYINT DEFAULT 0,
+   PoolType VARCHAR(20) NOT NULL,
+   LabelType TINYINT DEFAULT 0,
+   LabelFormat VARCHAR(128) NOT NULL,
+   Enabled TINYINT DEFAULT 1,
+   ScratchPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   RecyclePoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   NextPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   MigrationHighBytes BIGINT UNSIGNED DEFAULT 0,
+   MigrationLowBytes BIGINT UNSIGNED DEFAULT 0,
+   MigrationTime BIGINT UNSIGNED DEFAULT 0,
+   UNIQUE (Name),
+   PRIMARY KEY (PoolId)
+   );
+
+INSERT INTO Pool_backup SELECT 
+   PoolId, Name, NumVols, MaxVols,
+   UseOnce, UseCatalog, AcceptAnyVolume,
+   VolRetention, VolUseDuration, MaxVolJobs,
+   MaxVolFiles, MaxVolBytes, AutoPrune,
+   Recycle, PoolType, 0, LabelFormat,
+   Enabled, ScratchPoolId, RecyclePoolId,
+   0, 0, 0, 0
+   FROM Pool;
+
+DROP TABLE Pool;
+
+CREATE TABLE Pool (
+   PoolId INTEGER,
+   Name VARCHAR(128) NOT NULL,
+   NumVols INTEGER UNSIGNED DEFAULT 0,
+   MaxVols INTEGER UNSIGNED DEFAULT 0,
+   UseOnce TINYINT DEFAULT 0,
+   UseCatalog TINYINT DEFAULT 1,
+   AcceptAnyVolume TINYINT DEFAULT 0,
+   VolRetention BIGINT UNSIGNED DEFAULT 0,
+   VolUseDuration BIGINT UNSIGNED DEFAULT 0,
+   MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
+   MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
+   MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
+   AutoPrune TINYINT DEFAULT 0,
+   Recycle TINYINT DEFAULT 0,
+   PoolType VARCHAR(20) NOT NULL,
+   LabelType TINYINT DEFAULT 0,
+   LabelFormat VARCHAR(128) NOT NULL,
+   Enabled TINYINT DEFAULT 1,
+   ScratchPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   RecyclePoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   NextPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   MigrationHighBytes BIGINT UNSIGNED DEFAULT 0,
+   MigrationLowBytes BIGINT UNSIGNED DEFAULT 0,
+   MigrationTime BIGINT UNSIGNED DEFAULT 0,
+   UNIQUE (Name),
+   PRIMARY KEY (PoolId)
    );
 
-CREATE TABLE Location (
-   LocationId INTEGER,
-   Location VARCHAR(128) NOT NULL,
-   PRIMARY KEY(LocationId)
+INSERT INTO Pool (
+   PoolId, Name, NumVols, MaxVols,
+   UseOnce, UseCatalog, AcceptAnyVolume,
+   VolRetention, VolUseDuration, MaxVolJobs,
+   MaxVolFiles, MaxVolBytes, AutoPrune,
+   Recycle, PoolType, LabelType, LabelFormat,
+   Enabled, ScratchPoolId, RecyclePoolId,
+   NextPoolId, MigrationHighBytes, 
+   MigrationLowBytes, MigrationTime )
+   SELECT * FROM Pool_backup;
+
+DROP TABLE Pool_backup;
+
+CREATE TABLE MediaType (
+   MediaTypeId INTEGER,
+   MediaType VARCHAR(128) NOT NULL,
+   ReadOnly TINYINT DEFAULT 0,
+   PRIMARY KEY(MediaTypeId)
+   );
+
+CREATE TABLE Storage (
+   StorageId INTEGER,
+   Name VARCHAR(128) NOT NULL,
+   AutoChanger TINYINT DEFAULT 0,
+   PRIMARY KEY(StorageId)
+   );
+
+CREATE TABLE Device (
+   DeviceId INTEGER,
+   Name VARCHAR(128) NOT NULL,
+   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType NOT NULL,
+   StorageId INTEGER UNSIGNED REFERENCES Storage,
+   DevMounts INTEGER UNSIGNED DEFAULT 0,
+   DevReadBytes BIGINT UNSIGNED DEFAULT 0,
+   DevWriteBytes BIGINT UNSIGNED DEFAULT 0,
+   DevReadBytesSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   DevWriteBytesSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   DevReadTime BIGINT UNSIGNED DEFAULT 0,
+   DevWriteTime BIGINT UNSIGNED DEFAULT 0,
+   DevReadTimeSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   DevWriteTimeSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   CleaningDate DATETIME DEFAULT 0,
+   CleaningPeriod BIGINT UNSIGNED DEFAULT 0,
+   PRIMARY KEY(DeviceId)
+   );
+
+
+CREATE TABLE Status (
+   JobStatus CHAR(1) NOT NULL,
+   JobStatusLong BLOB, 
+   PRIMARY KEY (JobStatus)
    );
+
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('C', 'Created, not yet running');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('R', 'Running');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('B', 'Blocked');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('T', 'Completed successfully');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('E', 'Terminated with errors');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('e', 'Non-fatal error');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('f', 'Fatal error');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('D', 'Verify found differences');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('A', 'Canceled by user');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('F', 'Waiting for Client');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('S', 'Waiting for Storage daemon');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('m', 'Waiting for new media');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('M', 'Waiting for media mount');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('s', 'Waiting for storage resource');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('j', 'Waiting for job resource');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('c', 'Waiting for client resource');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('d', 'Waiting on maximum jobs');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('t', 'Waiting on start time');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('p', 'Waiting on higher priority jobs');
+
 
 DELETE FROM Version;
 INSERT INTO Version (VersionId) VALUES (9);
index 019132840641eaa05f6ff5548daabd4d5b74b0ad..37be54689a249a16d939eeccc6f783000e4a1e8d 100755 (executable)
@@ -1,9 +1,9 @@
 #!/bin/sh
 #
-# shell script to update SQLite from version 1.38 to 1.39
+# shell script to update SQLite from version 1.36 to 1.38
 #
 echo " "
-echo "This script will update a Bacula SQLite database from version 9 to 9"
+echo "This script will update a Bacula SQLite database from version 8 to 9"
 echo "Depending on the size of your database,"
 echo "this script may take several minutes to run."
 echo " "
@@ -14,14 +14,12 @@ sqlite=@DB_NAME@
 
 ${bindir}/${sqlite} $* bacula.db <<END-OF-DATA
 BEGIN TRANSACTION;
-
 CREATE TEMPORARY TABLE Media_backup (
    MediaId INTEGER UNSIGNED AUTOINCREMENT,
    VolumeName VARCHAR(128) NOT NULL,
    Slot INTEGER DEFAULT 0,
    PoolId INTEGER UNSIGNED REFERENCES Pool NOT NULL,
    MediaType VARCHAR(128) NOT NULL,
-   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType NOT NULL,
    LabelType TINYINT DEFAULT 0,
    FirstWritten DATETIME DEFAULT 0,
    LastWritten DATETIME DEFAULT 0,
@@ -44,26 +42,23 @@ CREATE TEMPORARY TABLE Media_backup (
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    StorageId INTEGER UNSIGNED REFERENCES Storage,
-   DeviceId INTEGER UNSIGNED REFERENCES Device,
    MediaAddressing TINYINT DEFAULT 0,
    VolReadTime BIGINT UNSIGNED DEFAULT 0,
    VolWriteTime BIGINT UNSIGNED DEFAULT 0,
    EndFile INTEGER UNSIGNED DEFAULT 0,
    EndBlock INTEGER UNSIGNED DEFAULT 0,
-   LocationId INTEGER UNSIGNED REFERENCES Location,
    PRIMARY KEY(MediaId)
    );
 
 INSERT INTO Media_backup SELECT 
    MediaId, VolumeName, Slot, PoolId,
-   MediaType, LabelType, 0, FirstWritten, LastWritten,
+   MediaType, 0, FirstWritten, LastWritten,
    LabelDate, VolJobs, VolFiles, VolBlocks,
-   VolMounts, VolBytes, VolParts, VolErrors, VolWrites,
+   VolMounts, VolBytes, 0, VolErrors, VolWrites,
    VolCapacityBytes, VolStatus, Recycle,
    VolRetention, VolUseDuration, MaxVolJobs,
-   MaxVolFiles, MaxVolBytes, InChanger, 
-   StorageId, 0, MediaAddressing,
-   VolReadTime, VolWriteTime, EndFile, EndBlock, 0
+   MaxVolFiles, MaxVolBytes, InChanger, 0, MediaAddressing,
+   VolReadTime, VolWriteTime, EndFile, EndBlock
    FROM Media;
 
 
@@ -75,7 +70,6 @@ CREATE TABLE Media (
    Slot INTEGER DEFAULT 0,
    PoolId INTEGER UNSIGNED REFERENCES Pool NOT NULL,
    MediaType VARCHAR(128) NOT NULL,
-   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType NOT NULL,
    LabelType TINYINT DEFAULT 0,
    FirstWritten DATETIME DEFAULT 0,
    LastWritten DATETIME DEFAULT 0,
@@ -98,51 +92,243 @@ CREATE TABLE Media (
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    StorageId INTEGER UNSIGNED REFERENCES Storage,
-   DeviceId INTEGER UNSIGNED REFERENCES Device,
    MediaAddressing TINYINT DEFAULT 0,
    VolReadTime BIGINT UNSIGNED DEFAULT 0,
    VolWriteTime BIGINT UNSIGNED DEFAULT 0,
    EndFile INTEGER UNSIGNED DEFAULT 0,
    EndBlock INTEGER UNSIGNED DEFAULT 0,
-   LocationId INTEGER UNSIGNED REFERENCES Location,
    PRIMARY KEY(MediaId)
    );
 
 INSERT INTO Media (
    MediaId, VolumeName, Slot, PoolId,
-   MediaType, MediaTypeId, LabelType, FirstWritten, LastWritten,
+   MediaType, LabelType, FirstWritten, LastWritten,
    LabelDate, VolJobs, VolFiles, VolBlocks,
    VolMounts, VolBytes, VolParts, VolErrors, VolWrites,
    VolCapacityBytes, VolStatus, Recycle,
    VolRetention, VolUseDuration, MaxVolJobs,
    MaxVolFiles, MaxVolBytes,
-   InChanger, StorageId, DeviceId, MediaAddressing,
+   InChanger, StorageId, MediaAddressing,
    VolReadTime, VolWriteTime,      
-   EndFile, EndBlock, LocationId)
+   EndFile, EndBlock)
    SELECT * FROM Media_backup;
 
 DROP TABLE Media_backup;
 CREATE INDEX inx8 ON Media (PoolId);
 
 
-CREATE TABLE MAC (
-   JobId INTEGER,
-   OriginalJobId INTEGER,
-   JobType CHAR NOT NULL,
-   JobLevel CHAR NOT NULL,
-   SchedTime DATETIME NOT NULL,
-   StartTime DATETIME DEFAULT 0,
-   EndTime DATETIME DEFAULT 0,
-   JobTDate BIGINT UNSIGNED DEFAULT 0,
-   PRIMARY KEY(JobId)
+CREATE TEMPORARY TABLE JobMedia_backup (
+   JobMediaId INTEGER,
+   JobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
+   MediaId INTEGER UNSIGNED REFERENCES Media NOT NULL,
+   FirstIndex INTEGER UNSIGNED NOT NULL,
+   LastIndex INTEGER UNSIGNED NOT NULL,
+   StartFile INTEGER UNSIGNED DEFAULT 0,
+   EndFile INTEGER UNSIGNED DEFAULT 0,
+   StartBlock INTEGER UNSIGNED DEFAULT 0,
+   EndBlock INTEGER UNSIGNED DEFAULT 0,
+   VolIndex INTEGER UNSIGNED DEFAULT 0,
+   Copy     INTEGER UNSIGNED DEFAULT 0,
+   Stripe   INTEGER UNSIGNED DEFAULT 0,
+   PRIMARY KEY(JobMediaId) 
+   );
+
+INSERT INTO JobMedia_backup SELECT
+   JobMediaId, JobId, MediaId,
+   FirstIndex, LastIndex, StartFile,
+   EndFile, StartBlock, EndBlock,
+   VolIndex, 0, 0 
+   FROM JobMedia;
+
+DROP TABLE JobMedia;
+
+CREATE TABLE JobMedia (
+   JobMediaId INTEGER,
+   JobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
+   MediaId INTEGER UNSIGNED REFERENCES Media NOT NULL,
+   FirstIndex INTEGER UNSIGNED NOT NULL,
+   LastIndex INTEGER UNSIGNED NOT NULL,
+   StartFile INTEGER UNSIGNED DEFAULT 0,
+   EndFile INTEGER UNSIGNED DEFAULT 0,
+   StartBlock INTEGER UNSIGNED DEFAULT 0,
+   EndBlock INTEGER UNSIGNED DEFAULT 0,
+   VolIndex INTEGER UNSIGNED DEFAULT 0,
+   Copy     INTEGER UNSIGNED DEFAULT 0,
+   Stripe   INTEGER UNSIGNED DEFAULT 0,
+   PRIMARY KEY(JobMediaId) 
+   );
+
+INSERT INTO JobMedia (
+   JobMediaId, JobId, MediaId,
+   FirstIndex, LastIndex, StartFile,
+   EndFile, StartBlock, EndBlock,
+   VolIndex, Copy, Stripe)
+   SELECT * FROM JobMedia_backup;
+
+DROP TABLE JobMedia_backup;
+
+CREATE TEMPORARY TABLE Pool_backup (
+   PoolId INTEGER,
+   Name VARCHAR(128) NOT NULL,
+   NumVols INTEGER UNSIGNED DEFAULT 0,
+   MaxVols INTEGER UNSIGNED DEFAULT 0,
+   UseOnce TINYINT DEFAULT 0,
+   UseCatalog TINYINT DEFAULT 1,
+   AcceptAnyVolume TINYINT DEFAULT 0,
+   VolRetention BIGINT UNSIGNED DEFAULT 0,
+   VolUseDuration BIGINT UNSIGNED DEFAULT 0,
+   MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
+   MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
+   MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
+   AutoPrune TINYINT DEFAULT 0,
+   Recycle TINYINT DEFAULT 0,
+   PoolType VARCHAR(20) NOT NULL,
+   LabelType TINYINT DEFAULT 0,
+   LabelFormat VARCHAR(128) NOT NULL,
+   Enabled TINYINT DEFAULT 1,
+   ScratchPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   RecyclePoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   NextPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   MigrationHighBytes BIGINT UNSIGNED DEFAULT 0,
+   MigrationLowBytes BIGINT UNSIGNED DEFAULT 0,
+   MigrationTime BIGINT UNSIGNED DEFAULT 0,
+   UNIQUE (Name),
+   PRIMARY KEY (PoolId)
+   );
+
+INSERT INTO Pool_backup SELECT 
+   PoolId, Name, NumVols, MaxVols,
+   UseOnce, UseCatalog, AcceptAnyVolume,
+   VolRetention, VolUseDuration, MaxVolJobs,
+   MaxVolFiles, MaxVolBytes, AutoPrune,
+   Recycle, PoolType, 0, LabelFormat,
+   Enabled, ScratchPoolId, RecyclePoolId,
+   0, 0, 0, 0
+   FROM Pool;
+
+DROP TABLE Pool;
+
+CREATE TABLE Pool (
+   PoolId INTEGER,
+   Name VARCHAR(128) NOT NULL,
+   NumVols INTEGER UNSIGNED DEFAULT 0,
+   MaxVols INTEGER UNSIGNED DEFAULT 0,
+   UseOnce TINYINT DEFAULT 0,
+   UseCatalog TINYINT DEFAULT 1,
+   AcceptAnyVolume TINYINT DEFAULT 0,
+   VolRetention BIGINT UNSIGNED DEFAULT 0,
+   VolUseDuration BIGINT UNSIGNED DEFAULT 0,
+   MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
+   MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
+   MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
+   AutoPrune TINYINT DEFAULT 0,
+   Recycle TINYINT DEFAULT 0,
+   PoolType VARCHAR(20) NOT NULL,
+   LabelType TINYINT DEFAULT 0,
+   LabelFormat VARCHAR(128) NOT NULL,
+   Enabled TINYINT DEFAULT 1,
+   ScratchPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   RecyclePoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   NextPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
+   MigrationHighBytes BIGINT UNSIGNED DEFAULT 0,
+   MigrationLowBytes BIGINT UNSIGNED DEFAULT 0,
+   MigrationTime BIGINT UNSIGNED DEFAULT 0,
+   UNIQUE (Name),
+   PRIMARY KEY (PoolId)
    );
 
-CREATE TABLE Location (
-   LocationId INTEGER,
-   Location VARCHAR(128) NOT NULL,
-   PRIMARY KEY(LocationId)
+INSERT INTO Pool (
+   PoolId, Name, NumVols, MaxVols,
+   UseOnce, UseCatalog, AcceptAnyVolume,
+   VolRetention, VolUseDuration, MaxVolJobs,
+   MaxVolFiles, MaxVolBytes, AutoPrune,
+   Recycle, PoolType, LabelType, LabelFormat,
+   Enabled, ScratchPoolId, RecyclePoolId,
+   NextPoolId, MigrationHighBytes, 
+   MigrationLowBytes, MigrationTime )
+   SELECT * FROM Pool_backup;
+
+DROP TABLE Pool_backup;
+
+CREATE TABLE MediaType (
+   MediaTypeId INTEGER,
+   MediaType VARCHAR(128) NOT NULL,
+   ReadOnly TINYINT DEFAULT 0,
+   PRIMARY KEY(MediaTypeId)
+   );
+
+CREATE TABLE Storage (
+   StorageId INTEGER,
+   Name VARCHAR(128) NOT NULL,
+   AutoChanger TINYINT DEFAULT 0,
+   PRIMARY KEY(StorageId)
+   );
+
+CREATE TABLE Device (
+   DeviceId INTEGER,
+   Name VARCHAR(128) NOT NULL,
+   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType NOT NULL,
+   StorageId INTEGER UNSIGNED REFERENCES Storage,
+   DevMounts INTEGER UNSIGNED DEFAULT 0,
+   DevReadBytes BIGINT UNSIGNED DEFAULT 0,
+   DevWriteBytes BIGINT UNSIGNED DEFAULT 0,
+   DevReadBytesSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   DevWriteBytesSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   DevReadTime BIGINT UNSIGNED DEFAULT 0,
+   DevWriteTime BIGINT UNSIGNED DEFAULT 0,
+   DevReadTimeSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   DevWriteTimeSinceCleaning BIGINT UNSIGNED DEFAULT 0,
+   CleaningDate DATETIME DEFAULT 0,
+   CleaningPeriod BIGINT UNSIGNED DEFAULT 0,
+   PRIMARY KEY(DeviceId)
+   );
+
+
+CREATE TABLE Status (
+   JobStatus CHAR(1) NOT NULL,
+   JobStatusLong BLOB, 
+   PRIMARY KEY (JobStatus)
    );
+
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('C', 'Created, not yet running');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('R', 'Running');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('B', 'Blocked');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('T', 'Completed successfully');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('E', 'Terminated with errors');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('e', 'Non-fatal error');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('f', 'Fatal error');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('D', 'Verify found differences');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('A', 'Canceled by user');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('F', 'Waiting for Client');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('S', 'Waiting for Storage daemon');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('m', 'Waiting for new media');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('M', 'Waiting for media mount');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('s', 'Waiting for storage resource');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('j', 'Waiting for job resource');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('c', 'Waiting for client resource');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('d', 'Waiting on maximum jobs');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('t', 'Waiting on start time');
+INSERT INTO Status (JobStatus,JobStatusLong) VALUES
+   ('p', 'Waiting on higher priority jobs');
+
 
 DELETE FROM Version;
 INSERT INTO Version (VersionId) VALUES (9);
index 3550f08e8a1ba48d92c346326785f234ce92f262..2b96aaefd56d6db429649ab9f9cbb69e8076135e 100644 (file)
@@ -1,14 +1,19 @@
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   Copyright (C) 2000-2006 Kern Sibbald
 
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the Lesser GNU General Public License
-   version 2 as amended with additional clauses defined in the
-   file LICENSE in the main source directory.
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This library 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.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA 02111-1307, USA.
 
  */
index df679314bf9182dee5c0708dea04f6bc591b4655..1ada11c45cd87f8cbe645efb3c644d0ed5337863 100644 (file)
@@ -121,7 +121,7 @@ depend:
        @$(MV) Makefile Makefile.bak
        @$(SED) "/^# DO NOT DELETE:/,$$ d" Makefile.bak > Makefile
        @$(ECHO) "# DO NOT DELETE: nice dependency list follows" >> Makefile
-       @$(CXX) -S -M $(CPPFLAGS) $(CONS_INC) -I$(srcdir) -I$(basedir) *.c >> Makefile
+       @$(CXX) -S -M $(CPPFLAGS) $(CONS_INC) $(OPENSSL_INC) -I$(srcdir) -I$(basedir) *.c >> Makefile
        @if test -f Makefile ; then \
            $(RMF) Makefile.bak; \
        else \
index 3a9dfe14aa8ef21b02ecc9c342c0e4d6e67a597e..9fc5c4955b8883eb76316dd00bcc34be5e02acee 100755 (executable)
@@ -9,7 +9,7 @@
 
 */
 /*
-   Copyright (C) 1981-2005 Kern Sibbald
+   Copyright (C) 1981-2006 Kern Sibbald
              Yes, that is 1981 no error.
 
    This program is free software; you can redistribute it and/or
@@ -961,12 +961,8 @@ static void rawmode(FILE *input)
    /* Defaults, the main program can override these */
    signal(SIGQUIT, SIG_IGN);
    signal(SIGHUP, SIG_IGN);
-// signal(SIGSTOP, SIG_IGN);
    signal(SIGINT, sigintcatcher);
    signal(SIGWINCH, SIG_IGN);
-   signal(SIGQUIT, SIG_IGN);
-// signal(SIGCHLD, SIG_IGN);
-// signal(SIGTSTP, SIG_IGN);
 
    if (!termtype) {
       printf("Cannot get terminal type.\n");
index 7611e9008e7b42b5097bf5e99e5f8a05bc498793..9bea604bd5f126bb26c5a0cce5137dc92818e858 100644 (file)
@@ -396,8 +396,8 @@ int main(int argc, char *argv[])
 
    parse_config(configfile);
 
-   if (init_crypto() != 0) {
-      Emsg0(M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
+   if (init_tls() != 0) {
+      Emsg0(M_ERROR_TERM, 0, _("TLS library initialization failed.\n"));
    }
 
    if (!check_resources()) {
@@ -549,7 +549,7 @@ static void terminate_console(int sig)
       exit(1);
    }
    already_here = true;
-   cleanup_crypto();
+   cleanup_tls();
    free_pool_memory(args);
    con_term();
    (void)WSACleanup();               /* Cleanup Windows sockets */
index 10dae2d3052b4da2729c950d847ddf5966617a88..0ef206407a25d0ecd39f47bb05c6adc623111c36 100644 (file)
@@ -76,8 +76,8 @@ static RES_ITEM cons_items[] = {
    {"rcfile",         store_dir,      ITEM(res_cons.rc_file), 0, 0, 0},
    {"historyfile",    store_dir,      ITEM(res_cons.hist_file), 0, 0, 0},
    {"password",       store_password, ITEM(res_cons.password), 0, ITEM_REQUIRED, 0},
-   {"tlsenable",      store_bit,     ITEM(res_cons.tls_enable), 1, 0, 0},
-   {"tlsrequire",     store_bit,     ITEM(res_cons.tls_require), 1, 0, 0},
+   {"tlsenable",      store_yesno,     ITEM(res_cons.tls_enable), 1, 0, 0},
+   {"tlsrequire",     store_yesno,     ITEM(res_cons.tls_require), 1, 0, 0},
    {"tlscacertificatefile", store_dir, ITEM(res_cons.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir", store_dir,  ITEM(res_cons.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate", store_dir,       ITEM(res_cons.tls_certfile), 0, 0, 0},
@@ -93,8 +93,8 @@ static RES_ITEM dir_items[] = {
    {"dirport",        store_int,       ITEM(res_dir.DIRport),  0, ITEM_DEFAULT, 9101},
    {"address",        store_str,       ITEM(res_dir.address),  0, 0, 0},
    {"password",       store_password,  ITEM(res_dir.password), 0, ITEM_REQUIRED, 0},
-   {"tlsenable",      store_bit,     ITEM(res_dir.tls_enable), 1, 0, 0},
-   {"tlsrequire",     store_bit,     ITEM(res_dir.tls_require), 1, 0, 0},
+   {"tlsenable",      store_yesno,     ITEM(res_dir.tls_enable), 1, 0, 0},
+   {"tlsrequire",     store_yesno,     ITEM(res_dir.tls_require), 1, 0, 0},
    {"tlscacertificatefile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir", store_dir,  ITEM(res_dir.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate", store_dir,       ITEM(res_dir.tls_certfile), 0, 0, 0},
index c915357c07f9d2d8a08d89eab20d360818774457..c843426e46033edf91988a4b9135d7bf3feaa688 100644 (file)
   <property name="default_height">600</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
   <signal name="delete_event" handler="on_console_delete_event" last_modification_time="Tue, 16 Mar 2004 12:30:54 GMT"/>
 
   <child>
              <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
              <property name="toolbar_style">GTK_TOOLBAR_BOTH</property>
              <property name="tooltips">True</property>
+             <property name="show_arrow">True</property>
 
              <child>
-               <widget class="button" id="connect_button1">
+               <widget class="GtkToolButton" id="connect_button1">
                  <property name="visible">True</property>
                  <property name="tooltip" translatable="yes">Connect to Director</property>
                  <property name="label" translatable="yes">Connect</property>
                  <property name="use_underline">True</property>
-                 <property name="stock_pixmap">gtk-new</property>
+                 <property name="stock_id">gtk-disconnect</property>
+                 <property name="visible_horizontal">True</property>
+                 <property name="visible_vertical">True</property>
+                 <property name="is_important">False</property>
                  <signal name="clicked" handler="on_connect_button_clicked"/>
                </widget>
+               <packing>
+                 <property name="expand">False</property>
+                 <property name="homogeneous">True</property>
+               </packing>
              </child>
 
              <child>
-               <widget class="button" id="run_button1">
+               <widget class="GtkToolButton" id="run_button1">
                  <property name="visible">True</property>
                  <property name="tooltip" translatable="yes">Run a Job</property>
                  <property name="label" translatable="yes">Run</property>
                  <property name="use_underline">True</property>
-                 <property name="stock_pixmap">gtk-execute</property>
+                 <property name="stock_id">gtk-execute</property>
+                 <property name="visible_horizontal">True</property>
+                 <property name="visible_vertical">True</property>
+                 <property name="is_important">False</property>
                  <signal name="clicked" handler="on_run_button_clicked"/>
                </widget>
+               <packing>
+                 <property name="expand">False</property>
+                 <property name="homogeneous">True</property>
+               </packing>
              </child>
 
              <child>
-               <widget class="button" id="msgs_button">
+               <widget class="GtkToolButton" id="dir_button">
                  <property name="visible">True</property>
-                 <property name="tooltip" translatable="yes">Display Messages</property>
-                 <property name="label" translatable="yes">Msgs</property>
+                 <property name="label" translatable="yes">Dir Status</property>
                  <property name="use_underline">True</property>
-                 <property name="stock_pixmap">gtk-find</property>
-                 <signal name="clicked" handler="on_msgs_button_clicked"/>
+                 <property name="stock_id">gnome-stock-text-bulleted-list</property>
+                 <property name="visible_horizontal">True</property>
+                 <property name="visible_vertical">True</property>
+                 <property name="is_important">False</property>
+                 <signal name="clicked" handler="on_dir_button_clicked" last_modification_time="Sun, 23 Apr 2006 07:52:39 GMT"/>
                </widget>
+               <packing>
+                 <property name="expand">False</property>
+                 <property name="homogeneous">True</property>
+               </packing>
              </child>
 
              <child>
-               <widget class="button" id="restore_button">
+               <widget class="GtkToolButton" id="restore_button">
                  <property name="visible">True</property>
                  <property name="label" translatable="yes">Restore</property>
                  <property name="use_underline">True</property>
-                 <property name="stock_pixmap">gtk-revert-to-saved</property>
+                 <property name="stock_id">gtk-revert-to-saved</property>
+                 <property name="visible_horizontal">True</property>
+                 <property name="visible_vertical">True</property>
+                 <property name="is_important">False</property>
                  <signal name="clicked" handler="on_restore_button_clicked"/>
                </widget>
+               <packing>
+                 <property name="expand">False</property>
+                 <property name="homogeneous">True</property>
+               </packing>
              </child>
 
              <child>
-               <widget class="button" id="label_button">
+               <widget class="GtkToolButton" id="label_button">
                  <property name="visible">True</property>
                  <property name="label" translatable="yes">Label</property>
                  <property name="use_underline">True</property>
-                 <property name="stock_pixmap">gtk-save-as</property>
+                 <property name="stock_id">gtk-save-as</property>
+                 <property name="visible_horizontal">True</property>
+                 <property name="visible_vertical">True</property>
+                 <property name="is_important">False</property>
                  <signal name="clicked" handler="on_label_button_clicked"/>
                </widget>
+               <packing>
+                 <property name="expand">False</property>
+                 <property name="homogeneous">True</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkToolButton" id="msgs_button">
+                 <property name="visible">True</property>
+                 <property name="tooltip" translatable="yes">Display Messages</property>
+                 <property name="label" translatable="yes">Msgs</property>
+                 <property name="use_underline">True</property>
+                 <property name="stock_id">gtk-find</property>
+                 <property name="visible_horizontal">True</property>
+                 <property name="visible_vertical">True</property>
+                 <property name="is_important">False</property>
+                 <signal name="clicked" handler="on_msgs_button_clicked"/>
+               </widget>
+               <packing>
+                 <property name="expand">False</property>
+                 <property name="homogeneous">True</property>
+               </packing>
              </child>
            </widget>
          </child>
                <widget class="GtkTextView" id="text1">
                  <property name="visible">True</property>
                  <property name="editable">False</property>
+                 <property name="overwrite">False</property>
+                 <property name="accepts_tab">True</property>
                  <property name="justification">GTK_JUSTIFY_LEFT</property>
                  <property name="wrap_mode">GTK_WRAP_WORD</property>
                  <property name="cursor_visible">True</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="max_length">150</property>
                  <property name="text" translatable="yes"></property>
                  <property name="has_frame">True</property>
-                 <property name="invisible_char" translatable="yes">*</property>
+                 <property name="invisible_char">*</property>
                  <property name="activates_default">False</property>
                  <signal name="key_press_event" handler="on_entry1_key_press_event"/>
                  <signal name="key_release_event" handler="on_entry1_key_release_event"/>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                  </child>
                </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                  </child>
                </widget>
   <property name="modal">True</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
   <property name="has_separator">True</property>
 
   <child internal-child="vbox">
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="label">gtk-ok</property>
                  <property name="use_stock">True</property>
                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                 <property name="focus_on_click">True</property>
                  <signal name="clicked" handler="on_about_button_clicked"/>
                </widget>
                <packing>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="justify">GTK_JUSTIFY_LEFT</property>
                  <property name="wrap">False</property>
                  <property name="selectable">False</property>
-                 <property name="xalign">0.1</property>
+                 <property name="xalign">0.10000000149</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="justify">GTK_JUSTIFY_LEFT</property>
                  <property name="wrap">False</property>
                  <property name="selectable">False</property>
-                 <property name="xalign">0.0400001</property>
+                 <property name="xalign">0.0400000996888</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="justify">GTK_JUSTIFY_LEFT</property>
                  <property name="wrap">False</property>
                  <property name="selectable">False</property>
-                 <property name="xalign">0.15</property>
+                 <property name="xalign">0.15000000596</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
   <property name="modal">True</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
   <property name="has_separator">True</property>
 
   <child internal-child="vbox">
                  <property name="label">gtk-ok</property>
                  <property name="use_stock">True</property>
                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                 <property name="focus_on_click">True</property>
                  <signal name="clicked" handler="on_select_director_OK_clicked"/>
                </widget>
                <packing>
                  <property name="yalign">0.5</property>
                  <property name="xpad">2</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="label">gtk-cancel</property>
                  <property name="use_stock">True</property>
                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                 <property name="focus_on_click">True</property>
                  <signal name="clicked" handler="on_select_director_cancel_clicked"/>
                </widget>
                <packing>
              <property name="justify">GTK_JUSTIFY_CENTER</property>
              <property name="wrap">False</property>
              <property name="selectable">False</property>
-             <property name="xalign">0.48</property>
-             <property name="yalign">0.46</property>
+             <property name="xalign">0.479999989271</property>
+             <property name="yalign">0.460000008345</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
                  <property name="max_length">0</property>
                  <property name="text" translatable="yes"></property>
                  <property name="has_frame">True</property>
-                 <property name="invisible_char" translatable="yes">*</property>
+                 <property name="invisible_char">*</property>
                  <property name="activates_default">False</property>
                </widget>
              </child>
                          <property name="yalign">0.5</property>
                          <property name="xpad">0</property>
                          <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
                        </widget>
                      </child>
                    </widget>
   <property name="modal">False</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
   <property name="has_separator">True</property>
 
   <child internal-child="vbox">
                  <property name="label">gtk-ok</property>
                  <property name="use_stock">True</property>
                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                 <property name="focus_on_click">True</property>
                  <signal name="clicked" handler="on_run_ok_clicked"/>
                </widget>
              </child>
                  <property name="label">gtk-cancel</property>
                  <property name="use_stock">True</property>
                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                 <property name="focus_on_click">True</property>
                  <signal name="clicked" handler="on_run_cancel_clicked"/>
                </widget>
              </child>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">9</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">2</property>
                  <property name="yalign">0.5</property>
                  <property name="xscale">1</property>
                  <property name="yscale">1</property>
+                 <property name="top_padding">0</property>
+                 <property name="bottom_padding">0</property>
+                 <property name="left_padding">0</property>
+                 <property name="right_padding">0</property>
 
                  <child>
                    <widget class="GtkHBox" id="hbox28">
                              <property name="yalign">0.5</property>
                              <property name="xpad">0</property>
                              <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
                            </widget>
                            <packing>
                              <property name="padding">0</property>
                                  <property name="max_length">0</property>
                                  <property name="text" translatable="yes"></property>
                                  <property name="has_frame">True</property>
-                                 <property name="invisible_char" translatable="yes">*</property>
+                                 <property name="invisible_char">*</property>
                                  <property name="activates_default">False</property>
                                  <signal name="changed" handler="on_entry_job_changed"/>
                                </widget>
                                          <property name="yalign">0.5</property>
                                          <property name="xpad">0</property>
                                          <property name="ypad">0</property>
+                                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                         <property name="width_chars">-1</property>
+                                         <property name="single_line_mode">False</property>
+                                         <property name="angle">0</property>
                                        </widget>
                                      </child>
                                    </widget>
                              <property name="yalign">0.5</property>
                              <property name="xpad">0</property>
                              <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
                            </widget>
                            <packing>
                              <property name="padding">0</property>
                                  <property name="max_length">0</property>
                                  <property name="text" translatable="yes"></property>
                                  <property name="has_frame">True</property>
-                                 <property name="invisible_char" translatable="yes">*</property>
+                                 <property name="invisible_char">*</property>
                                  <property name="activates_default">False</property>
                                </widget>
                              </child>
                                          <property name="yalign">0.5</property>
                                          <property name="xpad">0</property>
                                          <property name="ypad">0</property>
+                                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                         <property name="width_chars">-1</property>
+                                         <property name="single_line_mode">False</property>
+                                         <property name="angle">0</property>
                                        </widget>
                                      </child>
                                    </widget>
                          <property name="yalign">0.5</property>
                          <property name="xpad">0</property>
                          <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
                        </widget>
                        <packing>
                          <property name="padding">30</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">123</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">100</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">120</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">120</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">120</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                      <property name="max_length">0</property>
                      <property name="text" translatable="yes"></property>
                      <property name="has_frame">True</property>
-                     <property name="invisible_char" translatable="yes">*</property>
+                     <property name="invisible_char">*</property>
                      <property name="activates_default">False</property>
                    </widget>
                    <packing>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">120</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="max_length">0</property>
                  <property name="text" translatable="yes"></property>
                  <property name="has_frame">True</property>
-                 <property name="invisible_char" translatable="yes">*</property>
+                 <property name="invisible_char">*</property>
                  <property name="activates_default">False</property>
                </widget>
                <packing>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">120</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="max_length">0</property>
                  <property name="text" translatable="yes"></property>
                  <property name="has_frame">True</property>
-                 <property name="invisible_char" translatable="yes">*</property>
+                 <property name="invisible_char">*</property>
                  <property name="activates_default">False</property>
                </widget>
                <packing>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">36</property>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
   <property name="default_height">450</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
   <signal name="delete_event" handler="on_restore_files_delete_event" last_modification_time="Tue, 16 Mar 2004 11:41:52 GMT"/>
 
   <child>
              <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
              <property name="toolbar_style">GTK_TOOLBAR_BOTH</property>
              <property name="tooltips">True</property>
+             <property name="show_arrow">True</property>
 
              <child>
-               <widget class="button" id="restore_up_button">
+               <widget class="GtkToolButton" id="restore_up_button">
                  <property name="visible">True</property>
-                 <property name="label">gtk-go-up</property>
-                 <property name="use_stock">True</property>
+                 <property name="stock_id">gtk-go-up</property>
+                 <property name="visible_horizontal">True</property>
+                 <property name="visible_vertical">True</property>
+                 <property name="is_important">False</property>
                  <signal name="clicked" handler="on_restore_up_button_clicked" last_modification_time="Tue, 16 Mar 2004 11:44:40 GMT"/>
                </widget>
+               <packing>
+                 <property name="expand">False</property>
+                 <property name="homogeneous">True</property>
+               </packing>
              </child>
 
              <child>
-               <widget class="button" id="restore_add_button">
+               <widget class="GtkToolButton" id="restore_add_button">
                  <property name="visible">True</property>
-                 <property name="label">gtk-add</property>
-                 <property name="use_stock">True</property>
+                 <property name="stock_id">gtk-add</property>
+                 <property name="visible_horizontal">True</property>
+                 <property name="visible_vertical">True</property>
+                 <property name="is_important">False</property>
                  <signal name="clicked" handler="on_restore_add_button_clicked" last_modification_time="Tue, 16 Mar 2004 11:44:49 GMT"/>
                </widget>
+               <packing>
+                 <property name="expand">False</property>
+                 <property name="homogeneous">True</property>
+               </packing>
              </child>
 
              <child>
-               <widget class="button" id="restore_remove_button">
+               <widget class="GtkToolButton" id="restore_remove_button">
                  <property name="visible">True</property>
-                 <property name="label">gtk-remove</property>
-                 <property name="use_stock">True</property>
+                 <property name="stock_id">gtk-remove</property>
+                 <property name="visible_horizontal">True</property>
+                 <property name="visible_vertical">True</property>
+                 <property name="is_important">False</property>
                  <signal name="clicked" handler="on_restore_remove_button_clicked" last_modification_time="Tue, 16 Mar 2004 11:45:02 GMT"/>
                </widget>
+               <packing>
+                 <property name="expand">False</property>
+                 <property name="homogeneous">True</property>
+               </packing>
              </child>
 
              <child>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
              <property name="max_length">0</property>
              <property name="text" translatable="yes"></property>
              <property name="has_frame">True</property>
-             <property name="invisible_char" translatable="yes">*</property>
+             <property name="invisible_char">*</property>
              <property name="activates_default">False</property>
            </widget>
            <packing>
              <property name="justify">GTK_JUSTIFY_LEFT</property>
              <property name="wrap">False</property>
              <property name="selectable">False</property>
-             <property name="xalign">0.02</property>
+             <property name="xalign">0.019999999553</property>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
              <property name="label">gtk-ok</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <signal name="clicked" handler="on_restore_select_ok_clicked" last_modification_time="Tue, 16 Mar 2004 11:52:07 GMT"/>
            </widget>
            <packing>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
              <property name="label">gtk-cancel</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <signal name="clicked" handler="on_restore_select_cancel_clicked" last_modification_time="Tue, 16 Mar 2004 11:52:22 GMT"/>
            </widget>
            <packing>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">8</property>
   <property name="modal">True</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
   <property name="has_separator">True</property>
 
   <child internal-child="vbox">
                  <property name="label">gtk-ok</property>
                  <property name="use_stock">True</property>
                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                 <property name="focus_on_click">True</property>
                  <signal name="clicked" handler="on_label_ok_clicked"/>
                </widget>
              </child>
                  <property name="label">gtk-cancel</property>
                  <property name="use_stock">True</property>
                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                 <property name="focus_on_click">True</property>
                  <signal name="clicked" handler="on_label_cancel_clicked"/>
                </widget>
              </child>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">9</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
                  <property name="justify">GTK_JUSTIFY_CENTER</property>
                  <property name="wrap">False</property>
                  <property name="selectable">False</property>
-                 <property name="xalign">0.15</property>
+                 <property name="xalign">0.15000000596</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                      <property name="max_length">0</property>
                      <property name="text" translatable="yes"></property>
                      <property name="has_frame">True</property>
-                     <property name="invisible_char" translatable="yes">*</property>
+                     <property name="invisible_char">*</property>
                      <property name="activates_default">False</property>
                    </widget>
                  </child>
                              <property name="yalign">0.5</property>
                              <property name="xpad">0</property>
                              <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
                            </widget>
                          </child>
                        </widget>
                              <property name="yalign">0.5</property>
                              <property name="xpad">0</property>
                              <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
                            </widget>
                          </child>
                        </widget>
                  <property name="justify">GTK_JUSTIFY_LEFT</property>
                  <property name="wrap">False</property>
                  <property name="selectable">False</property>
-                 <property name="xalign">0.12</property>
+                 <property name="xalign">0.119999997318</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                      <property name="max_length">0</property>
                      <property name="text" translatable="yes"></property>
                      <property name="has_frame">True</property>
-                     <property name="invisible_char" translatable="yes">*</property>
+                     <property name="invisible_char">*</property>
                      <property name="activates_default">False</property>
                    </widget>
                  </child>
                              <property name="yalign">0.5</property>
                              <property name="xpad">0</property>
                              <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
                            </widget>
                          </child>
                        </widget>
                              <property name="yalign">0.5</property>
                              <property name="xpad">0</property>
                              <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
                            </widget>
                          </child>
                        </widget>
                  <property name="justify">GTK_JUSTIFY_LEFT</property>
                  <property name="wrap">False</property>
                  <property name="selectable">False</property>
-                 <property name="xalign">0.17</property>
+                 <property name="xalign">0.170000001788</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="max_length">0</property>
                  <property name="text" translatable="yes"></property>
                  <property name="has_frame">True</property>
-                 <property name="invisible_char" translatable="yes">*</property>
+                 <property name="invisible_char">*</property>
                  <property name="activates_default">False</property>
                </widget>
                <packing>
                  <property name="justify">GTK_JUSTIFY_LEFT</property>
                  <property name="wrap">False</property>
                  <property name="selectable">False</property>
-                 <property name="xalign">0.09</property>
+                 <property name="xalign">0.0900000035763</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
   <property name="default_height">200</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
   <property name="has_separator">True</property>
 
   <child internal-child="vbox">
              <property name="label">gtk-help</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <property name="response_id">-11</property>
            </widget>
          </child>
              <property name="can_default">True</property>
              <property name="can_focus">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <property name="response_id">0</property>
              <signal name="clicked" handler="on_select_files_button_clicked" last_modification_time="Wed, 17 Mar 2004 18:15:26 GMT"/>
 
                  <property name="yalign">0.5</property>
                  <property name="xscale">0</property>
                  <property name="yscale">0</property>
+                 <property name="top_padding">0</property>
+                 <property name="bottom_padding">0</property>
+                 <property name="left_padding">0</property>
+                 <property name="right_padding">0</property>
 
                  <child>
                    <widget class="GtkHBox" id="hbox49">
                          <property name="yalign">0.5</property>
                          <property name="xpad">0</property>
                          <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
                        </widget>
                        <packing>
                          <property name="padding">0</property>
              <property name="label">gtk-cancel</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <property name="response_id">-6</property>
              <signal name="clicked" handler="on_restore_cancel_clicked" last_modification_time="Wed, 17 Mar 2004 18:17:10 GMT"/>
            </widget>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">9</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">2</property>
                  <property name="yalign">0.5</property>
                  <property name="xscale">1</property>
                  <property name="yscale">1</property>
+                 <property name="top_padding">0</property>
+                 <property name="bottom_padding">0</property>
+                 <property name="left_padding">0</property>
+                 <property name="right_padding">0</property>
 
                  <child>
                    <widget class="GtkHBox" id="hbox50">
                              <property name="yalign">0.5</property>
                              <property name="xpad">0</property>
                              <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
                            </widget>
                            <packing>
                              <property name="padding">0</property>
                                  <property name="max_length">0</property>
                                  <property name="text" translatable="yes"></property>
                                  <property name="has_frame">True</property>
-                                 <property name="invisible_char" translatable="yes">*</property>
+                                 <property name="invisible_char">*</property>
                                  <property name="activates_default">False</property>
                                  <signal name="changed" handler="on_restore_job_entry_changed" last_modification_time="Wed, 17 Mar 2004 18:21:48 GMT"/>
                                </widget>
                                          <property name="yalign">0.5</property>
                                          <property name="xpad">0</property>
                                          <property name="ypad">0</property>
+                                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                         <property name="width_chars">-1</property>
+                                         <property name="single_line_mode">False</property>
+                                         <property name="angle">0</property>
                                        </widget>
                                      </child>
                                    </widget>
                              <property name="yalign">0.5</property>
                              <property name="xpad">0</property>
                              <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
                            </widget>
                            <packing>
                              <property name="padding">27</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">25</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">23</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">21</property>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
                          <property name="max_length">0</property>
                          <property name="text" translatable="yes"></property>
                          <property name="has_frame">True</property>
-                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="invisible_char">*</property>
                          <property name="activates_default">False</property>
                        </widget>
                      </child>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                                  <property name="yalign">0.5</property>
                                  <property name="xpad">0</property>
                                  <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
                                </widget>
                              </child>
                            </widget>
                      <property name="yalign">0.5</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
                    </widget>
                    <packing>
                      <property name="padding">21</property>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">0</property>
                  <property name="max_length">0</property>
                  <property name="text" translatable="yes"></property>
                  <property name="has_frame">True</property>
-                 <property name="invisible_char" translatable="yes">*</property>
+                 <property name="invisible_char">*</property>
                  <property name="activates_default">False</property>
                </widget>
                <packing>
                  <property name="yalign">0.5</property>
                  <property name="xpad">0</property>
                  <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
                </widget>
                <packing>
                  <property name="padding">53</property>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
   <property name="modal">False</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
   <property name="has_separator">True</property>
 
   <child internal-child="vbox">
              <property name="label">gtk-close</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <property name="response_id">-7</property>
            </widget>
          </child>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
              <property name="visible">True</property>
              <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
              <property name="fraction">0</property>
-             <property name="pulse_step">0.1</property>
+             <property name="pulse_step">0.10000000149</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
            </widget>
            <packing>
              <property name="padding">0</property>
              <property name="yalign">0.5</property>
              <property name="xpad">0</property>
              <property name="ypad">0</property>
+             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+             <property name="width_chars">-1</property>
+             <property name="single_line_mode">False</property>
+             <property name="angle">0</property>
            </widget>
            <packing>
              <property name="padding">0</property>
index e0214080d93d2f46c993b1d90c8b18bc7ed70666..bf054db8eb3c4602a303e6dcc1c76dbb12b06bc5 100644 (file)
@@ -101,7 +101,7 @@ int prune_volumes(JCR *jcr)
    db_lock(jcr->db);
 
    /* Get the List of all media ids in the current Pool */
-   if (!db_get_media_ids(jcr, jcr->db, jcr->jr.PoolId, &num_ids, &ids)) {
+   if (!db_get_media_ids(jcr, jcr->db, jcr->PoolId, &num_ids, &ids)) {
       Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
       goto bail_out;
    }
@@ -114,7 +114,7 @@ int prune_volumes(JCR *jcr)
          continue;
       }
       /* Prune only Volumes from current Pool */
-      if (jcr->jr.PoolId != mr.PoolId) {
+      if (jcr->PoolId != mr.PoolId) {
          continue;
       }
       /* Prune only Volumes with status "Full", or "Used" */
index 496e14d6d808d9e3b12a4f02dfbcb99d2dacdf41..28aa4a534ea357798ba58ea8d8e9f417c30a2309 100644 (file)
@@ -97,18 +97,35 @@ bool do_backup_init(JCR *jcr)
          }
       }
    }
+   jcr->PoolId = pr.PoolId;
    jcr->jr.PoolId = pr.PoolId;
 
-   /* If pool storage specified, use it instead of job storage */
-   copy_storage(jcr, jcr->pool->storage);
-
-   if (!jcr->storage) {
-      Jmsg(jcr, M_FATAL, 0, _("No Storage specification found in Job or Pool.\n"));
-      return false;
+   /*
+    * Fire off any clone jobs (run directives)
+    */
+   Dmsg2(900, "cloned=%d run_cmds=%p\n", jcr->cloned, jcr->job->run_cmds);
+   if (!jcr->cloned && jcr->job->run_cmds) {
+      char *runcmd;
+      JOB *job = jcr->job;
+      POOLMEM *cmd = get_pool_memory(PM_FNAME);
+      UAContext *ua = new_ua_context(jcr);
+      ua->batch = true;
+      foreach_alist(runcmd, job->run_cmds) {
+         cmd = edit_job_codes(jcr, cmd, runcmd, "");              
+         Mmsg(ua->cmd, "run %s cloned=yes", cmd);
+         Dmsg1(900, "=============== Clone cmd=%s\n", ua->cmd);
+         parse_ua_args(ua);                 /* parse command */
+         int stat = run_cmd(ua, ua->cmd);
+         if (stat == 0) {
+            Jmsg(jcr, M_ERROR, 0, _("Could not start clone job.\n"));
+         } else {
+            Jmsg(jcr, M_INFO, 0, _("Clone JobId %d started.\n"), stat);
+         }
+      }
+      free_ua_context(ua);
+      free_pool_memory(cmd);
    }
 
-   create_clones(jcr);                /* run any clone jobs */
-
    return true;
 }
 
@@ -170,27 +187,27 @@ bool do_backup(JCR *jcr)
    Dmsg0(150, "Storage daemon connection OK\n");
 
    if (!bnet_fsend(jcr->store_bsock, "run")) {
-      return false;
+      goto bail_out;
    }
 
    set_jcr_job_status(jcr, JS_WaitFD);
    if (!connect_to_file_daemon(jcr, 10, FDConnectTimeout, 1)) {
-      return false;
+      goto bail_out;
    }
 
    set_jcr_job_status(jcr, JS_Running);
    fd = jcr->file_bsock;
 
    if (!send_include_list(jcr)) {
-      return false;
+      goto bail_out;
    }
 
    if (!send_exclude_list(jcr)) {
-      return false;
+      goto bail_out;
    }
 
    if (!send_level_command(jcr)) {
-      return false;
+      goto bail_out;
    }
 
    /*
@@ -210,20 +227,37 @@ bool do_backup(JCR *jcr)
       }
    }
 
-   bnet_fsend(fd, storaddr, store->address, store->SDDport, tls_need);
+   bnet_fsend(fd, storaddr, store->address, store->SDDport,
+              tls_need);
    if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) {
-      return false;
+      goto bail_out;
    }
 
 
    if (!send_run_before_and_after_commands(jcr)) {
-      return false;
+      goto bail_out;
+   }
+
+   /*    
+    * We re-update the job start record so that the start
+    *  time is set after the run before job.  This avoids 
+    *  that any files created by the run before job will
+    *  be saved twice.  They will be backed up in the current
+    *  job, but not in the next one unless they are changed.
+    *  Without this, they will be backed up in this job and
+    *  in the next job run because in that case, their date 
+    *   is after the start of this run.
+    */
+   jcr->start_time = time(NULL);
+   jcr->jr.StartTime = jcr->start_time;
+   if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
+      Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
    }
 
    /* Send backup command */
    bnet_fsend(fd, backupcmd);
    if (!response(jcr, fd, OKbackup, "backup", DISPLAY_ERROR)) {
-      return false;
+      goto bail_out;
    }
 
    /* Pickup Job termination data */
@@ -233,6 +267,14 @@ bool do_backup(JCR *jcr)
       return true;
    }     
    return false;
+
+/* Come here only after starting SD thread */
+bail_out:
+   set_jcr_job_status(jcr, JS_ErrorTerminated);
+   Dmsg1(400, "wait for sd. use=%d\n", jcr->use_count());
+   wait_for_storage_daemon_termination(jcr);
+   Dmsg1(400, "after wait for sd. use=%d\n", jcr->use_count());
+   return false;
 }
 
 
@@ -309,7 +351,7 @@ void backup_cleanup(JCR *jcr, int TermCode)
 {
    char sdt[50], edt[50], schedt[50];
    char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30], compress[50];
-   char ec6[30], ec7[30], elapsed[50];
+   char ec6[30], ec7[30], ec8[30], elapsed[50];
    char term_code[100], fd_term_msg[100], sd_term_msg[100];
    const char *term_msg;
    int msg_type;
@@ -347,7 +389,6 @@ void backup_cleanup(JCR *jcr, int TermCode)
 
    update_bootstrap_file(jcr);
 
-
    msg_type = M_INFO;                 /* by default INFO message */
    switch (jcr->JobStatus) {
       case JS_Terminated:
@@ -441,7 +482,7 @@ void backup_cleanup(JCR *jcr, int TermCode)
 "  Volume name(s):         %s\n"
 "  Volume Session Id:      %d\n"
 "  Volume Session Time:    %d\n"
-"  Last Volume Bytes:      %s\n"
+"  Last Volume Bytes:      %s (%sB)\n"
 "  Non-fatal FD errors:    %d\n"
 "  SD Errors:              %d\n"
 "  FD termination status:  %s\n"
@@ -474,6 +515,7 @@ void backup_cleanup(JCR *jcr, int TermCode)
         jcr->VolSessionId,
         jcr->VolSessionTime,
         edit_uint64_with_commas(mr.VolBytes, ec7),
+        edit_uint64_with_suffix(mr.VolBytes, ec8),
         jcr->Errors,
         jcr->SDErrors,
         fd_term_msg,
index 2321580aa26ba71086b43590a7c954c2b5b8475a..4d26e22c0cf091a0525ad553c37dc6550ef82cf2 100644 (file)
@@ -11,7 +11,7 @@
  */
 
 /*
-   Copyright (C) 2002-2006 Kern Sibbald
+   Copyright (C) 2002-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -53,27 +53,6 @@ static void free_findex(RBSR_FINDEX *fi)
    }
 }
 
-/* 
- * Get storage device name from Storage resource
- */
-static bool get_storage_device(char *device, char *storage)
-{
-   STORE *store;
-   if (storage[0] == 0) {
-      return false;
-   }
-   store = (STORE *)GetResWithName(R_STORAGE, storage);    
-   if (!store) {
-      return false;
-   }
-   DEVICE *dev = (DEVICE *)(store->device->first());
-   if (!dev) {
-      return false;
-   }
-   bstrncpy(device, dev->hdr.name, MAX_NAME_LENGTH);
-   return true;
-}
-
 /*
  * Our data structures were not designed completely
  *  correctly, so the file indexes cover the full
@@ -191,6 +170,9 @@ bool complete_bsr(UAContext *ua, RBSR *bsr)
    return true;
 }
 
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static uint32_t uniq = 0;
 void make_unique_restore_filename(UAContext *ua, POOLMEM **fname)
 {
    JCR *jcr = ua->jcr;
@@ -199,10 +181,16 @@ void make_unique_restore_filename(UAContext *ua, POOLMEM **fname)
       Mmsg(fname, "%s", ua->argv[i]);              
       jcr->unlink_bsr = false;
    } else {
-      Mmsg(fname, "%s/%s.restore.%s.bsr", working_directory, my_name, 
-         jcr->Job);
+      P(mutex);
+      uniq++;
+      V(mutex);
+      Mmsg(fname, "%s/%s.%u.restore.bsr", working_directory, my_name, uniq);
       jcr->unlink_bsr = true;
    }
+   if (jcr->RestoreBootstrap) {
+      free(jcr->RestoreBootstrap);
+   }
+   jcr->RestoreBootstrap = bstrdup(*fname);
 }
 
 /*
@@ -299,7 +287,6 @@ static uint32_t write_bsr(UAContext *ua, RESTORE_CTX &rx, FILE *fd)
    bool first = true;
    char *p;
    JobId_t JobId;
-   char device[MAX_NAME_LENGTH];
    RBSR *bsr;
    if (*rx.JobIds == 0) {
       for (bsr=rx.bsr; bsr; bsr=bsr->next) {
@@ -315,12 +302,6 @@ static uint32_t write_bsr(UAContext *ua, RESTORE_CTX &rx, FILE *fd)
             }
             fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName);
             fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType);
-            if (get_storage_device(device, bsr->VolParams[i].Storage)) {
-               fprintf(fd, "Device=\"%s\"\n", device);
-            }
-            if (bsr->VolParams[i].Slot > 0) {
-               fprintf(fd, "Slot=%d\n", bsr->VolParams[i].Slot);
-            }
             fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId);
             fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime);
             if (bsr->VolParams[i].StartFile == bsr->VolParams[i].EndFile) {
@@ -374,12 +355,6 @@ static uint32_t write_bsr(UAContext *ua, RESTORE_CTX &rx, FILE *fd)
             }
             fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName);
             fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType);
-            if (get_storage_device(device, bsr->VolParams[i].Storage)) {
-               fprintf(fd, "Device=\"%s\"\n", device);
-            }
-            if (bsr->VolParams[i].Slot > 0) {
-               fprintf(fd, "Slot=%d\n", bsr->VolParams[i].Slot);
-            }
             fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId);
             fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime);
             if (bsr->VolParams[i].StartFile == bsr->VolParams[i].EndFile) {
index e599bd95f2f1d5d79a06afa20f1057dac967cc22..7cfa64ba05d4dc3f6d1f6a814dcebdce66aa9646 100644 (file)
@@ -13,7 +13,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2001-2006 Kern Sibbald
+   Copyright (C) 2001-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -29,7 +29,6 @@
 
 #include "bacula.h"
 #include "dird.h"
-#include "findlib/find.h"
 
 /*
  * Handle catalog request
@@ -122,9 +121,7 @@ void catalog_request(JCR *jcr, BSOCK *bs)
       ok = db_get_pool_record(jcr, jcr->db, &pr);
       if (ok) {
          mr.PoolId = pr.PoolId;
-         if (jcr->store->StorageId) {
-            mr.StorageId = jcr->store->StorageId;
-         }
+         mr.StorageId = jcr->store->StorageId;
          ok = find_next_volume_for_append(jcr, &mr, index, true /*permit create new vol*/);
       }
       /*
@@ -160,7 +157,7 @@ void catalog_request(JCR *jcr, BSOCK *bs)
              *   Pool matches, and it is either Append or Recycle
              *   and Media Type matches and Pool allows any volume.
              */
-            if (mr.PoolId != jcr->jr.PoolId) {
+            if (mr.PoolId != jcr->PoolId) {
                reason = _("not in Pool");
             } else if (strcmp(mr.MediaType, jcr->store->media_type) != 0) {
                reason = _("not correct MediaType");
@@ -279,13 +276,8 @@ void catalog_request(JCR *jcr, BSOCK *bs)
       &jm.FirstIndex, &jm.LastIndex, &jm.StartFile, &jm.EndFile,
       &jm.StartBlock, &jm.EndBlock, &jm.Copy, &jm.Stripe) == 9) {
 
-      if (jcr->target_jcr) {
-         jm.JobId = jcr->target_jcr->JobId;
-         jm.MediaId = jcr->MediaId;
-      } else {
-         jm.JobId = jcr->JobId;
-         jm.MediaId = jcr->MediaId;
-      }
+      jm.JobId = jcr->JobId;
+      jm.MediaId = jcr->MediaId;
       Dmsg6(400, "create_jobmedia JobId=%d MediaId=%d SF=%d EF=%d FI=%d LI=%d\n",
          jm.JobId, jm.MediaId, jm.StartFile, jm.EndFile, jm.FirstIndex, jm.LastIndex);
       if (!db_create_jobmedia_record(jcr, jcr->db, &jm)) {
@@ -394,64 +386,47 @@ void catalog_update(JCR *jcr, BSOCK *bs)
       ar->FileIndex = FileIndex;
       ar->Stream = Stream;
       ar->link = NULL;
-      if (jcr->target_jcr) {
-         ar->JobId = jcr->target_jcr->JobId;
-      } else {
-         ar->JobId = jcr->JobId;
-      }
-      ar->Digest = NULL;
-      ar->DigestType = CRYPTO_DIGEST_NONE;
+      ar->JobId = jcr->JobId;
+      ar->Sig = NULL;
+      ar->SigType = 0;
       jcr->cached_attribute = true;
 
       Dmsg2(400, "dird<filed: stream=%d %s\n", Stream, fname);
       Dmsg1(400, "dird<filed: attr=%s\n", attr);
 
-   } else if (crypto_digest_stream_type(Stream) != CRYPTO_DIGEST_NONE) {
+#ifdef xxx_old_code
+      if (!db_create_file_attributes_record(jcr, jcr->db, ar)) {
+         Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), db_strerror(jcr->db));
+      }
+#endif
+   } else if (Stream == STREAM_MD5_SIGNATURE || Stream == STREAM_SHA1_SIGNATURE) {
       fname = p;
       if (ar->FileIndex != FileIndex) {
-         Jmsg(jcr, M_WARNING, 0, _("Got %s but not same File as attributes\n"), stream_to_ascii(Stream));
+         Jmsg(jcr, M_WARNING, 0, _("Got MD5/SHA1 but not same File as attributes\n"));
       } else {
-         /* Update digest in catalog */
-         char digestbuf[CRYPTO_DIGEST_MAX_SIZE];
-         int len = 0;
-         int type = CRYPTO_DIGEST_NONE;
-
-         switch(Stream) {
-         case STREAM_MD5_DIGEST:
-            len = CRYPTO_DIGEST_MD5_SIZE;
-            type = CRYPTO_DIGEST_MD5;
-            break;
-         case STREAM_SHA1_DIGEST:
-            len = CRYPTO_DIGEST_SHA1_SIZE;
-            type = CRYPTO_DIGEST_SHA1;
-            break;
-         case STREAM_SHA256_DIGEST:
-            len = CRYPTO_DIGEST_SHA256_SIZE;
-            type = CRYPTO_DIGEST_SHA256;
-            break;
-         case STREAM_SHA512_DIGEST:
-            len = CRYPTO_DIGEST_SHA512_SIZE;
-            type = CRYPTO_DIGEST_SHA512;
-            break;
-         default:
-            /* Never reached ... */
-            Jmsg(jcr, M_ERROR, 0, _("Catalog error updating file digest. Unsupported digest stream type: %d"),
-                 Stream);
+         /* Update signature in catalog */
+         char SIGbuf[50];           /* 24 bytes should be enough */
+         int len, type;
+         if (Stream == STREAM_MD5_SIGNATURE) {
+            len = 16;
+            type = MD5_SIG;
+         } else {
+            len = 20;
+            type = SHA1_SIG;
          }
-
-         bin_to_base64(digestbuf, fname, len);
-         Dmsg3(400, "DigestLen=%d Digest=%s type=%d\n", strlen(digestbuf), digestbuf, Stream);
+         bin_to_base64(SIGbuf, fname, len);
+         Dmsg3(400, "SIGlen=%d SIG=%s type=%d\n", strlen(SIGbuf), SIGbuf, Stream);
          if (jcr->cached_attribute) {
-            ar->Digest = digestbuf;
-            ar->DigestType = type;
-            Dmsg2(400, "Cached attr with digest. Stream=%d fname=%s\n", ar->Stream, ar->fname);
+            ar->Sig = SIGbuf;
+            ar->SigType = type;
+            Dmsg2(400, "Cached attr with SIG. Stream=%d fname=%s\n", ar->Stream, ar->fname);
             if (!db_create_file_attributes_record(jcr, jcr->db, ar)) {
                Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), db_strerror(jcr->db));
             }
             jcr->cached_attribute = false; 
          } else {
-            if (!db_add_digest_to_file_record(jcr, jcr->db, ar->FileId, digestbuf, type)) {
-               Jmsg(jcr, M_ERROR, 0, _("Catalog error updating file digest. %s"),
+            if (!db_add_SIG_to_file_record(jcr, jcr->db, ar->FileId, SIGbuf, type)) {
+               Jmsg(jcr, M_ERROR, 0, _("Catalog error updating MD5/SHA1. %s"),
                   db_strerror(jcr->db));
             }
          }
index 617400c8a208b42f247feda2433861f2b62099fb..63a3b1ea8ac873ed4a9df9274d4d8953174dfeab 100644 (file)
@@ -559,7 +559,6 @@ static int check_resources()
          for (i=0; job_items[i].name; i++) {
             char **def_svalue, **svalue;  /* string value */
             int *def_ivalue, *ivalue;     /* integer value */
-            bool *def_bvalue, *bvalue;    /* bool value */
             int64_t *def_lvalue, *lvalue; /* 64 bit values */
             uint32_t offset;
 
@@ -609,9 +608,9 @@ static int check_resources()
                   }
                /*
                 * Handle integer fields
-                *    Note, our store_bit does not handle bitmaped fields
+                *    Note, our store_yesno does not handle bitmaped fields
                 */
-               } else if (job_items[i].handler == store_bit     ||
+               } else if (job_items[i].handler == store_yesno   ||
                           job_items[i].handler == store_pint    ||
                           job_items[i].handler == store_jobtype ||
                           job_items[i].handler == store_level   ||
@@ -635,16 +634,6 @@ static int check_resources()
                   lvalue = (int64_t *)((char *)job + offset);
                   *lvalue = *def_lvalue;
                   set_bit(i, job->hdr.item_present);
-               /*
-                * Handle bool fields
-                */
-               } else if (job_items[i].handler == store_bool) {
-                  def_bvalue = (bool *)((char *)(job->jobdefs) + offset);
-                  Dmsg5(400, "Job \"%s\", field \"%s\" def_bvalue=%d item %d offset=%u\n",
-                       job->hdr.name, job_items[i].name, *def_bvalue, i, offset);
-                  bvalue = (bool *)((char *)job + offset);
-                  *bvalue = *def_bvalue;
-                  set_bit(i, job->hdr.item_present);
                }
             }
          }
index 0ebace8e607ceb8ae944260de9ff13d74efad626..59ad1cbfb1368121cc4a9dd73d3d557cb0bbbc9c 100644 (file)
@@ -97,9 +97,9 @@ static RES_ITEM dir_items[] = {
    {"password",    store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0},
    {"fdconnecttimeout", store_time,ITEM(res_dir.FDConnectTimeout), 0, ITEM_DEFAULT, 60 * 30},
    {"sdconnecttimeout", store_time,ITEM(res_dir.SDConnectTimeout), 0, ITEM_DEFAULT, 60 * 30},
-   {"tlsenable",            store_bool,      ITEM(res_dir.tls_enable), 0, 0, 0},
-   {"tlsrequire",           store_bool,      ITEM(res_dir.tls_require), 0, 0, 0},
-   {"tlsverifypeer",        store_bool,      ITEM(res_dir.tls_verify_peer), 0, ITEM_DEFAULT, true},
+   {"tlsenable",            store_yesno,     ITEM(res_dir.tls_enable), 1, 0, 0},
+   {"tlsrequire",           store_yesno,     ITEM(res_dir.tls_require), 1, 0, 0},
+   {"tlsverifypeer",        store_yesno,     ITEM(res_dir.tls_verify_peer), 1, ITEM_DEFAULT, 1},
    {"tlscacertificatefile", store_dir,       ITEM(res_dir.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir",  store_dir,       ITEM(res_dir.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate",       store_dir,       ITEM(res_dir.tls_certfile), 0, 0, 0},
@@ -127,9 +127,9 @@ static RES_ITEM con_items[] = {
    {"commandacl",  store_acl,      ITEM(res_con.ACL_lists), Command_ACL, 0, 0},
    {"filesetacl",  store_acl,      ITEM(res_con.ACL_lists), FileSet_ACL, 0, 0},
    {"catalogacl",  store_acl,      ITEM(res_con.ACL_lists), Catalog_ACL, 0, 0},
-   {"tlsenable",            store_bool,      ITEM(res_con.tls_enable), 0, 0, 0},
-   {"tlsrequire",           store_bool,      ITEM(res_con.tls_require), 0, 0, 0},
-   {"tlsverifypeer",        store_bool,      ITEM(res_con.tls_verify_peer), 0, ITEM_DEFAULT, true},
+   {"tlsenable",            store_yesno,     ITEM(res_con.tls_enable), 1, 0, 0},
+   {"tlsrequire",           store_yesno,     ITEM(res_con.tls_require), 1, 0, 0},
+   {"tlsverifypeer",        store_yesno,     ITEM(res_con.tls_verify_peer), 1, ITEM_DEFAULT, 1},
    {"tlscacertificatefile", store_dir,       ITEM(res_con.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir",  store_dir,       ITEM(res_con.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate",       store_dir,       ITEM(res_con.tls_certfile), 0, 0, 0},
@@ -157,10 +157,10 @@ static RES_ITEM cli_items[] = {
    {"catalog",  store_res,        ITEM(res_client.catalog),  R_CATALOG, ITEM_REQUIRED, 0},
    {"fileretention", store_time,  ITEM(res_client.FileRetention), 0, ITEM_DEFAULT, 60*60*24*60},
    {"jobretention",  store_time,  ITEM(res_client.JobRetention),  0, ITEM_DEFAULT, 60*60*24*180},
-   {"autoprune", store_bool,      ITEM(res_client.AutoPrune), 0, ITEM_DEFAULT, true},
+   {"autoprune", store_yesno,     ITEM(res_client.AutoPrune), 1, ITEM_DEFAULT, 1},
    {"maximumconcurrentjobs", store_pint, ITEM(res_client.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1},
-   {"tlsenable",            store_bool,      ITEM(res_client.tls_enable), 0, 0, 0},
-   {"tlsrequire",           store_bool,      ITEM(res_client.tls_require), 0, 0, 0},
+   {"tlsenable",            store_yesno,     ITEM(res_client.tls_enable), 1, 0, 0},
+   {"tlsrequire",           store_yesno,     ITEM(res_client.tls_require), 1, 0, 0},
    {"tlscacertificatefile", store_dir,       ITEM(res_client.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir",  store_dir,       ITEM(res_client.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate",       store_dir,       ITEM(res_client.tls_certfile), 0, 0, 0},
@@ -182,12 +182,12 @@ static RES_ITEM store_items[] = {
    {"sdpassword",  store_password, ITEM(res_store.password),   0, 0, 0},
    {"device",      store_device,   ITEM(res_store.device),     R_DEVICE, ITEM_REQUIRED, 0},
    {"mediatype",   store_strname,  ITEM(res_store.media_type), 0, ITEM_REQUIRED, 0},
-   {"autochanger", store_bool,     ITEM(res_store.autochanger), 0, ITEM_DEFAULT, 0},
-   {"enabled",     store_bool,     ITEM(res_store.enabled),     0, ITEM_DEFAULT, true},
+   {"autochanger", store_yesno,    ITEM(res_store.autochanger), 1, ITEM_DEFAULT, 0},
+   {"enabled",     store_yesno,    ITEM(res_store.enabled),     1, ITEM_DEFAULT, 1},
    {"maximumconcurrentjobs", store_pint, ITEM(res_store.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1},
    {"sddport", store_pint, ITEM(res_store.SDDport), 0, 0, 0}, /* deprecated */
-   {"tlsenable",            store_bool,      ITEM(res_store.tls_enable), 0, 0, 0},
-   {"tlsrequire",           store_bool,      ITEM(res_store.tls_require), 0, 0, 0},
+   {"tlsenable",            store_yesno,     ITEM(res_store.tls_enable), 1, 0, 0},
+   {"tlsrequire",           store_yesno,     ITEM(res_store.tls_require), 1, 0, 0},
    {"tlscacertificatefile", store_dir,       ITEM(res_store.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir",  store_dir,       ITEM(res_store.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate",       store_dir,       ITEM(res_store.tls_certfile), 0, 0, 0},
@@ -213,7 +213,7 @@ static RES_ITEM cat_items[] = {
    {"dbname",   store_str,      ITEM(res_cat.db_name),     0, ITEM_REQUIRED, 0},
    {"dbsocket", store_str,      ITEM(res_cat.db_socket),   0, 0, 0},
    /* Turned off for the moment */
-   {"multipleconnections", store_bit, ITEM(res_cat.mult_db_connections), 0, 0, 0},
+   {"multipleconnections", store_yesno, ITEM(res_cat.mult_db_connections), 0, 0, 0},
    {NULL, NULL, NULL, 0, 0, 0}
 };
 
@@ -228,7 +228,7 @@ RES_ITEM job_items[] = {
    {"type",      store_jobtype, ITEM(res_job.JobType),  0, ITEM_REQUIRED, 0},
    {"level",     store_level,   ITEM(res_job.JobLevel),    0, 0, 0},
    {"messages",  store_res,     ITEM(res_job.messages), R_MSGS, ITEM_REQUIRED, 0},
-   {"storage",   store_alist_res, ITEM(res_job.storage),  R_STORAGE, 0, 0},
+   {"storage",   store_alist_res, ITEM(res_job.storage),  R_STORAGE, ITEM_REQUIRED, 0},
    {"pool",      store_res,     ITEM(res_job.pool),     R_POOL, ITEM_REQUIRED, 0},
    {"fullbackuppool",  store_res, ITEM(res_job.full_pool),   R_POOL, 0, 0},
    {"incrementalbackuppool",  store_res, ITEM(res_job.inc_pool), R_POOL, 0, 0},
@@ -237,16 +237,11 @@ RES_ITEM job_items[] = {
    {"fileset",   store_res,     ITEM(res_job.fileset),  R_FILESET, ITEM_REQUIRED, 0},
    {"schedule",  store_res,     ITEM(res_job.schedule), R_SCHEDULE, 0, 0},
    {"verifyjob", store_res,     ITEM(res_job.verify_job), R_JOB, 0, 0},
-   {"migrationjob", store_res,  ITEM(res_job.migration_job), R_JOB, 0, 0},
    {"jobdefs",   store_res,     ITEM(res_job.jobdefs),    R_JOBDEFS, 0, 0},
    {"run",       store_alist_str, ITEM(res_job.run_cmds), 0, 0, 0},
-   /* Root of where to restore files */
    {"where",    store_dir,      ITEM(res_job.RestoreWhere), 0, 0, 0},
-   /* Where to find bootstrap during restore */
    {"bootstrap",store_dir,      ITEM(res_job.RestoreBootstrap), 0, 0, 0},
-   /* Where to write bootstrap file during backup */
    {"writebootstrap",store_dir, ITEM(res_job.WriteBootstrap), 0, 0, 0},
-   {"writeverifylist",store_dir, ITEM(res_job.WriteVerifyList), 0, 0, 0},
    {"replace",  store_replace,  ITEM(res_job.replace), 0, ITEM_DEFAULT, REPLACE_ALWAYS},
    {"maxruntime",   store_time, ITEM(res_job.MaxRunTime), 0, 0, 0},
    {"fullmaxwaittime",  store_time, ITEM(res_job.FullMaxWaitTime), 0, 0, 0},
@@ -255,26 +250,26 @@ RES_ITEM job_items[] = {
    {"maxwaittime",  store_time, ITEM(res_job.MaxWaitTime), 0, 0, 0},
    {"maxstartdelay",store_time, ITEM(res_job.MaxStartDelay), 0, 0, 0},
    {"jobretention", store_time, ITEM(res_job.JobRetention),  0, 0, 0},
-   {"prefixlinks", store_bool, ITEM(res_job.PrefixLinks), 0, ITEM_DEFAULT, false},
-   {"prunejobs",   store_bool, ITEM(res_job.PruneJobs), 0, ITEM_DEFAULT, false},
-   {"prunefiles",  store_bool, ITEM(res_job.PruneFiles), 0, ITEM_DEFAULT, false},
-   {"prunevolumes",store_bool, ITEM(res_job.PruneVolumes), 0, ITEM_DEFAULT, false},
-   {"enabled",     store_bool, ITEM(res_job.enabled), 0, ITEM_DEFAULT, true},
-   {"spoolattributes",store_bool, ITEM(res_job.SpoolAttributes), 0, ITEM_DEFAULT, false},
-   {"spooldata",   store_bit, ITEM(res_job.spool_data), 0, ITEM_DEFAULT, false},
-   {"rerunfailedlevels",   store_bool, ITEM(res_job.rerun_failed_levels), 0, ITEM_DEFAULT, false},
-   {"prefermountedvolumes", store_bool, ITEM(res_job.PreferMountedVolumes), 0, ITEM_DEFAULT, true},
+   {"prefixlinks", store_yesno, ITEM(res_job.PrefixLinks), 1, ITEM_DEFAULT, 0},
+   {"prunejobs",   store_yesno, ITEM(res_job.PruneJobs), 1, ITEM_DEFAULT, 0},
+   {"prunefiles",  store_yesno, ITEM(res_job.PruneFiles), 1, ITEM_DEFAULT, 0},
+   {"prunevolumes",store_yesno, ITEM(res_job.PruneVolumes), 1, ITEM_DEFAULT, 0},
+   {"enabled",     store_yesno, ITEM(res_job.enabled), 1, ITEM_DEFAULT, 1},
+   {"spoolattributes",store_yesno, ITEM(res_job.SpoolAttributes), 1, ITEM_DEFAULT, 0},
+   {"spooldata",   store_yesno, ITEM(res_job.spool_data), 1, ITEM_DEFAULT, 0},
+   {"rerunfailedlevels",   store_yesno, ITEM(res_job.rerun_failed_levels), 1, ITEM_DEFAULT, 0},
+   {"prefermountedvolumes", store_yesno, ITEM(res_job.PreferMountedVolumes), 1, ITEM_DEFAULT, 1},
    {"runbeforejob", store_str,  ITEM(res_job.RunBeforeJob), 0, 0, 0},
    {"runafterjob",  store_str,  ITEM(res_job.RunAfterJob),  0, 0, 0},
    {"runafterfailedjob",  store_str,  ITEM(res_job.RunAfterFailedJob),  0, 0, 0},
    {"clientrunbeforejob", store_str,  ITEM(res_job.ClientRunBeforeJob), 0, 0, 0},
    {"clientrunafterjob",  store_str,  ITEM(res_job.ClientRunAfterJob),  0, 0, 0},
    {"maximumconcurrentjobs", store_pint, ITEM(res_job.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1},
-   {"rescheduleonerror", store_bool, ITEM(res_job.RescheduleOnError), 0, ITEM_DEFAULT, false},
+   {"rescheduleonerror", store_yesno, ITEM(res_job.RescheduleOnError), 1, ITEM_DEFAULT, 0},
    {"rescheduleinterval", store_time, ITEM(res_job.RescheduleInterval), 0, ITEM_DEFAULT, 60 * 30},
    {"rescheduletimes", store_pint, ITEM(res_job.RescheduleTimes), 0, 0, 0},
    {"priority",   store_pint, ITEM(res_job.Priority), 0, ITEM_DEFAULT, 10},
-   {"writepartafterjob",   store_bool, ITEM(res_job.write_part_after_job), 0, ITEM_DEFAULT, false},
+   {"writepartafterjob",   store_yesno, ITEM(res_job.write_part_after_job), 1, ITEM_DEFAULT, 0},
    {NULL, NULL, NULL, 0, 0, 0}
 };
 
@@ -287,8 +282,8 @@ static RES_ITEM fs_items[] = {
    {"description", store_str,  ITEM(res_fs.hdr.desc), 0, 0, 0},
    {"include",     store_inc,  NULL,                  0, ITEM_NO_EQUALS, 0},
    {"exclude",     store_inc,  NULL,                  1, ITEM_NO_EQUALS, 0},
-   {"ignorefilesetchanges", store_bool, ITEM(res_fs.ignore_fs_changes), 0, ITEM_DEFAULT, false},
-   {"enablevss",   store_bool, ITEM(res_fs.enable_vss), 0, ITEM_DEFAULT, false},
+   {"ignorefilesetchanges", store_yesno, ITEM(res_fs.ignore_fs_changes), 1, ITEM_DEFAULT, 0},
+   {"enablevss",   store_yesno, ITEM(res_fs.enable_vss), 1, ITEM_DEFAULT, 0},
    {NULL,          NULL,       NULL,                  0, 0, 0}
 };
 
@@ -314,27 +309,22 @@ static RES_ITEM pool_items[] = {
    {"pooltype",        store_strname, ITEM(res_pool.pool_type),     0, ITEM_REQUIRED, 0},
    {"labelformat",     store_strname, ITEM(res_pool.label_format),  0, 0,     0},
    {"labeltype",       store_label,   ITEM(res_pool.LabelType),     0, 0,     0},     
-   {"cleaningprefix",  store_strname, ITEM(res_pool.cleaning_prefix), 0, 0,   0},
-   {"usecatalog",      store_bool,    ITEM(res_pool.use_catalog),    0, ITEM_DEFAULT, true},
-   {"usevolumeonce",   store_bool,    ITEM(res_pool.use_volume_once), 0, 0,   0},
-   {"purgeoldestvolume", store_bool,  ITEM(res_pool.purge_oldest_volume), 0, 0, 0},
-   {"recycleoldestvolume", store_bool,  ITEM(res_pool.recycle_oldest_volume), 0, 0, 0},
-   {"recyclecurrentvolume", store_bool, ITEM(res_pool.recycle_current_volume), 0, 0, 0},
+   {"cleaningprefix",  store_strname, ITEM(res_pool.cleaning_prefix), 0, 0,     0},
+   {"usecatalog",      store_yesno,   ITEM(res_pool.use_catalog),    1, ITEM_DEFAULT,  1},
+   {"usevolumeonce",   store_yesno,   ITEM(res_pool.use_volume_once),1, 0,        0},
+   {"purgeoldestvolume", store_yesno, ITEM(res_pool.purge_oldest_volume), 1, 0, 0},
+   {"recycleoldestvolume", store_yesno,  ITEM(res_pool.recycle_oldest_volume), 1, 0, 0},
+   {"recyclecurrentvolume", store_yesno, ITEM(res_pool.recycle_current_volume), 1, 0, 0},
    {"maximumvolumes",  store_pint,    ITEM(res_pool.max_volumes),   0, 0,        0},
    {"maximumvolumejobs", store_pint,  ITEM(res_pool.MaxVolJobs),    0, 0,       0},
    {"maximumvolumefiles", store_pint, ITEM(res_pool.MaxVolFiles),   0, 0,       0},
    {"maximumvolumebytes", store_size, ITEM(res_pool.MaxVolBytes),   0, 0,       0},
-   {"acceptanyvolume", store_bool,    ITEM(res_pool.accept_any_volume), 0, ITEM_DEFAULT, true},
-   {"catalogfiles",    store_bool,    ITEM(res_pool.catalog_files),  0, ITEM_DEFAULT, true},
+   {"acceptanyvolume", store_yesno,   ITEM(res_pool.accept_any_volume), 1, ITEM_DEFAULT,     1},
+   {"catalogfiles",    store_yesno,   ITEM(res_pool.catalog_files),  1, ITEM_DEFAULT,  1},
    {"volumeretention", store_time,    ITEM(res_pool.VolRetention),   0, ITEM_DEFAULT, 60*60*24*365},
    {"volumeuseduration", store_time,  ITEM(res_pool.VolUseDuration), 0, 0, 0},
-   {"migrationtime",  store_time,     ITEM(res_pool.MigrationTime), 0, 0, 0},
-   {"migrationhighbytes", store_size, ITEM(res_pool.MigrationHighBytes), 0, 0, 0},
-   {"migrationlowbytes", store_size,  ITEM(res_pool.MigrationLowBytes), 0, 0, 0},
-   {"nextpool",      store_res,       ITEM(res_pool.NextPool), R_POOL, 0, 0},
-   {"storage",       store_alist_res, ITEM(res_pool.storage),  R_STORAGE, 0, 0},
-   {"autoprune",       store_bool,    ITEM(res_pool.AutoPrune), 0, ITEM_DEFAULT, true},
-   {"recycle",         store_bool,    ITEM(res_pool.Recycle),   0, ITEM_DEFAULT, true},
+   {"autoprune",       store_yesno,   ITEM(res_pool.AutoPrune), 1, ITEM_DEFAULT, 1},
+   {"recycle",         store_yesno,   ITEM(res_pool.Recycle),     1, ITEM_DEFAULT, 1},
    {NULL, NULL, NULL, 0, 0, 0}
 };
 
@@ -412,8 +402,6 @@ struct s_jt jobtypes[] = {
    {"admin",         JT_ADMIN},
    {"verify",        JT_VERIFY},
    {"restore",       JT_RESTORE},
-   {"copy",          JT_COPY},
-   {"migrate",       JT_MIGRATE},
    {NULL,            0}
 };
 
@@ -448,7 +436,7 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm
 {
    URES *res = (URES *)reshdr;
    bool recurse = true;
-   char ed1[100], ed2[100], ed3[100];
+   char ed1[100], ed2[100];
    DEVICE *dev;
 
    if (res == NULL) {
@@ -474,8 +462,13 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm
       }
       break;
    case R_CONSOLE:
+#ifdef HAVE_TLS
       sendit(sock, _("Console: name=%s SSL=%d\n"),
          res->res_con.hdr.name, res->res_con.tls_enable);
+#else
+      sendit(sock, _("Console: name=%s SSL=%d\n"),
+         res->res_con.hdr.name, BNET_TLS_NONE);
+#endif
       break;
    case R_COUNTER:
       if (res->res_counter.WrapCounter) {
@@ -781,21 +774,6 @@ next_run:
               res->res_pool.recycle_oldest_volume,
               res->res_pool.purge_oldest_volume,
               res->res_pool.MaxVolJobs, res->res_pool.MaxVolFiles);
-      sendit(sock, _("      MigTime=%s MigHiBytes=%s MigLoBytes=%s\n"),
-              edit_utime(res->res_pool.MigrationTime, ed1, sizeof(ed1)),
-              edit_uint64(res->res_pool.MigrationHighBytes, ed2),
-              edit_uint64(res->res_pool.MigrationLowBytes, ed3));
-      if (res->res_pool.NextPool) {
-         sendit(sock, _("  --> "));
-         dump_resource(-R_POOL, (RES *)res->res_pool.NextPool, sendit, sock);
-      }
-      if (res->res_pool.storage) {
-         STORE *store;
-         foreach_alist(store, res->res_pool.storage) {
-            sendit(sock, _("  --> "));
-            dump_resource(-R_STORAGE, (RES *)store, sendit, sock);
-         }
-      }
       break;
    case R_MSGS:
       sendit(sock, _("Messages: name=%s\n"), res->res_msgs.hdr.name);
@@ -1043,9 +1021,6 @@ void free_resource(RES *sres, int type)
       if (res->res_pool.cleaning_prefix) {
          free(res->res_pool.cleaning_prefix);
       }
-      if (res->res_pool.storage) {
-         delete res->res_pool.storage;
-      }
       break;
    case R_SCHEDULE:
       if (res->res_sch.run) {
@@ -1165,27 +1140,13 @@ void save_resource(int type, RES_ITEM *items, int pass)
       switch (type) {
       /* Resources not containing a resource */
       case R_CATALOG:
+      case R_POOL:
       case R_MSGS:
       case R_FILESET:
       case R_DEVICE:
          break;
 
-      /*
-       * Resources containing another resource or alist. First
-       *  look up the resource which contains another resource. It
-       *  was written during pass 1.  Then stuff in the pointers to
-       *  the resources it contains, which were inserted this pass.
-       *  Finally, it will all be stored back.
-       */
-      case R_POOL:
-         /* Find resource saved in pass 1 */
-         if ((res = (URES *)GetResWithName(R_POOL, res_all.res_con.hdr.name)) == NULL) {
-            Emsg1(M_ERROR_TERM, 0, _("Cannot find Pool resource %s\n"), res_all.res_con.hdr.name);
-         }
-         /* Explicitly copy resource pointers from this pass (res_all) */
-         res->res_pool.NextPool = res_all.res_pool.NextPool;
-         res->res_pool.storage    = res_all.res_pool.storage;
-         break;
+      /* Resources containing another resource or alist */
       case R_CONSOLE:
          if ((res = (URES *)GetResWithName(R_CONSOLE, res_all.res_con.hdr.name)) == NULL) {
             Emsg1(M_ERROR_TERM, 0, _("Cannot find Console resource %s\n"), res_all.res_con.hdr.name);
index 6886983ee4c03df96a76a6ebdf81e1c660d937b4..2204d70bfe1d27c4e68c261cc666ff1a05ec115e 100644 (file)
@@ -102,6 +102,9 @@ public:
    uint32_t MaxConcurrentJobs;        /* Max concurrent jobs for whole director */
    utime_t FDConnectTimeout;          /* timeout for connect in seconds */
    utime_t SDConnectTimeout;          /* timeout in seconds */
+   int tls_enable;                    /* Enable TLS */
+   int tls_require;                   /* Require TLS */
+   int tls_verify_peer;              /* TLS Verify Client Certificate */
    char *tls_ca_certfile;             /* TLS CA Certificate File */
    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
    char *tls_certfile;                /* TLS Server Certificate File */
@@ -109,9 +112,6 @@ public:
    char *tls_dhfile;                  /* TLS Diffie-Hellman Parameters */
    alist *tls_allowed_cns;            /* TLS Allowed Clients */
    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
-   bool tls_enable;                   /* Enable TLS */
-   bool tls_require;                  /* Require TLS */
-   bool tls_verify_peer;              /* TLS Verify Client Certificate */
 };
 
 /*
@@ -168,6 +168,9 @@ public:
    RES   hdr;
    char *password;                    /* UA server password */
    alist *ACL_lists[Num_ACL];         /* pointers to ACLs */
+   int tls_enable;                    /* Enable TLS */
+   int tls_require;                   /* Require TLS */
+   int tls_verify_peer;              /* TLS Verify Client Certificate */
    char *tls_ca_certfile;             /* TLS CA Certificate File */
    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
    char *tls_certfile;                /* TLS Server Certificate File */
@@ -175,9 +178,6 @@ public:
    char *tls_dhfile;                  /* TLS Diffie-Hellman Parameters */
    alist *tls_allowed_cns;            /* TLS Allowed Clients */
    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
-   bool tls_enable;                   /* Enable TLS */
-   bool tls_require;                  /* Require TLS */
-   bool tls_verify_peer;              /* TLS Verify Client Certificate */
 };
 
 
@@ -189,7 +189,7 @@ class CAT {
 public:
    RES   hdr;
 
-   int   db_port;                     /* Port */
+   int   db_port;                     /* Port -- not yet implemented */
    char *db_address;                  /* host name for remote access */
    char *db_socket;                   /* Socket for local access */
    char *db_password;
@@ -208,6 +208,7 @@ public:
    RES   hdr;
 
    int   FDport;                      /* Where File daemon listens */
+   int   AutoPrune;                   /* Do automatic pruning? */
    utime_t FileRetention;             /* file retention period in seconds */
    utime_t JobRetention;              /* job retention period in seconds */
    char *address;
@@ -215,14 +216,13 @@ public:
    CAT *catalog;                      /* Catalog resource */
    uint32_t MaxConcurrentJobs;        /* Maximume concurrent jobs */
    uint32_t NumConcurrentJobs;        /* number of concurrent jobs running */
+   int tls_enable;                    /* Enable TLS */
+   int tls_require;                   /* Require TLS */
    char *tls_ca_certfile;             /* TLS CA Certificate File */
    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
    char *tls_certfile;                /* TLS Client Certificate File */
    char *tls_keyfile;                 /* TLS Client Key File */
    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
-   bool tls_enable;                   /* Enable TLS */
-   bool tls_require;                  /* Require TLS */
-   bool AutoPrune;                    /* Do automatic pruning? */
 };
 
 /*
@@ -239,19 +239,19 @@ public:
    char *password;
    char *media_type;
    alist *device;                     /* Alternate devices for this Storage */
+   int  autochanger;                  /* set if autochanger */
+   int  drives;                       /* number of drives in autochanger */
    uint32_t MaxConcurrentJobs;        /* Maximume concurrent jobs */
    uint32_t NumConcurrentJobs;        /* number of concurrent jobs running */
+   int tls_enable;                    /* Enable TLS */
+   int tls_require;                   /* Require TLS */
    char *tls_ca_certfile;             /* TLS CA Certificate File */
    char *tls_ca_certdir;              /* TLS CA Certificate Directory */
    char *tls_certfile;                /* TLS Client Certificate File */
    char *tls_keyfile;                 /* TLS Client Key File */
    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
-   bool tls_enable;                   /* Enable TLS */
-   bool tls_require;                  /* Require TLS */
-   bool enabled;                      /* Set if device is enabled */
-   bool  autochanger;                 /* set if autochanger */
    int64_t StorageId;                 /* Set from Storage DB record */
-   int  drives;                       /* number of drives in autochanger */
+   int enabled;                       /* Set if device is enabled */
 
    /* Methods */
    char *dev_name() const;
@@ -285,10 +285,7 @@ public:
    char *RunAfterFailedJob;           /* Run program after Job that errs */
    char *ClientRunBeforeJob;          /* Run client program before Job */
    char *ClientRunAfterJob;           /* Run client program after Job */
-   union {
-      char *WriteBootstrap;           /* Where to write bootstrap Job updates */
-      char *WriteVerifyList;          /* List of changed files */
-   };
+   char *WriteBootstrap;              /* Where to write bootstrap Job updates */
    int   replace;                     /* How (overwrite, ..) */
    utime_t MaxRunTime;                /* max run time in seconds */
    utime_t MaxWaitTime;               /* max blocking time in seconds */
@@ -296,21 +293,21 @@ public:
    utime_t DiffMaxWaitTime;           /* Max Differential job wait time */
    utime_t IncMaxWaitTime;            /* Max Incremental job wait time */
    utime_t MaxStartDelay;             /* max start delay in seconds */
-   utime_t RescheduleInterval;        /* Reschedule interval */
-   utime_t JobRetention;              /* job retention period in seconds */
+   int PrefixLinks;                   /* prefix soft links with Where path */
+   int PruneJobs;                     /* Force pruning of Jobs */
+   int PruneFiles;                    /* Force pruning of Files */
+   int PruneVolumes;                  /* Force pruning of Volumes */
+   int SpoolAttributes;               /* Set to spool attributes in SD */
+   int spool_data;                    /* Set to spool data in SD */
+   int rerun_failed_levels;           /* Upgrade to rerun failed levels */
+   int PreferMountedVolumes;          /* Prefer vols mounted rather than new one */
    uint32_t MaxConcurrentJobs;        /* Maximume concurrent jobs */
+   int RescheduleOnError;             /* Set to reschedule on error */
    int RescheduleTimes;               /* Number of times to reschedule job */
-   bool RescheduleOnError;            /* Set to reschedule on error */
-   bool PrefixLinks;                  /* prefix soft links with Where path */
-   bool PruneJobs;                    /* Force pruning of Jobs */
-   bool PruneFiles;                   /* Force pruning of Files */
-   bool PruneVolumes;                 /* Force pruning of Volumes */
-   bool SpoolAttributes;              /* Set to spool attributes in SD */
-   bool spool_data;                   /* Set to spool data in SD */
-   bool rerun_failed_levels;          /* Upgrade to rerun failed levels */
-   bool PreferMountedVolumes;         /* Prefer vols mounted rather than new one */
-   bool write_part_after_job;         /* Set to write part after job in SD */
-   bool enabled;                      /* Set if job enabled */
+   utime_t RescheduleInterval;        /* Reschedule interval */
+   utime_t JobRetention;              /* job retention period in seconds */
+   int write_part_after_job;          /* Set to write part after job in SD */
+   int enabled;                       /* Set if device is enabled */
    
    MSGS      *messages;               /* How and where to send messages */
    SCHED     *schedule;               /* When -- Automatic schedule */
@@ -373,8 +370,8 @@ public:
    bool have_MD5;                     /* set if MD5 initialized */
    struct MD5Context md5c;            /* MD5 of include/exclude */
    char MD5[30];                      /* base 64 representation of MD5 */
-   bool ignore_fs_changes;            /* Don't force Full if FS changed */
-   bool enable_vss;                   /* Enable Volume Shadow Copy */
+   int ignore_fs_changes;             /* Don't force Full if FS changed */
+   int enable_vss;                    /* Enable Volume Shadow Copy */
 };
 
 
@@ -416,6 +413,13 @@ public:
    char *label_format;                /* Label format string */
    char *cleaning_prefix;             /* Cleaning label prefix */
    int   LabelType;                   /* Bacula/ANSI/IBM label type */
+   int   use_catalog;                 /* maintain catalog for media */
+   int   catalog_files;               /* maintain file entries in catalog */
+   int   use_volume_once;             /* write on volume only once */
+   int   accept_any_volume;           /* accept any volume */
+   int   purge_oldest_volume;         /* purge oldest volume */
+   int   recycle_oldest_volume;       /* attempt to recycle oldest volume */
+   int   recycle_current_volume;      /* attempt recycle of current volume */
    uint32_t max_volumes;              /* max number of volumes */
    utime_t VolRetention;              /* volume retention period in seconds */
    utime_t VolUseDuration;            /* duration volume can be used */
@@ -426,16 +430,8 @@ public:
    uint32_t MigrationHighBytes;       /* When migration starts */
    uint32_t MigrationLowBytes;        /* When migration stops */
    POOL  *NextPool;                   /* Next pool for migration */
-   alist *storage;                    /* Where is device -- list of Storage to be used */
-   bool  use_catalog;                 /* maintain catalog for media */
-   bool  catalog_files;               /* maintain file entries in catalog */
-   bool  use_volume_once;             /* write on volume only once */
-   bool  accept_any_volume;           /* accept any volume */
-   bool  purge_oldest_volume;         /* purge oldest volume */
-   bool  recycle_oldest_volume;       /* attempt to recycle oldest volume */
-   bool  recycle_current_volume;      /* attempt recycle of current volume */
-   bool  AutoPrune;                   /* default for pool auto prune */
-   bool  Recycle;                     /* default for media recycle yes/no */
+   int   AutoPrune;                   /* default for pool auto prune */
+   int   Recycle;                     /* default for media recycle yes/no */
 };
 
 
index dfc4cc11dbf8b39a4f865e508b7188429375a2f7..8733828561a1c635c5e132036bf5c639c67d8c69 100644 (file)
@@ -13,7 +13,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
 
 #include "bacula.h"
 #include "dird.h"
-#include "findlib/find.h"
 
 /* Commands sent to File daemon */
 static char filesetcmd[]  = "fileset%s\n"; /* set full fileset */
-static char jobcmd[]      = "JobId=%d Job=%s SDid=%u SDtime=%u Authorization=%s\n";
+static char jobcmd[]      = "JobId=%s Job=%s SDid=%u SDtime=%u Authorization=%s\n";
 /* Note, mtime_only is not used here -- implemented as file option */
 static char levelcmd[]    = "level = %s%s mtime_only=%d\n";
 static char runbefore[]   = "RunBeforeJob %s\n";
@@ -43,6 +42,7 @@ static char runafter[]    = "RunAfterJob %s\n";
 /* Responses received from File daemon */
 static char OKinc[]       = "2000 OK include\n";
 static char OKjob[]       = "2000 OK Job";
+static char OKbootstrap[] = "2000 OK bootstrap\n";
 static char OKlevel[]     = "2000 OK level\n";
 static char OKRunBefore[] = "2000 OK RunBefore\n";
 static char OKRunAfter[]  = "2000 OK RunAfter\n";
@@ -67,6 +67,7 @@ int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time,
                            int verbose)
 {
    BSOCK   *fd;
+   char ed1[30];
 
    if (!jcr->file_bsock) {
       fd = bnet_connect(jcr, retry_interval, max_retry_time,
@@ -92,7 +93,7 @@ int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time,
    /*
     * Now send JobId and authorization key
     */
-   bnet_fsend(fd, jobcmd, jcr->JobId, jcr->Job, jcr->VolSessionId,
+   bnet_fsend(fd, jobcmd, edit_int64(jcr->JobId, ed1), jcr->Job, jcr->VolSessionId,
       jcr->VolSessionTime, jcr->sd_auth_key);
    if (strcmp(jcr->sd_auth_key, "dummy") != 0) {
       memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key));
@@ -421,19 +422,19 @@ bool send_exclude_list(JCR *jcr)
 
 
 /*
- * Send bootstrap file if any to the socket given (FD or SD).
- *  This is used for restore, verify VolumeToCatalog, and
- *  for migration.
+ * Send bootstrap file if any to the File daemon.
+ *  This is used for restore and verify VolumeToCatalog
  */
-bool send_bootstrap_file(JCR *jcr, BSOCK *sock)
+bool send_bootstrap_file(JCR *jcr)
 {
    FILE *bs;
    char buf[1000];
+   BSOCK *fd = jcr->file_bsock;
    const char *bootstrap = "bootstrap\n";
 
    Dmsg1(400, "send_bootstrap_file: %s\n", jcr->RestoreBootstrap);
    if (!jcr->RestoreBootstrap) {
-      return true;
+      return 1;
    }
    bs = fopen(jcr->RestoreBootstrap, "r");
    if (!bs) {
@@ -441,19 +442,23 @@ bool send_bootstrap_file(JCR *jcr, BSOCK *sock)
       Jmsg(jcr, M_FATAL, 0, _("Could not open bootstrap file %s: ERR=%s\n"),
          jcr->RestoreBootstrap, be.strerror());
       set_jcr_job_status(jcr, JS_ErrorTerminated);
-      return false;
+      return 0;
    }
-   bnet_fsend(sock, bootstrap);
+   bnet_fsend(fd, bootstrap);
    while (fgets(buf, sizeof(buf), bs)) {
-      bnet_fsend(sock, "%s", buf);
+      bnet_fsend(fd, "%s", buf);
    }
-   bnet_sig(sock, BNET_EOD);
+   bnet_sig(fd, BNET_EOD);
    fclose(bs);
    if (jcr->unlink_bsr) {
       unlink(jcr->RestoreBootstrap);
       jcr->unlink_bsr = false;
    }                         
-   return true;
+   if (!response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
+      set_jcr_job_status(jcr, JS_ErrorTerminated);
+      return 0;
+   }
+   return 1;
 }
 
 /*
@@ -504,7 +509,7 @@ int get_attributes_and_put_in_catalog(JCR *jcr)
    jcr->FileIndex = 0;
 
    Dmsg0(120, "bdird: waiting to receive file attributes\n");
-   /* Pickup file attributes and digest */
+   /* Pickup file attributes and signature */
    while (!fd->errors && (n = bget_dirmsg(fd)) > 0) {
 
    /*****FIXME****** improve error handling to stop only on
@@ -514,11 +519,11 @@ int get_attributes_and_put_in_catalog(JCR *jcr)
       long file_index;
       int stream, len;
       char *attr, *p, *fn;
-      char Opts_Digest[MAXSTRING];      /* either Verify opts or MD5/SHA1 digest */
-      char digest[CRYPTO_DIGEST_MAX_SIZE];
+      char Opts_SIG[MAXSTRING];      /* either Verify opts or MD5/SHA1 signature */
+      char SIG[MAXSTRING];
 
       jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen);
-      if ((len = sscanf(fd->msg, "%ld %d %s", &file_index, &stream, Opts_Digest)) != 3) {
+      if ((len = sscanf(fd->msg, "%ld %d %s", &file_index, &stream, Opts_SIG)) != 3) {
          Jmsg(jcr, M_FATAL, 0, _("<filed: bad attributes, expected 3 fields got %d\n"
 "msglen=%d msg=%s\n"), len, fd->msglen, fd->msg);
          set_jcr_job_status(jcr, JS_ErrorTerminated);
@@ -550,8 +555,8 @@ int get_attributes_and_put_in_catalog(JCR *jcr)
          ar.ClientId = jcr->ClientId;
          ar.PathId = 0;
          ar.FilenameId = 0;
-         ar.Digest = NULL;
-         ar.DigestType = CRYPTO_DIGEST_NONE;
+         ar.Sig = NULL;
+         ar.SigType = 0;
 
          Dmsg2(111, "dird<filed: stream=%d %s\n", stream, jcr->fname);
          Dmsg1(120, "dird<filed: attr=%s\n", attr);
@@ -562,17 +567,17 @@ int get_attributes_and_put_in_catalog(JCR *jcr)
             continue;
          }
          jcr->FileId = ar.FileId;
-      } else if (crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
+      } else if (stream == STREAM_MD5_SIGNATURE || stream == STREAM_SHA1_SIGNATURE) {
          if (jcr->FileIndex != (uint32_t)file_index) {
-            Jmsg3(jcr, M_ERROR, 0, _("%s index %d not same as attributes %d\n"),
-               stream_to_ascii(stream), file_index, jcr->FileIndex);
+            Jmsg2(jcr, M_ERROR, 0, _("MD5/SHA1 index %d not same as attributes %d\n"),
+               file_index, jcr->FileIndex);
             set_jcr_job_status(jcr, JS_Error);
             continue;
          }
-         db_escape_string(digest, Opts_Digest, strlen(Opts_Digest));
-         Dmsg2(120, "DigestLen=%d Digest=%s\n", strlen(digest), digest);
-         if (!db_add_digest_to_file_record(jcr, jcr->db, jcr->FileId, digest,
-                   crypto_digest_stream_type(stream))) {
+         db_escape_string(SIG, Opts_SIG, strlen(Opts_SIG));
+         Dmsg2(120, "SIGlen=%d SIG=%s\n", strlen(SIG), SIG);
+         if (!db_add_SIG_to_file_record(jcr, jcr->db, jcr->FileId, SIG,
+                   stream==STREAM_MD5_SIGNATURE?MD5_SIG:SHA1_SIG)) {
             Jmsg1(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
             set_jcr_job_status(jcr, JS_Error);
          }
index bd5dea6157d35ab0fe3597d0c1c26c8a56d4a2d5..8150cb89727998543fce92491b2d8526fbbdaa4a 100644 (file)
@@ -21,7 +21,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -304,9 +304,11 @@ bool response(JCR *jcr, BSOCK *bs, char *resp, const char *cmd, e_prtmsg prtmsg)
       return false;
    }
    if ((n = bget_dirmsg(bs)) >= 0) {
+      Dmsg0(900, bs->msg);
       if (strcmp(bs->msg, resp) == 0) {
          return true;
       }
+      Dmsg1(900, "Bad response: ERR=%s", bs->msg);
       if (prtmsg == DISPLAY_ERROR) {
          Jmsg(jcr, M_FATAL, 0, _("Bad response to %s command: wanted %s, got %s\n"),
             cmd, resp, bs->msg);
index 67ebde2ac8dcbe1c1ac8167898f0646dd700853f..23a1f7d3ad70c94ada46eac4faf6ec274be2afcc 100644 (file)
@@ -7,7 +7,7 @@
  *     Version $Id$
  */
 /*
-   Copyright (C) 2003-2005 Kern Sibbald
+   Copyright (C) 2003-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
@@ -23,7 +23,9 @@
 
 #include "bacula.h"
 #include "dird.h"
-#ifdef HAVE_REGEX_H
+#ifndef HAVE_REGEX_H
+#include "lib/bregex.h"
+#else
 #include <regex.h>
 #endif
 
@@ -103,7 +105,7 @@ static RES_ITEM options_items[] = {
 enum {
    INC_KW_NONE,
    INC_KW_COMPRESSION,
-   INC_KW_DIGEST,
+   INC_KW_SIGNATURE,
    INC_KW_ENCRYPTION,
    INC_KW_VERIFY,
    INC_KW_ONEFS,
@@ -129,7 +131,7 @@ enum {
  */
 static struct s_kw FS_option_kw[] = {
    {"compression", INC_KW_COMPRESSION},
-   {"signature",   INC_KW_DIGEST},
+   {"signature",   INC_KW_SIGNATURE},
    {"encryption",  INC_KW_ENCRYPTION},
    {"verify",      INC_KW_VERIFY},
    {"onefs",       INC_KW_ONEFS},
@@ -163,10 +165,8 @@ struct s_fs_opt {
  * included files.
  */
 static struct s_fs_opt FS_options[] = {
-   {"md5",      INC_KW_DIGEST,        "M"},
-   {"sha1",     INC_KW_DIGEST,        "S"},
-   {"sha256",   INC_KW_DIGEST,       "S2"},
-   {"sha512",   INC_KW_DIGEST,       "S3"},
+   {"md5",      INC_KW_SIGNATURE,    "M"},
+   {"sha1",     INC_KW_SIGNATURE,    "S"},
    {"gzip",     INC_KW_COMPRESSION,  "Z6"},
    {"gzip1",    INC_KW_COMPRESSION,  "Z1"},
    {"gzip2",    INC_KW_COMPRESSION,  "Z2"},
@@ -531,23 +531,28 @@ static void store_fname(LEX *lc, RES_ITEM *item, int index, int pass)
       /* Pickup Filename string
        */
       switch (token) {
-         case T_IDENTIFIER:
-         case T_UNQUOTED_STRING:
-         case T_QUOTED_STRING:
-            if (res_all.res_fs.have_MD5) {
-               MD5Update(&res_all.res_fs.md5c, (unsigned char *)lc->str, lc->str_len);
-            }
-            incexe = &res_incexe;
-            if (incexe->name_list.size() == 0) {
-               incexe->name_list.init(10, true);
-            }
-            incexe->name_list.append(bstrdup(lc->str));
-            Dmsg1(900, "Add to name_list %s\n", lc->str);
-            break;
-         default:
-            scan_err1(lc, _("Expected a filename, got: %s"), lc->str);
+      case T_IDENTIFIER:
+      case T_UNQUOTED_STRING:
+         if (strchr(lc->str, '\\')) {
+            scan_err1(lc, _("Backslash found. Use forward slashes or quote the string.: %s\n"), lc->str);
+            /* NOT REACHED */
+         }
+      case T_QUOTED_STRING:
+         if (res_all.res_fs.have_MD5) {
+            MD5Update(&res_all.res_fs.md5c, (unsigned char *)lc->str, lc->str_len);
+         }
+         incexe = &res_incexe;
+         if (incexe->name_list.size() == 0) {
+            incexe->name_list.init(10, true);
+         }
+         incexe->name_list.append(bstrdup(lc->str));
+         Dmsg1(900, "Add to name_list %s\n", lc->str);
+         break;
+      default:
+         scan_err1(lc, _("Expected a filename, got: %s"), lc->str);
       }
    }
+
    scan_to_eol(lc);
 }
 
index f23976861c8e3b95803e459d1044d1182275db9c..a4a663283fe9e1db612f8745ce46016049188723 100644 (file)
@@ -73,24 +73,10 @@ void term_job_server()
  */
 JobId_t run_job(JCR *jcr)
 {
-   int stat;
-   if (setup_job(jcr)) {
-      /* Queue the job to be run */
-      if ((stat = jobq_add(&job_queue, jcr)) != 0) {
-         berrno be;
-         Jmsg(jcr, M_FATAL, 0, _("Could not add job queue: ERR=%s\n"), be.strerror(stat));
-         return 0;
-      }
-      return jcr->JobId;
-   }
-   return 0;
-}            
+   int stat, errstat;
+   JobId_t JobId = 0;
 
-bool setup_job(JCR *jcr) 
-{
-   int errstat;
-
-   P(jcr->mutex);
+   jcr->lock();
    sm_check(__FILE__, __LINE__, true);
    init_msg(jcr, jcr->messages);
 
@@ -102,6 +88,9 @@ bool setup_job(JCR *jcr)
    }
    jcr->term_wait_inited = true;
 
+   create_unique_job_name(jcr, jcr->job->hdr.name);
+   set_jcr_job_status(jcr, JS_Created);
+   jcr->unlock();
 
    /*
     * Open database
@@ -124,14 +113,12 @@ bool setup_job(JCR *jcr)
    /*
     * Create Job record
     */
-   create_unique_job_name(jcr, jcr->job->hdr.name);
-   set_jcr_job_status(jcr, JS_Created);
    init_jcr_job_record(jcr);
    if (!db_create_job_record(jcr, jcr->db, &jcr->jr)) {
       Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
       goto bail_out;
    }
-   jcr->JobId = jcr->jr.JobId;
+   JobId = jcr->JobId = jcr->jr.JobId;
    Dmsg4(100, "Created job record JobId=%d Name=%s Type=%c Level=%c\n",
        jcr->JobId, jcr->Job, jcr->jr.JobType, jcr->jr.JobLevel);
 
@@ -147,17 +134,23 @@ bool setup_job(JCR *jcr)
 
    Dmsg0(200, "Add jrc to work queue\n");
 
+   /* Queue the job to be run */
+   if ((stat = jobq_add(&job_queue, jcr)) != 0) {
+      berrno be;
+      Jmsg(jcr, M_FATAL, 0, _("Could not add job queue: ERR=%s\n"), be.strerror(stat));
+      JobId = 0;
+      goto bail_out;
+   }
+   Dmsg0(100, "Done run_job()\n");
 
-   V(jcr->mutex);
-   return true;
+   return JobId;
 
 bail_out:
    if (jcr->fname) {
       free_memory(jcr->fname);
       jcr->fname = NULL;
    }
-   V(jcr->mutex);
-   return false;
+   return JobId;
 }
 
 
@@ -269,6 +262,21 @@ static void *job_thread(void *arg)
          }
       }
 
+      /*    
+       * We re-update the job start record so that the start
+       *  time is set after the run before job.  This avoids 
+       *  that any files created by the run before job will
+       *  be saved twice.  They will be backed up in the current
+       *  job, but not in the next one unless they are changed.
+       *  Without this, they will be backed up in this job and
+       *  in the next job run because in that case, their date 
+       *   is after the start of this run.
+       */
+      jcr->start_time = time(NULL);
+      jcr->jr.StartTime = jcr->start_time;
+      if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
+         Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
+      }
       generate_job_event(jcr, "JobRun");
 
       switch (jcr->JobType) {
@@ -385,6 +393,7 @@ bool cancel_job(UAContext *ua, JCR *jcr)
       return true;
 
    default:
+
       /* Cancel File daemon */
       if (jcr->file_bsock) {
          ua->jcr->client = jcr->client;
@@ -406,7 +415,7 @@ bool cancel_job(UAContext *ua, JCR *jcr)
       /* Cancel Storage daemon */
       if (jcr->store_bsock) {
          if (!ua->jcr->storage) {
-            copy_storage(ua->jcr, jcr->storage);
+            copy_storage(ua->jcr, jcr);
          } else {
             set_storage(ua->jcr, jcr->store);
          }
@@ -647,13 +656,13 @@ bool get_or_create_fileset_record(JCR *jcr)
    bstrncpy(fsr.FileSet, jcr->fileset->hdr.name, sizeof(fsr.FileSet));
    if (jcr->fileset->have_MD5) {
       struct MD5Context md5c;
-      unsigned char digest[MD5HashSize];
+      unsigned char signature[16];
       memcpy(&md5c, &jcr->fileset->md5c, sizeof(md5c));
-      MD5Final(digest, &md5c);
-      bin_to_base64(fsr.MD5, (char *)digest, MD5HashSize);
+      MD5Final(signature, &md5c);
+      bin_to_base64(fsr.MD5, (char *)signature, 16); /* encode 16 bytes */
       bstrncpy(jcr->fileset->MD5, fsr.MD5, sizeof(jcr->fileset->MD5));
    } else {
-      Jmsg(jcr, M_WARNING, 0, _("FileSet MD5 digest not found.\n"));
+      Jmsg(jcr, M_WARNING, 0, _("FileSet MD5 signature not found.\n"));
    }
    if (!jcr->fileset->ignore_fs_changes ||
        !db_get_fileset_record(jcr, jcr->db, &fsr)) {
@@ -828,6 +837,7 @@ void dird_free_jcr(JCR *jcr)
  */
 void set_jcr_defaults(JCR *jcr, JOB *job)
 {
+   STORE *st;
    jcr->job = job;
    jcr->JobType = job->JobType;
    switch (jcr->JobType) {
@@ -841,7 +851,18 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
    }
    jcr->JobPriority = job->Priority;
    /* Copy storage definitions -- deleted in dir_free_jcr above */
-   copy_storage(jcr, job->storage);
+   if (job->storage) {
+      if (jcr->storage) {
+         delete jcr->storage;
+      }
+      jcr->storage = New(alist(10, not_owned_by_alist));
+      foreach_alist(st, job->storage) {
+         jcr->storage->append(st);
+      }
+   }
+   if (jcr->storage) {
+      jcr->store = (STORE *)jcr->storage->first();
+   }
    jcr->client = job->client;
    if (!jcr->client_name) {
       jcr->client_name = get_pool_memory(PM_NAME);
@@ -885,28 +906,28 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
    }
 }
 
-
-/* 
- * Copy the storage definitions from an alist to the JCR
+/*
+ * copy the storage definitions from an old JCR to a new one
  */
-void copy_storage(JCR *jcr, alist *storage)
+void copy_storage(JCR *new_jcr, JCR *old_jcr)
 {
-   if (storage) {
+   if (old_jcr->storage) {
       STORE *st;
-      if (jcr->storage) {
-         delete jcr->storage;
+      if (new_jcr->storage) {
+         delete new_jcr->storage;
       }
-      jcr->storage = New(alist(10, not_owned_by_alist));
-      foreach_alist(st, storage) {
-         jcr->storage->append(st);
+      new_jcr->storage = New(alist(10, not_owned_by_alist));
+      foreach_alist(st, old_jcr->storage) {
+         new_jcr->storage->append(st);
       }
-   }               
-   if (jcr->storage) {
-      jcr->store = (STORE *)jcr->storage->first();
+   }
+   if (old_jcr->store) {
+      new_jcr->store = old_jcr->store;
+   } else if (new_jcr->storage) {
+      new_jcr->store = (STORE *)new_jcr->storage->first();
    }
 }
 
-
 /* Set storage override */
 void set_storage(JCR *jcr, STORE *store)
 {
@@ -921,64 +942,3 @@ void set_storage(JCR *jcr, STORE *store)
    /* Store not in list, so add it */
    jcr->storage->prepend(store);
 }
-
-void create_clones(JCR *jcr)
-{
-   /*
-    * Fire off any clone jobs (run directives)
-    */
-   Dmsg2(900, "cloned=%d run_cmds=%p\n", jcr->cloned, jcr->job->run_cmds);
-   if (!jcr->cloned && jcr->job->run_cmds) {
-      char *runcmd;
-      JOB *job = jcr->job;
-      POOLMEM *cmd = get_pool_memory(PM_FNAME);
-      UAContext *ua = new_ua_context(jcr);
-      ua->batch = true;
-      foreach_alist(runcmd, job->run_cmds) {
-         cmd = edit_job_codes(jcr, cmd, runcmd, "");              
-         Mmsg(ua->cmd, "run %s cloned=yes", cmd);
-         Dmsg1(900, "=============== Clone cmd=%s\n", ua->cmd);
-         parse_ua_args(ua);                 /* parse command */
-         int stat = run_cmd(ua, ua->cmd);
-         if (stat == 0) {
-            Jmsg(jcr, M_ERROR, 0, _("Could not start clone job.\n"));
-         } else {
-            Jmsg(jcr, M_INFO, 0, _("Clone JobId %d started.\n"), stat);
-         }
-      }
-      free_ua_context(ua);
-      free_pool_memory(cmd);
-   }
-}
-
-bool create_restore_bootstrap_file(JCR *jcr)
-{
-   RESTORE_CTX rx;
-   UAContext *ua;
-   memset(&rx, 0, sizeof(rx));
-   rx.bsr = new_bsr();
-   rx.JobIds = "";                       
-   rx.bsr->JobId = jcr->target_jr.JobId;
-   ua = new_ua_context(jcr);
-   complete_bsr(ua, rx.bsr);
-   rx.bsr->fi = new_findex();
-   rx.bsr->fi->findex = 1;
-   rx.bsr->fi->findex2 = jcr->target_jr.JobFiles;
-   jcr->ExpectedFiles = write_bsr_file(ua, rx);
-   if (jcr->ExpectedFiles == 0) {
-      free_ua_context(ua);
-      free_bsr(rx.bsr);
-      return false;
-   }
-   if (jcr->RestoreBootstrap) {
-      free(jcr->RestoreBootstrap);
-   }
-   POOLMEM *fname = get_pool_memory(PM_MESSAGE);
-   make_unique_restore_filename(ua, &fname);
-   jcr->RestoreBootstrap = bstrdup(fname);
-   free_ua_context(ua);
-   free_bsr(rx.bsr);
-   free_pool_memory(fname);
-   jcr->needs_sd = true;
-   return true;
-}
index 6ec9a5de51cd4bebe807282ee03ff8d9f0fee4af..b83098d8627e916885e051d4d025db43626b6bd1 100755 (executable)
  *
  */
 /*
-   Copyright (C) 2003-2005 Kern Sibbald
+   Copyright (C) 2003-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 as
-   published by the Free Software Foundation; either version 2 of
-   the License, or (at your option) any later version.
+   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 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.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
+   the file LICENSE for additional details.
 
  */
 
@@ -182,7 +177,8 @@ void *sched_wait(void *arg)
    }
    /* Check every 30 seconds if canceled */
    while (wtime > 0) {
-      Dmsg2(2300, "Waiting on sched time, jobid=%d secs=%d\n", jcr->JobId, wtime);
+      Dmsg3(2300, "Waiting on sched time, jobid=%d secs=%d use=%d\n", 
+         jcr->JobId, wtime, jcr->use_count());
       if (wtime > 30) {
          wtime = 30;
       }
@@ -192,9 +188,8 @@ void *sched_wait(void *arg)
       }
       wtime = jcr->sched_time - time(NULL);
    }
-   P(jcr->mutex);                     /* lock jcr */
+   Dmsg1(200, "resched use=%d\n", jcr->use_count());
    jobq_add(jq, jcr);
-   V(jcr->mutex);
    free_jcr(jcr);                     /* we are done with jcr */
    Dmsg0(2300, "Exit sched_wait\n");
    return NULL;
@@ -203,9 +198,6 @@ void *sched_wait(void *arg)
 /*
  *  Add a job to the queue
  *    jq is a queue that was created with jobq_init
- *
- *  On entry jcr->mutex must be locked.
- *
  */
 int jobq_add(jobq_t *jq, JCR *jcr)
 {
@@ -216,14 +208,14 @@ int jobq_add(jobq_t *jq, JCR *jcr)
    pthread_t id;
    wait_pkt *sched_pkt;
 
-   Dmsg3(2300, "jobq_add jobid=%d jcr=0x%x use_count=%d\n", jcr->JobId, jcr, jcr->use_count);
+   Dmsg3(2300, "jobq_add jobid=%d jcr=0x%x use_count=%d\n", jcr->JobId, jcr, jcr->use_count());
    if (jq->valid != JOBQ_VALID) {
       Jmsg0(jcr, M_ERROR, 0, "Jobq_add queue not initialized.\n");
       return EINVAL;
    }
 
-   jcr->use_count++;                  /* mark jcr in use by us */
-   Dmsg3(2300, "jobq_add jobid=%d jcr=0x%x use_count=%d\n", jcr->JobId, jcr, jcr->use_count);
+   jcr->inc_use_count();                 /* mark jcr in use by us */
+   Dmsg3(2300, "jobq_add jobid=%d jcr=0x%x use_count=%d\n", jcr->JobId, jcr, jcr->use_count());
    if (!job_canceled(jcr) && wtime > 0) {
       set_thread_concurrency(jq->max_workers + 2);
       sched_pkt = (wait_pkt *)malloc(sizeof(wait_pkt));
@@ -240,12 +232,12 @@ int jobq_add(jobq_t *jq, JCR *jcr)
    if ((stat = pthread_mutex_lock(&jq->mutex)) != 0) {
       berrno be;
       Jmsg1(jcr, M_ERROR, 0, _("pthread_mutex_lock: ERR=%s\n"), be.strerror(stat));
-      jcr->use_count--;               /* release jcr */
+      free_jcr(jcr);                    /* release jcr */
       return stat;
    }
 
    if ((item = (jobq_item_t *)malloc(sizeof(jobq_item_t))) == NULL) {
-      jcr->use_count--;               /* release jcr */
+      free_jcr(jcr);                    /* release jcr */
       return ENOMEM;
    }
    item->jcr = jcr;
@@ -444,10 +436,12 @@ void *jobq_server(void *arg)
          V(jq->mutex);
 
          /* Call user's routine here */
-         Dmsg1(2300, "Calling user engine for jobid=%d\n", jcr->JobId);
+         Dmsg2(2300, "Calling user engine for jobid=%d use=%d\n", jcr->JobId,
+            jcr->use_count());
          jq->engine(je->jcr);
 
-         Dmsg1(2300, "Back from user engine jobid=%d.\n", jcr->JobId);
+         Dmsg2(2300, "Back from user engine jobid=%d use=%d.\n", jcr->JobId,
+            jcr->use_count());
 
          /* Reacquire job queue lock */
          P(jq->mutex);
@@ -490,11 +484,12 @@ void *jobq_server(void *arg)
             jcr->JobStatus = JS_WaitStartTime;
             jcr->SDJobStatus = 0;
             if (jcr->JobBytes == 0) {
-               Dmsg1(2300, "Requeue job=%d\n", jcr->JobId);
+               Dmsg2(2300, "Requeue job=%d use=%d\n", jcr->JobId, jcr->use_count());
                jcr->JobStatus = JS_WaitStartTime;
                V(jq->mutex);
                jobq_add(jq, jcr);     /* queue the job to run again */
                P(jq->mutex);
+               free_jcr(jcr);         /* release jcr */
                free(je);              /* free the job entry */
                continue;              /* look for another job to run */
             }
@@ -509,7 +504,7 @@ void *jobq_server(void *arg)
             njcr->reschedule_count = jcr->reschedule_count;
             njcr->JobLevel = jcr->JobLevel;
             njcr->JobStatus = jcr->JobStatus;
-            copy_storage(njcr, jcr->storage);
+            copy_storage(njcr, jcr);
             njcr->messages = jcr->messages;
             Dmsg0(2300, "Call to run new job\n");
             V(jq->mutex);
@@ -523,7 +518,7 @@ void *jobq_server(void *arg)
             db_close_database(jcr, jcr->db);
             jcr->db = NULL;
          }
-         Dmsg2(2300, "====== Termination job=%d use_cnt=%d\n", jcr->JobId, jcr->use_count);
+         Dmsg2(2300, "====== Termination job=%d use_cnt=%d\n", jcr->JobId, jcr->use_count());
          jcr->SDJobStatus = 0;
          V(jq->mutex);                /* release internal lock */
          free_jcr(jcr);
index d0425523771c7aa7e80ffd7d322b39b1064b3879..163304779fdd8e7a5d83729445d66353580c454d 100644 (file)
@@ -8,14 +8,14 @@
  *  Basic tasks done here:
  *     Open DB and create records for this job.
  *     Open Message Channel with Storage daemon to tell him a job will be starting.
- *     Open connection with Storage daemon and pass him commands
+ *     Open connection with File daemon and pass him commands
  *       to do the backup.
- *     When the Storage daemon finishes the job, update the DB.
+ *     When the File daemon finishes the job, update the DB.
  *
  *   Version $Id$
  */
 /*
-   Copyright (C) 2004-2006 Kern Sibbald
+   Copyright (C) 2004-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -33,8 +33,6 @@
 #include "dird.h"
 #include "ua.h"
 
-static char OKbootstrap[] = "3000 OK bootstrap\n";
-
 /* 
  * Called here before the job is run to do the job
  *   specific setup.
@@ -42,7 +40,11 @@ static char OKbootstrap[] = "3000 OK bootstrap\n";
 bool do_mac_init(JCR *jcr)
 {
    POOL_DBR pr;
+   JOB_DBR jr;
+   JobId_t input_jobid;
    char *Name;
+   RESTORE_CTX rx;
+   UAContext *ua;
    const char *Type;
 
    switch(jcr->JobType) {
@@ -67,35 +69,36 @@ bool do_mac_init(JCR *jcr)
    /*
     * Find JobId of last job that ran.
     */
+   memcpy(&jr, &jcr->jr, sizeof(jr));
    Name = jcr->job->migration_job->hdr.name;
    Dmsg1(100, "find last jobid for: %s\n", NPRT(Name));
-   jcr->target_jr.JobType = JT_BACKUP;
-   if (!db_find_last_jobid(jcr, jcr->db, Name, &jcr->target_jr)) {
-      Jmsg(jcr, M_FATAL, 0, 
-           _("Previous job \"%s\" not found. ERR=%s\n"), Name,
-           db_strerror(jcr->db));
+   if (!db_find_last_jobid(jcr, jcr->db, Name, &jr)) {
+      Jmsg(jcr, M_FATAL, 0, _(
+           _("Unable to find JobId of previous Job for this client.\n")));
       return false;
    }
-   Dmsg1(100, "Last jobid=%d\n", jcr->target_jr.JobId);
+   input_jobid = jr.JobId;
+   Dmsg1(100, "Last jobid=%d\n", input_jobid);
 
-   if (!db_get_job_record(jcr, jcr->db, &jcr->target_jr)) {
+   jcr->previous_jr.JobId = input_jobid;
+   if (!db_get_job_record(jcr, jcr->db, &jcr->previous_jr)) {
       Jmsg(jcr, M_FATAL, 0, _("Could not get job record for previous Job. ERR=%s"),
            db_strerror(jcr->db));
       return false;
    }
-   if (jcr->target_jr.JobStatus != 'T') {
+   if (jcr->previous_jr.JobStatus != 'T') {
       Jmsg(jcr, M_FATAL, 0, _("Last Job %d did not terminate normally. JobStatus=%c\n"),
-         jcr->target_jr.JobId, jcr->target_jr.JobStatus);
+         input_jobid, jcr->previous_jr.JobStatus);
       return false;
    }
    Jmsg(jcr, M_INFO, 0, _("%s using JobId=%d Job=%s\n"),
-      Type, jcr->target_jr.JobId, jcr->target_jr.Job);
+      Type, jcr->previous_jr.JobId, jcr->previous_jr.Job);
 
 
    /*
     * Get the Pool record -- first apply any level defined pools
     */
-   switch (jcr->target_jr.JobLevel) {
+   switch (jcr->JobLevel) {
    case L_FULL:
       if (jcr->full_pool) {
          jcr->pool = jcr->full_pool;
@@ -125,19 +128,28 @@ bool do_mac_init(JCR *jcr)
          Jmsg(jcr, M_INFO, 0, _("Pool %s created in database.\n"), pr.Name);
       }
    }
+   jcr->PoolId = pr.PoolId;               /****FIXME**** this can go away */
    jcr->jr.PoolId = pr.PoolId;
 
-   /* If pool storage specified, use it instead of job storage */
-   copy_storage(jcr, jcr->pool->storage);
-
-   if (!jcr->storage) {
-      Jmsg(jcr, M_FATAL, 0, _("No Storage specification found in Job or Pool.\n"));
+   memset(&rx, 0, sizeof(rx));
+   rx.bsr = new_bsr();
+   rx.JobIds = "";                       
+   rx.bsr->JobId = jcr->previous_jr.JobId;
+   ua = new_ua_context(jcr);
+   complete_bsr(ua, rx.bsr);
+   rx.bsr->fi = new_findex();
+   rx.bsr->fi->findex = 1;
+   rx.bsr->fi->findex2 = jcr->previous_jr.JobFiles;
+   jcr->ExpectedFiles = write_bsr_file(ua, rx);
+   if (jcr->ExpectedFiles == 0) {
+      free_ua_context(ua);
+      free_bsr(rx.bsr);
       return false;
    }
+   free_ua_context(ua);
+   free_bsr(rx.bsr);
 
-   if (!create_restore_bootstrap_file(jcr)) {
-      return false;
-   }
+   jcr->needs_sd = true;
    return true;
 }
 
@@ -149,13 +161,9 @@ bool do_mac_init(JCR *jcr)
  */
 bool do_mac(JCR *jcr)
 {
-   POOL_DBR pr;
-   POOL *pool;
+   int stat;
    const char *Type;
    char ed1[100];
-   BSOCK *sd;
-   JOB *job, *tjob;
-   JCR *tjcr;
 
    switch(jcr->JobType) {
    case JT_MIGRATE:
@@ -173,99 +181,10 @@ bool do_mac(JCR *jcr)
    }
 
 
-   Dmsg4(100, "Target: Name=%s JobId=%d Type=%c Level=%c\n",
-      jcr->target_jr.Name, jcr->target_jr.JobId, 
-      jcr->target_jr.JobType, jcr->target_jr.JobLevel);
-
-   Dmsg4(100, "Current: Name=%s JobId=%d Type=%c Level=%c\n",
-      jcr->jr.Name, jcr->jr.JobId, 
-      jcr->jr.JobType, jcr->jr.JobLevel);
-
-   LockRes();
-   job = (JOB *)GetResWithName(R_JOB, jcr->jr.Name);
-   tjob = (JOB *)GetResWithName(R_JOB, jcr->target_jr.Name);
-   UnlockRes();
-   if (!job || !tjob) {
-      return false;
-   }
-
-   /* 
-    * Target jcr is the new Job that corresponds to the original
-    *  target job. It "runs" at the same time as the current 
-    *  migration job and becomes a new backup job that replaces
-    *  the original backup job.  Most operations on the current
-    *  migration jcr are also done on the target jcr.
-    */
-   tjcr = jcr->target_jcr = new_jcr(sizeof(JCR), dird_free_jcr);
-   memcpy(&tjcr->target_jr, &jcr->target_jr, sizeof(tjcr->target_jr));
-
-   /* Turn the tjcr into a "real" job */
-   set_jcr_defaults(tjcr, tjob);
-   if (!setup_job(tjcr)) {
-      return false;
-   }
-   /* Set output PoolId and FileSetId. */
-   tjcr->jr.PoolId = jcr->jr.PoolId;
-   tjcr->jr.FileSetId = jcr->jr.FileSetId;
-
-   /*
-    * Get the PoolId used with the original job. Then
-    *  find the pool name from the database record.
-    */
-   memset(&pr, 0, sizeof(pr));
-   pr.PoolId = tjcr->target_jr.PoolId;
-   if (!db_get_pool_record(jcr, jcr->db, &pr)) {
-      char ed1[50];
-      Jmsg(jcr, M_FATAL, 0, _("Pool for JobId %s not in database. ERR=%s\n"),
-            edit_int64(pr.PoolId, ed1), db_strerror(jcr->db));
-         return false;
-   }
-   /* Get the pool resource corresponding to the original job */
-   pool = (POOL *)GetResWithName(R_POOL, pr.Name);
-   if (!pool) {
-      Jmsg(jcr, M_FATAL, 0, _("Pool resource \"%s\" not found.\n"), pr.Name);
-      return false;
-   }
-
-   /* Check Migration time and High/Low water marks */
-   /* ***FIXME*** */
-
-   /* If pool storage specified, use it for restore */
-   copy_storage(tjcr, pool->storage);
-
-   /* If the original backup pool has a NextPool, make sure a 
-    *  record exists in the database.
-    */
-   if (pool->NextPool) {
-      memset(&pr, 0, sizeof(pr));
-      bstrncpy(pr.Name, pool->NextPool->hdr.name, sizeof(pr.Name));
-
-      while (!db_get_pool_record(jcr, jcr->db, &pr)) { /* get by Name */
-         /* Try to create the pool */
-         if (create_pool(jcr, jcr->db, pool->NextPool, POOL_OP_CREATE) < 0) {
-            Jmsg(jcr, M_FATAL, 0, _("Pool \"%s\" not in database. %s"), pr.Name,
-               db_strerror(jcr->db));
-            return false;
-         } else {
-            Jmsg(jcr, M_INFO, 0, _("Pool \"%s\" created in database.\n"), pr.Name);
-         }
-      }
-      /*
-       * put the "NextPool" resource pointer in our jcr so that we
-       * can pull the Storage reference from it.
-       */
-      tjcr->pool = jcr->pool = pool->NextPool;
-      tjcr->jr.PoolId = jcr->jr.PoolId = pr.PoolId;
-   }
-
-   /* If pool storage specified, use it instead of job storage for backup */
-   copy_storage(jcr, jcr->pool->storage);
-
    /* Print Job Start message */
    Jmsg(jcr, M_INFO, 0, _("Start %s JobId %s, Job=%s\n"),
         Type, edit_uint64(jcr->JobId, ed1), jcr->Job);
 
-   set_jcr_job_status(jcr, JS_Running);
    set_jcr_job_status(jcr, JS_Running);
    Dmsg2(100, "JobId=%d JobLevel=%c\n", jcr->jr.JobId, jcr->jr.JobLevel);
    if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
@@ -273,12 +192,6 @@ bool do_mac(JCR *jcr)
       return false;
    }
 
-   if (!db_update_job_start_record(tjcr, tjcr->db, &tjcr->jr)) {
-      Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(tjcr->db));
-      return false;
-   }
-
-
    /*
     * Open a message channel connection with the Storage
     * daemon. This is to let him know that our client
@@ -287,52 +200,39 @@ bool do_mac(JCR *jcr)
     */
    Dmsg0(110, "Open connection with storage daemon\n");
    set_jcr_job_status(jcr, JS_WaitSD);
-   set_jcr_job_status(tjcr, JS_WaitSD);
    /*
     * Start conversation with Storage daemon
     */
    if (!connect_to_storage_daemon(jcr, 10, SDConnectTimeout, 1)) {
       return false;
    }
-   sd = jcr->store_bsock;
    /*
     * Now start a job with the Storage daemon
     */
-   Dmsg2(000, "Read store=%s, write store=%s\n", 
-      ((STORE *)tjcr->storage->first())->hdr.name,
-      ((STORE *)jcr->storage->first())->hdr.name);
-   if (!start_storage_daemon_job(jcr, tjcr->storage, jcr->storage)) {
-      return false;
-   }
-   Dmsg0(150, "Storage daemon connection OK\n");
-
-   if (!send_bootstrap_file(jcr, sd) ||
-       !response(jcr, sd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
+   if (!start_storage_daemon_job(jcr, jcr->storage, jcr->storage)) {
       return false;
    }
-
-
    /*
     * Now start a Storage daemon message thread
     */
    if (!start_storage_daemon_message_thread(jcr)) {
       return false;
    }
+   Dmsg0(150, "Storage daemon connection OK\n");
 
-   if (!bnet_fsend(sd, "run")) {
-      return false;
-   }
-
+   /* Pickup Job termination data */
    set_jcr_job_status(jcr, JS_Running);
-   set_jcr_job_status(tjcr, JS_Running);
 
-   /* Pickup Job termination data */
    /* Note, the SD stores in jcr->JobFiles/ReadBytes/JobBytes/Errors */
    wait_for_storage_daemon_termination(jcr);
 
-   jcr->JobStatus = jcr->SDJobStatus;
-   if (jcr->JobStatus == JS_Terminated) {
-      mac_cleanup(jcr, jcr->JobStatus);
+   if (jcr->JobStatus != JS_Terminated) {
+      stat = jcr->JobStatus;
+   } else {
+      stat = jcr->SDJobStatus;
+   }
+   if (stat == JS_Terminated) {
+      mac_cleanup(jcr, stat);
       return true;
    }
    return false;
@@ -344,17 +244,15 @@ bool do_mac(JCR *jcr)
  */
 void mac_cleanup(JCR *jcr, int TermCode)
 {
-   char sdt[MAX_TIME_LENGTH], edt[MAX_TIME_LENGTH];
-   char ec1[30], ec2[30], ec3[30], ec4[30], elapsed[50];
-   char term_code[100], sd_term_msg[100];
+   char sdt[50], edt[50];
+   char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30], compress[50];
+   char term_code[100], fd_term_msg[100], sd_term_msg[100];
    const char *term_msg;
    int msg_type;
    MEDIA_DBR mr;
-   double kbps;
+   double kbps, compression;
    utime_t RunTime;
    const char *Type;
-   JCR *tjcr = jcr->target_jcr;
-   POOL_MEM query(PM_MESSAGE);
 
    switch(jcr->JobType) {
    case JT_MIGRATE:
@@ -371,31 +269,12 @@ void mac_cleanup(JCR *jcr, int TermCode)
       break;
    }
 
-   /* Ensure target is defined to avoid a lot of testing */
-   if (!tjcr) {
-      tjcr = jcr;
-   }
-   tjcr->JobFiles = jcr->JobFiles = jcr->SDJobFiles;
-   tjcr->JobBytes = jcr->JobBytes = jcr->SDJobBytes;
-   tjcr->VolSessionId = jcr->VolSessionId;
-   tjcr->VolSessionTime = jcr->VolSessionTime;
-
    Dmsg2(100, "Enter mac_cleanup %d %c\n", TermCode, TermCode);
    dequeue_messages(jcr);             /* display any queued messages */
    memset(&mr, 0, sizeof(mr));
    set_jcr_job_status(jcr, TermCode);
-   set_jcr_job_status(tjcr, TermCode);
-
 
    update_job_end_record(jcr);        /* update database */
-   update_job_end_record(tjcr);
-
-   Mmsg(query, "UPDATE Job SET StartTime='%s',EndTime='%s',"
-               "JobTDate=%s WHERE JobId=%s", 
-      jcr->target_jr.cStartTime, jcr->target_jr.cEndTime, 
-      edit_uint64(jcr->target_jr.JobTDate, ec1),
-      edit_uint64(tjcr->jr.JobId, ec2));
-   db_sql_query(tjcr->db, query.c_str(), NULL, NULL);
 
    if (!db_get_job_record(jcr, jcr->db, &jcr->jr)) {
       Jmsg(jcr, M_WARNING, 0, _("Error getting job record for stats: %s"),
@@ -410,20 +289,77 @@ void mac_cleanup(JCR *jcr, int TermCode)
       set_jcr_job_status(jcr, JS_ErrorTerminated);
    }
 
-   update_bootstrap_file(tjcr);
+   /* Now update the bootstrap file if any */
+   if (jcr->JobStatus == JS_Terminated && jcr->jr.JobBytes &&
+       jcr->job->WriteBootstrap) {
+      FILE *fd;
+      BPIPE *bpipe = NULL;
+      int got_pipe = 0;
+      char *fname = jcr->job->WriteBootstrap;
+      VOL_PARAMS *VolParams = NULL;
+      int VolCount;
+
+      if (*fname == '|') {
+         fname++;
+         got_pipe = 1;
+         bpipe = open_bpipe(fname, 0, "w");
+         fd = bpipe ? bpipe->wfd : NULL;
+      } else {
+         /* ***FIXME*** handle BASE */
+         fd = fopen(fname, jcr->JobLevel==L_FULL?"w+":"a+");
+      }
+      if (fd) {
+         VolCount = db_get_job_volume_parameters(jcr, jcr->db, jcr->JobId,
+                    &VolParams);
+         if (VolCount == 0) {
+            Jmsg(jcr, M_ERROR, 0, _("Could not get Job Volume Parameters to "
+                 "update Bootstrap file. ERR=%s\n"), db_strerror(jcr->db));
+             if (jcr->SDJobFiles != 0) {
+                set_jcr_job_status(jcr, JS_ErrorTerminated);
+             }
+
+         }
+         for (int i=0; i < VolCount; i++) {
+            /* Write the record */
+            fprintf(fd, "Volume=\"%s\"\n", VolParams[i].VolumeName);
+            fprintf(fd, "MediaType=\"%s\"\n", VolParams[i].MediaType);
+            fprintf(fd, "VolSessionId=%u\n", jcr->VolSessionId);
+            fprintf(fd, "VolSessionTime=%u\n", jcr->VolSessionTime);
+            fprintf(fd, "VolFile=%u-%u\n", VolParams[i].StartFile,
+                         VolParams[i].EndFile);
+            fprintf(fd, "VolBlock=%u-%u\n", VolParams[i].StartBlock,
+                         VolParams[i].EndBlock);
+            fprintf(fd, "FileIndex=%d-%d\n", VolParams[i].FirstIndex,
+                         VolParams[i].LastIndex);
+         }
+         if (VolParams) {
+            free(VolParams);
+         }
+         if (got_pipe) {
+            close_bpipe(bpipe);
+         } else {
+            fclose(fd);
+         }
+      } else {
+         berrno be;
+         Jmsg(jcr, M_ERROR, 0, _("Could not open WriteBootstrap file:\n"
+              "%s: ERR=%s\n"), fname, be.strerror());
+         set_jcr_job_status(jcr, JS_ErrorTerminated);
+      }
+   }
 
    msg_type = M_INFO;                 /* by default INFO message */
    switch (jcr->JobStatus) {
       case JS_Terminated:
          if (jcr->Errors || jcr->SDErrors) {
-            term_msg = _("%s OK -- with warnings");
+            term_msg = _("Backup OK -- with warnings");
          } else {
-            term_msg = _("%s OK");
+            term_msg = _("Backup OK");
          }
          break;
       case JS_FatalError:
       case JS_ErrorTerminated:
-         term_msg = _("*** %s Error ***");
+         term_msg = _("*** Backup Error ***");
          msg_type = M_ERROR;          /* Generate error message */
          if (jcr->store_bsock) {
             bnet_sig(jcr->store_bsock, BNET_TERMINATE);
@@ -433,7 +369,7 @@ void mac_cleanup(JCR *jcr, int TermCode)
          }
          break;
       case JS_Canceled:
-         term_msg = _("%s Canceled");
+         term_msg = _("Backup Canceled");
          if (jcr->store_bsock) {
             bnet_sig(jcr->store_bsock, BNET_TERMINATE);
             if (jcr->SD_msg_chan) {
@@ -442,10 +378,10 @@ void mac_cleanup(JCR *jcr, int TermCode)
          }
          break;
       default:
-         term_msg = _("Inappropriate %s term code");
+         term_msg = term_code;
+         sprintf(term_code, _("Inappropriate term code: %c\n"), jcr->JobStatus);
          break;
    }
-   bsnprintf(term_code, sizeof(term_code), term_msg, Type);
    bstrftimes(sdt, sizeof(sdt), jcr->jr.StartTime);
    bstrftimes(edt, sizeof(edt), jcr->jr.EndTime);
    RunTime = jcr->jr.EndTime - jcr->jr.StartTime;
@@ -454,7 +390,7 @@ void mac_cleanup(JCR *jcr, int TermCode)
    } else {
       kbps = (double)jcr->jr.JobBytes / (1000 * RunTime);
    }
-   if (!db_get_job_volume_names(tjcr, tjcr->db, tjcr->jr.JobId, &tjcr->VolumeName)) {
+   if (!db_get_job_volume_names(jcr, jcr->db, jcr->jr.JobId, &jcr->VolumeName)) {
       /*
        * Note, if the job has erred, most likely it did not write any
        *  tape, so suppress this "error" message since in that case
@@ -462,19 +398,28 @@ void mac_cleanup(JCR *jcr, int TermCode)
        *  normal exit should we complain about this error.
        */
       if (jcr->JobStatus == JS_Terminated && jcr->jr.JobBytes) {
-         Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(tjcr->db));
+         Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
       }
-      tjcr->VolumeName[0] = 0;         /* none */
+      jcr->VolumeName[0] = 0;         /* none */
    }
 
+   if (jcr->ReadBytes == 0) {
+      bstrncpy(compress, "None", sizeof(compress));
+   } else {
+      compression = (double)100 - 100.0 * ((double)jcr->JobBytes / (double)jcr->ReadBytes);
+      if (compression < 0.5) {
+         bstrncpy(compress, "None", sizeof(compress));
+      } else {
+         bsnprintf(compress, sizeof(compress), "%.1f %%", (float)compression);
+      }
+   }
+   jobstatus_to_ascii(jcr->FDJobStatus, fd_term_msg, sizeof(fd_term_msg));
    jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg));
 
 // bmicrosleep(15, 0);                /* for debugging SIGHUP */
 
    Jmsg(jcr, msg_type, 0, _("Bacula %s (%s): %s\n"
-"  Old Backup JobId:       %u\n"
-"  New Backup JobId:       %u\n"
-"  JobId:                  %u\n"
+"  JobId:                  %d\n"
 "  Job:                    %s\n"
 "  Backup Level:           %s%s\n"
 "  Client:                 %s\n"
@@ -482,23 +427,24 @@ void mac_cleanup(JCR *jcr, int TermCode)
 "  Pool:                   \"%s\"\n"
 "  Start time:             %s\n"
 "  End time:               %s\n"
-"  Elapsed time:           %s\n"
-"  Priority:               %d\n"
+"  FD Files Written:       %s\n"
 "  SD Files Written:       %s\n"
-"  SD Bytes Written:       %s (%sB)\n"
+"  FD Bytes Written:       %s\n"
+"  SD Bytes Written:       %s\n"
 "  Rate:                   %.1f KB/s\n"
+"  Software Compression:   %s\n"
 "  Volume name(s):         %s\n"
 "  Volume Session Id:      %d\n"
 "  Volume Session Time:    %d\n"
 "  Last Volume Bytes:      %s\n"
+"  Non-fatal FD errors:    %d\n"
 "  SD Errors:              %d\n"
+"  FD termination status:  %s\n"
 "  SD termination status:  %s\n"
 "  Termination:            %s\n\n"),
    VERSION,
    LSMDATE,
-        edt, 
-        jcr->target_jr.JobId,
-        tjcr->jr.JobId,
+        edt,
         jcr->jr.JobId,
         jcr->jr.Job,
         level_to_str(jcr->JobLevel), jcr->since,
@@ -507,22 +453,21 @@ void mac_cleanup(JCR *jcr, int TermCode)
         jcr->pool->hdr.name,
         sdt,
         edt,
-        edit_utime(RunTime, elapsed, sizeof(elapsed)),
-        jcr->JobPriority,
-        edit_uint64_with_commas(jcr->SDJobFiles, ec2),
-        edit_uint64_with_commas(jcr->SDJobBytes, ec3),
-        edit_uint64_with_suffix(jcr->jr.JobBytes, ec4),
+        edit_uint64_with_commas(jcr->jr.JobFiles, ec1),
+        edit_uint64_with_commas(jcr->SDJobFiles, ec4),
+        edit_uint64_with_commas(jcr->jr.JobBytes, ec2),
+        edit_uint64_with_commas(jcr->SDJobBytes, ec5),
         (float)kbps,
-        tjcr->VolumeName,
+        compress,
+        jcr->VolumeName,
         jcr->VolSessionId,
         jcr->VolSessionTime,
-        edit_uint64_with_commas(mr.VolBytes, ec1),
+        edit_uint64_with_commas(mr.VolBytes, ec3),
+        jcr->Errors,
         jcr->SDErrors,
+        fd_term_msg,
         sd_term_msg,
-        term_code);
+        term_msg);
 
-   Dmsg1(100, "Leave mac_cleanup() target_jcr=0x%x\n", jcr->target_jcr);
-   if (jcr->target_jcr) {
-      free_jcr(jcr->target_jcr);
-   }
+   Dmsg0(100, "Leave mac_cleanup()\n");
 }
index faaaceb3e7284f9d39f5051ff6f73e7cd21fbcf4..3ed70c677795889f8d79efc6d2c76897d46672fb 100644 (file)
 #include "bacula.h"
 #include "dird.h"
 
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
 /* Commands sent to Storage daemon */
-static char jobcmd[]     = "JobId=%d job=%s job_name=%s client_name=%s "
+static char jobcmd[]     = "JobId=%s job=%s job_name=%s client_name=%s "
    "type=%d level=%d FileSet=%s NoAttr=%d SpoolAttr=%d FileSetMD5=%s "
    "SpoolData=%d WritePartAfterJob=%d PreferMountedVols=%d\n";
 static char use_storage[] = "use storage=%s media_type=%s pool_name=%s "
@@ -49,7 +51,7 @@ static char OK_device[]  = "3000 OK use device device=%s\n";
 /* Storage Daemon requests */
 static char Job_start[]  = "3010 Job %127s start\n";
 static char Job_end[]    =
-   "3099 Job %127s end JobStatus=%d JobFiles=%d JobBytes=%lld\n";
+   "3099 Job %127s end JobStatus=%d JobFiles=%d JobBytes=%" lld "\n";
 
 /* Forward referenced functions */
 extern "C" void *msg_thread(void *arg);
@@ -126,28 +128,41 @@ bool start_storage_daemon_job(JCR *jcr, alist *rstore, alist *wstore)
    BSOCK *sd;
    char auth_key[100];
    POOL_MEM store_name, device_name, pool_name, pool_type, media_type;
+   POOL_MEM job_name, client_name, fileset_name;
    int copy = 0;
    int stripe = 0;
+   char ed1[30];
 
    sd = jcr->store_bsock;
    /*
     * Now send JobId and permissions, and get back the authorization key.
     */
-   bash_spaces(jcr->job->hdr.name);
-   bash_spaces(jcr->client->hdr.name);
-   bash_spaces(jcr->fileset->hdr.name);
+   pm_strcpy(job_name, jcr->job->hdr.name);
+   bash_spaces(job_name);
+   pm_strcpy(client_name, jcr->client->hdr.name);
+   bash_spaces(client_name);
+   pm_strcpy(fileset_name, jcr->fileset->hdr.name);
+   bash_spaces(fileset_name);
    if (jcr->fileset->MD5[0] == 0) {
       bstrncpy(jcr->fileset->MD5, "**Dummy**", sizeof(jcr->fileset->MD5));
    }
-   bnet_fsend(sd, jobcmd, jcr->JobId, jcr->Job, jcr->job->hdr.name,
-              jcr->client->hdr.name, jcr->JobType, jcr->JobLevel,
-              jcr->fileset->hdr.name, !jcr->pool->catalog_files,
+   /* If rescheduling, cancel the previous incarnation of this job
+    *  with the SD, which might be waiting on the FD connection.
+    *  If we do not cancel it the SD will not accept a new connection
+    *  for the same jobid.
+    */
+   if (jcr->reschedule_count) {
+      bnet_fsend(sd, "cancel Job=%s\n", jcr->Job);
+      while (bnet_recv(sd) >= 0)
+         { }
+   } 
+   bnet_fsend(sd, jobcmd, edit_int64(jcr->JobId, ed1), jcr->Job, 
+              job_name.c_str(), client_name.c_str(), 
+              jcr->JobType, jcr->JobLevel,
+              fileset_name.c_str(), !jcr->pool->catalog_files,
               jcr->job->SpoolAttributes, jcr->fileset->MD5, jcr->spool_data, 
               jcr->write_part_after_job, jcr->job->PreferMountedVolumes);
    Dmsg1(100, ">stored: %s\n", sd->msg);
-   unbash_spaces(jcr->job->hdr.name);
-   unbash_spaces(jcr->client->hdr.name);
-   unbash_spaces(jcr->fileset->hdr.name);
    if (bget_dirmsg(sd) > 0) {
        Dmsg1(100, "<stored: %s", sd->msg);
        if (sscanf(sd->msg, OKjob, &jcr->VolSessionId,
@@ -198,19 +213,15 @@ bool start_storage_daemon_job(JCR *jcr, alist *rstore, alist *wstore)
             Dmsg1(100, ">stored: %s", sd->msg);
          }
          bnet_sig(sd, BNET_EOD);            /* end of Devices */
-      }
-      bnet_sig(sd, BNET_EOD);            /* end of Storages */
-      if (bget_dirmsg(sd) > 0) {
-         Dmsg1(100, "<stored: %s", sd->msg);
-         /* ****FIXME**** save actual device name */
-         ok = sscanf(sd->msg, OK_device, device_name.c_str()) == 1;
-      } else {
-         POOL_MEM err_msg;
-         pm_strcpy(err_msg, sd->msg); /* save message */
-         Jmsg(jcr, M_FATAL, 0, _("\n"
-            "     Storage daemon didn't accept Device \"%s\" because:\n     %s"),
-            device_name.c_str(), err_msg.c_str()/* sd->msg */);
-         ok = false;
+         bnet_sig(sd, BNET_EOD);            /* end of Storages */
+         if (bget_dirmsg(sd) > 0) {
+            Dmsg1(100, "<stored: %s", sd->msg);
+            /* ****FIXME**** save actual device name */
+            ok = sscanf(sd->msg, OK_device, device_name.c_str()) == 1;
+         } else {
+            ok = false;
+         }
+         break;
       }
    }
 
@@ -233,19 +244,28 @@ bool start_storage_daemon_job(JCR *jcr, alist *rstore, alist *wstore)
             Dmsg1(100, ">stored: %s", sd->msg);
          }
          bnet_sig(sd, BNET_EOD);            /* end of Devices */
+         bnet_sig(sd, BNET_EOD);            /* end of Storages */
+         if (bget_dirmsg(sd) > 0) {
+            Dmsg1(100, "<stored: %s", sd->msg);
+            /* ****FIXME**** save actual device name */
+            ok = sscanf(sd->msg, OK_device, device_name.c_str()) == 1;
+         } else {
+            ok = false;
+         }
+         break;
       }
-      bnet_sig(sd, BNET_EOD);            /* end of Storages */
-      if (bget_dirmsg(sd) > 0) {
-         Dmsg1(100, "<stored: %s", sd->msg);
-         /* ****FIXME**** save actual device name */
-         ok = sscanf(sd->msg, OK_device, device_name.c_str()) == 1;
-      } else {
-         POOL_MEM err_msg;
+   }
+   if (!ok) {
+      POOL_MEM err_msg;
+      if (sd->msg[0]) {
          pm_strcpy(err_msg, sd->msg); /* save message */
          Jmsg(jcr, M_FATAL, 0, _("\n"
-            "     Storage daemon didn't accept Device \"%s\" because:\n     %s"),
-            device_name.c_str(), err_msg.c_str()/* sd->msg */);
-         ok = false;
+              "     Storage daemon didn't accept Device \"%s\" because:\n     %s"),
+              device_name.c_str(), err_msg.c_str()/* sd->msg */);
+      } else { 
+         Jmsg(jcr, M_FATAL, 0, _("\n"
+              "     Storage daemon didn't accept Device \"%s\" command.\n"), 
+              device_name.c_str());
       }
    }
    return ok;
@@ -260,34 +280,30 @@ int start_storage_daemon_message_thread(JCR *jcr)
    int status;
    pthread_t thid;
 
-   P(jcr->mutex);
-   jcr->use_count++;                  /* mark in use by msg thread */
+   jcr->inc_use_count();              /* mark in use by msg thread */
    jcr->sd_msg_thread_done = false;
    jcr->SD_msg_chan = 0;
-   V(jcr->mutex);
    Dmsg0(100, "Start SD msg_thread.\n");
    if ((status=pthread_create(&thid, NULL, msg_thread, (void *)jcr)) != 0) {
       berrno be;
       Jmsg1(jcr, M_ABORT, 0, _("Cannot create message thread: %s\n"), be.strerror(status));
    }
-   Dmsg0(100, "SD msg_thread started.\n");
    /* Wait for thread to start */
    while (jcr->SD_msg_chan == 0) {
       bmicrosleep(0, 50);
    }
+   Dmsg1(100, "SD msg_thread started. use=%d\n", jcr->use_count());
    return 1;
 }
 
 extern "C" void msg_thread_cleanup(void *arg)
 {
    JCR *jcr = (JCR *)arg;
-   Dmsg0(200, "End msg_thread\n");
    db_end_transaction(jcr, jcr->db);       /* terminate any open transaction */
-   P(jcr->mutex);
    jcr->sd_msg_thread_done = true;
-   pthread_cond_broadcast(&jcr->term_wait); /* wakeup any waiting threads */
    jcr->SD_msg_chan = 0;
-   V(jcr->mutex);
+   pthread_cond_broadcast(&jcr->term_wait); /* wakeup any waiting threads */
+   Dmsg1(100, "=== End msg_thread. use=%d\n", jcr->use_count());
    free_jcr(jcr);                     /* release jcr */
 }
 
@@ -314,9 +330,8 @@ extern "C" void *msg_thread(void *arg)
    /* Read the Storage daemon's output.
     */
    Dmsg0(100, "Start msg_thread loop\n");
-   while ((stat=bget_dirmsg(sd)) >= 0) {
-      int stat;
-      Dmsg1(3400, "<stored: %s", sd->msg);
+   while (!job_canceled(jcr) && bget_dirmsg(sd) >= 0) {
+      Dmsg1(400, "<stored: %s", sd->msg);
       if (sscanf(sd->msg, Job_start, Job) == 1) {
          continue;
       }
@@ -327,6 +342,7 @@ extern "C" void *msg_thread(void *arg)
          jcr->SDJobBytes = JobBytes;
          break;
       }
+      Dmsg2(400, "end loop stat=%d use=%d\n", stat, jcr->use_count());
    }
    if (is_bnet_error(sd)) {
       jcr->SDJobStatus = JS_ErrorTerminated;
@@ -339,8 +355,6 @@ void wait_for_storage_daemon_termination(JCR *jcr)
 {
    int cancel_count = 0;
    /* Now wait for Storage daemon to terminate our message thread */
-   set_jcr_job_status(jcr, JS_WaitSD);
-   P(jcr->mutex);
    while (!jcr->sd_msg_thread_done) {
       struct timeval tv;
       struct timezone tz;
@@ -348,18 +362,25 @@ void wait_for_storage_daemon_termination(JCR *jcr)
 
       gettimeofday(&tv, &tz);
       timeout.tv_nsec = 0;
-      timeout.tv_sec = tv.tv_sec + 10; /* wait 10 seconds */
-      Dmsg0(300, "I'm waiting for message thread termination.\n");
-      pthread_cond_timedwait(&jcr->term_wait, &jcr->mutex, &timeout);
+      timeout.tv_sec = tv.tv_sec + 5; /* wait 5 seconds */
+      Dmsg0(400, "I'm waiting for message thread termination.\n");
+      P(mutex);
+      pthread_cond_timedwait(&jcr->term_wait, &mutex, &timeout);
+      V(mutex);
       if (job_canceled(jcr)) {
+         if (jcr->SD_msg_chan) {
+            jcr->store_bsock->timed_out = 1;
+            jcr->store_bsock->terminated = 1;
+            Dmsg2(400, "kill jobid=%d use=%d\n", (int)jcr->JobId, jcr->use_count());
+            pthread_kill(jcr->SD_msg_chan, TIMEOUT_SIGNAL);
+         }
          cancel_count++;
       }
       /* Give SD 30 seconds to clean up after cancel */
-      if (cancel_count == 3) {
+      if (cancel_count == 6) {
          break;
       }
    }
-   V(jcr->mutex);
    set_jcr_job_status(jcr, JS_Terminated);
 }
 
@@ -377,7 +398,7 @@ extern "C" void *device_thread(void *arg)
    jcr = new_control_jcr("*DeviceInit*", JT_SYSTEM);
    for (i=0; i < MAX_TRIES; i++) {
       if (!connect_to_storage_daemon(jcr, 10, 30, 1)) {
-         Dmsg0(000, "Failed connecting to SD.\n");
+         Dmsg0(900, "Failed connecting to SD.\n");
          continue;
       }
       LockRes();
index 354c5ddec2455f97c57a7eee4d6c6d933276b496..b10447272d08d6da99689513a9f6c44d2cf5f023 100644 (file)
@@ -13,7 +13,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
index f27e0cb25fe4f9a4f69df74b1fe638dfee5fa010..4b09c70ff4a9633887c6a40f02003cf160178996 100644 (file)
@@ -63,30 +63,34 @@ int find_next_volume_for_append(JCR *jcr, MEDIA_DBR *mr, int index, bool create)
        */
       ok = db_find_next_volume(jcr, jcr->db, index, InChanger, mr);
       Dmsg2(100, "catreq after find_next_vol ok=%d FW=%d\n", ok, mr->FirstWritten);
-      /*
-       * 2. Try pulling a Scratch volume if one exists in the autochanger
-       */
-      if (!ok && InChanger) {
-         ok = get_scratch_volume(jcr, mr, InChanger);
-      }
 
       if (!ok) {
          /*
-          * 3. Try finding a recycled volume
+          * 2. Try finding a recycled volume
           */
          ok = find_recycled_volume(jcr, InChanger, mr);
          Dmsg2(100, "find_recycled_volume %d FW=%d\n", ok, mr->FirstWritten);
          if (!ok) {
             /*
-             * 4. Try recycling any purged volume
+             * 3. Try recycling any purged volume
              */
             ok = recycle_oldest_purged_volume(jcr, InChanger, mr);
             if (!ok) {
                /*
-                * 5. Try pruning Volumes
+                * 4. Try pruning Volumes
                 */
                prune_volumes(jcr);
                ok = recycle_oldest_purged_volume(jcr, InChanger, mr);
+               if (!ok) {
+                  /*
+                   * 5. Try pulling a volume from the Scratch pool
+                   */ 
+                  ok = get_scratch_volume(jcr, mr, InChanger);
+               }
+               /*
+                * If we are using an Autochanger and have not found
+                * a volume, retry looking for any volume. 
+                */
                if (InChanger) {
                   InChanger = false;
                   if (!ok) {
@@ -96,16 +100,10 @@ int find_next_volume_for_append(JCR *jcr, MEDIA_DBR *mr, int index, bool create)
             }
          }
 
-         if (!ok) {
-            /*
-             * 6. Try pulling a volume from the Scratch pool
-             */ 
-            ok = get_scratch_volume(jcr, mr, InChanger);
-         }
 
          if (!ok && create) {
             /*
-             * 7. Try "creating" a new Volume
+             * 6. Try "creating" a new Volume
              */
             ok = newVolume(jcr, mr);
          }
@@ -123,14 +121,14 @@ int find_next_volume_for_append(JCR *jcr, MEDIA_DBR *mr, int index, bool create)
                UAContext *ua;
                Dmsg0(400, "Try purge.\n");
                /*
-                * 8.  Try to purging oldest volume only if not UA calling us.
+                * 7.  Try to purging oldest volume only if not UA calling us.
                 */
                ua = new_ua_context(jcr);
                if (jcr->pool->purge_oldest_volume && create) {
                   Jmsg(jcr, M_INFO, 0, _("Purging oldest volume \"%s\"\n"), mr->VolumeName);
                   ok = purge_jobs_from_volume(ua, mr);
                /*
-                * 9. or try recycling the oldest volume
+                * 8. or try recycling the oldest volume
                 */
                } else if (jcr->pool->recycle_oldest_volume) {
                   Jmsg(jcr, M_INFO, 0, _("Pruning oldest volume \"%s\"\n"), mr->VolumeName);
@@ -301,7 +299,8 @@ void check_if_volume_valid_or_recyclable(JCR *jcr, MEDIA_DBR *mr, const char **r
          }
       } else {
          *reason = _("but should be Append, Purged or Recycle (cannot automatically "
-            "recycle current volume, as it still contains unpruned data)");
+            "recycle current volume, as it still contains unpruned data "
+            "or the Volume Retention time has not expired.)");
       }
    }
 }
index 15ce08bbbd28e1294d9ac438bfdc9d8fef685ec7..ea52e9b673e8572cc327e62d503372b1c622a57b 100644 (file)
@@ -4,7 +4,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   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
@@ -72,7 +72,7 @@ extern int connect_to_file_daemon(JCR *jcr, int retry_interval,
                                   int max_retry_time, int verbose);
 extern bool send_include_list(JCR *jcr);
 extern bool send_exclude_list(JCR *jcr);
-extern bool send_bootstrap_file(JCR *jcr, BSOCK *sock);
+extern bool send_bootstrap_file(JCR *jcr);
 extern bool send_level_command(JCR *jcr);
 extern int get_attributes_and_put_in_catalog(JCR *jcr);
 extern int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId);
@@ -97,11 +97,8 @@ extern bool get_or_create_fileset_record(JCR *jcr);
 extern JobId_t run_job(JCR *jcr);
 extern bool cancel_job(UAContext *ua, JCR *jcr);
 extern void init_jcr_job_record(JCR *jcr);
-extern void copy_storage(JCR *jcr, alist *storage);
+extern void copy_storage(JCR *new_jcr, JCR *old_jcr);
 extern void set_storage(JCR *jcr, STORE *store);
-extern bool setup_job(JCR *jcr);
-extern void create_clones(JCR *jcr);
-extern bool create_restore_bootstrap_file(JCR *jcr);
 
 /* mac.c */
 extern bool do_mac(JCR *jcr);
@@ -146,7 +143,7 @@ bool acl_access_ok(UAContext *ua, int acl, char *item, int len);
 int do_a_command(UAContext *ua, const char *cmd);
 int do_a_dot_command(UAContext *ua, const char *cmd);
 int qmessagescmd(UAContext *ua, const char *cmd);
-int open_db(UAContext *ua);
+bool open_db(UAContext *ua);
 void close_db(UAContext *ua);
 enum e_pool_op {
    POOL_OP_UPDATE,
index 17e2f58984062fad96eded91da308bc6d7576b2e..9f5df846c0326d169be6012fbc2ac04da3cde8ef 100644 (file)
@@ -30,6 +30,7 @@
 #include <Python.h>
 
 extern char *configfile;
+extern struct s_jl joblevels[];
 extern JCR *get_jcr_from_PyObject(PyObject *self);
 extern PyObject *find_method(PyObject *eventsObject, PyObject *method, 
          const char *name);
@@ -82,6 +83,7 @@ static struct s_vars setvars[] = {
    { "JobReport",   "s"},
    { "VolumeName",  "s"},
    { "Priority",    "i"},
+   { "JobLevel",    "s"},
 
    { NULL,             NULL}
 };
@@ -235,7 +237,27 @@ int job_setattr(PyObject *self, char *attrname, PyObject *value)
       break;
    case 2:                            /* Priority */
       Dmsg1(000, "Set priority=%d\n", intval);
-      return 0;
+      if (intval >= 1 && intval <= 100) {
+         jcr->JobPriority = intval;
+      } else {
+         PyErr_SetString(PyExc_ValueError, _("Priority must be 1-100"));
+         return -1;
+      }
+   case 3:                            /* Job Level */
+      if (strcmp("JobInit", jcr->event) != 0) {
+         PyErr_SetString(PyExc_RuntimeError, _("Job Level can be set only during JobInit"));
+         return -1;
+      }
+      for (i=0; joblevels[i].level_name; i++) {
+         if (strcmp(strval, joblevels[i].level_name) == 0) {
+            if (joblevels[i].job_type == jcr->JobType) {
+               jcr->JobLevel = joblevels[i].level;
+               return 0;
+            }
+         }
+      }
+      PyErr_SetString(PyExc_ValueError, _("Bad JobLevel string"));
+      return -1;
    }
 bail_out:
    PyErr_SetString(PyExc_AttributeError, attrname);
@@ -275,7 +297,7 @@ static PyObject *job_run(PyObject *self, PyObject *arg)
       return NULL;
    }
    /* Release lock due to recursion */
-   PyEval_ReleaseLock();
+// PyEval_ReleaseLock();
    jcr = get_jcr_from_PyObject(self);
    UAContext *ua = new_ua_context(jcr);
    ua->batch = true;
@@ -283,7 +305,7 @@ static PyObject *job_run(PyObject *self, PyObject *arg)
    parse_ua_args(ua);                 /* parse command */
    stat = run_cmd(ua, ua->cmd);
    free_ua_context(ua);
-   PyEval_AcquireLock();
+// PyEval_AcquireLock();
    return PyInt_FromLong((long)stat);
 }
 
@@ -350,7 +372,7 @@ static PyObject *job_cancel(PyObject *self, PyObject *args)
       /* ***FIXME*** raise exception */
       return NULL;
    }
-   PyEval_ReleaseLock();
+// PyEval_ReleaseLock();
    UAContext *ua = new_ua_context(jcr);
    ua->batch = true;
    if (!cancel_job(ua, jcr)) {
@@ -359,7 +381,7 @@ static PyObject *job_cancel(PyObject *self, PyObject *args)
    }
    free_ua_context(ua);
    free_jcr(jcr);
-   PyEval_AcquireLock();   
+// PyEval_AcquireLock();   
    Py_INCREF(Py_None);
    return Py_None;
 }
@@ -381,7 +403,8 @@ int generate_job_event(JCR *jcr, const char *event)
       return 0;
    }
 
-   PyEval_AcquireLock();
+   lock_python();
+// PyEval_AcquireLock();
 
    method = find_method(events, method, event);
    if (!method) {
@@ -402,7 +425,8 @@ int generate_job_event(JCR *jcr, const char *event)
    Py_XDECREF(result);
 
 bail_out:
-   PyEval_ReleaseLock();
+   unlock_python();
+// PyEval_ReleaseLock();
    return stat;
 }
 
index ff7b18c99cdaa3d57da9538ccf448b4ec61af0f3..928f183b0d35ab2cf87a3cf2b2d41656bb9f2d8b 100644 (file)
@@ -43,7 +43,6 @@ static char storaddr[]     = "storage address=%s port=%d ssl=0\n";
 /* Responses received from File daemon */
 static char OKrestore[]   = "2000 OK restore\n";
 static char OKstore[]     = "2000 OK storage\n";
-static char OKbootstrap[] = "2000 OK bootstrap\n";
 
 /*
  * Do a restore of the specified files
@@ -142,8 +141,7 @@ bool do_restore(JCR *jcr)
    /*
     * Send the bootstrap file -- what Volumes/files to restore
     */
-   if (!send_bootstrap_file(jcr, fd) ||
-       !response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
+   if (!send_bootstrap_file(jcr)) {
       restore_cleanup(jcr, JS_ErrorTerminated);
       return false;
    }
index 065aeba85bc587127b7a0fb77a75659dd6936afb..bb5f31ee57ddadfde42a0f276a4a5f5cee38777c 100644 (file)
@@ -68,7 +68,7 @@ const char *drop_deltabs[] = {
 
 /* List of SQL commands to create temp table and indicies  */
 const char *create_deltabs[] = {
-   "CREATE TABLE DelCandidates ("
+   "CREATE TEMPORARY TABLE DelCandidates ("
 #ifdef HAVE_MYSQL
       "JobId INTEGER UNSIGNED NOT NULL, "
       "PurgedFiles TINYINT, "
@@ -211,7 +211,7 @@ const char *uar_del_temp  = "DROP TABLE temp";
 const char *uar_del_temp1 = "DROP TABLE temp1";
 
 const char *uar_create_temp =
-   "CREATE TABLE temp ("
+   "CREATE TEMPORARY TABLE temp ("
 #ifdef HAVE_POSTGRESQL
    "JobId INTEGER NOT NULL,"
    "JobTDate BIGINT,"
@@ -239,7 +239,7 @@ const char *uar_create_temp =
 #endif
 
 const char *uar_create_temp1 =
-   "CREATE TABLE temp1 ("
+   "CREATE TEMPORARY TABLE temp1 ("
 #ifdef HAVE_POSTGRESQL
    "JobId INTEGER NOT NULL,"
    "JobTDate BIGINT)";
index 1edb832d9558a77ba6c71fec85f16e7a7d5b80ae..7c5911ebd661aa12318ed4f0159c732e9dbfc418 100644 (file)
@@ -127,7 +127,7 @@ static struct cmdstruct commands[] = {
  { N_("use"),        use_cmd,       _("use catalog xxx")},
  { N_("var"),        var_cmd,       _("does variable expansion")},
  { N_("version"),    version_cmd,   _("print Director version")},
- { N_("wait"),       wait_cmd,      _("wait until no jobs are running")},
+ { N_("wait"),       wait_cmd,      _("wait until no jobs are running [<jobname=name> | <jobid=nnn> | <ujobid=complete_name>]")},
              };
 #define comsize (sizeof(commands)/sizeof(struct cmdstruct))
 
@@ -396,7 +396,18 @@ static int cancel_cmd(UAContext *ua, const char *cmd)
             bstrncpy(jcr->Job, ua->argv[i], sizeof(jcr->Job));
          }
          break;
+      } else if (strcasecmp(ua->argk[i], _("ujobid")) == 0) {
+         if (!ua->argv[i]) {
+            break;
+         }
+         if (!(jcr=get_jcr_by_full_name(ua->argv[i]))) {
+            bsendmsg(ua, _("Warning Job %s is not running. Continuing anyway ...\n"), ua->argv[i]);
+            jcr = new_jcr(sizeof(JCR), dird_free_jcr);
+            bstrncpy(jcr->Job, ua->argv[i], sizeof(jcr->Job));
+         }
+         break;
       }
+
    }
    /* If we still do not have a jcr,
     *   throw up a list and ask the user to select one.
@@ -435,7 +446,6 @@ static int cancel_cmd(UAContext *ua, const char *cmd)
             return 1;
          }
       }
-      /* NOTE! This increments the ref_count */
       sscanf(buf, "JobId=%d Job=%127s", &njobs, JobName);
       jcr = get_jcr_by_full_name(JobName);
       if (!jcr) {
@@ -1237,8 +1247,6 @@ static void do_job_delete(UAContext *ua, JobId_t JobId)
 
    Mmsg(query, "DELETE FROM Job WHERE JobId=%s", edit_int64(JobId, ed1));
    db_sql_query(ua->db, query, NULL, (void *)NULL);
-   Mmsg(query, "DELETE FROM MAC WHERE JobId=%s", ed1);
-   db_sql_query(ua->db, query, NULL, (void *)NULL);
    Mmsg(query, "DELETE FROM File WHERE JobId=%s", ed1);
    db_sql_query(ua->db, query, NULL, (void *)NULL);
    Mmsg(query, "DELETE FROM JobMedia WHERE JobId=%s", ed1);
@@ -1391,27 +1399,158 @@ int quit_cmd(UAContext *ua, const char *cmd)
    return 1;
 }
 
+/* Handler to get job status */
+static int status_handler(void *ctx, int num_fields, char **row)
+{
+   char *val = (char *)ctx;
+
+   if (row[0]) {
+      *val = row[0][0];
+   } else {
+      *val = '?';               /* Unknown by default */
+   }
+
+   return 0;
+}
+
 /*
  * Wait until no job is running
  */
 int wait_cmd(UAContext *ua, const char *cmd)
 {
    JCR *jcr;
+
+   /* no args
+    * Wait until no job is running
+    */
+   if (ua->argc == 1) {
+      bmicrosleep(0, 200000);            /* let job actually start */
+      for (bool running=true; running; ) {
+         running = false;
+         foreach_jcr(jcr) {
+            if (jcr->JobId != 0) {
+               running = true;
+               break;
+            }
+         }
+         endeach_jcr(jcr);
+
+         if (running) {
+            bmicrosleep(1, 0);
+         }
+      }
+      return 1;
+   }
+
+   /* we have jobid, jobname or ujobid argument */
+
+   uint32_t jobid = 0 ;
+
+   if (!open_db(ua)) {
+      bsendmsg(ua, _("ERR: Can't open db\n")) ;
+      return 1;
+   }
+
+   for (int i=1; i<ua->argc; i++) {
+      if (strcasecmp(ua->argk[i], "jobid") == 0) {
+         if (!ua->argv[i]) {
+            break;
+         }
+         jobid = str_to_int64(ua->argv[i]);
+         break;
+      } else if (strcasecmp(ua->argk[i], "jobname") == 0 ||
+                 strcasecmp(ua->argk[i], "job") == 0) {
+         if (!ua->argv[i]) {
+            break;
+         }
+         jcr=get_jcr_by_partial_name(ua->argv[i]) ;
+         if (jcr) {
+            jobid = jcr->JobId ;
+            free_jcr(jcr);
+         }
+         break;
+      } else if (strcasecmp(ua->argk[i], "ujobid") == 0) {
+         if (!ua->argv[i]) {
+            break;
+         }
+         jcr=get_jcr_by_full_name(ua->argv[i]) ;
+         if (jcr) {
+            jobid = jcr->JobId ;
+            free_jcr(jcr);
+         }
+         break;
+      }
+   }
+
+   if (jobid == 0) {
+      bsendmsg(ua, _("ERR: Job was not found\n"));
+      return 1 ;
+   }
+
+   /*
+    * We wait the end of job
+    */
+
    bmicrosleep(0, 200000);            /* let job actually start */
    for (bool running=true; running; ) {
       running = false;
-      foreach_jcr(jcr) {
-         if (jcr->JobId != 0) {
-            running = true;
-            break;
-         }
+
+      jcr=get_jcr_by_id(jobid) ;
+
+      if (jcr) {
+         running = true ;
+         free_jcr(jcr);
       }
-      endeach_jcr(jcr);
 
       if (running) {
          bmicrosleep(1, 0);
       }
    }
+
+   /*
+    * We have to get JobStatus
+    */
+
+   int status ;
+   char jobstatus = '?';        /* Unknown by default */
+   char buf[256] ;
+
+   bsnprintf(buf, sizeof(buf),
+             "SELECT JobStatus FROM Job WHERE JobId='%i'", jobid);
+
+
+   db_sql_query(ua->db, buf,
+                status_handler, (void *)&jobstatus);
+
+   switch (jobstatus) {
+   case JS_Error:
+      status = 1 ;         /* Warning */
+      break;
+
+   case JS_FatalError:
+   case JS_ErrorTerminated:
+   case JS_Canceled:
+      status = 2 ;         /* Critical */
+      break;
+
+   case JS_Terminated:
+      status = 0 ;         /* Ok */
+      break;
+
+   default:
+      status = 3 ;         /* Unknown */
+      break;
+   }
+
+   bsendmsg(ua, "JobId=%i\n", jobid) ;
+   bsendmsg(ua, "JobStatus=%s (%c)\n", 
+            job_status_to_str(jobstatus), 
+            jobstatus) ;
+
+   if (ua->gui) {
+      bsendmsg(ua, "ExitStatus=%i\n", status) ;
+   }
+
    return 1;
 }
 
@@ -1449,10 +1588,10 @@ static int version_cmd(UAContext *ua, const char *cmd)
  * a "use catalog xxx" command, we simply find the first
  * catalog resource and open it.
  */
-int open_db(UAContext *ua)
+bool open_db(UAContext *ua)
 {
    if (ua->db) {
-      return 1;
+      return true;
    }
    if (!ua->catalog) {
       LockRes();
@@ -1460,7 +1599,11 @@ int open_db(UAContext *ua)
       UnlockRes();
       if (!ua->catalog) {
          bsendmsg(ua, _("Could not find a Catalog resource\n"));
-         return 0;
+         return false;
+      } else if (!acl_access_ok(ua, Catalog_ACL, ua->catalog->hdr.name)) {
+         bsendmsg(ua, _("You must specify a \"use <catalog-name>\" command before continuing.\n"));
+         ua->catalog = NULL;
+         return false;
       } else {
          bsendmsg(ua, _("Using default Catalog name=%s DB=%s\n"),
             ua->catalog->hdr.name, ua->catalog->db_name);
@@ -1481,11 +1624,11 @@ int open_db(UAContext *ua)
          bsendmsg(ua, "%s", db_strerror(ua->db));
       }
       close_db(ua);
-      return 0;
+      return false;
    }
    ua->jcr->db = ua->db;
    Dmsg1(150, "DB %s opened\n", ua->catalog->db_name);
-   return 1;
+   return true;
 }
 
 void close_db(UAContext *ua)
index e426ed89696d72b87162d2ccb7efdfab8c0de8b9..60f9c62e090341d249a129d41b05b308cb450a34 100644 (file)
@@ -37,7 +37,7 @@ extern const char *client_backups;
 extern int console_msg_pending;
 
 /* Imported functions */
-extern int do_messages(UAContext *ua, const char *cmd);
+extern void do_messages(UAContext *ua, const char *cmd);
 extern int quit_cmd(UAContext *ua, const char *cmd);
 extern int qhelp_cmd(UAContext *ua, const char *cmd);
 extern int qstatus_cmd(UAContext *ua, const char *cmd);
@@ -139,7 +139,9 @@ static int jobscmd(UAContext *ua, const char *cmd)
    JOB *job = NULL;
    LockRes();
    while ( (job = (JOB *)GetNextRes(R_JOB, (RES *)job)) ) {
-      bsendmsg(ua, "%s\n", job->hdr.name);
+      if (acl_access_ok(ua, Job_ACL, job->hdr.name)) {
+         bsendmsg(ua, "%s\n", job->hdr.name);
+      }
    }
    UnlockRes();
    return 1;
@@ -150,7 +152,9 @@ static int filesetscmd(UAContext *ua, const char *cmd)
    FILESET *fs = NULL;
    LockRes();
    while ( (fs = (FILESET *)GetNextRes(R_FILESET, (RES *)fs)) ) {
-      bsendmsg(ua, "%s\n", fs->hdr.name);
+      if (acl_access_ok(ua, FileSet_ACL, fs->hdr.name)) {
+         bsendmsg(ua, "%s\n", fs->hdr.name);
+      }
    }
    UnlockRes();
    return 1;
@@ -161,7 +165,9 @@ static int clientscmd(UAContext *ua, const char *cmd)
    CLIENT *client = NULL;
    LockRes();
    while ( (client = (CLIENT *)GetNextRes(R_CLIENT, (RES *)client)) ) {
-      bsendmsg(ua, "%s\n", client->hdr.name);
+      if (acl_access_ok(ua, Client_ACL, client->hdr.name)) {
+         bsendmsg(ua, "%s\n", client->hdr.name);
+      }
    }
    UnlockRes();
    return 1;
@@ -183,7 +189,9 @@ static int poolscmd(UAContext *ua, const char *cmd)
    POOL *pool = NULL;
    LockRes();
    while ( (pool = (POOL *)GetNextRes(R_POOL, (RES *)pool)) ) {
-      bsendmsg(ua, "%s\n", pool->hdr.name);
+      if (acl_access_ok(ua, Pool_ACL, pool->hdr.name)) {
+         bsendmsg(ua, "%s\n", pool->hdr.name);
+      }
    }
    UnlockRes();
    return 1;
@@ -194,7 +202,9 @@ static int storagecmd(UAContext *ua, const char *cmd)
    STORE *store = NULL;
    LockRes();
    while ( (store = (STORE *)GetNextRes(R_STORAGE, (RES *)store)) ) {
-      bsendmsg(ua, "%s\n", store->hdr.name);
+      if (acl_access_ok(ua, Storage_ACL, store->hdr.name)) {
+         bsendmsg(ua, "%s\n", store->hdr.name);
+      }
    }
    UnlockRes();
    return 1;
@@ -226,6 +236,10 @@ static int backupscmd(UAContext *ua, const char *cmd)
    if (ua->argc != 3 || strcmp(ua->argk[1], "client") != 0 || strcmp(ua->argk[2], "fileset") != 0) {
       return 1;
    }
+   if (!acl_access_ok(ua, Client_ACL, ua->argv[1]) ||
+       !acl_access_ok(ua, FileSet_ACL, ua->argv[2])) {
+      return 1;
+   }
    Mmsg(ua->cmd, client_backups, ua->argv[1], ua->argv[2]);
    if (!db_sql_query(ua->db, ua->cmd, client_backups_handler, (void *)ua)) {
       bsendmsg(ua, _("Query failed: %s. ERR=%s\n"), ua->cmd, db_strerror(ua->db));
@@ -246,8 +260,6 @@ static int levelscmd(UAContext *ua, const char *cmd)
    return 1;
 }
 
-
-
 /*
  * Return default values for a job
  */
@@ -264,6 +276,9 @@ static int defaultscmd(UAContext *ua, const char *cmd)
 
    /* Job defaults */   
    if (strcmp(ua->argk[1], "job") == 0) {
+      if (!acl_access_ok(ua, Job_ACL, ua->argv[1])) {
+         return 1;
+      }
       job = (JOB *)GetResWithName(R_JOB, ua->argv[1]);
       if (job) {
          STORE *store;
@@ -282,6 +297,9 @@ static int defaultscmd(UAContext *ua, const char *cmd)
    } 
    /* Client defaults */
    else if (strcmp(ua->argk[1], "client") == 0) {
+     if (!acl_access_ok(ua, Client_ACL, ua->argv[1])) {
+        return 1;   
+     }
      client = (CLIENT *)GetResWithName(R_CLIENT, ua->argv[1]);
      if (client) {
        bsendmsg(ua, "client=%s", client->hdr.name);
@@ -294,6 +312,9 @@ static int defaultscmd(UAContext *ua, const char *cmd)
    }
    /* Storage defaults */
    else if (strcmp(ua->argk[1], "storage") == 0) {
+     if (!acl_access_ok(ua, Storage_ACL, ua->argv[1])) {
+        return 1;
+     }
      storage = (STORE *)GetResWithName(R_STORAGE, ua->argv[1]);
      DEVICE *device;
      if (storage) {
@@ -312,6 +333,9 @@ static int defaultscmd(UAContext *ua, const char *cmd)
    }
    /* Pool defaults */
    else if (strcmp(ua->argk[1], "pool") == 0) {
+     if (!acl_access_ok(ua, Pool_ACL, ua->argv[1])) {
+        return 1;
+     }
      pool = (POOL *)GetResWithName(R_POOL, ua->argv[1]);
      if (pool) {
        bsendmsg(ua, "pool=%s", pool->hdr.name);
index f94121061a4779673f327985ffe4ea9174bcee9c..33b9cc15db7f8f504c21287c8ae23c7e4666d561 100644 (file)
@@ -290,7 +290,7 @@ static int do_label(UAContext *ua, const char *cmd, int relabel)
    bool print_reminder = true;
    bool label_barcodes = false;
    int ok = FALSE;
-   int i;
+   int i, j;
    int drive;
    bool media_record_exists = false;
    static const char *barcode_keyword[] = {
@@ -304,8 +304,12 @@ static int do_label(UAContext *ua, const char *cmd, int relabel)
       return 1;
    }
 
+   /* Look for one of the barcode keywords */
    if (!relabel && (i=find_arg_keyword(ua, barcode_keyword)) >= 0) {
-      *ua->argk[i] = 0;      /* zap barcode keyword */
+      /* Now find the keyword in the list */
+      if ((j = find_arg(ua, barcode_keyword[i])) > 0) {
+         *ua->argk[j] = 0;      /* zap barcode keyword */
+      }
       label_barcodes = true;
    }
 
@@ -736,7 +740,7 @@ static char *get_volume_name_from_SD(UAContext *ua, int Slot, int drive)
    bstrncpy(dev_name, store->dev_name(), sizeof(dev_name));
    bash_spaces(dev_name);
    /* Ask for autochanger list of volumes */
-   bnet_fsend(sd, _("readlabel %s Slot=%d drive=%d\n"), dev_name, Slot, drive);
+   bnet_fsend(sd, "readlabel %s Slot=%d drive=%d\n", dev_name, Slot, drive);
    Dmsg1(100, "Sent: %s", sd->msg);
 
    /* Get Volume name in this Slot */
@@ -778,7 +782,7 @@ static vol_list_t *get_vol_list_from_SD(UAContext *ua, bool scan)
    bstrncpy(dev_name, store->dev_name(), sizeof(dev_name));
    bash_spaces(dev_name);
    /* Ask for autochanger list of volumes */
-   bnet_fsend(sd, _("autochanger list %s \n"), dev_name);
+   bnet_fsend(sd, "autochanger list %s \n", dev_name);
 
    /* Read and organize list of Volumes */
    while (bnet_recv(sd) >= 0) {
@@ -890,7 +894,7 @@ static int get_num_slots_from_SD(UAContext *ua)
    bstrncpy(dev_name, store->dev_name(), sizeof(dev_name));
    bash_spaces(dev_name);
    /* Ask for autochanger number of slots */
-   bnet_fsend(sd, _("autochanger slots %s\n"), dev_name);
+   bnet_fsend(sd, "autochanger slots %s\n", dev_name);
 
    while (bnet_recv(sd) >= 0) {
       if (sscanf(sd->msg, "slots=%d\n", &slots) == 1) {
@@ -922,7 +926,7 @@ int get_num_drives_from_SD(UAContext *ua)
    bstrncpy(dev_name, store->dev_name(), sizeof(dev_name));
    bash_spaces(dev_name);
    /* Ask for autochanger number of slots */
-   bnet_fsend(sd, _("autochanger drives %s\n"), dev_name);
+   bnet_fsend(sd, "autochanger drives %s\n", dev_name);
 
    while (bnet_recv(sd) >= 0) {
       if (sscanf(sd->msg, "drives=%d\n", &drives) == 1) {
index c3f1ac1883a37bbb4bd0d8e2c711018d8d063ad7..e4a4c07bd234b90d05090340de15597d4ac607ef 100644 (file)
@@ -202,7 +202,9 @@ bail_out:
  *
  *  list jobs           - lists all jobs run
  *  list jobid=nnn      - list job data for jobid
- *  list job=name       - list job data for job
+ *  list ujobid=uname   - list job data for unique jobid
+ *  list job=name       - list all jobs with "name"   
+ *  list jobname=name   - same as above 
  *  list jobmedia jobid=<nn>
  *  list jobmedia job=name
  *  list files jobid=<nn> - list files saved for job nn
@@ -277,23 +279,23 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist)
          }
 
       /* List JOB=xxx */
-      } else if (strcasecmp(ua->argk[i], N_("job")) == 0 && ua->argv[i]) {
-         bstrncpy(jr.Job, ua->argv[i], MAX_NAME_LENGTH);
+      } else if ((strcasecmp(ua->argk[i], N_("job")) == 0 ||
+                  strcasecmp(ua->argk[i], N_("jobname")) == 0) && ua->argv[i]) {
+         bstrncpy(jr.Name, ua->argv[i], MAX_NAME_LENGTH);
          jr.JobId = 0;
          db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua, llist);
 
-      /* List JOBNAME=xxx */
-      } else if (strcasecmp(ua->argk[i], N_("job")) == 0 && ua->argv[i]) {
-         bstrncpy(jr.Name, ua->argv[i], MAX_NAME_LENGTH);
+      /* List UJOBID=xxx */
+      } else if (strcasecmp(ua->argk[i], N_("ujobid")) == 0 && ua->argv[i]) {
+         bstrncpy(jr.Job, ua->argv[i], MAX_NAME_LENGTH);
          jr.JobId = 0;
          db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua, llist);
 
-
       /* List FILES */
       } else if (strcasecmp(ua->argk[i], N_("files")) == 0) {
 
          for (j=i+1; j<ua->argc; j++) {
-            if (strcasecmp(ua->argk[j], N_("job")) == 0 && ua->argv[j]) {
+            if (strcasecmp(ua->argk[j], N_("ujobid")) == 0 && ua->argv[j]) {
                bstrncpy(jr.Job, ua->argv[j], MAX_NAME_LENGTH);
                jr.JobId = 0;
                db_get_job_record(ua->jcr, ua->db, &jr);
@@ -312,7 +314,7 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist)
       } else if (strcasecmp(ua->argk[i], N_("jobmedia")) == 0) {
          int done = FALSE;
          for (j=i+1; j<ua->argc; j++) {
-            if (strcasecmp(ua->argk[j], N_("job")) == 0 && ua->argv[j]) {
+            if (strcasecmp(ua->argk[j], N_("ujobid")) == 0 && ua->argv[j]) {
                bstrncpy(jr.Job, ua->argv[j], MAX_NAME_LENGTH);
                jr.JobId = 0;
                db_get_job_record(ua->jcr, ua->db, &jr);
@@ -350,7 +352,7 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist)
                  strcasecmp(ua->argk[i], N_("volumes")) == 0) {
          bool done = false;
          for (j=i+1; j<ua->argc; j++) {
-            if (strcasecmp(ua->argk[j], N_("job")) == 0 && ua->argv[j]) {
+            if (strcasecmp(ua->argk[j], N_("ujobid")) == 0 && ua->argv[j]) {
                bstrncpy(jr.Job, ua->argv[j], MAX_NAME_LENGTH);
                jr.JobId = 0;
                db_get_job_record(ua->jcr, ua->db, &jr);
@@ -463,15 +465,18 @@ static bool list_nextvol(UAContext *ua, int ndays)
       if (!complete_jcr_for_job(jcr, job, pool)) {
          return false;
       }
-      mr.PoolId = jcr->jr.PoolId;
-      if (run->storage) {
-         jcr->store = run->storage;
-      }
       memset(&pr, 0, sizeof(pr));
-      pr.PoolId = jcr->jr.PoolId;
+      pr.PoolId = jcr->PoolId;
       if (! db_get_pool_record(ua->jcr, ua->db, &pr)) {
          strcpy(pr.Name, "*UnknownPool*");
       }
+      mr.PoolId = jcr->PoolId;
+      if (run->storage) {
+         jcr->store = run->storage;
+      } else {
+         jcr->store = (STORE *)job->storage->first();
+      }
+      mr.StorageId = jcr->store->StorageId;
       if (!find_next_volume_for_append(jcr, &mr, 1, false/*no create*/)) {
          bsendmsg(ua, _("Could not find next Volume for Job %s (%s, %s).\n"),
             job->hdr.name, pr.Name, level_to_str(run->level));
@@ -626,6 +631,7 @@ int complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool)
          Jmsg(jcr, M_INFO, 0, _("Pool %s created in database.\n"), pr.Name);
       }
    }
+   jcr->PoolId = pr.PoolId;
    jcr->jr.PoolId = pr.PoolId;
    return 1;
 }
index 137462ddb0473c35a8f5cf992d5aef7b7afd2d3f..f7a40c166b8fe14913e57473fe2ee73857859208 100644 (file)
@@ -163,7 +163,7 @@ int prunecmd(UAContext *ua, const char *cmd)
       NULL};
 
    if (!open_db(ua)) {
-      return false;
+      return 0;
    }
 
    /* First search args */
@@ -177,32 +177,32 @@ int prunecmd(UAContext *ua, const char *cmd)
    case 0:  /* prune files */
       client = get_client_resource(ua);
       if (!client || !confirm_retention(ua, &client->FileRetention, "File")) {
-         return false;
+         return 0;
       }
       prune_files(ua, client);
-      return true;
+      return 1;
    case 1:  /* prune jobs */
       client = get_client_resource(ua);
       if (!client || !confirm_retention(ua, &client->JobRetention, "Job")) {
-         return false;
+         return 0;
       }
       /* ****FIXME**** allow user to select JobType */
       prune_jobs(ua, client, JT_BACKUP);
       return 1;
    case 2:  /* prune volume */
       if (!select_pool_and_media_dbr(ua, &pr, &mr)) {
-         return false;
+         return 0;
       }
       if (!confirm_retention(ua, &mr.VolRetention, "Volume")) {
-         return false;
+         return 0;
       }
       prune_volume(ua, &mr);
-      return true;
+      return 1;
    default:
       break;
    }
 
-   return true;
+   return 1;
 }
 
 /*
@@ -240,7 +240,7 @@ int prune_files(UAContext *ua, CLIENT *client)
    /* Select Jobs -- for counting */
    Mmsg(query, select_job, edit_uint64(now - period, ed1), 
         edit_int64(cr.ClientId, ed2));
-   Dmsg3(050, "select now=%u period=%u sql=%s\n", (uint32_t)now, (uint32_t)period, query);
+   Dmsg1(050, "select sql=%s\n", query);
    if (!db_sql_query(ua->db, query, file_count_handler, (void *)&del)) {
       if (ua->verbose) {
          bsendmsg(ua, "%s", db_strerror(ua->db));
@@ -270,7 +270,7 @@ int prune_files(UAContext *ua, CLIENT *client)
 
    for (i=0; i < del.num_ids; i++) {
       Mmsg(query, del_File, edit_int64(del.JobId[i], ed1));
-      Dmsg1(000, "Delete Files JobId=%s\n", ed1);
+      Dmsg1(050, "Delete JobId=%s\n", ed1);
       db_sql_query(ua->db, query, NULL, (void *)NULL);
       /*
        * Now mark Job as having files purged. This is necessary to
@@ -280,7 +280,7 @@ int prune_files(UAContext *ua, CLIENT *client)
        */
       Mmsg(query, upd_Purged, edit_int64(del.JobId[i], ed1));
       db_sql_query(ua->db, query, NULL, (void *)NULL);
-      Dmsg1(000, "Update Purged sql=%s\n", query);
+      Dmsg1(050, "Del sql=%s\n", query);
    }
    edit_uint64_with_commas(del.num_ids, ed1);
    bsendmsg(ua, _("Pruned Files from %s Jobs for client %s from catalog.\n"),
@@ -304,7 +304,7 @@ static void drop_temp_tables(UAContext *ua)
    }
 }
 
-static bool create_temp_tables(UAContext *ua)
+static int create_temp_tables(UAContext *ua)
 {
    int i;
    /* Create temp tables and indicies */
@@ -312,10 +312,10 @@ static bool create_temp_tables(UAContext *ua)
       if (!db_sql_query(ua->db, create_deltabs[i], NULL, (void *)NULL)) {
          bsendmsg(ua, "%s", db_strerror(ua->db));
          Dmsg0(050, "create DelTables table failed\n");
-         return false;
+         return 0;
       }
    }
-   return true;
+   return 1;
 }
 
 
index 5661d1db7235c823445071d3557f9b7e13349881..fb1874695c703ff3a5e760371bd6ca45e1e92dd6 100644 (file)
@@ -11,7 +11,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2002-2006 Kern Sibbald
+   Copyright (C) 2002-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -267,7 +267,7 @@ int purgecmd(UAContext *ua, const char *cmd)
 static int purge_files_from_client(UAContext *ua, CLIENT *client)
 {
    struct s_file_del_ctx del;
-   POOLMEM *query = get_pool_memory(PM_MESSAGE);
+   char *query = (char *)get_pool_memory(PM_MESSAGE);
    int i;
    CLIENT_DBR cr;
    char ed1[50];
@@ -309,7 +309,7 @@ static int purge_files_from_client(UAContext *ua, CLIENT *client)
 
    for (i=0; i < del.num_ids; i++) {
       edit_int64(del.JobId[i], ed1);
-      Dmsg1(050, "Delete Files JobId=%s\n", ed1);
+      Dmsg1(050, "Delete JobId=%s\n", ed1);
       Mmsg(query, "DELETE FROM File WHERE JobId=%s", ed1);
       db_sql_query(ua->db, query, NULL, (void *)NULL);
       /*
@@ -320,7 +320,7 @@ static int purge_files_from_client(UAContext *ua, CLIENT *client)
        */
       Mmsg(query, "UPDATE Job Set PurgedFiles=1 WHERE JobId=%s", ed1);
       db_sql_query(ua->db, query, NULL, (void *)NULL);
-      Dmsg1(050, "Update Purged sql=%s\n", query);
+      Dmsg1(050, "Del sql=%s\n", query);
    }
    bsendmsg(ua, _("%d Files for client \"%s\" purged from %s catalog.\n"), del.num_ids,
       client->hdr.name, client->catalog->hdr.name);
@@ -340,12 +340,13 @@ bail_out:
  * is older than the retention period, we unconditionally delete
  * it and all File records for that Job.  This is simple enough that no
  * temporary tables are needed. We simply make an in memory list of
- * the JobIds then delete the Job, Files, and JobMedia records in that list.
+ * the JobIds meeting the prune conditions, then delete the Job,
+ * Files, and JobMedia records in that list.
  */
 static int purge_jobs_from_client(UAContext *ua, CLIENT *client)
 {
    struct s_job_del_ctx del;
-   POOLMEM *query = get_pool_memory(PM_MESSAGE);
+   char *query = (char *)get_pool_memory(PM_MESSAGE);
    int i;
    CLIENT_DBR cr;
    char ed1[50];
@@ -394,7 +395,7 @@ static int purge_jobs_from_client(UAContext *ua, CLIENT *client)
     */
    for (i=0; i < del.num_ids; i++) {
       edit_int64(del.JobId[i], ed1);
-      Dmsg1(050, "Delete Files JobId=%s\n", ed1); 
+      Dmsg1(050, "Delete JobId=%s\n", ed1); 
       if (!del.PurgedFiles[i]) {
          Mmsg(query, "DELETE FROM File WHERE JobId=%s", ed1);
          db_sql_query(ua->db, query, NULL, (void *)NULL);
@@ -403,15 +404,11 @@ static int purge_jobs_from_client(UAContext *ua, CLIENT *client)
 
       Mmsg(query, "DELETE FROM Job WHERE JobId=%s", ed1);
       db_sql_query(ua->db, query, NULL, (void *)NULL);
-      Dmsg1(050, "Delete Job sql=%s\n", query);
-
-      Mmsg(query, "DELETE FROM MAC WHERE JobId=%s", ed1);
-      db_sql_query(ua->db, query, NULL, (void *)NULL);
-      Dmsg1(050, "Delete MAC sql=%s\n", query);
+      Dmsg1(050, "Del sql=%s\n", query);
 
       Mmsg(query, "DELETE FROM JobMedia WHERE JobId=%s", ed1);
       db_sql_query(ua->db, query, NULL, (void *)NULL);
-      Dmsg1(050, "Delete JobMedia sql=%s\n", query);
+      Dmsg1(050, "Del sql=%s\n", query);
    }
    bsendmsg(ua, _("%d Jobs for client %s purged from %s catalog.\n"), del.num_ids,
       client->hdr.name, client->catalog->hdr.name);
@@ -429,10 +426,10 @@ bail_out:
 
 void purge_files_from_job(UAContext *ua, JOB_DBR *jr)
 {
-   POOLMEM *query = get_pool_memory(PM_MESSAGE);
+   char *query = (char *)get_pool_memory(PM_MESSAGE);
    char ed1[50];
 
-   edit_int64(jr->JobId, ed1);
+   edit_int64(jr->JobId,ed1);
    Mmsg(query, "DELETE FROM File WHERE JobId=%s", ed1);
    db_sql_query(ua->db, query, NULL, (void *)NULL);
 
@@ -451,7 +448,7 @@ void purge_files_from_volume(UAContext *ua, MEDIA_DBR *mr )
  */
 int purge_jobs_from_volume(UAContext *ua, MEDIA_DBR *mr)
 {
-   POOLMEM *query = get_pool_memory(PM_MESSAGE);
+   char *query = (char *)get_pool_memory(PM_MESSAGE);
    struct s_count_ctx cnt;
    struct s_file_del_ctx del;
    int i, stat = 0;
@@ -527,8 +524,6 @@ int purge_jobs_from_volume(UAContext *ua, MEDIA_DBR *mr)
       db_sql_query(ua->db, query, NULL, (void *)NULL);
       Mmsg(query, "DELETE FROM Job WHERE JobId=%s", ed1);
       db_sql_query(ua->db, query, NULL, (void *)NULL);
-      Mmsg(query, "DELETE FROM MAC WHERE JobId=%s", ed1);
-      db_sql_query(ua->db, query, NULL, (void *)NULL);
       Mmsg(query, "DELETE FROM JobMedia WHERE JobId=%s", ed1);
       db_sql_query(ua->db, query, NULL, (void *)NULL);
       Dmsg1(050, "Del sql=%s\n", query);
@@ -585,5 +580,5 @@ bool mark_media_purged(UAContext *ua, MEDIA_DBR *mr)
    } else {
       bsendmsg(ua, _("Cannot purge Volume with VolStatus=%s\n"), mr->VolStatus);
    }
-   return strcmp(mr->VolStatus, "Purged") == 0;
+   return strcpy(mr->VolStatus, "Purged") == 0;
 }
index 9fd21a4e7264d47024e8682312d86a8458b7aac4..a625da14c9d40e076111b73fff87e5afe53958a7 100644 (file)
@@ -13,7 +13,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2002-2005 Kern Sibbald
+   Copyright (C) 2002-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
@@ -81,7 +81,7 @@ int restore_cmd(UAContext *ua, const char *cmd)
    RESTORE_CTX rx;                    /* restore context */
    JOB *job;
    int i;
-   POOLMEM *fname;
+   JCR *jcr = ua->jcr;
 
    memset(&rx, 0, sizeof(rx));
    rx.path = get_pool_memory(PM_FNAME);
@@ -177,23 +177,20 @@ int restore_cmd(UAContext *ua, const char *cmd)
    }
 
    /* Build run command */
-   fname = get_pool_memory(PM_MESSAGE);
-   make_unique_restore_filename(ua, &fname);
    if (rx.where) {
       Mmsg(ua->cmd,
           "run job=\"%s\" client=\"%s\" storage=\"%s\" bootstrap=\"%s\""
           " where=\"%s\" files=%d catalog=\"%s\"",
           job->hdr.name, rx.ClientName, rx.store?rx.store->hdr.name:"",
-          fname, rx.where, rx.selected_files, ua->catalog->hdr.name);
+          jcr->RestoreBootstrap, rx.where, rx.selected_files, ua->catalog->hdr.name);
    } else {
       Mmsg(ua->cmd,
           "run job=\"%s\" client=\"%s\" storage=\"%s\" bootstrap=\"%s\""
           " files=%d catalog=\"%s\"",
           job->hdr.name, rx.ClientName, rx.store?rx.store->hdr.name:"",
-          fname, rx.selected_files, ua->catalog->hdr.name);
+          jcr->RestoreBootstrap, rx.selected_files, ua->catalog->hdr.name);
    }
-   free_pool_memory(fname);
-   if (find_arg(ua, N_("yes")) > 0) {
+   if (find_arg(ua, NT_("yes")) > 0) {
       pm_strcat(ua->cmd, " yes");    /* pass it on to the run command */
    }
    Dmsg1(100, "Submitting: %s\n", ua->cmd);
@@ -246,7 +243,7 @@ static int get_client_name(UAContext *ua, RESTORE_CTX *rx)
    if (!rx->ClientName[0]) {
       CLIENT_DBR cr;
       /* try command line argument */
-      int i = find_arg_with_value(ua, N_("client"));
+      int i = find_arg_with_value(ua, NT_("client"));
       if (i >= 0) {
          if (!has_value(ua, i)) {
             return 0;
@@ -499,7 +496,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
             return 0;
          }
          bsendmsg(ua, _("Enter file names with paths, or < to enter a filename\n"
-                        "containg a list of file names with paths, and terminate\n"
+                        "containing a list of file names with paths, and terminate\n"
                         "them with a blank line.\n"));
          for ( ;; ) {
             if (!get_cmd(ua, _("Enter full filename: "))) {
@@ -524,7 +521,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
             return 0;
          }
          bsendmsg(ua, _("Enter file names with paths, or < to enter a filename\n"
-                        "containg a list of file names with paths, and terminate\n"
+                        "containing a list of file names with paths, and terminate\n"
                         "them with a blank line.\n"));
          for ( ;; ) {
             if (!get_cmd(ua, _("Enter full filename: "))) {
@@ -578,7 +575,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
             return 0;
          }
          bsendmsg(ua, _("Enter full directory names or start the name\n"
-                        "with a < to indicate it is a filename containg a list\n"
+                        "with a < to indicate it is a filename containing a list\n"
                         "of directories and terminate them with a blank line.\n"));
          for ( ;; ) {
             if (!get_cmd(ua, _("Enter directory name: "))) {
@@ -725,7 +722,7 @@ static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *f
 {
    char ed1[50];
 
-   strip_trailing_junk(file);
+   strip_trailing_newline(file);
    split_path_and_filename(rx, file);
    if (*rx->JobIds == 0) {
       Mmsg(rx->query, uar_jobid_fileindex, date, rx->path, rx->fname, 
@@ -974,7 +971,7 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx)
       /* Check MediaType and select storage that corresponds */
       get_storage_from_mediatype(ua, &rx->name_list, rx);
 
-      if (find_arg(ua, N_("done")) < 0) {
+      if (find_arg(ua, NT_("done")) < 0) {
          /* Let the user interact in selecting which files to restore */
          OK = user_select_files_from_tree(&tree);
       }
@@ -1153,7 +1150,14 @@ bail_out:
 }
 
 
-/* Return next JobId from comma separated list */
+/* 
+ * Return next JobId from comma separated list   
+ *
+ * Returns:
+ *   1 if next JobId returned
+ *   0 if no more JobIds are in list
+ *  -1 there is an error
+ */
 int get_next_jobid_from_list(char **p, JobId_t *JobId)
 {
    char jobid[30];
index 470cd5bd9630b9871833967a01c00a63e6f4b05a..189bb48c34e5f04af7c88bc36bfd667b633076a1 100644 (file)
@@ -34,7 +34,7 @@ extern struct s_kw ReplaceOptions[];
  *     run [job=]<job-name> level=<level-name>
  *
  * For Restore Jobs
- *     run <job-name> 
+ *     run <job-name> jobid=nn
  *
  *  Returns: 0 on error
  *           JobId if OK
@@ -47,16 +47,13 @@ int run_cmd(UAContext *ua, const char *cmd)
    char *where, *fileset_name, *client_name, *bootstrap;
    const char *replace;
    char *when, *verify_job_name, *catalog_name;
-   char *migration_job_name;
    char *since = NULL;
-   char *verify_list;
    bool cloned = false;
    int Priority = 0;
    int i, j, opt, files = 0;
    bool kw_ok;
    JOB *job = NULL;
    JOB *verify_job = NULL;
-   JOB *migration_job = NULL;
    STORE *store = NULL;
    CLIENT *client = NULL;
    FILESET *fileset = NULL;
@@ -82,8 +79,6 @@ int run_cmd(UAContext *ua, const char *cmd)
       "catalog",                      /* 17 override catalog */
       "since",                        /* 18 since */
       "cloned",                       /* 19 cloned */
-      "verifylist",                   /* 20 verify output list */
-      "migrationjob",                 /* 21 migration job name */
       NULL};
 
 #define YES_POS 14
@@ -104,9 +99,7 @@ int run_cmd(UAContext *ua, const char *cmd)
    bootstrap = NULL;
    replace = NULL;
    verify_job_name = NULL;
-   migration_job_name = NULL;
    catalog_name = NULL;
-   verify_list = NULL;
 
    for (i=1; i<ua->argc; i++) {
       Dmsg2(800, "Doing arg %d = %s\n", i, ua->argk[i]);
@@ -254,20 +247,6 @@ int run_cmd(UAContext *ua, const char *cmd)
                kw_ok = true;
                break;
 
-            case 20: /* write verify list output */
-               verify_list = ua->argv[i];
-               kw_ok = true;
-               break;
-            case 21: /* Migration Job */
-               if (migration_job_name) {
-                  bsendmsg(ua, _("Migration Job specified twice.\n"));
-                  return 0;
-               }
-               migration_job_name = ua->argv[i];
-               kw_ok = true;
-               break;
-
-
             default:
                break;
             }
@@ -414,17 +393,6 @@ int run_cmd(UAContext *ua, const char *cmd)
       verify_job = job->verify_job;
    }
 
-   if (migration_job_name) {
-      migration_job = (JOB *)GetResWithName(R_JOB, migration_job_name);
-      if (!migration_job) {
-         bsendmsg(ua, _("Migration Job \"%s\" not found.\n"), migration_job_name);
-         migration_job = select_job_resource(ua);
-      }
-   } else {
-      migration_job = job->verify_job;
-   }
-
-
    /*
     * Create JCR to run job.  NOTE!!! after this point, free_jcr()
     *  before returning.
@@ -433,7 +401,6 @@ int run_cmd(UAContext *ua, const char *cmd)
    set_jcr_defaults(jcr, job);
 
    jcr->verify_job = verify_job;
-   jcr->migration_job = migration_job;
    set_storage(jcr, store);
    jcr->client = client;
    jcr->fileset = fileset;
@@ -574,12 +541,6 @@ try_again:
          } else {
             Name = "";
          }
-         if (!verify_list) {
-            verify_list = job->WriteVerifyList;
-         }
-         if (!verify_list) {
-            verify_list = "";
-         }
          bsendmsg(ua, _("Run %s job\n"
 "JobName:     %s\n"
 "FileSet:     %s\n"
@@ -588,7 +549,6 @@ try_again:
 "Storage:     %s\n"
 "Pool:        %s\n"
 "Verify Job:  %s\n"
-"Verify List: %s\n"
 "When:        %s\n"
 "Priority:    %d\n"),
               _("Verify"),
@@ -599,7 +559,6 @@ try_again:
               jcr->store->hdr.name,
               NPRT(jcr->pool->hdr.name),
               Name,
-              verify_list,
               bstrutime(dt, sizeof(dt), jcr->sched_time),
               jcr->JobPriority);
       }
@@ -663,37 +622,12 @@ try_again:
               jcr->JobPriority);
       }
       break;
-   case JT_MIGRATE:
-      jcr->JobLevel = L_FULL;      /* default level */
-      bsendmsg(ua, _("Run Restore job\n"
-                     "JobName:       %s\n"
-                     "Bootstrap:     %s\n"
-                     "Where:         %s\n"
-                     "Replace:       %s\n"
-                     "FileSet:       %s\n"
-                     "Client:        %s\n"
-                     "Storage:       %s\n"
-                     "Migration Job: %s\n"
-                     "When:          %s\n"
-                     "Catalog:       %s\n"
-                     "Priority:      %d\n"),
-           job->hdr.name,
-           NPRT(jcr->RestoreBootstrap),
-           jcr->where?jcr->where:NPRT(job->RestoreWhere),
-           replace,
-           jcr->fileset->hdr.name,
-           jcr->client->hdr.name,
-           jcr->store->hdr.name,
-           jcr->migration_job->hdr.name,
-           bstrutime(dt, sizeof(dt), jcr->sched_time),
-           jcr->catalog->hdr.name,
-           jcr->JobPriority);
-      break;
    default:
       bsendmsg(ua, _("Unknown Job Type=%d\n"), jcr->JobType);
       goto bail_out;
    }
 
+
    if (!get_cmd(ua, _("OK to run? (yes/mod/no): "))) {
       goto bail_out;
    }
index 17f9e1de7f7db5369f6fb26e2fce938a4ee73e7b..451e9ec8c3c8f6ede923c9c575323cf83e830c76 100644 (file)
@@ -626,7 +626,7 @@ int get_job_dbr(UAContext *ua, JOB_DBR *jr)
    int i;
 
    for (i=1; i<ua->argc; i++) {
-      if (strcasecmp(ua->argk[i], N_("job")) == 0 && ua->argv[i]) {
+      if (strcasecmp(ua->argk[i], N_("ujobid")) == 0 && ua->argv[i]) {
          jr->JobId = 0;
          bstrncpy(jr->Job, ua->argv[i], sizeof(jr->Job));
       } else if (strcasecmp(ua->argk[i], N_("jobid")) == 0 && ua->argv[i]) {
@@ -648,7 +648,8 @@ int get_job_dbr(UAContext *ua, JOB_DBR *jr)
    jr->Job[0] = 0;
 
    for (i=1; i<ua->argc; i++) {
-      if (strcasecmp(ua->argk[i], N_("jobname")) == 0 && ua->argv[i]) {
+      if ((strcasecmp(ua->argk[i], N_("jobname")) == 0 ||
+           strcasecmp(ua->argk[i], N_("job")) == 0) && ua->argv[i]) {
          jr->JobId = 0;
          bstrncpy(jr->Name, ua->argv[i], sizeof(jr->Name));
          break;
@@ -831,7 +832,8 @@ STORE *get_storage_resource(UAContext *ua, bool use_default)
             free_jcr(jcr);
             break;
 
-         } else if (strcasecmp(ua->argk[i], N_("job")) == 0) {
+         } else if (strcasecmp(ua->argk[i], N_("job")) == 0 ||
+                    strcasecmp(ua->argk[i], N_("jobname")) == 0) {
             if (!ua->argv[i]) {
                bsendmsg(ua, _("Expecting job=xxx, got: %s.\n"), ua->argk[i]);
                return NULL;
@@ -843,6 +845,18 @@ STORE *get_storage_resource(UAContext *ua, bool use_default)
             store = jcr->store;
             free_jcr(jcr);
             break;
+         } else if (strcasecmp(ua->argk[i], N_("ujobid")) == 0) {
+            if (!ua->argv[i]) {
+               bsendmsg(ua, _("Expecting ujobid=xxx, got: %s.\n"), ua->argk[i]);
+               return NULL;
+            }
+            if (!(jcr=get_jcr_by_full_name(ua->argv[i]))) {
+               bsendmsg(ua, _("Job \"%s\" is not running.\n"), ua->argv[i]);
+               return NULL;
+            }
+            store = jcr->store;
+            free_jcr(jcr);
+            break;
         }
       }
    }
index 84138f31b0df4961d6ec14e8e0f355905b9fd9b9..16b9581cf60f6e4e8a8071c0d44a13a93e9ad3b6 100644 (file)
@@ -360,6 +360,7 @@ struct sched_pkt {
    int priority;
    time_t runtime;
    POOL *pool;
+   STORE *store;
 };
 
 static void prt_runtime(UAContext *ua, sched_pkt *sp)
@@ -379,7 +380,8 @@ static void prt_runtime(UAContext *ua, sched_pkt *sp)
          close_db = true;             /* new db opened, remember to close it */
       }
       if (ok) {
-         mr.PoolId = jcr->jr.PoolId;
+         mr.PoolId = jcr->PoolId;
+         mr.StorageId = sp->store->StorageId;
          ok = find_next_volume_for_append(jcr, &mr, 1, false/*no create*/);
       }
       if (!ok) {
@@ -435,6 +437,7 @@ static void list_scheduled_jobs(UAContext *ua)
    time_t runtime;
    RUN *run;
    JOB *job;
+   STORE* store;
    int level, num_jobs = 0;
    int priority;
    bool hdr_printed = false;
@@ -469,6 +472,11 @@ static void list_scheduled_jobs(UAContext *ua)
          if (run->Priority) {
             priority = run->Priority;
          }
+         if (run->storage) {
+            store = run->storage;
+         } else {
+            store = (STORE *)job->storage->first();
+         }
          if (!hdr_printed) {
             prt_runhdr(ua);
             hdr_printed = true;
@@ -479,6 +487,7 @@ static void list_scheduled_jobs(UAContext *ua)
          sp->priority = priority;
          sp->runtime = runtime;
          sp->pool = run->pool;
+         sp->store = store;
          sched.binary_insert_multiple(sp, my_compare);
          num_jobs++;
       }
index ed9c3364fe59db849f4b2bb2ebc5750569662eee..a4064369779d6f0a5e7c15613a9ab7c8dda8d68a 100644 (file)
@@ -55,24 +55,24 @@ static int donecmd(UAContext *ua, TREE_CTX *tree);
 
 struct cmdstruct { const char *key; int (*func)(UAContext *ua, TREE_CTX *tree); const char *help; };
 static struct cmdstruct commands[] = {
- { N_("cd"),         cdcmd,        _("change current directory")},
- { N_("count"),      countcmd,     _("count marked files in and below the cd")},
- { N_("dir"),        dircmd,       _("long list current directory, wildcards allowed")},
- { N_(".dir"),       dot_dircmd,   _("long list current directory, wildcards allowed")},
- { N_("done"),       donecmd,      _("leave file selection mode")},
- { N_("estimate"),   estimatecmd,  _("estimate restore size")},
- { N_("exit"),       donecmd,      _("same as done command")},
- { N_("find"),       findcmd,      _("find files, wildcards allowed")},
- { N_("help"),       helpcmd,      _("print help")},
- { N_("ls"),         lscmd,        _("list current directory, wildcards allowed")},
- { N_("lsmark"),     lsmarkcmd,    _("list the marked files in and below the cd")},
- { N_("mark"),       markcmd,      _("mark dir/file to be restored recursively, wildcards allowed")},
- { N_("markdir"),    markdircmd,   _("mark directory name to be restored (no files)")},
- { N_("pwd"),        pwdcmd,       _("print current working directory")},
- { N_("unmark"),     unmarkcmd,    _("unmark dir/file to be restored recursively in dir")},
- { N_("unmarkdir"),  unmarkdircmd, _("unmark directory name only no recursion")},
- { N_("quit"),       quitcmd,      _("quit and do not do restore")},
- { N_("?"),          helpcmd,      _("print help")},
+ { NT_("cd"),         cdcmd,        _("change current directory")},
+ { NT_("count"),      countcmd,     _("count marked files in and below the cd")},
+ { NT_("dir"),        dircmd,       _("long list current directory, wildcards allowed")},
+ { NT_(".dir"),       dot_dircmd,   _("long list current directory, wildcards allowed")},
+ { NT_("done"),       donecmd,      _("leave file selection mode")},
+ { NT_("estimate"),   estimatecmd,  _("estimate restore size")},
+ { NT_("exit"),       donecmd,      _("same as done command")},
+ { NT_("find"),       findcmd,      _("find files, wildcards allowed")},
+ { NT_("help"),       helpcmd,      _("print help")},
+ { NT_("ls"),         lscmd,        _("list current directory, wildcards allowed")},
+ { NT_("lsmark"),     lsmarkcmd,    _("list the marked files in and below the cd")},
+ { NT_("mark"),       markcmd,      _("mark dir/file to be restored recursively, wildcards allowed")},
+ { NT_("markdir"),    markdircmd,   _("mark directory name to be restored (no files)")},
+ { NT_("pwd"),        pwdcmd,       _("print current working directory")},
+ { NT_("unmark"),     unmarkcmd,    _("unmark dir/file to be restored recursively in dir")},
+ { NT_("unmarkdir"),  unmarkdircmd, _("unmark directory name only no recursion")},
+ { NT_("quit"),       quitcmd,      _("quit and do not do restore")},
+ { NT_("?"),          helpcmd,      _("print help")},
              };
 #define comsize (sizeof(commands)/sizeof(struct cmdstruct))
 
@@ -472,6 +472,7 @@ static void ls_output(char *buf, const char *fname, const char *tag,
    char ec1[30];
    char en1[30], en2[30];
    int n;
+   time_t time;
 
    p = encode_mode(statp->st_mode, buf);
    if (dot_cmd) {
@@ -495,7 +496,13 @@ static void ls_output(char *buf, const char *fname, const char *tag,
       p += n;
       n = sprintf(p, "%10.10s  ", edit_uint64(statp->st_size, ec1));
       p += n;
-      p = encode_time(statp->st_ctime, p);
+      if (statp->st_ctime > statp->st_mtime) {
+         time = statp->st_ctime;
+      } else {
+         time = statp->st_mtime;
+      }
+      /* Display most recent time */
+      p = encode_time(time, p);
       *p++ = ' ';
       *p++ = *tag;
    }
index 8737ecc61ada5ec564a2330c1e4be2c69211d8bc..ccf7db8916af20a9364df3dcd63fee241eb50c03 100644 (file)
@@ -51,10 +51,10 @@ static int update_pool(UAContext *ua);
 int update_cmd(UAContext *ua, const char *cmd)
 {
    static const char *kw[] = {
-      N_("media"),  /* 0 */
-      N_("volume"), /* 1 */
-      N_("pool"),   /* 2 */
-      N_("slots"),  /* 3 */
+      NT_("media"),  /* 0 */
+      NT_("volume"), /* 1 */
+      NT_("pool"),   /* 2 */
+      NT_("slots"),  /* 3 */
       NULL};
 
    if (!open_db(ua)) {
@@ -100,14 +100,14 @@ static void update_volstatus(UAContext *ua, const char *val, MEDIA_DBR *mr)
 {
    POOL_MEM query(PM_MESSAGE);
    const char *kw[] = {
-      N_("Append"),
-      N_("Archive"),
-      N_("Disabled"),
-      N_("Full"),
-      N_("Used"),
-      N_("Cleaning"),
-      N_("Recycle"),
-      N_("Read-Only"),
+      NT_("Append"),
+      NT_("Archive"),
+      NT_("Disabled"),
+      NT_("Full"),
+      NT_("Used"),
+      NT_("Cleaning"),
+      NT_("Recycle"),
+      NT_("Read-Only"),
       NULL};
    bool found = false;
    int i;
@@ -460,44 +460,45 @@ static int update_volume(UAContext *ua)
    }
 
    for ( ; !done; ) {
-      bsendmsg(ua, _("Updating Volume \"%s\"\n"), mr.VolumeName);
       start_prompt(ua, _("Parameters to modify:\n"));
-      add_prompt(ua, _("Volume Status"));
-      add_prompt(ua, _("Volume Retention Period"));
-      add_prompt(ua, _("Volume Use Duration"));
-      add_prompt(ua, _("Maximum Volume Jobs"));
-      add_prompt(ua, _("Maximum Volume Files"));
-      add_prompt(ua, _("Maximum Volume Bytes"));
-      add_prompt(ua, _("Recycle Flag"));
-      add_prompt(ua, _("Slot"));
-      add_prompt(ua, _("InChanger Flag"));
-      add_prompt(ua, _("Volume Files"));
-      add_prompt(ua, _("Pool"));
-      add_prompt(ua, _("Volume from Pool"));
-      add_prompt(ua, _("All Volumes from Pool"));
-      add_prompt(ua, _("Done"));
+      add_prompt(ua, _("Volume Status"));              /* 0 */
+      add_prompt(ua, _("Volume Retention Period"));    /* 1 */
+      add_prompt(ua, _("Volume Use Duration"));        /* 2 */
+      add_prompt(ua, _("Maximum Volume Jobs"));        /* 3 */
+      add_prompt(ua, _("Maximum Volume Files"));       /* 4 */
+      add_prompt(ua, _("Maximum Volume Bytes"));       /* 5 */
+      add_prompt(ua, _("Recycle Flag"));               /* 6 */
+      add_prompt(ua, _("Slot"));                       /* 7 */
+      add_prompt(ua, _("InChanger Flag"));             /* 8 */
+      add_prompt(ua, _("Volume Files"));               /* 9 */
+      add_prompt(ua, _("Pool"));                       /* 10 */
+      add_prompt(ua, _("Volume from Pool"));           /* 11 */
+      add_prompt(ua, _("All Volumes from Pool"));      /* 12 */
+      add_prompt(ua, _("Done"));                       /* 13 */
       i = do_prompt(ua, "", _("Select parameter to modify"), NULL, 0);  
+
       /* For All Volumes from Pool we don't need a Volume record */
-      if (i != 12) {
+      if (i != 12 && i != 13) {
          if (!select_media_dbr(ua, &mr)) {  /* Get Volume record */
             return 0;
          }
+         bsendmsg(ua, _("Updating Volume \"%s\"\n"), mr.VolumeName);
       }
       switch (i) {
       case 0:                         /* Volume Status */
          /* Modify Volume Status */
          bsendmsg(ua, _("Current Volume status is: %s\n"), mr.VolStatus);
          start_prompt(ua, _("Possible Values are:\n"));
-         add_prompt(ua, N_("Append")); 
-         add_prompt(ua, N_("Archive"));
-         add_prompt(ua, N_("Disabled"));
-         add_prompt(ua, N_("Full"));
-         add_prompt(ua, N_("Used"));
-         add_prompt(ua, N_("Cleaning"));
-         if (strcmp(mr.VolStatus, N_("Purged")) == 0) {
-            add_prompt(ua, N_("Recycle"));
+         add_prompt(ua, NT_("Append")); 
+         add_prompt(ua, NT_("Archive"));
+         add_prompt(ua, NT_("Disabled"));
+         add_prompt(ua, NT_("Full"));
+         add_prompt(ua, NT_("Used"));
+         add_prompt(ua, NT_("Cleaning"));
+         if (strcmp(mr.VolStatus, NT_("Purged")) == 0) {
+            add_prompt(ua, NT_("Recycle"));
          }
-         add_prompt(ua, N_("Read-Only"));
+         add_prompt(ua, NT_("Read-Only"));
          if (do_prompt(ua, "", _("Choose new Volume Status"), ua->cmd, sizeof(mr.VolStatus)) < 0) {
             return 1;
          }
index 45b0246a5856f54b2fc9a35f765bac26fdf9eba2..2ccdadc500912985227f6cf4604ec1f44487c50a 100644 (file)
@@ -43,7 +43,6 @@ static char storaddr[]     = "storage address=%s port=%d ssl=0\n";
 /* Responses received from File daemon */
 static char OKverify[]    = "2000 OK verify\n";
 static char OKstore[]     = "2000 OK storage\n";
-static char OKbootstrap[] = "2000 OK bootstrap\n";
 
 /* Forward referenced functions */
 static void prt_fname(JCR *jcr);
@@ -60,7 +59,7 @@ bool do_verify_init(JCR *jcr)
    JobId_t verify_jobid = 0;
    const char *Name;
 
-   memset(&jcr->target_jr, 0, sizeof(jcr->target_jr));
+   memset(&jcr->previous_jr, 0, sizeof(jcr->previous_jr));
 
    Dmsg1(9, "bdird: created client %s record\n", jcr->client->hdr.name);
 
@@ -104,19 +103,19 @@ bool do_verify_init(JCR *jcr)
    if (jcr->JobLevel == L_VERIFY_CATALOG ||
        jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG ||
        jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG) {
-      jcr->target_jr.JobId = verify_jobid;
-      if (!db_get_job_record(jcr, jcr->db, &jcr->target_jr)) {
+      jcr->previous_jr.JobId = verify_jobid;
+      if (!db_get_job_record(jcr, jcr->db, &jcr->previous_jr)) {
          Jmsg(jcr, M_FATAL, 0, _("Could not get job record for previous Job. ERR=%s"),
               db_strerror(jcr->db));
          return false;
       }
-      if (jcr->target_jr.JobStatus != 'T') {
+      if (jcr->previous_jr.JobStatus != 'T') {
          Jmsg(jcr, M_FATAL, 0, _("Last Job %d did not terminate normally. JobStatus=%c\n"),
-            verify_jobid, jcr->target_jr.JobStatus);
+            verify_jobid, jcr->previous_jr.JobStatus);
          return false;
       }
       Jmsg(jcr, M_INFO, 0, _("Verifying against JobId=%d Job=%s\n"),
-         jcr->target_jr.JobId, jcr->target_jr.Job);
+         jcr->previous_jr.JobId, jcr->previous_jr.Job);
    }
 
    /*
@@ -126,9 +125,27 @@ bool do_verify_init(JCR *jcr)
     *   File daemon but not used).
     */
    if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
-      if (!create_restore_bootstrap_file(jcr)) {
+      RESTORE_CTX rx;
+      UAContext *ua;
+      memset(&rx, 0, sizeof(rx));
+      rx.bsr = new_bsr();
+      rx.JobIds = "";                       
+      rx.bsr->JobId = jcr->previous_jr.JobId;
+      ua = new_ua_context(jcr);
+      complete_bsr(ua, rx.bsr);
+      rx.bsr->fi = new_findex();
+      rx.bsr->fi->findex = 1;
+      rx.bsr->fi->findex2 = jcr->previous_jr.JobFiles;
+      jcr->ExpectedFiles = write_bsr_file(ua, rx);
+      if (jcr->ExpectedFiles == 0) {
+         free_ua_context(ua);
+         free_bsr(rx.bsr);
          return false;
       }
+      free_ua_context(ua);
+      free_bsr(rx.bsr);
+      jcr->needs_sd = true;
+
    } else {
       jcr->sd_auth_key = bstrdup("dummy");    /* dummy Storage daemon key */
    }
@@ -136,7 +153,7 @@ bool do_verify_init(JCR *jcr)
    if (jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG && jcr->verify_job) {
       jcr->fileset = jcr->verify_job->fileset;
    }
-   Dmsg2(100, "ClientId=%u JobLevel=%c\n", jcr->target_jr.ClientId, jcr->JobLevel);
+   Dmsg2(100, "ClientId=%u JobLevel=%c\n", jcr->previous_jr.ClientId, jcr->JobLevel);
    return true;
 }
 
@@ -238,8 +255,7 @@ bool do_verify(JCR *jcr)
       /*
        * Send the bootstrap file -- what Volumes/files to restore
        */
-      if (!send_bootstrap_file(jcr, fd) ||
-          !response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
+      if (!send_bootstrap_file(jcr)) {
          return false;
       }
 
@@ -285,19 +301,19 @@ bool do_verify(JCR *jcr)
       Dmsg0(10, "Verify level=catalog\n");
       jcr->sd_msg_thread_done = true;   /* no SD msg thread, so it is done */
       jcr->SDJobStatus = JS_Terminated;
-      get_attributes_and_compare_to_catalog(jcr, jcr->target_jr.JobId);
+      get_attributes_and_compare_to_catalog(jcr, jcr->previous_jr.JobId);
       break;
 
    case L_VERIFY_VOLUME_TO_CATALOG:
       Dmsg0(10, "Verify level=volume\n");
-      get_attributes_and_compare_to_catalog(jcr, jcr->target_jr.JobId);
+      get_attributes_and_compare_to_catalog(jcr, jcr->previous_jr.JobId);
       break;
 
    case L_VERIFY_DISK_TO_CATALOG:
       Dmsg0(10, "Verify level=disk_to_catalog\n");
       jcr->sd_msg_thread_done = true;   /* no SD msg thread, so it is done */
       jcr->SDJobStatus = JS_Terminated;
-      get_attributes_and_compare_to_catalog(jcr, jcr->target_jr.JobId);
+      get_attributes_and_compare_to_catalog(jcr, jcr->previous_jr.JobId);
       break;
 
    case L_VERIFY_INIT:
@@ -421,7 +437,7 @@ void verify_cleanup(JCR *jcr, int TermCode)
          jcr->fileset->hdr.name,
          level_to_str(jcr->JobLevel),
          jcr->client->hdr.name,
-         jcr->target_jr.JobId,
+         jcr->previous_jr.JobId,
          Name,
          sdt,
          edt,
@@ -454,7 +470,7 @@ void verify_cleanup(JCR *jcr, int TermCode)
          jcr->fileset->hdr.name,
          level_to_str(jcr->JobLevel),
          jcr->client->hdr.name,
-         jcr->target_jr.JobId,
+         jcr->previous_jr.JobId,
          Name,
          sdt,
          edt,
@@ -479,7 +495,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
    int stat = JS_Terminated;
    char buf[MAXSTRING];
    POOLMEM *fname = get_pool_memory(PM_MESSAGE);
-   int do_Digest = CRYPTO_DIGEST_NONE;
+   int do_SIG = NO_SIG;
    int32_t file_index = 0;
 
    memset(&fdbr, 0, sizeof(FILE_DBR));
@@ -493,7 +509,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
     * We expect:
     *   FileIndex
     *   Stream
-    *   Options or Digest (MD5/SHA1)
+    *   Options or SIG (MD5/SHA1)
     *   Filename
     *   Attributes
     *   Link name  ???
@@ -501,11 +517,11 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
    while ((n=bget_dirmsg(fd)) >= 0 && !job_canceled(jcr)) {
       int stream;
       char *attr, *p, *fn;
-      char Opts_Digest[MAXSTRING];        /* Verify Opts or MD5/SHA1 digest */
+      char Opts_SIG[MAXSTRING];        /* Verify Opts or MD5/SHA1 signature */
 
       fname = check_pool_memory_size(fname, fd->msglen);
       jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen);
-      Dmsg1(200, "Atts+Digest=%s\n", fd->msg);
+      Dmsg1(200, "Atts+SIG=%s\n", fd->msg);
       if ((len = sscanf(fd->msg, "%ld %d %100s", &file_index, &stream,
             fname)) != 3) {
          Jmsg3(jcr, M_FATAL, 0, _("bird<filed: bad attributes, expected 3 fields got %d\n"
@@ -516,13 +532,13 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
        * We read the Options or Signature into fname
        *  to prevent overrun, now copy it to proper location.
        */
-      bstrncpy(Opts_Digest, fname, sizeof(Opts_Digest));
+      bstrncpy(Opts_SIG, fname, sizeof(Opts_SIG));
       p = fd->msg;
       skip_nonspaces(&p);             /* skip FileIndex */
       skip_spaces(&p);
       skip_nonspaces(&p);             /* skip Stream */
       skip_spaces(&p);
-      skip_nonspaces(&p);             /* skip Opts_Digest */
+      skip_nonspaces(&p);             /* skip Opts_SIG */
       p++;                            /* skip space */
       fn = fname;
       while (*p != 0) {
@@ -539,7 +555,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
          jcr->JobFiles++;
          jcr->FileIndex = file_index;    /* remember attribute file_index */
          decode_stat(attr, &statf, &LinkFIf);  /* decode file stat packet */
-         do_Digest = CRYPTO_DIGEST_NONE;
+         do_SIG = NO_SIG;
          jcr->fn_printed = false;
          pm_strcpy(jcr->fname, fname);  /* move filename into JCR */
 
@@ -551,7 +567,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
           */
          fdbr.FileId = 0;
          if (!db_get_file_attributes_record(jcr, jcr->db, jcr->fname,
-              &jcr->target_jr, &fdbr)) {
+              &jcr->previous_jr, &fdbr)) {
             Jmsg(jcr, M_INFO, 0, _("New file: %s\n"), jcr->fname);
             Dmsg1(020, _("File not in catalog: %s\n"), jcr->fname);
             stat = JS_Differences;
@@ -565,13 +581,13 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
          }
 
          Dmsg3(400, "Found %s in catalog. inx=%d Opts=%s\n", jcr->fname,
-            file_index, Opts_Digest);
+            file_index, Opts_SIG);
          decode_stat(fdbr.LStat, &statc, &LinkFIc); /* decode catalog stat */
          /*
           * Loop over options supplied by user and verify the
           * fields he requests.
           */
-         for (p=Opts_Digest; *p; p++) {
+         for (p=Opts_SIG; *p; p++) {
             char ed1[30], ed2[30];
             switch (*p) {
             case 'i':                /* compare INODEs */
@@ -656,10 +672,10 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
                break;
             case '5':                /* compare MD5 */
                Dmsg1(500, "set Do_MD5 for %s\n", jcr->fname);
-               do_Digest = CRYPTO_DIGEST_MD5;
+               do_SIG = MD5_SIG;
                break;
             case '1':                 /* compare SHA1 */
-               do_Digest = CRYPTO_DIGEST_SHA1;
+               do_SIG = SHA1_SIG;
                break;
             case ':':
             case 'V':
@@ -668,13 +684,13 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
             }
          }
       /*
-       * Got Digest Signature from Storage daemon
-       *  It came across in the Opts_Digest field.
+       * Got SIG Signature from Storage daemon
+       *  It came across in the Opts_SIG field.
        */
-      } else if (crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
-         Dmsg2(400, "stream=Digest inx=%d Digest=%s\n", file_index, Opts_Digest);
+      } else if (stream == STREAM_MD5_SIGNATURE || stream == STREAM_SHA1_SIGNATURE) {
+         Dmsg2(400, "stream=SIG inx=%d SIG=%s\n", file_index, Opts_SIG);
          /*
-          * When ever we get a digest is MUST have been
+          * When ever we get a signature is MUST have been
           * preceded by an attributes record, which sets attr_file_index
           */
          if (jcr->FileIndex != (uint32_t)file_index) {
@@ -682,20 +698,20 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
                file_index, jcr->FileIndex);
             return false;
          }
-         if (do_Digest != CRYPTO_DIGEST_NONE) {
-            db_escape_string(buf, Opts_Digest, strlen(Opts_Digest));
-            if (strcmp(buf, fdbr.Digest) != 0) {
+         if (do_SIG) {
+            db_escape_string(buf, Opts_SIG, strlen(Opts_SIG));
+            if (strcmp(buf, fdbr.SIG) != 0) {
                prt_fname(jcr);
                if (debug_level >= 10) {
                   Jmsg(jcr, M_INFO, 0, _("      %s not same. File=%s Cat=%s\n"),
-                       stream_to_ascii(stream), buf, fdbr.Digest);
+                       stream==STREAM_MD5_SIGNATURE?"MD5":"SHA1", buf, fdbr.SIG);
                } else {
                   Jmsg(jcr, M_INFO, 0, _("      %s differs.\n"),
-                       stream_to_ascii(stream));
+                       stream==STREAM_MD5_SIGNATURE?"MD5":"SHA1");
                }
                stat = JS_Differences;
             }
-            do_Digest = CRYPTO_DIGEST_NONE;
+            do_SIG = FALSE;
          }
       }
       jcr->JobFiles = file_index;
@@ -708,13 +724,13 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
    }
 
    /* Now find all the files that are missing -- i.e. all files in
-    *  the database where the MarkedId != current JobId
+    *  the database where the MarkId != current JobId
     */
    jcr->fn_printed = false;
    bsnprintf(buf, sizeof(buf),
 "SELECT Path.Path,Filename.Name FROM File,Path,Filename "
 "WHERE File.JobId=%d "
-"AND File.MarkedId!=%d AND File.PathId=Path.PathId "
+"AND File.MarkeId!=%d AND File.PathId=Path.PathId "
 "AND File.FilenameId=Filename.FilenameId",
       JobId, jcr->JobId);
    /* missing_handler is called for each file found */
index c0e86adb7fe5c766b598539e0c19ca6fe41e224a..9e23ba0b615f90c079fbb54383c208d88711789f 100755 (executable)
@@ -31,10 +31,10 @@ first_rule: all
 dummy:
 
 #
-SVRSRCS = filed.c authenticate.c acl.c backup.c estimate.c \
+SVRSRCS = filed.c authenticate.c acl.c backup.c chksum.c estimate.c \
          filed_conf.c heartbeat.c job.c pythonfd.c \
          restore.c status.c verify.c verify_vol.c
-SVROBJS = filed.o authenticate.o acl.o backup.o estimate.o \
+SVROBJS = filed.o authenticate.o acl.o backup.o chksum.o estimate.o \
          filed_conf.o heartbeat.o job.o pythonfd.o \
          restore.o status.o verify.o verify_vol.o
 
@@ -137,8 +137,8 @@ install: all
 
 uninstall:
        (cd $(DESTDIR)$(sbindir); $(RMF) bacula-fd)
-       (cd $(DESTDIR)$(sbindir); $(RMF) bacula-fd.conf)
-       (cd $(DESTDIR)$(sbindir); $(RMF) bacula-fd.conf.new)
+       (cd $(DESTDIR)$(sysconfdir); $(RMF) bacula-fd.conf)
+       (cd $(DESTDIR)$(sysconfdir); $(RMF) bacula-fd.conf.new)
 
 
 
index 3af54fcb8fe39c7bc53fe10dc0c0d99338041b29..2174427d8688b26cd2ccf0f63810f53b2b1f78ac 100644 (file)
@@ -27,7 +27,7 @@
 
 /* Forward referenced functions */
 static int save_file(FF_PKT *ff_pkt, void *pkt, bool top_level);
-static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *signature_digest);
+static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, struct CHKSUM *chksum);
 static bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream);
 static bool read_and_send_acl(JCR *jcr, int acltype, int stream);
 
@@ -47,8 +47,6 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
 {
    BSOCK *sd;
    bool ok = true;
-   // TODO landonf: Allow user to specify encryption algorithm
-   crypto_cipher_t cipher = CRYPTO_CIPHER_AES_128_CBC;
 
    sd = jcr->store_bsock;
 
@@ -81,40 +79,6 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
    jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30;
    jcr->compress_buf = get_memory(jcr->compress_buf_size);
 
-   /* Create encryption session data and a cached, DER-encoded session data
-    * structure. We use a single session key for each backup, so we'll encode
-    * the session data only once. */
-   if (jcr->pki_encrypt) {
-      size_t size = 0;
-
-      /* Create per-job session encryption context */
-      jcr->pki_session = crypto_session_new(cipher, jcr->pki_recipients);
-
-      /* Get the session data size */
-      if (crypto_session_encode(jcr->pki_session, NULL, &size) == false) {
-         Jmsg(jcr, M_FATAL, 0, _("An error occured while encrypting the stream.\n"));
-         return 0;
-      }
-
-      /* Allocate buffer */
-      jcr->pki_session_encoded = malloc(size);
-      if (!jcr->pki_session_encoded) {
-         return 0;
-      }
-
-      /* Encode session data */
-      if (crypto_session_encode(jcr->pki_session, jcr->pki_session_encoded, &size) == false) {
-         Jmsg(jcr, M_FATAL, 0, _("An error occured while encrypting the stream.\n"));
-         return 0;
-      }
-
-      /* ... and store the encoded size */
-      jcr->pki_session_encoded_size = size;
-
-      /* Allocate the encryption/decryption buffer */
-      jcr->crypto_buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE);
-   }
-
    Dmsg1(300, "set_find_options ff=%p\n", jcr->ff);
    set_find_options((FF_PKT *)jcr->ff, jcr->incremental, jcr->mtime);
    Dmsg0(300, "start find files\n");
@@ -144,18 +108,6 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
       free_pool_memory(jcr->compress_buf);
       jcr->compress_buf = NULL;
    }
-   if (jcr->crypto_buf) {
-      free_pool_memory(jcr->crypto_buf);
-      jcr->crypto_buf = NULL;
-   }
-
-   if (jcr->pki_session) {
-      crypto_session_free(jcr->pki_session);
-   }
-   if (jcr->pki_session_encoded) {
-      free(jcr->pki_session_encoded);
-   }
-
    Dmsg1(100, "end blast_data ok=%d\n", ok);
    return ok;
 }
@@ -173,15 +125,7 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
 static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
 {
    int stat, data_stream;
-   DIGEST *digest = NULL;
-   DIGEST *signing_digest = NULL;
-   int digest_stream = STREAM_NONE;
-   // TODO landonf: Allow the user to specify the digest algorithm
-#ifdef HAVE_SHA2
-   crypto_digest_t signing_algorithm = CRYPTO_DIGEST_SHA256;
-#else
-   crypto_digest_t signing_algorithm = CRYPTO_DIGEST_SHA1;
-#endif
+   struct CHKSUM chksum;
    BSOCK *sd;
    JCR *jcr = (JCR *)vjcr;
 
@@ -280,55 +224,13 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
 
    Dmsg1(130, "bfiled: sending %s to stored\n", ff_pkt->fname);
 
-   /*
-    * Setup for digest handling. If this fails, the digest will be set to NULL
-    * and not used.
-    */
-   if (ff_pkt->flags & FO_MD5) {
-      digest = crypto_digest_new(CRYPTO_DIGEST_MD5);
-      digest_stream = STREAM_MD5_DIGEST;
-
-   } else if (ff_pkt->flags & FO_SHA1) {
-      digest = crypto_digest_new(CRYPTO_DIGEST_SHA1);
-      digest_stream = STREAM_SHA1_DIGEST;
-
-   } else if (ff_pkt->flags & FO_SHA256) {
-      digest = crypto_digest_new(CRYPTO_DIGEST_SHA256);
-      digest_stream = STREAM_SHA256_DIGEST;
-
-   } else if (ff_pkt->flags & FO_SHA512) {
-      digest = crypto_digest_new(CRYPTO_DIGEST_SHA512);
-      digest_stream = STREAM_SHA512_DIGEST;
-   }
-
-   /* Did digest initialization fail? */
-   if (digest_stream != STREAM_NONE && digest == NULL) {
-      Jmsg(jcr, M_WARNING, 0, _("%s digest initialization failed\n"),
-         stream_to_ascii(digest_stream));
-   }
 
    /*
-    * Set up signature digest handling. If this fails, the signature digest will be set to
-    * NULL and not used.
+    * Setup for signature handling.
+    * Then initialise the file descriptor we use for data and other streams.
     */
-   // TODO landonf: We should really only calculate the digest once, for both verification and signing.
-   if (jcr->pki_sign) {
-      signing_digest = crypto_digest_new(signing_algorithm);
-   }
-   /* Full-stop if a failure occured initializing the signature digest */
-   if (jcr->pki_sign && signing_digest == NULL) {
-      Jmsg(jcr, M_NOTSAVED, 0, _("%s signature digest initialization failed\n"),
-         stream_to_ascii(signing_algorithm));
-      jcr->Errors++;
-      return 1;
-   }
+   chksum_init(&chksum, ff_pkt->flags);
 
-   /* Enable encryption */
-   if (jcr->pki_encrypt) {
-      ff_pkt->flags |= FO_ENCRYPT;
-   }
-
-   /* Initialise the file descriptor we use for data and other streams. */
    binit(&ff_pkt->bfd);
    if (ff_pkt->flags & FO_PORTABLE) {
       set_portable_backup(&ff_pkt->bfd); /* disable Win32 BackupRead() */
@@ -341,7 +243,6 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
       }
    }
 
-   /* Send attributes -- must be done after binit() */
    if (!encode_and_send_attributes(jcr, ff_pkt, data_stream)) {
       return 0;
    }
@@ -378,27 +279,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
          stop_thread_timer(tid);
          tid = NULL;
       }
-
-      /* Set up the encryption context, send the session data to the SD */
-      if (jcr->pki_encrypt) {
-         /* Send our header */
-         bnet_fsend(sd, "%ld %d 0", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA);
-
-         /* Grow the bsock buffer to fit our message if necessary */
-         if ((size_t) sizeof_pool_memory(sd->msg) < jcr->pki_session_encoded_size) {
-            sd->msg = realloc_pool_memory(sd->msg, jcr->pki_session_encoded_size);
-         }
-
-         /* Copy our message over and send it */
-         memcpy(sd->msg, jcr->pki_session_encoded, jcr->pki_session_encoded_size);
-         sd->msglen = jcr->pki_session_encoded_size;
-         jcr->JobBytes += sd->msglen;
-
-         bnet_send(sd);
-         bnet_sig(sd, BNET_EOD);
-      }
-
-      stat = send_data(jcr, data_stream, ff_pkt, digest, signing_digest);
+      stat = send_data(jcr, data_stream, ff_pkt, &chksum);
       bclose(&ff_pkt->bfd);
       if (!stat) {
          return 0;
@@ -424,7 +305,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
          }
          flags = ff_pkt->flags;
          ff_pkt->flags &= ~(FO_GZIP|FO_SPARSE);
-         stat = send_data(jcr, STREAM_MACOS_FORK_DATA, ff_pkt, digest, signing_digest);
+         stat = send_data(jcr, STREAM_MACOS_FORK_DATA, ff_pkt, &chksum);
          ff_pkt->flags = flags;
          bclose(&ff_pkt->bfd);
          if (!stat) {
@@ -437,12 +318,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
       Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
       memcpy(sd->msg, ff_pkt->hfsinfo.fndrinfo, 32);
       sd->msglen = 32;
-      if (digest) {
-         crypto_digest_update(digest, sd->msg, sd->msglen);
-      }
-      if (signing_digest) {
-         crypto_digest_update(signing_digest, sd->msg, sd->msglen);
-      }
+      chksum_update(&chksum, (unsigned char *)sd->msg, sd->msglen);
       bnet_send(sd);
       bnet_sig(sd, BNET_EOD);
    }
@@ -461,78 +337,25 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
       }
    }
 
-   /* Terminate the signing digest and send it to the Storage daemon */
-   if (signing_digest) {
-      SIGNATURE *sig;
-      size_t size = 0;
-      void *buf;
-
-      if ((sig = crypto_sign_new()) == NULL) {
-         Jmsg(jcr, M_FATAL, 0, _("Failed to allocate memory for stream signature.\n"));
-         return 0;
-      }
-
-      if (crypto_sign_add_signer(sig, signing_digest, jcr->pki_keypair) == false) {
-         Jmsg(jcr, M_FATAL, 0, _("An error occured while signing the stream.\n"));
-         return 0;
-      }
-
-      /* Get signature size */
-      if (crypto_sign_encode(sig, NULL, &size) == false) {
-         Jmsg(jcr, M_FATAL, 0, _("An error occured while signing the stream.\n"));
-         return 0;
-      }
-
-      /* Allocate signature data buffer */
-      buf = malloc(size);
-      if (!buf) {
-         crypto_sign_free(sig);
-         return 0;
-      }
-
-      /* Encode signature data */
-      if (crypto_sign_encode(sig, buf, &size) == false) {
-         Jmsg(jcr, M_FATAL, 0, _("An error occured while signing the stream.\n"));
-         return 0;
-      }
-
-      /* Send our header */
-      bnet_fsend(sd, "%ld %d 0", jcr->JobFiles, STREAM_SIGNED_DIGEST);
-      Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
-
-      /* Grow the bsock buffer to fit our message if necessary */
-      if ((size_t) sizeof_pool_memory(sd->msg) < size) {
-         sd->msg = realloc_pool_memory(sd->msg, size);
+   /* Terminate any signature and send it to Storage daemon and the Director */
+   if (chksum.updated) {
+      int stream = 0;
+      chksum_final(&chksum);
+      if (chksum.type == CHKSUM_MD5) {
+         stream = STREAM_MD5_SIGNATURE;
+      } else if (chksum.type == CHKSUM_SHA1) {
+         stream = STREAM_SHA1_SIGNATURE;
+      } else {
+         Jmsg1(jcr, M_WARNING, 0, _("Unknown signature type %i.\n"), chksum.type);
       }
-
-      /* Copy our message over and send it */
-      memcpy(sd->msg, buf, size);
-      sd->msglen = size;
-      bnet_send(sd);
-      bnet_sig(sd, BNET_EOD);              /* end of checksum */
-
-      crypto_digest_free(signing_digest);
-      crypto_sign_free(sig);        
-      free(buf);
-   }
-
-   /* Terminate any digest and send it to Storage daemon and the Director */
-   if (digest) {
-      char md[CRYPTO_DIGEST_MAX_SIZE];
-      size_t size;
-
-      size = sizeof(md);
-
-      if (crypto_digest_finalize(digest, &md, &size)) {
-         bnet_fsend(sd, "%ld %d 0", jcr->JobFiles, digest_stream);
+      if (stream != 0) {
+         bnet_fsend(sd, "%ld %d 0", jcr->JobFiles, stream);
          Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
-         memcpy(sd->msg, md, size);
-         sd->msglen = size;
+         memcpy(sd->msg, chksum.signature, chksum.length);
+         sd->msglen = chksum.length;
          bnet_send(sd);
          bnet_sig(sd, BNET_EOD);              /* end of checksum */
       }
-
-      crypto_digest_free(digest);
    }
 
    return 1;
@@ -548,18 +371,13 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
  * Currently this is not a problem as the only other stream, resource forks,
  * are not handled as sparse files.
  */
-int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *signing_digest)
+static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, struct CHKSUM *chksum)
 {
    BSOCK *sd = jcr->store_bsock;
    uint64_t fileAddr = 0;             /* file address */
    char *rbuf, *wbuf;
    int rsize = jcr->buf_size;      /* read buffer size */
    POOLMEM *msgsave;
-   CIPHER_CONTEXT *cipher_ctx = NULL; /* Quell bogus uninitialized warnings */
-   const void *cipher_input;
-   size_t cipher_input_len;
-   size_t cipher_block_size;
-   size_t encrypted_len;
 #ifdef FD_NO_SEND_TEST
    return 1;
 #endif
@@ -567,11 +385,11 @@ int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *sign
    msgsave = sd->msg;
    rbuf = sd->msg;                    /* read buffer */
    wbuf = sd->msg;                    /* write buffer */
-   cipher_input = rbuf;               /* encrypt uncompressed data */
 
 
    Dmsg1(300, "Saving data, type=%d\n", ff_pkt->type);
 
+
 #ifdef HAVE_LIBZ
    uLong compress_len, max_compress_len = 0;
    const Bytef *cbuf = NULL;
@@ -585,30 +403,9 @@ int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *sign
          max_compress_len = jcr->compress_buf_size; /* set max length */
       }
       wbuf = jcr->compress_buf;    /* compressed output here */
-      cipher_input = jcr->compress_buf; /* encrypt compressed data */
    }
 #endif
 
-   if (ff_pkt->flags & FO_ENCRYPT) {
-      /* Allocate the cipher context */
-      if ((cipher_ctx = crypto_cipher_new(jcr->pki_session, true, &cipher_block_size)) == NULL) {
-         /* Shouldn't happen! */
-         Jmsg0(jcr, M_FATAL, 0, _("Failed to initialize encryption context\n"));
-         goto err;
-      }
-
-      /*
-       * Grow the crypto buffer, if necessary.
-       * crypto_cipher_update() will buffer up to (cipher_block_size - 1).
-       * We grow crypto_buf to the maximum number of blocks that
-       * could be returned for the given read buffer size.
-       * (Using the larger of either rsize or max_compress_len)
-       */
-      jcr->crypto_buf = check_pool_memory_size(jcr->crypto_buf, (MAX((size_t) rsize, max_compress_len) + cipher_block_size - 1) / cipher_block_size * cipher_block_size);
-
-      wbuf = jcr->crypto_buf; /* Encrypted, possibly compressed output here. */
-   }
-
    /*
     * Send Data header to Storage daemon
     *    <file-index> <stream> <info>
@@ -616,7 +413,7 @@ int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *sign
    if (!bnet_fsend(sd, "%ld %d 0", jcr->JobFiles, stream)) {
       Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
             bnet_strerror(sd));
-      goto err;
+      return 0;
    }
    Dmsg1(300, ">stored: datahdr %s\n", sd->msg);
 
@@ -665,18 +462,8 @@ int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *sign
       jcr->ReadBytes += sd->msglen;         /* count bytes read */
       fileAddr += sd->msglen;
 
-      /* Uncompressed cipher input length */
-      cipher_input_len = sd->msglen;
-
       /* Update checksum if requested */
-      if (digest) {
-         crypto_digest_update(digest, rbuf, sd->msglen);
-      }
-
-      /* Update signing digest if requested */
-      if (signing_digest) {
-         crypto_digest_update(signing_digest, rbuf, sd->msglen);
-      }
+      chksum_update(chksum, (unsigned char *)rbuf, sd->msglen);
 
 #ifdef HAVE_LIBZ
       /* Do compression if turned on */
@@ -690,34 +477,18 @@ int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *sign
                (const Bytef *)rbuf, (uLong)sd->msglen,
                ff_pkt->GZIP_level)) != Z_OK) {
             Jmsg(jcr, M_FATAL, 0, _("Compression error: %d\n"), zstat);
+            sd->msg = msgsave;
+            sd->msglen = 0;
             set_jcr_job_status(jcr, JS_ErrorTerminated);
-            goto err;
+            return 0;
          }
          Dmsg2(400, "compressed len=%d uncompressed len=%d\n",
             compress_len, sd->msglen);
 
          sd->msglen = compress_len;      /* set compressed length */
-         cipher_input_len = compress_len;
       }
 #endif
 
-      if (ff_pkt->flags & FO_ENCRYPT) {
-         /* Encrypt the input block */
-         if (crypto_cipher_update(cipher_ctx, cipher_input, cipher_input_len, jcr->crypto_buf, &encrypted_len)) {
-            if (encrypted_len == 0) {
-               /* No full block of data available, read more data */
-               continue;
-            }
-            Dmsg2(400, "encrypted len=%d unencrypted len=%d\n",
-               encrypted_len, sd->msglen);
-            sd->msglen = encrypted_len; /* set encrypted length */
-         } else {
-            /* Encryption failed. Shouldn't happen. */
-            Jmsg(jcr, M_FATAL, 0, _("Encryption error\n"));
-            goto err;
-         }
-      }
-
       /* Send the buffer to the Storage daemon */
       if (!sparseBlock) {
          if (ff_pkt->flags & FO_SPARSE) {
@@ -727,42 +498,18 @@ int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *sign
          if (!bnet_send(sd)) {
             Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
                   bnet_strerror(sd));
-            goto err;
+            sd->msg = msgsave;     /* restore bnet buffer */
+            sd->msglen = 0;
+            return 0;
          }
       }
       Dmsg1(130, "Send data to SD len=%d\n", sd->msglen);
       /*          #endif */
-      jcr->JobBytes += sd->msglen;      /* count bytes saved possibly compressed/encrypted */
+      jcr->JobBytes += sd->msglen;      /* count bytes saved possibly compressed */
       sd->msg = msgsave;                /* restore read buffer */
 
    } /* end while read file data */
 
-   /* Send any remaining encrypted data + padding */
-   if (ff_pkt->flags & FO_ENCRYPT) {
-      if (!crypto_cipher_finalize(cipher_ctx, jcr->crypto_buf, &encrypted_len)) {
-         /* Padding failed. Shouldn't happen. */
-         Jmsg(jcr, M_FATAL, 0, _("Encryption padding error\n"));
-         goto err;
-      }
-
-      if (encrypted_len > 0) {
-         sd->msglen = encrypted_len; /* set encrypted length */
-
-         /* Send remaining encrypted data to the SD */
-         if (ff_pkt->flags & FO_SPARSE) {
-            sd->msglen += SPARSE_FADDR_SIZE; /* include fileAddr in size */
-         }
-         sd->msg = wbuf;              /* set correct write buffer */
-         if (!bnet_send(sd)) {
-            Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
-                  bnet_strerror(sd));
-            goto err;
-         }
-         Dmsg1(130, "Send data to SD len=%d\n", sd->msglen);
-         jcr->JobBytes += sd->msglen;      /* count bytes saved possibly compressed/encrypted */
-         sd->msg = msgsave;                /* restore bnet buffer */
-      }
-   }
 
    if (sd->msglen < 0) {
       berrno be;
@@ -777,23 +524,10 @@ int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *sign
    if (!bnet_sig(sd, BNET_EOD)) {        /* indicate end of file data */
       Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
             bnet_strerror(sd));
-      goto err;
-   }
-
-   /* Free the cipher context */
-   if (cipher_ctx) {
-      crypto_cipher_free(cipher_ctx);
+      return 0;
    }
 
    return 1;
-
-err:
-   if (cipher_ctx) {
-      crypto_cipher_free(cipher_ctx);
-   }
-   sd->msg = msgsave; /* restore bnet buffer */
-   sd->msglen = 0;
-   return 0;
 }
 
 /*
@@ -863,11 +597,7 @@ static bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_strea
 #endif
 
    /* Find what data stream we will use, then encode the attributes */
-   if ((data_stream = select_data_stream(ff_pkt)) == STREAM_NONE) {
-      /* This should not happen */
-      Jmsg0(jcr, M_FATAL, 0, _("Invalid file flags, no supported data stream type.\n"));
-      return false;
-   }
+   data_stream = select_data_stream(ff_pkt);
    encode_stat(attribs, ff_pkt, data_stream);
 
    /* Now possibly extend the attributes */
@@ -875,11 +605,11 @@ static bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_strea
 
    Dmsg3(300, "File %s\nattribs=%s\nattribsEx=%s\n", ff_pkt->fname, attribs, attribsEx);
 
-   P(jcr->mutex);
+   jcr->lock();
    jcr->JobFiles++;                    /* increment number of files sent */
    ff_pkt->FileIndex = jcr->JobFiles;  /* return FileIndex */
    pm_strcpy(jcr->last_fname, ff_pkt->fname);
-   V(jcr->mutex);
+   jcr->unlock();
 
    /*
     * Send Attributes header to Storage daemon
index dd71f4c66058bde7aee9779e634abec9a4fcf3a3..1ca546d4bb5e68b51f2fd26a6ef195c963129df6 100644 (file)
@@ -39,5 +39,5 @@ FileDaemon {                          # this is me
 # Send all messages except skipped files back to Director
 Messages {
   Name = Standard
-  director = @hostname@-dir = all, !skipped
+  director = @hostname@-dir = all, !skipped, !restored
 }
diff --git a/bacula/src/filed/chksum.c b/bacula/src/filed/chksum.c
new file mode 100644 (file)
index 0000000..721d760
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * General routines for handling the various checksum supported.
+ *
+ *  Written by Preben 'Peppe' Guldberg, December MMIV
+ */
+/*
+   Copyright (C) 2004-2005 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 "filed.h"
+
+/* return 0 on success, otherwise some handler specific error code. */
+int chksum_init(CHKSUM *chksum, int flags)
+{
+   int status = 0;
+
+   chksum->type = CHKSUM_NONE;
+   bstrncpy(chksum->name, "NONE", sizeof(chksum->name));
+   chksum->updated = false;
+   if (flags & CHKSUM_MD5) {
+      chksum->length = 16;
+      MD5Init(&chksum->context.md5);
+      chksum->type = CHKSUM_MD5;
+      bstrncpy(chksum->name, "MD5", sizeof(chksum->name));
+   } else if (flags & CHKSUM_SHA1) {
+      chksum->length = 20;
+      status = SHA1Init(&chksum->context.sha1);
+      if (status == 0) {
+         chksum->type = CHKSUM_SHA1;
+         bstrncpy(chksum->name, "SHA1", sizeof(chksum->name));
+      }
+   }
+   return status;
+}
+
+/* return 0 on success, otherwise some handler specific error code. */
+int chksum_update(CHKSUM *chksum, void *buf, unsigned len)
+{
+   int status;
+   switch (chksum->type) {
+   case CHKSUM_NONE:
+      return 0;
+   case CHKSUM_MD5:
+      MD5Update(&chksum->context.md5, (unsigned char *)buf, len);
+      chksum->updated = true;
+      return 0;
+   case CHKSUM_SHA1:
+      status = SHA1Update(&chksum->context.sha1, (uint8_t *)buf, len);
+      if (status == 0) {
+         chksum->updated = true;
+      }
+      return status;
+   default:
+      return -1;
+   }
+}
+
+/* return 0 on success, otherwise some handler specific error code. */
+int chksum_final(CHKSUM *chksum)
+{
+   switch (chksum->type) {
+   case CHKSUM_NONE:
+      return 0;
+   case CHKSUM_MD5:
+      MD5Final(chksum->signature, &chksum->context.md5);
+      return 0;
+   case CHKSUM_SHA1:
+      return SHA1Final(&chksum->context.sha1, chksum->signature);
+   default:
+      return -1;
+   }
+}
diff --git a/bacula/src/filed/chksum.h b/bacula/src/filed/chksum.h
new file mode 100644 (file)
index 0000000..7be2633
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * General routines for handling the various checksum supported.
+ */
+/*
+   Copyright (C) 2000-2005 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.
+
+ */
+
+#ifndef _CHKSUM_H_
+#define _CHKSUM_H_
+
+#include "bacula.h"
+
+/*
+ * Link these to findlib options. Doing so allows for simpler handling of
+ * signatures in the callers.
+ * If multiple signatures are specified, the order in chksum_init() matters.
+ * Still, spell out our own names in case we want to change the approach.
+ */
+#define CHKSUM_NONE     0
+#define CHKSUM_MD5      FO_MD5
+#define CHKSUM_SHA1     FO_SHA1
+
+union chksumContext {
+   MD5Context  md5;
+   SHA1Context sha1;
+};
+
+struct CHKSUM {
+   int            type;                /* One of CHKSUM_* above */
+   char           name[5];             /* Big enough for NONE, MD5, SHA1, etc. */
+   bool           updated;             /* True if updated by chksum_update() */
+   chksumContext  context;             /* Context for the algorithm at hand */
+   int            length;              /* Length of signature */
+   unsigned char  signature[30];       /* Large enough for either signature */
+};
+
+int chksum_init(CHKSUM *chksum, int flags);
+int chksum_update(CHKSUM *chksum, void *buf, unsigned len);
+int chksum_final(CHKSUM *chksum);
+
+#endif
index f274444fe6ed7bd1405d0115eb6e6e1ec772fef3..f399706146e7b80866ceab38f44f8d75991d1089 100644 (file)
@@ -179,8 +179,8 @@ int main (int argc, char *argv[])
 
    parse_config(configfile);
 
-   if (init_crypto() != 0) {
-      Emsg0(M_ERROR, 0, _("Cryptography library initialization failed.\n"));
+   if (init_tls() != 0) {
+      Emsg0(M_ERROR, 0, _("TLS library initialization failed.\n"));
       terminate_filed(1);
    }
 
@@ -260,7 +260,7 @@ void terminate_filed(int sig)
    free_config_resources();
    term_msg();
    stop_watchdog();
-   cleanup_crypto();
+   cleanup_tls();
    close_memory_pool();               /* release free memory in pool */
    sm_dump(false);                    /* dump orphaned buffers */
    exit(sig);
@@ -328,128 +328,6 @@ static int check_resources()
             OK = false;
          }
       }
-
-      if (me->pki_encrypt || me->pki_sign) {
-#ifndef HAVE_CRYPTO
-         Jmsg(NULL, M_FATAL, 0, _("PKI encryption/signing enabled but not compiled into Bacula.\n"));
-         OK = false;
-#endif
-      }
-
-      /* pki_encrypt implies pki_sign */
-      if (me->pki_encrypt) {
-         me->pki_sign = true;
-      }
-
-      if ((me->pki_encrypt || me->pki_sign) && !me->pki_keypair_file) {
-         Emsg2(M_FATAL, 0, _("\"PKI Key Pair\" must be defined for File"
-            " daemon \"%s\" in %s if either \"PKI Sign\" or"
-            " \"PKI Encrypt\" are enabled.\n"), me->hdr.name, configfile);
-         OK = false;
-      }
-
-      /* If everything is well, attempt to initialize our public/private keys */
-      if (OK && (me->pki_encrypt || me->pki_sign)) {
-         char *filepath;
-         /* Load our keypair */
-         me->pki_keypair = crypto_keypair_new();
-         if (!me->pki_keypair) {
-            Emsg0(M_FATAL, 0, _("Failed to allocate a new keypair object.\n"));
-            OK = false;
-         } else {
-            if (!crypto_keypair_load_cert(me->pki_keypair, me->pki_keypair_file)) {
-               Emsg2(M_FATAL, 0, _("Failed to load public certificate for File"
-                     " daemon \"%s\" in %s.\n"), me->hdr.name, configfile);
-               OK = false;
-            }
-
-            if (!crypto_keypair_load_key(me->pki_keypair, me->pki_keypair_file, NULL, NULL)) {
-               Emsg2(M_FATAL, 0, _("Failed to load private key for File"
-                     " daemon \"%s\" in %s.\n"), me->hdr.name, configfile);
-               OK = false;
-            }
-         }
-
-         /*
-          * Trusted Signers. We're always trusted.
-          */
-         me->pki_signers = New(alist(10, not_owned_by_alist));
-         if (me->pki_keypair) {
-            me->pki_signers->append(crypto_keypair_dup(me->pki_keypair));
-         }
-
-         /* If additional signing public keys have been specified, load them up */
-         if (me->pki_signing_key_files) {
-            foreach_alist(filepath, me->pki_signing_key_files) {
-               X509_KEYPAIR *keypair;
-
-               keypair = crypto_keypair_new();
-               if (!keypair) {
-                  Emsg0(M_FATAL, 0, _("Failed to allocate a new keypair object.\n"));
-                  OK = false;
-               } else {
-                  if (crypto_keypair_load_cert(keypair, filepath)) {
-                     me->pki_signers->append(keypair);
-
-                     /* Attempt to load a private key, if available */
-                     if (crypto_keypair_has_key(filepath)) {
-                        if (!crypto_keypair_load_key(keypair, filepath, NULL, NULL)) {
-                           Emsg3(M_FATAL, 0, _("Failed to load private key from file %s for File"
-                              " daemon \"%s\" in %s.\n"), filepath, me->hdr.name, configfile);
-                           OK = false;
-                        }
-                     }
-
-                  } else {
-                     Emsg3(M_FATAL, 0, _("Failed to load trusted signer certificate"
-                        " from file %s for File daemon \"%s\" in %s.\n"), filepath, me->hdr.name, configfile);
-                     OK = false;
-                  }
-               }
-            }
-         }
-
-         /*
-          * Crypto recipients. We're always included as a recipient.
-          * The symmetric session key will be encrypted for each of these readers.
-          */
-         me->pki_recipients = New(alist(10, not_owned_by_alist));
-         if (me->pki_keypair) {
-            me->pki_recipients->append(crypto_keypair_dup(me->pki_keypair));
-         }
-
-
-         /* If additional keys have been specified, load them up */
-         if (me->pki_master_key_files) {
-            foreach_alist(filepath, me->pki_master_key_files) {
-               X509_KEYPAIR *keypair;
-
-               keypair = crypto_keypair_new();
-               if (!keypair) {
-                  Emsg0(M_FATAL, 0, _("Failed to allocate a new keypair object.\n"));
-                  OK = false;
-               } else {
-                  if (crypto_keypair_load_cert(keypair, filepath)) {
-                     me->pki_recipients->append(keypair);
-
-                     /* Attempt to load a private key, if available */
-                     if (crypto_keypair_has_key(filepath)) {
-                        if (!crypto_keypair_load_key(keypair, filepath, NULL, NULL)) {
-                           Emsg3(M_FATAL, 0, _("Failed to load private key from file %s for File"
-                              " daemon \"%s\" in %s.\n"), filepath, me->hdr.name, configfile);
-                           OK = false;
-                        }
-                     }
-
-                  } else {
-                     Emsg3(M_FATAL, 0, _("Failed to load master key certificate"
-                        " from file %s for File daemon \"%s\" in %s.\n"), filepath, me->hdr.name, configfile);
-                     OK = false;
-                  }
-               }
-            }
-         }
-      }
    }
 
 
index 43a8e3fa92f526394aea6ae4cafc58761b3cde13..4137317ee9b07edcd61e9bd983b46d5ecb017cf3 100644 (file)
@@ -27,6 +27,7 @@
 
 #define FILE_DAEMON 1
 #include "filed_conf.h"
+#include "chksum.h"
 #include "findlib/find.h"
 #include "jcr.h"
 #include "acl.h"
index f01b862d24110633a2290b3d59f7aa2df1b650d6..1739ce7484c08862b2bb17803cfd90bd06ebdfcd 100644 (file)
@@ -89,17 +89,12 @@ static RES_ITEM cli_items[] = {
    {"heartbeatinterval", store_time, ITEM(res_client.heartbeat_interval), 0, ITEM_DEFAULT, 0},
    {"sdconnecttimeout", store_time,ITEM(res_client.SDConnectTimeout), 0, ITEM_DEFAULT, 60 * 30},
    {"maximumnetworkbuffersize", store_pint, ITEM(res_client.max_network_buffer_size), 0, 0, 0},
-   {"pkisignatures",         store_bit,     ITEM(res_client.pki_sign), 1, ITEM_DEFAULT, 0},
-   {"pkiencryption",         store_bit,     ITEM(res_client.pki_encrypt), 1, ITEM_DEFAULT, 0},
-   {"pkikeypair",            store_dir,       ITEM(res_client.pki_keypair_file), 0, 0, 0},
-   {"pkisigner",             store_alist_str, ITEM(res_client.pki_signing_key_files), 0, 0, 0},
-   {"pkimasterkey",          store_alist_str, ITEM(res_client.pki_master_key_files), 0, 0, 0},
-   {"tlsenable",             store_bit,     ITEM(res_client.tls_enable),  1, 0, 0},
-   {"tlsrequire",            store_bit,     ITEM(res_client.tls_require), 1, 0, 0},
-   {"tlscacertificatefile",  store_dir,       ITEM(res_client.tls_ca_certfile), 0, 0, 0},
-   {"tlscacertificatedir",   store_dir,       ITEM(res_client.tls_ca_certdir), 0, 0, 0},
-   {"tlscertificate",        store_dir,       ITEM(res_client.tls_certfile), 0, 0, 0},
-   {"tlskey",                store_dir,       ITEM(res_client.tls_keyfile), 0, 0, 0},
+   {"tlsenable",            store_yesno,     ITEM(res_client.tls_enable), 1, 0, 0},
+   {"tlsrequire",           store_yesno,     ITEM(res_client.tls_require), 1, 0, 0},
+   {"tlscacertificatefile", store_dir,       ITEM(res_client.tls_ca_certfile), 0, 0, 0},
+   {"tlscacertificatedir",  store_dir,       ITEM(res_client.tls_ca_certdir), 0, 0, 0},
+   {"tlscertificate",       store_dir,       ITEM(res_client.tls_certfile), 0, 0, 0},
+   {"tlskey",               store_dir,       ITEM(res_client.tls_keyfile), 0, 0, 0},
    {NULL, NULL, NULL, 0, 0, 0}
 };
 
@@ -109,10 +104,10 @@ static RES_ITEM dir_items[] = {
    {"description", store_str,      ITEM(res_dir.hdr.desc),  0, 0, 0},
    {"password",    store_password, ITEM(res_dir.password),  0, ITEM_REQUIRED, 0},
    {"address",     store_str,      ITEM(res_dir.address),   0, 0, 0},
-   {"monitor",     store_bit,    ITEM(res_dir.monitor),   1, ITEM_DEFAULT, 0},
-   {"tlsenable",            store_bit,     ITEM(res_dir.tls_enable), 1, 0, 0},
-   {"tlsrequire",           store_bit,     ITEM(res_dir.tls_require), 1, 0, 0},
-   {"tlsverifypeer",        store_bit,     ITEM(res_dir.tls_verify_peer), 1, ITEM_DEFAULT, 1},
+   {"monitor",     store_yesno,    ITEM(res_dir.monitor),   1, ITEM_DEFAULT, 0},
+   {"tlsenable",            store_yesno,     ITEM(res_dir.tls_enable), 1, 0, 0},
+   {"tlsrequire",           store_yesno,     ITEM(res_dir.tls_require), 1, 0, 0},
+   {"tlsverifypeer",        store_yesno,     ITEM(res_dir.tls_verify_peer), 1, ITEM_DEFAULT, 1},
    {"tlscacertificatefile", store_dir,       ITEM(res_dir.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir",  store_dir,       ITEM(res_dir.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate",       store_dir,       ITEM(res_dir.tls_certfile), 0, 0, 0},
@@ -245,37 +240,6 @@ void free_resource(RES *sres, int type)
       if (res->res_client.FDaddrs) {
          free_addresses(res->res_client.FDaddrs);
       }
-
-      if (res->res_client.pki_keypair_file) { 
-         free(res->res_client.pki_keypair_file);
-      }
-      if (res->res_client.pki_keypair) {
-         crypto_keypair_free(res->res_client.pki_keypair);
-      }
-
-      if (res->res_client.pki_signing_key_files) {
-         delete res->res_client.pki_signing_key_files;
-      }
-      if (res->res_client.pki_signers) {
-         X509_KEYPAIR *keypair;
-         foreach_alist(keypair, res->res_client.pki_signers) {
-            crypto_keypair_free(keypair);
-         }
-         delete res->res_client.pki_signers;
-      }
-
-      if (res->res_client.pki_master_key_files) {
-         delete res->res_client.pki_master_key_files;
-      }
-
-      if (res->res_client.pki_recipients) {
-         X509_KEYPAIR *keypair;
-         foreach_alist(keypair, res->res_client.pki_recipients) {
-            crypto_keypair_free(keypair);
-         }
-         delete res->res_client.pki_recipients;
-      }
-
       if (res->res_client.tls_ctx) { 
          free_tls_context(res->res_client.tls_ctx);
       }
@@ -357,12 +321,6 @@ void save_resource(int type, RES_ITEM *items, int pass)
             if ((res = (URES *)GetResWithName(R_CLIENT, res_all.res_dir.hdr.name)) == NULL) {
                Emsg1(M_ABORT, 0, _("Cannot find Client resource %s\n"), res_all.res_dir.hdr.name);
             }
-            res->res_client.pki_signing_key_files = res_all.res_client.pki_signing_key_files;
-            res->res_client.pki_master_key_files = res_all.res_client.pki_master_key_files;
-
-            res->res_client.pki_signers = res_all.res_client.pki_signers;
-            res->res_client.pki_recipients = res_all.res_client.pki_recipients;
-
             res->res_client.messages = res_all.res_client.messages;
             break;
          default:
index e8ea53b27ba342c525493387f9db008a11c21bfd..8594228f94da9a84eab26b96b71bd8c97f93f1c0 100644 (file)
@@ -71,11 +71,6 @@ struct CLIENT {
    utime_t heartbeat_interval;        /* Interval to send heartbeats to Dir */
    utime_t SDConnectTimeout;          /* timeout in seconds */
    uint32_t max_network_buffer_size;  /* max network buf size */
-   int pki_sign;                      /* Enable Data Integrity Verification via Digital Signatures */
-   int pki_encrypt;                   /* Enable Data Encryption */
-   char *pki_keypair_file;            /* PKI Key Pair File */
-   alist *pki_signing_key_files;      /* PKI Signing Key Files */
-   alist *pki_master_key_files;       /* PKI Master Key Files */
    int tls_enable;                    /* Enable TLS */
    int tls_require;                   /* Require TLS */
    char *tls_ca_certfile;             /* TLS CA Certificate File */
@@ -83,9 +78,6 @@ struct CLIENT {
    char *tls_certfile;                /* TLS Client Certificate File */
    char *tls_keyfile;                 /* TLS Client Key File */
 
-   X509_KEYPAIR *pki_keypair;         /* Shared PKI Public/Private Keypair */
-   alist *pki_signers;                /* Shared PKI Trusted Signers */
-   alist *pki_recipients;             /* Shared PKI Recipients */
    TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
 };
 
index 56e43efcbf591481be79782ba591c9e844188fb9..b604168008a7e29c66662f38c082a4ef9849a9d5 100644 (file)
@@ -25,6 +25,7 @@
 #include "filed.h"
 #ifdef WIN32_VSS
 #include "vss.h"   
+static pthread_mutex_t vss_mutex = PTHREAD_MUTEX_INITIALIZER;
 #endif
 
 extern char my_name[];
@@ -173,11 +174,6 @@ void *handle_client_request(void *dirp)
    jcr->last_fname[0] = 0;
    jcr->client_name = get_memory(strlen(my_name) + 1);
    pm_strcpy(jcr->client_name, my_name);
-   jcr->pki_sign = me->pki_sign;
-   jcr->pki_encrypt = me->pki_encrypt;
-   jcr->pki_keypair = me->pki_keypair;
-   jcr->pki_signers = me->pki_signers;
-   jcr->pki_recipients = me->pki_recipients;
    dir->jcr = jcr;
    enable_backup_privileges(NULL, 1 /* ignore_errors */);
 
@@ -328,16 +324,9 @@ static int cancel_cmd(JCR *jcr)
          bnet_fsend(dir, _("2901 Job %s not found.\n"), Job);
       } else {
          if (cjcr->store_bsock) {
-            P(cjcr->mutex);
             cjcr->store_bsock->timed_out = 1;
             cjcr->store_bsock->terminated = 1;
-/*
- * #if !defined(HAVE_CYGWIN) && !defined(HAVE_WIN32)
- */
-#if !defined(HAVE_CYGWIN)
             pthread_kill(cjcr->my_thread_id, TIMEOUT_SIGNAL);
-#endif
-            V(cjcr->mutex);
          }
          set_jcr_job_status(cjcr, JS_Canceled);
          free_jcr(cjcr);
@@ -870,32 +859,7 @@ static void set_options(findFOPTS *fo, const char *opts)
          fo->flags |= FO_READFIFO;
          break;
       case 'S':
-        switch(*(p + 1)) {
-         case ' ':
-            /* Old director did not specify SHA variant */
-            fo->flags |= FO_SHA1;
-            break;
-        case '1':
-           fo->flags |= FO_SHA1;
-            p++;
-           break;
-#ifdef HAVE_SHA2
-        case '2':
-           fo->flags |= FO_SHA256;
-            p++;
-           break;
-        case '3':
-           fo->flags |= FO_SHA512;
-            p++;
-           break;
-#endif
-        default:
-           /* Automatically downgrade to SHA-1 if an unsupported
-            * SHA variant is specified */
-           fo->flags |= FO_SHA1;
-            p++;
-           break;
-        }
+         fo->flags |= FO_SHA1;
          break;
       case 's':
          fo->flags |= FO_SPARSE;
@@ -1059,6 +1023,7 @@ static int level_cmd(JCR *jcr)
          goto bail_out;
       }
       since_time = str_to_uint64(buf);  /* this is the since time */
+      Dmsg1(100, "since_time=%d\n", (int)since_time);
       char ed1[50], ed2[50];
       /*
        * Sync clocks by polling him for the time. We take
@@ -1078,8 +1043,10 @@ static int level_cmd(JCR *jcr)
          }
          his_time = str_to_uint64(buf);
          rt = get_current_btime() - bt_start; /* compute round trip time */
-         bt_adj -= his_time - bt_start - rt/2;
-         Dmsg2(200, "rt=%s adj=%s\n", edit_uint64(rt, ed1), edit_uint64(bt_adj, ed2));
+         Dmsg2(100, "Dirtime=%s FDtime=%s\n", edit_uint64(his_time, ed1),
+               edit_uint64(bt_start, ed2));
+         bt_adj +=  bt_start - his_time - rt/2;
+         Dmsg2(100, "rt=%s adj=%s\n", edit_uint64(rt, ed1), edit_uint64(bt_adj, ed2));
       }
 
       bt_adj = bt_adj / 8;            /* compute average time */
@@ -1191,6 +1158,18 @@ static int backup_cmd(JCR *jcr)
    int SDJobStatus;
    char ed1[50], ed2[50];
 
+#ifdef WIN32_VSS
+   // capture state here, if client is backed up by multiple directors
+   // and one enables vss and the other does not then enable_vss can change
+   // between here and where its evaluated after the job completes.
+   bool bDoVSS = false;
+
+   bDoVSS = g_pVSSClient && enable_vss;
+   if (bDoVSS)
+      /* Run only one at a time */
+      P(vss_mutex);
+#endif
+
    set_jcr_job_status(jcr, JS_Blocked);
    jcr->JobType = JT_BACKUP;
    Dmsg1(100, "begin backup ff=%p\n", jcr->ff);
@@ -1241,39 +1220,38 @@ static int backup_cmd(JCR *jcr)
 
 #ifdef WIN32_VSS
    /* START VSS ON WIN 32 */
-   if (g_pVSSClient && enable_vss) {
-      if (g_pVSSClient->InitializeForBackup()) {
-         /* tell vss which drives to snapshot */   
-         char szWinDriveLetters[27];   
-         if (get_win32_driveletters(jcr->ff, szWinDriveLetters)) {
+   if (bDoVSS) {      
+      if (g_pVSSClient->InitializeForBackup()) {   
+        /* tell vss which drives to snapshot */   
+        char szWinDriveLetters[27];   
+        if (get_win32_driveletters(jcr->ff, szWinDriveLetters)) {
             Jmsg(jcr, M_INFO, 0, _("Generate VSS snapshots. Driver=\"%s\", Drive(s)=\"%s\"\n"), g_pVSSClient->GetDriverName(), szWinDriveLetters);
-            if (!g_pVSSClient->CreateSnapshots(szWinDriveLetters)) {
-               berrno be;
-               Jmsg(jcr, M_WARNING, 0, _("Generate VSS snapshots failed. ERR=%s\n"),
-                  be.strerror());
+            if (!g_pVSSClient->CreateSnapshots(szWinDriveLetters)) {               
+               Jmsg(jcr, M_WARNING, 0, _("Generate VSS snapshots failed.\n"));
+               jcr->Errors++;
             } else {
                /* tell user if snapshot creation of a specific drive failed */
                size_t i;
                for (i=0; i<strlen (szWinDriveLetters); i++) {
                   if (islower(szWinDriveLetters[i])) {
                      Jmsg(jcr, M_WARNING, 0, _("Generate VSS snapshot of drive \"%c:\\\" failed\n"), szWinDriveLetters[i]);
+                     jcr->Errors++;
                   }
                }
                /* inform user about writer states */
-               for (i=0; i<g_pVSSClient->GetWriterCount(); i++) {
-                  int msg_type = M_INFO;
-                  if (g_pVSSClient->GetWriterState(i) < 0) {
-                     msg_type = M_WARNING;
-                  }
-                  Jmsg(jcr, msg_type, 0, _("VSS Writer: %s\n"), g_pVSSClient->GetWriterInfo(i));
-               }
+               for (i=0; i<g_pVSSClient->GetWriterCount(); i++)                
+                  if (g_pVSSClient->GetWriterState(i) < 1) {
+                     Jmsg(jcr, M_WARNING, 0, _("VSS Writer (PrepareForBackup): %s\n"), g_pVSSClient->GetWriterInfo(i));                    
+                     jcr->Errors++;
+                  }                            
             }
-         } else {
+        } else {
             Jmsg(jcr, M_INFO, 0, _("No drive letters found for generating VSS snapshots.\n"));
-         }
+        }
       } else {
-         Jmsg(jcr, M_WARNING, 0, _("VSS was not initialized properly. VSS support is disabled.\n"));
-      }
+         berrno be;
+         Jmsg(jcr, M_WARNING, 0, _("VSS was not initialized properly. VSS support is disabled. ERR=%s\n"), be.strerror());
+      } 
    }
 #endif
 
@@ -1334,8 +1312,20 @@ cleanup:
 #ifdef WIN32_VSS
    /* STOP VSS ON WIN 32 */
    /* tell vss to close the backup session */
-   if (g_pVSSClient && enable_vss == 1)
-      g_pVSSClient->CloseBackup();
+   if (bDoVSS) {
+      if (g_pVSSClient->CloseBackup()) {             
+         /* inform user about writer states */
+         for (size_t i=0; i<g_pVSSClient->GetWriterCount(); i++) {
+            int msg_type = M_INFO;
+            if (g_pVSSClient->GetWriterState(i) < 1) {
+               msg_type = M_WARNING;
+               jcr->Errors++;
+            }
+            Jmsg(jcr, msg_type, 0, _("VSS Writer (BackupComplete): %s\n"), g_pVSSClient->GetWriterInfo(i));
+         }
+      }
+      V(vss_mutex);
+   }
 #endif
 
    bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles,
@@ -1538,7 +1528,7 @@ static int open_sd_read_session(JCR *jcr)
    /*
     * Open Read Session with Storage daemon
     */
-   bnet_fsend(sd, read_open, "DummyVolume",
+   bnet_fsend(sd, read_open, jcr->VolumeName,
       jcr->VolSessionId, jcr->VolSessionTime, jcr->StartFile, jcr->EndFile,
       jcr->StartBlock, jcr->EndBlock);
    Dmsg1(110, ">stored: %s", sd->msg);
index 92d0a3c83cb7b970d67e2f76adf42aa0bea98621..952f56ff117d6370ed28161fe62dfc001e446f01 100644 (file)
  */
 
 extern bool blast_data_to_storage_daemon(JCR *jcr, char *addr);
+extern void do_verify(JCR *jcr);
 extern void do_verify_volume(JCR *jcr);
 extern void do_restore(JCR *jcr);
 extern int authenticate_director(JCR *jcr);
 extern int authenticate_storagedaemon(JCR *jcr);
 extern int make_estimate(JCR *jcr);
 
-/* From verify.c */
-int digest_file(JCR *jcr, FF_PKT *ff_pkt, DIGEST *digest);
-void do_verify(JCR *jcr);
-
 /* From heartbeat.c */
 void start_heartbeat_monitor(JCR *jcr);
 void stop_heartbeat_monitor(JCR *jcr);
index 4ba9c9c5ad75310c1beb8ffe560f749d1c4bfc38..0198eeaced92b199ab82acfc69e643207728eeb1 100644 (file)
@@ -7,24 +7,18 @@
  *   Version $Id$
  *
  */
-
 /*
-   Copyright (C) 2005 Kern Sibbald
+   Copyright (C) 2005-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 as
-   published by the Free Software Foundation; either version 2 of
-   the License, or (at your option) any later version.
+   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 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.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
+   the file LICENSE for additional details.
 
  */
 
@@ -70,20 +64,20 @@ struct s_vars {
 
 /* Read-only variables */
 static struct s_vars getvars[] = {
-   { N_("FDName"),     "s"},          /* 0 */
-   { N_("Level"),      "s"},          /* 1 */
-   { N_("Type"),       "s"},          /* 2 */
-   { N_("JobId"),      "i"},          /* 3 */
-   { N_("Client"),     "s"},          /* 4 */
-   { N_("JobName"),    "s"},          /* 5 */
-   { N_("JobStatus"),  "s"},          /* 6 */
+   { NT_("FDName"),     "s"},          /* 0 */
+   { NT_("Level"),      "s"},          /* 1 */
+   { NT_("Type"),       "s"},          /* 2 */
+   { NT_("JobId"),      "i"},          /* 3 */
+   { NT_("Client"),     "s"},          /* 4 */
+   { NT_("JobName"),    "s"},          /* 5 */
+   { NT_("JobStatus"),  "s"},          /* 6 */
 
    { NULL,             NULL}
 };
 
 /* Writable variables */
 static struct s_vars setvars[] = {
-   { N_("JobReport"),   "s"},
+   { NT_("JobReport"),   "s"},
 
    { NULL,             NULL}
 };
@@ -247,7 +241,8 @@ int generate_job_event(JCR *jcr, const char *event)
       return 0;
    }
 
-   PyEval_AcquireLock();
+   lock_python();
+// PyEval_AcquireLock();
 
    method = find_method(events, method, event);
    if (!method) {
@@ -268,7 +263,8 @@ int generate_job_event(JCR *jcr, const char *event)
    Py_XDECREF(result);
 
 bail_out:
-   PyEval_ReleaseLock();
+   unlock_python();
+// PyEval_ReleaseLock();
    return stat;
 }
 
index 4aed75c9b6f41d4e278fc7b0ff0b962ad8e899eb..3b41655ff9aad645595ddad7a4fa6ac8e4f06704 100644 (file)
@@ -35,11 +35,8 @@ static char rec_header[] = "rechdr %ld %ld %ld %ld %ld";
 #ifdef HAVE_LIBZ
 static const char *zlib_strerror(int stat);
 #endif
-
-int verify_signature(JCR *jcr, SIGNATURE *sig);
 int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen,
-      uint64_t *addr, int flags, CIPHER_CONTEXT *cipher, size_t cipher_block_size);
-bool flush_cipher(JCR *jcr, BFILE *bfd, int flags, CIPHER_CONTEXT *cipher, size_t cipher_block_size);
+      uint64_t *addr, int flags);
 
 #define RETRY 10                      /* retry wait time */
 
@@ -83,11 +80,7 @@ void do_restore(JCR *jcr)
    BFILE altbfd;                      /* Alternative data stream */
    uint64_t alt_addr = 0;             /* Write address for alternative stream */
    intmax_t alt_size = 0;             /* Size of alternate stream */
-   SIGNATURE *sig = NULL;             /* Cryptographic signature (if any) for file */
-   CRYPTO_SESSION *cs = NULL;         /* Cryptographic session data (if any) for file */
-   CIPHER_CONTEXT *cipher_ctx = NULL; /* Cryptographic cipher context (if any) for file */
-   size_t cipher_block_size = 0;      /* Cryptographic algorithm block size for file */
-   int flags = 0;                     /* Options for extract_data() */
+   int flags;                         /* Options for extract_data() */
    int stat;
    ATTR *attr;
 
@@ -133,23 +126,17 @@ void do_restore(JCR *jcr)
    jcr->compress_buf_size = compress_buf_size;
 #endif
 
-#ifdef HAVE_CRYPTO
-   jcr->crypto_buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE);
-#endif
-   
    /*
     * Get a record from the Storage daemon. We are guaranteed to
     *   receive records in the following order:
     *   1. Stream record header
     *   2. Stream data
     *        a. Attributes (Unix or Win32)
-    *        b. Possibly stream encryption session data (e.g., symmetric session key)
-    *    or  c. File data for the file
-    *    or  d. Alternate data stream (e.g. Resource Fork)
-    *    or  e. Finder info
-    *    or  f. ACLs
-    *    or  g. Possibly a cryptographic signature
-    *    or  h. Possibly MD5 or SHA1 record
+    *    or  b. File data for the file
+    *    or  c. Alternate data stream (e.g. Resource Fork)
+    *    or  d. Finder info
+    *    or  e. ACLs
+    *    or  f. Possibly MD5 or SHA1 record
     *   3. Repeat step 1
     *
     * NOTE: We keep track of two bacula file descriptors:
@@ -207,39 +194,14 @@ void do_restore(JCR *jcr)
          Dmsg1(30, "Stream=Unix Attributes. extract=%d\n", extract);
          /*
           * If extracting, it was from previous stream, so
-          * close the output file and validate the signature.
+          * close the output file.
           */
          if (extract) {
             if (size > 0 && !is_bopen(&bfd)) {
                Jmsg0(jcr, M_ERROR, 0, _("Logic error: output file should be open\n"));
             }
-            /* Flush and deallocate previous stream's cipher context */
-            if (cipher_ctx && prev_stream != STREAM_ENCRYPTED_SESSION_DATA) {
-               flush_cipher(jcr, &bfd, flags, cipher_ctx, cipher_block_size);
-               crypto_cipher_free(cipher_ctx);
-               cipher_ctx = NULL;
-            }
             set_attributes(jcr, attr, &bfd);
             extract = false;
-
-            /* Verify the cryptographic signature, if any */
-            if (jcr->pki_sign) {
-               if (sig) {
-                  // Failure is reported in verify_signature() ...
-                  verify_signature(jcr, sig);
-               } else {
-                  Jmsg1(jcr, M_ERROR, 0, _("Missing cryptographic signature for %s\n"), jcr->last_fname);
-               }
-            }
-            /* Free Signature */
-            if (sig) {
-               crypto_sign_free(sig);
-               sig = NULL;
-            }
-            if (cs) {
-               crypto_session_free(cs);
-               cs = NULL;
-            }
             Dmsg0(30, "Stop extracting.\n");
          } else if (is_bopen(&bfd)) {
             Jmsg0(jcr, M_ERROR, 0, _("Logic error: output file should not be open\n"));
@@ -289,9 +251,9 @@ void do_restore(JCR *jcr)
             extract = true;
             /* FALLTHROUGH */
          case CF_CREATED:        /* File created, but there is no content */
-            P(jcr->mutex);
+            jcr->lock();
             pm_strcpy(jcr->last_fname, attr->ofname);
-            V(jcr->mutex);
+            jcr->unlock();
             jcr->JobFiles++;
             fileAddr = 0;
             print_ls_output(jcr, attr);
@@ -311,85 +273,24 @@ void do_restore(JCR *jcr)
          break;
 
       /* Data stream */
-      case STREAM_ENCRYPTED_SESSION_DATA:
-         crypto_error_t cryptoerr;
-
-         Dmsg1(30, "Stream=Encrypted Session Data, size: %d\n", sd->msglen);
-
-         /* Decode and save session keys. */
-         cryptoerr = crypto_session_decode(sd->msg, (size_t) sd->msglen, jcr->pki_recipients, &cs);
-         switch(cryptoerr) {
-         case CRYPTO_ERROR_NONE:
-            /* Success */
-            break;
-         case CRYPTO_ERROR_NORECIPIENT:
-            Jmsg(jcr, M_ERROR, 0, _("Missing private key required to decrypt encrypted backup data."));
-            break;
-         case CRYPTO_ERROR_DECRYPTION:
-            Jmsg(jcr, M_ERROR, 0, _("Decrypt of the session key failed."));
-            break;
-         default:
-            /* Shouldn't happen */
-            Jmsg1(jcr, M_ERROR, 0, _("An error occured while decoding encrypted session data stream: %s"), crypto_strerror(cryptoerr));
-            break;
-         }
-
-         if (cryptoerr != CRYPTO_ERROR_NONE) {
-            extract = false;
-            bclose(&bfd);
-            continue;
-         }
-
-         /* Set up a decryption context */
-         if ((cipher_ctx = crypto_cipher_new(cs, false, &cipher_block_size)) == NULL) {
-            Jmsg1(jcr, M_ERROR, 0, _("Failed to initialize decryption context for %s\n"), jcr->last_fname);
-            crypto_session_free(cs);
-            cs = NULL;
-            extract = false;
-            bclose(&bfd);
-            continue;
-         }
-         break;
-
       case STREAM_FILE_DATA:
       case STREAM_SPARSE_DATA:
       case STREAM_WIN32_DATA:
       case STREAM_GZIP_DATA:
       case STREAM_SPARSE_GZIP_DATA:
       case STREAM_WIN32_GZIP_DATA:
-      case STREAM_ENCRYPTED_FILE_DATA:
-      case STREAM_ENCRYPTED_WIN32_DATA:
-      case STREAM_ENCRYPTED_FILE_GZIP_DATA:
-      case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
          /* Force an expected, consistent stream type here */
          if (extract && (prev_stream == stream || prev_stream == STREAM_UNIX_ATTRIBUTES
-                  || prev_stream == STREAM_UNIX_ATTRIBUTES_EX
-                  || prev_stream == STREAM_ENCRYPTED_SESSION_DATA)) {
+                  || prev_stream == STREAM_UNIX_ATTRIBUTES_EX)) {
             flags = 0;
-
             if (stream == STREAM_SPARSE_DATA || stream == STREAM_SPARSE_GZIP_DATA) {
                flags |= FO_SPARSE;
             }
-
             if (stream == STREAM_GZIP_DATA || stream == STREAM_SPARSE_GZIP_DATA
-                  || stream == STREAM_WIN32_GZIP_DATA || stream == STREAM_ENCRYPTED_FILE_GZIP_DATA
-                  || stream == STREAM_ENCRYPTED_WIN32_GZIP_DATA) {
+                  || stream == STREAM_WIN32_GZIP_DATA) {
                flags |= FO_GZIP;
             }
-
-            if (stream == STREAM_ENCRYPTED_FILE_DATA
-                  || stream == STREAM_ENCRYPTED_FILE_GZIP_DATA
-                  || stream == STREAM_ENCRYPTED_WIN32_DATA
-                  || stream == STREAM_ENCRYPTED_WIN32_GZIP_DATA) {
-               flags |= FO_ENCRYPT;
-            }
-
-            if (is_win32_stream(stream) && !have_win32_api()) {
-               set_portable_backup(&bfd);
-               flags |= FO_WIN32DECOMP;    /* "decompose" BackupWrite data */
-            }
-
-            if (extract_data(jcr, &bfd, sd->msg, sd->msglen, &fileAddr, flags, cipher_ctx, cipher_block_size) < 0) {
+            if (extract_data(jcr, &bfd, sd->msg, sd->msglen, &fileAddr, flags) < 0) {
                extract = false;
                bclose(&bfd);
                continue;
@@ -399,8 +300,6 @@ void do_restore(JCR *jcr)
 
       /* Resource fork stream - only recorded after a file to be restored */
       /* Silently ignore if we cannot write - we already reported that */
-      case STREAM_ENCRYPTED_MACOS_FORK_DATA:
-         flags |= FO_ENCRYPT;
       case STREAM_MACOS_FORK_DATA:
 #ifdef HAVE_DARWIN_OS
          if (extract) {
@@ -414,7 +313,7 @@ void do_restore(JCR *jcr)
                Dmsg0(30, "Restoring resource fork\n");
             }
             flags = 0;
-            if (extract_data(jcr, &altbfd, sd->msg, sd->msglen, &alt_addr, flags, cipher_ctx, cipher_block_size) < 0) {
+            if (extract_data(jcr, &altbfd, sd->msg, sd->msglen, &alt_addr, flags) < 0) {
                extract = false;
                bclose(&altbfd);
                continue;
@@ -445,7 +344,7 @@ void do_restore(JCR *jcr)
          pm_strcpy(jcr->acl_text, sd->msg);
          Dmsg2(400, "Restoring ACL type 0x%2x <%s>\n", BACL_TYPE_ACCESS, jcr->acl_text);
          if (bacl_set(jcr, BACL_TYPE_ACCESS) != 0) {
-               Qmsg1(jcr, M_WARNING, 0, _("Can't restore ACL of %s\n"), jcr->last_fname);
+               Jmsg1(jcr, M_WARNING, 0, _("Can't restore ACL of %s\n"), jcr->last_fname);
          }
 #else 
          non_support_acl++;
@@ -457,24 +356,15 @@ void do_restore(JCR *jcr)
          pm_strcpy(jcr->acl_text, sd->msg);
          Dmsg2(400, "Restoring ACL type 0x%2x <%s>\n", BACL_TYPE_DEFAULT, jcr->acl_text);
          if (bacl_set(jcr, BACL_TYPE_DEFAULT) != 0) {
-               Qmsg1(jcr, M_WARNING, 0, _("Can't restore default ACL of %s\n"), jcr->last_fname);
+               Jmsg1(jcr, M_WARNING, 0, _("Can't restore default ACL of %s\n"), jcr->last_fname);
          }
 #else 
          non_support_acl++;
 #endif
          break;
 
-      case STREAM_SIGNED_DIGEST:
-         /* Save signature. */
-         if ((sig = crypto_sign_decode(sd->msg, (size_t) sd->msglen)) == NULL) {
-            Jmsg1(jcr, M_ERROR, 0, _("Failed to decode message signature for %s\n"), jcr->last_fname);
-         }
-         break;
-
-      case STREAM_MD5_DIGEST:
-      case STREAM_SHA1_DIGEST:
-      case STREAM_SHA256_DIGEST:
-      case STREAM_SHA512_DIGEST:
+      case STREAM_MD5_SIGNATURE:
+      case STREAM_SHA1_SIGNATURE:
          break;
 
       case STREAM_PROGRAM_NAMES:
@@ -492,24 +382,7 @@ void do_restore(JCR *jcr)
             if (size > 0 && !is_bopen(&bfd)) {
                Jmsg0(jcr, M_ERROR, 0, _("Logic error: output file should be open\n"));
             }
-            /* Flush and deallocate cipher context */
-            if (cipher_ctx) {
-               flush_cipher(jcr, &bfd, flags, cipher_ctx, cipher_block_size);
-               crypto_cipher_free(cipher_ctx);
-               cipher_ctx = NULL;
-            }
             set_attributes(jcr, attr, &bfd);
-
-            /* Verify the cryptographic signature if any */
-            if (jcr->pki_sign) {
-               if (sig) {
-                  // Failure is reported in verify_signature() ...
-                  verify_signature(jcr, sig);
-               } else {
-                  Jmsg1(jcr, M_ERROR, 0, _("Missing cryptographic signature for %s\n"), jcr->last_fname);
-               }
-            }
-
             extract = false;
          } else if (is_bopen(&bfd)) {
             Jmsg0(jcr, M_ERROR, 0, _("Logic error: output file should not be open\n"));
@@ -529,58 +402,22 @@ void do_restore(JCR *jcr)
       bclose_chksize(jcr, &altbfd, alt_size);
    }
    if (extract) {
-      /* Flush and deallocate cipher context */
-      if (cipher_ctx) {
-         flush_cipher(jcr, &bfd, flags, cipher_ctx, cipher_block_size);
-         crypto_cipher_free(cipher_ctx);
-         cipher_ctx = NULL;
-      }
       set_attributes(jcr, attr, &bfd);
-
-      /* Verify the cryptographic signature on the last file, if any */
-      if (jcr->pki_sign) {
-         if (sig) {
-            // Failure is reported in verify_signature() ...
-            verify_signature(jcr, sig);
-         } else {
-            Jmsg1(jcr, M_ERROR, 0, _("Missing cryptographic signature for %s\n"), jcr->last_fname);
-         }
-      }
    }
-
    if (is_bopen(&bfd)) {
       bclose(&bfd);
    }
-
    set_jcr_job_status(jcr, JS_Terminated);
    goto ok_out;
 
 bail_out:
    set_jcr_job_status(jcr, JS_ErrorTerminated);
 ok_out:
-
-   /* Free Signature & Crypto Data */
-   if (sig) {
-      crypto_sign_free(sig);
-      sig = NULL;
-   }
-   if (cs) {
-      crypto_session_free(cs);
-      cs = NULL;
-   }
-   if (cipher_ctx) {
-      crypto_cipher_free(cipher_ctx);
-      cipher_ctx = NULL;
-   }
    if (jcr->compress_buf) {
       free(jcr->compress_buf);
       jcr->compress_buf = NULL;
       jcr->compress_buf_size = 0;
    }
-   if (jcr->crypto_buf) {
-      free_pool_memory(jcr->crypto_buf);
-      jcr->crypto_buf = NULL;
-   }
    bclose(&altbfd);
    bclose(&bfd);
    free_attr(attr);
@@ -631,70 +468,6 @@ static const char *zlib_strerror(int stat)
 }
 #endif
 
-static int do_file_digest(FF_PKT *ff_pkt, void *pkt, bool top_level) {
-   JCR *jcr = (JCR *) pkt;
-   return (digest_file(jcr, ff_pkt, jcr->digest));
-}
-
-/*
- * Verify the signature for the last restored file
- * Return value is either true (signature correct)
- * or false (signature could not be verified).
- * TODO landonf: Better signature failure handling.
- */
-int verify_signature(JCR *jcr, SIGNATURE *sig)
-{
-   X509_KEYPAIR *keypair;
-   DIGEST *digest = NULL;
-   crypto_error_t err;
-
-   /* Iterate through the trusted signers */
-   foreach_alist(keypair, jcr->pki_signers) {
-      err = crypto_sign_get_digest(sig, jcr->pki_keypair, &digest);
-
-      switch (err) {
-      case CRYPTO_ERROR_NONE:
-         /* Signature found, digest allocated */
-         jcr->digest = digest;
-
-         /* Checksum the entire file */
-         if (find_one_file(jcr, jcr->ff, do_file_digest, jcr, jcr->last_fname, (dev_t)-1, 1) != 0) {
-            Qmsg(jcr, M_ERROR, 0, _("Signature validation failed for %s: \n"), jcr->last_fname);
-            return false;
-         }
-
-         /* Verify the signature */
-         if ((err = crypto_sign_verify(sig, keypair, digest)) != CRYPTO_ERROR_NONE) {
-            Dmsg1(100, "Bad signature on %s\n", jcr->last_fname);
-            Qmsg2(jcr, M_ERROR, 0, _("Signature validation failed for %s: %s\n"), jcr->last_fname, crypto_strerror(err));
-            crypto_digest_free(digest);
-            return false;
-         }
-
-         /* Valid signature */
-         Dmsg1(100, "Signature good on %s\n", jcr->last_fname);
-         crypto_digest_free(digest);
-         return true;
-
-      case CRYPTO_ERROR_NOSIGNER:
-         /* Signature not found, try again */
-         continue;
-      default:
-         /* Something strange happened (that shouldn't happen!)... */
-         Qmsg2(jcr, M_ERROR, 0, _("Signature validation failed for %s: %s\n"), jcr->last_fname, crypto_strerror(err));
-         if (digest) {
-            crypto_digest_free(digest);
-         }
-         return false;
-      }
-   }
-
-   /* No signer */
-   Dmsg1(100, "Could not find a valid public key for signature on %s\n", jcr->last_fname);
-   crypto_digest_free(digest);
-   return false;
-}
-
 /*
  * In the context of jcr, write data to bfd.
  * We write buflen bytes in buf at addr. addr is updated in place.
@@ -702,16 +475,13 @@ int verify_signature(JCR *jcr, SIGNATURE *sig)
  * Return value is the number of bytes written, or -1 on errors.
  */
 int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen,
-      uint64_t *addr, int flags, CIPHER_CONTEXT *cipher, size_t cipher_block_size)
+      uint64_t *addr, int flags)
 {
    int stat;
    char *wbuf;                        /* write buffer */
    uint32_t wsize;                    /* write size */
    uint32_t rsize;                    /* read size */
    char ec1[50];                      /* Buffer printing huge values */
-   const void *cipher_input;          /* Decryption input */
-   size_t cipher_input_len;           /* Decryption input length */
-   size_t decrypted_len = 0;          /* Decryption output length */
 
    if (flags & FO_SPARSE) {
       ser_declare;
@@ -736,8 +506,6 @@ int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen,
       rsize = buflen;
    }
    wsize = rsize;
-   cipher_input = wbuf;
-   cipher_input_len = wsize;
 
    if (flags & FO_GZIP) {
 #ifdef HAVE_LIBZ
@@ -751,111 +519,31 @@ int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen,
       Dmsg2(100, "Comp_len=%d msglen=%d\n", compress_len, wsize);
       if ((stat=uncompress((Byte *)jcr->compress_buf, &compress_len,
                   (const Byte *)wbuf, (uLong)rsize)) != Z_OK) {
-         Qmsg(jcr, M_ERROR, 0, _("Uncompression error on file %s. ERR=%s\n"),
+         Jmsg(jcr, M_ERROR, 0, _("Uncompression error on file %s. ERR=%s\n"),
                jcr->last_fname, zlib_strerror(stat));
          return -1;
       }
       wbuf = jcr->compress_buf;
       wsize = compress_len;
-      cipher_input = jcr->compress_buf; /* decrypt decompressed data */
-      cipher_input_len = compress_len;
       Dmsg2(100, "Write uncompressed %d bytes, total before write=%s\n", compress_len, edit_uint64(jcr->JobBytes, ec1));
 #else
-      Qmsg(jcr, M_ERROR, 0, _("GZIP data stream found, but GZIP not configured!\n"));
+      Jmsg(jcr, M_ERROR, 0, _("GZIP data stream found, but GZIP not configured!\n"));
       return -1;
 #endif
    } else {
       Dmsg2(30, "Write %u bytes, total before write=%s\n", wsize, edit_uint64(jcr->JobBytes, ec1));
    }
 
-   if (flags & FO_ENCRYPT) {
-      ASSERT(cipher);
-
-      /*
-       * Grow the crypto buffer, if necessary.
-       * crypto_cipher_update() will process only whole blocks,
-       * buffering the remaining input.
-       */
-      jcr->crypto_buf = check_pool_memory_size(jcr->crypto_buf, cipher_input_len + cipher_block_size);
-
-
-      /* Encrypt the input block */
-      if (!crypto_cipher_update(cipher, cipher_input, cipher_input_len, jcr->crypto_buf, &decrypted_len)) {
-         /* Decryption failed. Shouldn't happen. */
-         Jmsg(jcr, M_FATAL, 0, _("Decryption error\n"));
-         return -1;
-      }
-
-      if (decrypted_len == 0) {
-         /* No full block of data available, write more data */
-         goto ok;
-      }
-
-      Dmsg2(400, "decrypted len=%d undecrypted len=%d\n",
-         decrypted_len, cipher_input_len);
-      wsize = decrypted_len;
-      wbuf = jcr->crypto_buf; /* Decrypted, possibly decompressed output here. */
-   }
-
-
-   if (flags & FO_WIN32DECOMP) {
-      if (!processWin32BackupAPIBlock(bfd, wbuf, wsize)) {
-         berrno be;
-         Jmsg2(jcr, M_ERROR, 0, _("Write error in Win32 Block Decomposition on %s: %s\n"), 
-               jcr->last_fname, be.strerror(bfd->berrno));
-         return -1;
-      }
-   } else if (bwrite(bfd, wbuf, wsize) != (ssize_t)wsize) {
+   if (bwrite(bfd, wbuf, wsize) != (ssize_t)wsize) {
       berrno be;
       Jmsg2(jcr, M_ERROR, 0, _("Write error on %s: %s\n"), 
             jcr->last_fname, be.strerror(bfd->berrno));
       return -1;
    }
 
-   if (decrypted_len && decrypted_len > wsize) {
-      /* If more than wsize is output, it was previously buffered
-       * and reported, and should not be reported again */
-      wsize = wsize - decrypted_len;
-   }
-
-ok:
    jcr->JobBytes += wsize;
    jcr->ReadBytes += rsize;
    *addr += wsize;
 
    return wsize;
 }
-
-/*
- * In the context of jcr, flush any remaining data from the cipher context,
- * writing it to bfd.
- * Return value is true on success, false on failure.
- */
-bool flush_cipher(JCR *jcr, BFILE *bfd, int flags, CIPHER_CONTEXT *cipher, size_t cipher_block_size)
-{
-   size_t decrypted_len;
-
-   /* Write out the remaining block and free the cipher context */
-   jcr->crypto_buf = check_pool_memory_size(jcr->crypto_buf, cipher_block_size);
-
-   if (!crypto_cipher_finalize(cipher, jcr->crypto_buf, &decrypted_len)) {
-      /* Writing out the final, buffered block failed. Shouldn't happen. */
-      Jmsg1(jcr, M_FATAL, 0, _("Decryption error for %s\n"), jcr->last_fname);
-   }
-
-   if (flags & FO_WIN32DECOMP) {
-      if (!processWin32BackupAPIBlock(bfd, jcr->crypto_buf, decrypted_len)) {
-         berrno be;
-         Jmsg2(jcr, M_ERROR, 0, _("Write error in Win32 Block Decomposition on %s: %s\n"), 
-               jcr->last_fname, be.strerror(bfd->berrno));
-         return false;
-      }
-   } else if (bwrite(bfd, jcr->crypto_buf, decrypted_len) != (ssize_t)decrypted_len) {
-      berrno be;
-      Jmsg2(jcr, M_ERROR, 0, _("Write error on %s: %s\n"), 
-            jcr->last_fname, be.strerror(bfd->berrno));
-      return false;
-   }
-
-   return true;
-}
index ede4e6d987c4611d16045643feb830eb76fd2770..4962da52e5aad003bd66e4ada2e4a8fed08d8aaf 100755 (executable)
@@ -172,9 +172,9 @@ static void do_status(void sendit(const char *msg, int len, void *sarg), void *a
            edit_uint64_with_commas(njcr->num_files_examined, b1));
       sendit(msg, len, arg);
       if (njcr->JobFiles > 0) {
-         P(njcr->mutex);
+         njcr->lock();
          len = Mmsg(msg, _("    Processing file: %s\n"), njcr->last_fname);
-         V(njcr->mutex);
+         njcr->unlock();
          sendit(msg, len, arg);
       }
 
index 8312b7006f372142c18d04c4cc5a6aff62f28e74..313825d86420067b0ab941cdb43a36092137a9f4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Bacula File Daemon verify.c  Verify files.
+ *  Bacula File Daemon  verify.c  Verify files.
  *
  *    Kern Sibbald, October MM
  *
@@ -30,7 +30,7 @@
 #include "filed.h"
 
 static int verify_file(FF_PKT *ff_pkt, void *my_pkt, bool);
-static int read_digest(BFILE *bfd, DIGEST *digest, JCR *jcr);
+static int read_chksum(BFILE *bfd, CHKSUM *chksum, JCR *jcr);
 
 /*
  * Find all the requested files and send attributes
@@ -43,7 +43,7 @@ void do_verify(JCR *jcr)
    jcr->buf_size = DEFAULT_NETWORK_BUFFER_SIZE;
    if ((jcr->big_buf = (char *) malloc(jcr->buf_size)) == NULL) {
       Jmsg1(jcr, M_ABORT, 0, _("Cannot malloc %d network read buffer\n"),
-        DEFAULT_NETWORK_BUFFER_SIZE);
+         DEFAULT_NETWORK_BUFFER_SIZE);
    }
    set_find_options((FF_PKT *)jcr->ff, jcr->incremental, jcr->mtime);
    Dmsg0(10, "Start find files\n");
@@ -67,9 +67,9 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt, bool top_level)
 {
    char attribs[MAXSTRING];
    char attribsEx[MAXSTRING];
-   int digest_stream = STREAM_NONE;
    int stat;
-   DIGEST *digest = NULL;
+   BFILE bfd;
+   struct CHKSUM chksum;
    BSOCK *dir;
    JCR *jcr = (JCR *)pkt;
 
@@ -78,10 +78,10 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt, bool top_level)
    }
 
    dir = jcr->dir_bsock;
-   jcr->num_files_examined++;        /* bump total file count */
+   jcr->num_files_examined++;         /* bump total file count */
 
    switch (ff_pkt->type) {
-   case FT_LNKSAVED:                 /* Hard linked, file already saved */
+   case FT_LNKSAVED:                  /* Hard linked, file already saved */
       Dmsg2(30, "FT_LNKSAVED saving: %s => %s\n", ff_pkt->fname, ff_pkt->link);
       break;
    case FT_REGE:
@@ -94,7 +94,7 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt, bool top_level)
       Dmsg2(30, "FT_LNK saving: %s -> %s\n", ff_pkt->fname, ff_pkt->link);
       break;
    case FT_DIRBEGIN:
-      return 1;                      /* ignored */
+      return 1;                       /* ignored */
    case FT_DIREND:
       Dmsg1(30, "FT_DIR saving: %s\n", ff_pkt->fname);
       break;
@@ -158,19 +158,19 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt, bool top_level)
    encode_stat(attribs, ff_pkt, 0);
    encode_attribsEx(jcr, attribsEx, ff_pkt);
 
-   P(jcr->mutex);
-   jcr->JobFiles++;                 /* increment number of files sent */
+   jcr->lock();
+   jcr->JobFiles++;                  /* increment number of files sent */
    pm_strcpy(jcr->last_fname, ff_pkt->fname);
-   V(jcr->mutex);
+   jcr->unlock();
 
    /*
     * Send file attributes to Director
-    *  File_index
-    *  Stream
-    *  Verify Options
-    *  Filename (full path)
-    *  Encoded attributes
-    *  Link name (if type==FT_LNK)
+    *   File_index
+    *   Stream
+    *   Verify Options
+    *   Filename (full path)
+    *   Encoded attributes
+    *   Link name (if type==FT_LNK)
     * For a directory, link is the same as fname, but with trailing
     * slash. For a linked file, link is the link.
     */
@@ -178,17 +178,17 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt, bool top_level)
    Dmsg2(400, "send ATTR inx=%d fname=%s\n", jcr->JobFiles, ff_pkt->fname);
    if (ff_pkt->type == FT_LNK || ff_pkt->type == FT_LNKSAVED) {
       stat = bnet_fsend(dir, "%d %d %s %s%c%s%c%s%c", jcr->JobFiles,
-           STREAM_UNIX_ATTRIBUTES, ff_pkt->VerifyOpts, ff_pkt->fname,
-           0, attribs, 0, ff_pkt->link, 0);
+            STREAM_UNIX_ATTRIBUTES, ff_pkt->VerifyOpts, ff_pkt->fname,
+            0, attribs, 0, ff_pkt->link, 0);
    } else if (ff_pkt->type == FT_DIREND) {
-        /* Here link is the canonical filename (i.e. with trailing slash) */
+         /* Here link is the canonical filename (i.e. with trailing slash) */
          stat = bnet_fsend(dir,"%d %d %s %s%c%s%c%c", jcr->JobFiles,
-              STREAM_UNIX_ATTRIBUTES, ff_pkt->VerifyOpts, ff_pkt->link,
-              0, attribs, 0, 0);
+               STREAM_UNIX_ATTRIBUTES, ff_pkt->VerifyOpts, ff_pkt->link,
+               0, attribs, 0, 0);
    } else {
       stat = bnet_fsend(dir,"%d %d %s %s%c%s%c%c", jcr->JobFiles,
-           STREAM_UNIX_ATTRIBUTES, ff_pkt->VerifyOpts, ff_pkt->fname,
-           0, attribs, 0, 0);
+            STREAM_UNIX_ATTRIBUTES, ff_pkt->VerifyOpts, ff_pkt->fname,
+            0, attribs, 0, 0);
    }
    Dmsg2(20, "bfiled>bdird: attribs len=%d: msg=%s\n", dir->msglen, dir->msg);
    if (!stat) {
@@ -201,64 +201,64 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt, bool top_level)
     * First we initialise, then we read files, other streams and Finder Info.
     */
    if (ff_pkt->type != FT_LNKSAVED && (S_ISREG(ff_pkt->statp.st_mode) &&
-           ff_pkt->flags & (FO_MD5|FO_SHA1|FO_SHA256|FO_SHA512))) {
-      /*
-       * Create our digest context. If this fails, the digest will be set to NULL
-       * and not used.
-       */
-      if (ff_pkt->flags & FO_MD5) {
-        digest = crypto_digest_new(CRYPTO_DIGEST_MD5);
-        digest_stream = STREAM_MD5_DIGEST;
-
-      } else if (ff_pkt->flags & FO_SHA1) {
-        digest = crypto_digest_new(CRYPTO_DIGEST_SHA1);
-        digest_stream = STREAM_SHA1_DIGEST;
-
-      } else if (ff_pkt->flags & FO_SHA256) {
-        digest = crypto_digest_new(CRYPTO_DIGEST_SHA256);
-        digest_stream = STREAM_SHA256_DIGEST;
-
-      } else if (ff_pkt->flags & FO_SHA512) {
-        digest = crypto_digest_new(CRYPTO_DIGEST_SHA512);
-        digest_stream = STREAM_SHA512_DIGEST;
+            ff_pkt->flags & (FO_MD5|FO_SHA1))) {
+      chksum_init(&chksum, ff_pkt->flags);
+      binit(&bfd);
+
+      if (ff_pkt->statp.st_size > 0 || ff_pkt->type == FT_RAW
+            || ff_pkt->type == FT_FIFO) {
+         if ((bopen(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0)) < 0) {
+            ff_pkt->ff_errno = errno;
+            berrno be;
+            be.set_errno(bfd.berrno);
+            Jmsg(jcr, M_NOTSAVED, 1, _("     Cannot open %s: ERR=%s.\n"),
+                 ff_pkt->fname, be.strerror());
+            jcr->Errors++;
+            return 1;
+         }
+         read_chksum(&bfd, &chksum, jcr);
+         bclose(&bfd);
       }
 
-      /* Did digest initialization fail? */
-      if (digest_stream != STREAM_NONE && digest == NULL) {
-         Jmsg(jcr, M_WARNING, 0, _("%s digest initialization failed\n"),
-             stream_to_ascii(digest_stream));
+#ifdef HAVE_DARWIN_OS
+      /* Open resource fork if necessary */
+      if (ff_pkt->flags & FO_HFSPLUS && ff_pkt->hfsinfo.rsrclength > 0) {
+         if (bopen_rsrc(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) {
+            ff_pkt->ff_errno = errno;
+            berrno be;
+            Jmsg(jcr, M_NOTSAVED, -1, _("     Cannot open resource fork for %s: ERR=%s.\n"),
+                  ff_pkt->fname, be.strerror());
+            jcr->Errors++;
+            if (is_bopen(&ff_pkt->bfd)) {
+               bclose(&ff_pkt->bfd);
+            }
+            return 1;
+         }
+         read_chksum(&bfd, &chksum, jcr);
+         bclose(&bfd);
+      }
+      if (ff_pkt->flags & FO_HFSPLUS) {
+         chksum_update(&chksum, ((unsigned char *)ff_pkt->hfsinfo.fndrinfo), 32);
       }
+#endif
 
       /* compute MD5 or SHA1 hash */
-      if (digest) {
-        char md[CRYPTO_DIGEST_MAX_SIZE];
-        size_t size;
-
-        size = sizeof(md);
-        
-        if (digest_file(jcr, ff_pkt, digest) != 0) {
-           jcr->Errors++;
-           return 1;
-        }
-
-        if (crypto_digest_finalize(digest, &md, &size)) {
-           char *digest_buf;
-           const char *digest_name;
-           
-           digest_buf = (char *) malloc(BASE64_SIZE(size));
-           digest_name = crypto_digest_name(digest);
-
-           bin_to_base64(digest_buf, (char *) md, size);
-            Dmsg3(400, "send inx=%d %s=%s\n", jcr->JobFiles, digest_name, digest_buf);
-            bnet_fsend(dir, "%d %d %s *%s-%d*", jcr->JobFiles, digest_stream, digest_buf,
-                      digest_name, jcr->JobFiles);
-            Dmsg3(20, "bfiled>bdird: %s len=%d: msg=%s\n", digest_name,
-           dir->msglen, dir->msg);
-
-           free(digest_buf);
-        }
-
-        crypto_digest_free(digest);
+      if (chksum.updated) {
+         char chksumbuf[40];                  /* 24 should do */
+         int stream = 0;
+
+         chksum_final(&chksum);
+         if (chksum.type == CHKSUM_MD5) {
+            stream = STREAM_MD5_SIGNATURE;
+         } else if (chksum.type == CHKSUM_SHA1) {
+            stream = STREAM_SHA1_SIGNATURE;
+         }
+         bin_to_base64(chksumbuf, (char *)chksum.signature, chksum.length);
+         Dmsg3(400, "send inx=%d %s=%s\n", jcr->JobFiles, chksum.name, chksumbuf);
+         bnet_fsend(dir, "%d %d %s *%s-%d*", jcr->JobFiles, stream, chksumbuf,
+               chksum.name, jcr->JobFiles);
+         Dmsg3(20, "bfiled>bdird: %s len=%d: msg=%s\n", chksum.name,
+               dir->msglen, dir->msg);
       }
    }
 
@@ -266,65 +266,15 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt, bool top_level)
 }
 
 /*
- * Compute message digest for the file specified by ff_pkt.
- * In case of errors we need the job control record and file name.
- */
-int digest_file(JCR *jcr, FF_PKT *ff_pkt, DIGEST *digest)
-{
-   BFILE bfd;
-
-   binit(&bfd);
-
-   if (ff_pkt->statp.st_size > 0 || ff_pkt->type == FT_RAW
-        || ff_pkt->type == FT_FIFO) {
-      if ((bopen(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0)) < 0) {
-        ff_pkt->ff_errno = errno;
-        berrno be;
-        be.set_errno(bfd.berrno);
-         Jmsg(jcr, M_NOTSAVED, 1, _("     Cannot open %s: ERR=%s.\n"),
-              ff_pkt->fname, be.strerror());
-        return 1;
-      }
-      read_digest(&bfd, digest, jcr);
-      bclose(&bfd);
-   }
-
-#ifdef HAVE_DARWIN_OS
-      /* Open resource fork if necessary */
-   if (ff_pkt->flags & FO_HFSPLUS && ff_pkt->hfsinfo.rsrclength > 0) {
-      if (bopen_rsrc(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) {
-        ff_pkt->ff_errno = errno;
-        berrno be;
-         Jmsg(jcr, M_NOTSAVED, -1, _("     Cannot open resource fork for %s: ERR=%s.\n"),
-              ff_pkt->fname, be.strerror());
-        if (is_bopen(&ff_pkt->bfd)) {
-           bclose(&ff_pkt->bfd);
-        }
-        return 1;
-      }
-      read_digest(&bfd, digest, jcr);
-      bclose(&bfd);
-   }
-
-   if (digest && ff_pkt->flags & FO_HFSPLUS) {
-      crypto_digest_update(digest, ff_pkt->hfsinfo.fndrinfo, 32);
-   }
-#endif
-
-   return 0;
-}
-
-/*
- * Read message digest of bfd, updating digest
+ * Read checksum of bfd, updating chksum
  * In case of errors we need the job control record and file name.
  */
-int read_digest(BFILE *bfd, DIGEST *digest, JCR *jcr)
+int read_chksum(BFILE *bfd, CHKSUM *chksum, JCR *jcr)
 {
-   char buf[DEFAULT_NETWORK_BUFFER_SIZE];
    int64_t n;
 
-   while ((n=bread(bfd, &buf, sizeof(buf))) > 0) {
-      crypto_digest_update(digest, &buf, n);
+   while ((n=bread(bfd, jcr->big_buf, jcr->buf_size)) > 0) {
+      chksum_update(chksum, ((unsigned char *)jcr->big_buf), (int)n);
       jcr->JobBytes += n;
       jcr->ReadBytes += n;
    }
@@ -332,7 +282,7 @@ int read_digest(BFILE *bfd, DIGEST *digest, JCR *jcr)
       berrno be;
       be.set_errno(bfd->berrno);
       Jmsg(jcr, M_ERROR, 1, _("Error reading file %s: ERR=%s\n"),
-           jcr->last_fname, be.strerror());
+            jcr->last_fname, be.strerror());
       jcr->Errors++;
       return -1;
    }
index abcf9225006c2882c90e8ca5a865481d386e2c0f..cc764402a39de3c6bb296f3ac2dce4e3fbca385d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Bacula File Daemon verify-vol.c Verify files on a Volume
+ *  Bacula File Daemon  verify-vol.c Verify files on a Volume
  *    versus attributes in Catalog
  *
  *    Kern Sibbald, July MMII
@@ -43,13 +43,12 @@ static char rec_header[] = "rechdr %ld %ld %ld %ld %ld";
 void do_verify_volume(JCR *jcr)
 {
    BSOCK *sd, *dir;
-   POOLMEM *fname;                   /* original file name */
-   POOLMEM *lname;                   /* link name */
+   POOLMEM *fname;                    /* original file name */
+   POOLMEM *lname;                    /* link name */
    int32_t stream;
    uint32_t size;
    uint32_t VolSessionId, VolSessionTime, file_index;
    uint32_t record_file_index;
-   char digest[BASE64_SIZE(CRYPTO_DIGEST_MAX_SIZE)];
    int type, stat;
 
    sd = jcr->store_bsock;
@@ -68,7 +67,7 @@ void do_verify_volume(JCR *jcr)
    if (client) {
       buf_size = client->max_network_buffer_size;
    } else {
-      buf_size = 0;                  /* use default */
+      buf_size = 0;                   /* use default */
    }
    if (!bnet_set_buffer_size(sd, buf_size, BNET_SETBUF_WRITE)) {
       set_jcr_job_status(jcr, JS_FatalError);
@@ -87,9 +86,9 @@ void do_verify_volume(JCR *jcr)
        * First we expect a Stream Record Header
        */
       if (sscanf(sd->msg, rec_header, &VolSessionId, &VolSessionTime, &file_index,
-         &stream, &size) != 5) {
+          &stream, &size) != 5) {
          Jmsg1(jcr, M_FATAL, 0, _("Record header scan error: %s\n"), sd->msg);
-        goto bail_out;
+         goto bail_out;
       }
       Dmsg2(30, "Got hdr: FilInx=%d Stream=%d.\n", file_index, stream);
 
@@ -98,11 +97,11 @@ void do_verify_volume(JCR *jcr)
        */
       if (bget_msg(sd) < 0) {
          Jmsg1(jcr, M_FATAL, 0, _("Data record error. ERR=%s\n"), bnet_strerror(sd));
-        goto bail_out;
+         goto bail_out;
       }
       if (size != ((uint32_t)sd->msglen)) {
          Jmsg2(jcr, M_FATAL, 0, _("Actual data size %d not same as header %d\n"), sd->msglen, size);
-        goto bail_out;
+         goto bail_out;
       }
       Dmsg1(30, "Got stream data, len=%d\n", sd->msglen);
 
@@ -110,147 +109,131 @@ void do_verify_volume(JCR *jcr)
       switch (stream) {
       case STREAM_UNIX_ATTRIBUTES:
       case STREAM_UNIX_ATTRIBUTES_EX:
-        char *ap, *lp, *fp;
+         char *ap, *lp, *fp;
 
          Dmsg0(400, "Stream=Unix Attributes.\n");
 
-        if ((int)sizeof_pool_memory(fname) < sd->msglen) {
-           fname = realloc_pool_memory(fname, sd->msglen + 1);
-        }
-
-        if ((int)sizeof_pool_memory(lname) < sd->msglen) {
-           lname = realloc_pool_memory(lname, sd->msglen + 1);
-        }
-        *fname = 0;
-        *lname = 0;
-
-        /*
-         * An Attributes record consists of:
-         *    File_index
-         *    Type   (FT_types)
-         *    Filename
-         *    Attributes
-         *    Link name (if file linked i.e. FT_LNK)
-         *    Extended Attributes (if Win32)
-         */
+         if ((int)sizeof_pool_memory(fname) < sd->msglen) {
+            fname = realloc_pool_memory(fname, sd->msglen + 1);
+         }
+
+         if ((int)sizeof_pool_memory(lname) < sd->msglen) {
+            lname = realloc_pool_memory(lname, sd->msglen + 1);
+         }
+         *fname = 0;
+         *lname = 0;
+
+         /*
+          * An Attributes record consists of:
+          *    File_index
+          *    Type   (FT_types)
+          *    Filename
+          *    Attributes
+          *    Link name (if file linked i.e. FT_LNK)
+          *    Extended Attributes (if Win32)
+          */
          if (sscanf(sd->msg, "%d %d", &record_file_index, &type) != 2) {
             Jmsg(jcr, M_FATAL, 0, _("Error scanning record header: %s\n"), sd->msg);
             Dmsg0(0, "\nError scanning header\n");
-           goto bail_out;
-        }
+            goto bail_out;
+         }
          Dmsg2(30, "Got Attr: FilInx=%d type=%d\n", record_file_index, type);
-        if (record_file_index != file_index) {
+         if (record_file_index != file_index) {
             Jmsg(jcr, M_FATAL, 0, _("Record header file index %ld not equal record index %ld\n"),
-              file_index, record_file_index);
+               file_index, record_file_index);
             Dmsg0(0, "File index error\n");
-           goto bail_out;
-        }
-        ap = sd->msg;
+            goto bail_out;
+         }
+         ap = sd->msg;
          while (*ap++ != ' ')         /* skip record file index */
-           ;
+            ;
          while (*ap++ != ' ')         /* skip type */
-           ;
-        /* Save filename and position to attributes */
-        fp = fname;
-        while (*ap != 0) {
-           *fp++  = *ap++;           /* copy filename to fname */
-        }
-        *fp = *ap++;                 /* terminate filename & point to attribs */
+            ;
+         /* Save filename and position to attributes */
+         fp = fname;
+         while (*ap != 0) {
+            *fp++  = *ap++;           /* copy filename to fname */
+         }
+         *fp = *ap++;                 /* terminate filename & point to attribs */
 
          Dmsg1(200, "Attr=%s\n", ap);
-        /* Skip to Link name */
-        if (type == FT_LNK || type == FT_LNKSAVED) {
-           lp = ap;
-           while (*lp++ != 0) {
-              ;
-           }
+         /* Skip to Link name */
+         if (type == FT_LNK || type == FT_LNKSAVED) {
+            lp = ap;
+            while (*lp++ != 0) {
+               ;
+            }
             pm_strcat(lname, lp);        /* "save" link name */
-        } else {
-           *lname = 0;
-        }
-        P(jcr->mutex);
-        jcr->JobFiles++;
-        jcr->num_files_examined++;
-        pm_strcpy(jcr->last_fname, fname); /* last file examined */
-        V(jcr->mutex);
-
-        /*
-         * Send file attributes to Director
-         *   File_index
-         *   Stream
-         *   Verify Options
-         *   Filename (full path)
-         *   Encoded attributes
-         *   Link name (if type==FT_LNK)
-         * For a directory, link is the same as fname, but with trailing
-         * slash. For a linked file, link is the link.
-         */
-        /* Send file attributes to Director */
+         } else {
+            *lname = 0;
+         }
+         jcr->lock();
+         jcr->JobFiles++;
+         jcr->num_files_examined++;
+         pm_strcpy(jcr->last_fname, fname); /* last file examined */
+         jcr->unlock();
+
+         /*
+          * Send file attributes to Director
+          *   File_index
+          *   Stream
+          *   Verify Options
+          *   Filename (full path)
+          *   Encoded attributes
+          *   Link name (if type==FT_LNK)
+          * For a directory, link is the same as fname, but with trailing
+          * slash. For a linked file, link is the link.
+          */
+         /* Send file attributes to Director */
          Dmsg2(200, "send ATTR inx=%d fname=%s\n", jcr->JobFiles, fname);
-        if (type == FT_LNK || type == FT_LNKSAVED) {
+         if (type == FT_LNK || type == FT_LNKSAVED) {
             stat = bnet_fsend(dir, "%d %d %s %s%c%s%c%s%c", jcr->JobFiles,
                           STREAM_UNIX_ATTRIBUTES, "pinsug5", fname,
-                         0, ap, 0, lname, 0);
-        } else {
+                          0, ap, 0, lname, 0);
+         } else {
             stat = bnet_fsend(dir,"%d %d %s %s%c%s%c%c", jcr->JobFiles,
                           STREAM_UNIX_ATTRIBUTES, "pinsug5", fname,
-                         0, ap, 0, 0);
-        }
+                          0, ap, 0, 0);
+         }
          Dmsg2(200, "bfiled>bdird: attribs len=%d: msg=%s\n", dir->msglen, dir->msg);
-        if (!stat) {
+         if (!stat) {
             Jmsg(jcr, M_FATAL, 0, _("Network error in send to Director: ERR=%s\n"), bnet_strerror(dir));
-           goto bail_out;
-        }
-        break;
+            goto bail_out;
+         }
+         break;
 
       /* Data streams to ignore */
-      case STREAM_ENCRYPTED_SESSION_DATA:
       case STREAM_FILE_DATA:
       case STREAM_SPARSE_DATA:
       case STREAM_WIN32_DATA:
       case STREAM_WIN32_GZIP_DATA:
       case STREAM_GZIP_DATA:
       case STREAM_SPARSE_GZIP_DATA:
-      case STREAM_SIGNED_DIGEST:
 
-       /* Do nothing */
-       break;
+        /* Do nothing */
+        break;
 
-      case STREAM_MD5_DIGEST:
-         bin_to_base64(digest, (char *)sd->msg, CRYPTO_DIGEST_MD5_SIZE);
-         Dmsg2(400, "send inx=%d MD5=%s\n", jcr->JobFiles, digest);
-         bnet_fsend(dir, "%d %d %s *MD5-%d*", jcr->JobFiles, STREAM_MD5_DIGEST, digest,
-                    jcr->JobFiles);
+      case STREAM_MD5_SIGNATURE:
+         char MD5buf[30];
+         bin_to_base64(MD5buf, (char *)sd->msg, 16); /* encode 16 bytes */
+         Dmsg2(400, "send inx=%d MD5=%s\n", jcr->JobFiles, MD5buf);
+         bnet_fsend(dir, "%d %d %s *MD5-%d*", jcr->JobFiles, STREAM_MD5_SIGNATURE, MD5buf,
+            jcr->JobFiles);
          Dmsg2(20, "bfiled>bdird: MD5 len=%d: msg=%s\n", dir->msglen, dir->msg);
          break;
 
-      case STREAM_SHA1_DIGEST:
-         bin_to_base64(digest, (char *)sd->msg, CRYPTO_DIGEST_SHA1_SIZE);
-         Dmsg2(400, "send inx=%d SHA1=%s\n", jcr->JobFiles, digest);
-         bnet_fsend(dir, "%d %d %s *SHA1-%d*", jcr->JobFiles, STREAM_SHA1_DIGEST,
-                    digest, jcr->JobFiles);
+      case STREAM_SHA1_SIGNATURE:
+         char SHA1buf[30];
+         bin_to_base64(SHA1buf, (char *)sd->msg, 20); /* encode 20 bytes */
+         Dmsg2(400, "send inx=%d SHA1=%s\n", jcr->JobFiles, SHA1buf);
+         bnet_fsend(dir, "%d %d %s *SHA1-%d*", jcr->JobFiles, STREAM_SHA1_SIGNATURE,
+            SHA1buf, jcr->JobFiles);
          Dmsg2(20, "bfiled>bdird: SHA1 len=%d: msg=%s\n", dir->msglen, dir->msg);
          break;
 
-      case STREAM_SHA256_DIGEST:
-         bin_to_base64(digest, (char *)sd->msg, CRYPTO_DIGEST_SHA256_SIZE);
-         Dmsg2(400, "send inx=%d SHA256=%s\n", jcr->JobFiles, digest);
-         bnet_fsend(dir, "%d %d %s *SHA256-%d*", jcr->JobFiles, STREAM_SHA256_DIGEST,
-                    digest, jcr->JobFiles);
-         Dmsg2(20, "bfiled>bdird: SHA256 len=%d: msg=%s\n", dir->msglen, dir->msg);
-         break;
-
-      case STREAM_SHA512_DIGEST:
-         bin_to_base64(digest, (char *)sd->msg, CRYPTO_DIGEST_SHA512_SIZE);
-         Dmsg2(400, "send inx=%d SHA512=%s\n", jcr->JobFiles, digest);
-         bnet_fsend(dir, "%d %d %s *SHA512-%d*", jcr->JobFiles, STREAM_SHA512_DIGEST,
-                    digest, jcr->JobFiles);
-         Dmsg2(20, "bfiled>bdird: SHA512 len=%d: msg=%s\n", dir->msglen, dir->msg);
-         break;
-
       default:
          Pmsg2(0, "None of above!!! stream=%d data=%s\n", stream,sd->msg);
-        break;
+         break;
       } /* end switch */
    } /* end while bnet_get */
    set_jcr_job_status(jcr, JS_Terminated);
index 51adfd74919a440ae6e4cfdd003e03168800f638..8e6dbb7826a407c52efe009f18b1a184699492f9 100644 (file)
@@ -68,7 +68,7 @@ BEGIN
             VALUE "FileDescription", "Bacula File daemon for Win32\0"
             VALUE "FileVersion", VERSION "\0"
             VALUE "InternalName", "Bacula\0"
-            VALUE "LegalCopyright", "Copyright Kern Sibbald, 1999-2005\0"
+            VALUE "LegalCopyright", "Copyright Kern Sibbald, 1999-2006\0"
             VALUE "LegalTrademarks", "Licensed under GNU GPL 2.0\0"
             VALUE "OriginalFilename", "filed.exe\0"
             VALUE "PrivateBuild", "\0"
@@ -141,7 +141,7 @@ BEGIN
     LTEXT           "         www.bacula.org",IDC_WWW,115,70,100,10
 //    LTEXT           "                 ",-1,69,81,100,10
 //    LTEXT           "                 ",-1,90,70,100,10
-    LTEXT           "Copyright (C) 1999-2005, Kern Sibbald",IDC_COPYRIGHT,7,120,175,10
+    LTEXT           "Copyright (C) 1999-2006, Kern Sibbald",IDC_COPYRIGHT,7,120,175,10
     LTEXT           N_("Licensed under GNU GPL 2.0."),IDC_TRADEMARK,7,130,175,10
     RTEXT           N_("Build Date:"),-1,108,24,42,8
     RTEXT           N_("Bacula Version:"),-1,100,9,50,8
index 3e4f7cd64c1f3eb1cb1e47a8fca7b5c373943175..678aa9c71a7b506fbeee90430f273c2d10b64584 100755 (executable)
@@ -56,15 +56,6 @@ int select_data_stream(FF_PKT *ff_pkt)
 {
    int stream;
 
-   /*
-    *  Fix all incompatible options
-    */
-
-   /* No sparse option for encrypted data */
-   if (ff_pkt->flags & FO_ENCRYPT) {
-      ff_pkt->flags &= ~FO_SPARSE;
-   }
-
    /* Note, no sparse option for win32_data */
    if (!is_portable_backup(&ff_pkt->bfd)) {
       stream = STREAM_WIN32_DATA;
@@ -74,65 +65,17 @@ int select_data_stream(FF_PKT *ff_pkt)
    } else {
       stream = STREAM_FILE_DATA;
    }
-
-   /* Encryption is only supported for file data */
-   if (stream != STREAM_FILE_DATA && stream != STREAM_WIN32_DATA &&
-         stream != STREAM_MACOS_FORK_DATA) {
-      ff_pkt->flags &= ~FO_ENCRYPT;
-   }
-
-   /* Compression is not supported for Mac fork data */
-   if (stream == STREAM_MACOS_FORK_DATA) {
-      ff_pkt->flags &= ~FO_GZIP;
-   }
-
-   /*
-    * Handle compression and encryption options
-    */
 #ifdef HAVE_LIBZ
    if (ff_pkt->flags & FO_GZIP) {
-      switch (stream) {
-      case STREAM_WIN32_DATA:
+      if (stream == STREAM_WIN32_DATA) {
          stream = STREAM_WIN32_GZIP_DATA;
-         break;
-      case STREAM_SPARSE_DATA:
-         stream = STREAM_SPARSE_GZIP_DATA;
-         break;
-      case STREAM_FILE_DATA:
+      } else if (stream == STREAM_FILE_DATA) {
          stream = STREAM_GZIP_DATA;
-         break;
-      default:
-         /* All stream types that do not support gzip should clear out
-          * FO_GZIP above, and this code block should be unreachable. */
-         ASSERT(!ff_pkt->flags & FO_GZIP);
-         return STREAM_NONE;
-      }
-   }
-#endif
-#ifdef HAVE_CRYPTO
-   if (ff_pkt->flags & FO_ENCRYPT) {
-      switch (stream) {
-      case STREAM_WIN32_DATA:
-         stream = STREAM_ENCRYPTED_WIN32_DATA;
-         break;
-      case STREAM_WIN32_GZIP_DATA:
-         stream = STREAM_ENCRYPTED_WIN32_GZIP_DATA;
-         break;
-      case STREAM_FILE_DATA:
-         stream = STREAM_ENCRYPTED_FILE_DATA;
-         break;
-      case STREAM_GZIP_DATA:
-         stream = STREAM_ENCRYPTED_FILE_GZIP_DATA;
-         break;
-      default:
-         /* All stream types that do not support encryption should clear out
-          * FO_ENCRYPT above, and this code block should be unreachable. */
-         ASSERT(!ff_pkt->flags & FO_ENCRYPT);
-         return STREAM_NONE;
+      } else {
+         stream = STREAM_SPARSE_GZIP_DATA;
       }
    }
 #endif
-
    return stream;
 }
 
index 85b3ffe9e3b0dec4c75aebc0840934171b9db9eb..dc09ace024777bb4edd86491f9d70d97bbf1c286 100644 (file)
    Copyright (C) 2003-2005 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.
+   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.
 
    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.
+   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.
 
  */
 
@@ -48,8 +53,6 @@ bool is_win32_stream(int stream)
    switch (stream) {
    case STREAM_WIN32_DATA:
    case STREAM_WIN32_GZIP_DATA:
-   case STREAM_ENCRYPTED_WIN32_DATA:
-   case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
       return true;
    }
    return false;
@@ -72,8 +75,8 @@ const char *stream_to_ascii(int stream)
       return _("File attributes");
    case STREAM_FILE_DATA:
       return _("File data");
-   case STREAM_MD5_DIGEST:
-      return _("MD5 digest");
+   case STREAM_MD5_SIGNATURE:
+      return _("MD5 signature");
    case STREAM_UNIX_ATTRIBUTES_EX:
       return _("Extended attributes");
    case STREAM_SPARSE_DATA:
@@ -82,168 +85,18 @@ const char *stream_to_ascii(int stream)
       return _("Program names");
    case STREAM_PROGRAM_DATA:
       return _("Program data");
-   case STREAM_SHA1_DIGEST:
-      return _("SHA1 digest");
+   case STREAM_SHA1_SIGNATURE:
+      return _("SHA1 signature");
    case STREAM_MACOS_FORK_DATA:
       return _("HFS+ resource fork");
    case STREAM_HFSPLUS_ATTRIBUTES:
       return _("HFS+ Finder Info");
-   case STREAM_SHA256_DIGEST:
-      return _("SHA256 digest");
-   case STREAM_SHA512_DIGEST:
-      return _("SHA512 digest");
-   case STREAM_SIGNED_DIGEST:
-      return _("Signed digest");
-   case STREAM_ENCRYPTED_FILE_DATA:
-      return _("Encrypted File data");
-   case STREAM_ENCRYPTED_FILE_GZIP_DATA:
-      return _("Encrypted GZIP data");
-   case STREAM_ENCRYPTED_WIN32_DATA:
-      return _("Encrypted Win32 data");
-   case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
-      return _("Encrypted Win32 GZIP data");
-   case STREAM_ENCRYPTED_MACOS_FORK_DATA:
-      return _("Encrypted HFS+ resource fork");
    default:
       sprintf(buf, "%d", stream);
       return (const char *)buf;
    }
 }
 
-   
-void int64_LE2BE(int64_t* pBE, const int64_t v)
-{
-   /* convert little endian to big endian */
-   if (htonl(1) != 1L) { /* no work if on little endian machine */
-           memcpy(pBE, &v, sizeof(int64_t));
-   } else {
-           int i;
-           uint8_t rv[sizeof(int64_t)];
-           uint8_t *pv = (uint8_t *) &v;
-
-           for (i = 0; i < 8; i++) {
-              rv[i] = pv[7 - i];
-           }
-           memcpy(pBE, &rv, sizeof(int64_t));
-   }    
-}
-
-
-void int32_LE2BE(int32_t* pBE, const int32_t v)
-{
-   /* convert little endian to big endian */
-   if (htonl(1) != 1L) { /* no work if on little endian machine */
-           memcpy(pBE, &v, sizeof(int32_t));
-   } else {
-           int i;
-           uint8_t rv[sizeof(int32_t)];
-           uint8_t *pv = (uint8_t *) &v;
-
-           for (i = 0; i < 4; i++) {
-              rv[i] = pv[3 - i];
-           }
-           memcpy(pBE, &rv, sizeof(int32_t));
-   }    
-}
-
-
-bool processWin32BackupAPIBlock (BFILE *bfd, void *pBuffer, ssize_t dwSize)
-{   
-   /* pByte contains the buffer 
-      dwSize the len to be processed.  function assumes to be
-      called in successive incremental order over the complete
-      BackupRead stream beginning at pos 0 and ending at the end.
-    */
-
-   PROCESS_WIN32_BACKUPAPIBLOCK_CONTEXT* pContext = &(bfd->win32DecompContext);
-   bool bContinue = false;
-   int64_t dwDataOffset = 0;
-   int64_t dwDataLen;
-
-   /* Win32 Stream Header size without name of stream.
-    * = sizeof (WIN32_STREAM_ID)- sizeof(WCHAR*); 
-    */
-   int32_t dwSizeHeader = 20; 
-
-   do {               
-      if (pContext->liNextHeader >= dwSize) {                        
-         dwDataLen = dwSize-dwDataOffset;
-         bContinue = false; /* 1 iteration is enough */
-      }
-      else {                        
-         dwDataLen = pContext->liNextHeader-dwDataOffset;
-         bContinue = true; /* multiple iterations may be necessary */
-      }
-
-      /* flush */
-      /* copy block of real DATA */
-      if (pContext->bIsInData) {
-         if (bwrite(bfd, ((char *)pBuffer)+dwDataOffset, dwDataLen) != (ssize_t)dwDataLen)
-            return false;         
-      }
-
-      if (pContext->liNextHeader < dwSize) {/* is a header in this block ? */
-         int32_t dwOffsetTarget;
-         int32_t dwOffsetSource;
-            
-         if (pContext->liNextHeader < 0) {
-            /* start of header was before this block, so we
-             * continue with the part in the current block 
-             */
-            dwOffsetTarget = -pContext->liNextHeader;        
-            dwOffsetSource = 0;                            
-         } else {
-            /* start of header is inside of this block */
-            dwOffsetTarget = 0;
-            dwOffsetSource = pContext->liNextHeader;                        
-         }
-
-         int32_t dwHeaderPartLen = dwSizeHeader-dwOffsetTarget;
-         bool bHeaderIsComplete;
-
-         if (dwHeaderPartLen <= dwSize-dwOffsetSource) 
-            /* header (or rest of header) is completely available
-               in current block 
-             */
-            bHeaderIsComplete = true;
-         else  {
-            /* header will continue in next block */
-            bHeaderIsComplete = false;
-            dwHeaderPartLen = dwSize-dwOffsetSource;
-         }
-
-         /* copy the available portion of header to persistent copy */
-         memcpy(((char *)&pContext->header_stream)+dwOffsetTarget, ((char *)pBuffer)+dwOffsetSource, dwHeaderPartLen);
-
-         /* recalculate position of next header */
-         if (bHeaderIsComplete) {
-            /* convert stream name size (32 bit little endian) to machine type */
-            int32_t dwNameSize; 
-            int32_LE2BE (&dwNameSize, pContext->header_stream.dwStreamNameSize);
-            dwDataOffset = dwNameSize+pContext->liNextHeader+dwSizeHeader;
-            
-            /* convert stream size (64 bit little endian) to machine type */
-            int64_LE2BE (&(pContext->liNextHeader), pContext->header_stream.Size);
-            pContext->liNextHeader += dwDataOffset;
-
-            pContext->bIsInData = pContext->header_stream.dwStreamId == WIN32_BACKUP_DATA;
-            if (dwDataOffset == dwSize)
-                  bContinue = false;
-         }
-         else {
-            /* stop and continue with next block */
-            bContinue = false;
-            pContext->bIsInData = false;
-         }
-      }                
-   } while (bContinue);    
-
-   /* set "NextHeader" relative to the beginning of the next block */
-   pContext->liNextHeader-= dwSize;
-
-   return TRUE;
-}
-
 
 
 /* ===============================================================
@@ -311,53 +164,39 @@ bool have_win32_api()
 
 
 /*
- * Return true  if we support the stream
- *        false if we do not support the stream
- *
- *  This code is running under Win32, so we
- *    do not need #ifdef on MACOS ...
+ * Return 1 if we support the stream
+ *        0 if we do not support the stream
  */
 bool is_restore_stream_supported(int stream)
 {
+   /* No Win32 backup on this machine */
    switch (stream) {
-
-/* Streams known not to be supported */
 #ifndef HAVE_LIBZ
    case STREAM_GZIP_DATA:
    case STREAM_SPARSE_GZIP_DATA:
-   case STREAM_WIN32_GZIP_DATA:
+      return 0;
 #endif
+   case STREAM_WIN32_DATA:
+   case STREAM_WIN32_GZIP_DATA:
+      return have_win32_api();
+
    case STREAM_MACOS_FORK_DATA:
    case STREAM_HFSPLUS_ATTRIBUTES:
-   case STREAM_ENCRYPTED_MACOS_FORK_DATA:
       return false;
 
    /* Known streams */
 #ifdef HAVE_LIBZ
    case STREAM_GZIP_DATA:
    case STREAM_SPARSE_GZIP_DATA:
-   case STREAM_WIN32_GZIP_DATA:
 #endif
-   case STREAM_WIN32_DATA:
    case STREAM_UNIX_ATTRIBUTES:
    case STREAM_FILE_DATA:
-   case STREAM_MD5_DIGEST:
+   case STREAM_MD5_SIGNATURE:
    case STREAM_UNIX_ATTRIBUTES_EX:
    case STREAM_SPARSE_DATA:
    case STREAM_PROGRAM_NAMES:
    case STREAM_PROGRAM_DATA:
-   case STREAM_SHA1_DIGEST:
-#ifdef HAVE_SHA2
-   case STREAM_SHA256_DIGEST:
-   case STREAM_SHA512_DIGEST:
-#endif
-#ifdef HAVE_CRYPTO
-   case STREAM_SIGNED_DIGEST:
-   case STREAM_ENCRYPTED_FILE_DATA:
-   case STREAM_ENCRYPTED_FILE_GZIP_DATA:
-   case STREAM_ENCRYPTED_WIN32_DATA:
-   case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
-#endif
+   case STREAM_SHA1_SIGNATURE:
    case 0:                            /* compatibility with old tapes */
       return true;
    }
@@ -375,7 +214,7 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
    POOLMEM *win32_fname_wchar;
 
    DWORD dwaccess, dwflags, dwshare;
-
+   
    /* Convert to Windows path format */
    win32_fname = get_pool_memory(PM_FNAME);
    win32_fname_wchar = get_pool_memory(PM_FNAME);
@@ -494,8 +333,6 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
    }
    bfd->errmsg = NULL;
    bfd->lpContext = NULL;
-   bfd->win32DecompContext.bIsInData = false;
-   bfd->win32DecompContext.liNextHeader = 0;
    free_pool_memory(win32_fname_wchar);
    free_pool_memory(win32_fname);
    return bfd->mode == BF_CLOSED ? -1 : 1;
@@ -694,18 +531,17 @@ bool set_prog(BFILE *bfd, char *prog, JCR *jcr)
 
 }
 
-/* 
- * This code is running on a non-Win32 machine 
- */
+
 bool is_restore_stream_supported(int stream)
 {
    /* No Win32 backup on this machine */
-     switch (stream) {
+   switch (stream) {
 #ifndef HAVE_LIBZ
    case STREAM_GZIP_DATA:
    case STREAM_SPARSE_GZIP_DATA:
-   case STREAM_WIN32_GZIP_DATA:    
 #endif
+   case STREAM_WIN32_DATA:
+   case STREAM_WIN32_GZIP_DATA:
 #ifndef HAVE_DARWIN_OS
    case STREAM_MACOS_FORK_DATA:
    case STREAM_HFSPLUS_ATTRIBUTES:
@@ -716,42 +552,56 @@ bool is_restore_stream_supported(int stream)
 #ifdef HAVE_LIBZ
    case STREAM_GZIP_DATA:
    case STREAM_SPARSE_GZIP_DATA:
-   case STREAM_WIN32_GZIP_DATA:    
 #endif
-   case STREAM_WIN32_DATA:
    case STREAM_UNIX_ATTRIBUTES:
    case STREAM_FILE_DATA:
-   case STREAM_MD5_DIGEST:
+   case STREAM_MD5_SIGNATURE:
    case STREAM_UNIX_ATTRIBUTES_EX:
    case STREAM_SPARSE_DATA:
    case STREAM_PROGRAM_NAMES:
    case STREAM_PROGRAM_DATA:
-   case STREAM_SHA1_DIGEST:
-#ifdef HAVE_SHA2
-   case STREAM_SHA256_DIGEST:
-   case STREAM_SHA512_DIGEST:
-#endif
-#ifdef HAVE_CRYPTO
-   case STREAM_SIGNED_DIGEST:
-   case STREAM_ENCRYPTED_FILE_DATA:
-   case STREAM_ENCRYPTED_FILE_GZIP_DATA:
-   case STREAM_ENCRYPTED_WIN32_DATA:
-   case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
-#endif
+   case STREAM_SHA1_SIGNATURE:
 #ifdef HAVE_DARWIN_OS
    case STREAM_MACOS_FORK_DATA:
    case STREAM_HFSPLUS_ATTRIBUTES:
-#ifdef HAVE_CRYPTO
-   case STREAM_ENCRYPTED_MACOS_FORK_DATA:
-#endif /* HAVE_CRYPTO */
-#endif /* HAVE_DARWIN_OS */
-   case 0:   /* compatibility with old tapes */
+#endif
+   case 0:                            /* compatibility with old tapes */
       return true;
 
    }
-   return false;
+   return 0;
 }
 
+/* Old file reader code */
+#ifdef xxx
+   if (bfd->prog) {
+      POOLMEM *ecmd = get_pool_memory(PM_FNAME);
+      ecmd = edit_job_codes(bfd->jcr, ecmd, bfd->prog, fname);
+      const char *pmode;
+      if (flags & O_RDONLY) {
+         pmode = "r";
+      } else {
+         pmode = "w";
+      }
+      bfd->bpipe = open_bpipe(ecmd, 0, pmode);
+      if (bfd->bpipe == NULL) {
+         bfd->berrno = errno;
+         bfd->fid = -1;
+         free_pool_memory(ecmd);
+         return -1;
+      }
+      free_pool_memory(ecmd);
+      if (flags & O_RDONLY) {
+         bfd->fid = fileno(bfd->bpipe->rfd);
+      } else {
+         bfd->fid = fileno(bfd->bpipe->wfd);
+      }
+      errno = 0;
+      return bfd->fid;
+   }
+#endif
+
+
 int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 {
    /* Open reader/writer program */
@@ -765,10 +615,6 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
    bfd->berrno = errno;
    Dmsg1(400, "Open file %d\n", bfd->fid);
    errno = bfd->berrno;
-
-   bfd->win32DecompContext.bIsInData = false;
-   bfd->win32DecompContext.liNextHeader = 0;
-
    return bfd->fid;
 }
 
index dc724fa7d431e27e94b32d9295c4b99cc54cd2e1..1177dece37ec6ab1907ecc5053db7b501d338e5f 100644 (file)
@@ -6,17 +6,22 @@
  *     Kern Sibbald May MMIII
  */
 /*
-   Copyright (C) 2003-2005 Kern Sibbald
+   Copyright (C) 2000-2005 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.
+   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.
 
    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.
+   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.
 
  */
 
@@ -36,28 +41,6 @@ struct Python_IO {
 };
 #endif
 
-
-/* this should physically correspond to WIN32_STREAM_ID
- * from winbase.h on Win32. We didn't inlcude cStreamName
- * as we don't use it and don't need it for a correct struct size.
- */
-
-#define WIN32_BACKUP_DATA 1
-
-typedef struct _BWIN32_STREAM_ID {
-        int32_t        dwStreamId;
-        int32_t        dwStreamAttributes;
-        int64_t        Size;
-        int32_t        dwStreamNameSize;        
-} BWIN32_STREAM_ID, *LPBWIN32_STREAM_ID ;
-
-
-typedef struct _PROCESS_WIN32_BACKUPAPIBLOCK_CONTEXT {
-        int64_t          liNextHeader;
-        bool             bIsInData;
-        BWIN32_STREAM_ID header_stream;        
-} PROCESS_WIN32_BACKUPAPIBLOCK_CONTEXT;
-
 /*  =======================================================
  *
  *   W I N D O W S
@@ -91,8 +74,6 @@ struct BFILE {
    char *prog;                        /* reader/writer program if any */
    JCR *jcr;                          /* jcr for editing job codes */
    Python_IO pio;                     /* Python I/O routines */
-   PROCESS_WIN32_BACKUPAPIBLOCK_CONTEXT win32DecompContext; /* context for decomposition of win32 backup streams */
-   int use_backup_decomp;             /* set if using BackupRead Stream Decomposition */
 };
 
 HANDLE bget_handle(BFILE *bfd);
@@ -113,8 +94,6 @@ struct BFILE {
    char *prog;                        /* reader/writer program if any */
    JCR *jcr;                          /* jcr for editing job codes */
    Python_IO pio;                     /* Python I/O routines */
-   PROCESS_WIN32_BACKUPAPIBLOCK_CONTEXT win32DecompContext; /* context for decomposition of win32 backup streams */
-   int use_backup_decomp;             /* set if using BackupRead Stream Decomposition */
 };
 
 #endif
@@ -139,6 +118,4 @@ ssize_t bwrite(BFILE *bfd, void *buf, size_t count);
 off_t   blseek(BFILE *bfd, off_t offset, int whence);
 const char   *stream_to_ascii(int stream);
 
-bool processWin32BackupAPIBlock (BFILE *bfd, void *pBuffer, ssize_t dwSize);
-
 #endif /* __BFILE_H */
index 7eef249f354f7317c699b7451f2a47f8b53216c7..df23f85635d7c15689b82f7ababe1511be010046 100644 (file)
@@ -83,20 +83,20 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
       switch (replace) {
       case REPLACE_IFNEWER:
          if (attr->statp.st_mtime <= mstatp.st_mtime) {
-            Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not newer: %s\n"), attr->ofname);
+            Jmsg(jcr, M_SKIPPED, 0, _("File skipped. Not newer: %s\n"), attr->ofname);
             return CF_SKIP;
          }
          break;
 
       case REPLACE_IFOLDER:
          if (attr->statp.st_mtime >= mstatp.st_mtime) {
-            Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not older: %s\n"), attr->ofname);
+            Jmsg(jcr, M_SKIPPED, 0, _("File skipped. Not older: %s\n"), attr->ofname);
             return CF_SKIP;
          }
          break;
 
       case REPLACE_NEVER:
-         Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname);
+         Jmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname);
          return CF_SKIP;
 
       case REPLACE_ALWAYS:
@@ -117,11 +117,11 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
        *  we may blow away a FIFO that is being used to read the
        *  restore data, or we may blow away a partition definition.
        */
-      if (exists && attr->type != FT_RAW) {
+      if (exists && attr->type != FT_RAW && attr->type != FT_FIFO) {
          /* Get rid of old copy */
          if (unlink(attr->ofname) == -1) {
             berrno be;
-            Qmsg(jcr, M_ERROR, 0, _("File %s already exists and could not be replaced. ERR=%s.\n"),
+            Jmsg(jcr, M_ERROR, 0, _("File %s already exists and could not be replaced. ERR=%s.\n"),
                attr->ofname, be.strerror());
             /* Continue despite error */
          }
@@ -173,7 +173,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
          }
          Dmsg1(50, "Create file: %s\n", attr->ofname);
          if (is_bopen(bfd)) {
-            Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
+            Jmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
             bclose(bfd);
          }
          /*
@@ -195,7 +195,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
                attr->ofname[pnl] = 0;                 /* terminate path */
                Dmsg1(000, "Do chdir %s\n", attr->ofname);
                if (save_cwd(&cwd) != 0) {
-                  Qmsg0(jcr, M_ERROR, 0, _("Could not save_dirn"));
+                  Jmsg0(jcr, M_ERROR, 0, _("Could not save_dirn"));
                   attr->ofname[pnl] = savechr;
                   return CF_ERROR;
                }
@@ -204,7 +204,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
                   *e = 0;
                   if (chdir(p) < 0) {
                      berrno be;
-                     Qmsg2(jcr, M_ERROR, 0, _("Could not chdir to %s: ERR=%s\n"),
+                     Jmsg2(jcr, M_ERROR, 0, _("Could not chdir to %s: ERR=%s\n"),
                            attr->ofname, be.strerror());
                      restore_cwd(&cwd, NULL, NULL);
                      free_cwd(&cwd);
@@ -217,7 +217,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
                }
                if (chdir(p) < 0) {
                   berrno be;
-                  Qmsg2(jcr, M_ERROR, 0, _("Could not chdir to %s: ERR=%s\n"),
+                  Jmsg2(jcr, M_ERROR, 0, _("Could not chdir to %s: ERR=%s\n"),
                         attr->ofname, be.strerror());
                   restore_cwd(&cwd, NULL, NULL);
                   free_cwd(&cwd);
@@ -237,7 +237,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
                   return CF_EXTRACT;
                }
             }
-            Qmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"),
+            Jmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"),
                   attr->ofname, be.strerror(bfd->berrno));
             return CF_ERROR;
          }
@@ -250,7 +250,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
             Dmsg1(200, "Restore fifo: %s\n", attr->ofname);
             if (mkfifo(attr->ofname, attr->statp.st_mode) != 0 && errno != EEXIST) {
                berrno be;
-               Qmsg2(jcr, M_ERROR, 0, _("Cannot make fifo %s: ERR=%s\n"),
+               Jmsg2(jcr, M_ERROR, 0, _("Cannot make fifo %s: ERR=%s\n"),
                      attr->ofname, be.strerror());
                return CF_ERROR;
             }
@@ -258,7 +258,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
             Dmsg1(200, "Restore node: %s\n", attr->ofname);
             if (mknod(attr->ofname, attr->statp.st_mode, attr->statp.st_rdev) != 0 && errno != EEXIST) {
                berrno be;
-               Qmsg2(jcr, M_ERROR, 0, _("Cannot make node %s: ERR=%s\n"),
+               Jmsg2(jcr, M_ERROR, 0, _("Cannot make node %s: ERR=%s\n"),
                      attr->ofname, be.strerror());
                return CF_ERROR;
             }
@@ -274,12 +274,12 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
                tid = NULL;
             }
             if (is_bopen(bfd)) {
-               Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
+               Jmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
             }
             if ((bopen(bfd, attr->ofname, mode, 0)) < 0) {
                berrno be;
                be.set_errno(bfd->berrno);
-               Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
+               Jmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
                      attr->ofname, be.strerror());
                stop_thread_timer(tid);
                return CF_ERROR;
@@ -294,7 +294,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
          Dmsg2(130, "FT_LNK should restore: %s -> %s\n", attr->ofname, attr->olname);
          if (symlink(attr->olname, attr->ofname) != 0 && errno != EEXIST) {
             berrno be;
-            Qmsg3(jcr, M_ERROR, 0, _("Could not symlink %s -> %s: ERR=%s\n"),
+            Jmsg3(jcr, M_ERROR, 0, _("Could not symlink %s -> %s: ERR=%s\n"),
                   attr->ofname, attr->olname, be.strerror());
             return CF_ERROR;
          }
@@ -304,7 +304,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
          Dmsg2(130, "Hard link %s => %s\n", attr->ofname, attr->olname);
          if (link(attr->olname, attr->ofname) != 0) {
             berrno be;
-            Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
+            Jmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
                   attr->ofname, attr->olname, be.strerror());
             return CF_ERROR;
          }
@@ -325,7 +325,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
        */
       if (!is_portable_backup(bfd)) {
          if (is_bopen(bfd)) {
-            Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
+            Jmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
          }
          if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) {
             berrno be;
@@ -336,7 +336,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
                return CF_SKIP;
             }
 #endif
-            Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
+            Jmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
                   attr->ofname, be.strerror());
             return CF_ERROR;
          }
@@ -355,10 +355,10 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
    case FT_NORECURSE:
    case FT_NOFSCHG:
    case FT_NOOPEN:
-      Qmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type);
+      Jmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type);
       break;
    default:
-      Qmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname);
+      Jmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname);
       break;
    }
    return CF_ERROR;
@@ -371,25 +371,35 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
  */
 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile)
 {
-   char *f, *p;
+   char *f, *p, *q;
    int fnl, pnl;
 
    /* Separate pathname and filename */
-   for (p=f=ofile; *p; p++) {
+   for (q=p=f=ofile; *p; p++) {
       if (*p == '/') {
-         f = p;                    /* possible filename */
+         f = q;                    /* possible filename */
       }
+#ifdef HAVE_WIN32
+      if (*p == '\\') {            /* strip backslashes on Win32 */
+         continue;
+      }
+      *q++ = *p;                   /* copy data */
+#else
+      q++;
+#endif
    }
+
    if (*f == '/') {
       f++;
    }
+   *q = 0;                         /* terminate string */
 
-   fnl = p - f;
+   fnl = q - f;
    if (fnl == 0) {
       /* The filename length must not be zero here because we
        *  are dealing with a file (i.e. FT_REGE or FT_REG).
        */
-      Qmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname);
+      Jmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname);
       return -1;
    }
    pnl = f - ofile - 1;
@@ -408,7 +418,7 @@ static int path_already_seen(JCR *jcr, char *path, int pnl)
    if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) {
       return 1;
    }
-   pm_strcpy(&jcr->cached_path, path);
+   pm_strcpy(jcr->cached_path, path);
    jcr->cached_pnl = pnl;
    return 0;
 }
index 5d1fda292552d79194f97b56bf3ddf1ed9adc5d1..1565234489e523ad37da81eaf9dc8d83ef5ca535 100644 (file)
@@ -10,7 +10,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   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
@@ -38,13 +38,7 @@ int32_t path_max;              /* path name max length */
 static int our_callback(FF_PKT *ff, void *hpkt, bool top_level);
 static bool accept_file(FF_PKT *ff);
 
-/* Fold case in fnmatch() on Win32 */
-#ifdef WIN32
-static const int fnmode = FNM_CASEFOLD;
-#else
 static const int fnmode = 0;
-#endif
-
 
 /*
  * Initialize the find files "global" variables
@@ -242,7 +236,6 @@ static bool accept_file(FF_PKT *ff)
             return true;              /* accept file */
          }
       }
-#ifndef WIN32
       if (S_ISDIR(ff->statp.st_mode)) {
          for (k=0; k<fo->regexdir.size(); k++) {
             const int nmatch = 30;
@@ -276,7 +269,6 @@ static bool accept_file(FF_PKT *ff)
             return true;              /* accept file */
          }
       }
-#endif
       /*
        * If we have an empty Options clause with exclude, then
        *  exclude the file
index d5487aa539b46685aa3aa1a83f53b4c5972de07e..f71c573eb925541c37b76dcd2e36af2fea573a7b 100755 (executable)
@@ -4,7 +4,7 @@
  *     Kern Sibbald MMI
  */
 /*
-   Copyright (C) 2001-2005 Kern Sibbald
+   Copyright (C) 2001-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
@@ -43,7 +43,9 @@ struct utimbuf {
 
 #include "lib/fnmatch.h"
 
-#ifdef HAVE_REGEX_H
+#ifndef HAVE_REGEX_H
+#include "lib/bregex.h"
+#else
 #include <regex.h>
 #endif
 
@@ -170,7 +172,7 @@ struct HFSPLUS_INFO {
  * first argument to the find_files callback subroutine.
  */
 struct FF_PKT {
-   char *fname;                       /* filename */
+   char *fname;                       /* full filename */
    char *link;                        /* link if file linked */
    POOLMEM *sys_fname;                /* system filename */
    struct stat statp;                 /* stat packet */
index d1324549a1bb704da3096cd1c26df559e09c9073..37844ba1f1a9792667fc0c3333f01d77fc2fd8e8 100644 (file)
@@ -6,4 +6,3 @@ gnome-console.conf
 2
 3
 main.c
-static-gnome-console
index 5a4c28f3d2a90308b5b947e9ea091873bae218b9..89f63722e2ffd100a448830e94e07ff14f80896a 100644 (file)
@@ -42,6 +42,8 @@ CONS_INC=$(GNOME_INCLUDEDIR)
 CONS_LIBS=$(GNOME_LIBS)
 CONS_LDFLAGS=$(GNOME_LIBDIR) $(GNOMEUI_LIBS)
 
+OPENSSL_INC=@OPENSSL_INC@
+OPENSSL_LIBS=@OPENSSL_LIBS@
 
 .SUFFIXES:     .c .o
 .PHONY:
@@ -49,7 +51,7 @@ CONS_LDFLAGS=$(GNOME_LIBDIR) $(GNOMEUI_LIBS)
 
 # inference rules
 .c.o:
-       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) $(CONS_INC) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $<
+       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) $(CONS_INC) $(OPENSSL_INC) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $<
 #-------------------------------------------------------------------------
 all: Makefile gnome-console @STATIC_GNOME_CONS@
        @echo "==== Make of gnome-console is good ===="
@@ -59,17 +61,17 @@ support.o:   support.c
        rm -f support.c.orig
        mv support.c support.c.orig
        sed "s%parent = g_object_get_data%parent = \(GtkWidget \*\)g_object_get_data%" support.c.orig >support.c
-       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) $(CONS_INC) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $<
+       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) $(CONS_INC) $(OPENSSL_INC) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $<
 
 gnome-console: $(CONSOBJS) ../lib/libbac.a 
        $(CXX) $(LDFLAGS) $(CONS_LDFLAGS) -L../lib -o $@ $(CONSOBJS) \
-             $(LIBS) $(DLIB) $(CONS_LIBS) -lbac -lm
+             $(LIBS) $(DLIB) $(CONS_LIBS) -lbac -lm $(OPENSSL_LIBS)
 
 static-console: static-gnome-console
 
 static-gnome-console: $(CONSOBJS) ../lib/libbac.a 
        $(CXX) $(LDFLAGS) $(CONS_LDFLAGS) -L../lib -o $@ $(CONSOBJS) \
-             $(LIBS) $(DLIB) $(CONS_LIBS) -lbac -lm 
+             $(LIBS) $(DLIB) $(CONS_LIBS) -lbac -lm $(OPENSSL_LIBS)
        strip $@
 
 Makefile: $(srcdir)/Makefile.in $(topdir)/config.status
@@ -122,7 +124,7 @@ depend:
        @$(MV) Makefile Makefile.bak
        @$(SED) "/^# DO NOT DELETE:/,$$ d" Makefile.bak > Makefile
        @$(ECHO) "# DO NOT DELETE: nice dependency list follows" >> Makefile
-       @$(CXX) -S -M $(CPPFLAGS) $(XINC) -I$(srcdir) -I$(basedir) $(GNOME_INCLUDEDIR) $(SQL_INC) *.c >> Makefile
+       @$(CXX) -S -M $(CPPFLAGS) $(XINC) $(OPENSSL_INC) -I$(srcdir) -I$(basedir) $(GNOME_INCLUDEDIR) $(SQL_INC) *.c >> Makefile
        @if test -f Makefile ; then \
            $(RMF) Makefile.bak; \
        else \
index e46b575e714deac6a81a0737e722d24cb89d7ecc..dca9b7aa123e1ac36a3aa198c25821ae26db21fb 100644 (file)
@@ -704,3 +704,9 @@ on_restore_job_entry_changed(GtkEditable *editable, gpointer user_data)
    /* Set defaults that correspond to new job selection */
    set_restore_dialog_defaults();
 }
+
+void
+on_dir_button_clicked(GtkToolButton *toolbutton, gpointer user_data)
+{
+   write_director("status dir");
+}
index febb2f5f4b16ac20c0bb58988f30de411ca156fb..290e4f8d96c337d1f0f6e7e6a8c8dd4cefc4a4c6 100644 (file)
@@ -340,3 +340,7 @@ on_select_files_button_clicked         (GtkButton       *button,
 void
 on_restore_cancel_clicked              (GtkButton       *button,
                                        gpointer         user_data);
+
+void
+on_dir_button_clicked                  (GtkToolButton   *toolbutton,
+                                        gpointer         user_data);
index 17643ef706d9442e83e511006e5344295c67a856..38fc765ac94be74363b44cdf143044cdb991fd9b 100644 (file)
@@ -267,8 +267,8 @@ int main(int argc, char *argv[])
 
    parse_config(configfile);
 
-   if (init_crypto() != 0) {
-      Emsg0(M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
+   if (init_tls() != 0) {
+      Emsg0(M_ERROR_TERM, 0, _("TLS library initialization failed.\n"));
    }
 
    if (!check_resources()) {
@@ -672,7 +672,7 @@ void terminate_console(int sig)
    if (already_here)                  /* avoid recursive temination problems */
       exit(1);
    already_here = true;
-   cleanup_crypto();
+   cleanup_tls();
    disconnect_from_director((gpointer)NULL);
    gtk_main_quit();
    exit(0);
index fa9561ff65d84d6df233e5e2cfa367046a06b713..ac4ad05fcecf36e9909061e017f2e8fdcaba9d24 100644 (file)
@@ -69,8 +69,8 @@ static RES_ITEM dir_items[] = {
    {"dirport",     store_int,      ITEM(dir_res.DIRport),  0, ITEM_DEFAULT, 9101},
    {"address",     store_str,      ITEM(dir_res.address),  0, ITEM_REQUIRED, 0},
    {"password",    store_password, ITEM(dir_res.password), 0, 0, 0},
-   {"tlsenable",      store_bit,     ITEM(dir_res.tls_enable), 1, 0, 0},
-   {"tlsrequire",     store_bit,     ITEM(dir_res.tls_require), 1, 0, 0},
+   {"tlsenable",      store_yesno,     ITEM(dir_res.tls_enable), 1, 0, 0},
+   {"tlsrequire",     store_yesno,     ITEM(dir_res.tls_require), 1, 0, 0},
    {"tlscacertificatefile", store_dir, ITEM(dir_res.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir", store_dir,  ITEM(dir_res.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate", store_dir,       ITEM(dir_res.tls_certfile), 0, 0, 0},
@@ -82,8 +82,8 @@ static RES_ITEM con_items[] = {
    {"name",        store_name,     ITEM(con_res.hdr.name), 0, ITEM_REQUIRED, 0},
    {"description", store_str,      ITEM(con_res.hdr.desc), 0, 0, 0},
    {"password",    store_password, ITEM(con_res.password), 0, ITEM_REQUIRED, 0},
-   {"tlsenable",      store_bit,     ITEM(con_res.tls_enable), 1, 0, 0},
-   {"tlsrequire",     store_bit,     ITEM(con_res.tls_require), 1, 0, 0},
+   {"tlsenable",      store_yesno,     ITEM(con_res.tls_enable), 1, 0, 0},
+   {"tlsrequire",     store_yesno,     ITEM(con_res.tls_require), 1, 0, 0},
    {"tlscacertificatefile", store_dir, ITEM(con_res.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir", store_dir,  ITEM(con_res.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate", store_dir,       ITEM(con_res.tls_certfile), 0, 0, 0},
@@ -95,7 +95,7 @@ static RES_ITEM con_font_items[] = {
    {"name",        store_name,     ITEM(con_font.hdr.name), 0, ITEM_REQUIRED, 0},
    {"description", store_str,      ITEM(con_font.hdr.desc), 0, 0, 0},
    {"font",        store_str,      ITEM(con_font.fontface), 0, 0, 0},
-   {"requiressl",  store_bit,    ITEM(con_font.require_ssl), 1, ITEM_DEFAULT, 0},
+   {"requiressl",  store_yesno,    ITEM(con_font.require_ssl), 1, ITEM_DEFAULT, 0},
    {NULL, NULL, NULL, 0, 0, 0}
 };
 
index 86b61c6806dee66a79dd4e694bb1dc58d2955b6f..c55e895828d882b9fd9f3bc31750374a9aec7799 100644 (file)
 static GnomeUIInfo file1_menu_uiinfo[] =
 {
   {
-    GNOME_APP_UI_ITEM, _("_Connect"),
-    _("Connect to Director"),
+    GNOME_APP_UI_ITEM, N_("_Connect"),
+    N_("Connect to Director"),
     (gpointer) on_connect_activate, NULL, NULL,
     GNOME_APP_PIXMAP_NONE, NULL,
     0, (GdkModifierType) 0, NULL
   },
   {
-    GNOME_APP_UI_ITEM, _("_Disconnect"),
-    _("Disconnect from Director"),
+    GNOME_APP_UI_ITEM, N_("_Disconnect"),
+    N_("Disconnect from Director"),
     (gpointer) on_disconnect_activate, NULL, NULL,
     GNOME_APP_PIXMAP_NONE, NULL,
     0, (GdkModifierType) 0, NULL
@@ -90,7 +90,7 @@ static GnomeUIInfo edit1_menu_uiinfo[] =
 static GnomeUIInfo item1_menu_uiinfo[] =
 {
   {
-    GNOME_APP_UI_ITEM, _("_Display Messages"),
+    GNOME_APP_UI_ITEM, N_("_Display Messages"),
     NULL,
     (gpointer) on_msgs_activate, NULL, NULL,
     GNOME_APP_PIXMAP_NONE, NULL,
@@ -126,35 +126,35 @@ static GnomeUIInfo help1_menu_uiinfo[] =
 static GnomeUIInfo menubar1_uiinfo[] =
 {
   {
-    GNOME_APP_UI_SUBTREE, _("_File"),
+    GNOME_APP_UI_SUBTREE, N_("_File"),
     NULL,
     file1_menu_uiinfo, NULL, NULL,
     GNOME_APP_PIXMAP_NONE, NULL,
     0, (GdkModifierType) 0, NULL
   },
   {
-    GNOME_APP_UI_SUBTREE,_("_Edit"),
+    GNOME_APP_UI_SUBTREE, N_("_Edit"),
     NULL,
     edit1_menu_uiinfo, NULL, NULL,
     GNOME_APP_PIXMAP_NONE, NULL,
     0, (GdkModifierType) 0, NULL
   },
   {
-    GNOME_APP_UI_SUBTREE, _("_View"),
-    _("Display Messages"),
+    GNOME_APP_UI_SUBTREE, N_("_View"),
+    N_("Display Messages"),
     item1_menu_uiinfo, NULL, NULL,
     GNOME_APP_PIXMAP_NONE, NULL,
     0, (GdkModifierType) 0, NULL
   },
   {
-    GNOME_APP_UI_SUBTREE, _("_Settings"),
+    GNOME_APP_UI_SUBTREE, N_("_Settings"),
     NULL,
     settings1_menu_uiinfo, NULL, NULL,
     GNOME_APP_PIXMAP_NONE, NULL,
     0, (GdkModifierType) 0, NULL
   },
   {
-    GNOME_APP_UI_SUBTREE, _("_Help"),
+    GNOME_APP_UI_SUBTREE, N_("_Help"),
     NULL,
     help1_menu_uiinfo, NULL, NULL,
     GNOME_APP_PIXMAP_NONE, NULL,
@@ -172,12 +172,14 @@ create_console (void)
   GtkWidget *menubar1;
   GtkWidget *handlebox2;
   GtkWidget *toolbar2;
-  GtkWidget *tmp_toolbar_icon;
+  GtkIconSize tmp_toolbar_icon_size;
+  GtkWidget *tmp_image;
   GtkWidget *connect_button1;
   GtkWidget *run_button1;
-  GtkWidget *msgs_button;
+  GtkWidget *dir_button;
   GtkWidget *restore_button;
   GtkWidget *label_button;
+  GtkWidget *msgs_button;
   GtkWidget *vbox7;
   GtkWidget *scroll1;
   GtkWidget *text1;
@@ -189,10 +191,13 @@ create_console (void)
   GtkWidget *label39;
   GtkWidget *frame2;
   GtkWidget *status1;
+  GtkAccelGroup *accel_group;
   GtkTooltips *tooltips;
 
   tooltips = gtk_tooltips_new ();
 
+  accel_group = gtk_accel_group_new ();
+
   console = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title (GTK_WINDOW (console), _("Bacula Console"));
   gtk_window_set_position (GTK_WINDOW (console), GTK_WIN_POS_CENTER);
@@ -211,7 +216,7 @@ create_console (void)
   gtk_widget_show (menubar1);
   gtk_container_add (GTK_CONTAINER (handlebox1), menubar1);
   gnome_app_fill_menu (GTK_MENU_SHELL (menubar1), menubar1_uiinfo,
-                      NULL, FALSE, 0);
+                       accel_group, FALSE, 0);
 
   handlebox2 = gtk_handle_box_new ();
   gtk_widget_show (handlebox2);
@@ -223,56 +228,46 @@ create_console (void)
   gtk_container_add (GTK_CONTAINER (handlebox2), toolbar2);
   gtk_container_set_border_width (GTK_CONTAINER (toolbar2), 1);
   gtk_toolbar_set_style (GTK_TOOLBAR (toolbar2), GTK_TOOLBAR_BOTH);
+  tmp_toolbar_icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2));
 
-  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-new", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
-  connect_button1 = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
-                               GTK_TOOLBAR_CHILD_BUTTON,
-                               NULL,
-                               _("Connect"),
-                               _("Connect to Director"), NULL,
-                               tmp_toolbar_icon, NULL, NULL);
-  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
+  tmp_image = gtk_image_new_from_stock ("gtk-disconnect", tmp_toolbar_icon_size);
+  gtk_widget_show (tmp_image);
+  connect_button1 = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Connect"));
   gtk_widget_show (connect_button1);
+  gtk_container_add (GTK_CONTAINER (toolbar2), connect_button1);
+  gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (connect_button1), tooltips, _("Connect to Director"), NULL);
 
-  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-execute", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
-  run_button1 = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
-                               GTK_TOOLBAR_CHILD_BUTTON,
-                               NULL,
-                               _("Run"),
-                               _("Run a Job"), NULL,
-                               tmp_toolbar_icon, NULL, NULL);
-  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
+  tmp_image = gtk_image_new_from_stock ("gtk-execute", tmp_toolbar_icon_size);
+  gtk_widget_show (tmp_image);
+  run_button1 = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Run"));
   gtk_widget_show (run_button1);
-
-  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-find", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
-  msgs_button = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
-                               GTK_TOOLBAR_CHILD_BUTTON,
-                               NULL,
-                               _("Msgs"),
-                               _("Display Messages"), NULL,
-                               tmp_toolbar_icon, NULL, NULL);
-  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
-  gtk_widget_show (msgs_button);
-
-  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-revert-to-saved", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
-  restore_button = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
-                               GTK_TOOLBAR_CHILD_BUTTON,
-                               NULL,
-                               _("Restore"),
-                               NULL, NULL,
-                               tmp_toolbar_icon, NULL, NULL);
-  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
+  gtk_container_add (GTK_CONTAINER (toolbar2), run_button1);
+  gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (run_button1), tooltips, _("Run a Job"), NULL);
+
+  tmp_image = gtk_image_new_from_stock ("gnome-stock-text-bulleted-list", tmp_toolbar_icon_size);
+  gtk_widget_show (tmp_image);
+  dir_button = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Dir Status"));
+  gtk_widget_show (dir_button);
+  gtk_container_add (GTK_CONTAINER (toolbar2), dir_button);
+
+  tmp_image = gtk_image_new_from_stock ("gtk-revert-to-saved", tmp_toolbar_icon_size);
+  gtk_widget_show (tmp_image);
+  restore_button = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Restore"));
   gtk_widget_show (restore_button);
+  gtk_container_add (GTK_CONTAINER (toolbar2), restore_button);
 
-  tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-save-as", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)));
-  label_button = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
-                               GTK_TOOLBAR_CHILD_BUTTON,
-                               NULL,
-                               _("Label"),
-                               NULL, NULL,
-                               tmp_toolbar_icon, NULL, NULL);
-  gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar2)->children)->data))->label), TRUE);
+  tmp_image = gtk_image_new_from_stock ("gtk-save-as", tmp_toolbar_icon_size);
+  gtk_widget_show (tmp_image);
+  label_button = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Label"));
   gtk_widget_show (label_button);
+  gtk_container_add (GTK_CONTAINER (toolbar2), label_button);
+
+  tmp_image = gtk_image_new_from_stock ("gtk-find", tmp_toolbar_icon_size);
+  gtk_widget_show (tmp_image);
+  msgs_button = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Msgs"));
+  gtk_widget_show (msgs_button);
+  gtk_container_add (GTK_CONTAINER (toolbar2), msgs_button);
+  gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (msgs_button), tooltips, _("Display Messages"), NULL);
 
   vbox7 = gtk_vbox_new (FALSE, 0);
   gtk_widget_show (vbox7);
@@ -299,6 +294,7 @@ create_console (void)
   label38 = gtk_label_new (_(" Command: "));
   gtk_widget_show (label38);
   gtk_box_pack_start (GTK_BOX (hbox18), label38, FALSE, TRUE, 0);
+  gtk_label_set_justify (GTK_LABEL (label38), GTK_JUSTIFY_CENTER);
 
   entry1 = gtk_entry_new ();
   gtk_widget_show (entry1);
@@ -318,6 +314,7 @@ create_console (void)
   label39 = gtk_label_new (_(" Status: "));
   gtk_widget_show (label39);
   gtk_container_add (GTK_CONTAINER (frame1), label39);
+  gtk_label_set_justify (GTK_LABEL (label39), GTK_JUSTIFY_CENTER);
 
   frame2 = gtk_frame_new (NULL);
   gtk_widget_show (frame2);
@@ -326,33 +323,35 @@ create_console (void)
   status1 = gtk_label_new (_("  "));
   gtk_widget_show (status1);
   gtk_container_add (GTK_CONTAINER (frame2), status1);
-  gtk_label_set_justify (GTK_LABEL (status1), GTK_JUSTIFY_LEFT);
   gtk_misc_set_alignment (GTK_MISC (status1), 0, 0.5);
 
   g_signal_connect ((gpointer) console, "delete_event",
-                   G_CALLBACK (on_console_delete_event),
-                   NULL);
+                    G_CALLBACK (on_console_delete_event),
+                    NULL);
   g_signal_connect ((gpointer) connect_button1, "clicked",
-                   G_CALLBACK (on_connect_button_clicked),
-                   NULL);
+                    G_CALLBACK (on_connect_button_clicked),
+                    NULL);
   g_signal_connect ((gpointer) run_button1, "clicked",
-                   G_CALLBACK (on_run_button_clicked),
-                   NULL);
-  g_signal_connect ((gpointer) msgs_button, "clicked",
-                   G_CALLBACK (on_msgs_button_clicked),
-                   NULL);
+                    G_CALLBACK (on_run_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) dir_button, "clicked",
+                    G_CALLBACK (on_dir_button_clicked),
+                    NULL);
   g_signal_connect ((gpointer) restore_button, "clicked",
-                   G_CALLBACK (on_restore_button_clicked),
-                   NULL);
+                    G_CALLBACK (on_restore_button_clicked),
+                    NULL);
   g_signal_connect ((gpointer) label_button, "clicked",
-                   G_CALLBACK (on_label_button_clicked),
-                   NULL);
+                    G_CALLBACK (on_label_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) msgs_button, "clicked",
+                    G_CALLBACK (on_msgs_button_clicked),
+                    NULL);
   g_signal_connect ((gpointer) entry1, "key_press_event",
-                   G_CALLBACK (on_entry1_key_press_event),
-                   NULL);
+                    G_CALLBACK (on_entry1_key_press_event),
+                    NULL);
   g_signal_connect ((gpointer) entry1, "key_release_event",
-                   G_CALLBACK (on_entry1_key_release_event),
-                   NULL);
+                    G_CALLBACK (on_entry1_key_release_event),
+                    NULL);
 
   /* Store pointers to all widgets, for use by lookup_widget(). */
   GLADE_HOOKUP_OBJECT_NO_REF (console, console, "console");
@@ -380,9 +379,10 @@ create_console (void)
   GLADE_HOOKUP_OBJECT (console, toolbar2, "toolbar2");
   GLADE_HOOKUP_OBJECT (console, connect_button1, "connect_button1");
   GLADE_HOOKUP_OBJECT (console, run_button1, "run_button1");
-  GLADE_HOOKUP_OBJECT (console, msgs_button, "msgs_button");
+  GLADE_HOOKUP_OBJECT (console, dir_button, "dir_button");
   GLADE_HOOKUP_OBJECT (console, restore_button, "restore_button");
   GLADE_HOOKUP_OBJECT (console, label_button, "label_button");
+  GLADE_HOOKUP_OBJECT (console, msgs_button, "msgs_button");
   GLADE_HOOKUP_OBJECT (console, vbox7, "vbox7");
   GLADE_HOOKUP_OBJECT (console, scroll1, "scroll1");
   GLADE_HOOKUP_OBJECT (console, text1, "text1");
@@ -398,6 +398,8 @@ create_console (void)
 
   gtk_widget_grab_focus (entry1);
   gtk_widget_grab_default (entry1);
+  gtk_window_add_accel_group (GTK_WINDOW (console), accel_group);
+
   return console;
 }
 
@@ -421,6 +423,7 @@ create_about1 (void)
   about1 = gtk_dialog_new ();
   gtk_window_set_title (GTK_WINDOW (about1), _("About Bacula Console"));
   gtk_window_set_modal (GTK_WINDOW (about1), TRUE);
+  gtk_window_set_type_hint (GTK_WINDOW (about1), GDK_WINDOW_TYPE_HINT_DIALOG);
 
   dialog_vbox5 = GTK_DIALOG (about1)->vbox;
   gtk_widget_show (dialog_vbox5);
@@ -436,6 +439,7 @@ create_about1 (void)
   about_head = gtk_label_new (_("Bacula Console\n"));
   gtk_widget_show (about_head);
   gtk_box_pack_start (GTK_BOX (vbox9), about_head, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (about_head), GTK_JUSTIFY_CENTER);
 
   hseparator1 = gtk_hseparator_new ();
   gtk_widget_show (hseparator1);
@@ -444,19 +448,16 @@ create_about1 (void)
   copyright = gtk_label_new (_("Copyright (c) 2000 - 2004, Kern Sibbald and John Walker"));
   gtk_widget_show (copyright);
   gtk_box_pack_start (GTK_BOX (vbox9), copyright, TRUE, FALSE, 0);
-  gtk_label_set_justify (GTK_LABEL (copyright), GTK_JUSTIFY_LEFT);
   gtk_misc_set_alignment (GTK_MISC (copyright), 0.1, 0.5);
 
   authors = gtk_label_new (_("Authors: Kern Sibbald and John Walker"));
   gtk_widget_show (authors);
   gtk_box_pack_start (GTK_BOX (vbox9), authors, TRUE, FALSE, 0);
-  gtk_label_set_justify (GTK_LABEL (authors), GTK_JUSTIFY_LEFT);
   gtk_misc_set_alignment (GTK_MISC (authors), 0.0400001, 0.5);
 
   theme = gtk_label_new (_("It comes by night and sucks the essence from your computers"));
   gtk_widget_show (theme);
   gtk_box_pack_start (GTK_BOX (vbox9), theme, TRUE, FALSE, 0);
-  gtk_label_set_justify (GTK_LABEL (theme), GTK_JUSTIFY_LEFT);
   gtk_misc_set_alignment (GTK_MISC (theme), 0.15, 0.5);
 
   dialog_action_area5 = GTK_DIALOG (about1)->action_area;
@@ -470,6 +471,7 @@ create_about1 (void)
   label44 = gtk_label_new ("");
   gtk_widget_show (label44);
   gtk_box_pack_start (GTK_BOX (hbox20), label44, TRUE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label44), GTK_JUSTIFY_CENTER);
 
   about_button = gtk_button_new_from_stock ("gtk-ok");
   gtk_widget_show (about_button);
@@ -479,8 +481,8 @@ create_about1 (void)
   GTK_WIDGET_SET_FLAGS (about_button, GTK_CAN_DEFAULT);
 
   g_signal_connect ((gpointer) about_button, "clicked",
-                   G_CALLBACK (on_about_button_clicked),
-                   NULL);
+                    G_CALLBACK (on_about_button_clicked),
+                    NULL);
 
   /* Store pointers to all widgets, for use by lookup_widget(). */
   GLADE_HOOKUP_OBJECT_NO_REF (about1, about1, "about1");
@@ -520,6 +522,7 @@ create_SelectDirectorDialog (void)
   SelectDirectorDialog = gtk_dialog_new ();
   gtk_window_set_title (GTK_WINDOW (SelectDirectorDialog), _("Select Director"));
   gtk_window_set_modal (GTK_WINDOW (SelectDirectorDialog), TRUE);
+  gtk_window_set_type_hint (GTK_WINDOW (SelectDirectorDialog), GDK_WINDOW_TYPE_HINT_DIALOG);
 
   dialog_vbox6 = GTK_DIALOG (SelectDirectorDialog)->vbox;
   gtk_widget_show (dialog_vbox6);
@@ -531,15 +534,17 @@ create_SelectDirectorDialog (void)
   label48 = gtk_label_new ("");
   gtk_widget_show (label48);
   gtk_box_pack_start (GTK_BOX (vbox10), label48, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label48), GTK_JUSTIFY_CENTER);
   gtk_misc_set_alignment (GTK_MISC (label48), 0.48, 0.46);
 
   label47 = gtk_label_new (_("Select Director"));
   gtk_widget_show (label47);
   gtk_box_pack_start (GTK_BOX (vbox10), label47, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label47), GTK_JUSTIFY_CENTER);
 
   combo1 = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo1)->popwin),
-                    "GladeParentKey", combo1);
+                     "GladeParentKey", combo1);
   gtk_widget_show (combo1);
   gtk_box_pack_start (GTK_BOX (vbox10), combo1, FALSE, FALSE, 0);
   gtk_container_set_border_width (GTK_CONTAINER (combo1), 6);
@@ -562,9 +567,10 @@ create_SelectDirectorDialog (void)
   gtk_widget_show (button11);
   gtk_box_pack_start (GTK_BOX (hbox21), button11, FALSE, FALSE, 0);
 
-  label46 = gtk_label_new ("         ");
+  label46 = gtk_label_new (_("         "));
   gtk_widget_show (label46);
   gtk_box_pack_start (GTK_BOX (hbox21), label46, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label46), GTK_JUSTIFY_CENTER);
   gtk_misc_set_padding (GTK_MISC (label46), 2, 0);
 
   button13 = gtk_button_new_from_stock ("gtk-cancel");
@@ -572,11 +578,11 @@ create_SelectDirectorDialog (void)
   gtk_box_pack_start (GTK_BOX (hbox21), button13, FALSE, FALSE, 0);
 
   g_signal_connect ((gpointer) button11, "clicked",
-                   G_CALLBACK (on_select_director_OK_clicked),
-                   NULL);
+                    G_CALLBACK (on_select_director_OK_clicked),
+                    NULL);
   g_signal_connect ((gpointer) button13, "clicked",
-                   G_CALLBACK (on_select_director_cancel_clicked),
-                   NULL);
+                    G_CALLBACK (on_select_director_cancel_clicked),
+                    NULL);
 
   /* Store pointers to all widgets, for use by lookup_widget(). */
   GLADE_HOOKUP_OBJECT_NO_REF (SelectDirectorDialog, SelectDirectorDialog, "SelectDirectorDialog");
@@ -675,6 +681,7 @@ create_RunDialog (void)
 
   RunDialog = gtk_dialog_new ();
   gtk_window_set_title (GTK_WINDOW (RunDialog), _("Run a Job"));
+  gtk_window_set_type_hint (GTK_WINDOW (RunDialog), GDK_WINDOW_TYPE_HINT_DIALOG);
 
   dialog_vbox7 = GTK_DIALOG (RunDialog)->vbox;
   gtk_widget_show (dialog_vbox7);
@@ -690,6 +697,7 @@ create_RunDialog (void)
   label62 = gtk_label_new (_("Run a Job"));
   gtk_widget_show (label62);
   gtk_box_pack_start (GTK_BOX (vbox12), label62, FALSE, FALSE, 2);
+  gtk_label_set_justify (GTK_LABEL (label62), GTK_JUSTIFY_CENTER);
   gtk_misc_set_padding (GTK_MISC (label62), 0, 9);
 
   alignment1 = gtk_alignment_new (0.5, 0.5, 1, 1);
@@ -713,7 +721,7 @@ create_RunDialog (void)
 
   combo_job = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_job)->popwin),
-                    "GladeParentKey", combo_job);
+                     "GladeParentKey", combo_job);
   gtk_widget_show (combo_job);
   gtk_box_pack_start (GTK_BOX (hbox29), combo_job, TRUE, TRUE, 1);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_job), TRUE, FALSE);
@@ -728,10 +736,11 @@ create_RunDialog (void)
   label64 = gtk_label_new (_("   Type:"));
   gtk_widget_show (label64);
   gtk_box_pack_start (GTK_BOX (hbox29), label64, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label64), GTK_JUSTIFY_CENTER);
 
   combo_type = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_type)->popwin),
-                    "GladeParentKey", combo_type);
+                     "GladeParentKey", combo_type);
   gtk_widget_show (combo_type);
   gtk_box_pack_start (GTK_BOX (hbox29), combo_type, FALSE, FALSE, 0);
   gtk_widget_set_size_request (combo_type, 141, 24);
@@ -744,10 +753,9 @@ create_RunDialog (void)
   gtk_widget_show (entry_type);
   gtk_editable_set_editable (GTK_EDITABLE (entry_type), FALSE);
 
-  label114 = gtk_label_new (" ");
+  label114 = gtk_label_new (_(" "));
   gtk_widget_show (label114);
   gtk_box_pack_start (GTK_BOX (hbox28), label114, FALSE, FALSE, 30);
-  gtk_label_set_justify (GTK_LABEL (label114), GTK_JUSTIFY_LEFT);
 
   hbox30 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox30);
@@ -762,7 +770,7 @@ create_RunDialog (void)
 
   combo_client = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_client)->popwin),
-                    "GladeParentKey", combo_client);
+                     "GladeParentKey", combo_client);
   gtk_widget_show (combo_client);
   gtk_box_pack_start (GTK_BOX (hbox30), combo_client, TRUE, TRUE, 1);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_client), TRUE, FALSE);
@@ -774,9 +782,10 @@ create_RunDialog (void)
   gtk_widget_show (entry_client);
   gtk_editable_set_editable (GTK_EDITABLE (entry_client), FALSE);
 
-  label67 = gtk_label_new (" ");
+  label67 = gtk_label_new (_(" "));
   gtk_widget_show (label67);
   gtk_box_pack_start (GTK_BOX (hbox30), label67, FALSE, FALSE, 123);
+  gtk_label_set_justify (GTK_LABEL (label67), GTK_JUSTIFY_CENTER);
 
   hbox31 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox31);
@@ -792,7 +801,7 @@ create_RunDialog (void)
 
   combo_fileset = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_fileset)->popwin),
-                    "GladeParentKey", combo_fileset);
+                     "GladeParentKey", combo_fileset);
   gtk_widget_show (combo_fileset);
   gtk_box_pack_start (GTK_BOX (hbox31), combo_fileset, FALSE, FALSE, 0);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_fileset), TRUE, FALSE);
@@ -808,13 +817,11 @@ create_RunDialog (void)
   gtk_widget_show (label156);
   gtk_box_pack_start (GTK_BOX (hbox31), label156, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label156, 13, 16);
-  gtk_label_set_justify (GTK_LABEL (label156), GTK_JUSTIFY_LEFT);
 
   label155 = gtk_label_new (_("Priority:"));
   gtk_widget_show (label155);
   gtk_box_pack_start (GTK_BOX (hbox31), label155, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label155, 52, 16);
-  gtk_label_set_justify (GTK_LABEL (label155), GTK_JUSTIFY_LEFT);
 
   spinbutton1_adj = gtk_adjustment_new (10, 0, 100, 1, 10, 10);
   spinbutton1 = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton1_adj), 1, 0);
@@ -826,7 +833,6 @@ create_RunDialog (void)
   gtk_widget_show (label157);
   gtk_box_pack_start (GTK_BOX (hbox31), label157, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label157, 100, 16);
-  gtk_label_set_justify (GTK_LABEL (label157), GTK_JUSTIFY_LEFT);
 
   hbox32 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox32);
@@ -841,7 +847,7 @@ create_RunDialog (void)
 
   combo_level = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_level)->popwin),
-                    "GladeParentKey", combo_level);
+                     "GladeParentKey", combo_level);
   gtk_widget_show (combo_level);
   gtk_box_pack_start (GTK_BOX (hbox32), combo_level, TRUE, TRUE, 0);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_level), TRUE, FALSE);
@@ -854,9 +860,10 @@ create_RunDialog (void)
   gtk_widget_show (entry_level);
   gtk_editable_set_editable (GTK_EDITABLE (entry_level), FALSE);
 
-  label71 = gtk_label_new ("             ");
+  label71 = gtk_label_new (_("             "));
   gtk_widget_show (label71);
   gtk_box_pack_start (GTK_BOX (hbox32), label71, FALSE, FALSE, 100);
+  gtk_label_set_justify (GTK_LABEL (label71), GTK_JUSTIFY_CENTER);
 
   hbox33 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox33);
@@ -867,10 +874,11 @@ create_RunDialog (void)
   gtk_widget_show (label72);
   gtk_box_pack_start (GTK_BOX (hbox33), label72, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label72, 68, 16);
+  gtk_label_set_justify (GTK_LABEL (label72), GTK_JUSTIFY_CENTER);
 
   combo_pool = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_pool)->popwin),
-                    "GladeParentKey", combo_pool);
+                     "GladeParentKey", combo_pool);
   gtk_widget_show (combo_pool);
   gtk_box_pack_start (GTK_BOX (hbox33), combo_pool, TRUE, TRUE, 0);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_pool), TRUE, FALSE);
@@ -883,9 +891,10 @@ create_RunDialog (void)
   gtk_widget_show (entry_pool);
   gtk_editable_set_editable (GTK_EDITABLE (entry_pool), FALSE);
 
-  label73 = gtk_label_new ("   ");
+  label73 = gtk_label_new (_("   "));
   gtk_widget_show (label73);
   gtk_box_pack_start (GTK_BOX (hbox33), label73, FALSE, FALSE, 120);
+  gtk_label_set_justify (GTK_LABEL (label73), GTK_JUSTIFY_CENTER);
 
   hbox39 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox39);
@@ -896,10 +905,11 @@ create_RunDialog (void)
   gtk_widget_show (label96);
   gtk_box_pack_start (GTK_BOX (hbox39), label96, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label96, 68, 16);
+  gtk_label_set_justify (GTK_LABEL (label96), GTK_JUSTIFY_CENTER);
 
   combo_storage = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_storage)->popwin),
-                    "GladeParentKey", combo_storage);
+                     "GladeParentKey", combo_storage);
   gtk_widget_show (combo_storage);
   gtk_box_pack_start (GTK_BOX (hbox39), combo_storage, TRUE, TRUE, 0);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_storage), TRUE, FALSE);
@@ -912,9 +922,10 @@ create_RunDialog (void)
   gtk_widget_show (entry_storage);
   gtk_editable_set_editable (GTK_EDITABLE (entry_storage), FALSE);
 
-  label97 = gtk_label_new ("   ");
+  label97 = gtk_label_new (_("   "));
   gtk_widget_show (label97);
   gtk_box_pack_start (GTK_BOX (hbox39), label97, FALSE, FALSE, 120);
+  gtk_label_set_justify (GTK_LABEL (label97), GTK_JUSTIFY_CENTER);
 
   hbox40 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox40);
@@ -925,10 +936,11 @@ create_RunDialog (void)
   gtk_widget_show (label98);
   gtk_box_pack_start (GTK_BOX (hbox40), label98, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label98, 68, 16);
+  gtk_label_set_justify (GTK_LABEL (label98), GTK_JUSTIFY_CENTER);
 
   combo_messages = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_messages)->popwin),
-                    "GladeParentKey", combo_messages);
+                     "GladeParentKey", combo_messages);
   gtk_widget_show (combo_messages);
   gtk_box_pack_start (GTK_BOX (hbox40), combo_messages, TRUE, TRUE, 0);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_messages), TRUE, FALSE);
@@ -940,9 +952,10 @@ create_RunDialog (void)
   gtk_widget_show (entry_messages);
   gtk_editable_set_editable (GTK_EDITABLE (entry_messages), FALSE);
 
-  label99 = gtk_label_new ("   ");
+  label99 = gtk_label_new (_("   "));
   gtk_widget_show (label99);
   gtk_box_pack_start (GTK_BOX (hbox40), label99, FALSE, FALSE, 120);
+  gtk_label_set_justify (GTK_LABEL (label99), GTK_JUSTIFY_CENTER);
 
   hbox34 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox34);
@@ -953,14 +966,16 @@ create_RunDialog (void)
   gtk_widget_show (label77);
   gtk_box_pack_start (GTK_BOX (hbox34), label77, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label77, 68, 16);
+  gtk_label_set_justify (GTK_LABEL (label77), GTK_JUSTIFY_CENTER);
 
   entry_where = gtk_entry_new ();
   gtk_widget_show (entry_where);
   gtk_box_pack_start (GTK_BOX (hbox34), entry_where, TRUE, TRUE, 0);
 
-  label78 = gtk_label_new ("   ");
+  label78 = gtk_label_new (_("   "));
   gtk_widget_show (label78);
   gtk_box_pack_start (GTK_BOX (hbox34), label78, FALSE, FALSE, 120);
+  gtk_label_set_justify (GTK_LABEL (label78), GTK_JUSTIFY_CENTER);
 
   hbox41 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox41);
@@ -971,14 +986,16 @@ create_RunDialog (void)
   gtk_widget_show (label100);
   gtk_box_pack_start (GTK_BOX (hbox41), label100, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label100, 68, 16);
+  gtk_label_set_justify (GTK_LABEL (label100), GTK_JUSTIFY_CENTER);
 
   entry_when = gtk_entry_new ();
   gtk_widget_show (entry_when);
   gtk_box_pack_start (GTK_BOX (hbox41), entry_when, TRUE, TRUE, 0);
 
-  label101 = gtk_label_new ("   ");
+  label101 = gtk_label_new (_("   "));
   gtk_widget_show (label101);
   gtk_box_pack_start (GTK_BOX (hbox41), label101, FALSE, FALSE, 120);
+  gtk_label_set_justify (GTK_LABEL (label101), GTK_JUSTIFY_CENTER);
 
   hbox60 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox60);
@@ -989,19 +1006,22 @@ create_RunDialog (void)
   gtk_widget_show (label153);
   gtk_box_pack_start (GTK_BOX (hbox60), label153, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label153, 68, 16);
+  gtk_label_set_justify (GTK_LABEL (label153), GTK_JUSTIFY_CENTER);
 
   entry28 = gtk_entry_new ();
   gtk_widget_show (entry28);
   gtk_box_pack_start (GTK_BOX (hbox60), entry28, TRUE, TRUE, 0);
 
-  label154 = gtk_label_new ("   ");
+  label154 = gtk_label_new (_("   "));
   gtk_widget_show (label154);
   gtk_box_pack_start (GTK_BOX (hbox60), label154, FALSE, FALSE, 36);
+  gtk_label_set_justify (GTK_LABEL (label154), GTK_JUSTIFY_CENTER);
 
-  label84 = gtk_label_new ("   ");
+  label84 = gtk_label_new (_("   "));
   gtk_widget_show (label84);
   gtk_box_pack_start (GTK_BOX (vbox11), label84, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label84, 12, 19);
+  gtk_label_set_justify (GTK_LABEL (label84), GTK_JUSTIFY_CENTER);
 
   dialog_action_area6 = GTK_DIALOG (RunDialog)->action_area;
   gtk_widget_show (dialog_action_area6);
@@ -1024,14 +1044,14 @@ create_RunDialog (void)
   GTK_WIDGET_SET_FLAGS (run_cancel, GTK_CAN_DEFAULT);
 
   g_signal_connect ((gpointer) entry_job, "changed",
-                   G_CALLBACK (on_entry_job_changed),
-                   NULL);
+                    G_CALLBACK (on_entry_job_changed),
+                    NULL);
   g_signal_connect ((gpointer) run_ok, "clicked",
-                   G_CALLBACK (on_run_ok_clicked),
-                   NULL);
+                    G_CALLBACK (on_run_ok_clicked),
+                    NULL);
   g_signal_connect ((gpointer) run_cancel, "clicked",
-                   G_CALLBACK (on_run_cancel_clicked),
-                   NULL);
+                    G_CALLBACK (on_run_cancel_clicked),
+                    NULL);
 
   /* Store pointers to all widgets, for use by lookup_widget(). */
   GLADE_HOOKUP_OBJECT_NO_REF (RunDialog, RunDialog, "RunDialog");
@@ -1105,7 +1125,7 @@ create_RunDialog (void)
 
 static GnomeUIInfo file2_menu_uiinfo[] =
 {
-  GNOMEUIINFO_MENU_NEW_ITEM (_("_New"), NULL, on_new1_activate, NULL),
+  GNOMEUIINFO_MENU_NEW_ITEM (N_("_New"), NULL, on_new1_activate, NULL),
   GNOMEUIINFO_MENU_OPEN_ITEM (on_open1_activate, NULL),
   GNOMEUIINFO_MENU_SAVE_ITEM (on_save1_activate, NULL),
   GNOMEUIINFO_MENU_SAVE_AS_ITEM (on_save_as1_activate, NULL),
@@ -1156,6 +1176,7 @@ create_restore_file_selection (void)
   GtkWidget *menubar2;
   GtkWidget *handlebox3;
   GtkWidget *toolbar3;
+  GtkIconSize tmp_toolbar_icon_size;
   GtkWidget *restore_up_button;
   GtkWidget *restore_add_button;
   GtkWidget *restore_remove_button;
@@ -1171,6 +1192,9 @@ create_restore_file_selection (void)
   GtkWidget *label152;
   GtkWidget *restore_select_cancel;
   GtkWidget *label1001;
+  GtkAccelGroup *accel_group;
+
+  accel_group = gtk_accel_group_new ();
 
   restore_file_selection = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_widget_set_size_request (restore_file_selection, 640, 480);
@@ -1190,7 +1214,7 @@ create_restore_file_selection (void)
   gtk_widget_show (menubar2);
   gtk_container_add (GTK_CONTAINER (handlebox4), menubar2);
   gnome_app_fill_menu (GTK_MENU_SHELL (menubar2), menubar2_uiinfo,
-                      NULL, FALSE, 0);
+                       accel_group, FALSE, 0);
 
   handlebox3 = gtk_handle_box_new ();
   gtk_widget_show (handlebox3);
@@ -1200,24 +1224,19 @@ create_restore_file_selection (void)
   gtk_widget_show (toolbar3);
   gtk_container_add (GTK_CONTAINER (handlebox3), toolbar3);
   gtk_toolbar_set_style (GTK_TOOLBAR (toolbar3), GTK_TOOLBAR_BOTH);
+  tmp_toolbar_icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar3));
 
-  restore_up_button = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar3),
-                               "gtk-go-up",
-                               NULL,
-                               NULL, NULL, NULL, -1);
+  restore_up_button = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-go-up");
   gtk_widget_show (restore_up_button);
+  gtk_container_add (GTK_CONTAINER (toolbar3), restore_up_button);
 
-  restore_add_button = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar3),
-                               "gtk-add",
-                               NULL,
-                               NULL, NULL, NULL, -1);
+  restore_add_button = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-add");
   gtk_widget_show (restore_add_button);
+  gtk_container_add (GTK_CONTAINER (toolbar3), restore_add_button);
 
-  restore_remove_button = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar3),
-                               "gtk-remove",
-                               NULL,
-                               NULL, NULL, NULL, -1);
+  restore_remove_button = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-remove");
   gtk_widget_show (restore_remove_button);
+  gtk_container_add (GTK_CONTAINER (toolbar3), restore_remove_button);
 
   hbox38 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox38);
@@ -1226,6 +1245,7 @@ create_restore_file_selection (void)
   label88 = gtk_label_new (_("Current dir:"));
   gtk_widget_show (label88);
   gtk_box_pack_start (GTK_BOX (hbox38), label88, FALSE, TRUE, 0);
+  gtk_label_set_justify (GTK_LABEL (label88), GTK_JUSTIFY_CENTER);
 
   restore_dir = gtk_entry_new ();
   gtk_widget_show (restore_dir);
@@ -1252,7 +1272,6 @@ create_restore_file_selection (void)
   FilesSelected = gtk_label_new (_("Files Selected: "));
   gtk_widget_show (FilesSelected);
   gtk_box_pack_start (GTK_BOX (hbox44), FilesSelected, TRUE, TRUE, 0);
-  gtk_label_set_justify (GTK_LABEL (FilesSelected), GTK_JUSTIFY_LEFT);
   gtk_misc_set_alignment (GTK_MISC (FilesSelected), 0.02, 0.5);
 
   restore_select_ok = gtk_button_new_from_stock ("gtk-ok");
@@ -1264,35 +1283,33 @@ create_restore_file_selection (void)
   gtk_widget_show (label152);
   gtk_box_pack_start (GTK_BOX (hbox44), label152, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label152, 34, 16);
-  gtk_label_set_justify (GTK_LABEL (label152), GTK_JUSTIFY_LEFT);
 
   restore_select_cancel = gtk_button_new_from_stock ("gtk-cancel");
   gtk_widget_show (restore_select_cancel);
   gtk_box_pack_start (GTK_BOX (hbox44), restore_select_cancel, FALSE, TRUE, 0);
 
-  label1001 = gtk_label_new (" ");
+  label1001 = gtk_label_new (_(" "));
   gtk_widget_show (label1001);
   gtk_box_pack_start (GTK_BOX (hbox44), label1001, FALSE, FALSE, 8);
-  gtk_label_set_justify (GTK_LABEL (label1001), GTK_JUSTIFY_LEFT);
 
   g_signal_connect ((gpointer) restore_file_selection, "delete_event",
-                   G_CALLBACK (on_restore_files_delete_event),
-                   NULL);
+                    G_CALLBACK (on_restore_files_delete_event),
+                    NULL);
   g_signal_connect ((gpointer) restore_up_button, "clicked",
-                   G_CALLBACK (on_restore_up_button_clicked),
-                   NULL);
+                    G_CALLBACK (on_restore_up_button_clicked),
+                    NULL);
   g_signal_connect ((gpointer) restore_add_button, "clicked",
-                   G_CALLBACK (on_restore_add_button_clicked),
-                   NULL);
+                    G_CALLBACK (on_restore_add_button_clicked),
+                    NULL);
   g_signal_connect ((gpointer) restore_remove_button, "clicked",
-                   G_CALLBACK (on_restore_remove_button_clicked),
-                   NULL);
+                    G_CALLBACK (on_restore_remove_button_clicked),
+                    NULL);
   g_signal_connect ((gpointer) restore_select_ok, "clicked",
-                   G_CALLBACK (on_restore_select_ok_clicked),
-                   NULL);
+                    G_CALLBACK (on_restore_select_ok_clicked),
+                    NULL);
   g_signal_connect ((gpointer) restore_select_cancel, "clicked",
-                   G_CALLBACK (on_restore_select_cancel_clicked),
-                   NULL);
+                    G_CALLBACK (on_restore_select_cancel_clicked),
+                    NULL);
 
   /* Store pointers to all widgets, for use by lookup_widget(). */
   GLADE_HOOKUP_OBJECT_NO_REF (restore_file_selection, restore_file_selection, "restore_file_selection");
@@ -1336,6 +1353,8 @@ create_restore_file_selection (void)
   GLADE_HOOKUP_OBJECT (restore_file_selection, restore_select_cancel, "restore_select_cancel");
   GLADE_HOOKUP_OBJECT (restore_file_selection, label1001, "label1001");
 
+  gtk_window_add_accel_group (GTK_WINDOW (restore_file_selection), accel_group);
+
   return restore_file_selection;
 }
 
@@ -1372,6 +1391,7 @@ create_label_dialog (void)
   label_dialog = gtk_dialog_new ();
   gtk_window_set_title (GTK_WINDOW (label_dialog), _("Label a Volume"));
   gtk_window_set_modal (GTK_WINDOW (label_dialog), TRUE);
+  gtk_window_set_type_hint (GTK_WINDOW (label_dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
 
   dialog_vbox9 = GTK_DIALOG (label_dialog)->vbox;
   gtk_widget_show (dialog_vbox9);
@@ -1383,6 +1403,7 @@ create_label_dialog (void)
   label106 = gtk_label_new (_("Label a Volume"));
   gtk_widget_show (label106);
   gtk_box_pack_start (GTK_BOX (vbox16), label106, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label106), GTK_JUSTIFY_CENTER);
   gtk_misc_set_padding (GTK_MISC (label106), 0, 9);
 
   hbox45 = gtk_hbox_new (FALSE, 0);
@@ -1393,11 +1414,12 @@ create_label_dialog (void)
   label107 = gtk_label_new (_("Storage:"));
   gtk_widget_show (label107);
   gtk_box_pack_start (GTK_BOX (hbox45), label107, TRUE, TRUE, 0);
+  gtk_label_set_justify (GTK_LABEL (label107), GTK_JUSTIFY_CENTER);
   gtk_misc_set_alignment (GTK_MISC (label107), 0.15, 0.5);
 
   label_combo_storage = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (label_combo_storage)->popwin),
-                    "GladeParentKey", label_combo_storage);
+                     "GladeParentKey", label_combo_storage);
   gtk_widget_show (label_combo_storage);
   gtk_box_pack_start (GTK_BOX (hbox45), label_combo_storage, TRUE, TRUE, 15);
   gtk_combo_set_value_in_list (GTK_COMBO (label_combo_storage), TRUE, FALSE);
@@ -1418,12 +1440,11 @@ create_label_dialog (void)
   label109 = gtk_label_new (_("Pool:"));
   gtk_widget_show (label109);
   gtk_box_pack_start (GTK_BOX (hbox46), label109, TRUE, TRUE, 0);
-  gtk_label_set_justify (GTK_LABEL (label109), GTK_JUSTIFY_LEFT);
   gtk_misc_set_alignment (GTK_MISC (label109), 0.12, 0.5);
 
   label_combo_pool = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (label_combo_pool)->popwin),
-                    "GladeParentKey", label_combo_pool);
+                     "GladeParentKey", label_combo_pool);
   gtk_widget_show (label_combo_pool);
   gtk_box_pack_start (GTK_BOX (hbox46), label_combo_pool, TRUE, TRUE, 14);
   gtk_combo_set_value_in_list (GTK_COMBO (label_combo_pool), TRUE, FALSE);
@@ -1444,7 +1465,6 @@ create_label_dialog (void)
   label111 = gtk_label_new (_("Volume Name:"));
   gtk_widget_show (label111);
   gtk_box_pack_start (GTK_BOX (hbox47), label111, TRUE, TRUE, 0);
-  gtk_label_set_justify (GTK_LABEL (label111), GTK_JUSTIFY_LEFT);
   gtk_misc_set_alignment (GTK_MISC (label111), 0.17, 0.5);
 
   label_entry_volume = gtk_entry_new ();
@@ -1459,7 +1479,6 @@ create_label_dialog (void)
   slot1 = gtk_label_new (_("Slot:"));
   gtk_widget_show (slot1);
   gtk_box_pack_start (GTK_BOX (hbox48), slot1, FALSE, TRUE, 0);
-  gtk_label_set_justify (GTK_LABEL (slot1), GTK_JUSTIFY_LEFT);
   gtk_misc_set_alignment (GTK_MISC (slot1), 0.09, 0.5);
 
   label_slot_adj = gtk_adjustment_new (0, 0, 10000, 1, 10, 10);
@@ -1468,9 +1487,10 @@ create_label_dialog (void)
   gtk_box_pack_start (GTK_BOX (hbox48), label_slot, TRUE, TRUE, 0);
   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (label_slot), TRUE);
 
-  label113 = gtk_label_new ("   ");
+  label113 = gtk_label_new (_("   "));
   gtk_widget_show (label113);
   gtk_box_pack_start (GTK_BOX (vbox16), label113, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label113), GTK_JUSTIFY_CENTER);
 
   dialog_action_area8 = GTK_DIALOG (label_dialog)->action_area;
   gtk_widget_show (dialog_action_area8);
@@ -1493,11 +1513,11 @@ create_label_dialog (void)
   GTK_WIDGET_SET_FLAGS (label_cancel, GTK_CAN_DEFAULT);
 
   g_signal_connect ((gpointer) label_ok, "clicked",
-                   G_CALLBACK (on_label_ok_clicked),
-                   NULL);
+                    G_CALLBACK (on_label_ok_clicked),
+                    NULL);
   g_signal_connect ((gpointer) label_cancel, "clicked",
-                   G_CALLBACK (on_label_cancel_clicked),
-                   NULL);
+                    G_CALLBACK (on_label_cancel_clicked),
+                    NULL);
 
   /* Store pointers to all widgets, for use by lookup_widget(). */
   GLADE_HOOKUP_OBJECT_NO_REF (label_dialog, label_dialog, "label_dialog");
@@ -1584,6 +1604,7 @@ create_RestoreDialog (void)
   RestoreDialog = gtk_dialog_new ();
   gtk_window_set_title (GTK_WINDOW (RestoreDialog), _("Restore Files Dialog"));
   gtk_window_set_default_size (GTK_WINDOW (RestoreDialog), 300, 200);
+  gtk_window_set_type_hint (GTK_WINDOW (RestoreDialog), GDK_WINDOW_TYPE_HINT_DIALOG);
 
   dialog_vbox10 = GTK_DIALOG (RestoreDialog)->vbox;
   gtk_widget_show (dialog_vbox10);
@@ -1599,6 +1620,7 @@ create_RestoreDialog (void)
   label119 = gtk_label_new (_("Restore Files"));
   gtk_widget_show (label119);
   gtk_box_pack_start (GTK_BOX (vbox18), label119, FALSE, FALSE, 2);
+  gtk_label_set_justify (GTK_LABEL (label119), GTK_JUSTIFY_CENTER);
   gtk_misc_set_padding (GTK_MISC (label119), 0, 9);
 
   alignment3 = gtk_alignment_new (0.5, 0.5, 1, 1);
@@ -1621,7 +1643,7 @@ create_RestoreDialog (void)
 
   combo_restore_job = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_restore_job)->popwin),
-                    "GladeParentKey", combo_restore_job);
+                     "GladeParentKey", combo_restore_job);
   gtk_widget_show (combo_restore_job);
   gtk_box_pack_start (GTK_BOX (hbox51), combo_restore_job, TRUE, TRUE, 1);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_restore_job), TRUE, FALSE);
@@ -1636,6 +1658,7 @@ create_RestoreDialog (void)
   label122 = gtk_label_new ("");
   gtk_widget_show (label122);
   gtk_box_pack_start (GTK_BOX (hbox51), label122, FALSE, FALSE, 27);
+  gtk_label_set_justify (GTK_LABEL (label122), GTK_JUSTIFY_CENTER);
 
   hbox52 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox52);
@@ -1649,7 +1672,7 @@ create_RestoreDialog (void)
 
   combo_restore_client = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_restore_client)->popwin),
-                    "GladeParentKey", combo_restore_client);
+                     "GladeParentKey", combo_restore_client);
   gtk_widget_show (combo_restore_client);
   gtk_box_pack_start (GTK_BOX (hbox52), combo_restore_client, TRUE, TRUE, 1);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_restore_client), TRUE, FALSE);
@@ -1661,9 +1684,10 @@ create_RestoreDialog (void)
   gtk_widget_show (restore_client_entry);
   gtk_editable_set_editable (GTK_EDITABLE (restore_client_entry), FALSE);
 
-  label127 = gtk_label_new (" ");
+  label127 = gtk_label_new (_(" "));
   gtk_widget_show (label127);
   gtk_box_pack_start (GTK_BOX (hbox52), label127, FALSE, FALSE, 25);
+  gtk_label_set_justify (GTK_LABEL (label127), GTK_JUSTIFY_CENTER);
 
   hbox53 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox53);
@@ -1677,7 +1701,7 @@ create_RestoreDialog (void)
 
   combo_restore_fileset = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_restore_fileset)->popwin),
-                    "GladeParentKey", combo_restore_fileset);
+                     "GladeParentKey", combo_restore_fileset);
   gtk_widget_show (combo_restore_fileset);
   gtk_box_pack_start (GTK_BOX (hbox53), combo_restore_fileset, TRUE, TRUE, 0);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_restore_fileset), TRUE, FALSE);
@@ -1689,9 +1713,10 @@ create_RestoreDialog (void)
   gtk_widget_show (restore_fileset_entry);
   gtk_editable_set_editable (GTK_EDITABLE (restore_fileset_entry), FALSE);
 
-  label130 = gtk_label_new ("  ");
+  label130 = gtk_label_new (_("  "));
   gtk_widget_show (label130);
   gtk_box_pack_start (GTK_BOX (hbox53), label130, FALSE, FALSE, 23);
+  gtk_label_set_justify (GTK_LABEL (label130), GTK_JUSTIFY_CENTER);
 
   hbox55 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox55);
@@ -1701,10 +1726,11 @@ create_RestoreDialog (void)
   gtk_widget_show (label135);
   gtk_box_pack_start (GTK_BOX (hbox55), label135, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label135, 66, 16);
+  gtk_label_set_justify (GTK_LABEL (label135), GTK_JUSTIFY_CENTER);
 
   combo_restore_pool = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_restore_pool)->popwin),
-                    "GladeParentKey", combo_restore_pool);
+                     "GladeParentKey", combo_restore_pool);
   gtk_widget_show (combo_restore_pool);
   gtk_box_pack_start (GTK_BOX (hbox55), combo_restore_pool, TRUE, TRUE, 0);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_restore_pool), TRUE, FALSE);
@@ -1717,9 +1743,10 @@ create_RestoreDialog (void)
   gtk_widget_show (restore_pool_entry);
   gtk_editable_set_editable (GTK_EDITABLE (restore_pool_entry), FALSE);
 
-  label138 = gtk_label_new ("   ");
+  label138 = gtk_label_new (_("   "));
   gtk_widget_show (label138);
   gtk_box_pack_start (GTK_BOX (hbox55), label138, FALSE, FALSE, 21);
+  gtk_label_set_justify (GTK_LABEL (label138), GTK_JUSTIFY_CENTER);
 
   hbox56 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox56);
@@ -1729,10 +1756,11 @@ create_RestoreDialog (void)
   gtk_widget_show (label139);
   gtk_box_pack_start (GTK_BOX (hbox56), label139, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label139, 66, 16);
+  gtk_label_set_justify (GTK_LABEL (label139), GTK_JUSTIFY_CENTER);
 
   combo_restore_storage = gtk_combo_new ();
   g_object_set_data (G_OBJECT (GTK_COMBO (combo_restore_storage)->popwin),
-                    "GladeParentKey", combo_restore_storage);
+                     "GladeParentKey", combo_restore_storage);
   gtk_widget_show (combo_restore_storage);
   gtk_box_pack_start (GTK_BOX (hbox56), combo_restore_storage, TRUE, TRUE, 0);
   gtk_combo_set_value_in_list (GTK_COMBO (combo_restore_storage), TRUE, FALSE);
@@ -1745,9 +1773,10 @@ create_RestoreDialog (void)
   gtk_widget_show (restore_storage_entry);
   gtk_editable_set_editable (GTK_EDITABLE (restore_storage_entry), FALSE);
 
-  label142 = gtk_label_new ("   ");
+  label142 = gtk_label_new (_("   "));
   gtk_widget_show (label142);
   gtk_box_pack_start (GTK_BOX (hbox56), label142, FALSE, FALSE, 21);
+  gtk_label_set_justify (GTK_LABEL (label142), GTK_JUSTIFY_CENTER);
 
   hbox59 = gtk_hbox_new (FALSE, 0);
   gtk_widget_show (hbox59);
@@ -1757,18 +1786,21 @@ create_RestoreDialog (void)
   gtk_widget_show (label148);
   gtk_box_pack_start (GTK_BOX (hbox59), label148, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label148, 66, 16);
+  gtk_label_set_justify (GTK_LABEL (label148), GTK_JUSTIFY_CENTER);
 
   restore_before_entry = gtk_entry_new ();
   gtk_widget_show (restore_before_entry);
   gtk_box_pack_start (GTK_BOX (hbox59), restore_before_entry, TRUE, TRUE, 0);
 
-  label149 = gtk_label_new ("   ");
+  label149 = gtk_label_new (_("   "));
   gtk_widget_show (label149);
   gtk_box_pack_start (GTK_BOX (hbox59), label149, FALSE, FALSE, 53);
+  gtk_label_set_justify (GTK_LABEL (label149), GTK_JUSTIFY_CENTER);
 
-  label150 = gtk_label_new ("   ");
+  label150 = gtk_label_new (_("   "));
   gtk_widget_show (label150);
   gtk_box_pack_start (GTK_BOX (vbox17), label150, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (label150), GTK_JUSTIFY_CENTER);
 
   dialog_action_area9 = GTK_DIALOG (RestoreDialog)->action_area;
   gtk_widget_show (dialog_action_area9);
@@ -1799,7 +1831,6 @@ create_RestoreDialog (void)
   restore_select_button = gtk_label_new_with_mnemonic (_("Select Files"));
   gtk_widget_show (restore_select_button);
   gtk_box_pack_start (GTK_BOX (hbox49), restore_select_button, FALSE, FALSE, 0);
-  gtk_label_set_justify (GTK_LABEL (restore_select_button), GTK_JUSTIFY_LEFT);
 
   restore_cancel = gtk_button_new_from_stock ("gtk-cancel");
   gtk_widget_show (restore_cancel);
@@ -1807,14 +1838,14 @@ create_RestoreDialog (void)
   GTK_WIDGET_SET_FLAGS (restore_cancel, GTK_CAN_DEFAULT);
 
   g_signal_connect ((gpointer) restore_job_entry, "changed",
-                   G_CALLBACK (on_restore_job_entry_changed),
-                   NULL);
+                    G_CALLBACK (on_restore_job_entry_changed),
+                    NULL);
   g_signal_connect ((gpointer) select_files_button, "clicked",
-                   G_CALLBACK (on_select_files_button_clicked),
-                   NULL);
+                    G_CALLBACK (on_select_files_button_clicked),
+                    NULL);
   g_signal_connect ((gpointer) restore_cancel, "clicked",
-                   G_CALLBACK (on_restore_cancel_clicked),
-                   NULL);
+                    G_CALLBACK (on_restore_cancel_clicked),
+                    NULL);
 
   /* Store pointers to all widgets, for use by lookup_widget(). */
   GLADE_HOOKUP_OBJECT_NO_REF (RestoreDialog, RestoreDialog, "RestoreDialog");
@@ -1881,6 +1912,7 @@ create_progress_dialog (void)
 
   progress_dialog = gtk_dialog_new ();
   gtk_window_set_title (GTK_WINDOW (progress_dialog), _("Progress"));
+  gtk_window_set_type_hint (GTK_WINDOW (progress_dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
 
   dialog_vbox11 = GTK_DIALOG (progress_dialog)->vbox;
   gtk_widget_show (dialog_vbox11);
@@ -1893,13 +1925,11 @@ create_progress_dialog (void)
   gtk_widget_show (label1002);
   gtk_box_pack_start (GTK_BOX (vbox19), label1002, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label1002, 0, 43);
-  gtk_label_set_justify (GTK_LABEL (label1002), GTK_JUSTIFY_LEFT);
 
   label1003 = gtk_label_new ("");
   gtk_widget_show (label1003);
   gtk_box_pack_start (GTK_BOX (vbox19), label1003, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label1003, 0, 36);
-  gtk_label_set_justify (GTK_LABEL (label1003), GTK_JUSTIFY_LEFT);
 
   progressbar1 = gtk_progress_bar_new ();
   gtk_widget_show (progressbar1);
@@ -1910,7 +1940,6 @@ create_progress_dialog (void)
   gtk_widget_show (label1004);
   gtk_box_pack_start (GTK_BOX (vbox19), label1004, FALSE, FALSE, 0);
   gtk_widget_set_size_request (label1004, 0, 52);
-  gtk_label_set_justify (GTK_LABEL (label1004), GTK_JUSTIFY_LEFT);
 
   dialog_action_area10 = GTK_DIALOG (progress_dialog)->action_area;
   gtk_widget_show (dialog_action_area10);
index 1bc775a00ec920108270d9b7278b9d5d71e3052e..06a04b7dd5d757e2d10955d9aeb8ef062423ff04 100644 (file)
 
 GtkWidget*
 lookup_widget                          (GtkWidget       *widget,
-                                       const gchar     *widget_name)
+                                        const gchar     *widget_name)
 {
   GtkWidget *parent, *found_widget;
 
   for (;;)
     {
       if (GTK_IS_MENU (widget))
-       parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
       else
-       parent = widget->parent;
+        parent = widget->parent;
       if (!parent)
-       parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey");
+        parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey");
       if (parent == NULL)
-       break;
+        break;
       widget = parent;
     }
 
   found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget),
-                                                widget_name);
+                                                 widget_name);
   if (!found_widget)
-    g_warning (_("Widget not found: %s"), widget_name);
+    g_warning ("Widget not found: %s", widget_name);
   return found_widget;
 }
 
 /* This is an internally used function to create pixmaps. */
 GtkWidget*
 create_pixmap                          (GtkWidget       *widget,
-                                       const gchar     *filename)
+                                        const gchar     *filename)
 {
   GtkWidget *pixmap;
   gchar *pathname;
@@ -54,7 +54,7 @@ create_pixmap                          (GtkWidget       *widget,
       return gtk_image_new ();
 
   pathname = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP,
-                                       filename, TRUE, NULL);
+                                        filename, TRUE, NULL);
   if (!pathname)
     {
       g_warning (_("Couldn't find pixmap file: %s"), filename);
@@ -78,7 +78,7 @@ create_pixbuf                          (const gchar     *filename)
       return NULL;
 
   pathname = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP,
-                                       filename, TRUE, NULL);
+                                        filename, TRUE, NULL);
 
   if (!pathname)
     {
@@ -89,8 +89,8 @@ create_pixbuf                          (const gchar     *filename)
   pixbuf = gdk_pixbuf_new_from_file (pathname, &error);
   if (!pixbuf)
     {
-      fprintf (stderr, _("Failed to load pixbuf file: %s: %s\n"),
-              pathname, error->message);
+      fprintf (stderr, "Failed to load pixbuf file: %s: %s\n",
+               pathname, error->message);
       g_error_free (error);
     }
   g_free (pathname);
@@ -100,8 +100,8 @@ create_pixbuf                          (const gchar     *filename)
 /* This is used to set ATK action descriptions. */
 void
 glade_set_atk_action_description       (AtkAction       *action,
-                                       const gchar     *action_name,
-                                       const gchar     *description)
+                                        const gchar     *action_name,
+                                        const gchar     *description)
 {
   gint n_actions, i;
 
@@ -109,7 +109,7 @@ glade_set_atk_action_description       (AtkAction       *action,
   for (i = 0; i < n_actions; i++)
     {
       if (!strcmp (atk_action_get_name (action, i), action_name))
-       atk_action_set_description (action, i, description);
+        atk_action_set_description (action, i, description);
     }
 }
 
index 2081386db32503517689982dd2193a5faf0f5689..2bec209a5ad66eaeb61cbe705e0827836d96044c 100644 (file)
@@ -2,8 +2,20 @@
  * DO NOT EDIT THIS FILE - it is generated by Glade.
  */
 
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
 #include <gnome.h>
 
+#undef Q_
+#ifdef ENABLE_NLS
+#  define Q_(String) g_strip_context ((String), gettext (String))
+#else
+#  define Q_(String) g_strip_context ((String), (String))
+#endif
+
+
 /*
  * Public Functions.
  */
@@ -15,7 +27,7 @@
  * you want returned.
  */
 GtkWidget*  lookup_widget              (GtkWidget       *widget,
-                                       const gchar     *widget_name);
+                                        const gchar     *widget_name);
 
 
 
@@ -25,13 +37,13 @@ GtkWidget*  lookup_widget              (GtkWidget       *widget,
 
 /* This is used to create the pixmaps used in the interface. */
 GtkWidget*  create_pixmap              (GtkWidget       *widget,
-                                       const gchar     *filename);
+                                        const gchar     *filename);
 
 /* This is used to create the pixbufs used in the interface. */
 GdkPixbuf*  create_pixbuf              (const gchar     *filename);
 
 /* This is used to set ATK action descriptions. */
 void        glade_set_atk_action_description (AtkAction       *action,
-                                             const gchar     *action_name,
-                                             const gchar     *description);
+                                              const gchar     *action_name,
+                                              const gchar     *description);
 
index fa5f9bcd4e4d6e1ad02dee60391cf08d0feb94c9..b2725a1f9f6e727978cddccb2aa54f1f76c0d9aa 100644 (file)
@@ -5,6 +5,6 @@
 Director {
   Name = rufus-dir
   DIRport = 8101
-  address = localhost
+  address = rufus
   Password = UA_password
 }
index a0e51aaaf23fccbad66f0bf3da1a57db70588296..0affa6b170221dde47c94d6eab0e4f99fdada992 100644 (file)
 #define JS_WaitStartTime         't'  /* Waiting for start time */
 #define JS_WaitPriority          'p'  /* Waiting for higher priority jobs to finish */
 
+/* Migration selection types */
+enum {
+   MT_SMALLEST_VOL = 1,
+   MT_OLDEST_VOL,
+   MT_POOL_OCCUPANCY,
+   MT_POOL_TIME,
+   MT_CLIENT,
+   MT_VOLUME,
+   MT_JOB,
+   MT_SQLQUERY
+};
+
 #define job_canceled(jcr) \
   (jcr->JobStatus == JS_Canceled || \
    jcr->JobStatus == JS_ErrorTerminated || \
@@ -97,15 +109,22 @@ typedef void (JCR_free_HANDLER)(JCR *jcr);
 
 /* Job Control Record (JCR) */
 class JCR {
+private:
+   pthread_mutex_t mutex;             /* jcr mutex */
+   volatile int _use_count;           /* use count */
 public:
-   void inc_use_count(void) {P(mutex); use_count++; V(mutex); };
-   void dec_use_count(void) {P(mutex); use_count--; V(mutex); };
+   void inc_use_count(void) {P(mutex); _use_count++; V(mutex); };
+   void dec_use_count(void) {P(mutex); _use_count--; V(mutex); };
+   int  use_count() { return _use_count; };
+   void init_mutex(void) {pthread_mutex_init(&mutex, NULL); };
+   void destroy_mutex(void) {pthread_mutex_destroy(&mutex); };
+   void lock() {P(mutex); };
+   void unlock() {V(mutex); };
+   bool is_job_canceled() {return job_canceled(this); };
 
    /* Global part of JCR common to all daemons */
    dlink link;                        /* JCR chain link */
-   volatile int use_count;            /* use count */
    pthread_t my_thread_id;            /* id of thread controlling jcr */
-   pthread_mutex_t mutex;             /* jcr mutex */
    BSOCK *dir_bsock;                  /* Director bsock or NULL if we are him */
    BSOCK *store_bsock;                /* Storage connection socket */
    BSOCK *file_bsock;                 /* File daemon connection socket */
@@ -157,17 +176,14 @@ public:
    /* This should be empty in the library */
 
 #ifdef DIRECTOR_DAEMON
-   /* Director Daemon specific part of JCR */
+   /* Director Daemon specific data part of JCR */
    pthread_t SD_msg_chan;             /* Message channel thread id */
    pthread_cond_t term_wait;          /* Wait for job termination */
    workq_ele_t *work_item;            /* Work queue item if scheduled */
    volatile bool sd_msg_thread_done;  /* Set when Storage message thread terms */
    BSOCK *ua;                         /* User agent */
    JOB *job;                          /* Job resource */
-   union {
-      JOB *verify_job;                /* Job resource of verify target job */
-      JOB *migration_job;             /* Job resource of migration target job */
-   };  
+   JOB *verify_job;                   /* Job resource of verify previous job */
    alist *storage;                    /* Storage possibilities */
    STORE *store;                      /* Storage daemon selected */
    CLIENT *client;                    /* Client resource */
@@ -185,15 +201,20 @@ public:
    volatile int FDJobStatus;          /* File daemon Job Status */
    uint32_t ExpectedFiles;            /* Expected restore files */
    uint32_t MediaId;                  /* DB record IDs associated with this job */
+   uint32_t PoolId;                   /* PoolId associated with Job */
    FileId_t FileId;                   /* Last file id inserted */
    uint32_t FileIndex;                /* Last FileIndex processed */
    POOLMEM *fname;                    /* name to put into catalog */
    JOB_DBR jr;                        /* Job DB record for current job */
-   JOB_DBR target_jr;                 /* target job */
-   JCR *target_jcr;                   /* target job control record */
+   JOB_DBR previous_jr;               /* previous job database record */
+   JOB *previous_job;                 /* Job resource of migration previous job */
+   JCR *previous_jcr;                 /* previous job control record */
    char FSCreateTime[MAX_TIME_LENGTH]; /* FileSet CreateTime as returned from DB */
    char since[MAX_TIME_LENGTH];       /* since time */
-   uint32_t RestoreJobId;             /* Id specified by UA */
+   union {
+      JobId_t RestoreJobId;           /* Id specified by UA */
+      JobId_t MigrateJobId;
+   };
    POOLMEM *client_uname;             /* client uname */
    int replace;                       /* Replace option */
    int NumVols;                       /* Number of Volume used in pool */
@@ -237,10 +258,10 @@ public:
    bool pki_sign;                     /* Enable PKI Signatures? */
    bool pki_encrypt;                  /* Enable PKI Encryption? */
    DIGEST *digest;                    /* Last file's digest context */
-   X509_KEYPAIR *pki_keypair;         /* Encryption key pair */
+// X509_KEYPAIR *pki_keypair;         /* Encryption key pair */
    alist *pki_signers;                /* Trusted Signers */
    alist *pki_recipients;             /* Trusted Recipients */
-   CRYPTO_SESSION *pki_session;       /* PKE Public Keys + Symmetric Session Keys */
+// CRYPTO_SESSION *pki_session;       /* PKE Public Keys + Symmetric Session Keys */
    void *pki_session_encoded;         /* Cached DER-encoded copy of pki_session */
    size_t pki_session_encoded_size;   /* Size of DER-encoded pki_session */
    POOLMEM *crypto_buf;               /* Encryption/Decryption buffer */
index d9809afdbf8038ee987618adb131c988e1a39e98..a0078bfd425115cb488c0be01e698e8d9429a050 100644 (file)
@@ -14,8 +14,6 @@ topdir = ../..
 # this dir relative to top dir
 thisdir = src/lib
 
-OPENSSL_LIBS = @OPENSSL_LIBS@
-OPENSSL_INC = @OPENSSL_INC@
 
 DEBUG=@DEBUG@
 
@@ -24,11 +22,11 @@ dummy:
 
 LIBSRCS = alloc.c attr.c base64.c berrno.c bsys.c bget_msg.c \
          bnet.c bnet_server.c \
-         bpipe.c bshm.c bsnprintf.c btime.c \
-         cram-md5.c crc32.c crypto.c daemon.c edit.c fnmatch.c \
+         bpipe.c bshm.c btime.c \
+         cram-md5.c crc32.c daemon.c edit.c fnmatch.c \
          hmac.c idcache.c jcr.c lex.c alist.c dlist.c \
-         md5.c message.c mem_pool.c openssl.c parse_conf.c \
-         queue.c regex.c \
+         md5.c message.c mem_pool.c parse_conf.c \
+         queue.c bregex.c \
          res.c rwlock.c scan.c serial.c sha1.c \
          semlock.c signal.c smartall.c tls.c tree.c \
          util.c var.c watchdog.c workq.c btimers.c \
@@ -37,11 +35,11 @@ LIBSRCS = alloc.c attr.c base64.c berrno.c bsys.c bget_msg.c \
 
 LIBOBJS = alloc.o attr.o base64.o berrno.o bsys.o bget_msg.o \
          bnet.o bnet_server.o \
-         bpipe.o bshm.o bsnprintf.o btime.o \
-         cram-md5.o crc32.o crypto.o daemon.o edit.o fnmatch.o \
+         bpipe.o bshm.o btime.o \
+         cram-md5.o crc32.o daemon.o edit.o fnmatch.o \
          hmac.o idcache.o jcr.o lex.o alist.o dlist.o \
-         md5.o message.o mem_pool.o openssl.o parse_conf.o \
-         queue.o regex.o \
+         md5.o message.o mem_pool.o parse_conf.o \
+         queue.o bregex.o \
          res.o rwlock.o scan.o serial.o sha1.o \
          semlock.o signal.o smartall.o tls.o tree.o \
          util.o var.o watchdog.o workq.o btimers.o \
@@ -50,6 +48,9 @@ LIBOBJS = alloc.o attr.o base64.o berrno.o bsys.o bget_msg.o \
 
 EXTRAOBJS = @OBJLIST@
 
+OPENSSL_LIBS=@OPENSSL_LIBS@
+OPENSSL_INC=@OPENSSL_INC@
+
 
 .SUFFIXES:     .c .o .ch .dvi .pdf .tex .view .w .1
 .PHONY:
@@ -99,15 +100,7 @@ sha1sum: sha1.o
        $(CXX) -DSHA1_SUM $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE)  $(CFLAGS) sha1.c
        $(CXX) $(LDFLAGS) -L. -o $@ sha1.o $(LIBS) $(DLIB) -lbac $(OPENSSL_LIBS) -lm
        rm -f sha1.o
-       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) sha1.c
-
-bsnprintf: bsnprintf.o
-       rm -f bsnprintf.o
-       $(CXX) -DTEST_PROGRAM $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE)  $(CFLAGS) bsnprintf.c
-       $(CXX) $(LDFLAGS) -L. -o $@ bsnprintf.o $(LIBS) $(DLIB) -lbac $(OPENSSL_LIBS) -lm
-       rm -f bsnprintf.o
-       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) bsnprintf.c
-       
+       $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) md5.c
         
 install:
 
@@ -130,6 +123,7 @@ distclean: realclean
 # `semi'-automatic since dependencies are generated at distribution time.
 
 depend:
+       @$(RMF) -f Makefile.bak
        @$(MV) Makefile Makefile.bak
        @$(SED) "/^# DO NOT DELETE:/,$$ d" Makefile.bak > Makefile
        @$(ECHO) "# DO NOT DELETE: nice dependency list follows" >> Makefile
@@ -141,5 +135,6 @@ depend:
           echo " ===== Something went wrong in make depend ====="; \
        fi
 
+
 # -----------------------------------------------------------------------
-# DO NOT DELETE: nice dependency list follows
+# DO NOT DELETE: nice dependency list follows 
index 168257570370322b1fe8c9ef8d6e9daa5654ce58..e1c6e39ae78d377ba20e18b4f70b9f0545c02597 100644 (file)
  *
  * Loop var through each member of list
  */
+#ifdef HAVE_GCC
+#define foreach_alist(var, list) \
+        for((var)=(typeof(var))(list)->first(); (var); (var)=(typeof(var))(list)->next() )
+#else
 #define foreach_alist(var, list) \
     for((*((void **)&(var))=(void*)((list)->first())); \
          (var); \
          (*((void **)&(var))=(void*)((list)->next())))
-
-#ifdef the_easy_way
-#define foreach_alist(var, list) \
-        for(((void*)(var))=(list)->first(); (var); ((void*)(var))=(list)->next()); )
 #endif
 
 
+
 /* Second arg of init */
 enum {
   owned_by_alist = true,
index 1b56f866185ed3b8250036ac16ab26d3d7d78792..379069075c13b406e330ae12e3d795faedf2f328 100644 (file)
@@ -59,13 +59,13 @@ int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr)
     *
     */
    attr->stream = stream;
-   Dmsg1(400, "Attr: %s\n", rec);
+   Dmsg1(100, "Attr: %s\n", rec);
    if (sscanf(rec, "%d %d", &attr->file_index, &attr->type) != 2) {
       Jmsg(jcr, M_FATAL, 0, _("Error scanning attributes: %s\n"), rec);
       Dmsg1(100, "\nError scanning attributes. %s\n", rec);
       return 0;
    }
-   Dmsg2(400, "Got Attr: FilInx=%d type=%d\n", attr->file_index, attr->type);
+   Dmsg2(100, "Got Attr: FilInx=%d type=%d\n", attr->file_index, attr->type);
    if (attr->type & AR_DATA_STREAM) {
       attr->data_stream = 1;
    } else {
@@ -96,7 +96,7 @@ int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr)
       from_base64(&val, p);
       attr->data_stream = (int32_t)val;
    }
-   Dmsg7(400, "unpack_attr FI=%d Type=%d fname=%s attr=%s lname=%s attrEx=%s ds=%d\n",
+   Dmsg7(200, "unpack_attr FI=%d Type=%d fname=%s attr=%s lname=%s attrEx=%s ds=%d\n",
       attr->file_index, attr->type, attr->fname, attr->attr, attr->lname,
       attr->attrEx, attr->data_stream);
    *attr->ofname = 0;
index dbfcbd60bf46ed99e0ce3e669881a0b89dd809ae..db2e977dd40f376cb99612657b623e79add606f8 100644 (file)
@@ -6,7 +6,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   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
diff --git a/bacula/src/lib/bnet_pkt.c b/bacula/src/lib/bnet_pkt.c
new file mode 100644 (file)
index 0000000..d84d241
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Network Packet Utility Routines
+ *
+ *  by Kern Sibbald, July MMII
+ *
+ *
+ *   Version $Id$
+ */
+/*
+   Copyright (C) 2002-2004 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
+   published by the Free Software Foundation; either version 2 of
+   the License, or (at your option) any later version.
+
+   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.
+
+ */
+
+#ifdef implemented
+
+#include "bacula.h"
+
+/*
+ * Receive a message from the other end. Each message consists of
+ * two packets. The first is a header that contains the size
+ * of the data that follows in the second packet.
+ * Returns number of bytes read
+ * Returns 0 on end of file
+ * Returns -1 on hard end of file (i.e. network connection close)
+ * Returns -2 on error
+ */
+int32_t
+bnet_recv_pkt(BSOCK *bsock, BPKT *pkt, int *version)
+{
+   unser_declare;
+   short lversion;
+   int type;
+
+   unser_begin(bsock->msg, 0);
+   unser_uint16(lversion);
+   *version = (int)lversion;
+
+
+   for ( ; pkt->type != BP_EOF; pkt++) {
+      if (pkt->id) {
+        ser_int8(BP_ID);
+        ser_string((char *)pkt->id);
+      }
+      ser_int8(pkt->type);
+      switch (pkt->type) {
+      case BP_CHAR:
+        ser_int8(*(int8_t *)pkt->value);
+        break;
+      case BP_INT32:
+        ser_int32(*(int32_t *)pkt->value);
+        break;
+      case BP_UINT32:
+        break;
+        ser_unit32(*(uint32_t *)pkt->value);
+        break;
+      case BP_INT64:
+        ser_int64(*(int64_t *)pkt->value);
+        break;
+      case BP_BTIME:
+      case BP_UTIME:
+      case BP_UINT64:
+        ser_uint64(*(uint64_t *)pkt->value);
+        break;
+      case BP_POOL:
+      case BP_STRING:
+      case BP_NAME:
+        ser_string((char *)pkt->value);
+        break;
+      case BP_BYTES:
+        ser_uint32(*(uint32_t *)pkt->len);
+        ser_bytes((char *)pkt->value, pkt->len);
+        break;
+      default:
+        Emsg1(M_ABORT, 0, _("Unknown BPKT type: %d\n"), pkt->type);
+      }
+   }
+   unser_end(bsock->msg, 0);
+
+}
+
+/*
+ * Send a message over the network. The send consists of
+ * two network packets. The first is sends a 32 bit integer containing
+ * the length of the data packet which follows.
+ *
+ * Returns: 0 on failure
+ *         1 on success
+ */
+int
+bnet_send_pkt(BSOCK *bsock, BPKT *pkt, int version)
+{
+   ser_declare;
+
+   ser_begin(bsock->msg, 0);
+   ser_uint16(version);
+
+   for ( ; pkt->type != BP_EOF; pkt++) {
+      if (pkt->id) {
+        ser_int8(BP_ID);
+        ser_string((char *)pkt->id);
+      }
+      ser_int8(pkt->type);
+      switch (pkt->type) {
+      case BP_CHAR:
+        ser_int8(*(int8_t *)pkt->value);
+        break;
+      case BP_INT32:
+        ser_int32(*(int32_t *)pkt->value);
+        break;
+      case BP_UINT32:
+        break;
+        ser_unit32(*(uint32_t *)pkt->value);
+        break;
+      case BP_INT64:
+        ser_int64(*(int64_t *)pkt->value);
+        break;
+      case BP_BTIME:
+      case BP_UTIME:
+      case BP_UINT64:
+        ser_uint64(*(uint64_t *)pkt->value);
+        break;
+      case BP_POOL:
+      case BP_STRING:
+      case BP_NAME:
+        ser_string((char *)pkt->value);
+        break;
+      case BP_BYTES:
+        ser_uint32(*(uint32_t *)pkt->len);
+        ser_bytes((char *)pkt->value, pkt->len);
+        break;
+      default:
+        Emsg1(M_ABORT, 0, _("Unknown BPKT type: %d\n"), pkt->type);
+      }
+   }
+   ser_end(bsock->msg, 0);
+}
+
+#endif
index ca8291366355dbb0fca49dceb68612df423ed147..b87f106ab53b99310f4ce7afc9971eb5f0823a14 100644 (file)
@@ -6,7 +6,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2002-2005 Kern Sibbald
+   Copyright (C) 2002-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
@@ -62,13 +62,13 @@ BPIPE *open_bpipe(char *prog, int wait, const char *mode)
       printf("argc=%d argv=%s:\n", i, bargv[i]);
    }
 #endif
-   free_pool_memory(tprog);
 
    /* Each pipe is one way, write one end, read the other, so we need two */
    if (mode_write && pipe(writep) == -1) {
       save_errno = errno;
       free(bpipe);
       errno = save_errno;
+      free_pool_memory(tprog);
       return NULL;
    }
    if (mode_read && pipe(readp) == -1) {
@@ -79,6 +79,7 @@ BPIPE *open_bpipe(char *prog, int wait, const char *mode)
       }
       free(bpipe);
       errno = save_errno;
+      free_pool_memory(tprog);
       return NULL;
    }
    /* Start worker process */
@@ -95,6 +96,7 @@ BPIPE *open_bpipe(char *prog, int wait, const char *mode)
       }
       free(bpipe);
       errno = save_errno;
+      free_pool_memory(tprog);
       return NULL;
 
    case 0:                            /* child */
@@ -120,11 +122,10 @@ BPIPE *open_bpipe(char *prog, int wait, const char *mode)
       }
       exit(255);                      /* unknown errno */
 
-
-
    default:                           /* parent */
       break;
    }
+   free_pool_memory(tprog);
    if (mode_read) {
       close(readp[1]);                /* close unused parent fds */
       bpipe->rfd = fdopen(readp[0], "r"); /* open file descriptor */
diff --git a/bacula/src/lib/bregex.c b/bacula/src/lib/bregex.c
new file mode 100644 (file)
index 0000000..65ccb76
--- /dev/null
@@ -0,0 +1,1948 @@
+/* regexpr.c
+ *
+ * Author: Tatu Ylonen <ylo@ngs.fi>
+ *
+ * Copyright (c) 1991 Tatu Ylonen, Espoo, Finland
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies.
+ * This software is provided "as is" without express or implied
+ * warranty.
+ *
+ * Created: Thu Sep 26 17:14:05 1991 ylo
+ * Last modified: Mon Nov  4 17:06:48 1991 ylo
+ * Ported to Think C: 19 Jan 1992 guido@cwi.nl
+ *
+ * This code draws many ideas from the regular expression packages by
+ * Henry Spencer of the University of Toronto and Richard Stallman of
+ * the Free Software Foundation.
+ *
+ * Emacs-specific code and syntax table code is almost directly borrowed
+ * from GNU regexp.
+ *
+ * Bugs fixed and lots of reorganization by Jeffrey C. Ollie, April
+ * 1997 Thanks for bug reports and ideas from Andrew Kuchling, Tim
+ * Peters, Guido van Rossum, Ka-Ping Yee, Sjoerd Mullender, and
+ * probably one or two others that I'm forgetting.
+ *
+ * $Id$ */
+
+#include "bacula.h"
+#include "bregex.h"
+
+#define set_error(x) bufp->errmsg=(x)
+#define got_error bufp->errmsg!=NULL
+
+/* The original code blithely assumed that sizeof(short) == 2.  Not
+ * always true.  Original instances of "(short)x" were replaced by
+ * SHORT(x), where SHORT is #defined below.  */
+
+#define SHORT(x) ((x) & 0x8000 ? (x) - 0x10000 : (x))
+
+/* The stack implementation is taken from an idea by Andrew Kuchling.
+ * It's a doubly linked list of arrays. The advantages of this over a
+ * simple linked list are that the number of mallocs required are
+ * reduced. It also makes it possible to statically allocate enough
+ * space so that small patterns don't ever need to call malloc.
+ *
+ * The advantages over a single array is that is periodically
+ * realloced when more space is needed is that we avoid ever copying
+ * the stack. */
+
+/* item_t is the basic stack element.  Defined as a union of
+ * structures so that both registers, failure points, and counters can
+ * be pushed/popped from the stack.  There's nothing built into the
+ * item to keep track of whether a certain stack item is a register, a
+ * failure point, or a counter. */
+
+typedef union item_t {
+   struct {
+      int num;
+      int level;
+      unsigned char *start;
+      unsigned char *end;
+   } reg;
+   struct {
+      int count;
+      int level;
+      int phantom;
+      unsigned char *code;
+      unsigned char *text;
+   } fail;
+   struct {
+      int num;
+      int level;
+      int count;
+   } cntr;
+} item_t;
+
+#define STACK_PAGE_SIZE 256
+#define NUM_REGISTERS 256
+
+/* A 'page' of stack items. */
+
+typedef struct item_page_t {
+   item_t items[STACK_PAGE_SIZE];
+   struct item_page_t *prev;
+   struct item_page_t *next;
+} item_page_t;
+
+
+typedef struct match_state {
+   /* The number of registers that have been pushed onto the stack
+    * since the last failure point. */
+
+   int count;
+
+   /* Used to control when registers need to be pushed onto the
+    * stack. */
+
+   int level;
+
+   /* The number of failure points on the stack. */
+
+   int point;
+
+   /* Storage for the registers.  Each register consists of two
+    * pointers to characters.  So register N is represented as
+    * start[N] and end[N].  The pointers must be converted to
+    * offsets from the beginning of the string before returning the
+    * registers to the calling program. */
+
+   unsigned char *start[NUM_REGISTERS];
+   unsigned char *end[NUM_REGISTERS];
+
+   /* Keeps track of whether a register has changed recently. */
+
+   int changed[NUM_REGISTERS];
+
+   /* Structure to encapsulate the stack. */
+   struct {
+      /* index into the current page.  If index == 0 and you need
+       * to pop an item, move to the previous page and set index
+       * = STACK_PAGE_SIZE - 1.  Otherwise decrement index to
+       * push a page. If index == STACK_PAGE_SIZE and you need
+       * to push a page move to the next page and set index =
+       * 0. If there is no new next page, allocate a new page
+       * and link it in. Otherwise, increment index to push a
+       * page. */
+
+      int index;
+      item_page_t *current;        /* Pointer to the current page. */
+      item_page_t first;           /* First page is statically allocated. */
+   } stack;
+} match_state;
+
+/* Initialize a state object */
+
+/* #define NEW_STATE(state) \ */
+/* memset(&state, 0, (void *)(&state.stack) - (void *)(&state)); \ */
+/* state.stack.current = &state.stack.first; \ */
+/* state.stack.first.prev = NULL; \ */
+/* state.stack.first.next = NULL; \ */
+/* state.stack.index = 0; \ */
+/* state.level = 1 */
+
+#define NEW_STATE(state, nregs) \
+{ \
+   int i; \
+   for (i = 0; i < nregs; i++) \
+   { \
+      state.start[i] = NULL; \
+      state.end[i] = NULL; \
+      state.changed[i] = 0; \
+   } \
+   state.stack.current = &state.stack.first; \
+   state.stack.first.prev = NULL; \
+   state.stack.first.next = NULL; \
+   state.stack.index = 0; \
+   state.level = 1; \
+   state.count = 0; \
+   state.level = 0; \
+   state.point = 0; \
+}
+
+/* Free any memory that might have been malloc'd */
+
+#define FREE_STATE(state) \
+while(state.stack.first.next != NULL) \
+{ \
+   state.stack.current = state.stack.first.next; \
+   state.stack.first.next = state.stack.current->next; \
+   free(state.stack.current); \
+}
+
+/* Discard the top 'count' stack items. */
+
+#define STACK_DISCARD(stack, count, on_error) \
+stack.index -= count; \
+while (stack.index < 0) \
+{ \
+   if (stack.current->prev == NULL) \
+           on_error; \
+   stack.current = stack.current->prev; \
+   stack.index += STACK_PAGE_SIZE; \
+}
+
+/* Store a pointer to the previous item on the stack. Used to pop an
+ * item off of the stack. */
+
+#define STACK_PREV(stack, top, on_error) \
+if (stack.index == 0) \
+{ \
+        if (stack.current->prev == NULL) \
+                on_error; \
+        stack.current = stack.current->prev; \
+        stack.index = STACK_PAGE_SIZE - 1; \
+} \
+else \
+{ \
+        stack.index--; \
+} \
+top = &(stack.current->items[stack.index])
+
+/* Store a pointer to the next item on the stack. Used to push an item
+ * on to the stack. */
+
+#define STACK_NEXT(stack, top, on_error) \
+if (stack.index == STACK_PAGE_SIZE) \
+{ \
+        if (stack.current->next == NULL) \
+        { \
+                stack.current->next = (item_page_t *)malloc(sizeof(item_page_t)); \
+                if (stack.current->next == NULL) \
+                        on_error; \
+                stack.current->next->prev = stack.current; \
+                stack.current->next->next = NULL; \
+        } \
+        stack.current = stack.current->next; \
+        stack.index = 0; \
+} \
+top = &(stack.current->items[stack.index++])
+
+/* Store a pointer to the item that is 'count' items back in the
+ * stack. STACK_BACK(stack, top, 1, on_error) is equivalent to
+ * STACK_TOP(stack, top, on_error).  */
+
+#define STACK_BACK(stack, top, count, on_error) \
+{ \
+        int index; \
+        item_page_t *current; \
+        current = stack.current; \
+        index = stack.index - (count); \
+        while (index < 0) \
+        { \
+                if (current->prev == NULL) \
+                        on_error; \
+                current = current->prev; \
+                index += STACK_PAGE_SIZE; \
+        } \
+        top = &(current->items[index]); \
+}
+
+/* Store a pointer to the top item on the stack. Execute the
+ * 'on_error' code if there are no items on the stack. */
+
+#define STACK_TOP(stack, top, on_error) \
+if (stack.index == 0) \
+{ \
+        if (stack.current->prev == NULL) \
+                on_error; \
+        top = &(stack.current->prev->items[STACK_PAGE_SIZE - 1]); \
+} \
+else \
+{ \
+        top = &(stack.current->items[stack.index - 1]); \
+}
+
+/* Test to see if the stack is empty */
+
+#define STACK_EMPTY(stack) ((stack.index == 0) && \
+                            (stack.current->prev == NULL))
+
+/* Return the start of register 'reg' */
+
+#define GET_REG_START(state, reg) (state.start[reg])
+
+/* Return the end of register 'reg' */
+
+#define GET_REG_END(state, reg) (state.end[reg])
+
+/* Set the start of register 'reg'. If the state of the register needs
+ * saving, push it on the stack. */
+
+#define SET_REG_START(state, reg, text, on_error) \
+if(state.changed[reg] < state.level) \
+{ \
+        item_t *item; \
+        STACK_NEXT(state.stack, item, on_error); \
+        item->reg.num = reg; \
+        item->reg.start = state.start[reg]; \
+        item->reg.end = state.end[reg]; \
+        item->reg.level = state.changed[reg]; \
+        state.changed[reg] = state.level; \
+        state.count++; \
+} \
+state.start[reg] = text
+
+/* Set the end of register 'reg'. If the state of the register needs
+ * saving, push it on the stack. */
+
+#define SET_REG_END(state, reg, text, on_error) \
+if(state.changed[reg] < state.level) \
+{ \
+        item_t *item; \
+        STACK_NEXT(state.stack, item, on_error); \
+        item->reg.num = reg; \
+        item->reg.start = state.start[reg]; \
+        item->reg.end = state.end[reg]; \
+        item->reg.level = state.changed[reg]; \
+        state.changed[reg] = state.level; \
+        state.count++; \
+} \
+state.end[reg] = text
+
+#define PUSH_FAILURE(state, xcode, xtext, on_error) \
+{ \
+        item_t *item; \
+        STACK_NEXT(state.stack, item, on_error); \
+        item->fail.code = xcode; \
+        item->fail.text = xtext; \
+        item->fail.count = state.count; \
+        item->fail.level = state.level; \
+        item->fail.phantom = 0; \
+        state.count = 0; \
+        state.level++; \
+        state.point++; \
+}
+
+/* Update the last failure point with a new position in the text. */
+
+#define UPDATE_FAILURE(state, xtext, on_error) \
+{ \
+   item_t *item; \
+   STACK_BACK(state.stack, item, state.count + 1, on_error); \
+   if (!item->fail.phantom) \
+   { \
+           item_t *item2; \
+           STACK_NEXT(state.stack, item2, on_error); \
+           item2->fail.code = item->fail.code; \
+           item2->fail.text = xtext; \
+           item2->fail.count = state.count; \
+           item2->fail.level = state.level; \
+           item2->fail.phantom = 1; \
+           state.count = 0; \
+           state.level++; \
+           state.point++; \
+   } \
+   else \
+   { \
+           STACK_DISCARD(state.stack, state.count, on_error); \
+           STACK_TOP(state.stack, item, on_error); \
+           item->fail.text = xtext; \
+           state.count = 0; \
+           state.level++; \
+   } \
+}
+
+#define POP_FAILURE(state, xcode, xtext, on_empty, on_error) \
+{ \
+   item_t *item; \
+   do \
+   { \
+           while(state.count > 0) \
+           { \
+                   STACK_PREV(state.stack, item, on_error); \
+                   state.start[item->reg.num] = item->reg.start; \
+                   state.end[item->reg.num] = item->reg.end; \
+                   state.changed[item->reg.num] = item->reg.level; \
+                   state.count--; \
+           } \
+           STACK_PREV(state.stack, item, on_empty); \
+           xcode = item->fail.code; \
+           xtext = item->fail.text; \
+           state.count = item->fail.count; \
+           state.level = item->fail.level; \
+           state.point--; \
+   } \
+   while (item->fail.text == NULL); \
+}
+
+enum regexp_compiled_ops {         /* opcodes for compiled regexp */
+   Cend,                           /* end of pattern reached */
+   Cbol,                           /* beginning of line */
+   Ceol,                           /* end of line */
+   Cset,                           /* character set.  Followed by 32 bytes of set. */
+   Cexact,                         /* followed by a byte to match */
+   Canychar,                       /* matches any character except newline */
+   Cstart_memory,                  /* set register start addr (followed by reg number) */
+   Cend_memory,                    /* set register end addr (followed by reg number) */
+   Cmatch_memory,                  /* match a duplicate of reg contents (regnum follows) */
+   Cjump,                          /* followed by two bytes (lsb,msb) of displacement. */
+   Cstar_jump,                     /* will change to jump/update_failure_jump at runtime */
+   Cfailure_jump,                  /* jump to addr on failure */
+   Cupdate_failure_jump,           /* update topmost failure point and jump */
+   Cdummy_failure_jump,            /* push a dummy failure point and jump */
+   Cbegbuf,                        /* match at beginning of buffer */
+   Cendbuf,                        /* match at end of buffer */
+   Cwordbeg,                       /* match at beginning of word */
+   Cwordend,                       /* match at end of word */
+   Cwordbound,                     /* match if at word boundary */
+   Cnotwordbound,                  /* match if not at word boundary */
+   Csyntaxspec,                    /* matches syntax code (1 byte follows) */
+   Cnotsyntaxspec,                 /* matches if syntax code does not match (1 byte follows) */
+   Crepeat1
+};
+
+enum regexp_syntax_op {            /* syntax codes for plain and quoted characters */
+   Rend,                           /* special code for end of regexp */
+   Rnormal,                        /* normal character */
+   Ranychar,                       /* any character except newline */
+   Rquote,                         /* the quote character */
+   Rbol,                           /* match beginning of line */
+   Reol,                           /* match end of line */
+   Roptional,                      /* match preceding expression optionally */
+   Rstar,                          /* match preceding expr zero or more times */
+   Rplus,                          /* match preceding expr one or more times */
+   Ror,                            /* match either of alternatives */
+   Ropenpar,                       /* opening parenthesis */
+   Rclosepar,                      /* closing parenthesis */
+   Rmemory,                        /* match memory register */
+   Rextended_memory,               /* \vnn to match registers 10-99 */
+   Ropenset,                       /* open set.  Internal syntax hard-coded below. */
+   /* the following are gnu extensions to "normal" regexp syntax */
+   Rbegbuf,                        /* beginning of buffer */
+   Rendbuf,                        /* end of buffer */
+   Rwordchar,                      /* word character */
+   Rnotwordchar,                   /* not word character */
+   Rwordbeg,                       /* beginning of word */
+   Rwordend,                       /* end of word */
+   Rwordbound,                     /* word bound */
+   Rnotwordbound,                  /* not word bound */
+   Rnum_ops
+};
+
+static int re_compile_initialized = 0;
+static int regexp_syntax = RE_SYNTAX_EGREP;
+int re_syntax = RE_SYNTAX_EGREP;   /* Exported copy of regexp_syntax */
+static unsigned char plain_ops[256];
+static unsigned char quoted_ops[256];
+static unsigned char precedences[Rnum_ops];
+static int regexp_context_indep_ops;
+static int regexp_ansi_sequences;
+
+#define NUM_LEVELS  5              /* number of precedence levels in use */
+#define MAX_NESTING 100            /* max nesting level of operators */
+
+#define SYNTAX(ch) re_syntax_table[(unsigned char)(ch)]
+
+unsigned char re_syntax_table[256];
+
+void re_compile_initialize(void)
+{
+   int a;
+
+   static int syntax_table_inited = 0;
+
+   if (!syntax_table_inited) {
+      syntax_table_inited = 1;
+      memset(re_syntax_table, 0, 256);
+      for (a = 'a'; a <= 'z'; a++)
+         re_syntax_table[a] = Sword;
+      for (a = 'A'; a <= 'Z'; a++)
+         re_syntax_table[a] = Sword;
+      for (a = '0'; a <= '9'; a++)
+         re_syntax_table[a] = Sword | Sdigit | Shexdigit;
+      for (a = '0'; a <= '7'; a++)
+         re_syntax_table[a] |= Soctaldigit;
+      for (a = 'A'; a <= 'F'; a++)
+         re_syntax_table[a] |= Shexdigit;
+      for (a = 'a'; a <= 'f'; a++)
+         re_syntax_table[a] |= Shexdigit;
+      re_syntax_table[(int)'_'] = Sword;
+      for (a = 9; a <= 13; a++)
+         re_syntax_table[a] = Swhitespace;
+      re_syntax_table[(int)' '] = Swhitespace;
+   }
+   re_compile_initialized = 1;
+   for (a = 0; a < 256; a++) {
+      plain_ops[a] = Rnormal;
+      quoted_ops[a] = Rnormal;
+   }
+   for (a = '0'; a <= '9'; a++)
+      quoted_ops[a] = Rmemory;
+   plain_ops[(int)'\134'] = Rquote;
+   if (regexp_syntax & RE_NO_BK_PARENS) {
+      plain_ops[(int)'('] = Ropenpar;
+      plain_ops[(int)')'] = Rclosepar;
+   } else {
+      quoted_ops[(int)'('] = Ropenpar;
+      quoted_ops[(int)')'] = Rclosepar;
+   }
+   if (regexp_syntax & RE_NO_BK_VBAR) {
+      plain_ops[(int)'\174'] = Ror;
+   } else {
+      quoted_ops[(int)'\174'] = Ror;
+      plain_ops[(int)'*'] = Rstar;
+      if (regexp_syntax & RE_BK_PLUS_QM) {
+         quoted_ops[(int)'+'] = Rplus;
+         quoted_ops[(int)'?'] = Roptional;
+      } else {
+         plain_ops[(int)'+'] = Rplus;
+         plain_ops[(int)'?'] = Roptional;
+      }
+      if (regexp_syntax & RE_NEWLINE_OR) {
+         plain_ops[(int)'\n'] = Ror;
+      }
+      plain_ops[(int)'\133'] = Ropenset;
+      plain_ops[(int)'\136'] = Rbol;
+      plain_ops[(int)'$'] = Reol;
+      plain_ops[(int)'.'] = Ranychar;
+      if (!(regexp_syntax & RE_NO_GNU_EXTENSIONS)) {
+         quoted_ops[(int)'w'] = Rwordchar;
+         quoted_ops[(int)'W'] = Rnotwordchar;
+         quoted_ops[(int)'<'] = Rwordbeg;
+         quoted_ops[(int)'>'] = Rwordend;
+         quoted_ops[(int)'b'] = Rwordbound;
+         quoted_ops[(int)'B'] = Rnotwordbound;
+         quoted_ops[(int)'`'] = Rbegbuf;
+         quoted_ops[(int)'\''] = Rendbuf;
+      }
+      if (regexp_syntax & RE_ANSI_HEX) {
+         quoted_ops[(int)'v'] = Rextended_memory;
+      }
+      for (a = 0; a < Rnum_ops; a++) {
+         precedences[a] = 4;
+      }
+      if (regexp_syntax & RE_TIGHT_VBAR) {
+         precedences[Ror] = 3;
+         precedences[Rbol] = 2;
+         precedences[Reol] = 2;
+      } else {
+         precedences[Ror] = 2;
+         precedences[Rbol] = 3;
+         precedences[Reol] = 3;
+      }
+      precedences[Rclosepar] = 1;
+      precedences[Rend] = 0;
+      regexp_context_indep_ops = (regexp_syntax & RE_CONTEXT_INDEP_OPS) != 0;
+      regexp_ansi_sequences = (regexp_syntax & RE_ANSI_HEX) != 0;
+   }
+}
+
+int re_set_syntax(int syntax) {
+   int ret;
+
+   ret = regexp_syntax;
+   regexp_syntax = syntax;
+   re_syntax = syntax;          /* Exported copy */
+   re_compile_initialize();
+   return ret;
+}
+
+static int hex_char_to_decimal(int ch) {
+   if (ch >= '0' && ch <= '9')
+      return ch - '0';
+   if (ch >= 'a' && ch <= 'f')
+      return ch - 'a' + 10;
+   if (ch >= 'A' && ch <= 'F')
+      return ch - 'A' + 10;
+   return 16;
+}
+
+static void re_compile_fastmap_aux(regex_t * bufp, unsigned char *code, int pos,
+                                   unsigned char *visited,
+                                   unsigned char *can_be_null,
+                                   unsigned char *fastmap)
+{
+   int a;
+   int b;
+   int syntaxcode;
+
+   if (visited[pos])
+      return;                   /* we have already been here */
+   visited[pos] = 1;
+   for (;;) {
+      switch (code[pos++]) {
+      case Cend:
+         *can_be_null = 1;
+         return;
+      case Cbol:
+      case Cbegbuf:
+      case Cendbuf:
+      case Cwordbeg:
+      case Cwordend:
+      case Cwordbound:
+      case Cnotwordbound:
+         for (a = 0; a < 256; a++)
+            fastmap[a] = 1;
+         break;
+      case Csyntaxspec:
+         syntaxcode = code[pos++];
+         for (a = 0; a < 256; a++)
+            if (SYNTAX(a) & syntaxcode)
+               fastmap[a] = 1;
+         return;
+      case Cnotsyntaxspec:
+         syntaxcode = code[pos++];
+         for (a = 0; a < 256; a++)
+            if (!(SYNTAX(a) & syntaxcode))
+               fastmap[a] = 1;
+         return;
+      case Ceol:
+         fastmap[(int)'\n'] = 1;
+         if (*can_be_null == 0)
+            *can_be_null = 2;      /* can match null, but only at end of buffer */
+         return;
+      case Cset:
+         for (a = 0; a < 256 / 8; a++)
+            if (code[pos + a] != 0)
+               for (b = 0; b < 8; b++)
+                  if (code[pos + a] & (1 << b))
+                     fastmap[(a << 3) + b] = 1;
+         pos += 256 / 8;
+         return;
+      case Cexact:
+         fastmap[(unsigned char)code[pos]] = 1;
+         return;
+      case Canychar:
+         for (a = 0; a < 256; a++)
+            if (a != '\n')
+               fastmap[a] = 1;
+         return;
+      case Cstart_memory:
+      case Cend_memory:
+         pos++;
+         break;
+      case Cmatch_memory:
+         for (a = 0; a < 256; a++)
+            fastmap[a] = 1;
+         *can_be_null = 1;
+         return;
+      case Cjump:
+      case Cdummy_failure_jump:
+      case Cupdate_failure_jump:
+      case Cstar_jump:
+         a = (unsigned char)code[pos++];
+         a |= (unsigned char)code[pos++] << 8;
+         pos += (int)SHORT(a);
+         if (visited[pos]) {
+            /* argh... the regexp contains empty loops.  This is not
+               good, as this may cause a failure stack overflow when
+               matching.  Oh well. */
+            /* this path leads nowhere; pursue other paths. */
+            return;
+         }
+         visited[pos] = 1;
+         break;
+      case Cfailure_jump:
+         a = (unsigned char)code[pos++];
+         a |= (unsigned char)code[pos++] << 8;
+         a = pos + (int)SHORT(a);
+         re_compile_fastmap_aux(bufp, code, a, visited, can_be_null, fastmap);
+         break;
+      case Crepeat1:
+         pos += 2;
+         break;
+      default:
+         set_error("Unknown regex opcode: memory corrupted?");
+         return;
+      }
+   }
+}
+
+static int re_do_compile_fastmap(regex_t * bufp, unsigned char *buffer, int used,
+                                 int pos, unsigned char *can_be_null,
+                                 unsigned char *fastmap)
+{
+   unsigned char small_visited[512], *visited;
+
+   if (used <= (int)sizeof(small_visited))
+      visited = small_visited;
+   else {
+      visited = (unsigned char *)malloc(used);
+      if (!visited)
+         return 0;
+   }
+   *can_be_null = 0;
+   memset(fastmap, 0, 256);
+   memset(visited, 0, used);
+   re_compile_fastmap_aux(bufp, buffer, pos, visited, can_be_null, fastmap);
+   if (visited != small_visited)
+      free(visited);
+   return 1;
+}
+
+void re_compile_fastmap(regex_t * bufp)
+{
+   if (!bufp->fastmap || bufp->fastmap_accurate)
+      return;
+// assert(bufp->used > 0);
+   if (!re_do_compile_fastmap(bufp, bufp->buffer,
+                              bufp->used, 0, &bufp->can_be_null, bufp->fastmap))
+      return;
+   if (got_error)
+      return;
+   if (bufp->buffer[0] == Cbol)
+      bufp->anchor = 1;            /* begline */
+   else if (bufp->buffer[0] == Cbegbuf)
+      bufp->anchor = 2;            /* begbuf */
+   else
+      bufp->anchor = 0;            /* none */
+   bufp->fastmap_accurate = 1;
+}
+
+/* 
+ * star is coded as:
+ * 1: failure_jump 2
+ *    ... code for operand of star
+ *    star_jump 1
+ * 2: ... code after star
+ *
+ * We change the star_jump to update_failure_jump if we can determine
+ * that it is safe to do so; otherwise we change it to an ordinary
+ * jump.
+ *
+ * plus is coded as
+ *
+ *    jump 2
+ * 1: failure_jump 3
+ * 2: ... code for operand of plus
+ *    star_jump 1
+ * 3: ... code after plus
+ *
+ * For star_jump considerations this is processed identically to star.
+ *
+ */
+
+static int re_optimize_star_jump(regex_t * bufp, unsigned char *code)
+{
+   unsigned char map[256];
+   unsigned char can_be_null;
+   unsigned char *p1;
+   unsigned char *p2;
+   unsigned char ch;
+   int a;
+   int b;
+   int num_instructions = 0;
+
+   a = (unsigned char)*code++;
+   a |= (unsigned char)*code++ << 8;
+   a = (int)SHORT(a);
+
+   p1 = code + a + 3;              /* skip the failure_jump */
+   /* Check that the jump is within the pattern */
+   if (p1 < bufp->buffer || bufp->buffer + bufp->used < p1) {
+      set_error("Regex VM jump out of bounds (failure_jump opt)");
+      return 0;
+   }
+// assert(p1[-3] == Cfailure_jump);
+   p2 = code;
+   /* p1 points inside loop, p2 points to after loop */
+   if (!re_do_compile_fastmap(bufp, bufp->buffer, bufp->used,
+                              (int)(p2 - bufp->buffer), &can_be_null, map))
+      goto make_normal_jump;
+
+   /* If we might introduce a new update point inside the
+    * loop, we can't optimize because then update_jump would
+    * update a wrong failure point.  Thus we have to be
+    * quite careful here.
+    */
+
+   /* loop until we find something that consumes a character */
+   for (;;) {
+      num_instructions++;
+      switch (*p1++) {
+      case Cbol:
+      case Ceol:
+      case Cbegbuf:
+      case Cendbuf:
+      case Cwordbeg:
+      case Cwordend:
+      case Cwordbound:
+      case Cnotwordbound:
+         continue;
+      case Cstart_memory:
+      case Cend_memory:
+         p1++;
+         continue;
+      case Cexact:
+         ch = (unsigned char)*p1++;
+         if (map[(int)ch])
+            goto make_normal_jump;
+         break;
+      case Canychar:
+         for (b = 0; b < 256; b++)
+            if (b != '\n' && map[b])
+               goto make_normal_jump;
+         break;
+      case Cset:
+         for (b = 0; b < 256; b++)
+            if ((p1[b >> 3] & (1 << (b & 7))) && map[b])
+               goto make_normal_jump;
+         p1 += 256 / 8;
+         break;
+      default:
+         goto make_normal_jump;
+      }
+      break;
+   }
+   /* now we know that we can't backtrack. */
+   while (p1 != p2 - 3) {
+      num_instructions++;
+      switch (*p1++) {
+      case Cend:
+         return 0;
+      case Cbol:
+      case Ceol:
+      case Canychar:
+      case Cbegbuf:
+      case Cendbuf:
+      case Cwordbeg:
+      case Cwordend:
+      case Cwordbound:
+      case Cnotwordbound:
+         break;
+      case Cset:
+         p1 += 256 / 8;
+         break;
+      case Cexact:
+      case Cstart_memory:
+      case Cend_memory:
+      case Cmatch_memory:
+      case Csyntaxspec:
+      case Cnotsyntaxspec:
+         p1++;
+         break;
+      case Cjump:
+      case Cstar_jump:
+      case Cfailure_jump:
+      case Cupdate_failure_jump:
+      case Cdummy_failure_jump:
+         goto make_normal_jump;
+      default:
+         return 0;
+      }
+   }
+
+   /* make_update_jump: */
+   code -= 3;
+   a += 3;                         /* jump to after the Cfailure_jump */
+   code[0] = Cupdate_failure_jump;
+   code[1] = a & 0xff;
+   code[2] = a >> 8;
+   if (num_instructions > 1)
+      return 1;
+// assert(num_instructions == 1);
+   /* if the only instruction matches a single character, we can do
+    * better */
+   p1 = code + 3 + a;              /* start of sole instruction */
+   if (*p1 == Cset || *p1 == Cexact || *p1 == Canychar ||
+       *p1 == Csyntaxspec || *p1 == Cnotsyntaxspec)
+      code[0] = Crepeat1;
+   return 1;
+
+ make_normal_jump:
+   code -= 3;
+   *code = Cjump;
+   return 1;
+}
+
+static int re_optimize(regex_t * bufp)
+{
+   unsigned char *code;
+
+   code = bufp->buffer;
+
+   while (1) {
+      switch (*code++) {
+      case Cend:
+         return 1;
+      case Canychar:
+      case Cbol:
+      case Ceol:
+      case Cbegbuf:
+      case Cendbuf:
+      case Cwordbeg:
+      case Cwordend:
+      case Cwordbound:
+      case Cnotwordbound:
+         break;
+      case Cset:
+         code += 256 / 8;
+         break;
+      case Cexact:
+      case Cstart_memory:
+      case Cend_memory:
+      case Cmatch_memory:
+      case Csyntaxspec:
+      case Cnotsyntaxspec:
+         code++;
+         break;
+      case Cstar_jump:
+         if (!re_optimize_star_jump(bufp, code)) {
+            return 0;
+         }
+         /* fall through */
+      case Cupdate_failure_jump:
+      case Cjump:
+      case Cdummy_failure_jump:
+      case Cfailure_jump:
+      case Crepeat1:
+         code += 2;
+         break;
+      default:
+         return 0;
+      }
+   }
+}
+
+#define NEXTCHAR(var) \
+{ \
+        if (pos >= size) \
+                goto ends_prematurely; \
+        (var) = regex[pos]; \
+        pos++; \
+}
+
+#define ALLOC(amount) \
+{ \
+          if (pattern_offset+(amount) > alloc) \
+          { \
+                  alloc += 256 + (amount); \
+                  pattern = (unsigned char *)realloc(pattern, alloc); \
+                  if (!pattern) \
+                          goto out_of_memory; \
+          } \
+}
+
+#define STORE(ch) pattern[pattern_offset++] = (ch)
+
+#define CURRENT_LEVEL_START (starts[starts_base + current_level])
+
+#define SET_LEVEL_START starts[starts_base + current_level] = pattern_offset
+
+#define PUSH_LEVEL_STARTS \
+if (starts_base < (MAX_NESTING-1)*NUM_LEVELS) \
+        starts_base += NUM_LEVELS; \
+else \
+        goto too_complex \
+
+#define POP_LEVEL_STARTS starts_base -= NUM_LEVELS
+
+#define PUT_ADDR(offset,addr) \
+{ \
+        int disp = (addr) - (offset) - 2; \
+        pattern[(offset)] = disp & 0xff; \
+        pattern[(offset)+1] = (disp>>8) & 0xff; \
+}
+
+#define INSERT_JUMP(pos,type,addr) \
+{ \
+        int a, p = (pos), t = (type), ad = (addr); \
+        for (a = pattern_offset - 1; a >= p; a--) \
+                pattern[a + 3] = pattern[a]; \
+        pattern[p] = t; \
+        PUT_ADDR(p+1,ad); \
+        pattern_offset += 3; \
+}
+
+#define SETBIT(buf,offset,bit) (buf)[(offset)+(bit)/8] |= (1<<((bit) & 7))
+
+#define SET_FIELDS \
+{ \
+        bufp->allocated = alloc; \
+        bufp->buffer = pattern; \
+        bufp->used = pattern_offset; \
+}
+
+#define GETHEX(var) \
+{ \
+        unsigned char gethex_ch, gethex_value; \
+        NEXTCHAR(gethex_ch); \
+        gethex_value = hex_char_to_decimal(gethex_ch); \
+        if (gethex_value == 16) \
+                goto hex_error; \
+        NEXTCHAR(gethex_ch); \
+        gethex_ch = hex_char_to_decimal(gethex_ch); \
+        if (gethex_ch == 16) \
+                goto hex_error; \
+        (var) = gethex_value * 16 + gethex_ch; \
+}
+
+#define ANSI_TRANSLATE(ch) \
+{ \
+   switch (ch) \
+   { \
+   case 'a': \
+   case 'A': \
+   { \
+           ch = 7; /* audible bell */ \
+           break; \
+   } \
+   case 'b': \
+   case 'B': \
+   { \
+           ch = 8; /* backspace */ \
+           break; \
+   } \
+   case 'f': \
+   case 'F': \
+   { \
+           ch = 12; /* form feed */ \
+           break; \
+   } \
+   case 'n': \
+   case 'N': \
+   { \
+           ch = 10; /* line feed */ \
+           break; \
+   } \
+   case 'r': \
+   case 'R': \
+   { \
+           ch = 13; /* carriage return */ \
+           break; \
+   } \
+   case 't': \
+   case 'T': \
+   { \
+         ch = 9; /* tab */ \
+         break; \
+   } \
+   case 'v': \
+   case 'V': \
+   { \
+           ch = 11; /* vertical tab */ \
+           break; \
+   } \
+   case 'x': /* hex code */ \
+   case 'X': \
+   { \
+           GETHEX(ch); \
+           break; \
+   } \
+   default: \
+   { \
+           /* other characters passed through */ \
+           if (translate) \
+                   ch = translate[(unsigned char)ch]; \
+           break; \
+   } \
+   } \
+}
+
+char *re_compile_pattern(regex_t * bufp, unsigned char *regex)
+{
+   int a;
+   int pos;
+   int op;
+   int current_level;
+   int level;
+   int opcode;
+   int pattern_offset = 0, alloc;
+   int starts[NUM_LEVELS * MAX_NESTING];
+   int starts_base;
+   int future_jumps[MAX_NESTING];
+   int num_jumps;
+   unsigned char ch = '\0';
+   unsigned char *pattern;
+   unsigned char *translate;
+   int next_register;
+   int paren_depth;
+   int num_open_registers;
+   int open_registers[RE_NREGS];
+   int beginning_context;
+   int size = strlen((char *)regex);
+
+   if (!re_compile_initialized)
+      re_compile_initialize();
+   bufp->used = 0;
+   bufp->fastmap_accurate = 0;
+   bufp->uses_registers = 1;
+   bufp->num_registers = 1;
+   translate = bufp->translate;
+   pattern = bufp->buffer;
+   alloc = bufp->allocated;
+   if (alloc == 0 || pattern == NULL) {
+      alloc = 256;
+      pattern = (unsigned char *)malloc(alloc);
+      if (!pattern)
+         goto out_of_memory;
+   }
+   pattern_offset = 0;
+   starts_base = 0;
+   num_jumps = 0;
+   current_level = 0;
+   SET_LEVEL_START;
+   num_open_registers = 0;
+   next_register = 1;
+   paren_depth = 0;
+   beginning_context = 1;
+   op = -1;
+   /* we use Rend dummy to ensure that pending jumps are updated
+      (due to low priority of Rend) before exiting the loop. */
+   pos = 0;
+   while (op != Rend) {
+      if (pos >= size)
+         op = Rend;
+      else {
+         NEXTCHAR(ch);
+         if (translate)
+            ch = translate[(unsigned char)ch];
+         op = plain_ops[(unsigned char)ch];
+         if (op == Rquote) {
+            NEXTCHAR(ch);
+            op = quoted_ops[(unsigned char)ch];
+            if (op == Rnormal && regexp_ansi_sequences)
+               ANSI_TRANSLATE(ch);
+         }
+      }
+      level = precedences[op];
+      /* printf("ch='%c' op=%d level=%d current_level=%d
+         curlevstart=%d\n", ch, op, level, current_level,
+         CURRENT_LEVEL_START); */
+      if (level > current_level) {
+         for (current_level++; current_level < level; current_level++)
+            SET_LEVEL_START;
+         SET_LEVEL_START;
+      } else if (level < current_level) {
+         current_level = level;
+         for (; num_jumps > 0 &&
+              future_jumps[num_jumps - 1] >= CURRENT_LEVEL_START; num_jumps--)
+            PUT_ADDR(future_jumps[num_jumps - 1], pattern_offset);
+      }
+      switch (op) {
+      case Rend:
+         break;
+      case Rnormal:
+       normal_char:
+         opcode = Cexact;
+       store_opcode_and_arg:       /* opcode & ch must be set */
+         SET_LEVEL_START;
+         ALLOC(2);
+         STORE(opcode);
+         STORE(ch);
+         break;
+      case Ranychar:
+         opcode = Canychar;
+       store_opcode:
+         SET_LEVEL_START;
+         ALLOC(1);
+         STORE(opcode);
+         break;
+      case Rquote:
+         set_error("Rquote");
+       /*NOTREACHED*/ case Rbol:
+         if (!beginning_context) {
+            if (regexp_context_indep_ops)
+               goto op_error;
+            else
+               goto normal_char;
+         }
+         opcode = Cbol;
+         goto store_opcode;
+      case Reol:
+         if (!((pos >= size) ||
+               ((regexp_syntax & RE_NO_BK_VBAR) ?
+                (regex[pos] == '\174') :
+                (pos + 1 < size && regex[pos] == '\134' &&
+                 regex[pos + 1] == '\174')) ||
+               ((regexp_syntax & RE_NO_BK_PARENS) ?
+                (regex[pos] == ')') :
+                (pos + 1 < size && regex[pos] == '\134' &&
+                 regex[pos + 1] == ')')))) {
+            if (regexp_context_indep_ops)
+               goto op_error;
+            else
+               goto normal_char;
+         }
+         opcode = Ceol;
+         goto store_opcode;
+         /* NOTREACHED */
+         break;
+      case Roptional:
+         if (beginning_context) {
+            if (regexp_context_indep_ops)
+               goto op_error;
+            else
+               goto normal_char;
+         }
+         if (CURRENT_LEVEL_START == pattern_offset)
+            break;                 /* ignore empty patterns for ? */
+         ALLOC(3);
+         INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, pattern_offset + 3);
+         break;
+      case Rstar:
+      case Rplus:
+         if (beginning_context) {
+            if (regexp_context_indep_ops)
+               goto op_error;
+            else
+               goto normal_char;
+         }
+         if (CURRENT_LEVEL_START == pattern_offset)
+            break;                 /* ignore empty patterns for + and * */
+         ALLOC(9);
+         INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, pattern_offset + 6);
+         INSERT_JUMP(pattern_offset, Cstar_jump, CURRENT_LEVEL_START);
+         if (op == Rplus)          /* jump over initial failure_jump */
+            INSERT_JUMP(CURRENT_LEVEL_START, Cdummy_failure_jump,
+                        CURRENT_LEVEL_START + 6);
+         break;
+      case Ror:
+         ALLOC(6);
+         INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, pattern_offset + 6);
+         if (num_jumps >= MAX_NESTING)
+            goto too_complex;
+         STORE(Cjump);
+         future_jumps[num_jumps++] = pattern_offset;
+         STORE(0);
+         STORE(0);
+         SET_LEVEL_START;
+         break;
+      case Ropenpar:
+         {
+            SET_LEVEL_START;
+            if (next_register < RE_NREGS) {
+               bufp->uses_registers = 1;
+               ALLOC(2);
+               STORE(Cstart_memory);
+               STORE(next_register);
+               open_registers[num_open_registers++] = next_register;
+               bufp->num_registers++;
+               next_register++;
+            }
+            paren_depth++;
+            PUSH_LEVEL_STARTS;
+            current_level = 0;
+            SET_LEVEL_START;
+            break;
+         }
+      case Rclosepar:
+         if (paren_depth <= 0)
+            goto parenthesis_error;
+         POP_LEVEL_STARTS;
+         current_level = precedences[Ropenpar];
+         paren_depth--;
+         if (paren_depth < num_open_registers) {
+            bufp->uses_registers = 1;
+            ALLOC(2);
+            STORE(Cend_memory);
+            num_open_registers--;
+            STORE(open_registers[num_open_registers]);
+         }
+         break;
+      case Rmemory:
+         if (ch == '0')
+            goto bad_match_register;
+         if (!(ch >= '0' && ch <= '9')) {
+            goto bad_match_register;
+         }
+         bufp->uses_registers = 1;
+         opcode = Cmatch_memory;
+         ch -= '0';
+         goto store_opcode_and_arg;
+      case Rextended_memory:
+         NEXTCHAR(ch);
+         if (ch < '0' || ch > '9')
+            goto bad_match_register;
+         NEXTCHAR(a);
+         if (a < '0' || a > '9')
+            goto bad_match_register;
+         ch = 10 * (a - '0') + ch - '0';
+         if (ch == 0 || ch >= RE_NREGS)
+            goto bad_match_register;
+         bufp->uses_registers = 1;
+         opcode = Cmatch_memory;
+         goto store_opcode_and_arg;
+      case Ropenset:
+         {
+            int complement;
+            int prev;
+            int offset;
+            int range;
+            int firstchar;
+
+            SET_LEVEL_START;
+            ALLOC(1 + 256 / 8);
+            STORE(Cset);
+            offset = pattern_offset;
+            for (a = 0; a < 256 / 8; a++)
+               STORE(0);
+            NEXTCHAR(ch);
+            if (translate)
+               ch = translate[(unsigned char)ch];
+            if (ch == '\136') {
+               complement = 1;
+               NEXTCHAR(ch);
+               if (translate)
+                  ch = translate[(unsigned char)ch];
+            } else
+               complement = 0;
+            prev = -1;
+            range = 0;
+            firstchar = 1;
+            while (ch != '\135' || firstchar) {
+               firstchar = 0;
+               if (regexp_ansi_sequences && ch == '\134') {
+                  NEXTCHAR(ch);
+                  ANSI_TRANSLATE(ch);
+               }
+               if (range) {
+                  for (a = prev; a <= (int)ch; a++)
+                     SETBIT(pattern, offset, a);
+                  prev = -1;
+                  range = 0;
+               } else if (prev != -1 && ch == '-')
+                  range = 1;
+               else {
+                  SETBIT(pattern, offset, ch);
+                  prev = ch;
+               }
+               NEXTCHAR(ch);
+               if (translate)
+                  ch = translate[(unsigned char)ch];
+            }
+            if (range)
+               SETBIT(pattern, offset, '-');
+            if (complement) {
+               for (a = 0; a < 256 / 8; a++)
+                  pattern[offset + a] ^= 0xff;
+            }
+            break;
+         }
+      case Rbegbuf:
+         {
+            opcode = Cbegbuf;
+            goto store_opcode;
+         }
+      case Rendbuf:
+         {
+            opcode = Cendbuf;
+            goto store_opcode;
+         }
+      case Rwordchar:
+         {
+            opcode = Csyntaxspec;
+            ch = Sword;
+            goto store_opcode_and_arg;
+         }
+      case Rnotwordchar:
+         {
+            opcode = Cnotsyntaxspec;
+            ch = Sword;
+            goto store_opcode_and_arg;
+         }
+      case Rwordbeg:
+         {
+            opcode = Cwordbeg;
+            goto store_opcode;
+         }
+      case Rwordend:
+         {
+            opcode = Cwordend;
+            goto store_opcode;
+         }
+      case Rwordbound:
+         {
+            opcode = Cwordbound;
+            goto store_opcode;
+         }
+      case Rnotwordbound:
+         {
+            opcode = Cnotwordbound;
+            goto store_opcode;
+         }
+      default:
+         {
+            abort();
+         }
+      }
+      beginning_context = (op == Ropenpar || op == Ror);
+   }
+   if (starts_base != 0)
+      goto parenthesis_error;
+// assert(num_jumps == 0);
+   ALLOC(1);
+   STORE(Cend);
+   SET_FIELDS;
+   if (!re_optimize(bufp))
+      return "Optimization error";
+   return NULL;
+
+ op_error:
+   SET_FIELDS;
+   return "Badly placed special character";
+
+ bad_match_register:
+   SET_FIELDS;
+   return "Bad match register number";
+
+ hex_error:
+   SET_FIELDS;
+   return "Bad hexadecimal number";
+
+ parenthesis_error:
+   SET_FIELDS;
+   return "Badly placed parenthesis";
+
+ out_of_memory:
+   SET_FIELDS;
+   return "Out of memory";
+
+ ends_prematurely:
+   SET_FIELDS;
+   return "Regular expression ends prematurely";
+
+ too_complex:
+   SET_FIELDS;
+   return "Regular expression too complex";
+}
+
+#undef CHARAT
+#undef NEXTCHAR
+#undef GETHEX
+#undef ALLOC
+#undef STORE
+#undef CURRENT_LEVEL_START
+#undef SET_LEVEL_START
+#undef PUSH_LEVEL_STARTS
+#undef POP_LEVEL_STARTS
+#undef PUT_ADDR
+#undef INSERT_JUMP
+#undef SETBIT
+#undef SET_FIELDS
+
+#define PREFETCH if (text == textend) goto fail
+
+#define NEXTCHAR(var) \
+PREFETCH; \
+var = (unsigned char)*text++; \
+if (translate) \
+        var = translate[var]
+
+
+int regcomp(regex_t * bufp, const char *regex, int cflags)
+{
+   memset(bufp, 0, sizeof(regex_t));
+   re_compile_pattern(bufp, (unsigned char *)regex);
+   if (got_error) {
+      return -1;
+   }
+   return 0;
+}
+
+int regexec(regex_t * preg, const char *string, size_t nmatch,
+            regmatch_t pmatch[], int eflags)
+{
+   int stat;
+   int len = strlen(string);
+   struct re_registers regs;
+   stat = re_search(preg, (unsigned char *)string, len, 0, len, &regs);
+   /* stat is the start position in the string base 0 where       
+    *  the pattern was found or negative if not found.
+    */
+   return stat < 0 ? -1 : 0;
+}
+
+size_t regerror(int errcode, regex_t * preg, char *errbuf, size_t errbuf_size)
+{
+   bstrncpy(errbuf, preg->errmsg, errbuf_size);
+   return 0;
+}
+
+void regfree(regex_t * preg)
+{
+}
+
+int re_match(regex_t * bufp, unsigned char *string, int size, int pos,
+             regexp_registers_t old_regs)
+{
+   unsigned char *code;
+   unsigned char *translate;
+   unsigned char *text;
+   unsigned char *textstart;
+   unsigned char *textend;
+   int a;
+   int b;
+   int ch;
+   int reg;
+   int match_end;
+   unsigned char *regstart;
+   unsigned char *regend;
+   int regsize;
+   match_state state;
+
+// assert(pos >= 0 && size >= 0);
+// assert(pos <= size);
+
+   text = string + pos;
+   textstart = string;
+   textend = string + size;
+
+   code = bufp->buffer;
+
+   translate = bufp->translate;
+
+   NEW_STATE(state, bufp->num_registers);
+
+ continue_matching:
+   switch (*code++) {
+   case Cend:
+      {
+         match_end = text - textstart;
+         if (old_regs) {
+            old_regs->start[0] = pos;
+            old_regs->end[0] = match_end;
+            if (!bufp->uses_registers) {
+               for (a = 1; a < RE_NREGS; a++) {
+                  old_regs->start[a] = -1;
+                  old_regs->end[a] = -1;
+               }
+            } else {
+               for (a = 1; a < bufp->num_registers; a++) {
+                  if ((GET_REG_START(state, a) == NULL) ||
+                      (GET_REG_END(state, a) == NULL)) {
+                     old_regs->start[a] = -1;
+                     old_regs->end[a] = -1;
+                     continue;
+                  }
+                  old_regs->start[a] = GET_REG_START(state, a) - textstart;
+                  old_regs->end[a] = GET_REG_END(state, a) - textstart;
+               }
+               for (; a < RE_NREGS; a++) {
+                  old_regs->start[a] = -1;
+                  old_regs->end[a] = -1;
+               }
+            }
+         }
+         FREE_STATE(state);
+         return match_end - pos;
+      }
+   case Cbol:
+      {
+         if (text == textstart || text[-1] == '\n')
+            goto continue_matching;
+         goto fail;
+      }
+   case Ceol:
+      {
+         if (text == textend || *text == '\n')
+            goto continue_matching;
+         goto fail;
+      }
+   case Cset:
+      {
+         NEXTCHAR(ch);
+         if (code[ch / 8] & (1 << (ch & 7))) {
+            code += 256 / 8;
+            goto continue_matching;
+         }
+         goto fail;
+      }
+   case Cexact:
+      {
+         NEXTCHAR(ch);
+         if (ch != (unsigned char)*code++)
+            goto fail;
+         goto continue_matching;
+      }
+   case Canychar:
+      {
+         NEXTCHAR(ch);
+         if (ch == '\n')
+            goto fail;
+         goto continue_matching;
+      }
+   case Cstart_memory:
+      {
+         reg = *code++;
+         SET_REG_START(state, reg, text, goto error);
+         goto continue_matching;
+      }
+   case Cend_memory:
+      {
+         reg = *code++;
+         SET_REG_END(state, reg, text, goto error);
+         goto continue_matching;
+      }
+   case Cmatch_memory:
+      {
+         reg = *code++;
+         regstart = GET_REG_START(state, reg);
+         regend = GET_REG_END(state, reg);
+         if ((regstart == NULL) || (regend == NULL))
+            goto fail;             /* or should we just match nothing? */
+         regsize = regend - regstart;
+
+         if (regsize > (textend - text))
+            goto fail;
+         if (translate) {
+            for (; regstart < regend; regstart++, text++)
+               if (translate[*regstart] != translate[*text])
+                  goto fail;
+         } else
+            for (; regstart < regend; regstart++, text++)
+               if (*regstart != *text)
+                  goto fail;
+         goto continue_matching;
+      }
+   case Cupdate_failure_jump:
+      {
+         UPDATE_FAILURE(state, text, goto error);
+         /* fall to next case */
+      }
+      /* treat Cstar_jump just like Cjump if it hasn't been optimized */
+   case Cstar_jump:
+   case Cjump:
+      {
+         a = (unsigned char)*code++;
+         a |= (unsigned char)*code++ << 8;
+         code += (int)SHORT(a);
+         if (code < bufp->buffer || bufp->buffer + bufp->used < code) {
+            set_error("Regex VM jump out of bounds (Cjump)");
+            FREE_STATE(state);
+            return -2;
+         }
+         goto continue_matching;
+      }
+   case Cdummy_failure_jump:
+      {
+         unsigned char *failuredest;
+
+         a = (unsigned char)*code++;
+         a |= (unsigned char)*code++ << 8;
+         a = (int)SHORT(a);
+//       assert(*code == Cfailure_jump);
+         b = (unsigned char)code[1];
+         b |= (unsigned char)code[2] << 8;
+         failuredest = code + (int)SHORT(b) + 3;
+         if (failuredest < bufp->buffer || bufp->buffer + bufp->used < failuredest) {
+            set_error
+               ("Regex VM jump out of bounds (Cdummy_failure_jump failuredest)");
+            FREE_STATE(state);
+            return -2;
+         }
+         PUSH_FAILURE(state, failuredest, NULL, goto error);
+         code += a;
+         if (code < bufp->buffer || bufp->buffer + bufp->used < code) {
+            set_error("Regex VM jump out of bounds (Cdummy_failure_jump code)");
+            FREE_STATE(state);
+            return -2;
+         }
+         goto continue_matching;
+      }
+   case Cfailure_jump:
+      {
+         a = (unsigned char)*code++;
+         a |= (unsigned char)*code++ << 8;
+         a = (int)SHORT(a);
+         if (code + a < bufp->buffer || bufp->buffer + bufp->used < code + a) {
+            set_error("Regex VM jump out of bounds (Cfailure_jump)");
+            FREE_STATE(state);
+            return -2;
+         }
+         PUSH_FAILURE(state, code + a, text, goto error);
+         goto continue_matching;
+      }
+   case Crepeat1:
+      {
+         unsigned char *pinst;
+         a = (unsigned char)*code++;
+         a |= (unsigned char)*code++ << 8;
+         a = (int)SHORT(a);
+         pinst = code + a;
+         if (pinst < bufp->buffer || bufp->buffer + bufp->used < pinst) {
+            set_error("Regex VM jump out of bounds (Crepeat1)");
+            FREE_STATE(state);
+            return -2;
+         }
+         /* pinst is sole instruction in loop, and it matches a
+          * single character.  Since Crepeat1 was originally a
+          * Cupdate_failure_jump, we also know that backtracking
+          * is useless: so long as the single-character
+          * expression matches, it must be used.  Also, in the
+          * case of +, we've already matched one character, so +
+          * can't fail: nothing here can cause a failure.  */
+         switch (*pinst++) {
+         case Cset:
+            {
+               if (translate) {
+                  while (text < textend) {
+                     ch = translate[(unsigned char)*text];
+                     if (pinst[ch / 8] & (1 << (ch & 7)))
+                        text++;
+                     else
+                        break;
+                  }
+               } else {
+                  while (text < textend) {
+                     ch = (unsigned char)*text;
+                     if (pinst[ch / 8] & (1 << (ch & 7)))
+                        text++;
+                     else
+                        break;
+                  }
+               }
+               break;
+            }
+         case Cexact:
+            {
+               ch = (unsigned char)*pinst;
+               if (translate) {
+                  while (text < textend && translate[(unsigned char)*text] == ch)
+                     text++;
+               } else {
+                  while (text < textend && (unsigned char)*text == ch)
+                     text++;
+               }
+               break;
+            }
+         case Canychar:
+            {
+               while (text < textend && (unsigned char)*text != '\n')
+                  text++;
+               break;
+            }
+         case Csyntaxspec:
+            {
+               a = (unsigned char)*pinst;
+               if (translate) {
+                  while (text < textend && (SYNTAX(translate[*text]) & a))
+                     text++;
+               } else {
+                  while (text < textend && (SYNTAX(*text) & a))
+                     text++;
+               }
+               break;
+            }
+         case Cnotsyntaxspec:
+            {
+               a = (unsigned char)*pinst;
+               if (translate) {
+                  while (text < textend && !(SYNTAX(translate[*text]) & a))
+                     text++;
+               } else {
+                  while (text < textend && !(SYNTAX(*text) & a))
+                     text++;
+               }
+               break;
+            }
+         default:
+            {
+               FREE_STATE(state);
+               set_error("Unknown regex opcode: memory corrupted?");
+               return -2;
+             /*NOTREACHED*/}
+         }
+         /* due to the funky way + and * are compiled, the top
+          * failure- stack entry at this point is actually a
+          * success entry -- update it & pop it */
+         UPDATE_FAILURE(state, text, goto error);
+         goto fail;                /* i.e., succeed <wink/sigh> */
+      }
+   case Cbegbuf:
+      {
+         if (text == textstart)
+            goto continue_matching;
+         goto fail;
+      }
+   case Cendbuf:
+      {
+         if (text == textend)
+            goto continue_matching;
+         goto fail;
+      }
+   case Cwordbeg:
+      {
+         if (text == textend)
+            goto fail;
+         if (!(SYNTAX(*text) & Sword))
+            goto fail;
+         if (text == textstart)
+            goto continue_matching;
+         if (!(SYNTAX(text[-1]) & Sword))
+            goto continue_matching;
+         goto fail;
+      }
+   case Cwordend:
+      {
+         if (text == textstart)
+            goto fail;
+         if (!(SYNTAX(text[-1]) & Sword))
+            goto fail;
+         if (text == textend)
+            goto continue_matching;
+         if (!(SYNTAX(*text) & Sword))
+            goto continue_matching;
+         goto fail;
+      }
+   case Cwordbound:
+      {
+         /* Note: as in gnu regexp, this also matches at the
+          * beginning and end of buffer.  */
+
+         if (text == textstart || text == textend)
+            goto continue_matching;
+         if ((SYNTAX(text[-1]) & Sword) ^ (SYNTAX(*text) & Sword))
+            goto continue_matching;
+         goto fail;
+      }
+   case Cnotwordbound:
+      {
+         /* Note: as in gnu regexp, this never matches at the
+          * beginning and end of buffer.  */
+         if (text == textstart || text == textend)
+            goto fail;
+         if (!((SYNTAX(text[-1]) & Sword) ^ (SYNTAX(*text) & Sword)))
+            goto continue_matching;
+         goto fail;
+      }
+   case Csyntaxspec:
+      {
+         NEXTCHAR(ch);
+         if (!(SYNTAX(ch) & (unsigned char)*code++))
+            goto fail;
+         goto continue_matching;
+      }
+   case Cnotsyntaxspec:
+      {
+         NEXTCHAR(ch);
+         if (SYNTAX(ch) & (unsigned char)*code++)
+            goto fail;
+         goto continue_matching;
+      }
+   default:
+      {
+         FREE_STATE(state);
+         set_error("Unknown regex opcode: memory corrupted?");
+         return -2;
+       /*NOTREACHED*/}
+   }
+
+
+
+#if 0                              /* This line is never reached --Guido */
+   abort();
+#endif
+   /*
+    *NOTREACHED
+    */
+
+   /* Using "break;" in the above switch statement is equivalent to "goto fail;" */
+ fail:
+   POP_FAILURE(state, code, text, goto done_matching, goto error);
+   goto continue_matching;
+
+ done_matching:
+/*   if(translated != NULL) */
+/*      free(translated); */
+   FREE_STATE(state);
+   return -1;
+
+ error:
+/*   if (translated != NULL) */
+/*      free(translated); */
+   FREE_STATE(state);
+   return -2;
+}
+
+
+#undef PREFETCH
+#undef NEXTCHAR
+
+int re_search(regex_t * bufp, unsigned char *string, int size, int pos,
+              int range, regexp_registers_t regs)
+{
+   unsigned char *fastmap;
+   unsigned char *translate;
+   unsigned char *text;
+   unsigned char *partstart;
+   unsigned char *partend;
+   int dir;
+   int ret;
+   unsigned char anchor;
+
+// assert(size >= 0 && pos >= 0);
+// assert(pos + range >= 0 && pos + range <= size);     /* Bugfix by ylo */
+
+   fastmap = bufp->fastmap;
+   translate = bufp->translate;
+   if (fastmap && !bufp->fastmap_accurate) {
+      re_compile_fastmap(bufp);
+      if (got_error)
+         return -2;
+   }
+
+   anchor = bufp->anchor;
+   if (bufp->can_be_null == 1)     /* can_be_null == 2: can match null at eob */
+      fastmap = NULL;
+
+   if (range < 0) {
+      dir = -1;
+      range = -range;
+   } else
+      dir = 1;
+
+   if (anchor == 2) {
+      if (pos != 0)
+         return -1;
+      else
+         range = 0;
+   }
+
+   for (; range >= 0; range--, pos += dir) {
+      if (fastmap) {
+         if (dir == 1) {           /* searching forwards */
+
+            text = string + pos;
+            partend = string + size;
+            partstart = text;
+            if (translate)
+               while (text != partend &&
+                      !fastmap[(unsigned char)translate[(unsigned char)*text]])
+                  text++;
+            else
+               while (text != partend && !fastmap[(unsigned char)*text])
+                  text++;
+            pos += text - partstart;
+            range -= text - partstart;
+            if (pos == size && bufp->can_be_null == 0)
+               return -1;
+         } else {                  /* searching backwards */
+            text = string + pos;
+            partstart = string + pos - range;
+            partend = text;
+            if (translate)
+               while (text != partstart && !fastmap[(unsigned char)
+                                                    translate[(unsigned char)*text]])
+                  text--;
+            else
+               while (text != partstart && !fastmap[(unsigned char)*text])
+                  text--;
+            pos -= partend - text;
+            range -= partend - text;
+         }
+      }
+      if (anchor == 1) {           /* anchored to begline */
+         if (pos > 0 && (string[pos - 1] != '\n'))
+            continue;
+      }
+//    assert(pos >= 0 && pos <= size);
+      ret = re_match(bufp, string, size, pos, regs);
+      if (ret >= 0)
+         return pos;
+      if (ret == -2)
+         return -2;
+   }
+   return -1;
+}
+
+/*
+** Local Variables:
+** mode: c
+** c-file-style: "python"
+** End:
+*/
index b2d9a62fec9708e369d4478b97085e6c0bb79477..b2f3fabe36887ce54c7d1de74383ad9510f5574a 100644 (file)
-/* Definitions for data structures and routines for the regular
-   expression library.
-   Copyright (C) 1985,1989-93,1995-98,2000,2001,2002,2003
-   Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
 
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#ifndef _REGEX_H
-#define _REGEX_H 1
-
-#include <sys/types.h>
-
-/* Allow the use in C++ code.  */
+#ifndef b_REGEXPR_H
+#define b_REGEXPR_H
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/* POSIX says that <sys/types.h> must be included (by the caller) before
-   <regex.h>.  */
-
-#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS
-/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
-   should be there.  */
-# include <stddef.h>
-#endif
-
-/* The following two types have to be signed and unsigned integer type
-   wide enough to hold a value of a pointer.  For most ANSI compilers
-   ptrdiff_t and size_t should be likely OK.  Still size of these two
-   types is 2 for Microsoft C.  Ugh... */
-typedef long int s_reg_t;
-typedef unsigned long int active_reg_t;
-
-/* The following bits are used to determine the regexp syntax we
-   recognize.  The set/not-set meanings are chosen so that Emacs syntax
-   remains the value 0.  The bits are given in alphabetical order, and
-   the definitions shifted by one from the previous bit; thus, when we
-   add or remove a bit, only one other definition need change.  */
-typedef unsigned long int reg_syntax_t;
-
-/* If this bit is not set, then \ inside a bracket expression is literal.
-   If set, then such a \ quotes the following character.  */
-#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
-
-/* If this bit is not set, then + and ? are operators, and \+ and \? are
-     literals.
-   If set, then \+ and \? are operators and + and ? are literals.  */
-#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
-
-/* If this bit is set, then character classes are supported.  They are:
-     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
-     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
-   If not set, then character classes are not supported.  */
-#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
-
-/* If this bit is set, then ^ and $ are always anchors (outside bracket
-     expressions, of course).
-   If this bit is not set, then it depends:
-        ^  is an anchor if it is at the beginning of a regular
-           expression or after an open-group or an alternation operator;
-        $  is an anchor if it is at the end of a regular expression, or
-           before a close-group or an alternation operator.
-
-   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
-   POSIX draft 11.2 says that * etc. in leading positions is undefined.
-   We already implemented a previous draft which made those constructs
-   invalid, though, so we haven't changed the code back.  */
-#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
-
-/* If this bit is set, then special characters are always special
-     regardless of where they are in the pattern.
-   If this bit is not set, then special characters are special only in
-     some contexts; otherwise they are ordinary.  Specifically,
-     * + ? and intervals are only special when not after the beginning,
-     open-group, or alternation operator.  */
-#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
-
-/* If this bit is set, then *, +, ?, and { cannot be first in an re or
-     immediately after an alternation or begin-group operator.  */
-#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
-
-/* If this bit is set, then . matches newline.
-   If not set, then it doesn't.  */
-#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
-
-/* If this bit is set, then . doesn't match NUL.
-   If not set, then it does.  */
-#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
-
-/* If this bit is set, nonmatching lists [^...] do not match newline.
-   If not set, they do.  */
-#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
-
-/* If this bit is set, either \{...\} or {...} defines an
-     interval, depending on RE_NO_BK_BRACES.
-   If not set, \{, \}, {, and } are literals.  */
-#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
-
-/* If this bit is set, +, ? and | aren't recognized as operators.
-   If not set, they are.  */
-#define RE_LIMITED_OPS (RE_INTERVALS << 1)
-
-/* If this bit is set, newline is an alternation operator.
-   If not set, newline is literal.  */
-#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
-
-/* If this bit is set, then `{...}' defines an interval, and \{ and \}
-     are literals.
-  If not set, then `\{...\}' defines an interval.  */
-#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
-
-/* If this bit is set, (...) defines a group, and \( and \) are literals.
-   If not set, \(...\) defines a group, and ( and ) are literals.  */
-#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
-
-/* If this bit is set, then \<digit> matches <digit>.
-   If not set, then \<digit> is a back-reference.  */
-#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
-
-/* If this bit is set, then | is an alternation operator, and \| is literal.
-   If not set, then \| is an alternation operator, and | is literal.  */
-#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
-
-/* If this bit is set, then an ending range point collating higher
-     than the starting range point, as in [z-a], is invalid.
-   If not set, then when ending range point collates higher than the
-     starting range point, the range is ignored.  */
-#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
-
-/* If this bit is set, then an unmatched ) is ordinary.
-   If not set, then an unmatched ) is invalid.  */
-#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
-
-/* If this bit is set, succeed as soon as we match the whole pattern,
-   without further backtracking.  */
-#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
-
-/* If this bit is set, do not process the GNU regex operators.
-   If not set, then the GNU regex operators are recognized. */
-#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
-
-/* If this bit is set, turn on internal regex debugging.
-   If not set, and debugging was on, turn it off.
-   This only works if regex.c is compiled -DDEBUG.
-   We define this bit always, so that all that's needed to turn on
-   debugging is to recompile regex.c; the calling code can always have
-   this bit set, and it won't affect anything in the normal case. */
-#define RE_DEBUG (RE_NO_GNU_OPS << 1)
-
-/* If this bit is set, a syntactically invalid interval is treated as
-   a string of ordinary characters.  For example, the ERE 'a{1' is
-   treated as 'a\{1'.  */
-#define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
-
-/* If this bit is set, then ignore case when matching.
-   If not set, then case is significant.  */
-#define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
-
-/* This bit is used internally like RE_CONTEXT_INDEP_ANCHORS but only
-   for ^, because it is difficult to scan the regex backwards to find
-   whether ^ should be special.  */
-#define RE_CARET_ANCHORS_HERE (RE_ICASE << 1)
-
-/* If this bit is set, then \{ cannot be first in an bre or
-   immediately after an alternation or begin-group operator.  */
-#define RE_CONTEXT_INVALID_DUP (RE_CARET_ANCHORS_HERE << 1)
-
-/* If this bit is set, then no_sub will be set to 1 during
-   re_compile_pattern.  */
-#define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1)
-
-/* This global variable defines the particular regexp syntax to use (for
-   some interfaces).  When a regexp is compiled, the syntax used is
-   stored in the pattern buffer, so changing this does not affect
-   already-compiled regexps.  */
-extern reg_syntax_t re_syntax_options;
-\f
-/* Define combinations of the above bits for the standard possibilities.
-   (The [[[ comments delimit what gets put into the Texinfo file, so
-   don't delete them!)  */
-/* [[[begin syntaxes]]] */
-#define RE_SYNTAX_EMACS 0
-
-#define RE_SYNTAX_AWK                                                  \
-  (RE_BACKSLASH_ESCAPE_IN_LISTS   | RE_DOT_NOT_NULL                    \
-   | RE_NO_BK_PARENS              | RE_NO_BK_REFS                      \
-   | RE_NO_BK_VBAR                | RE_NO_EMPTY_RANGES                 \
-   | RE_DOT_NEWLINE              | RE_CONTEXT_INDEP_ANCHORS            \
-   | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
-
-#define RE_SYNTAX_GNU_AWK                                              \
-  ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG)        \
-   & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS           \
-       | RE_CONTEXT_INVALID_OPS ))
-
-#define RE_SYNTAX_POSIX_AWK                                            \
-  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS             \
-   | RE_INTERVALS          | RE_NO_GNU_OPS)
-
-#define RE_SYNTAX_GREP                                                 \
-  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES                                \
-   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS                           \
-   | RE_NEWLINE_ALT)
-
-#define RE_SYNTAX_EGREP                                                        \
-  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS                   \
-   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE                   \
-   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS                            \
-   | RE_NO_BK_VBAR)
-
-#define RE_SYNTAX_POSIX_EGREP                                          \
-  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES                    \
-   | RE_INVALID_INTERVAL_ORD)
-
-/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
-#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
-
-#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
-
-/* Syntax bits common to both basic and extended POSIX regex syntax.  */
-#define _RE_SYNTAX_POSIX_COMMON                                                \
-  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL             \
-   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
-
-#define RE_SYNTAX_POSIX_BASIC                                          \
-  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP)
-
-/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
-   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
-   isn't minimal, since other operators, such as \`, aren't disabled.  */
-#define RE_SYNTAX_POSIX_MINIMAL_BASIC                                  \
-  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
-
-#define RE_SYNTAX_POSIX_EXTENDED                                       \
-  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS                 \
-   | RE_CONTEXT_INDEP_OPS   | RE_NO_BK_BRACES                          \
-   | RE_NO_BK_PARENS        | RE_NO_BK_VBAR                            \
-   | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
-
-/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
-   removed and RE_NO_BK_REFS is added.  */
-#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED                               \
-  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS                 \
-   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES                          \
-   | RE_NO_BK_PARENS        | RE_NO_BK_REFS                            \
-   | RE_NO_BK_VBAR         | RE_UNMATCHED_RIGHT_PAREN_ORD)
-/* [[[end syntaxes]]] */
-\f
-/* Maximum number of duplicates an interval can allow.  Some systems
-   (erroneously) define this in other header files, but we want our
-   value, so remove any previous define.  */
-#ifdef RE_DUP_MAX
-# undef RE_DUP_MAX
-#endif
-/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows.  */
-#define RE_DUP_MAX (0x7fff)
-
-
-/* POSIX `cflags' bits (i.e., information for `regcomp').  */
-
-/* If this bit is set, then use extended regular expression syntax.
-   If not set, then use basic regular expression syntax.  */
-#define REG_EXTENDED 1
-
-/* If this bit is set, then ignore case when matching.
-   If not set, then case is significant.  */
-#define REG_ICASE (REG_EXTENDED << 1)
-
-/* If this bit is set, then anchors do not match at newline
-     characters in the string.
-   If not set, then anchors do match at newlines.  */
-#define REG_NEWLINE (REG_ICASE << 1)
-
-/* If this bit is set, then report only success or fail in regexec.
-   If not set, then returns differ between not matching and errors.  */
-#define REG_NOSUB (REG_NEWLINE << 1)
-
-
-/* POSIX `eflags' bits (i.e., information for regexec).  */
-
-/* If this bit is set, then the beginning-of-line operator doesn't match
-     the beginning of the string (presumably because it's not the
-     beginning of a line).
-   If not set, then the beginning-of-line operator does match the
-     beginning of the string.  */
-#define REG_NOTBOL 1
-
-/* Like REG_NOTBOL, except for the end-of-line.  */
-#define REG_NOTEOL (1 << 1)
-
-/* Use PMATCH[0] to delimit the start and end of the search in the
-   buffer.  */
-#define REG_STARTEND (1 << 2)
+/*
+ * regexpr.h
+ *
+ * Author: Tatu Ylonen <ylo@ngs.fi>
+ *
+ * Copyright (c) 1991 Tatu Ylonen, Espoo, Finland
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies.  This
+ * software is provided "as is" without express or implied warranty.
+ *
+ * Created: Thu Sep 26 17:15:36 1991 ylo
+ * Last modified: Mon Nov  4 15:49:46 1991 ylo
+ *
+ *  Modified to work with C++ for use in Bacula,           
+ *     Kern Sibbald April, 2006
+ */ 
+
+#ifndef REGEXPR_H
+#define REGEXPR_H
+
+/* If we pull in this header, make sure we only get our own library
+ *  bregex.c 
+ */
+#define regex_t               b_regex_t
+#define regmatch_t            b_regmatch_t
+#define re_syntax             b_re_syntax
+#define re_syntax_table       b_re_syntax_table
+#define re_compile_initialize b_re_compile_initialize
+#define re_set_syntax         b_re_set_syntax
+#define re_compile_pattern    b_re_compile_pattern
+#define re_match              b_re_match
+#define re_search             b_re_search
+#define re_compile_fastmap    b_re_compile_fastmap
+#define re_comp               b_re_comp
+#define re_exec               b_re_exec
+#define regcomp               b_regcomp
+#define regexec               b_regexec
+#define regerror              b_regerror
+#define regfree               b_regfree
+
+
+#define RE_NREGS        100  /* number of registers available */
+
+#define regoff_t int
+
+typedef struct {
+   regoff_t rm_so;
+   regoff_t rm_eo;
+} regmatch_t;
 
 
-/* If any error codes are removed, changed, or added, update the
-   `re_error_msg' table in regex.c.  */
-typedef enum
-{
-#ifdef _XOPEN_SOURCE
-  REG_ENOSYS = -1,     /* This will never happen for this implementation.  */
-#endif
+#define REG_EXTENDED (1<<1)
+#define REG_ICASE    (1<<2)
+#define REG_NOSUB    (1<<3)
+#define REG_NEWLINE  (1<<4)
 
-  REG_NOERROR = 0,     /* Success.  */
-  REG_NOMATCH,         /* Didn't find a match (for regexec).  */
-
-  /* POSIX regcomp return error codes.  (In the order listed in the
-     standard.)  */
-  REG_BADPAT,          /* Invalid pattern.  */
-  REG_ECOLLATE,                /* Inalid collating element.  */
-  REG_ECTYPE,          /* Invalid character class name.  */
-  REG_EESCAPE,         /* Trailing backslash.  */
-  REG_ESUBREG,         /* Invalid back reference.  */
-  REG_EBRACK,          /* Unmatched left bracket.  */
-  REG_EPAREN,          /* Parenthesis imbalance.  */
-  REG_EBRACE,          /* Unmatched \{.  */
-  REG_BADBR,           /* Invalid contents of \{\}.  */
-  REG_ERANGE,          /* Invalid range end.  */
-  REG_ESPACE,          /* Ran out of memory.  */
-  REG_BADRPT,          /* No preceding re for repetition op.  */
-
-  /* Error codes we've added.  */
-  REG_EEND,            /* Premature end.  */
-  REG_ESIZE,           /* Compiled pattern bigger than 2^16 bytes.  */
-  REG_ERPAREN          /* Unmatched ) or \); not returned from regcomp.  */
-} reg_errcode_t;
-\f
-/* This data structure represents a compiled pattern.  Before calling
-   the pattern compiler, the fields `buffer', `allocated', `fastmap',
-   `translate', and `no_sub' can be set.  After the pattern has been
-   compiled, the `re_nsub' field is available.  All other fields are
-   private to the regex routines.  */
-
-#ifndef RE_TRANSLATE_TYPE
-# define RE_TRANSLATE_TYPE char *
-#endif
+#define REG_NOMATCH -1
 
-struct re_pattern_buffer
+struct regex_t
 {
-/* [[[begin pattern_buffer]]] */
-       /* Space that holds the compiled pattern.  It is declared as
-          `unsigned char *' because its elements are
-           sometimes used as array indexes.  */
-  unsigned char *buffer;
-
-       /* Number of bytes to which `buffer' points.  */
-  unsigned long int allocated;
-
-       /* Number of bytes actually used in `buffer'.  */
-  unsigned long int used;
-
-        /* Syntax setting with which the pattern was compiled.  */
-  reg_syntax_t syntax;
-
-        /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
-           the fastmap, if there is one, to skip over impossible
-           starting points for matches.  */
-  char *fastmap;
-
-        /* Either a translate table to apply to all characters before
-           comparing them, or zero for no translation.  The translation
-           is applied to a pattern when it is compiled and to a string
-           when it is matched.  */
-  RE_TRANSLATE_TYPE translate;
-
-       /* Number of subexpressions found by the compiler.  */
-  size_t re_nsub;
-
-        /* Zero if this pattern cannot match the empty string, one else.
-           Well, in truth it's used only in `re_search_2', to see
-           whether or not we should use the fastmap, so we don't set
-           this absolutely perfectly; see `re_compile_fastmap' (the
-           `duplicate' case).  */
-  unsigned can_be_null : 1;
-
-        /* If REGS_UNALLOCATED, allocate space in the `regs' structure
-             for `max (RE_NREGS, re_nsub + 1)' groups.
-           If REGS_REALLOCATE, reallocate space if necessary.
-           If REGS_FIXED, use what's there.  */
-#define REGS_UNALLOCATED 0
-#define REGS_REALLOCATE 1
-#define REGS_FIXED 2
-  unsigned regs_allocated : 2;
-
-        /* Set to zero when `regex_compile' compiles a pattern; set to one
-           by `re_compile_fastmap' if it updates the fastmap.  */
-  unsigned fastmap_accurate : 1;
-
-        /* If set, `re_match_2' does not return information about
-           subexpressions.  */
-  unsigned no_sub : 1;
-
-        /* If set, a beginning-of-line anchor doesn't match at the
-           beginning of the string.  */
-  unsigned not_bol : 1;
-
-        /* Similarly for an end-of-line anchor.  */
-  unsigned not_eol : 1;
-
-        /* If true, an anchor at a newline matches.  */
-  unsigned newline_anchor : 1;
-
-/* [[[end pattern_buffer]]] */
-};
-
-typedef struct re_pattern_buffer regex_t;
-\f
-/* Type for byte offsets within the string.  POSIX mandates this.  */
-typedef int regoff_t;
-
-
-/* This is the structure we store register match data in.  See
-   regex.texinfo for a full description of what registers match.  */
-struct re_registers
+   unsigned char *buffer;          /* compiled pattern */
+   int allocated;         /* allocated size of compiled pattern */
+   int used;              /* actual length of compiled pattern */
+   unsigned char *fastmap;         /* fastmap[ch] is true if ch can start pattern */
+   unsigned char *translate;       /* translation to apply during compilation/matching */
+   unsigned char fastmap_accurate; /* true if fastmap is valid */
+   unsigned char can_be_null;      /* true if can match empty string */
+   unsigned char uses_registers;   /* registers are used and need to be initialized */
+   int num_registers;     /* number of registers used */
+   unsigned char anchor;           /* anchor: 0=none 1=begline 2=begbuf */
+   char *errmsg;
+};        
+
+
+typedef struct re_registers
 {
-  unsigned num_regs;
-  regoff_t *start;
-  regoff_t *end;
-};
-
-
-/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
-   `re_match_2' returns information about at least this many registers
-   the first time a `regs' structure is passed.  */
-#ifndef RE_NREGS
-# define RE_NREGS 30
-#endif
-
-
-/* POSIX specification for registers.  Aside from the different names than
-   `re_registers', POSIX uses an array of structures, instead of a
-   structure of arrays.  */
-typedef struct
-{
-  regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
-  regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
-} regmatch_t;
-\f
-/* Declarations for routines.  */
-
-/* To avoid duplicating every routine declaration -- once with a
-   prototype (if we are ANSI), and once without (if we aren't) -- we
-   use the following macro to declare argument types.  This
-   unfortunately clutters up the declarations a bit, but I think it's
-   worth it.  */
-
-#if __STDC__
-
-# define _RE_ARGS(args) args
-
-#else /* not __STDC__ */
-
-# define _RE_ARGS(args) ()
-
-#endif /* not __STDC__ */
-
-/* Sets the current default syntax to SYNTAX, and return the old syntax.
-   You can also simply assign to the `re_syntax_options' variable.  */
-extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
-
-/* Compile the regular expression PATTERN, with length LENGTH
-   and syntax given by the global `re_syntax_options', into the buffer
-   BUFFER.  Return NULL if successful, and an error string if not.  */
-extern const char *re_compile_pattern
-  _RE_ARGS ((const char *pattern, size_t length,
-             struct re_pattern_buffer *buffer));
-
+   int start[RE_NREGS];  /* start offset of region */
+   int end[RE_NREGS];    /* end offset of region */
+} *regexp_registers_t;
+
+/* bit definitions for syntax */
+#define RE_NO_BK_PARENS         1    /* no quoting for parentheses */
+#define RE_NO_BK_VBAR           2    /* no quoting for vertical bar */
+#define RE_BK_PLUS_QM           4    /* quoting needed for + and ? */
+#define RE_TIGHT_VBAR           8    /* | binds tighter than ^ and $ */
+#define RE_NEWLINE_OR           16   /* treat newline as or */
+#define RE_CONTEXT_INDEP_OPS    32   /* ^$?*+ are special in all contexts */
+#define RE_ANSI_HEX             64   /* ansi sequences (\n etc) and \xhh */
+#define RE_NO_GNU_EXTENSIONS   128   /* no gnu extensions */
+
+/* definitions for some common regexp styles */
+#define RE_SYNTAX_AWK   (RE_NO_BK_PARENS|RE_NO_BK_VBAR|RE_CONTEXT_INDEP_OPS)
+#define RE_SYNTAX_EGREP (RE_SYNTAX_AWK|RE_NEWLINE_OR)
+#define RE_SYNTAX_GREP  (RE_BK_PLUS_QM|RE_NEWLINE_OR)
+#define RE_SYNTAX_EMACS 0
 
-/* Compile a fastmap for the compiled pattern in BUFFER; used to
-   accelerate searches.  Return 0 if successful and -2 if was an
-   internal error.  */
-extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
+#define Sword       1
+#define Swhitespace 2
+#define Sdigit      4
+#define Soctaldigit 8
+#define Shexdigit   16
 
+/* Rename all exported symbols to avoid conflicts with similarly named
+   symbols in some systems' standard C libraries... */
 
-/* Search in the string STRING (with length LENGTH) for the pattern
-   compiled into BUFFER.  Start searching at position START, for RANGE
-   characters.  Return the starting position of the match, -1 for no
-   match, or -2 for an internal error.  Also return register
-   information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
-extern int re_search
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
-            int length, int start, int range, struct re_registers *regs));
 
+extern int re_syntax;
+/* This is the actual syntax mask.  It was added so that Python could do
+ * syntax-dependent munging of patterns before compilation. */
 
-/* Like `re_search', but search in the concatenation of STRING1 and
-   STRING2.  Also, stop searching at index START + STOP.  */
-extern int re_search_2
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
-             int length1, const char *string2, int length2,
-             int start, int range, struct re_registers *regs, int stop));
+extern unsigned char re_syntax_table[256];
 
+void re_compile_initialize(void);
 
-/* Like `re_search', but return how many characters in STRING the regexp
-   in BUFFER matched, starting at position START.  */
-extern int re_match
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
-             int length, int start, struct re_registers *regs));
+int re_set_syntax(int syntax);
+/* This sets the syntax to use and returns the previous syntax.  The
+ * syntax is specified by a bit mask of the above defined bits. */
 
+char *re_compile_pattern(regex_t *compiled, unsigned char *regex);
+/* This compiles the regexp (given in regex and length in regex_size).
+ * This returns NULL if the regexp compiled successfully, and an error
+ * message if an error was encountered.  The buffer field must be
+ * initialized to a memory area allocated by malloc (or to NULL) before
+ * use, and the allocated field must be set to its length (or 0 if
+ * buffer is NULL).  Also, the translate field must be set to point to a
+ * valid translation table, or NULL if it is not used. */
 
-/* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
-extern int re_match_2
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
-             int length1, const char *string2, int length2,
-             int start, struct re_registers *regs, int stop));
+int re_match(regex_t *compiled, unsigned char *string, int size, int pos,
+             regexp_registers_t old_regs);
+/* This tries to match the regexp against the string.  This returns the
+ * length of the matched portion, or -1 if the pattern could not be
+ * matched and -2 if an error (such as failure stack overflow) is
+ * encountered. */
 
+int re_search(regex_t *compiled, unsigned char *string, int size, int startpos,
+              int range, regexp_registers_t regs);
+/* This searches for a substring matching the regexp.  This returns the
+ * first index at which a match is found.  range specifies at how many
+ * positions to try matching; positive values indicate searching
+ * forwards, and negative values indicate searching backwards.  mstop
+ * specifies the offset beyond which a match must not go.  This returns
+ * -1 if no match is found, and -2 if an error (such as failure stack
+ * overflow) is encountered. */
 
-/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
-   ENDS.  Subsequent matches using BUFFER and REGS will use this memory
-   for recording register information.  STARTS and ENDS must be
-   allocated with malloc, and must each be at least `NUM_REGS * sizeof
-   (regoff_t)' bytes long.
+void re_compile_fastmap(regex_t *compiled);
+/* This computes the fastmap for the regexp.  For this to have any effect,
+ * the calling program must have initialized the fastmap field to point
+ * to an array of 256 characters. */
 
-   If NUM_REGS == 0, then subsequent matches should allocate their own
-   register data.
 
-   Unless this function is called, the first search or match using
-   PATTERN_BUFFER will allocate its own register data, without
-   freeing the old data.  */
-extern void re_set_registers
-  _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
-             unsigned num_regs, regoff_t *starts, regoff_t *ends));
+int regcomp(regex_t *preg, const char *regex, int cflags);
+int regexec(regex_t *preg, const char *string, size_t nmatch,
+            regmatch_t pmatch[], int eflags);
+size_t regerror(int errcode, regex_t *preg, char *errbuf, 
+                size_t errbuf_size);
+void regfree(regex_t *preg);
 
-#if defined _REGEX_RE_COMP || defined _LIBC
-# ifndef _CRAY
-/* 4.2 bsd compatibility.  */
-extern char *re_comp _RE_ARGS ((const char *));
-extern int re_exec _RE_ARGS ((const char *));
-# endif
-#endif
-
-/* GCC 2.95 and later have "__restrict"; C99 compilers have
-   "restrict", and "configure" may have defined "restrict".  */
-#ifndef __restrict
-# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
-#  if defined restrict || 199901L <= __STDC_VERSION__
-#   define __restrict restrict
-#  else
-#   define __restrict
-#  endif
-# endif
-#endif
-/* gcc 3.1 and up support the [restrict] syntax.  */
-#ifndef __restrict_arr
-# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
-#  define __restrict_arr __restrict
-# else
-#  define __restrict_arr
-# endif
-#endif
+#endif /* REGEXPR_H */
 
-/* POSIX compatibility.  */
-extern int regcomp _RE_ARGS ((regex_t *__restrict __preg,
-                             const char *__restrict __pattern,
-                             int __cflags));
-
-extern int regexec _RE_ARGS ((const regex_t *__restrict __preg,
-                             const char *__restrict __string, size_t __nmatch,
-                             regmatch_t __pmatch[__restrict_arr],
-                             int __eflags));
-
-extern size_t regerror _RE_ARGS ((int __errcode, const regex_t *__preg,
-                                 char *__errbuf, size_t __errbuf_size));
-
-extern void regfree _RE_ARGS ((regex_t *__preg));
 
 
 #ifdef __cplusplus
 }
-#endif /* C++ */
-
-#endif /* regex.h */
-\f
-/*
-Local variables:
-make-backup-files: t
-version-control: t
-trim-versions-without-asking: nil
-End:
-*/
+#endif
+#endif /* !b_REGEXPR_H */
diff --git a/bacula/src/lib/bsnprintf.c b/bacula/src/lib/bsnprintf.c
deleted file mode 100644 (file)
index bd6c2a1..0000000
+++ /dev/null
@@ -1,913 +0,0 @@
-/*
- * Copyright Patrick Powell 1995
- *
- * This code is based on code written by Patrick Powell
- * (papowell@astart.com) It may be used for any purpose as long
- * as this notice remains intact on all source code distributions.
- *
- * Adapted for Bacula -- note there were lots of bugs in
- *     the original code: %lld and %s were seriously broken, and
- *     with FP turned off %f seg faults.
- *   Kern Sibbald, November MMV
- *
- *   Version $Id$
- */
-
-
-#include "bacula.h"
-#define FP_OUTPUT 1 /* Bacula uses floating point */
-
-/* 
-    Temp only for me -- NOT YET READY FOR USE -- seems to work fine
-    on Linux, but doesn't build correctly on Win32
- */
-#ifdef USE_BSNPRINTF
-
-#ifdef HAVE_LONG_DOUBLE
-#define LDOUBLE long double
-#else
-#define LDOUBLE double
-#endif
-
-int bvsnprintf(char *buffer, int32_t maxlen, const char *format, va_list args);
-static int32_t fmtstr(char *buffer, int32_t currlen, int32_t maxlen,
-                   char *value, int flags, int min, int max);
-static int32_t fmtint(char *buffer, int32_t currlen, int32_t maxlen,
-                   int64_t value, int base, int min, int max, int flags);
-
-#ifdef FP_OUTPUT
-# ifdef HAVE_FCVTL
-#  define fcvt fcvtl
-# endif
-static int32_t fmtfp(char *buffer, int32_t currlen, int32_t maxlen,
-                  LDOUBLE fvalue, int min, int max, int flags);
-#else
-#define fmtfp(b, c, m, f, min, max, fl) currlen
-#endif
-
-#define outch(c) {int len=currlen; if (currlen++ < maxlen) { buffer[len] = (c);}}
-
-
-/* format read states */
-#define DP_S_DEFAULT 0
-#define DP_S_FLAGS   1
-#define DP_S_MIN     2
-#define DP_S_DOT     3
-#define DP_S_MAX     4
-#define DP_S_MOD     5
-#define DP_S_CONV    6
-#define DP_S_DONE    7
-
-/* format flags - Bits */
-#define DP_F_MINUS      (1 << 0)
-#define DP_F_PLUS       (1 << 1)
-#define DP_F_SPACE      (1 << 2)
-#define DP_F_NUM        (1 << 3)
-#define DP_F_ZERO       (1 << 4)
-#define DP_F_UP         (1 << 5)
-#define DP_F_UNSIGNED   (1 << 6)
-#define DP_F_DOT        (1 << 7)
-
-/* Conversion Flags */
-#define DP_C_INT16   1
-#define DP_C_INT32    2
-#define DP_C_LDOUBLE 3
-#define DP_C_INT64   4
-
-#define char_to_int(p) ((p)- '0')
-#define MAX(p,q) (((p) >= (q)) ? (p) : (q))
-
-/*
-  You might ask why does Bacula have it's own printf routine? Well,
-  There are two reasons: 1. Here (as opposed to library routines), we
-  define %d and %ld to be 32 bit; %lld and %q to be 64 bit.  2. We 
-  disable %n for security reasons.                
- */
-
-int bsnprintf(char *str, int32_t size, const char *fmt,  ...)
-{
-   va_list   arg_ptr;
-   int len;
-
-   va_start(arg_ptr, fmt);
-   len = bvsnprintf(str, size, fmt, arg_ptr);
-   va_end(arg_ptr);
-   return len;
-}
-
-
-int bvsnprintf(char *buffer, int32_t maxlen, const char *format, va_list args)
-{
-   char ch;
-   int64_t value;
-   char *strvalue;
-   int min;
-   int max;
-   int state;
-   int flags;
-   int cflags;
-   int32_t currlen;
-   int base;
-   int junk;
-#ifdef FP_OUTPUT
-   LDOUBLE fvalue;
-#endif
-
-   state = DP_S_DEFAULT;
-   currlen = flags = cflags = min = 0;
-   max = -1;
-   ch = *format++;
-   *buffer = 0;
-
-   while (state != DP_S_DONE) {
-      if ((ch == '\0') || (currlen >= maxlen))
-         state = DP_S_DONE;
-
-      switch (state) {
-      case DP_S_DEFAULT:
-         if (ch == '%') {
-            state = DP_S_FLAGS;
-         } else {
-            outch(ch);
-         }
-         ch = *format++;
-         break;
-      case DP_S_FLAGS:
-         switch (ch) {
-         case '-':
-            flags |= DP_F_MINUS;
-            ch = *format++;
-            break;
-         case '+':
-            flags |= DP_F_PLUS;
-            ch = *format++;
-            break;
-         case ' ':
-            flags |= DP_F_SPACE;
-            ch = *format++;
-            break;
-         case '#':
-            flags |= DP_F_NUM;
-            ch = *format++;
-            break;
-         case '0':
-            flags |= DP_F_ZERO;
-            ch = *format++;
-            break;
-         default:
-            state = DP_S_MIN;
-            break;
-         }
-         break;
-      case DP_S_MIN:
-         if (isdigit((unsigned char)ch)) {
-            min = 10 * min + char_to_int(ch);
-            ch = *format++;
-         } else if (ch == '*') {
-#ifdef SECURITY_PROBLEM
-            min = va_arg(args, int);
-#else
-            junk = va_arg(args, int);
-#endif
-            ch = *format++;
-            state = DP_S_DOT;
-         } else
-            state = DP_S_DOT;
-         break;
-      case DP_S_DOT:
-         if (ch == '.') {
-            state = DP_S_MAX;
-            flags |= DP_F_DOT;
-            ch = *format++;
-         } else
-            state = DP_S_MOD;
-         break;
-      case DP_S_MAX:
-         if (isdigit((unsigned char)ch)) {
-            if (max < 0)
-               max = 0;
-            max = 10 * max + char_to_int(ch);
-            ch = *format++;
-         } else if (ch == '*') {
-#ifdef SECURITY_PROBLEM
-            max = va_arg(args, int);
-#else
-            junk = va_arg(args, int);
-#endif
-            ch = *format++;
-            state = DP_S_MOD;
-         } else
-            state = DP_S_MOD;
-         break;
-      case DP_S_MOD:
-         switch (ch) {
-         case 'h':
-            cflags = DP_C_INT16;
-            ch = *format++;
-            break;
-         case 'l':
-            cflags = DP_C_INT32;
-            ch = *format++;
-            if (ch == 'l') {       /* It's a long long */
-               cflags = DP_C_INT64;
-               ch = *format++;
-            }
-            break;
-         case 'L':
-            cflags = DP_C_LDOUBLE;
-            ch = *format++;
-            break;
-         default:
-            break;
-         }
-         state = DP_S_CONV;
-         break;
-      case DP_S_CONV:
-         switch (ch) {
-         case 'd':
-         case 'i':
-            if (cflags == DP_C_INT16) {
-               value = va_arg(args, int32_t);
-            } else if (cflags == DP_C_INT32) {
-               value = va_arg(args, int32_t);
-            } else if (cflags == DP_C_INT64) {
-               value = va_arg(args, int64_t);
-            } else {
-               value = va_arg(args, int);
-            }
-            currlen = fmtint(buffer, currlen, maxlen, value, 10, min, max, flags);
-            break;
-         case 'X':
-         case 'x':
-         case 'o':
-         case 'u':
-            if (ch == 'o') {
-               base = 8;
-            } else if (ch == 'x') {
-               base = 16;
-            } else if (ch == 'X') {
-               base = 16;
-               flags |= DP_F_UP;
-            } else {
-               base = 10;
-            }
-            flags |= DP_F_UNSIGNED;
-            if (cflags == DP_C_INT16) {
-               value = va_arg(args, uint32_t);
-            } else if (cflags == DP_C_INT32) {
-               value = (long)va_arg(args, uint32_t);
-            } else if (cflags == DP_C_INT64) {
-               value = (int64_t) va_arg(args, uint64_t);
-            } else {
-               value = (long)va_arg(args, unsigned int);
-            }
-            currlen = fmtint(buffer, currlen, maxlen, value, base, min, max, flags);
-            break;
-         case 'f':
-            if (cflags == DP_C_LDOUBLE) {
-               fvalue = va_arg(args, LDOUBLE);
-            } else {
-               fvalue = va_arg(args, double);
-            }
-            currlen = fmtfp(buffer, currlen, maxlen, fvalue, min, max, flags);
-            break;
-         case 'E':
-            flags |= DP_F_UP;
-         case 'e':
-            if (cflags == DP_C_LDOUBLE) {
-               fvalue = va_arg(args, LDOUBLE);
-            } else {
-               fvalue = va_arg(args, double);
-            }
-            currlen = fmtfp(buffer, currlen, maxlen, fvalue, min, max, flags);
-            break;
-         case 'G':
-            flags |= DP_F_UP;
-         case 'g':
-            if (cflags == DP_C_LDOUBLE) {
-               fvalue = va_arg(args, LDOUBLE);
-            } else {
-               fvalue = va_arg(args, double);
-            }
-            currlen = fmtfp(buffer, currlen, maxlen, fvalue, min, max, flags);
-            break;
-         case 'c':
-            outch(va_arg(args, int));
-            break;
-         case 's':
-            strvalue = va_arg(args, char *);
-            currlen = fmtstr(buffer, currlen, maxlen, strvalue, flags, min, max);
-            break;
-         case 'p':
-            strvalue = va_arg(args, char *);
-            currlen = fmtint(buffer, currlen, maxlen, (long)strvalue, 16, min, max, flags);
-            break;
-         case 'n':
-            if (cflags == DP_C_INT16) {
-               int16_t *num;
-               num = va_arg(args, int16_t *);
-#ifdef SECURITY_PROBLEM
-               *num = currlen;
-#endif
-            } else if (cflags == DP_C_INT32) {
-               int32_t *num;
-               num = va_arg(args, int32_t *);
-#ifdef SECURITY_PROBLEM
-               *num = (int32_t)currlen;
-#endif
-            } else if (cflags == DP_C_INT64) {
-               int64_t *num;
-               num = va_arg(args, int64_t *);
-#ifdef SECURITY_PROBLEM
-               *num = (int64_t)currlen;
-#endif
-            } else {
-               int32_t *num;
-               num = va_arg(args, int32_t *);
-#ifdef SECURITY_PROBLEM
-               *num = (int32_t)currlen;
-#endif
-            }
-            break;
-         case '%':
-            outch(ch);
-            break;
-         case 'w':
-            /* not supported yet, treat as next char */
-            ch = *format++;
-            break;
-         default:
-            /* Unknown, skip */
-            break;
-         }
-         ch = *format++;
-         state = DP_S_DEFAULT;
-         flags = cflags = min = 0;
-         max = -1;
-         break;
-      case DP_S_DONE:
-         break;
-      default:
-         /* hmm? */
-         break;                    /* some picky compilers need this */
-      }
-   }
-   if (currlen < maxlen - 1) {
-      buffer[currlen] = '\0';
-   } else {
-      buffer[maxlen - 1] = '\0';
-   }
-   return currlen;
-}
-
-static int32_t fmtstr(char *buffer, int32_t currlen, int32_t maxlen,
-                   char *value, int flags, int min, int max)
-{
-   int padlen, strln;              /* amount to pad */
-   int cnt = 0;
-
-   if (value == 0) {
-      value = "<NULL>";
-   }
-
-   if (flags & DP_F_DOT && max < 0) {   /* Max not specified */
-      max = 0;
-   } else if (max < 0) {
-      max = maxlen;
-   }
-   strln = strlen(value);
-   if (strln > max) {
-      strln = max;                /* truncate to max */
-   }
-   padlen = min - strln;
-   if (padlen < 0) {
-      padlen = 0;
-   }
-   if (flags & DP_F_MINUS) {
-      padlen = -padlen;            /* Left Justify */
-   }
-
-   while (padlen > 0) {
-      outch(' ');
-      --padlen;
-   }
-   while (*value && (cnt < max)) {
-      outch(*value++);
-      ++cnt;
-   }
-   while (padlen < 0) {
-      outch(' ');
-      ++padlen;
-   }
-   return currlen;
-}
-
-/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
-
-static int32_t fmtint(char *buffer, int32_t currlen, int32_t maxlen,
-                   int64_t value, int base, int min, int max, int flags)
-{
-   int signvalue = 0;
-   uint64_t uvalue;
-   char convert[20];
-   int place = 0;
-   int spadlen = 0;                /* amount to space pad */
-   int zpadlen = 0;                /* amount to zero pad */
-   int caps = 0;
-
-   if (max < 0) {
-      max = 0;
-   }
-
-   uvalue = value;
-
-   if (!(flags & DP_F_UNSIGNED)) {
-      if (value < 0) {
-         signvalue = '-';
-         uvalue = -value;
-      } else if (flags & DP_F_PLUS) {  /* Do a sign (+/i) */
-         signvalue = '+';
-      } else if (flags & DP_F_SPACE) {
-         signvalue = ' ';
-      }
-   }
-
-   if (flags & DP_F_UP) {
-      caps = 1;                    /* Should characters be upper case? */
-   }
-
-   do {
-      convert[place++] = (caps ? "0123456789ABCDEF" : "0123456789abcdef")
-         [uvalue % (unsigned)base];
-      uvalue = (uvalue / (unsigned)base);
-   } while (uvalue && (place < 20));
-   if (place == 20) {
-      place--;
-   }
-   convert[place] = 0;
-
-   zpadlen = max - place;
-   spadlen = min - MAX(max, place) - (signvalue ? 1 : 0);
-   if (zpadlen < 0)
-      zpadlen = 0;
-   if (spadlen < 0)
-      spadlen = 0;
-   if (flags & DP_F_ZERO) {
-      zpadlen = MAX(zpadlen, spadlen);
-      spadlen = 0;
-   }
-   if (flags & DP_F_MINUS)
-      spadlen = -spadlen;          /* Left Justifty */
-
-#ifdef DEBUG_SNPRINTF
-   printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n",
-          zpadlen, spadlen, min, max, place);
-#endif
-
-   /* Spaces */
-   while (spadlen > 0) {
-      outch(' ');
-      --spadlen;
-   }
-
-   /* Sign */
-   if (signvalue) {
-      outch(signvalue);
-   }
-
-   /* Zeros */
-   if (zpadlen > 0) {
-      while (zpadlen > 0) {
-         outch('0');
-         --zpadlen;
-      }
-   }
-
-   /* Digits */
-   while (place > 0) {
-      outch(convert[--place]);
-   }
-
-   /* Left Justified spaces */
-   while (spadlen < 0) {
-      outch(' ');
-      ++spadlen;
-   }
-   return currlen;
-}
-
-#ifdef FP_OUTPUT
-
-static LDOUBLE abs_val(LDOUBLE value)
-{
-   LDOUBLE result = value;
-
-   if (value < 0)
-      result = -value;
-
-   return result;
-}
-
-static LDOUBLE pow10(int exp)
-{
-   LDOUBLE result = 1;
-
-   while (exp) {
-      result *= 10;
-      exp--;
-   }
-
-   return result;
-}
-
-static long round(LDOUBLE value)
-{
-   long intpart;
-
-   intpart = (long)value;
-   value = value - intpart;
-   if (value >= 0.5)
-      intpart++;
-
-   return intpart;
-}
-
-static int32_t fmtfp(char *buffer, int32_t currlen, int32_t maxlen,
-                  LDOUBLE fvalue, int min, int max, int flags)
-{
-   int signvalue = 0;
-   LDOUBLE ufvalue;
-#ifndef HAVE_FCVT
-   char iconvert[20];
-   char fconvert[20];
-#else
-   char iconvert[311];
-   char fconvert[311];
-   char *result;
-   int dec_pt, sig;
-   int r_length;
-   extern char *fcvt(double value, int ndigit, int *decpt, int *sign);
-#endif
-   int iplace = 0;
-   int fplace = 0;
-   int padlen = 0;                 /* amount to pad */
-   int zpadlen = 0;
-   int caps = 0;
-   int64_t intpart;
-   int64_t fracpart;
-
-   /* 
-    * AIX manpage says the default is 0, but Solaris says the default
-    * is 6, and sprintf on AIX defaults to 6
-    */
-   if (max < 0)
-      max = 6;
-
-   ufvalue = abs_val(fvalue);
-
-   if (fvalue < 0)
-      signvalue = '-';
-   else if (flags & DP_F_PLUS)     /* Do a sign (+/i) */
-      signvalue = '+';
-   else if (flags & DP_F_SPACE)
-      signvalue = ' ';
-
-#if 0
-   if (flags & DP_F_UP)
-      caps = 1;                    /* Should characters be upper case? */
-#endif
-
-#ifndef HAVE_FCVT
-   intpart = (long)ufvalue;
-
-   /* 
-    * Sorry, we only support 9 digits past the decimal because of our 
-    * conversion method
-    */
-   if (max > 9)
-      max = 9;
-
-   /* We "cheat" by converting the fractional part to integer by
-    * multiplying by a factor of 10
-    */
-   fracpart = round((pow10(max)) * (ufvalue - intpart));
-
-   if (fracpart >= pow10(max)) {
-      intpart++;
-      fracpart -= (int64_t)pow10(max);
-   }
-#ifdef DEBUG_SNPRINTF
-   printf("fmtfp: %g %d.%d min=%d max=%d\n",
-          (double)fvalue, intpart, fracpart, min, max);
-#endif
-
-   /* Convert integer part */
-   do {
-      iconvert[iplace++] =
-         (caps ? "0123456789ABCDEF" : "0123456789abcdef")[intpart % 10];
-      intpart = (intpart / 10);
-   } while (intpart && (iplace < 20));
-   if (iplace == 20)
-      iplace--;
-   iconvert[iplace] = 0;
-
-   /* Convert fractional part */
-   do {
-      fconvert[fplace++] =
-         (caps ? "0123456789ABCDEF" : "0123456789abcdef")[fracpart % 10];
-      fracpart = (fracpart / 10);
-   } while (fracpart && (fplace < 20));
-   if (fplace == 20)
-      fplace--;
-   fconvert[fplace] = 0;
-#else                              /* use fcvt() */
-   if (max > 310)
-      max = 310;
-# ifdef HAVE_FCVTL
-   result = fcvtl(ufvalue, max, &dec_pt, &sig);
-# else
-   result = fcvt(ufvalue, max, &dec_pt, &sig);
-# endif
-
-   r_length = strlen(result);
-
-   /*
-    * Fix broken fcvt implementation returns..
-    */
-
-   if (r_length == 0) {
-      result[0] = '0';
-      result[1] = '\0';
-      r_length = 1;
-   }
-
-   if (r_length < dec_pt)
-      dec_pt = r_length;
-
-   if (dec_pt <= 0) {
-      iplace = 1;
-      iconvert[0] = '0';
-      iconvert[1] = '\0';
-
-      fplace = 0;
-
-      while (r_length)
-         fconvert[fplace++] = result[--r_length];
-
-      while ((dec_pt < 0) && (fplace < max)) {
-         fconvert[fplace++] = '0';
-         dec_pt++;
-      }
-   } else {
-      int c;
-
-      iplace = 0;
-      for (c = dec_pt; c; iconvert[iplace++] = result[--c]);
-      iconvert[iplace] = '\0';
-
-      result += dec_pt;
-      fplace = 0;
-
-      for (c = (r_length - dec_pt); c; fconvert[fplace++] = result[--c]);
-   }
-#endif  /* HAVE_FCVT */
-
-   /* -1 for decimal point, another -1 if we are printing a sign */
-   padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
-   zpadlen = max - fplace;
-   if (zpadlen < 0) {
-      zpadlen = 0;
-   }
-   if (padlen < 0) {
-      padlen = 0;
-   }
-   if (flags & DP_F_MINUS) {
-      padlen = -padlen;            /* Left Justifty */
-   }
-
-   if ((flags & DP_F_ZERO) && (padlen > 0)) {
-      if (signvalue) {
-         outch(signvalue);
-         --padlen;
-         signvalue = 0;
-      }
-      while (padlen > 0) {
-         outch('0');
-         --padlen;
-      }
-   }
-   while (padlen > 0) {
-      outch(' ');
-      --padlen;
-   }
-   if (signvalue) {
-      outch(signvalue);
-   }
-
-   while (iplace > 0) {
-      outch(iconvert[--iplace]);
-   }
-
-
-#ifdef DEBUG_SNPRINTF
-   printf("fmtfp: fplace=%d zpadlen=%d\n", fplace, zpadlen);
-#endif
-
-   /*
-    * Decimal point.  This should probably use locale to find the correct
-    * char to print out.
-    */
-   if (max > 0) {
-      outch('.');
-      while (fplace > 0) {
-         outch(fconvert[--fplace]);
-      }
-   }
-
-   while (zpadlen > 0) {
-      outch('0');
-      --zpadlen;
-   }
-
-   while (padlen < 0) {
-      outch(' ');
-      ++padlen;
-   }
-   return currlen;
-}
-#endif  /* FP_OUTPUT */
-
-
-#ifdef TEST_PROGRAM
-
-#ifndef LONG_STRING
-#define LONG_STRING 1024
-#endif
-int main(void)
-{
-   char buf1[LONG_STRING];
-   char buf2[LONG_STRING];
-
-#ifdef FP_OUTPUT
-   char *fp_fmt[] = {
-      "%-1.5f",
-      "%1.5f",
-      "%123.9f",
-      "%10.5f",
-      "% 10.5f",
-      "%+22.9f",
-      "%+4.9f",
-      "%01.3f",
-      "%4f",
-      "%3.1f",
-      "%3.2f",
-      "%.0f",
-      "%.1f",
-      NULL
-   };
-   double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996,
-      0.9996, 1.996, 4.136, 6442452944.1234, 0
-   };
-#endif
-   char *int_fmt[] = {
-      "%-1.5d",
-      "%1.5d",
-      "%123.9d",
-      "%5.5d",
-      "%10.5d",
-      "% 10.5d",
-      "%+22.33d",
-      "%01.3d",
-      "%4d",
-      "%-1.5ld",
-      "%1.5ld",
-      "%123.9ld",
-      "%5.5ld",
-      "%10.5ld",
-      "% 10.5ld",
-      "%+22.33ld",
-      "%01.3ld",
-      "%4ld",
-      NULL
-   };
-   long int_nums[] = { -1, 134, 91340, 341, 0203, 0 };
-
-   char *ll_fmt[] = {
-      "%-1.8lld",
-      "%1.8lld",
-      "%123.9lld",
-      "%5.8lld",
-      "%10.5lld",
-      "% 10.8lld",
-      "%+22.33lld",
-      "%01.3lld",
-      "%4lld",
-      NULL
-   };
-   int64_t ll_nums[] = { -1976, 789134567890LL, 91340, 34123, 0203, 0 };
-
-   char *s_fmt[] = {
-      "%-1.8s",
-      "%1.8s",
-      "%123.9s",
-      "%5.8s",
-      "%10.5s",
-      "% 10.3s",
-      "%+22.1s",
-      "%01.3s",
-      "%s",
-      "%10s",
-      "%3s",
-      "%3.0s",
-      "%3.s",
-      NULL
-   };
-   char *s_nums[] = { "abc", "def", "ghi", "123", "4567", "a", "bb", "ccccccc", NULL};
-
-
-   int x, y;
-   int fail = 0;
-   int num = 0;
-
-   printf("Testing snprintf format codes against system sprintf...\n");
-
-#ifdef FP_OUTPUT
-   for (x = 0; fp_fmt[x] != NULL; x++)
-      for (y = 0; fp_nums[y] != 0; y++) {
-         bsnprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]);
-         sprintf(buf2, fp_fmt[x], fp_nums[y]);
-         if (strcmp(buf1, buf2)) {
-            printf
-               ("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n",
-                fp_fmt[x], buf1, buf2);
-            fail++;
-         }
-         num++;
-      }
-#endif
-
-   for (x = 0; int_fmt[x] != NULL; x++)
-      for (y = 0; int_nums[y] != 0; y++) {
-         int pcount, bcount;
-         bcount = bsnprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]);
-         printf("%s\n", buf1);
-         pcount = sprintf(buf2, int_fmt[x], int_nums[y]);
-         if (bcount != pcount) {
-            printf("bsnprintf count %d doesn't match sprintf count %d\n",
-               bcount, pcount);
-         }
-         if (strcmp(buf1, buf2)) {
-            printf
-               ("bsnprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n",
-                int_fmt[x], buf1, buf2);
-            fail++;
-         }
-         num++;
-      }
-
-   for (x = 0; ll_fmt[x] != NULL; x++) {
-      for (y = 0; ll_nums[y] != 0; y++) {
-         int pcount, bcount;
-         bcount = bsnprintf(buf1, sizeof(buf1), ll_fmt[x], ll_nums[y]);
-         printf("%s\n", buf1);
-         pcount = sprintf(buf2, ll_fmt[x], ll_nums[y]);
-         if (bcount != pcount) {
-            printf("bsnprintf count %d doesn't match sprintf count %d\n",
-               bcount, pcount);
-         }
-         if (strcmp(buf1, buf2)) {
-            printf
-               ("bsnprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n",
-                ll_fmt[x], buf1, buf2);
-            fail++;
-         }
-         num++;
-      }
-   }
-
-   for (x = 0; s_fmt[x] != NULL; x++) {
-      for (y = 0; s_nums[y] != 0; y++) {
-         int pcount, bcount;
-         bcount = bsnprintf(buf1, sizeof(buf1), s_fmt[x], s_nums[y]);
-         printf("%s\n", buf1);
-         pcount = sprintf(buf2, s_fmt[x], s_nums[y]);
-         if (bcount != pcount) {
-            printf("bsnprintf count %d doesn't match sprintf count %d\n",
-               bcount, pcount);
-         }
-         if (strcmp(buf1, buf2)) {
-            printf
-               ("bsnprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n",
-                s_fmt[x], buf1, buf2);
-            fail++;
-         }
-         num++;
-      }
-   }
-
-
-   printf("%d tests failed out of %d.\n", fail, num);
-}
-#endif /* TEST_PROGRAM */
-
-#endif /* USE_BSNPRINTF */
diff --git a/bacula/src/lib/btree.c b/bacula/src/lib/btree.c
deleted file mode 100644 (file)
index 5b822ba..0000000
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- *  Bacula red-black binary tree routines.
- *
- *    btree is a binary tree with the links being in the data item.
- *
- *   Developped in part from ideas obtained from several online University
- *    courses. 
- *
- *   Kern Sibbald, November MMV
- *
- *   Version $Id$
- *
- */
-/*
-   Copyright (C) 2005 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 "btree.h"
-
-/* ===================================================================
- *    btree
- */
-
-/*
- *  Insert an item in the tree, but only if it is unique
- *   otherwise, the item is returned non inserted
- *  The big trick is keeping the tree balanced after the 
- *   insert. We use a parent pointer to make it simpler and 
- *   to avoid recursion.
- *
- * Returns: item         if item inserted
- *          other_item   if same value already exists (item not inserted)
- */
-bnode *btree::insert(bnode *item, int compare(bnode *item1, bnode *item2))
-{
-   bnode *x, *y;
-   bnode *last = NULL;        /* last leaf if not found */
-   bnode *found = NULL;
-   int comp = 0;
-
-   /* Search */
-   x = head;
-   while (x && !found) {
-      last = x;
-      comp = compare(item, x);
-      if (comp < 0) {
-         x = x->left;
-      } else if (comp > 0) {
-         x = x->right;
-      } else {
-         found = x;
-      }
-   }
-
-   if (found) {                    /* found? */
-      return found;                /* yes, return item found */
-   }
-   /* Handle empty tree */
-   if (num_items == 0) {
-      head = item;
-      num_items++;
-      return item;
-   }
-   x = last;
-   /* Not found, so insert it on appropriate side of tree */
-   if (comp < 0) {
-      last->left = item;
-   } else {
-      last->right = item;
-   }
-   last->red = true;
-   item->parent = last;
-   num_items++;
-
-   /* Now we must walk up the tree balancing it */
-   x = last;
-   while (x != head && x->parent->red) {
-      if (x->parent == x->parent->parent->left) {
-         /* Look at the right side of our grandparent */
-         y = x->parent->parent->right;
-         if (y && y->red) {
-            /* our parent must be black */
-            x->parent->red = false;
-            y->red = false;
-            x->parent->parent->red = true;
-            x = x->parent->parent;       /* move up to grandpa */
-         } else {
-            if (x == x->parent->right) { /* right side of parent? */
-               x = x->parent;
-               left_rotate(x);
-            }
-            /* make parent black too */
-            x->parent->red = false;
-            x->parent->parent->red = true;
-            right_rotate(x->parent->parent);
-         }
-      } else {
-         /* Look at left side of our grandparent */
-         y = x->parent->parent->left;
-         if (y && y->red) {
-            x->parent->red = false;
-            y->red = false;
-            x->parent->parent->red = true;
-            x = x->parent->parent;       /* move up to grandpa */
-         } else {
-            if (x == x->parent->left) {
-               x = x->parent;
-               right_rotate(x);
-            }
-            /* make parent black too */
-            x->parent->red = false;
-            x->parent->parent->red = true;
-            left_rotate(x->parent->parent);
-         }
-      }
-   }
-   /* Make sure the head is always black */
-   head->red = false;
-   return item;
-}
-
-
-/*
- * Search for item
- */
-bnode *btree::search(bnode *item, int compare(bnode *item1, bnode *item2))
-{
-   bnode *found = NULL;
-   bnode *x;
-   int comp;
-
-   x = head;
-   while (x) {
-      comp = compare(item, x);
-      if (comp < 0) {
-         x = x->left;
-      } else if (comp > 0) {
-         x = x->right;
-      } else {
-         found = x;
-         break;
-      }
-   }
-   return found;
-}
-
-/* 
- * Get first item (i.e. lowest value) 
- */
-bnode *btree::first(void)
-{
-   bnode *x;
-
-   x = head;
-   down = true;
-   while (x) {
-      if (x->left) {
-         x = x->left;
-         continue;
-      }
-      return x;
-   }
-   /* Tree is empty */
-   return NULL;
-}
-
-/*
- * This is a non-recursive btree walk routine that returns
- *  the items one at a time in order. I've never seen a
- *  non-recursive tree walk routine published that returns
- *  one item at a time rather than doing a callback.
- *
- * Return the next item in sorted order.  We assume first()
- *  was called once before calling this routine.
- *  We always go down as far as we can to the left, then up, and
- *  down one to the right, and again down as far as we can to the
- *  left.  etc. 
- *
- * Returns: pointer to next larger item 
- *          NULL when no more items in tree
- */
-bnode *btree::next(bnode *item)
-{
-   bnode *x;
-
-   x = item;
-   if ((down && !x->left && x->right) || (!down && x->right)) {
-      /* Move down to right one */
-      down = true;
-      x = x->right;                       
-      /* Then all the way down left */
-      while (x->left)  {
-         x = x->left;
-      }
-      return x;
-   }
-
-   /* We have gone down all we can, so now go up */
-   for ( ;; ) {
-      /* If at head, we are done */
-      if (!x->parent) {
-         return NULL;
-      }
-      /* Move up in tree */
-      down = false;
-      /* if coming from right, continue up */
-      if (x->parent->right == x) {
-         x = x->parent;
-         continue;
-      }
-      /* Coming from left, go up one -- ie. return parent */
-      return x->parent;
-   }
-}
-
-/*
- * Similer to next(), but visits all right nodes when
- *  coming up the tree.
- */
-bnode *btree::any(bnode *item)
-{
-   bnode *x;
-
-   x = item;
-   if ((down && !x->left && x->right) || (!down && x->right)) {
-      /* Move down to right one */
-      down = true;
-      x = x->right;                       
-      /* Then all the way down left */
-      while (x->left)  {
-         x = x->left;
-      }
-      return x;
-   }
-
-   /* We have gone down all we can, so now go up */
-   for ( ;; ) {
-      /* If at head, we are done */
-      if (!x->parent) {
-         return NULL;
-      }
-      down = false;
-      /* Go up one and return parent */
-      return x->parent;
-   }
-}
-
-
-/* x is item, y is below and to right, then rotated to below left */
-void btree::left_rotate(bnode *item)
-{
-   bnode *y;
-   bnode *x;
-
-   x = item;
-   y = x->right;
-   x->right = y->left;
-   if (y->left) {
-      y->left->parent = x;
-   }
-   y->parent = x->parent;
-   /* if no parent then we have a new head */
-   if (!x->parent) {
-      head = y;
-   } else if (x == x->parent->left) {
-      x->parent->left = y;
-   } else {
-      x->parent->right = y;
-   }
-   y->left = x;
-   x->parent = y;
-}
-
-void btree::right_rotate(bnode *item)
-{
-   bnode *x, *y;
-
-   y = item;
-   x = y->left;
-   y->left = x->right;
-   if (x->right) {
-      x->right->parent = y;
-   }
-   x->parent = y->parent;
-   /* if no parent then we have a new head */
-   if (!y->parent) {
-      head = x;
-   } else if (y == y->parent->left) {
-      y->parent->left = x;
-   } else {
-      y->parent->right = x;
-   }
-   x->right = y;
-   y->parent = x;
-}
-
-
-void btree::remove(bnode *item)
-{
-}
-
-/* Destroy the tree contents.  Not totally working */
-void btree::destroy()
-{
-   bnode *x, *y = NULL;
-
-   x = first();
-// printf("head=%p first=%p left=%p right=%p\n", head, x, x->left, x->right);
-
-   for (  ; (y=any(x)); ) {
-      /* Prune the last item */
-      if (x->parent) {
-         if (x == x->parent->left) {
-            x->parent->left = NULL;
-         } else if (x == x->parent->right) {
-            x->parent->right = NULL;
-         }
-      }
-      if (!x->left && !x->right) {
-         if (head == x) {  
-            head = NULL;
-         }
-//       if (num_items<30) {
-//          printf("free nitems=%d item=%p left=%p right=%p\n", num_items, x, x->left, x->right);
-//       }   
-         free((void *)x);      /* free previous node */
-         num_items--;
-      }
-      x = y;                  /* save last node */
-   }
-   if (x) {
-      if (x == head) {
-         head = NULL;
-      }
-//    printf("free nitems=%d item=%p left=%p right=%p\n", num_items, x, x->left, x->right);
-      free((void *)x);
-      num_items--;
-   }
-   if (head) {
-//    printf("Free head\n");
-      free((void *)head);
-   }
-// printf("free nitems=%d\n", num_items);
-
-   head = NULL;
-}
-
-
-
-#ifdef TEST_PROGRAM
-
-struct MYJCR {
-   bnode link;
-   char *buf;
-};
-
-static int my_compare(bnode *item1, bnode *item2)
-{
-   MYJCR *jcr1, *jcr2;
-   int comp;
-   jcr1 = (MYJCR *)item1;
-   jcr2 = (MYJCR *)item2;
-   comp = strcmp(jcr1->buf, jcr2->buf);
- //Dmsg3(000, "compare=%d: %s to %s\n", comp, jcr1->buf, jcr2->buf);
-   return comp;
-}
-
-int main()
-{
-   char buf[30];
-   btree *jcr_chain;
-   MYJCR *jcr = NULL;
-   MYJCR *jcr1;
-
-
-   /* Now do a binary insert for the tree */
-   jcr_chain = New(btree());
-#define CNT 26
-   printf("append %d items\n", CNT*CNT*CNT);
-   strcpy(buf, "ZZZ");
-   int count = 0;
-   for (int i=0; i<CNT; i++) {
-      for (int j=0; j<CNT; j++) {
-         for (int k=0; k<CNT; k++) {
-            count++;
-            if ((count & 0x3FF) == 0) {
-               Dmsg1(000, "At %d\n", count);
-            }
-            jcr = (MYJCR *)malloc(sizeof(MYJCR));
-            memset(jcr, 0, sizeof(MYJCR));
-            jcr->buf = bstrdup(buf);
-//          printf("buf=%p %s\n", jcr, jcr->buf);
-            jcr1 = (MYJCR *)jcr_chain->insert((bnode *)jcr, my_compare);
-            if (jcr != jcr1) {
-               Dmsg2(000, "Insert of %s vs %s failed.\n", jcr->buf, jcr1->buf);
-            }
-            buf[1]--;
-         }
-         buf[1] = 'Z';
-         buf[2]--;
-      }
-      buf[2] = 'Z';
-      buf[0]--;
-   }
-   printf("%d items appended\n", CNT*CNT*CNT);
-   printf("num_items=%d\n", jcr_chain->size());
-
-   jcr = (MYJCR *)malloc(sizeof(MYJCR));
-   memset(jcr, 0, sizeof(MYJCR));
-
-   jcr->buf = bstrdup("a");
-   if ((jcr1=(MYJCR *)jcr_chain->search((bnode *)jcr, my_compare))) {
-      printf("One less failed!!!! Got: %s\n", jcr1->buf);
-   } else {
-      printf("One less: OK\n");
-   }
-   free(jcr->buf);
-
-   jcr->buf = bstrdup("ZZZZZZZZZZZZZZZZ");
-   if ((jcr1=(MYJCR *)jcr_chain->search((bnode *)jcr, my_compare))) {
-      printf("One greater failed!!!! Got:%s\n", jcr1->buf);
-   } else {
-      printf("One greater: OK\n");
-   }
-   free(jcr->buf);
-
-   jcr->buf = bstrdup("AAA");
-   if ((jcr1=(MYJCR *)jcr_chain->search((bnode *)jcr, my_compare))) {
-      printf("Search for AAA got %s\n", jcr1->buf);
-   } else {
-      printf("Search for AAA not found\n"); 
-   }
-   free(jcr->buf);
-
-   jcr->buf = bstrdup("ZZZ");
-   if ((jcr1 = (MYJCR *)jcr_chain->search((bnode *)jcr, my_compare))) {
-      printf("Search for ZZZ got %s\n", jcr1->buf);
-   } else {
-      printf("Search for ZZZ not found\n"); 
-   }
-   free(jcr->buf);
-   free(jcr);
-
-
-   printf("Find each of %d items in tree.\n", count);
-   for (jcr=(MYJCR *)jcr_chain->first(); jcr; (jcr=(MYJCR *)jcr_chain->next((bnode *)jcr)) ) {
-//    printf("Got: %s\n", jcr->buf);
-      if (!jcr_chain->search((bnode *)jcr, my_compare)) {
-         printf("btree binary_search item not found = %s\n", jcr->buf);
-      }
-   }
-   printf("Free each of %d items in tree.\n", count);
-   for (jcr=(MYJCR *)jcr_chain->first(); jcr; (jcr=(MYJCR *)jcr_chain->next((bnode *)jcr)) ) {
-//    printf("Free: %p %s\n", jcr, jcr->buf);
-      free(jcr->buf);
-      jcr->buf = NULL;
-   }
-   printf("num_items=%d\n", jcr_chain->size());
-   delete jcr_chain;
-
-
-   sm_dump(true);
-
-}
-#endif
diff --git a/bacula/src/lib/btree.h b/bacula/src/lib/btree.h
deleted file mode 100644 (file)
index df25085..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *   Version $Id$
- */
-/*
-   Copyright (C) 2005 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.
-
- */
-
-
-/* ========================================================================
- *
- *   red-black binary tree routines -- btree.h
- *
- *    Kern Sibbald, MMV
- *
- */
-
-#define M_ABORT 1
-
-/*
- * There is a lot of extra casting here to work around the fact
- * that some compilers (Sun and Visual C++) do not accept
- * (bnode *) as an lvalue on the left side of an equal.
- *
- * Loop var through each member of list
- */
-#define foreach_btree(var, tree) \
-    for(*((bnode **)&(var))=(tree)->first(); (*((bnode **)&(var))=(tree)->next((bnode *)var)); )
-
-#ifdef the_old_way
-#define foreach_btree(var, tree) \
-        for((var)=(tree)->first(); (((bnode *)(var))=(tree)->next((bnode *)var)); )
-#endif
-
-struct bnode;
-struct bnode {
-   bnode *left;
-   bnode *right;
-   bnode *parent;
-   bool red;
-};
-
-class btree : public SMARTALLOC {
-   bnode *head;
-   uint32_t num_items;
-   bool down;
-   void left_rotate(bnode *item);
-   void right_rotate(bnode *item);
-public:
-   btree(void);
-   ~btree() { destroy(); }
-   void init(void);
-   bnode *insert(bnode *item, int compare(bnode *item1, bnode *item2));
-   bnode *search(bnode *item, int compare(bnode *item1, bnode *item2));
-   bnode *first(void);
-   bnode *next(bnode *item);
-   bnode *any(bnode *item);
-   void remove(bnode *item);
-   int  size() const;
-   void destroy();
-};
-
-
-/*
- * This allows us to do explicit initialization,
- *   allowing us to mix C++ classes inside malloc'ed
- *   C structures. Define before called in constructor.
- */
-inline void btree::init()
-{
-   head = NULL;
-   num_items = 0;
-}
-
-
-/* Constructor with link at head of item */
-inline btree::btree(void) : head(0), num_items(0)
-{
-}
-
-inline int btree::size() const
-{
-   return num_items;
-}
diff --git a/bacula/src/lib/crypto.c b/bacula/src/lib/crypto.c
deleted file mode 100644 (file)
index 7cc359c..0000000
+++ /dev/null
@@ -1,1620 +0,0 @@
-/*
- * crypto.c Encryption support functions
- *
- * Author: Landon Fuller <landonf@opendarwin.org>
- *
- * Version $Id$
- *
- * Copyright (C) 2005 Kern Sibbald
- *
- * This file was contributed to the Bacula project by Landon Fuller.
- *
- * Landon Fuller has been granted a perpetual, worldwide, non-exclusive,
- * no-charge, royalty-free, irrevocable copyright license to reproduce,
- * prepare derivative works of, publicly display, publicly perform,
- * sublicense, and distribute the original work contributed by Landon Fuller
- * to the Bacula project in source or object form.
- *
- * If you wish to license these contributions under an alternate open source
- * license please contact Landon Fuller <landonf@opendarwin.org>.
- */
-/*
-   Copyright (C) 2005 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 <assert.h>
-
-/*
- * Bacula ASN.1 Syntax
- *
- * OID Allocation:
- * Prefix: iso.org.dod.internet.private.enterprise.threerings.external.bacula (1.3.6.1.4.1.22054.500.2)
- * Organization: Bacula Project
- * Contact Name: Kern Sibbald
- * Contact E-mail: kern@sibbald.com
- *
- * Top Level Allocations - 500.2
- * 1 - Published Allocations
- *   1.1 - Bacula Encryption
- *
- * Bacula Encryption - 500.2.1.1
- * 1 - ASN.1 Modules
- *    1.1 - BaculaCrypto
- * 2 - ASN.1 Object Identifiers
- *    2.1 - SignatureData
- *    2.2 - SignerInfo
- *    2.3 - CryptoData
- *    2.4 - RecipientInfo
- *
- * BaculaCrypto { iso(1) identified-organization(3) usdod(6)
- *                internet(1) private(4) enterprises(1) three-rings(22054)
- *                external(500) bacula(2) published(1) bacula-encryption(1)
- *                asn1-modules(1) bacula-crypto(1) }
- *
- * DEFINITIONS AUTOMATIC TAGS ::=
- * BEGIN
- *
- * SignatureData ::= SEQUENCE {
- *    version         Version DEFAULT v0,
- *    signerInfo      SignerInfo }
- *
- * CryptoData ::= SEQUENCE {
- *    version                     Version DEFAULT v0,
- *    contentEncryptionAlgorithm  ContentEncryptionAlgorithmIdentifier,
- *    iv                          InitializationVector,
- *    recipientInfo               RecipientInfo
- * }
- *
- * SignerInfo ::= SET OF SignerInfo
- * RecipientInfo ::= SET OF RecipientInfo
- *
- * Version ::= INTEGER { v0(0) }
- *
- * SignerInfo ::= SEQUENCE {
- *    version                 Version,
- *    subjectKeyIdentifier    SubjectKeyIdentifier,
- *    digestAlgorithm         DigestAlgorithmIdentifier,
- *    signatureAlgorithm      SignatureAlgorithmIdentifier,
- *    signature               SignatureValue }
- *
- * RecipientInfo ::= SEQUENCE {
- *    version                 Version
- *    subjectKeyIdentifier    SubjectKeyIdentifier
- *    keyEncryptionAlgorithm  KeyEncryptionAlgorithmIdentifier
- *    encryptedKey            EncryptedKey
- * }
- *
- * SubjectKeyIdentifier ::= OCTET STRING
- *
- * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
- *
- * SignatureAlgorithmIdentifier ::= AlgorithmIdentifier
- *
- * KeyEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
- *
- * ContentEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
- *
- * InitializationVector ::= OCTET STRING
- *
- * SignatureValue ::= OCTET STRING
- *
- * EncryptedKey ::= OCTET STRING
- *
- * AlgorithmIdentifier ::= OBJECT IDENTIFIER
- *
- * END
- */
-
-#ifdef HAVE_CRYPTO /* Is encryption enabled? */
-#ifdef HAVE_OPENSSL /* How about OpenSSL? */
-
-/* Are we initialized? */
-static int crypto_initialized = false;
-
-/* ASN.1 Declarations */
-#define BACULA_ASN1_VERSION 0
-
-typedef struct {
-   ASN1_INTEGER *version;
-   ASN1_OCTET_STRING *subjectKeyIdentifier;
-   ASN1_OBJECT *digestAlgorithm;
-   ASN1_OBJECT *signatureAlgorithm;
-   ASN1_OCTET_STRING *signature;
-} SignerInfo;
-
-typedef struct {
-   ASN1_INTEGER *version;
-   ASN1_OCTET_STRING *subjectKeyIdentifier;
-   ASN1_OBJECT *keyEncryptionAlgorithm;
-   ASN1_OCTET_STRING *encryptedKey;
-} RecipientInfo;
-
-ASN1_SEQUENCE(SignerInfo) = {
-   ASN1_SIMPLE(SignerInfo, version, ASN1_INTEGER),
-   ASN1_SIMPLE(SignerInfo, subjectKeyIdentifier, ASN1_OCTET_STRING),
-   ASN1_SIMPLE(SignerInfo, digestAlgorithm, ASN1_OBJECT),
-   ASN1_SIMPLE(SignerInfo, signatureAlgorithm, ASN1_OBJECT),
-   ASN1_SIMPLE(SignerInfo, signature, ASN1_OCTET_STRING)
-} ASN1_SEQUENCE_END(SignerInfo);
-
-ASN1_SEQUENCE(RecipientInfo) = {
-   ASN1_SIMPLE(RecipientInfo, version, ASN1_INTEGER),
-   ASN1_SIMPLE(RecipientInfo, subjectKeyIdentifier, ASN1_OCTET_STRING),
-   ASN1_SIMPLE(RecipientInfo, keyEncryptionAlgorithm, ASN1_OBJECT),
-   ASN1_SIMPLE(RecipientInfo, encryptedKey, ASN1_OCTET_STRING),
-} ASN1_SEQUENCE_END(RecipientInfo);
-
-typedef struct {
-   ASN1_INTEGER *version;
-   STACK_OF(SignerInfo) *signerInfo;
-} SignatureData;
-
-typedef struct {
-   ASN1_INTEGER *version;
-   ASN1_OBJECT *contentEncryptionAlgorithm;
-   ASN1_OCTET_STRING *iv;
-   STACK_OF(RecipientInfo) *recipientInfo;
-} CryptoData;
-
-ASN1_SEQUENCE(SignatureData) = {
-   ASN1_SIMPLE(SignatureData, version, ASN1_INTEGER),
-   ASN1_SET_OF(SignatureData, signerInfo, SignerInfo),
-} ASN1_SEQUENCE_END(SignatureData);
-
-ASN1_SEQUENCE(CryptoData) = {
-   ASN1_SIMPLE(CryptoData, version, ASN1_INTEGER),
-   ASN1_SIMPLE(CryptoData, contentEncryptionAlgorithm, ASN1_OBJECT),
-   ASN1_SIMPLE(CryptoData, iv, ASN1_OCTET_STRING),
-   ASN1_SET_OF(CryptoData, recipientInfo, RecipientInfo)
-} ASN1_SEQUENCE_END(CryptoData);
-
-IMPLEMENT_ASN1_FUNCTIONS(SignerInfo)
-IMPLEMENT_ASN1_FUNCTIONS(RecipientInfo)
-IMPLEMENT_ASN1_FUNCTIONS(SignatureData)
-IMPLEMENT_ASN1_FUNCTIONS(CryptoData)
-IMPLEMENT_STACK_OF(SignerInfo)
-IMPLEMENT_STACK_OF(RecipientInfo)
-
-/*
- * SignerInfo and RecipientInfo stack macros, generated by OpenSSL's util/mkstack.pl.
- */
-#define sk_SignerInfo_new(st) SKM_sk_new(SignerInfo, (st))
-#define sk_SignerInfo_new_null() SKM_sk_new_null(SignerInfo)
-#define sk_SignerInfo_free(st) SKM_sk_free(SignerInfo, (st))
-#define sk_SignerInfo_num(st) SKM_sk_num(SignerInfo, (st))
-#define sk_SignerInfo_value(st, i) SKM_sk_value(SignerInfo, (st), (i))
-#define sk_SignerInfo_set(st, i, val) SKM_sk_set(SignerInfo, (st), (i), (val))
-#define sk_SignerInfo_zero(st) SKM_sk_zero(SignerInfo, (st))
-#define sk_SignerInfo_push(st, val) SKM_sk_push(SignerInfo, (st), (val))
-#define sk_SignerInfo_unshift(st, val) SKM_sk_unshift(SignerInfo, (st), (val))
-#define sk_SignerInfo_find(st, val) SKM_sk_find(SignerInfo, (st), (val))
-#define sk_SignerInfo_delete(st, i) SKM_sk_delete(SignerInfo, (st), (i))
-#define sk_SignerInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(SignerInfo, (st), (ptr))
-#define sk_SignerInfo_insert(st, val, i) SKM_sk_insert(SignerInfo, (st), (val), (i))
-#define sk_SignerInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SignerInfo, (st), (cmp))
-#define sk_SignerInfo_dup(st) SKM_sk_dup(SignerInfo, st)
-#define sk_SignerInfo_pop_free(st, free_func) SKM_sk_pop_free(SignerInfo, (st), (free_func))
-#define sk_SignerInfo_shift(st) SKM_sk_shift(SignerInfo, (st))
-#define sk_SignerInfo_pop(st) SKM_sk_pop(SignerInfo, (st))
-#define sk_SignerInfo_sort(st) SKM_sk_sort(SignerInfo, (st))
-#define sk_SignerInfo_is_sorted(st) SKM_sk_is_sorted(SignerInfo, (st))
-
-#define d2i_ASN1_SET_OF_SignerInfo(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
-        SKM_ASN1_SET_OF_d2i(SignerInfo, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
-#define i2d_ASN1_SET_OF_SignerInfo(st, pp, i2d_func, ex_tag, ex_class, is_set) \
-        SKM_ASN1_SET_OF_i2d(SignerInfo, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
-#define ASN1_seq_pack_SignerInfo(st, i2d_func, buf, len) \
-        SKM_ASN1_seq_pack(SignerInfo, (st), (i2d_func), (buf), (len))
-#define ASN1_seq_unpack_SignerInfo(buf, len, d2i_func, free_func) \
-        SKM_ASN1_seq_unpack(SignerInfo, (buf), (len), (d2i_func), (free_func))
-
-#define sk_RecipientInfo_new(st) SKM_sk_new(RecipientInfo, (st))
-#define sk_RecipientInfo_new_null() SKM_sk_new_null(RecipientInfo)
-#define sk_RecipientInfo_free(st) SKM_sk_free(RecipientInfo, (st))
-#define sk_RecipientInfo_num(st) SKM_sk_num(RecipientInfo, (st))
-#define sk_RecipientInfo_value(st, i) SKM_sk_value(RecipientInfo, (st), (i))
-#define sk_RecipientInfo_set(st, i, val) SKM_sk_set(RecipientInfo, (st), (i), (val))
-#define sk_RecipientInfo_zero(st) SKM_sk_zero(RecipientInfo, (st))
-#define sk_RecipientInfo_push(st, val) SKM_sk_push(RecipientInfo, (st), (val))
-#define sk_RecipientInfo_unshift(st, val) SKM_sk_unshift(RecipientInfo, (st), (val))
-#define sk_RecipientInfo_find(st, val) SKM_sk_find(RecipientInfo, (st), (val))
-#define sk_RecipientInfo_delete(st, i) SKM_sk_delete(RecipientInfo, (st), (i))
-#define sk_RecipientInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(RecipientInfo, (st), (ptr))
-#define sk_RecipientInfo_insert(st, val, i) SKM_sk_insert(RecipientInfo, (st), (val), (i))
-#define sk_RecipientInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(RecipientInfo, (st), (cmp))
-#define sk_RecipientInfo_dup(st) SKM_sk_dup(RecipientInfo, st)
-#define sk_RecipientInfo_pop_free(st, free_func) SKM_sk_pop_free(RecipientInfo, (st), (free_func))
-#define sk_RecipientInfo_shift(st) SKM_sk_shift(RecipientInfo, (st))
-#define sk_RecipientInfo_pop(st) SKM_sk_pop(RecipientInfo, (st))
-#define sk_RecipientInfo_sort(st) SKM_sk_sort(RecipientInfo, (st))
-#define sk_RecipientInfo_is_sorted(st) SKM_sk_is_sorted(RecipientInfo, (st))
-
-#define d2i_ASN1_SET_OF_RecipientInfo(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
-        SKM_ASN1_SET_OF_d2i(RecipientInfo, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
-#define i2d_ASN1_SET_OF_RecipientInfo(st, pp, i2d_func, ex_tag, ex_class, is_set) \
-        SKM_ASN1_SET_OF_i2d(RecipientInfo, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
-#define ASN1_seq_pack_RecipientInfo(st, i2d_func, buf, len) \
-        SKM_ASN1_seq_pack(RecipientInfo, (st), (i2d_func), (buf), (len))
-#define ASN1_seq_unpack_RecipientInfo(buf, len, d2i_func, free_func) \
-        SKM_ASN1_seq_unpack(RecipientInfo, (buf), (len), (d2i_func), (free_func))
-/* End of util/mkstack.pl block */
-
-/* X509 Public/Private Key Pair Structure */
-struct X509_Keypair {
-   ASN1_OCTET_STRING *keyid;
-   EVP_PKEY *pubkey;
-   EVP_PKEY *privkey;
-};
-
-/* Message Digest Structure */
-struct Digest {
-   crypto_digest_t type;
-   EVP_MD_CTX ctx;
-};
-
-/* Message Signature Structure */
-struct Signature {
-   SignatureData *sigData;
-};
-
-/* Encryption Session Data */
-struct Crypto_Session {
-   CryptoData *cryptoData;                        /* ASN.1 Structure */
-   unsigned char *session_key;                    /* Private symmetric session key */
-   size_t session_key_len;                        /* Symmetric session key length */
-};
-
-/* Symmetric Cipher Context */
-struct Cipher_Context {
-   EVP_CIPHER_CTX ctx;
-};
-
-/* PEM Password Dispatch Context */
-typedef struct PEM_CB_Context {
-   CRYPTO_PEM_PASSWD_CB *pem_callback;
-   const void *pem_userdata;
-} PEM_CB_CONTEXT;
-
-/*
- * Extract subjectKeyIdentifier from x509 certificate.
- * Returns: On success, an ASN1_OCTET_STRING that must be freed via M_ASN1_OCTET_STRING_free().
- *          NULL on failure.
- */
-static ASN1_OCTET_STRING *openssl_cert_keyid(X509 *cert){
-   X509_EXTENSION *ext;
-   X509V3_EXT_METHOD *method;
-   ASN1_OCTET_STRING *keyid;
-   int i;
-#if (OPENSSL_VERSION_NUMBER >= 0x0090800FL)
-   const unsigned char *ext_value_data;
-#else
-   unsigned char *ext_value_data;
-#endif
-
-
-   /* Find the index to the subjectKeyIdentifier extension */
-   i = X509_get_ext_by_NID(cert, NID_subject_key_identifier, -1);
-   if (i < 0) {
-      /* Not found */
-      return NULL;
-   }
-
-   /* Grab the extension */
-   ext = X509_get_ext(cert, i);
-
-   /* Get x509 extension method structure */
-   if (!(method = X509V3_EXT_get(ext))) {
-      return NULL;
-   }
-
-   ext_value_data = ext->value->data;
-
-#if (OPENSSL_VERSION_NUMBER > 0x00907000L)
-   if (method->it) {
-      /* New style ASN1 */
-
-      /* Decode ASN1 item in data */
-      keyid = (ASN1_OCTET_STRING *) ASN1_item_d2i(NULL, &ext_value_data, ext->value->length,
-                                                  ASN1_ITEM_ptr(method->it));
-   } else {
-      /* Old style ASN1 */
-
-      /* Decode ASN1 item in data */
-      keyid = (ASN1_OCTET_STRING *) method->d2i(NULL, &ext_value_data, ext->value->length);
-   }
-
-#else
-   keyid = (ASN1_OCTET_STRING *) method->d2i(NULL, &ext_value_data, ext->value->length);
-#endif
-
-   return keyid;
-}
-
-/*
- * Create a new keypair object.
- *  Returns: A pointer to a X509 KEYPAIR object on success.
- *           NULL on failure.
- */
-X509_KEYPAIR *crypto_keypair_new (void) {
-   X509_KEYPAIR *keypair;
-
-   /* Allocate our keypair structure */
-   keypair = (X509_KEYPAIR *) malloc(sizeof(X509_KEYPAIR));
-   if (!keypair) {
-      return NULL;
-   }
-
-   /* Initialize our keypair structure */
-   keypair->keyid = NULL;
-   keypair->pubkey = NULL;
-   keypair->privkey = NULL;
-
-   return keypair;
-}
-
-/*
- * Create a copy of a keypair object. The underlying
- * EVP objects are not duplicated, as no EVP_PKEY_dup()
- * API is available. Instead, the reference count is
- * incremented.
- */
-X509_KEYPAIR *crypto_keypair_dup (X509_KEYPAIR *keypair)
-{
-   X509_KEYPAIR *newpair;
-
-   newpair = crypto_keypair_new();
-
-   if (!newpair) {
-      /* Allocation failed */
-      return NULL;
-   }
-
-   /* Increment the public key ref count */
-   if (keypair->pubkey) {
-      CRYPTO_add(&(keypair->pubkey->references), 1, CRYPTO_LOCK_EVP_PKEY);
-      newpair->pubkey = keypair->pubkey;
-   }
-
-   /* Increment the private key ref count */
-   if (keypair->privkey) {
-      CRYPTO_add(&(keypair->privkey->references), 1, CRYPTO_LOCK_EVP_PKEY);
-      newpair->privkey = keypair->privkey;
-   }
-
-   /* Duplicate the keyid */
-   if (keypair->keyid) {
-      newpair->keyid = M_ASN1_OCTET_STRING_dup(keypair->keyid);
-      if (!newpair->keyid) {
-         /* Allocation failed */
-         crypto_keypair_free(newpair);
-         return NULL;
-      }
-   }
-
-   return newpair;
-}
-
-
-/*
- * Load a public key from a PEM-encoded x509 certificate.
- *  Returns: true on success
- *           false on failure
- */
-int crypto_keypair_load_cert (X509_KEYPAIR *keypair, const char *file)
-{
-   BIO *bio;
-   X509 *cert;
-
-   /* Open the file */
-   if (!(bio = BIO_new_file(file, "r"))) {
-      openssl_post_errors(M_ERROR, _("Unable to open certificate file"));
-      return false;
-   }
-
-   cert = PEM_read_bio_X509(bio, NULL, NULL, NULL);
-   BIO_free(bio);
-   if (!cert) {
-      openssl_post_errors(M_ERROR, _("Unable to read certificate from file"));
-      return false;
-   }
-
-   /* Extract the public key */
-   if (!(keypair->pubkey = X509_get_pubkey(cert))) {
-      openssl_post_errors(M_ERROR, _("Unable to extract public key from certificate"));
-      goto err;
-   }
-
-   /* Extract the subjectKeyIdentifier extension field */
-   if ((keypair->keyid = openssl_cert_keyid(cert)) == NULL) {
-      Emsg0(M_ERROR, 0, _("Provided certificate does not include the required subjectKeyIdentifier extension."));
-      goto err;
-   }
-
-   /* Validate the public key type (only RSA is supported) */
-   if (EVP_PKEY_type(keypair->pubkey->type) != EVP_PKEY_RSA) {
-       Emsg1(M_ERROR, 0, _("Unsupported key type provided: %d\n"), EVP_PKEY_type(keypair->pubkey->type));
-       goto err;
-   }
-
-   X509_free(cert);
-   return true;
-
-err:
-   X509_free(cert);
-   if (keypair->pubkey) {
-      EVP_PKEY_free(keypair->pubkey);
-   }
-   return false;
-}
-
-/* Dispatch user PEM encryption callbacks */
-static int crypto_pem_callback_dispatch (char *buf, int size, int rwflag, void *userdata)
-{
-   PEM_CB_CONTEXT *ctx = (PEM_CB_CONTEXT *) userdata;
-   return (ctx->pem_callback(buf, size, ctx->pem_userdata));
-}
-
-/*
- * Check a PEM-encoded file
- * for the existence of a private key.
- * Returns: true if a private key is found
- *          false otherwise
- */
-bool crypto_keypair_has_key (const char *file) {
-   BIO *bio;
-   char *name = NULL;
-   char *header = NULL;
-   unsigned char *data = NULL;
-   bool retval = false;
-   long len;
-
-   if (!(bio = BIO_new_file(file, "r"))) {
-      openssl_post_errors(M_ERROR, _("Unable to open private key file"));
-      return false;
-   }
-
-   while (PEM_read_bio(bio, &name, &header, &data, &len)) {
-      /* We don't care what the data is, just that it's there */
-      OPENSSL_free(header);
-      OPENSSL_free(data);
-
-      /*
-       * PEM Header Found, check for a private key
-       * Due to OpenSSL limitations, we must specifically
-       * list supported PEM private key encodings.
-       */
-      if (strcmp(name, PEM_STRING_RSA) == 0
-            || strcmp(name, PEM_STRING_DSA) == 0
-            || strcmp(name, PEM_STRING_PKCS8) == 0
-            || strcmp(name, PEM_STRING_PKCS8INF) == 0) {
-         retval = true;
-         OPENSSL_free(name);
-         break;
-      } else {
-         OPENSSL_free(name);
-      }
-   }
-
-   /* Free our bio */
-   BIO_free(bio);
-
-   /* Post PEM-decoding error messages, if any */
-   openssl_post_errors(M_ERROR, _("Unable to read private key from file"));
-   return retval;
-}
-
-/*
- * Load a PEM-encoded private key.
- *  Returns: true on success
- *           false on failure
- */
-int crypto_keypair_load_key (X509_KEYPAIR *keypair, const char *file,
-                             CRYPTO_PEM_PASSWD_CB *pem_callback,
-                             const void *pem_userdata)
-{
-   BIO *bio;
-   PEM_CB_CONTEXT ctx;
-
-   /* Open the file */
-   if (!(bio = BIO_new_file(file, "r"))) {
-      openssl_post_errors(M_ERROR, _("Unable to open private key file"));
-      return false;
-   }
-
-   /* Set up PEM encryption callback */
-   if (pem_callback) {
-      ctx.pem_callback = pem_callback;
-      ctx.pem_userdata = pem_userdata;
-   } else {
-      ctx.pem_callback = crypto_default_pem_callback;
-      ctx.pem_userdata = NULL;
-   }
-
-   keypair->privkey = PEM_read_bio_PrivateKey(bio, NULL, crypto_pem_callback_dispatch, &ctx);
-   BIO_free(bio);
-   if (!keypair->privkey) {
-      openssl_post_errors(M_ERROR, _("Unable to read private key from file"));
-      return false;
-   }
-
-   return true;
-}
-
-/*
- * Free memory associated with a keypair object.
- */
-void crypto_keypair_free (X509_KEYPAIR *keypair)
-{
-   if (keypair->pubkey) {
-      EVP_PKEY_free(keypair->pubkey);
-   }
-   if (keypair->privkey) {
-      EVP_PKEY_free(keypair->privkey);
-   }
-   if (keypair->keyid) {
-      M_ASN1_OCTET_STRING_free(keypair->keyid);
-   }
-   free(keypair);
-}
-
-/*
- * Create a new message digest context of the specified type
- *  Returns: A pointer to a DIGEST object on success.
- *           NULL on failure.
- */
-DIGEST *crypto_digest_new (crypto_digest_t type)
-{
-   DIGEST *digest;
-   const EVP_MD *md = NULL; /* Quell invalid uninitialized warnings */
-
-   digest = (DIGEST *) malloc(sizeof(DIGEST));
-   digest->type = type;
-
-   /* Initialize the OpenSSL message digest context */
-   EVP_MD_CTX_init(&digest->ctx);
-
-   /* Determine the correct OpenSSL message digest type */
-   switch (type) {
-   case CRYPTO_DIGEST_MD5:
-      md = EVP_md5();
-      break;
-   case CRYPTO_DIGEST_SHA1:
-      md = EVP_sha1();
-      break;
-#ifdef HAVE_SHA2
-   case CRYPTO_DIGEST_SHA256:
-      md = EVP_sha256();
-      break;
-   case CRYPTO_DIGEST_SHA512:
-      md = EVP_sha512();
-      break;
-#endif
-   default:
-      Emsg1(M_ERROR, 0, _("Unsupported digest type: %d\n"), type);
-      goto err;
-   }
-
-   /* Initialize the backing OpenSSL context */
-   if (EVP_DigestInit_ex(&digest->ctx, md, NULL) == 0) {
-      goto err;
-   }
-
-   return digest;
-
-err:
-   /* This should not happen, but never say never ... */
-   openssl_post_errors(M_ERROR, _("OpenSSL digest initialization failed"));
-   crypto_digest_free(digest);
-   return NULL;
-}
-
-/*
- * Hash length bytes of data into the provided digest context.
- * Returns: true on success
- *          false on failure
- */
-bool crypto_digest_update (DIGEST *digest, const void *data, size_t length) {
-   if (EVP_DigestUpdate(&digest->ctx, data, length) == 0) {
-      return true;
-   } else { 
-      return false;
-   }
-}
-
-/*
- * Finalize the data in digest, storing the result in dest and the result size
- * in length. The result size can be determined with crypto_digest_size().
- *
- * Returns: true on success
- *          false on failure
- */
-bool crypto_digest_finalize (DIGEST *digest, void *dest, size_t *length) {
-   if (!EVP_DigestFinal(&digest->ctx, (unsigned char *) dest, (unsigned int *) length)) {
-      return false;
-   } else {
-      return true;
-   }
-}
-
-/*
- * Free memory associated with a digest object.
- */
-void crypto_digest_free (DIGEST *digest)
-{
-  EVP_MD_CTX_cleanup(&digest->ctx);
-  free (digest);
-}
-
-/*
- * Create a new message signature context.
- *  Returns: A pointer to a SIGNATURE object on success.
- *           NULL on failure.
- */
-SIGNATURE *crypto_sign_new (void)
-{
-   SIGNATURE *sig;
-
-   sig = (SIGNATURE *) malloc(sizeof(SIGNATURE));
-   if (!sig) {
-      return NULL;
-   }
-
-   sig->sigData = SignatureData_new();
-
-   if (!sig->sigData) {
-      /* Allocation failed in OpenSSL */
-      free(sig);
-      return NULL;
-   }
-
-   /* Set the ASN.1 structure version number */
-   ASN1_INTEGER_set(sig->sigData->version, BACULA_ASN1_VERSION);
-
-   return sig;
-}
-
-/*
- * For a given public key, find the associated SignatureInfo record
- * and create a digest context for signature validation
- * Returns: CRYPTO_ERROR_NONE on success, with the newly allocated DIGEST in digest.
- *          A crypto_error_t value on failure.
- */
-crypto_error_t crypto_sign_get_digest(SIGNATURE *sig, X509_KEYPAIR *keypair, DIGEST **digest)
-{
-   STACK_OF(SignerInfo) *signers;
-   SignerInfo *si;
-   int i;
-
-   signers = sig->sigData->signerInfo;
-
-   for (i = 0; i < sk_SignerInfo_num(signers); i++) {
-      si = sk_SignerInfo_value(signers, i);
-      if (M_ASN1_OCTET_STRING_cmp(keypair->keyid, si->subjectKeyIdentifier) == 0) {
-         /* Get the digest algorithm and allocate a digest context */
-         switch (OBJ_obj2nid(si->digestAlgorithm)) {
-         case NID_md5:
-            *digest = crypto_digest_new(CRYPTO_DIGEST_MD5);
-            break;
-         case NID_sha1:
-            *digest = crypto_digest_new(CRYPTO_DIGEST_SHA1);
-            break;
-#ifdef HAVE_SHA2
-         case NID_sha256:
-            *digest = crypto_digest_new(CRYPTO_DIGEST_SHA256);
-            break;
-         case NID_sha512:
-            *digest = crypto_digest_new(CRYPTO_DIGEST_SHA512);
-            break;
-#endif
-         default:
-            *digest = NULL;
-            return CRYPTO_ERROR_INVALID_DIGEST;
-         }
-
-         /* Shouldn't happen */
-         if (*digest == NULL) {
-            return CRYPTO_ERROR_INVALID_DIGEST;
-         } else {
-            return CRYPTO_ERROR_NONE;
-         }
-      }
-   }
-
-   return CRYPTO_ERROR_NOSIGNER;
-}
-
-/*
- * For a given signature, public key, and digest, verify the SIGNATURE.
- * Returns: CRYPTO_ERROR_NONE on success.
- *          A crypto_error_t value on failure.
- */
-crypto_error_t crypto_sign_verify(SIGNATURE *sig, X509_KEYPAIR *keypair, DIGEST *digest)
-{
-   STACK_OF(SignerInfo) *signers;
-   SignerInfo *si;
-   int ok, i;
-   unsigned int sigLen;
-#if (OPENSSL_VERSION_NUMBER >= 0x0090800FL)
-   const unsigned char *sigData;
-#else
-   unsigned char *sigData;
-#endif
-
-   signers = sig->sigData->signerInfo;
-
-   /* Find the signer */
-   for (i = 0; i < sk_SignerInfo_num(signers); i++) {
-      si = sk_SignerInfo_value(signers, i);
-      if (M_ASN1_OCTET_STRING_cmp(keypair->keyid, si->subjectKeyIdentifier) == 0) {
-         /* Extract the signature data */
-         sigLen = M_ASN1_STRING_length(si->signature);
-         sigData = M_ASN1_STRING_data(si->signature);
-
-         ok = EVP_VerifyFinal(&digest->ctx, sigData, sigLen, keypair->pubkey);
-         if (ok >= 1) {
-            return CRYPTO_ERROR_NONE;
-         } else if (ok == 0) {
-            return CRYPTO_ERROR_BAD_SIGNATURE;
-         } else if (ok < 0) {
-            /* Shouldn't happen */
-            openssl_post_errors(M_ERROR, _("OpenSSL error occured"));
-            return CRYPTO_ERROR_INTERNAL;
-         }
-      }
-   }
-
-   /* Signer wasn't found. */
-   return CRYPTO_ERROR_NOSIGNER;
-}
-
-
-/*
- * Add a new signer
- *  Returns: true on success
- *           false on failure
- */
-int crypto_sign_add_signer(SIGNATURE *sig, DIGEST *digest, X509_KEYPAIR *keypair)
-{
-   SignerInfo *si = NULL;
-   unsigned char *buf = NULL;
-   unsigned int len;
-
-   si = SignerInfo_new();
-
-   if (!si) {
-      /* Allocation failed in OpenSSL */
-      return false;
-   }
-
-   /* Set the ASN.1 structure version number */
-   ASN1_INTEGER_set(si->version, BACULA_ASN1_VERSION);
-
-   /* Set the digest algorithm identifier */
-   switch (digest->type) {
-   case CRYPTO_DIGEST_MD5:
-      si->digestAlgorithm = OBJ_nid2obj(NID_md5);
-      break;
-   case CRYPTO_DIGEST_SHA1:
-      si->digestAlgorithm = OBJ_nid2obj(NID_sha1);
-      break;
-#ifdef HAVE_SHA2
-   case CRYPTO_DIGEST_SHA256:
-      si->digestAlgorithm = OBJ_nid2obj(NID_sha256);
-      break;
-   case CRYPTO_DIGEST_SHA512:
-      si->digestAlgorithm = OBJ_nid2obj(NID_sha512);
-      break;
-#endif
-   default:
-      /* This should never happen */
-      goto err;
-   }
-
-   /* Drop the string allocated by OpenSSL, and add our subjectKeyIdentifier */
-   M_ASN1_OCTET_STRING_free(si->subjectKeyIdentifier);
-   si->subjectKeyIdentifier = M_ASN1_OCTET_STRING_dup(keypair->keyid);
-
-   /* Set our signature algorithm. We currently require RSA */
-   assert(EVP_PKEY_type(keypair->pubkey->type) == EVP_PKEY_RSA);
-   /* This is slightly evil. Reach into the MD structure and grab the key type */
-   si->signatureAlgorithm = OBJ_nid2obj(digest->ctx.digest->pkey_type);
-
-   /* Finalize/Sign our Digest */
-   len = EVP_PKEY_size(keypair->privkey);
-   buf = (unsigned char *) malloc(len);
-   if (!EVP_SignFinal(&digest->ctx, buf, &len, keypair->privkey)) {
-      openssl_post_errors(M_ERROR, _("Signature creation failed"));
-      goto err;
-   }
-
-   /* Add the signature to the SignerInfo structure */
-   if (!M_ASN1_OCTET_STRING_set(si->signature, buf, len)) {
-      /* Allocation failed in OpenSSL */
-      goto err;
-   }
-
-   /* No longer needed */
-   free(buf);
-
-   /* Push the new SignerInfo structure onto the stack */
-   sk_SignerInfo_push(sig->sigData->signerInfo, si);
-
-   return true;
-
-err:
-   if (si) {
-      SignerInfo_free(si);
-   }
-   if (buf) {
-      free(buf);
-   }
-
-   return false;
-}
-
-/*
- * Encodes the SignatureData structure. The length argument is used to specify the
- * size of dest. A length of 0 will cause no data to be written to dest, and the
- * required length to be written to length. The caller can then allocate sufficient
- * space for the output.
- *
- * Returns: true on success, stores the encoded data in dest, and the size in length.
- *          false on failure.
- */
-int crypto_sign_encode(SIGNATURE *sig, void *dest, size_t *length)
-{
-   if (*length == 0) {
-      *length = i2d_SignatureData(sig->sigData, NULL);
-      return true;
-   }
-
-   *length = i2d_SignatureData(sig->sigData, (unsigned char **) &dest);
-   return true;
-}
-
-/*
- * Decodes the SignatureData structure. The length argument is used to specify the
- * size of sigData.
- *
- * Returns: SIGNATURE instance on success.
- *          NULL on failure.
-
- */
-
-SIGNATURE *crypto_sign_decode(const void *sigData, size_t length)
-{
-   SIGNATURE *sig;
-#if (OPENSSL_VERSION_NUMBER >= 0x0090800FL)
-   const unsigned char *p = (const unsigned char *) sigData;
-#else
-   unsigned char *p = (unsigned char *) sigData;
-#endif
-
-   sig = (SIGNATURE *) malloc(sizeof(SIGNATURE));
-   if (!sig) {
-      return NULL;
-   }
-
-   /* d2i_SignatureData modifies the supplied pointer */
-   sig->sigData  = d2i_SignatureData(NULL, &p, length);
-
-   if (!sig->sigData) {
-      /* Allocation / Decoding failed in OpenSSL */
-      openssl_post_errors(M_ERROR, _("Signature decoding failed"));
-      free(sig);
-      return NULL;
-   }
-
-   return sig;
-}
-
-/*
- * Free memory associated with a signature object.
- */
-void crypto_sign_free(SIGNATURE *sig)
-{
-   SignatureData_free(sig->sigData);
-   free (sig);
-}
-
-/*
- * Create a new encryption session.
- *  Returns: A pointer to a CRYPTO_SESSION object on success.
- *           NULL on failure.
- */
-CRYPTO_SESSION *crypto_session_new (crypto_cipher_t cipher, alist *pubkeys)
-{
-   CRYPTO_SESSION *cs;
-   X509_KEYPAIR *keypair;
-   const EVP_CIPHER *ec;
-   unsigned char *iv;
-   int iv_len;
-
-   /* Allocate our session description structures */
-   cs = (CRYPTO_SESSION *) malloc(sizeof(CRYPTO_SESSION));
-   if (!cs) {
-      return NULL;
-   }
-
-   /* Initialize required fields */
-   cs->session_key = NULL;
-
-   /* Allocate a CryptoData structure */
-   cs->cryptoData = CryptoData_new();
-
-   if (!cs->cryptoData) {
-      /* Allocation failed in OpenSSL */
-      free(cs);
-      return NULL;
-   }
-
-   /* Set the ASN.1 structure version number */
-   ASN1_INTEGER_set(cs->cryptoData->version, BACULA_ASN1_VERSION);
-
-   /*
-    * Acquire a cipher instance and set the ASN.1 cipher NID
-    */
-   switch (cipher) {
-   case CRYPTO_CIPHER_AES_128_CBC:
-      /* AES 128 bit CBC */
-      cs->cryptoData->contentEncryptionAlgorithm = OBJ_nid2obj(NID_aes_128_cbc);
-      ec = EVP_aes_128_cbc();
-      break;
-   case CRYPTO_CIPHER_AES_192_CBC:
-      /* AES 192 bit CBC */
-      cs->cryptoData->contentEncryptionAlgorithm = OBJ_nid2obj(NID_aes_192_cbc);
-      ec = EVP_aes_192_cbc();
-      break;
-   case CRYPTO_CIPHER_AES_256_CBC:
-      /* AES 256 bit CBC */
-      cs->cryptoData->contentEncryptionAlgorithm = OBJ_nid2obj(NID_aes_256_cbc);
-      ec = EVP_aes_256_cbc();
-      break;
-   case CRYPTO_CIPHER_BLOWFISH_CBC:
-      /* Blowfish CBC */
-      cs->cryptoData->contentEncryptionAlgorithm = OBJ_nid2obj(NID_bf_cbc);
-      ec = EVP_bf_cbc();
-      break;
-   default:
-      Emsg0(M_ERROR, 0, _("Unsupported cipher type specified\n"));
-      crypto_session_free(cs);
-      return NULL;
-   }
-
-   /* Generate a symmetric session key */
-   cs->session_key_len = EVP_CIPHER_key_length(ec);
-   cs->session_key = (unsigned char *) malloc(cs->session_key_len);
-   if (RAND_bytes(cs->session_key, cs->session_key_len) <= 0) {
-      /* OpenSSL failure */
-      crypto_session_free(cs);
-      return NULL;
-   }
-
-   /* Generate an IV if possible */
-   if ((iv_len = EVP_CIPHER_iv_length(ec))) {
-      iv = (unsigned char *) malloc(iv_len);
-      if (!iv) {
-         /* Malloc failure */
-         crypto_session_free(cs);
-         return NULL;
-      }
-
-      /* Generate random IV */
-      if (RAND_bytes(iv, iv_len) <= 0) {
-         /* OpenSSL failure */
-         crypto_session_free(cs);
-         free(iv);
-         return NULL;
-      }
-
-      /* Store it in our ASN.1 structure */
-      if (!M_ASN1_OCTET_STRING_set(cs->cryptoData->iv, iv, iv_len)) {
-         /* Allocation failed in OpenSSL */
-         crypto_session_free(cs);
-         free(iv);
-         return NULL;
-      }
-      free(iv);
-   }
-
-   /*
-    * Create RecipientInfo structures for supplied
-    * public keys.
-    */
-   foreach_alist(keypair, pubkeys) {
-      RecipientInfo *ri;
-      unsigned char *ekey;
-      int ekey_len;
-
-      ri = RecipientInfo_new();
-      if (!ri) {
-         /* Allocation failed in OpenSSL */
-         crypto_session_free(cs);
-         return NULL;
-      }
-
-      /* Set the ASN.1 structure version number */
-      ASN1_INTEGER_set(ri->version, BACULA_ASN1_VERSION);
-
-      /* Drop the string allocated by OpenSSL, and add our subjectKeyIdentifier */
-      M_ASN1_OCTET_STRING_free(ri->subjectKeyIdentifier);
-      ri->subjectKeyIdentifier = M_ASN1_OCTET_STRING_dup(keypair->keyid);
-
-      /* Set our key encryption algorithm. We currently require RSA */
-      assert(keypair->pubkey && EVP_PKEY_type(keypair->pubkey->type) == EVP_PKEY_RSA);
-      ri->keyEncryptionAlgorithm = OBJ_nid2obj(NID_rsaEncryption);
-
-      /* Encrypt the session key */
-      ekey = (unsigned char *) malloc(EVP_PKEY_size(keypair->pubkey));
-      if (!ekey) {
-         RecipientInfo_free(ri);
-         crypto_session_free(cs);
-         return NULL;
-      }
-
-      if ((ekey_len = EVP_PKEY_encrypt(ekey, cs->session_key, cs->session_key_len, keypair->pubkey)) <= 0) {
-         /* OpenSSL failure */
-         RecipientInfo_free(ri);
-         crypto_session_free(cs);
-         free(ekey);
-         return NULL;
-      }
-
-      /* Store it in our ASN.1 structure */
-      if (!M_ASN1_OCTET_STRING_set(ri->encryptedKey, ekey, ekey_len)) {
-         /* Allocation failed in OpenSSL */
-         RecipientInfo_free(ri);
-         crypto_session_free(cs);
-         free(ekey);
-         return NULL;
-      }
-
-      /* Free the encrypted key buffer */
-      free(ekey);
-
-      /* Push the new RecipientInfo structure onto the stack */
-      sk_RecipientInfo_push(cs->cryptoData->recipientInfo, ri);
-   }
-
-   return cs;
-}
-
-/*
- * Encodes the CryptoData structure. The length argument is used to specify the
- * size of dest. A length of 0 will cause no data to be written to dest, and the
- * required length to be written to length. The caller can then allocate sufficient
- * space for the output.
- *
- * Returns: true on success, stores the encoded data in dest, and the size in length.
- *          false on failure.
- */
-bool crypto_session_encode(CRYPTO_SESSION *cs, void *dest, size_t *length)
-{
-   if (*length == 0) {
-      *length = i2d_CryptoData(cs->cryptoData, NULL);
-      return true;
-   }
-
-   *length = i2d_CryptoData(cs->cryptoData, (unsigned char **) &dest);
-   return true;
-}
-
-/*
- * Decodes the CryptoData structure. The length argument is
- * used to specify the size of data.
- *
- * Returns: CRYPTO_SESSION instance on success.
- *          NULL on failure.
- * Returns: CRYPTO_ERROR_NONE and a pointer to a newly allocated CRYPTO_SESSION structure in *session on success.
- *          A crypto_error_t value on failure.
- */
-crypto_error_t crypto_session_decode(const void *data, size_t length, alist *keypairs, CRYPTO_SESSION **session)
-{
-   CRYPTO_SESSION *cs;
-   X509_KEYPAIR *keypair;
-   STACK_OF(RecipientInfo) *recipients;
-   crypto_error_t retval = CRYPTO_ERROR_NONE;
-#if (OPENSSL_VERSION_NUMBER >= 0x0090800FL)
-   const unsigned char *p = (const unsigned char *) data;
-#else
-   unsigned char *p = (unsigned char *) data;
-#endif
-
-   cs = (CRYPTO_SESSION *) malloc(sizeof(CRYPTO_SESSION));
-   if (!cs) {
-      return CRYPTO_ERROR_INTERNAL;
-   }
-
-   /* Initialize required fields */
-   cs->session_key = NULL;
-
-   /* d2i_CryptoData modifies the supplied pointer */
-   cs->cryptoData = d2i_CryptoData(NULL, &p, length);
-
-   if (!cs->cryptoData) {
-      /* Allocation / Decoding failed in OpenSSL */
-      openssl_post_errors(M_ERROR, _("CryptoData decoding failed"));
-      retval = CRYPTO_ERROR_INTERNAL;
-      goto err;
-   }
-
-   recipients = cs->cryptoData->recipientInfo;
-
-   /*
-    * Find a matching RecipientInfo structure for a supplied
-    * public key
-    */
-   foreach_alist(keypair, keypairs) {
-      RecipientInfo *ri;
-      int i;
-
-      /* Private key available? */
-      if (keypair->privkey == NULL) {
-         continue;
-      }
-
-      for (i = 0; i < sk_RecipientInfo_num(recipients); i++) {
-         ri = sk_RecipientInfo_value(recipients, i);
-
-         /* Match against the subjectKeyIdentifier */
-         if (M_ASN1_OCTET_STRING_cmp(keypair->keyid, ri->subjectKeyIdentifier) == 0) {
-            /* Match found, extract symmetric encryption session data */
-            
-            /* RSA is required. */
-            assert(EVP_PKEY_type(keypair->privkey->type) == EVP_PKEY_RSA);
-
-            /* If we recieve a RecipientInfo structure that does not use
-             * RSA, return an error */
-            if (OBJ_obj2nid(ri->keyEncryptionAlgorithm) != NID_rsaEncryption) {
-               retval = CRYPTO_ERROR_INVALID_CRYPTO;
-               goto err;
-            }
-
-            /* Decrypt the session key */
-            /* Allocate sufficient space for the largest possible decrypted data */
-            cs->session_key = (unsigned char *) malloc(EVP_PKEY_size(keypair->privkey));
-            cs->session_key_len = EVP_PKEY_decrypt(cs->session_key, M_ASN1_STRING_data(ri->encryptedKey),
-                                  M_ASN1_STRING_length(ri->encryptedKey), keypair->privkey);
-
-            if (cs->session_key_len <= 0) {
-               openssl_post_errors(M_ERROR, _("Failure decrypting the session key"));
-               retval = CRYPTO_ERROR_DECRYPTION;
-               goto err;
-            }
-
-            /* Session key successfully extracted, return the CRYPTO_SESSION structure */
-            *session = cs;
-            return CRYPTO_ERROR_NONE;
-         }
-      }
-   }
-
-   /* No matching recipient found */
-   return CRYPTO_ERROR_NORECIPIENT;
-
-err:
-   crypto_session_free(cs);
-   return retval;
-}
-
-/*
- * Free memory associated with a crypto session object.
- */
-void crypto_session_free (CRYPTO_SESSION *cs)
-{
-   if (cs->cryptoData) {
-      CryptoData_free(cs->cryptoData);
-   }
-   if (cs->session_key){
-      free(cs->session_key);
-   }
-   free(cs);
-}
-
-/*
- * Create a new crypto cipher context with the specified session object
- *  Returns: A pointer to a CIPHER_CONTEXT object on success. The cipher block size is returned in blocksize.
- *           NULL on failure.
- */
-CIPHER_CONTEXT *crypto_cipher_new (CRYPTO_SESSION *cs, bool encrypt, size_t *blocksize)
-{
-   CIPHER_CONTEXT *cipher_ctx;
-   const EVP_CIPHER *ec;
-
-   cipher_ctx = (CIPHER_CONTEXT *) malloc(sizeof(CIPHER_CONTEXT));
-   if (!cipher_ctx) {
-      return NULL;
-   }
-
-   /*
-    * Acquire a cipher instance for the given ASN.1 cipher NID
-    */
-   if ((ec = EVP_get_cipherbyobj(cs->cryptoData->contentEncryptionAlgorithm)) == NULL) {
-      Emsg1(M_ERROR, 0, _("Unsupported contentEncryptionAlgorithm: %d\n"), OBJ_obj2nid(cs->cryptoData->contentEncryptionAlgorithm));
-      free(cipher_ctx);
-      return NULL;
-   }
-
-   /* Initialize the OpenSSL cipher context */
-   EVP_CIPHER_CTX_init(&cipher_ctx->ctx);
-   if (encrypt) {
-      /* Initialize for encryption */
-      if (!EVP_CipherInit_ex(&cipher_ctx->ctx, ec, NULL, NULL, NULL, 1)) {
-         openssl_post_errors(M_ERROR, _("OpenSSL cipher context initialization failed"));
-         goto err;
-      }
-   } else {
-      /* Initialize for decryption */
-      if (!EVP_CipherInit_ex(&cipher_ctx->ctx, ec, NULL, NULL, NULL, 0)) {
-         openssl_post_errors(M_ERROR, _("OpenSSL cipher context initialization failed"));
-         goto err;
-      }
-   }
-
-   /* Set the key size */
-   if (!EVP_CIPHER_CTX_set_key_length(&cipher_ctx->ctx, cs->session_key_len)) {
-      openssl_post_errors(M_ERROR, _("Encryption session provided an invalid symmetric key"));
-      goto err;
-   }
-
-   /* Validate the IV length */
-   if (EVP_CIPHER_iv_length(ec) != M_ASN1_STRING_length(cs->cryptoData->iv)) {
-      openssl_post_errors(M_ERROR, _("Encryption session provided an invalid IV"));
-      goto err;
-   }
-   
-   /* Add the key and IV to the cipher context */
-   if (!EVP_CipherInit_ex(&cipher_ctx->ctx, NULL, NULL, cs->session_key, M_ASN1_STRING_data(cs->cryptoData->iv), -1)) {
-      openssl_post_errors(M_ERROR, _("OpenSSL cipher context key/IV initialization failed"));
-      goto err;
-   }
-
-   *blocksize = EVP_CIPHER_CTX_block_size(&cipher_ctx->ctx);
-   return cipher_ctx;
-
-err:
-   crypto_cipher_free(cipher_ctx);
-   return NULL;
-}
-
-
-/*
- * Encrypt/Decrypt length bytes of data using the provided cipher context
- * Returns: true on success, number of bytes output in written
- *          false on failure
- */
-bool crypto_cipher_update (CIPHER_CONTEXT *cipher_ctx, const void *data, size_t length, const void *dest, size_t *written) {
-   if (!EVP_CipherUpdate(&cipher_ctx->ctx, (unsigned char *) dest, (int *) written, (const unsigned char *) data, length)) {
-      /* This really shouldn't fail */
-      return false;
-   } else {
-      return true;
-   }
-}
-
-/*
- * Finalize the cipher context, writing any remaining data and necessary padding
- * to dest, and the size in written.
- * The result size will either be one block of data or zero.
- *
- * Returns: true on success
- *          false on failure
- */
-bool crypto_cipher_finalize (CIPHER_CONTEXT *cipher_ctx, void *dest, size_t *written) {
-   if (!EVP_CipherFinal_ex(&cipher_ctx->ctx, (unsigned char *) dest, (int *) written)) {
-      /* This really shouldn't fail */
-      return false;
-   } else {
-      return true;
-   }
-}
-
-
-/*
- * Free memory associated with a cipher context.
- */
-void crypto_cipher_free (CIPHER_CONTEXT *cipher_ctx)
-{
-   EVP_CIPHER_CTX_cleanup(&cipher_ctx->ctx);
-   free (cipher_ctx);
-}
-
-
-/*
- * Perform global initialization of OpenSSL
- * This function is not thread safe.
- *  Returns: 0 on success
- *           errno on failure
- */
-int init_crypto (void)
-{
-   int stat;
-
-   if ((stat = openssl_init_threads()) != 0) {
-      Emsg1(M_ABORT, 0, _("Unable to init OpenSSL threading: ERR=%s\n"), strerror(stat));
-   }
-
-   /* Load libssl and libcrypto human-readable error strings */
-   SSL_load_error_strings();
-
-   /* Initialize OpenSSL SSL  library */
-   SSL_library_init();
-
-   /* Register OpenSSL ciphers and digests */
-   OpenSSL_add_all_algorithms();
-
-   if (!openssl_seed_prng()) {
-      Emsg0(M_ERROR_TERM, 0, _("Failed to seed OpenSSL PRNG\n"));
-   }
-
-   crypto_initialized = true;
-
-   return stat;
-}
-
-/*
- * Perform global cleanup of OpenSSL
- * All cryptographic operations must be completed before calling this function.
- * This function is not thread safe.
- *  Returns: 0 on success
- *           errno on failure
- */
-int cleanup_crypto (void)
-{
-   /*
-    * Ensure that we've actually been initialized; Doing this here decreases the
-    * complexity of client's termination/cleanup code.
-    */
-   if (!crypto_initialized) {
-      return 0;
-   }
-
-   if (!openssl_save_prng()) {
-      Emsg0(M_ERROR, 0, _("Failed to save OpenSSL PRNG\n"));
-   }
-
-   openssl_cleanup_threads();
-
-   /* Free libssl and libcrypto error strings */
-   ERR_free_strings();
-
-   /* Free all ciphers and digests */
-   EVP_cleanup();
-
-   /* Free memory used by PRNG */
-   RAND_cleanup();
-
-   crypto_initialized = false;
-
-   return 0;
-}
-
-
-#else /* HAVE_OPENSSL */
-# error No encryption library available
-#endif /* HAVE_OPENSSL */
-
-#else /* HAVE_CRYPTO */
-
-/*
- * Cryptography Support Disabled
- */
-
-/* Message Digest Structure */
-struct Digest {
-   crypto_digest_t type;
-   union {
-      SHA1Context sha1;
-      MD5Context md5;
-   };
-};
-
-/* Dummy Signature Structure */
-struct Signature {
-};
-
-DIGEST *crypto_digest_new (crypto_digest_t type)
-{
-   DIGEST *digest;
-
-   digest = (DIGEST *) malloc(sizeof(DIGEST));
-   digest->type = type;
-
-   switch (type) {
-   case CRYPTO_DIGEST_MD5:
-      MD5Init(&digest->md5);
-      break;
-   case CRYPTO_DIGEST_SHA1:
-      SHA1Init(&digest->sha1);
-      break;
-   default:
-      Emsg0(M_ERROR, 0, _("Unsupported digest type specified\n"));
-      free(digest);
-      return NULL;
-   }
-
-   return (digest);
-}
-
-bool crypto_digest_update (DIGEST *digest, const void *data, size_t length) {
-   switch (digest->type) {
-   case CRYPTO_DIGEST_MD5:
-      /* Doesn't return anything ... */
-      MD5Update(&digest->md5, (unsigned char *) data, length);
-      return true;
-   case CRYPTO_DIGEST_SHA1:
-      int ret;
-      if ((ret = SHA1Update(&digest->sha1, (const u_int8_t *) data, length)) == shaSuccess) {
-         return true;
-      } else {
-         Emsg1(M_ERROR, 0, _("SHA1Update() returned an error: %d\n"), ret);
-         return false;
-      }
-      break;
-   default:
-      return false;
-   }
-}
-
-bool crypto_digest_finalize (DIGEST *digest, void *dest, size_t *length) {
-
-   switch (digest->type) {
-   case CRYPTO_DIGEST_MD5:
-      /* Guard against programmer error by either the API client or
-       * an out-of-sync CRYPTO_DIGEST_MAX_SIZE */
-      assert(*length >= CRYPTO_DIGEST_MD5_SIZE);
-      *length = CRYPTO_DIGEST_MD5_SIZE;
-      /* Doesn't return anything ... */
-      MD5Final((unsigned char *) dest, &digest->md5);
-      return true;
-   case CRYPTO_DIGEST_SHA1:
-      /* Guard against programmer error by either the API client or
-       * an out-of-sync CRYPTO_DIGEST_MAX_SIZE */
-      assert(*length >= CRYPTO_DIGEST_SHA1_SIZE);
-      *length = CRYPTO_DIGEST_SHA1_SIZE;
-      if (SHA1Final(&digest->sha1, (u_int8_t *) dest) == shaSuccess) {
-         return true;
-      } else {
-         return false;
-      }
-      break;
-   default:
-      return false;
-   }
-
-   return false;
-}
-
-void crypto_digest_free (DIGEST *digest)
-{
-   free (digest);
-}
-
-/* Dummy routines */
-int init_crypto (void) { return 0; }
-int cleanup_crypto (void) { return 0; }
-
-SIGNATURE *crypto_sign_new (void) { return NULL; }
-
-crypto_error_t crypto_sign_get_digest (SIGNATURE *sig, X509_KEYPAIR *keypair, DIGEST **digest) { return CRYPTO_ERROR_INTERNAL; }
-crypto_error_t crypto_sign_verify (SIGNATURE *sig, X509_KEYPAIR *keypair, DIGEST *digest) { return CRYPTO_ERROR_INTERNAL; }
-
-int crypto_sign_add_signer (SIGNATURE *sig, DIGEST *digest, X509_KEYPAIR *keypair) { return false; }
-int crypto_sign_encode (SIGNATURE *sig, void *dest, size_t *length) { return false; }
-
-SIGNATURE *crypto_sign_decode (const void *sigData, size_t length) { return NULL; }
-void crypto_sign_free (SIGNATURE *sig) { }
-
-
-X509_KEYPAIR *crypto_keypair_new (void) { return NULL; }
-X509_KEYPAIR *crypto_keypair_dup (X509_KEYPAIR *keypair) { return NULL; }
-int crypto_keypair_load_cert (X509_KEYPAIR *keypair, const char *file) { return false; }
-bool crypto_keypair_has_key (const char *file) { return false; }
-int crypto_keypair_load_key (X509_KEYPAIR *keypair, const char *file, CRYPTO_PEM_PASSWD_CB *pem_callback, const void *pem_userdata) { return false; }
-void crypto_keypair_free (X509_KEYPAIR *keypair) { }
-
-CRYPTO_SESSION *crypto_session_new (crypto_cipher_t cipher, alist *pubkeys) { return NULL; }
-void crypto_session_free (CRYPTO_SESSION *cs) { }
-bool crypto_session_encode (CRYPTO_SESSION *cs, void *dest, size_t *length) { return false; }
-crypto_error_t crypto_session_decode (const void *data, size_t length, alist *keypairs, CRYPTO_SESSION **session) { return CRYPTO_ERROR_INTERNAL; }
-
-CIPHER_CONTEXT *crypto_cipher_new (CRYPTO_SESSION *cs, bool encrypt, size_t *blocksize) { return NULL; }
-bool crypto_cipher_update (CIPHER_CONTEXT *cipher_ctx, const void *data, size_t length, const void *dest, size_t *written) { return false; }
-bool crypto_cipher_finalize (CIPHER_CONTEXT *cipher_ctx, void *dest, size_t *written) { return false; }
-void crypto_cipher_free (CIPHER_CONTEXT *cipher_ctx) { }
-
-#endif /* HAVE_CRYPTO */
-
-/* Shared Code */
-
-/*
- * Default PEM encryption passphrase callback.
- * Returns an empty password.
- */
-int crypto_default_pem_callback(char *buf, int size, const void *userdata)
-{
-   bstrncpy(buf, "", size);
-   return (strlen(buf));
-}
-
-/*
- * Returns the ASCII name of the digest type.
- * Returns: ASCII name of digest type.
- */
-const char *crypto_digest_name (DIGEST *digest) {
-   switch (digest->type) {
-   case CRYPTO_DIGEST_MD5:
-      return "MD5";
-   case CRYPTO_DIGEST_SHA1:
-      return "SHA1";
-   case CRYPTO_DIGEST_SHA256:
-      return "SHA256";
-   case CRYPTO_DIGEST_SHA512:
-      return "SHA512";
-   case CRYPTO_DIGEST_NONE:
-      return "None";
-   default:
-      return "Invalid Digest Type";
-   }
-
-}
-
-/*
- * Given a stream type, returns the associated
- * crypto_digest_t value.
- */
-crypto_digest_t crypto_digest_stream_type (int stream) {
-   switch (stream) {
-   case STREAM_MD5_DIGEST:
-      return CRYPTO_DIGEST_MD5;
-   case STREAM_SHA1_DIGEST:
-      return CRYPTO_DIGEST_SHA1;
-   case STREAM_SHA256_DIGEST:
-      return CRYPTO_DIGEST_SHA256;
-   case STREAM_SHA512_DIGEST:
-      return CRYPTO_DIGEST_SHA512;
-   default:
-      return CRYPTO_DIGEST_NONE;
-   }
-}
-
-/*
- *  * Given a crypto_error_t value, return the associated
- *   * error string
- *    */
-const char *crypto_strerror(crypto_error_t error) {
-   switch (error) {
-   case CRYPTO_ERROR_NONE:
-      return "No error";
-   case CRYPTO_ERROR_NOSIGNER:
-      return "Signer not found";
-   case CRYPTO_ERROR_NORECIPIENT:
-      return "Recipient not found";
-   case CRYPTO_ERROR_INVALID_DIGEST:
-      return "Unsupported digest algorithm";
-   case CRYPTO_ERROR_INVALID_CRYPTO:
-      return "Unsupported encryption algorithm";
-   case CRYPTO_ERROR_BAD_SIGNATURE:
-      return "Signature is invalid";
-   case CRYPTO_ERROR_DECRYPTION:
-      return "Decryption error";
-   case CRYPTO_ERROR_INTERNAL:
-      /* This shouldn't happen */
-      return "Internal error";
-   default:
-      return "Unknown error";
-   }
-}
index 8b3552d08c96e3bd4b51bbd548c78ac74b3198ee..17e546bd6399aa5753717b2cd5ebc592f83ad670 100644 (file)
@@ -46,10 +46,7 @@ typedef struct Digest DIGEST;
 typedef struct Signature SIGNATURE;
 
 /* Opaque PKI Symmetric Key Data Structure */
-typedef struct Crypto_Session CRYPTO_SESSION;
-
-/* Opaque Encryption/Decryption Context Structure */
-typedef struct Cipher_Context CIPHER_CONTEXT;
+typedef struct Crypto_Recipients CRYPTO_RECIPIENTS;
 
 /* PEM Decryption Passphrase Callback */
 typedef int (CRYPTO_PEM_PASSWD_CB) (char *buf, int size, const void *userdata);
@@ -77,12 +74,9 @@ typedef enum {
 typedef enum {
    CRYPTO_ERROR_NONE           = 0, /* No error */
    CRYPTO_ERROR_NOSIGNER       = 1, /* Signer not found */
-   CRYPTO_ERROR_NORECIPIENT    = 2, /* Recipient not found */
-   CRYPTO_ERROR_INVALID_DIGEST = 3, /* Unsupported digest algorithm */
-   CRYPTO_ERROR_INVALID_CRYPTO = 4, /* Unsupported encryption algorithm */
-   CRYPTO_ERROR_BAD_SIGNATURE  = 5, /* Signature is invalid */
-   CRYPTO_ERROR_DECRYPTION     = 6, /* Decryption error */
-   CRYPTO_ERROR_INTERNAL       = 7  /* Internal Error */
+   CRYPTO_ERROR_INVALID_DIGEST = 2, /* Unsupported digest algorithm */
+   CRYPTO_ERROR_BAD_SIGNATURE  = 3, /* Signature is invalid */
+   CRYPTO_ERROR_INTERNAL       = 4  /* Internal Error */
 } crypto_error_t;
 
 /* Message Digest Sizes */
@@ -94,9 +88,8 @@ typedef enum {
 /* Maximum Message Digest Size */
 #ifdef HAVE_OPENSSL
 
-/* Let OpenSSL define a few things */
-#define CRYPTO_DIGEST_MAX_SIZE         EVP_MAX_MD_SIZE
-#define CRYPTO_CIPHER_MAX_BLOCK_SIZE   EVP_MAX_BLOCK_LENGTH
+/* Let OpenSSL define it */
+#define CRYPTO_DIGEST_MAX_SIZE EVP_MAX_MD_SIZE
 
 #else /* HAVE_OPENSSL */
 
@@ -113,9 +106,6 @@ typedef enum {
 #define CRYPTO_DIGEST_MAX_SIZE CRYPTO_DIGEST_SHA512_SIZE
 #endif
 
-/* Dummy Value */
-#define CRYPTO_CIPHER_MAX_BLOCK_SIZE 0
-
 #endif /* HAVE_OPENSSL */
 
 #endif /* __CRYPTO_H_ */
index ce975f486593d27e729eaac27bf435274228d289..32933ad608518254b7205dc94949e0dc3736be86 100644 (file)
  *
  * Loop var through each member of list
  */
+#ifdef HAVE_GCC
 #define foreach_dlist(var, list) \
-    for((var)=NULL; (*((void **)&(var))=(void*)((list)->next(var))); )
-
-#ifdef the_old_way
+        for((var)=NULL; ((var)=(typeof(var))(list)->next(var)); )
+#else
 #define foreach_dlist(var, list) \
-        for((var)=NULL; (((void *)(var))=(list)->next(var)); )
+    for((var)=NULL; (*((void **)&(var))=(void*)((list)->next(var))); )
 #endif
 
 
+
 struct dlink {
    void *next;
    void *prev;
index a3229315203e656cb043e53485c14495d7cbb7cc..c0e5d0523d5c2bd22ca9233d209a16ccec9b4a11 100644 (file)
@@ -259,10 +259,10 @@ bool duration_to_utime(char *str, utime_t *value)
     *   to months. These "kludges" make it compatible with pre 1.31
     *   Baculas.
     */
-   static const char *mod[] = {"n", "seconds", "months", "minutes",
+   static const char *mod[] = {"n", "seconds", "months", "minutes", "mins",
                   "hours", "days", "weeks",   "quarters",   "years", NULL};
-   static const int32_t mult[] = {60,   1, 60*60*24*30, 60,
-                  60*60, 60*60*24, 60*60*24*7, 60*60*24*91, 60*60*24*365};
+   static const int32_t mult[] = {60,   1, 60*60*24*30, 60, 60,
+                  3600, 3600*24, 3600*24*7, 3600*24*91, 3600*24*365};
 
    while (*str) {
       if (!get_modifier(str, num_str, sizeof(num_str), mod_str, sizeof(mod_str))) {
index 6c7d6daa0da481c1d342e3fabb002dbfd64fba1e..8c2c241ba982b8e65b8011acba6a1cceb2482fbb 100755 (executable)
@@ -229,8 +229,8 @@ JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr)
    jcr->job_end_push.init(1, false);
    jcr->sched_time = time(NULL);
    jcr->daemon_free_jcr = daemon_free_jcr;    /* plug daemon free routine */
-   jcr->use_count = 1;
-   pthread_mutex_init(&(jcr->mutex), NULL);
+   jcr->init_mutex();
+   jcr->inc_use_count();   
    jcr->JobStatus = JS_Created;       /* ready to run */
    jcr->VolumeName = get_pool_memory(PM_FNAME);
    jcr->VolumeName[0] = 0;
@@ -329,7 +329,7 @@ static void free_common_jcr(JCR *jcr)
    default:
       break;
    }
-   pthread_mutex_destroy(&jcr->mutex);
+   jcr->destroy_mutex();
 
    delete jcr->msg_queue;
    close_msg(jcr);                    /* close messages for this job */
@@ -396,14 +396,14 @@ void free_jcr(JCR *jcr)
    dequeue_messages(jcr);
    lock_jcr_chain();
    jcr->dec_use_count();              /* decrement use count */
-   if (jcr->use_count < 0) {
+   if (jcr->use_count() < 0) {
       Emsg2(M_ERROR, 0, _("JCR use_count=%d JobId=%d\n"),
-         jcr->use_count, jcr->JobId);
+         jcr->use_count(), jcr->JobId);
    }
-   Dmsg3(3400, "Dec free_jcr 0x%x use_count=%d jobid=%d\n", jcr, jcr->use_count, jcr->JobId);
-   if (jcr->use_count > 0) {          /* if in use */
+   Dmsg3(3400, "Dec free_jcr 0x%x use_count=%d jobid=%d\n", jcr, jcr->use_count(), jcr->JobId);
+   if (jcr->use_count() > 0) {          /* if in use */
       unlock_jcr_chain();
-      Dmsg3(3400, "free_jcr 0x%x job=%d use_count=%d\n", jcr, jcr->JobId, jcr->use_count);
+      Dmsg3(3400, "free_jcr 0x%x job=%d use_count=%d\n", jcr, jcr->JobId, jcr->use_count());
       return;
    }
 
@@ -432,15 +432,14 @@ JCR *get_jcr_by_id(uint32_t JobId)
 {
    JCR *jcr;
 
-   lock_jcr_chain();                    /* lock chain */
-   foreach_dlist(jcr, jcrs) {
+   foreach_jcr(jcr) {
       if (jcr->JobId == JobId) {
          jcr->inc_use_count();
-         Dmsg2(3400, "Inc get_jcr 0x%x use_count=%d\n", jcr, jcr->use_count);
+         Dmsg2(3400, "Inc get_jcr 0x%x use_count=%d\n", jcr, jcr->use_count());
          break;
       }
    }
-   unlock_jcr_chain();
+   endeach_jcr(jcr);
    return jcr;
 }
 
@@ -453,16 +452,15 @@ JCR *get_jcr_by_session(uint32_t SessionId, uint32_t SessionTime)
 {
    JCR *jcr;
 
-   lock_jcr_chain();
-   foreach_dlist(jcr, jcrs) {
+   foreach_jcr(jcr) {
       if (jcr->VolSessionId == SessionId &&
           jcr->VolSessionTime == SessionTime) {
          jcr->inc_use_count();
-         Dmsg2(3400, "Inc get_jcr 0x%x use_count=%d\n", jcr, jcr->use_count);
+         Dmsg2(3400, "Inc get_jcr 0x%x use_count=%d\n", jcr, jcr->use_count());
          break;
       }
    }
-   unlock_jcr_chain();
+   endeach_jcr(jcr);
    return jcr;
 }
 
@@ -482,16 +480,15 @@ JCR *get_jcr_by_partial_name(char *Job)
    if (!Job) {
       return NULL;
    }
-   lock_jcr_chain();
    len = strlen(Job);
-   foreach_dlist(jcr, jcrs) {
+   foreach_jcr(jcr) {
       if (strncmp(Job, jcr->Job, len) == 0) {
          jcr->inc_use_count();
-         Dmsg2(3400, "Inc get_jcr 0x%x use_count=%d\n", jcr, jcr->use_count);
+         Dmsg2(3400, "Inc get_jcr 0x%x use_count=%d\n", jcr, jcr->use_count());
          break;
       }
    }
-   unlock_jcr_chain();
+   endeach_jcr(jcr);
    return jcr;
 }
 
@@ -509,15 +506,14 @@ JCR *get_jcr_by_full_name(char *Job)
    if (!Job) {
       return NULL;
    }
-   lock_jcr_chain();
-   foreach_dlist(jcr, jcrs) {
+   foreach_jcr(jcr) {
       if (strcmp(jcr->Job, Job) == 0) {
          jcr->inc_use_count();
-         Dmsg2(3400, "Inc get_jcr 0x%x use_count=%d\n", jcr, jcr->use_count);
+         Dmsg2(3400, "Inc get_jcr 0x%x use_count=%d\n", jcr, jcr->use_count());
          break;
       }
    }
-   unlock_jcr_chain();
+   endeach_jcr(jcr);
    return jcr;
 }
 
@@ -600,7 +596,7 @@ JCR *jcr_walk_start()
    if (jcr) {
       jcr->inc_use_count();
       Dmsg3(3400, "Inc jcr_walk_start 0x%x job=%d use_count=%d\n", jcr, 
-            jcr->JobId, jcr->use_count);
+            jcr->JobId, jcr->use_count());
    }
    unlock_jcr_chain();
    return jcr;
@@ -618,7 +614,7 @@ JCR *jcr_walk_next(JCR *prev_jcr)
    if (jcr) {
       jcr->inc_use_count();
       Dmsg3(3400, "Inc jcr_walk_next 0x%x job=%d use_count=%d\n", jcr, 
-         jcr->JobId, jcr->use_count);
+         jcr->JobId, jcr->use_count());
    }
    unlock_jcr_chain();
    if (prev_jcr) {
index 88c2fe4d16f1f7cb2784b897e5ab44c2e28ca3df..58c404cf3b461a2fd6326e51a7fb58b41e794d42 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   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
@@ -32,7 +32,7 @@
 #include "crypto.h"
 #include "mem_pool.h"
 #include "message.h"
-#include "openssl.h"
+/* #include "openssl.h" */
 #include "lex.h"
 #include "parse_conf.h"
 #include "tls.h"
diff --git a/bacula/src/lib/openssl.c b/bacula/src/lib/openssl.c
deleted file mode 100644 (file)
index 929dee7..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * openssl.c OpenSSL support functions
- *
- * Author: Landon Fuller <landonf@opendarwin.org>
- *
- * Version $Id$
- *
- * Copyright (C) 2005 Kern Sibbald
- *
- * This file was contributed to the Bacula project by Landon Fuller.
- *
- * Landon Fuller has been granted a perpetual, worldwide, non-exclusive,
- * no-charge, royalty-free, irrevocable copyright license to reproduce,
- * prepare derivative works of, publicly display, publicly perform,
- * sublicense, and distribute the original work contributed by Landon Fuller
- * to the Bacula project in source or object form.
- *
- * If you wish to license these contributions under an alternate open source
- * license please contact Landon Fuller <landonf@opendarwin.org>.
- */
-/*
-   Copyright (C) 2005 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 <assert.h>
-
-#ifdef HAVE_OPENSSL
-
-/* Array of mutexes for use with OpenSSL static locking */
-static pthread_mutex_t *mutexes;
-
-/* OpenSSL dynamic locking structure */
-struct CRYPTO_dynlock_value {
-   pthread_mutex_t mutex;
-};
-
-
-/*
- * Post all per-thread openssl errors
- */
-void openssl_post_errors(int code, const char *errstring)
-{
-   char buf[512];
-   unsigned long sslerr;
-
-   /* Pop errors off of the per-thread queue */
-   while((sslerr = ERR_get_error()) != 0) {
-      /* Acquire the human readable string */
-      ERR_error_string_n(sslerr, (char *) &buf, sizeof(buf));
-      Emsg2(M_ERROR, 0, "%s: ERR=%s\n", errstring, buf);
-   }
-}
-
-/*
- * Return an OpenSSL thread ID
- *  Returns: thread ID
- *
- */
-static unsigned long get_openssl_thread_id (void)
-{
-   /* Comparison without use of pthread_equal() is mandated by the OpenSSL API */
-   return ((unsigned long) pthread_self());
-}
-
-/*
- * Allocate a dynamic OpenSSL mutex
- */
-static struct CRYPTO_dynlock_value *openssl_create_dynamic_mutex (const char *file, int line)
-{
-   struct CRYPTO_dynlock_value *dynlock;
-   int stat;
-
-   dynlock = (struct CRYPTO_dynlock_value *) malloc(sizeof(struct CRYPTO_dynlock_value));
-
-   if ((stat = pthread_mutex_init(&dynlock->mutex, NULL)) != 0) {
-      Emsg1(M_ABORT, 0, _("Unable to init mutex: ERR=%s\n"), strerror(stat));
-   }
-
-   return dynlock;
-}
-
-static void openssl_update_dynamic_mutex (int mode, struct CRYPTO_dynlock_value *dynlock, const char *file, int line)
-{
-   if (mode & CRYPTO_LOCK) {
-      P(dynlock->mutex);
-   } else {
-      V(dynlock->mutex);
-   }
-}
-
-static void openssl_destroy_dynamic_mutex (struct CRYPTO_dynlock_value *dynlock, const char *file, int line)
-{
-   int stat;
-
-   if ((stat = pthread_mutex_destroy(&dynlock->mutex)) != 0) {
-      Emsg1(M_ABORT, 0, _("Unable to destroy mutex: ERR=%s\n"), strerror(stat));
-   }
-
-   free(dynlock);
-}
-
-/*
- * (Un)Lock a static OpenSSL mutex
- */
-static void openssl_update_static_mutex (int mode, int i, const char *file, int line)
-{
-   if (mode & CRYPTO_LOCK) {
-      P(mutexes[i]);
-   } else {
-      V(mutexes[i]);
-   }
-}
-
-/*
- * Initialize OpenSSL thread support
- *  Returns: 0 on success
- *           errno on failure
- */
-int openssl_init_threads (void)
-{
-   int i, numlocks;
-   int stat;
-
-
-   /* Set thread ID callback */
-   CRYPTO_set_id_callback(get_openssl_thread_id);
-
-   /* Initialize static locking */
-   numlocks = CRYPTO_num_locks();
-   mutexes = (pthread_mutex_t *) malloc(numlocks * sizeof(pthread_mutex_t));
-   for (i = 0; i < numlocks; i++) {
-      if ((stat = pthread_mutex_init(&mutexes[i], NULL)) != 0) {
-         Emsg1(M_ERROR, 0, _("Unable to init mutex: ERR=%s\n"), strerror(stat));
-         return stat;
-      }
-   }
-
-   /* Set static locking callback */
-   CRYPTO_set_locking_callback(openssl_update_static_mutex);
-
-   /* Initialize dyanmic locking */
-   CRYPTO_set_dynlock_create_callback(openssl_create_dynamic_mutex);
-   CRYPTO_set_dynlock_lock_callback(openssl_update_dynamic_mutex);
-   CRYPTO_set_dynlock_destroy_callback(openssl_destroy_dynamic_mutex);
-
-   return 0;
-}
-
-/*
- * Clean up OpenSSL threading support
- */
-void openssl_cleanup_threads (void)
-{
-   int i, numlocks;
-   int stat;
-
-   /* Unset thread ID callback */
-   CRYPTO_set_id_callback(NULL);
-  
-   /* Deallocate static lock mutexes */
-   numlocks = CRYPTO_num_locks();
-   for (i = 0; i < numlocks; i++) {
-      if ((stat = pthread_mutex_destroy(&mutexes[i])) != 0) {
-         /* We don't halt execution, reporting the error should be sufficient */
-         Emsg1(M_ERROR, 0, _("Unable to destroy mutex: ERR=%s\n"), strerror(stat));
-      }
-   }
-
-   /* Unset static locking callback */
-   CRYPTO_set_locking_callback(NULL);
-
-   /* Free static lock array */
-   free(mutexes);
-
-   /* Unset dynamic locking callbacks */
-   CRYPTO_set_dynlock_create_callback(NULL);
-   CRYPTO_set_dynlock_lock_callback(NULL);
-   CRYPTO_set_dynlock_destroy_callback(NULL);
-}
-
-
-/*
- * Seed OpenSSL PRNG
- *  Returns: 1 on success
- *           0 on failure
- */
-int openssl_seed_prng (void)
-{
-   const char *names[]  = { "/dev/urandom", "/dev/random", NULL };
-   int i;
-
-   // ***FIXME***
-   // Win32 Support
-   // Read saved entropy?
-
-   for (i = 0; names[i]; i++) {
-      if (RAND_load_file(names[i], 1024) != -1) {
-         /* Success */
-         return 1;
-      }
-   }
-
-   /* Fail */
-   return 0;
-}
-
-/*
- * Save OpenSSL Entropy
- *  Returns: 1 on success
- *           0 on failure
- */
-int openssl_save_prng (void)
-{
-   // ***FIXME***
-   // Implement PRNG state save
-   return 1;
-}
-
-#endif /* HAVE_OPENSSL */
diff --git a/bacula/src/lib/openssl.h b/bacula/src/lib/openssl.h
deleted file mode 100644 (file)
index 7654e17..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * openssl.h OpenSSL support functions
- *
- * Author: Landon Fuller <landonf@opendarwin.org>
- *
- * Version $Id$
- *
- * Copyright (C) 2005 Kern Sibbald
- *
- * This file was contributed to the Bacula project by Landon Fuller.
- *
- * Landon Fuller has been granted a perpetual, worldwide, non-exclusive,
- * no-charge, royalty-free, irrevocable copyright * license to reproduce,
- * prepare derivative works of, publicly display, publicly perform,
- * sublicense, and distribute the original work contributed by Landon Fuller
- * to the Bacula project in source or object form.
- *
- * If you wish to license these contributions under an alternate open source
- * license please contact Landon Fuller <landonf@opendarwin.org>.
- */
-/*
-   Copyright (C) 2005 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.
-
- */
-
-#ifndef __OPENSSL_H_
-#define __OPENSSL_H_
-
-#ifdef HAVE_OPENSSL
-void             openssl_post_errors     (int code, const char *errstring);
-int              openssl_init_threads    (void);
-void             openssl_cleanup_threads (void);
-int              openssl_seed_prng       (void);
-int              openssl_save_prng       (void);
-#endif /* HAVE_OPENSSL */
-
-#endif /* __OPENSSL_H_ */
index 1e8b2be9edbbb60b64fa8928971c4756b1b5bacc..5e1ca4b1b72c5e1864c88e0ba47ea333a0ce2a83 100755 (executable)
@@ -136,7 +136,7 @@ struct s_kw {
  *
  *   tape label      label code = token
  */
-static s_kw tapelabels[] = {
+struct s_kw tapelabels[] = {
    {"bacula",        B_BACULA_LABEL},
    {"ansi",          B_ANSI_LABEL},
    {"ibm",           B_IBM_LABEL},
@@ -191,10 +191,8 @@ void init_resource(int type, RES_ITEM *items, int pass)
             (items[i].flags & ITEM_DEFAULT) ? "yes" : "no",
             items[i].default_value);
       if (items[i].flags & ITEM_DEFAULT && items[i].default_value != 0) {
-         if (items[i].handler == store_bit) {
+         if (items[i].handler == store_yesno) {
             *(int *)(items[i].value) |= items[i].code;
-         } else if (items[i].handler == store_bool) {
-            *(bool *)(items[i].value) = items[i].default_value;
          } else if (items[i].handler == store_pint ||
                     items[i].handler == store_int) {
             *(int *)(items[i].value) = items[i].default_value;
@@ -690,36 +688,20 @@ void store_time(LEX *lc, RES_ITEM *item, int index, int pass)
 
 
 /* Store a yes/no in a bit field */
-void store_bit(LEX *lc, RES_ITEM *item, int index, int pass)
+void store_yesno(LEX *lc, RES_ITEM *item, int index, int pass)
 {
    lex_get_token(lc, T_NAME);
-   if (strcasecmp(lc->str, "yes") == 0 || strcasecmp(lc->str, "true") == 0) {
+   if (strcasecmp(lc->str, "yes") == 0) {
       *(int *)(item->value) |= item->code;
-   } else if (strcasecmp(lc->str, "no") == 0 || strcasecmp(lc->str, "false") == 0) {
+   } else if (strcasecmp(lc->str, "no") == 0) {
       *(int *)(item->value) &= ~(item->code);
    } else {
-      scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, TRUE, or FALSE", lc->str); /* YES and NO must not be translated */
+      scan_err3(lc, _("Expect a %s or %s, got: %s"), "YES", "NO", lc->str); /* YES and NO must not be translated */
    }
    scan_to_eol(lc);
    set_bit(index, res_all.hdr.item_present);
 }
 
-/* Store a bool in a bit field */
-void store_bool(LEX *lc, RES_ITEM *item, int index, int pass)
-{
-   lex_get_token(lc, T_NAME);
-   if (strcasecmp(lc->str, "yes") == 0 || strcasecmp(lc->str, "true") == 0) {
-      *(bool *)(item->value) = true;
-   } else if (strcasecmp(lc->str, "no") == 0 || strcasecmp(lc->str, "false") == 0) {
-      *(bool *)(item->value) = false;
-   } else {
-      scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, TRUE, or FALSE", lc->str); /* YES and NO must not be translated */
-   }
-   scan_to_eol(lc);
-   set_bit(index, res_all.hdr.item_present);
-}
-
-
 /*
  * Store Tape Label Type (Bacula, ANSI, IBM)
  *
@@ -858,6 +840,9 @@ parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error)
                level--;
                state = p_none;
                Dmsg0(900, "T_EOB => define new resource\n");
+               if (res_all.hdr.name == NULL) {
+                  scan_err0(lc, _("Name not specified for resource"));
+               }
                save_resource(res_type, items, pass);  /* save resource */
                break;
 
index 754a009cc75ba7a5b4927addf036dcc084de0aa5..e4d3980bdece4cbed44f3575c802386c364c55fc 100644 (file)
@@ -2,22 +2,17 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   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 as
-   published by the Free Software Foundation; either version 2 of
-   the License, or (at your option) any later version.
+   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 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.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
+   the file LICENSE for additional details.
 
  */
 
@@ -32,14 +27,14 @@ typedef void (MSG_RES_HANDLER)(LEX *lc, RES_ITEM *item, int index, int pass);
 struct RES_ITEM {
    const char *name;                  /* Resource name i.e. Director, ... */
    MSG_RES_HANDLER *handler;          /* Routine storing the resource item */
-   void **value;                      /* Where to store the item */
+   char **value;                      /* Where to store the item */
    int  code;                         /* item code/additional info */
    int  flags;                        /* flags: default, required, ... */
    int  default_value;                /* default value */
 };
 
 /* For storing name_addr items in res_items table */
-#define ITEM(x) ((void **)&res_all.x)
+#define ITEM(x) ((char **)&res_all.x)
 
 #define MAX_RES_ITEMS 70              /* maximum resource items per RES */
 
@@ -114,15 +109,16 @@ void save_resource(int type, RES_ITEM *item, int pass);
 const char *res_to_str(int rcode);
 
 /* Loop through each resource of type, returning in var */
+#ifdef HAVE_GCC
 #define foreach_res(var, type) \
-    for(var=NULL; (*((void **)&(var))=(void *)GetNextRes((type), (RES *)var));)
-
-#ifdef the_old_way
+        for((var)=NULL; ((var)=(typeof(var))GetNextRes((type), (RES *)var));)
+#else 
 #define foreach_res(var, type) \
-        for((var)=NULL; (((void *)(var))=GetNextRes((type), (RES *)var));)
+    for(var=NULL; (*((void **)&(var))=(void *)GetNextRes((type), (RES *)var));)
 #endif
 
 
+
 void store_str(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_dir(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_password(LEX *lc, RES_ITEM *item, int index, int pass);
@@ -135,8 +131,7 @@ void store_int(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_pint(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_msgs(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_int64(LEX *lc, RES_ITEM *item, int index, int pass);
-void store_bit(LEX *lc, RES_ITEM *item, int index, int pass);
-void store_bool(LEX *lc, RES_ITEM *item, int index, int pass);
+void store_yesno(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_time(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_size(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_defs(LEX *lc, RES_ITEM *item, int index, int pass);
index eedbc018cbc081881311cff0cd6291ccc91ff9e9..8cee2609fe2b0febbfc6275748236bd3db336129 100644 (file)
@@ -4,22 +4,17 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   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 as
-   published by the Free Software Foundation; either version 2 of
-   the License, or (at your option) any later version.
+   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 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.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
+   the file LICENSE for additional details.
 
  */
 
@@ -113,49 +108,15 @@ void hmac_md5(uint8_t* text, int text_len, uint8_t*  key,
 
 uint32_t bcrc32(uint8_t *buf, int len);
 
-/* crypto.c */
-int                init_crypto                 (void);
-int                cleanup_crypto              (void);
-DIGEST *           crypto_digest_new           (crypto_digest_t type);
-bool               crypto_digest_update        (DIGEST *digest, const void *data, size_t length);
-bool               crypto_digest_finalize      (DIGEST *digest, void *dest, size_t *length);
-void               crypto_digest_free          (DIGEST *digest);
-SIGNATURE *        crypto_sign_new             (void);
-crypto_error_t     crypto_sign_get_digest      (SIGNATURE *sig, X509_KEYPAIR *keypair, DIGEST **digest);
-crypto_error_t     crypto_sign_verify          (SIGNATURE *sig, X509_KEYPAIR *keypair, DIGEST *digest);
-int                crypto_sign_add_signer      (SIGNATURE *sig, DIGEST *digest, X509_KEYPAIR *keypair);
-int                crypto_sign_encode          (SIGNATURE *sig, void *dest, size_t *length);
-SIGNATURE *        crypto_sign_decode          (const void *sigData, size_t length);
-void               crypto_sign_free            (SIGNATURE *sig);
-CRYPTO_SESSION *   crypto_session_new          (crypto_cipher_t cipher, alist *pubkeys);
-void               crypto_session_free         (CRYPTO_SESSION *cs);
-bool               crypto_session_encode       (CRYPTO_SESSION *cs, void *dest, size_t *length);
-crypto_error_t     crypto_session_decode       (const void *data, size_t length, alist *keypairs, CRYPTO_SESSION **session); 
-CRYPTO_SESSION *   crypto_session_decode       (const void *data, size_t length);
-CIPHER_CONTEXT *   crypto_cipher_new           (CRYPTO_SESSION *cs, bool encrypt, size_t *blocksize);
-bool               crypto_cipher_update        (CIPHER_CONTEXT *cipher_ctx, const void *data, size_t length, const void *dest, size_t *written);
-bool               crypto_cipher_finalize      (CIPHER_CONTEXT *cipher_ctx, void *dest, size_t *written);
-void               crypto_cipher_free          (CIPHER_CONTEXT *cipher_ctx);
-X509_KEYPAIR *     crypto_keypair_new          (void);
-X509_KEYPAIR *     crypto_keypair_dup          (X509_KEYPAIR *keypair);
-int                crypto_keypair_load_cert    (X509_KEYPAIR *keypair, const char *file);
-bool               crypto_keypair_has_key      (const char *file);
-int                crypto_keypair_load_key     (X509_KEYPAIR *keypair, const char *file, CRYPTO_PEM_PASSWD_CB *pem_callback, const void *pem_userdata);
-void               crypto_keypair_free         (X509_KEYPAIR *keypair);
-int                crypto_default_pem_callback (char *buf, int size, const void *userdata);
-const char *       crypto_digest_name          (DIGEST *digest);
-crypto_digest_t    crypto_digest_stream_type   (int stream);
-const char *       crypto_strerror             (crypto_error_t error);
-
 /* daemon.c */
 void     daemon_start            ();
 
 /* edit.c */
 uint64_t         str_to_uint64(char *str);
 int64_t          str_to_int64(char *str);
-#define str_to_int32(str) ((int32_t)str_to_int64(str))
-char *           edit_uint64_with_commas   (uint64_t val, char *buf);
+#define          str_to_int32(str) ((int32_t)str_to_int64(str))
 char *           edit_uint64_with_suffix   (uint64_t val, char *buf);
+char *           edit_uint64_with_commas   (uint64_t val, char *buf);
 char *           add_commas              (char *val, char *buf);
 char *           edit_uint64             (uint64_t val, char *buf);
 char *           edit_int64              (int64_t val, char *buf);
@@ -227,6 +188,8 @@ void init_python_interpreter(const char *progname, const char *scripts,
 void term_python_interpreter();
 //extern EVENT_HANDLER *generate_daemon_event;
 int generate_daemon_event(JCR *jcr, const char *event);
+void lock_python();
+void unlock_python();
 
 /* signal.c */
 void             init_signals             (void terminate(int sig));
@@ -235,6 +198,7 @@ void             init_stack_dump          (void);
 /* scan.c */
 void             strip_leading_space     (char *str);
 void             strip_trailing_junk     (char *str);
+void             strip_trailing_newline  (char *str);
 void             strip_trailing_slashes  (char *dir);
 bool             skip_spaces             (char **msg);
 bool             skip_nonspaces          (char **msg);
@@ -248,11 +212,14 @@ int             bsscanf(const char *buf, const char *fmt, ...);
 
 
 /* tls.c */
+int              init_tls                (void);
+int              cleanup_tls             (void);
+
 TLS_CONTEXT      *new_tls_context        (const char *ca_certfile,
                                           const char *ca_certdir,
                                           const char *certfile,
                                           const char *keyfile,
-                                          CRYPTO_PEM_PASSWD_CB *pem_callback,
+                                          TLS_PEM_PASSWD_CB *pem_callback,
                                           const void *pem_userdata,
                                           const char *dhfile,
                                           bool verify_peer);
index 34d738a6cf9fb674f9a30fe6099a172b4a3c213d..cc432cfdc9d8198affb2de6a1d82bdcdc5da6da4 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 /*
-   Copyright (C) 2004-2005 Kern Sibbald
+   Copyright (C) 2004-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
 #undef _POSIX_C_SOURCE
 #include <Python.h>
 
+/* Forward referenced subroutines */
+static void init_python_lock();
+static void term_python_lock();
+void lock_python();
+void unlock_python();
+
 extern char *configfile;
 
 /* Imported subroutines */
@@ -135,6 +141,7 @@ void init_python_interpreter(const char *progname, const char *scripts,
       }
    }
    PyEval_ReleaseLock();
+   init_python_lock();
 }
 
 
@@ -144,6 +151,7 @@ void term_python_interpreter()
       Py_XDECREF(StartUp_module);
       Py_Finalize();
    }
+   term_python_lock();
 }
 
 static PyObject *set_bacula_events(PyObject *self, PyObject *args)
@@ -218,7 +226,8 @@ int generate_daemon_event(JCR *jcr, const char *event)
    }
 
    Dmsg1(100, "event=%s\n", event);
-   PyEval_AcquireLock();
+   lock_python();
+// PyEval_AcquireLock();
    if (strcmp(event, "JobStart") == 0) {
       if (!JobStart_method) {
          stat = 0;
@@ -292,10 +301,51 @@ bail_out:
    /* Fall through */
 jobstart_ok:
    Py_XDECREF(result);
-   PyEval_ReleaseLock();
+   unlock_python();
+// PyEval_ReleaseLock();
    return stat; 
 }
 
+static brwlock_t python_rwlock;
+
+static void init_python_lock()
+{
+   int errstat;
+   if ((errstat=rwl_init(&python_rwlock)) != 0) {
+      berrno be;
+      Emsg1(M_ABORT, 0, _("Unable to initialize the Python lock. ERR=%s\n"),
+            be.strerror(errstat));
+   }
+
+}
+
+static void term_python_lock()
+{
+   rwl_destroy(&python_rwlock);
+}
+
+/* This applies to a drive and to Volumes */
+void lock_python()
+{
+   int errstat;
+   if ((errstat=rwl_writelock(&python_rwlock)) != 0) {
+      berrno be;
+      Emsg2(M_ABORT, 0, "Python rwl_writelock failure. stat=%d: ERR=%s\n",
+           errstat, be.strerror(errstat));
+   }
+}
+
+void unlock_python()
+{
+   int errstat;
+   if ((errstat=rwl_writeunlock(&python_rwlock)) != 0) {
+      berrno be;
+      Emsg2(M_ABORT, 0, "Python rwl_writeunlock failure. stat=%d: ERR=%s\n",
+           errstat, be.strerror(errstat));
+   }
+}
+
+
 #else
 
 /*
diff --git a/bacula/src/lib/regex.c b/bacula/src/lib/regex.c
deleted file mode 100644 (file)
index c8634e1..0000000
+++ /dev/null
@@ -1,6193 +0,0 @@
-/* Extended regular expression matching and search library,
-   version 0.12.
-   (Implements POSIX draft P1003.2/D11.2, except for some of the
-   internationalization features.)
-   Copyright (C) 1993-1999, 2000 Free Software Foundation, Inc.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library 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
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-/* AIX requires this to be the first thing in the file. */
-#if defined _AIX && !defined REGEX_MALLOC
-  #pragma alloca
-#endif
-  
-#include "bacula.h"
-#undef  _GNU_SOURCE
-#define _GNU_SOURCE
-
-#ifdef working
-
-#  define PARAMS(args) args
-
-#if defined STDC_HEADERS && !defined emacs
-# include <stddef.h>
-#else
-/* We need this for `regex.h', and perhaps for the Emacs include files.  */
-# include <sys/types.h>
-#endif
-
-#define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC)
-
-/* For platform which support the ISO C amendement 1 functionality we
-   support user defined character classes.  */
-#if defined _LIBC || WIDE_CHAR_SUPPORT
-/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
-# include <wchar.h>
-# include <wctype.h>
-#endif
-
-#ifdef _LIBC
-/* We have to keep the namespace clean.  */
-# define regfree(preg) __regfree (preg)
-# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
-# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
-# define regerror(errcode, preg, errbuf, errbuf_size) \
-        __regerror(errcode, preg, errbuf, errbuf_size)
-# define re_set_registers(bu, re, nu, st, en) \
-        __re_set_registers (bu, re, nu, st, en)
-# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
-        __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
-# define re_match(bufp, string, size, pos, regs) \
-        __re_match (bufp, string, size, pos, regs)
-# define re_search(bufp, string, size, startpos, range, regs) \
-        __re_search (bufp, string, size, startpos, range, regs)
-# define re_compile_pattern(pattern, length, bufp) \
-        __re_compile_pattern (pattern, length, bufp)
-# define re_set_syntax(syntax) __re_set_syntax (syntax)
-# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
-        __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
-# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
-
-# define btowc __btowc
-
-/* We are also using some library internals.  */
-# include <locale/localeinfo.h>
-# include <locale/elem-hash.h>
-# include <langinfo.h>
-#endif
-
-/* This is for other GNU distributions with internationalized messages.  */
-#if HAVE_LIBINTL_H || defined _LIBC
-# include <libintl.h>
-#else
-# define gettext(msgid) (msgid)
-#endif
-
-#ifndef gettext_noop
-/* This define is so xgettext can find the internationalizable
-   strings.  */
-# define gettext_noop(String) String
-#endif
-
-/* The `emacs' switch turns on certain matching commands
-   that make sense only in Emacs. */
-#ifdef emacs
-
-# include "lisp.h"
-# include "buffer.h"
-# include "syntax.h"
-
-#else  /* not emacs */
-
-/* If we are not linking with Emacs proper,
-   we can't use the relocating allocator
-   even if config.h says that we can.  */
-# undef REL_ALLOC
-
-#  include <stdlib.h>
-
-/* This is the normal way of making sure we have a bcopy and a bzero.
-   This is used in most programs--a few other programs avoid this
-   by defining INHIBIT_STRING_HEADER.  */
-#   include <string.h>
-#     define bzero(s, n)        memset (s, 0, n)
-
-/* Define the syntax stuff for \<, \>, etc.  */
-
-/* This must be nonzero for the wordchar and notwordchar pattern
-   commands in re_match_2.  */
-# ifndef Sword
-#  define Sword 1
-# endif
-
-# ifdef SWITCH_ENUM_BUG
-#  define SWITCH_ENUM_CAST(x) ((int)(x))
-# else
-#  define SWITCH_ENUM_CAST(x) (x)
-# endif
-
-#endif /* not emacs */
-
-#if defined _LIBC || HAVE_LIMITS_H
-# include <limits.h>
-#endif
-
-#ifndef MB_LEN_MAX
-# define MB_LEN_MAX 1
-#endif
-
-/* Get the interface, including the syntax bits.  */
-#include "regex.h"
-
-/* isalpha etc. are used for the character classes.  */
-#include <ctype.h>
-
-/* Jim Meyering writes:
-
-   "... Some ctype macros are valid only for character codes that
-   isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
-   using /bin/cc or gcc but without giving an ansi option).  So, all
-   ctype uses should be through macros like ISPRINT...  If
-   STDC_HEADERS is defined, then autoconf has verified that the ctype
-   macros don't need to be guarded with references to isascii. ...
-   Defining isascii to 1 should let any compiler worth its salt
-   eliminate the && through constant folding."
-   Solaris defines some of these symbols so we must undefine them first.  */
-
-#undef ISASCII
-#if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
-# define ISASCII(c) 1
-#else
-# define ISASCII(c) isascii(c)
-#endif
-
-#ifdef isblank
-# define ISBLANK(c) (ISASCII (c) && isblank (c))
-#else
-# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
-#endif
-#ifdef isgraph
-# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
-#else
-# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
-#endif
-
-#undef ISPRINT
-#define ISPRINT(c) (ISASCII (c) && isprint (c))
-#define ISDIGIT(c) (ISASCII (c) && isdigit (c))
-#define ISALNUM(c) (ISASCII (c) && isalnum (c))
-#define ISALPHA(c) (ISASCII (c) && isalpha (c))
-#define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
-#define ISLOWER(c) (ISASCII (c) && islower (c))
-#define ISPUNCT(c) (ISASCII (c) && ispunct (c))
-#define ISSPACE(c) (ISASCII (c) && isspace (c))
-#define ISUPPER(c) (ISASCII (c) && isupper (c))
-#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
-
-#ifdef _tolower
-# define TOLOWER(c) _tolower(c)
-#else
-# define TOLOWER(c) tolower(c)
-#endif
-
-#ifndef NULL
-# define NULL (void *)0
-#endif
-
-/* We remove any previous definition of `SIGN_EXTEND_CHAR',
-   since ours (we hope) works properly with all combinations of
-   machines, compilers, `char' and `unsigned char' argument types.
-   (Per Bothner suggested the basic approach.)  */
-#undef SIGN_EXTEND_CHAR
-#if __STDC__
-# define SIGN_EXTEND_CHAR(c) ((signed char) (c))
-#else  /* not __STDC__ */
-/* As in Harbison and Steele.  */
-# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
-#endif
-
-#ifndef emacs
-/* How many characters in the character set.  */
-# define CHAR_SET_SIZE 256
-
-# ifdef SYNTAX_TABLE
-
-extern char *re_syntax_table;
-
-# else /* not SYNTAX_TABLE */
-
-static char re_syntax_table[CHAR_SET_SIZE];
-
-static void
-init_syntax_once ()
-{
-   register int c;
-   static int done = 0;
-
-   if (done)
-     return;
-   bzero(re_syntax_table, sizeof(re_syntax_table));
-
-   for (c = 0; c < CHAR_SET_SIZE; ++c)
-     if (ISALNUM (c))
-        re_syntax_table[c] = Sword;
-
-   c = '_';
-   re_syntax_table[c] = Sword;
-
-   done = 1;
-}
-
-# endif /* not SYNTAX_TABLE */
-
-# define SYNTAX(c) re_syntax_table[(unsigned char) (c)]
-
-#endif /* emacs */
-
-/* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
-   use `alloca' instead of `malloc'.  This is because using malloc in
-   re_search* or re_match* could cause memory leaks when C-g is used in
-   Emacs; also, malloc is slower and causes storage fragmentation.  On
-   the other hand, malloc is more portable, and easier to debug.
-
-   Because we sometimes use alloca, some routines have to be macros,
-   not functions -- `alloca'-allocated space disappears at the end of the
-   function it is called in.  */
-
-#ifdef REGEX_MALLOC
-
-# define REGEX_ALLOCATE malloc
-# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
-# define REGEX_FREE free
-
-#else /* not REGEX_MALLOC  */
-
-/* Emacs already defines alloca, sometimes.  */
-# ifndef alloca
-
-/* Make alloca work the best possible way.  */
-#  ifdef __GNUC__
-#   define alloca __builtin_alloca
-#  else /* not __GNUC__ */
-#   if HAVE_ALLOCA_H
-#    include <alloca.h>
-#   endif /* HAVE_ALLOCA_H */
-#  endif /* not __GNUC__ */
-
-# endif /* not alloca */
-
-# define REGEX_ALLOCATE alloca
-
-/* Assumes a `char *destination' variable.  */
-# define REGEX_REALLOCATE(source, osize, nsize)                         \
-  (destination = (char *) alloca (nsize),                               \
-   memcpy (destination, source, osize))
-
-/* No need to do anything to free, after alloca.  */
-# define REGEX_FREE(arg) ((void)0) /* Do nothing!  But inhibit gcc warning.  */
-
-#endif /* not REGEX_MALLOC */
-
-/* Define how to allocate the failure stack.  */
-
-#if defined REL_ALLOC && defined REGEX_MALLOC
-
-# define REGEX_ALLOCATE_STACK(size)                             \
-  r_alloc (&failure_stack_ptr, (size))
-# define REGEX_REALLOCATE_STACK(source, osize, nsize)           \
-  r_re_alloc (&failure_stack_ptr, (nsize))
-# define REGEX_FREE_STACK(ptr)                                  \
-  r_alloc_free (&failure_stack_ptr)
-
-#else /* not using relocating allocator */
-
-# ifdef REGEX_MALLOC
-
-#  define REGEX_ALLOCATE_STACK malloc
-#  define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize)
-#  define REGEX_FREE_STACK free
-
-# else /* not REGEX_MALLOC */
-
-#  define REGEX_ALLOCATE_STACK alloca
-
-#  define REGEX_REALLOCATE_STACK(source, osize, nsize)                  \
-   REGEX_REALLOCATE (source, osize, nsize)
-/* No need to explicitly free anything.  */
-#  define REGEX_FREE_STACK(arg)
-
-# endif /* not REGEX_MALLOC */
-#endif /* not using relocating allocator */
-
-
-/* True if `size1' is non-NULL and PTR is pointing anywhere inside
-   `string1' or just past its end.  This works if PTR is NULL, which is
-   a good thing.  */
-#define FIRST_STRING_P(ptr)                                     \
-  (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
-
-/* (Re)Allocate N items of type T using malloc, or fail.  */
-#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
-#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
-#define RETALLOC_IF(addr, n, t) \
-  if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
-#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
-
-#define BYTEWIDTH 8 /* In bits.  */
-
-#define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
-
-#undef MAX
-#undef MIN
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-
-//typedef char boolean;
-//#define false 0
-//#define true 1
-
-static int re_match_2_internal (
-     struct re_pattern_buffer *bufp,
-     const char *string1, int size1,
-     const char *string2, int size2,
-     int pos,
-     struct re_registers *regs,
-     int stop);
-
-/* These are the command codes that appear in compiled regular
-   expressions.  Some opcodes are followed by argument bytes.  A
-   command code can specify any interpretation whatsoever for its
-   arguments.  Zero bytes may appear in the compiled regular expression.  */
-
-typedef enum
-{
-  no_op = 0,
-
-  /* Succeed right away--no more backtracking.  */
-  succeed,
-
-        /* Followed by one byte giving n, then by n literal bytes.  */
-  exactn,
-
-        /* Matches any (more or less) character.  */
-  anychar,
-
-        /* Matches any one char belonging to specified set.  First
-           following byte is number of bitmap bytes.  Then come bytes
-           for a bitmap saying which chars are in.  Bits in each byte
-           are ordered low-bit-first.  A character is in the set if its
-           bit is 1.  A character too large to have a bit in the map is
-           automatically not in the set.  */
-  charset,
-
-        /* Same parameters as charset, but match any character that is
-           not one of those specified.  */
-  charset_not,
-
-        /* Start remembering the text that is matched, for storing in a
-           register.  Followed by one byte with the register number, in
-           the range 0 to one less than the pattern buffer's re_nsub
-           field.  Then followed by one byte with the number of groups
-           inner to this one.  (This last has to be part of the
-           start_memory only because we need it in the on_failure_jump
-           of re_match_2.)  */
-  start_memory,
-
-        /* Stop remembering the text that is matched and store it in a
-           memory register.  Followed by one byte with the register
-           number, in the range 0 to one less than `re_nsub' in the
-           pattern buffer, and one byte with the number of inner groups,
-           just like `start_memory'.  (We need the number of inner
-           groups here because we don't have any easy way of finding the
-           corresponding start_memory when we're at a stop_memory.)  */
-  stop_memory,
-
-        /* Match a duplicate of something remembered. Followed by one
-           byte containing the register number.  */
-  duplicate,
-
-        /* Fail unless at beginning of line.  */
-  begline,
-
-        /* Fail unless at end of line.  */
-  endline,
-
-        /* Succeeds if at beginning of buffer (if emacs) or at beginning
-           of string to be matched (if not).  */
-  begbuf,
-
-        /* Analogously, for end of buffer/string.  */
-  endbuf,
-
-        /* Followed by two byte relative address to which to jump.  */
-  jump,
-
-        /* Same as jump, but marks the end of an alternative.  */
-  jump_past_alt,
-
-        /* Followed by two-byte relative address of place to resume at
-           in case of failure.  */
-  on_failure_jump,
-
-        /* Like on_failure_jump, but pushes a placeholder instead of the
-           current string position when executed.  */
-  on_failure_keep_string_jump,
-
-        /* Throw away latest failure point and then jump to following
-           two-byte relative address.  */
-  pop_failure_jump,
-
-        /* Change to pop_failure_jump if know won't have to backtrack to
-           match; otherwise change to jump.  This is used to jump
-           back to the beginning of a repeat.  If what follows this jump
-           clearly won't match what the repeat does, such that we can be
-           sure that there is no use backtracking out of repetitions
-           already matched, then we change it to a pop_failure_jump.
-           Followed by two-byte address.  */
-  maybe_pop_jump,
-
-        /* Jump to following two-byte address, and push a dummy failure
-           point. This failure point will be thrown away if an attempt
-           is made to use it for a failure.  A `+' construct makes this
-           before the first repeat.  Also used as an intermediary kind
-           of jump when compiling an alternative.  */
-  dummy_failure_jump,
-
-        /* Push a dummy failure point and continue.  Used at the end of
-           alternatives.  */
-  push_dummy_failure,
-
-        /* Followed by two-byte relative address and two-byte number n.
-           After matching N times, jump to the address upon failure.  */
-  succeed_n,
-
-        /* Followed by two-byte relative address, and two-byte number n.
-           Jump to the address N times, then fail.  */
-  jump_n,
-
-        /* Set the following two-byte relative address to the
-           subsequent two-byte number.  The address *includes* the two
-           bytes of number.  */
-  set_number_at,
-
-  wordchar,     /* Matches any word-constituent character.  */
-  notwordchar,  /* Matches any char that is not a word-constituent.  */
-
-  wordbeg,      /* Succeeds if at word beginning.  */
-  wordend,      /* Succeeds if at word end.  */
-
-  wordbound,    /* Succeeds if at a word boundary.  */
-  notwordbound  /* Succeeds if not at a word boundary.  */
-
-#ifdef emacs
-  ,before_dot,  /* Succeeds if before point.  */
-  at_dot,       /* Succeeds if at point.  */
-  after_dot,    /* Succeeds if after point.  */
-
-        /* Matches any character whose syntax is specified.  Followed by
-           a byte which contains a syntax code, e.g., Sword.  */
-  syntaxspec,
-
-        /* Matches any character whose syntax is not that specified.  */
-  notsyntaxspec
-#endif /* emacs */
-} re_opcode_t;
-/* Common operations on the compiled pattern.  */
-
-/* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
-
-#define STORE_NUMBER(destination, number)                               \
-  do {                                                                  \
-    (destination)[0] = (number) & 0377;                                 \
-    (destination)[1] = (number) >> 8;                                   \
-  } while (0)
-
-/* Same as STORE_NUMBER, except increment DESTINATION to
-   the byte after where the number is stored.  Therefore, DESTINATION
-   must be an lvalue.  */
-
-#define STORE_NUMBER_AND_INCR(destination, number)                      \
-  do {                                                                  \
-    STORE_NUMBER (destination, number);                                 \
-    (destination) += 2;                                                 \
-  } while (0)
-
-/* Put into DESTINATION a number stored in two contiguous bytes starting
-   at SOURCE.  */
-
-#define EXTRACT_NUMBER(destination, source)                             \
-  do {                                                                  \
-    (destination) = *(source) & 0377;                                   \
-    (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;           \
-  } while (0)
-
-#ifdef REGEX_DEBUG
-static void extract_number _RE_ARGS ((int *dest, unsigned char *source));
-static void
-extract_number (
-    int *dest,
-    unsigned char *source)
-{
-  int temp = SIGN_EXTEND_CHAR (*(source + 1));
-  *dest = *source & 0377;
-  *dest += temp << 8;
-}
-
-# ifndef EXTRACT_MACROS /* To debug the macros.  */
-#  undef EXTRACT_NUMBER
-#  define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
-# endif /* not EXTRACT_MACROS */
-
-#endif /* REGEX_DEBUG */
-
-/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
-   SOURCE must be an lvalue.  */
-
-#define EXTRACT_NUMBER_AND_INCR(destination, source)                    \
-  do {                                                                  \
-    EXTRACT_NUMBER (destination, source);                               \
-    (source) += 2;                                                      \
-  } while (0)
-
-#ifdef REGEX_DEBUG
-static void
-extract_number_and_incr (
-    int *destination,
-    unsigned char **source)
-{
-  extract_number (destination, *source);
-  *source += 2;
-}
-
-# ifndef EXTRACT_MACROS
-#  undef EXTRACT_NUMBER_AND_INCR
-#  define EXTRACT_NUMBER_AND_INCR(dest, src) \
-  extract_number_and_incr (&dest, &src)
-# endif /* not EXTRACT_MACROS */
-
-#endif /* REGEX_DEBUG */
-/* If DEBUG is defined, Regex prints many voluminous messages about what
-   it is doing (if the variable `debug' is nonzero).  If linked with the
-   main program in `iregex.c', you can enter patterns and strings
-   interactively.  And if linked with the main program in `main.c' and
-   the other test files, you can run the already-written tests.  */
-
-#ifdef REGEX_DEBUG
-
-/* We use standard I/O for debugging.  */
-# include <stdio.h>
-
-/* It is useful to test things that ``must'' be true when debugging.  */
-# include <assert.h>
-
-static int debug;
-
-# define DEBUG_STATEMENT(e) e
-# define DEBUG_PRINT1(x) if (debug) printf (x)
-# define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
-# define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
-# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
-# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)                          \
-  if (debug) print_partial_compiled_pattern (s, e)
-# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)                 \
-  if (debug) print_double_string (w, s1, sz1, s2, sz2)
-
-
-/* Print the fastmap in human-readable form.  */
-
-void
-print_fastmap (
-    char *fastmap)
-{
-  unsigned was_a_range = 0;
-  unsigned i = 0;
-
-  while (i < (1 << BYTEWIDTH))
-    {
-      if (fastmap[i++])
-        {
-          was_a_range = 0;
-          putchar (i - 1);
-          while (i < (1 << BYTEWIDTH)  &&  fastmap[i])
-            {
-              was_a_range = 1;
-              i++;
-            }
-          if (was_a_range)
-            {
-              printf ("-");
-              putchar (i - 1);
-            }
-        }
-    }
-  putchar ('\n');
-}
-
-
-/* Print a compiled pattern string in human-readable form, starting at
-   the START pointer into it and ending just before the pointer END.  */
-
-void
-print_partial_compiled_pattern (start, end)
-    unsigned char *start;
-    unsigned char *end;
-{
-  int mcnt, mcnt2;
-  unsigned char *p1;
-  unsigned char *p = start;
-  unsigned char *pend = end;
-
-  if (start == NULL)
-    {
-      printf ("(null)\n");
-      return;
-    }
-
-  /* Loop over pattern commands.  */
-  while (p < pend)
-    {
-#ifdef _LIBC
-      printf ("%t:\t", p - start);
-#else
-      printf ("%ld:\t", (long int) (p - start));
-#endif
-
-      switch ((re_opcode_t) *p++)
-        {
-        case no_op:
-          printf ("/no_op");
-          break;
-
-        case exactn:
-          mcnt = *p++;
-          printf ("/exactn/%d", mcnt);
-          do
-            {
-              putchar ('/');
-              putchar (*p++);
-            }
-          while (--mcnt);
-          break;
-
-        case start_memory:
-          mcnt = *p++;
-          printf ("/start_memory/%d/%d", mcnt, *p++);
-          break;
-
-        case stop_memory:
-          mcnt = *p++;
-          printf ("/stop_memory/%d/%d", mcnt, *p++);
-          break;
-
-        case duplicate:
-          printf ("/duplicate/%d", *p++);
-          break;
-
-        case anychar:
-          printf ("/anychar");
-          break;
-
-        case charset:
-        case charset_not:
-          {
-            register int c, last = -100;
-            register int in_range = 0;
-
-            printf ("/charset [%s",
-                    (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
-
-            assert (p + *p < pend);
-
-            for (c = 0; c < 256; c++)
-              if (c / 8 < *p
-                  && (p[1 + (c/8)] & (1 << (c % 8))))
-                {
-                  /* Are we starting a range?  */
-                  if (last + 1 == c && ! in_range)
-                    {
-                      putchar ('-');
-                      in_range = 1;
-                    }
-                  /* Have we broken a range?  */
-                  else if (last + 1 != c && in_range)
-              {
-                      putchar (last);
-                      in_range = 0;
-                    }
-
-                  if (! in_range)
-                    putchar (c);
-
-                  last = c;
-              }
-
-            if (in_range)
-              putchar (last);
-
-            putchar (']');
-
-            p += 1 + *p;
-          }
-          break;
-
-        case begline:
-          printf ("/begline");
-          break;
-
-        case endline:
-          printf ("/endline");
-          break;
-
-        case on_failure_jump:
-          extract_number_and_incr (&mcnt, &p);
-#ifdef _LIBC
-          printf ("/on_failure_jump to %t", p + mcnt - start);
-#else
-          printf ("/on_failure_jump to %ld", (long int) (p + mcnt - start));
-#endif
-          break;
-
-        case on_failure_keep_string_jump:
-          extract_number_and_incr (&mcnt, &p);
-#ifdef _LIBC
-          printf ("/on_failure_keep_string_jump to %t", p + mcnt - start);
-#else
-          printf ("/on_failure_keep_string_jump to %ld",
-                  (long int) (p + mcnt - start));
-#endif
-          break;
-
-        case dummy_failure_jump:
-          extract_number_and_incr (&mcnt, &p);
-#ifdef _LIBC
-          printf ("/dummy_failure_jump to %t", p + mcnt - start);
-#else
-          printf ("/dummy_failure_jump to %ld", (long int) (p + mcnt - start));
-#endif
-          break;
-
-        case push_dummy_failure:
-          printf ("/push_dummy_failure");
-          break;
-
-        case maybe_pop_jump:
-          extract_number_and_incr (&mcnt, &p);
-#ifdef _LIBC
-          printf ("/maybe_pop_jump to %t", p + mcnt - start);
-#else
-          printf ("/maybe_pop_jump to %ld", (long int) (p + mcnt - start));
-#endif
-          break;
-
-        case pop_failure_jump:
-          extract_number_and_incr (&mcnt, &p);
-#ifdef _LIBC
-          printf ("/pop_failure_jump to %t", p + mcnt - start);
-#else
-          printf ("/pop_failure_jump to %ld", (long int) (p + mcnt - start));
-#endif
-          break;
-
-        case jump_past_alt:
-          extract_number_and_incr (&mcnt, &p);
-#ifdef _LIBC
-          printf ("/jump_past_alt to %t", p + mcnt - start);
-#else
-          printf ("/jump_past_alt to %ld", (long int) (p + mcnt - start));
-#endif
-          break;
-
-        case jump:
-          extract_number_and_incr (&mcnt, &p);
-#ifdef _LIBC
-          printf ("/jump to %t", p + mcnt - start);
-#else
-          printf ("/jump to %ld", (long int) (p + mcnt - start));
-#endif
-          break;
-
-        case succeed_n:
-          extract_number_and_incr (&mcnt, &p);
-          p1 = p + mcnt;
-          extract_number_and_incr (&mcnt2, &p);
-#ifdef _LIBC
-          printf ("/succeed_n to %t, %d times", p1 - start, mcnt2);
-#else
-          printf ("/succeed_n to %ld, %d times",
-                  (long int) (p1 - start), mcnt2);
-#endif
-          break;
-
-        case jump_n:
-          extract_number_and_incr (&mcnt, &p);
-          p1 = p + mcnt;
-          extract_number_and_incr (&mcnt2, &p);
-          printf ("/jump_n to %d, %d times", p1 - start, mcnt2);
-          break;
-
-        case set_number_at:
-          extract_number_and_incr (&mcnt, &p);
-          p1 = p + mcnt;
-          extract_number_and_incr (&mcnt2, &p);
-#ifdef _LIBC
-          printf ("/set_number_at location %t to %d", p1 - start, mcnt2);
-#else
-          printf ("/set_number_at location %ld to %d",
-                  (long int) (p1 - start), mcnt2);
-#endif
-          break;
-
-        case wordbound:
-          printf ("/wordbound");
-          break;
-
-        case notwordbound:
-          printf ("/notwordbound");
-          break;
-
-        case wordbeg:
-          printf ("/wordbeg");
-          break;
-
-        case wordend:
-          printf ("/wordend");
-
-# ifdef emacs
-        case before_dot:
-          printf ("/before_dot");
-          break;
-
-        case at_dot:
-          printf ("/at_dot");
-          break;
-
-        case after_dot:
-          printf ("/after_dot");
-          break;
-
-        case syntaxspec:
-          printf ("/syntaxspec");
-          mcnt = *p++;
-          printf ("/%d", mcnt);
-          break;
-
-        case notsyntaxspec:
-          printf ("/notsyntaxspec");
-          mcnt = *p++;
-          printf ("/%d", mcnt);
-          break;
-# endif /* emacs */
-
-        case wordchar:
-          printf ("/wordchar");
-          break;
-
-        case notwordchar:
-          printf ("/notwordchar");
-          break;
-
-        case begbuf:
-          printf ("/begbuf");
-          break;
-
-        case endbuf:
-          printf ("/endbuf");
-          break;
-
-        default:
-          printf ("?%d", *(p-1));
-        }
-
-      putchar ('\n');
-    }
-
-#ifdef _LIBC
-  printf ("%t:\tend of pattern.\n", p - start);
-#else
-  printf ("%ld:\tend of pattern.\n", (long int) (p - start));
-#endif
-}
-
-
-void
-print_compiled_pattern (bufp)
-    struct re_pattern_buffer *bufp;
-{
-  unsigned char *buffer = bufp->buffer;
-
-  print_partial_compiled_pattern (buffer, buffer + bufp->used);
-  printf ("%ld bytes used/%ld bytes allocated.\n",
-          bufp->used, bufp->allocated);
-
-  if (bufp->fastmap_accurate && bufp->fastmap)
-    {
-      printf ("fastmap: ");
-      print_fastmap (bufp->fastmap);
-    }
-
-#ifdef _LIBC
-  printf ("re_nsub: %Zd\t", bufp->re_nsub);
-#else
-  printf ("re_nsub: %ld\t", (long int) bufp->re_nsub);
-#endif
-  printf ("regs_alloc: %d\t", bufp->regs_allocated);
-  printf ("can_be_null: %d\t", bufp->can_be_null);
-  printf ("newline_anchor: %d\n", bufp->newline_anchor);
-  printf ("no_sub: %d\t", bufp->no_sub);
-  printf ("not_bol: %d\t", bufp->not_bol);
-  printf ("not_eol: %d\t", bufp->not_eol);
-  printf ("syntax: %lx\n", bufp->syntax);
-  /* Perhaps we should print the translate table?  */
-}
-
-
-void
-print_double_string (where, string1, size1, string2, size2)
-    const char *where;
-    const char *string1;
-    const char *string2;
-    int size1;
-    int size2;
-{
-  int this_char;
-
-  if (where == NULL)
-    printf ("(null)");
-  else
-    {
-      if (FIRST_STRING_P (where))
-        {
-          for (this_char = where - string1; this_char < size1; this_char++)
-            putchar (string1[this_char]);
-
-          where = string2;
-        }
-
-      for (this_char = where - string2; this_char < size2; this_char++)
-        putchar (string2[this_char]);
-    }
-}
-
-void
-printchar (c)
-     int c;
-{
-  putc (c, stderr);
-}
-
-#else /* not REGEX_DEBUG */
-
-# undef assert
-# define assert(e)
-
-# define DEBUG_STATEMENT(e)
-# define DEBUG_PRINT1(x)
-# define DEBUG_PRINT2(x1, x2)
-# define DEBUG_PRINT3(x1, x2, x3)
-# define DEBUG_PRINT4(x1, x2, x3, x4)
-# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
-# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
-
-#endif /* not DEBUG */
-/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
-   also be assigned to arbitrarily: each pattern buffer stores its own
-   syntax, so it can be changed between regex compilations.  */
-/* This has no initializer because initialized variables in Emacs
-   become read-only after dumping.  */
-reg_syntax_t re_syntax_options;
-
-
-/* Specify the precise syntax of regexps for compilation.  This provides
-   for compatibility for various utilities which historically have
-   different, incompatible syntaxes.
-
-   The argument SYNTAX is a bit mask comprised of the various bits
-   defined in regex.h.  We return the old syntax.  */
-
-reg_syntax_t
-re_set_syntax (reg_syntax_t syntax)
-{
-  reg_syntax_t ret = re_syntax_options;
-
-  re_syntax_options = syntax;
-#ifdef REGEX_DEBUG
-  if (syntax & RE_DEBUG)
-    debug = 1;
-  else if (debug) /* was on but now is not */
-    debug = 0;
-#endif /* DEBUG */
-  return ret;
-}
-#ifdef _LIBC
-weak_alias (__re_set_syntax, re_set_syntax)
-#endif
-/* This table gives an error message for each of the error codes listed
-   in regex.h.  Obviously the order here has to be same as there.
-   POSIX doesn't require that we do anything for REG_NOERROR,
-   but why not be nice?  */
-
-static const char re_error_msgid[] =
-  {
-#define REG_NOERROR_IDX 0
-    _("Success")    /* REG_NOERROR */
-    "\0"
-#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
-    _("No match")   /* REG_NOMATCH */
-    "\0"
-#define REG_BADPAT_IDX  (REG_NOMATCH_IDX + sizeof "No match")
-    _("Invalid regular expression") /* REG_BADPAT */
-    "\0"
-#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
-    _("Invalid collation character") /* REG_ECOLLATE */
-    "\0"
-#define REG_ECTYPE_IDX  (REG_ECOLLATE_IDX + sizeof "Invalid collation character")
-    _("Invalid character class name") /* REG_ECTYPE */
-    "\0"
-#define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name")
-    _("Trailing backslash") /* REG_EESCAPE */
-    "\0"
-#define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash")
-    _("Invalid back reference") /* REG_ESUBREG */
-    "\0"
-#define REG_EBRACK_IDX  (REG_ESUBREG_IDX + sizeof "Invalid back reference")
-    _("Unmatched [ or [^") /* REG_EBRACK */
-    "\0"
-#define REG_EPAREN_IDX  (REG_EBRACK_IDX + sizeof "Unmatched [ or [^")
-    _("Unmatched ( or \\(") /* REG_EPAREN */
-    "\0"
-#define REG_EBRACE_IDX  (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
-    _("Unmatched \\{") /* REG_EBRACE */
-    "\0"
-#define REG_BADBR_IDX   (REG_EBRACE_IDX + sizeof "Unmatched \\{")
-    _("Invalid content of \\{\\}") /* REG_BADBR */
-    "\0"
-#define REG_ERANGE_IDX  (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
-    _("Invalid range end")  /* REG_ERANGE */
-    "\0"
-#define REG_ESPACE_IDX  (REG_ERANGE_IDX + sizeof "Invalid range end")
-    _("Memory exhausted") /* REG_ESPACE */
-    "\0"
-#define REG_BADRPT_IDX  (REG_ESPACE_IDX + sizeof "Memory exhausted")
-    _("Invalid preceding regular expression") /* REG_BADRPT */
-    "\0"
-#define REG_EEND_IDX    (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
-    _("Premature end of regular expression") /* REG_EEND */
-    "\0"
-#define REG_ESIZE_IDX   (REG_EEND_IDX + sizeof "Premature end of regular expression")
-    _("Regular expression too big") /* REG_ESIZE */
-    "\0"
-#define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big")
-    _("Unmatched ) or \\)") /* REG_ERPAREN */
-  };
-
-static const size_t re_error_msgid_idx[] =
-  {
-    REG_NOERROR_IDX,
-    REG_NOMATCH_IDX,
-    REG_BADPAT_IDX,
-    REG_ECOLLATE_IDX,
-    REG_ECTYPE_IDX,
-    REG_EESCAPE_IDX,
-    REG_ESUBREG_IDX,
-    REG_EBRACK_IDX,
-    REG_EPAREN_IDX,
-    REG_EBRACE_IDX,
-    REG_BADBR_IDX,
-    REG_ERANGE_IDX,
-    REG_ESPACE_IDX,
-    REG_BADRPT_IDX,
-    REG_EEND_IDX,
-    REG_ESIZE_IDX,
-    REG_ERPAREN_IDX
-  };
-/* Avoiding alloca during matching, to placate r_alloc.  */
-
-/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the
-   searching and matching functions should not call alloca.  On some
-   systems, alloca is implemented in terms of malloc, and if we're
-   using the relocating allocator routines, then malloc could cause a
-   relocation, which might (if the strings being searched are in the
-   ralloc heap) shift the data out from underneath the regexp
-   routines.
-
-   Here's another reason to avoid allocation: Emacs
-   processes input from X in a signal handler; processing X input may
-   call malloc; if input arrives while a matching routine is calling
-   malloc, then we're scrod.  But Emacs can't just block input while
-   calling matching routines; then we don't notice interrupts when
-   they come in.  So, Emacs blocks input around all regexp calls
-   except the matching calls, which it leaves unprotected, in the
-   faith that they will not malloc.  */
-
-/* Normally, this is fine.  */
-#define MATCH_MAY_ALLOCATE
-
-/* When using GNU C, we are not REALLY using the C alloca, no matter
-   what config.h may say.  So don't take precautions for it.  */
-#ifdef __GNUC__
-# undef C_ALLOCA
-#endif
-
-/* The match routines may not allocate if (1) they would do it with malloc
-   and (2) it's not safe for them to use malloc.
-   Note that if REL_ALLOC is defined, matching would not use malloc for the
-   failure stack, but we would still use it for the register vectors;
-   so REL_ALLOC should not affect this.  */
-#if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs
-# undef MATCH_MAY_ALLOCATE
-#endif
-
-/* Failure stack declarations and macros; both re_compile_fastmap and
-   re_match_2 use a failure stack.  These have to be macros because of
-   REGEX_ALLOCATE_STACK.  */
-
-
-/* Number of failure points for which to initially allocate space
-   when matching.  If this number is exceeded, we allocate more
-   space, so it is not a hard limit.  */
-#ifndef INIT_FAILURE_ALLOC
-# define INIT_FAILURE_ALLOC 5
-#endif
-
-/* Roughly the maximum number of failure points on the stack.  Would be
-   exactly that if always used MAX_FAILURE_ITEMS items each time we failed.
-   This is a variable only so users of regex can assign to it; we never
-   change it ourselves.  */
-
-#ifdef INT_IS_16BIT
-
-# if defined MATCH_MAY_ALLOCATE
-/* 4400 was enough to cause a crash on Alpha OSF/1,
-   whose default stack limit is 2mb.  */
-long int re_max_failures = 4000;
-# else
-long int re_max_failures = 2000;
-# endif
-
-union fail_stack_elt
-{
-  unsigned char *pointer;
-  long int integer;
-};
-
-typedef union fail_stack_elt fail_stack_elt_t;
-
-typedef struct
-{
-  fail_stack_elt_t *stack;
-  unsigned long int size;
-  unsigned long int avail;              /* Offset of next open position.  */
-} fail_stack_type;
-
-#else /* not INT_IS_16BIT */
-
-# if defined MATCH_MAY_ALLOCATE
-/* 4400 was enough to cause a crash on Alpha OSF/1,
-   whose default stack limit is 2mb.  */
-int re_max_failures = 20000;
-# else
-int re_max_failures = 2000;
-# endif
-
-union fail_stack_elt
-{
-  unsigned char *pointer;
-  int integer;
-};
-
-typedef union fail_stack_elt fail_stack_elt_t;
-
-typedef struct
-{
-  fail_stack_elt_t *stack;
-  unsigned size;
-  unsigned avail;                       /* Offset of next open position.  */
-} fail_stack_type;
-
-#endif /* INT_IS_16BIT */
-
-#define FAIL_STACK_EMPTY()     (fail_stack.avail == 0)
-#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
-#define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
-
-
-/* Define macros to initialize and free the failure stack.
-   Do `return -2' if the alloc fails.  */
-
-#ifdef MATCH_MAY_ALLOCATE
-# define INIT_FAIL_STACK()                                              \
-  do {                                                                  \
-    fail_stack.stack = (fail_stack_elt_t *)                             \
-      REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \
-                                                                        \
-    if (fail_stack.stack == NULL)                                       \
-      return -2;                                                        \
-                                                                        \
-    fail_stack.size = INIT_FAILURE_ALLOC;                               \
-    fail_stack.avail = 0;                                               \
-  } while (0)
-
-# define RESET_FAIL_STACK()  REGEX_FREE_STACK (fail_stack.stack)
-#else
-# define INIT_FAIL_STACK()                                              \
-  do {                                                                  \
-    fail_stack.avail = 0;                                               \
-  } while (0)
-
-# define RESET_FAIL_STACK()
-#endif
-
-
-/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
-
-   Return 1 if succeeds, and 0 if either ran out of memory
-   allocating space for it or it was already too large.
-
-   REGEX_REALLOCATE_STACK requires `destination' be declared.   */
-
-#define DOUBLE_FAIL_STACK(fail_stack)                                   \
-  ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS) \
-   ? 0                                                                  \
-   : ((fail_stack).stack = (fail_stack_elt_t *)                         \
-        REGEX_REALLOCATE_STACK ((fail_stack).stack,                     \
-          (fail_stack).size * sizeof (fail_stack_elt_t),                \
-          ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)),        \
-                                                                        \
-      (fail_stack).stack == NULL                                        \
-      ? 0                                                               \
-      : ((fail_stack).size <<= 1,                                       \
-         1)))
-
-
-/* Push pointer POINTER on FAIL_STACK.
-   Return 1 if was able to do so and 0 if ran out of memory allocating
-   space to do so.  */
-#define PUSH_PATTERN_OP(POINTER, FAIL_STACK)                            \
-  ((FAIL_STACK_FULL ()                                                  \
-    && !DOUBLE_FAIL_STACK (FAIL_STACK))                                 \
-   ? 0                                                                  \
-   : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER,       \
-      1))
-
-/* Push a pointer value onto the failure stack.
-   Assumes the variable `fail_stack'.  Probably should only
-   be called from within `PUSH_FAILURE_POINT'.  */
-#define PUSH_FAILURE_POINTER(item)                                      \
-  fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item)
-
-/* This pushes an integer-valued item onto the failure stack.
-   Assumes the variable `fail_stack'.  Probably should only
-   be called from within `PUSH_FAILURE_POINT'.  */
-#define PUSH_FAILURE_INT(item)                                  \
-  fail_stack.stack[fail_stack.avail++].integer = (item)
-
-/* Push a fail_stack_elt_t value onto the failure stack.
-   Assumes the variable `fail_stack'.  Probably should only
-   be called from within `PUSH_FAILURE_POINT'.  */
-#define PUSH_FAILURE_ELT(item)                                  \
-  fail_stack.stack[fail_stack.avail++] =  (item)
-
-/* These three POP... operations complement the three PUSH... operations.
-   All assume that `fail_stack' is nonempty.  */
-#define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer
-#define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer
-#define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail]
-
-/* Used to omit pushing failure point id's when we're not debugging.  */
-#ifdef REGEX_DEBUG
-# define DEBUG_PUSH PUSH_FAILURE_INT
-# define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT ()
-#else
-# define DEBUG_PUSH(item)
-# define DEBUG_POP(item_addr)
-#endif
-
-
-/* Push the information about the state we will need
-   if we ever fail back to it.
-
-   Requires variables fail_stack, regstart, regend, reg_info, and
-   num_regs_pushed be declared.  DOUBLE_FAIL_STACK requires `destination'
-   be declared.
-
-   Does `return FAILURE_CODE' if runs out of memory.  */
-
-#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code)   \
-  do {                                                                  \
-    char *destination;                                                  \
-    /* Must be int, so when we don't save any registers, the arithmetic \
-       of 0 + -1 isn't done as unsigned.  */                            \
-    /* Can't be int, since there is not a shred of a guarantee that int \
-       is wide enough to hold a value of something to which pointer can \
-       be assigned */                                                   \
-    active_reg_t this_reg;                                              \
-                                                                        \
-    DEBUG_STATEMENT (failure_id++);                                     \
-    DEBUG_STATEMENT (nfailure_points_pushed++);                         \
-    DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id);           \
-    DEBUG_PRINT2 ("  Before push, next avail: %d\n", (fail_stack).avail);\
-    DEBUG_PRINT2 ("                     size: %d\n", (fail_stack).size);\
-                                                                        \
-    DEBUG_PRINT2 ("  slots needed: %ld\n", NUM_FAILURE_ITEMS);          \
-    DEBUG_PRINT2 ("     available: %d\n", REMAINING_AVAIL_SLOTS);       \
-                                                                        \
-    /* Ensure we have enough space allocated for what we will push.  */ \
-    while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS)                   \
-      {                                                                 \
-        if (!DOUBLE_FAIL_STACK (fail_stack))                            \
-          return failure_code;                                          \
-                                                                        \
-        DEBUG_PRINT2 ("\n  Doubled stack; size now: %d\n",              \
-                       (fail_stack).size);                              \
-        DEBUG_PRINT2 ("  slots available: %d\n", REMAINING_AVAIL_SLOTS);\
-      }                                                                 \
-                                                                        \
-    /* Push the info, starting with the registers.  */                  \
-    DEBUG_PRINT1 ("\n");                                                \
-                                                                        \
-    if (1)                                                              \
-      for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \
-           this_reg++)                                                  \
-        {                                                               \
-          DEBUG_PRINT2 ("  Pushing reg: %lu\n", this_reg);              \
-          DEBUG_STATEMENT (num_regs_pushed++);                          \
-                                                                        \
-          DEBUG_PRINT2 ("    start: %p\n", regstart[this_reg]);         \
-          PUSH_FAILURE_POINTER (regstart[this_reg]);                    \
-                                                                        \
-          DEBUG_PRINT2 ("    end: %p\n", regend[this_reg]);             \
-          PUSH_FAILURE_POINTER (regend[this_reg]);                      \
-                                                                        \
-          DEBUG_PRINT2 ("    info: %p\n      ",                         \
-                        reg_info[this_reg].word.pointer);               \
-          DEBUG_PRINT2 (" match_null=%d",                               \
-                        REG_MATCH_NULL_STRING_P (reg_info[this_reg]));  \
-          DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg]));  \
-          DEBUG_PRINT2 (" matched_something=%d",                        \
-                        MATCHED_SOMETHING (reg_info[this_reg]));        \
-          DEBUG_PRINT2 (" ever_matched=%d",                             \
-                        EVER_MATCHED_SOMETHING (reg_info[this_reg]));   \
-          DEBUG_PRINT1 ("\n");                                          \
-          PUSH_FAILURE_ELT (reg_info[this_reg].word);                   \
-        }                                                               \
-                                                                        \
-    DEBUG_PRINT2 ("  Pushing  low active reg: %ld\n", lowest_active_reg);\
-    PUSH_FAILURE_INT (lowest_active_reg);                               \
-                                                                        \
-    DEBUG_PRINT2 ("  Pushing high active reg: %ld\n", highest_active_reg);\
-    PUSH_FAILURE_INT (highest_active_reg);                              \
-                                                                        \
-    DEBUG_PRINT2 ("  Pushing pattern %p:\n", pattern_place);            \
-    DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend);           \
-    PUSH_FAILURE_POINTER (pattern_place);                               \
-                                                                        \
-    DEBUG_PRINT2 ("  Pushing string %p: `", string_place);              \
-    DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2,   \
-                                 size2);                                \
-    DEBUG_PRINT1 ("'\n");                                               \
-    PUSH_FAILURE_POINTER (string_place);                                \
-                                                                        \
-    DEBUG_PRINT2 ("  Pushing failure id: %u\n", failure_id);            \
-    DEBUG_PUSH (failure_id);                                            \
-  } while (0)
-
-/* This is the number of items that are pushed and popped on the stack
-   for each register.  */
-#define NUM_REG_ITEMS  3
-
-/* Individual items aside from the registers.  */
-#ifdef REGEX_DEBUG
-# define NUM_NONREG_ITEMS 5 /* Includes failure point id.  */
-#else
-# define NUM_NONREG_ITEMS 4
-#endif
-
-/* We push at most this many items on the stack.  */
-/* We used to use (num_regs - 1), which is the number of registers
-   this regexp will save; but that was changed to 5
-   to avoid stack overflow for a regexp with lots of parens.  */
-#define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
-
-/* We actually push this many items.  */
-#define NUM_FAILURE_ITEMS                               \
-  (((0                                                  \
-     ? 0 : highest_active_reg - lowest_active_reg + 1)  \
-    * NUM_REG_ITEMS)                                    \
-   + NUM_NONREG_ITEMS)
-
-/* How many items can still be added to the stack without overflowing it.  */
-#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
-
-
-/* Pops what PUSH_FAIL_STACK pushes.
-
-   We restore into the parameters, all of which should be lvalues:
-     STR -- the saved data position.
-     PAT -- the saved pattern position.
-     LOW_REG, HIGH_REG -- the highest and lowest active registers.
-     REGSTART, REGEND -- arrays of string positions.
-     REG_INFO -- array of information about each subexpression.
-
-   Also assumes the variables `fail_stack' and (if debugging), `bufp',
-   `pend', `string1', `size1', `string2', and `size2'.  */
-
-#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
-{                                                                       \
-  DEBUG_STATEMENT (unsigned failure_id;)                                \
-  active_reg_t this_reg;                                                \
-  const unsigned char *string_temp;                                     \
-                                                                        \
-  assert (!FAIL_STACK_EMPTY ());                                        \
-                                                                        \
-  /* Remove failure points and point to how many regs pushed.  */       \
-  DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");                                \
-  DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);    \
-  DEBUG_PRINT2 ("                    size: %d\n", fail_stack.size);     \
-                                                                        \
-  assert (fail_stack.avail >= NUM_NONREG_ITEMS);                        \
-                                                                        \
-  DEBUG_POP (&failure_id);                                              \
-  DEBUG_PRINT2 ("  Popping failure id: %u\n", failure_id);              \
-                                                                        \
-  /* If the saved string location is NULL, it came from an              \
-     on_failure_keep_string_jump opcode, and we want to throw away the  \
-     saved NULL, thus retaining our current position in the string.  */ \
-  string_temp = POP_FAILURE_POINTER ();                                 \
-  if (string_temp != NULL)                                              \
-    str = (const char *) string_temp;                                   \
-                                                                        \
-  DEBUG_PRINT2 ("  Popping string %p: `", str);                         \
-  DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);      \
-  DEBUG_PRINT1 ("'\n");                                                 \
-                                                                        \
-  pat = (unsigned char *) POP_FAILURE_POINTER ();                       \
-  DEBUG_PRINT2 ("  Popping pattern %p:\n", pat);                        \
-  DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);                       \
-                                                                        \
-  /* Restore register info.  */                                         \
-  high_reg = (active_reg_t) POP_FAILURE_INT ();                         \
-  DEBUG_PRINT2 ("  Popping high active reg: %ld\n", high_reg);          \
-                                                                        \
-  low_reg = (active_reg_t) POP_FAILURE_INT ();                          \
-  DEBUG_PRINT2 ("  Popping  low active reg: %ld\n", low_reg);           \
-                                                                        \
-  if (1)                                                                \
-    for (this_reg = high_reg; this_reg >= low_reg; this_reg--)          \
-      {                                                                 \
-        DEBUG_PRINT2 ("    Popping reg: %ld\n", this_reg);              \
-                                                                        \
-        reg_info[this_reg].word = POP_FAILURE_ELT ();                   \
-        DEBUG_PRINT2 ("      info: %p\n",                               \
-                      reg_info[this_reg].word.pointer);                 \
-                                                                        \
-        regend[this_reg] = (const char *) POP_FAILURE_POINTER ();       \
-        DEBUG_PRINT2 ("      end: %p\n", regend[this_reg]);             \
-                                                                        \
-        regstart[this_reg] = (const char *) POP_FAILURE_POINTER ();     \
-        DEBUG_PRINT2 ("      start: %p\n", regstart[this_reg]);         \
-      }                                                                 \
-  else                                                                  \
-    {                                                                   \
-      for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \
-        {                                                               \
-          reg_info[this_reg].word.integer = 0;                          \
-          regend[this_reg] = 0;                                         \
-          regstart[this_reg] = 0;                                       \
-        }                                                               \
-      highest_active_reg = high_reg;                                    \
-    }                                                                   \
-                                                                        \
-  set_regs_matched_done = 0;                                            \
-  DEBUG_STATEMENT (nfailure_points_popped++);                           \
-} /* POP_FAILURE_POINT */
-
-
-/* Structure for per-register (a.k.a. per-group) information.
-   Other register information, such as the
-   starting and ending positions (which are addresses), and the list of
-   inner groups (which is a bits list) are maintained in separate
-   variables.
-
-   We are making a (strictly speaking) nonportable assumption here: that
-   the compiler will pack our bit fields into something that fits into
-   the type of `word', i.e., is something that fits into one item on the
-   failure stack.  */
-
-
-/* Declarations and macros for re_match_2.  */
-
-typedef union
-{
-  fail_stack_elt_t word;
-  struct
-  {
-      /* This field is one if this group can match the empty string,
-         zero if not.  If not yet determined,  `MATCH_NULL_UNSET_VALUE'.  */
-#define MATCH_NULL_UNSET_VALUE 3
-    unsigned match_null_string_p : 2;
-    unsigned is_active : 1;
-    unsigned matched_something : 1;
-    unsigned ever_matched_something : 1;
-  } bits;
-} register_info_type;
-
-#define REG_MATCH_NULL_STRING_P(R)  ((R).bits.match_null_string_p)
-#define IS_ACTIVE(R)  ((R).bits.is_active)
-#define MATCHED_SOMETHING(R)  ((R).bits.matched_something)
-#define EVER_MATCHED_SOMETHING(R)  ((R).bits.ever_matched_something)
-
-
-/* Call this when have matched a real character; it sets `matched' flags
-   for the subexpressions which we are currently inside.  Also records
-   that those subexprs have matched.  */
-#define SET_REGS_MATCHED()                                              \
-  do                                                                    \
-    {                                                                   \
-      if (!set_regs_matched_done)                                       \
-        {                                                               \
-          active_reg_t r;                                               \
-          set_regs_matched_done = 1;                                    \
-          for (r = lowest_active_reg; r <= highest_active_reg; r++)     \
-            {                                                           \
-              MATCHED_SOMETHING (reg_info[r])                           \
-                = EVER_MATCHED_SOMETHING (reg_info[r])                  \
-                = 1;                                                    \
-            }                                                           \
-        }                                                               \
-    }                                                                   \
-  while (0)
-
-/* Registers are set to a sentinel when they haven't yet matched.  */
-static char reg_unset_dummy;
-#define REG_UNSET_VALUE (&reg_unset_dummy)
-#define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
-/* Subroutine declarations and macros for regex_compile.  */
-
-static reg_errcode_t regex_compile _RE_ARGS ((const char *pattern, size_t size,
-                                              reg_syntax_t syntax,
-                                              struct re_pattern_buffer *bufp));
-static void store_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg));
-static void store_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
-                                 int arg1, int arg2));
-static void insert_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
-                                  int arg, unsigned char *end));
-static void insert_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
-                                  int arg1, int arg2, unsigned char *end));
-static boolean at_begline_loc_p _RE_ARGS ((const char *pattern, const char *p,
-                                           reg_syntax_t syntax));
-static boolean at_endline_loc_p _RE_ARGS ((const char *p, const char *pend,
-                                           reg_syntax_t syntax));
-static reg_errcode_t compile_range _RE_ARGS ((unsigned int range_start,
-                                              const char **p_ptr,
-                                              const char *pend,
-                                              char *translate,
-                                              reg_syntax_t syntax,
-                                              unsigned char *b));
-
-/* Fetch the next character in the uncompiled pattern---translating it
-   if necessary.  Also cast from a signed character in the constant
-   string passed to us by the user to an unsigned char that we can use
-   as an array index (in, e.g., `translate').  */
-#ifndef PATFETCH
-# define PATFETCH(c)                                                    \
-  do {if (p == pend) return REG_EEND;                                   \
-    c = (unsigned char) *p++;                                           \
-    if (translate) c = (unsigned char) translate[c];                    \
-  } while (0)
-#endif
-
-/* Fetch the next character in the uncompiled pattern, with no
-   translation.  */
-#define PATFETCH_RAW(c)                                                 \
-  do {if (p == pend) return REG_EEND;                                   \
-    c = (unsigned char) *p++;                                           \
-  } while (0)
-
-/* Go backwards one character in the pattern.  */
-#define PATUNFETCH p--
-
-
-/* If `translate' is non-null, return translate[D], else just D.  We
-   cast the subscript to translate because some data is declared as
-   `char *', to avoid warnings when a string constant is passed.  But
-   when we use a character as a subscript we must make it unsigned.  */
-#ifndef TRANSLATE
-# define TRANSLATE(d) \
-  (translate ? (char) translate[(unsigned char) (d)] : (d))
-#endif
-
-
-/* Macros for outputting the compiled pattern into `buffer'.  */
-
-/* If the buffer isn't allocated when it comes in, use this.  */
-#define INIT_BUF_SIZE  32
-
-/* Make sure we have at least N more bytes of space in buffer.  */
-#define GET_BUFFER_SPACE(n)                                             \
-    while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated)  \
-      EXTEND_BUFFER ()
-
-/* Make sure we have one more byte of buffer space and then add C to it.  */
-#define BUF_PUSH(c)                                                     \
-  do {                                                                  \
-    GET_BUFFER_SPACE (1);                                               \
-    *b++ = (unsigned char) (c);                                         \
-  } while (0)
-
-
-/* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
-#define BUF_PUSH_2(c1, c2)                                              \
-  do {                                                                  \
-    GET_BUFFER_SPACE (2);                                               \
-    *b++ = (unsigned char) (c1);                                        \
-    *b++ = (unsigned char) (c2);                                        \
-  } while (0)
-
-
-/* As with BUF_PUSH_2, except for three bytes.  */
-#define BUF_PUSH_3(c1, c2, c3)                                          \
-  do {                                                                  \
-    GET_BUFFER_SPACE (3);                                               \
-    *b++ = (unsigned char) (c1);                                        \
-    *b++ = (unsigned char) (c2);                                        \
-    *b++ = (unsigned char) (c3);                                        \
-  } while (0)
-
-
-/* Store a jump with opcode OP at LOC to location TO.  We store a
-   relative address offset by the three bytes the jump itself occupies.  */
-#define STORE_JUMP(op, loc, to) \
-  store_op1 (op, loc, (int) ((to) - (loc) - 3))
-
-/* Likewise, for a two-argument jump.  */
-#define STORE_JUMP2(op, loc, to, arg) \
-  store_op2 (op, loc, (int) ((to) - (loc) - 3), arg)
-
-/* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
-#define INSERT_JUMP(op, loc, to) \
-  insert_op1 (op, loc, (int) ((to) - (loc) - 3), b)
-
-/* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
-#define INSERT_JUMP2(op, loc, to, arg) \
-  insert_op2 (op, loc, (int) ((to) - (loc) - 3), arg, b)
-
-
-/* This is not an arbitrary limit: the arguments which represent offsets
-   into the pattern are two bytes long.  So if 2^16 bytes turns out to
-   be too small, many things would have to change.  */
-/* Any other compiler which, like MSC, has allocation limit below 2^16
-   bytes will have to use approach similar to what was done below for
-   MSC and drop MAX_BUF_SIZE a bit.  Otherwise you may end up
-   reallocating to 0 bytes.  Such thing is not going to work too well.
-   You have been warned!!  */
-#if defined _MSC_VER  && !defined WIN32
-/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.
-   The REALLOC define eliminates a flurry of conversion warnings,
-   but is not required. */
-# define MAX_BUF_SIZE  65500L
-# define REALLOC(p,s) realloc ((p), (size_t) (s))
-#else
-# define MAX_BUF_SIZE (1L << 16)
-# define REALLOC(p,s) realloc ((p), (s))
-#endif
-
-/* Extend the buffer by twice its current size via realloc and
-   reset the pointers that pointed into the old block to point to the
-   correct places in the new one.  If extending the buffer results in it
-   being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
-#define EXTEND_BUFFER()                                                 \
-  do {                                                                  \
-    unsigned char *old_buffer = bufp->buffer;                           \
-    if (bufp->allocated == MAX_BUF_SIZE)                                \
-      return REG_ESIZE;                                                 \
-    bufp->allocated <<= 1;                                              \
-    if (bufp->allocated > MAX_BUF_SIZE)                                 \
-      bufp->allocated = MAX_BUF_SIZE;                                   \
-    bufp->buffer = (unsigned char *) REALLOC (bufp->buffer, bufp->allocated);\
-    if (bufp->buffer == NULL)                                           \
-      return REG_ESPACE;                                                \
-    /* If the buffer moved, move all the pointers into it.  */          \
-    if (old_buffer != bufp->buffer)                                     \
-      {                                                                 \
-        b = (b - old_buffer) + bufp->buffer;                            \
-        begalt = (begalt - old_buffer) + bufp->buffer;                  \
-        if (fixup_alt_jump)                                             \
-          fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
-        if (laststart)                                                  \
-          laststart = (laststart - old_buffer) + bufp->buffer;          \
-        if (pending_exact)                                              \
-          pending_exact = (pending_exact - old_buffer) + bufp->buffer;  \
-      }                                                                 \
-  } while (0)
-
-
-/* Since we have one byte reserved for the register number argument to
-   {start,stop}_memory, the maximum number of groups we can report
-   things about is what fits in that byte.  */
-#define MAX_REGNUM 255
-
-/* But patterns can have more than `MAX_REGNUM' registers.  We just
-   ignore the excess.  */
-typedef unsigned regnum_t;
-
-
-/* Macros for the compile stack.  */
-
-/* Since offsets can go either forwards or backwards, this type needs to
-   be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
-/* int may be not enough when sizeof(int) == 2.  */
-typedef long pattern_offset_t;
-
-typedef struct
-{
-  pattern_offset_t begalt_offset;
-  pattern_offset_t fixup_alt_jump;
-  pattern_offset_t inner_group_offset;
-  pattern_offset_t laststart_offset;
-  regnum_t regnum;
-} compile_stack_elt_t;
-
-
-typedef struct
-{
-  compile_stack_elt_t *stack;
-  unsigned size;
-  unsigned avail;                       /* Offset of next open position.  */
-} compile_stack_type;
-
-
-#define INIT_COMPILE_STACK_SIZE 32
-
-#define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
-#define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
-
-/* The next available element.  */
-#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
-
-
-/* Set the bit for character C in a list.  */
-#define SET_LIST_BIT(c)                               \
-  (b[((unsigned char) (c)) / BYTEWIDTH]               \
-   |= 1 << (((unsigned char) c) % BYTEWIDTH))
-
-
-/* Get the next unsigned number in the uncompiled pattern.  */
-#define GET_UNSIGNED_NUMBER(num)                                        \
-  { if (p != pend)                                                      \
-     {                                                                  \
-       PATFETCH (c);                                                    \
-       while ('0' <= c && c <= '9')                                     \
-         {                                                              \
-           if (num < 0)                                                 \
-              num = 0;                                                  \
-           num = num * 10 + c - '0';                                    \
-           if (p == pend)                                               \
-              break;                                                    \
-           PATFETCH (c);                                                \
-         }                                                              \
-       }                                                                \
-    }
-
-#if defined _LIBC || WIDE_CHAR_SUPPORT
-/* The GNU C library provides support for user-defined character classes
-   and the functions from ISO C amendement 1.  */
-# ifdef CHARCLASS_NAME_MAX
-#  define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
-# else
-/* This shouldn't happen but some implementation might still have this
-   problem.  Use a reasonable default value.  */
-#  define CHAR_CLASS_MAX_LENGTH 256
-# endif
-
-# ifdef _LIBC
-#  define IS_CHAR_CLASS(string) __wctype (string)
-# else
-#  define IS_CHAR_CLASS(string) wctype (string)
-# endif
-#else
-# define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
-
-# define IS_CHAR_CLASS(string)                                          \
-   (STREQ (string, "alpha") || STREQ (string, "upper")                  \
-    || STREQ (string, "lower") || STREQ (string, "digit")               \
-    || STREQ (string, "alnum") || STREQ (string, "xdigit")              \
-    || STREQ (string, "space") || STREQ (string, "print")               \
-    || STREQ (string, "punct") || STREQ (string, "graph")               \
-    || STREQ (string, "cntrl") || STREQ (string, "blank"))
-#endif
-#ifndef MATCH_MAY_ALLOCATE
-
-/* If we cannot allocate large objects within re_match_2_internal,
-   we make the fail stack and register vectors global.
-   The fail stack, we grow to the maximum size when a regexp
-   is compiled.
-   The register vectors, we adjust in size each time we
-   compile a regexp, according to the number of registers it needs.  */
-
-static fail_stack_type fail_stack;
-
-/* Size with which the following vectors are currently allocated.
-   That is so we can make them bigger as needed,
-   but never make them smaller.  */
-static int regs_allocated_size;
-
-static const char **     regstart, **     regend;
-static const char ** old_regstart, ** old_regend;
-static const char **best_regstart, **best_regend;
-static register_info_type *reg_info;
-static const char **reg_dummy;
-static register_info_type *reg_info_dummy;
-
-/* Make the register vectors big enough for NUM_REGS registers,
-   but don't make them smaller.  */
-
-static
-regex_grow_registers (num_regs)
-     int num_regs;
-{
-  if (num_regs > regs_allocated_size)
-    {
-      RETALLOC_IF (regstart,     num_regs, const char *);
-      RETALLOC_IF (regend,       num_regs, const char *);
-      RETALLOC_IF (old_regstart, num_regs, const char *);
-      RETALLOC_IF (old_regend,   num_regs, const char *);
-      RETALLOC_IF (best_regstart, num_regs, const char *);
-      RETALLOC_IF (best_regend,  num_regs, const char *);
-      RETALLOC_IF (reg_info,     num_regs, register_info_type);
-      RETALLOC_IF (reg_dummy,    num_regs, const char *);
-      RETALLOC_IF (reg_info_dummy, num_regs, register_info_type);
-
-      regs_allocated_size = num_regs;
-    }
-}
-
-#endif /* not MATCH_MAY_ALLOCATE */
-static boolean group_in_compile_stack _RE_ARGS ((compile_stack_type
-                                                 compile_stack,
-                                                 regnum_t regnum));
-
-/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
-   Returns one of error codes defined in `regex.h', or zero for success.
-
-   Assumes the `allocated' (and perhaps `buffer') and `translate'
-   fields are set in BUFP on entry.
-
-   If it succeeds, results are put in BUFP (if it returns an error, the
-   contents of BUFP are undefined):
-     `buffer' is the compiled pattern;
-     `syntax' is set to SYNTAX;
-     `used' is set to the length of the compiled pattern;
-     `fastmap_accurate' is zero;
-     `re_nsub' is the number of subexpressions in PATTERN;
-     `not_bol' and `not_eol' are zero;
-
-   The `fastmap' and `newline_anchor' fields are neither
-   examined nor set.  */
-
-/* Return, freeing storage we allocated.  */
-#define FREE_STACK_RETURN(value)                \
-  return (free (compile_stack.stack), value)
-
-static reg_errcode_t
-regex_compile (
-     const char *pattern,
-     size_t size,
-     reg_syntax_t syntax,
-     struct re_pattern_buffer *bufp)
-{
-  /* We fetch characters from PATTERN here.  Even though PATTERN is
-     `char *' (i.e., signed), we declare these variables as unsigned, so
-     they can be reliably used as array indices.  */
-  register unsigned char c, c1;
-
-  /* A random temporary spot in PATTERN.  */
-  const char *p1;
-
-  /* Points to the end of the buffer, where we should append.  */
-  register unsigned char *b;
-
-  /* Keeps track of unclosed groups.  */
-  compile_stack_type compile_stack;
-
-  /* Points to the current (ending) position in the pattern.  */
-  const char *p = pattern;
-  const char *pend = pattern + size;
-
-  /* How to translate the characters in the pattern.  */
-  RE_TRANSLATE_TYPE translate = bufp->translate;
-
-  /* Address of the count-byte of the most recently inserted `exactn'
-     command.  This makes it possible to tell if a new exact-match
-     character can be added to that command or if the character requires
-     a new `exactn' command.  */
-  unsigned char *pending_exact = 0;
-
-  /* Address of start of the most recently finished expression.
-     This tells, e.g., postfix * where to find the start of its
-     operand.  Reset at the beginning of groups and alternatives.  */
-  unsigned char *laststart = 0;
-
-  /* Address of beginning of regexp, or inside of last group.  */
-  unsigned char *begalt;
-
-  /* Place in the uncompiled pattern (i.e., the {) to
-     which to go back if the interval is invalid.  */
-  const char *beg_interval;
-
-  /* Address of the place where a forward jump should go to the end of
-     the containing expression.  Each alternative of an `or' -- except the
-     last -- ends with a forward jump of this sort.  */
-  unsigned char *fixup_alt_jump = 0;
-
-  /* Counts open-groups as they are encountered.  Remembered for the
-     matching close-group on the compile stack, so the same register
-     number is put in the stop_memory as the start_memory.  */
-  regnum_t regnum = 0;
-
-#ifdef REGEX_DEBUG
-  DEBUG_PRINT1 ("\nCompiling pattern: ");
-  if (debug)
-    {
-      unsigned debug_count;
-
-      for (debug_count = 0; debug_count < size; debug_count++)
-        putchar (pattern[debug_count]);
-      putchar ('\n');
-    }
-#endif /* REGEX_DEBUG */
-
-  /* Initialize the compile stack.  */
-  compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
-  if (compile_stack.stack == NULL)
-    return REG_ESPACE;
-
-  compile_stack.size = INIT_COMPILE_STACK_SIZE;
-  compile_stack.avail = 0;
-
-  /* Initialize the pattern buffer.  */
-  bufp->syntax = syntax;
-  bufp->fastmap_accurate = 0;
-  bufp->not_bol = bufp->not_eol = 0;
-
-  /* Set `used' to zero, so that if we return an error, the pattern
-     printer (for debugging) will think there's no pattern.  We reset it
-     at the end.  */
-  bufp->used = 0;
-
-  /* Always count groups, whether or not bufp->no_sub is set.  */
-  bufp->re_nsub = 0;
-
-#if !defined emacs && !defined SYNTAX_TABLE
-  /* Initialize the syntax table.  */
-   init_syntax_once ();
-#endif
-
-  if (bufp->allocated == 0)
-    {
-      if (bufp->buffer)
-        { /* If zero allocated, but buffer is non-null, try to realloc
-             enough space.  This loses if buffer's address is bogus, but
-             that is the user's responsibility.  */
-          RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
-        }
-      else
-        { /* Caller did not allocate a buffer.  Do it for them.  */
-          bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
-        }
-      if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE);
-
-      bufp->allocated = INIT_BUF_SIZE;
-    }
-
-  begalt = b = bufp->buffer;
-
-  /* Loop through the uncompiled pattern until we're at the end.  */
-  while (p != pend)
-    {
-      PATFETCH (c);
-
-      switch (c)
-        {
-        case '^':
-          {
-            if (   /* If at start of pattern, it's an operator.  */
-                   p == pattern + 1
-                   /* If context independent, it's an operator.  */
-                || syntax & RE_CONTEXT_INDEP_ANCHORS
-                   /* Otherwise, depends on what's come before.  */
-                || at_begline_loc_p (pattern, p, syntax))
-              BUF_PUSH (begline);
-            else
-              goto normal_char;
-          }
-          break;
-
-
-        case '$':
-          {
-            if (   /* If at end of pattern, it's an operator.  */
-                   p == pend
-                   /* If context independent, it's an operator.  */
-                || syntax & RE_CONTEXT_INDEP_ANCHORS
-                   /* Otherwise, depends on what's next.  */
-                || at_endline_loc_p (p, pend, syntax))
-               BUF_PUSH (endline);
-             else
-               goto normal_char;
-           }
-           break;
-
-
-        case '+':
-        case '?':
-          if ((syntax & RE_BK_PLUS_QM)
-              || (syntax & RE_LIMITED_OPS))
-            goto normal_char;
-        handle_plus:
-        case '*':
-          /* If there is no previous pattern... */
-          if (!laststart)
-            {
-              if (syntax & RE_CONTEXT_INVALID_OPS)
-                FREE_STACK_RETURN (REG_BADRPT);
-              else if (!(syntax & RE_CONTEXT_INDEP_OPS))
-                goto normal_char;
-            }
-
-          {
-            /* Are we optimizing this jump?  */
-            boolean keep_string_p = false;
-
-            /* 1 means zero (many) matches is allowed.  */
-            char zero_times_ok = 0, many_times_ok = 0;
-
-            /* If there is a sequence of repetition chars, collapse it
-               down to just one (the right one).  We can't combine
-               interval operators with these because of, e.g., `a{2}*',
-               which should only match an even number of `a's.  */
-
-            for (;;)
-              {
-                zero_times_ok |= c != '+';
-                many_times_ok |= c != '?';
-
-                if (p == pend)
-                  break;
-
-                PATFETCH (c);
-
-                if (c == '*'
-                    || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
-                  ;
-
-                else if (syntax & RE_BK_PLUS_QM  &&  c == '\\')
-                  {
-                    if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
-
-                    PATFETCH (c1);
-                    if (!(c1 == '+' || c1 == '?'))
-                      {
-                        PATUNFETCH;
-                        PATUNFETCH;
-                        break;
-                      }
-
-                    c = c1;
-                  }
-                else
-                  {
-                    PATUNFETCH;
-                    break;
-                  }
-
-                /* If we get here, we found another repeat character.  */
-               }
-
-            /* Star, etc. applied to an empty pattern is equivalent
-               to an empty pattern.  */
-            if (!laststart)
-              break;
-
-            /* Now we know whether or not zero matches is allowed
-               and also whether or not two or more matches is allowed.  */
-            if (many_times_ok)
-              { /* More than one repetition is allowed, so put in at the
-                   end a backward relative jump from `b' to before the next
-                   jump we're going to put in below (which jumps from
-                   laststart to after this jump).
-
-                   But if we are at the `*' in the exact sequence `.*\n',
-                   insert an unconditional jump backwards to the .,
-                   instead of the beginning of the loop.  This way we only
-                   push a failure point once, instead of every time
-                   through the loop.  */
-                assert (p - 1 > pattern);
-
-                /* Allocate the space for the jump.  */
-                GET_BUFFER_SPACE (3);
-
-                /* We know we are not at the first character of the pattern,
-                   because laststart was nonzero.  And we've already
-                   incremented `p', by the way, to be the character after
-                   the `*'.  Do we have to do something analogous here
-                   for null bytes, because of RE_DOT_NOT_NULL?  */
-                if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
-                    && zero_times_ok
-                    && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
-                    && !(syntax & RE_DOT_NEWLINE))
-                  { /* We have .*\n.  */
-                    STORE_JUMP (jump, b, laststart);
-                    keep_string_p = true;
-                  }
-                else
-                  /* Anything else.  */
-                  STORE_JUMP (maybe_pop_jump, b, laststart - 3);
-
-                /* We've added more stuff to the buffer.  */
-                b += 3;
-              }
-
-            /* On failure, jump from laststart to b + 3, which will be the
-               end of the buffer after this jump is inserted.  */
-            GET_BUFFER_SPACE (3);
-            INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
-                                       : on_failure_jump,
-                         laststart, b + 3);
-            pending_exact = 0;
-            b += 3;
-
-            if (!zero_times_ok)
-              {
-                /* At least one repetition is required, so insert a
-                   `dummy_failure_jump' before the initial
-                   `on_failure_jump' instruction of the loop. This
-                   effects a skip over that instruction the first time
-                   we hit that loop.  */
-                GET_BUFFER_SPACE (3);
-                INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
-                b += 3;
-              }
-            }
-          break;
-
-
-        case '.':
-          laststart = b;
-          BUF_PUSH (anychar);
-          break;
-
-
-        case '[':
-          {
-            boolean had_char_class = false;
-            unsigned int range_start = 0xffffffff;
-
-            if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-            /* Ensure that we have enough space to push a charset: the
-               opcode, the length count, and the bitset; 34 bytes in all.  */
-            GET_BUFFER_SPACE (34);
-
-            laststart = b;
-
-            /* We test `*p == '^' twice, instead of using an if
-               statement, so we only need one BUF_PUSH.  */
-            BUF_PUSH (*p == '^' ? charset_not : charset);
-            if (*p == '^')
-              p++;
-
-            /* Remember the first position in the bracket expression.  */
-            p1 = p;
-
-            /* Push the number of bytes in the bitmap.  */
-            BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
-
-            /* Clear the whole map.  */
-            bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
-
-            /* charset_not matches newline according to a syntax bit.  */
-            if ((re_opcode_t) b[-2] == charset_not
-                && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
-              SET_LIST_BIT ('\n');
-
-            /* Read in characters and ranges, setting map bits.  */
-            for (;;)
-              {
-                if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                PATFETCH (c);
-
-                /* \ might escape characters inside [...] and [^...].  */
-                if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
-                  {
-                    if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
-
-                    PATFETCH (c1);
-                    SET_LIST_BIT (c1);
-                    range_start = c1;
-                    continue;
-                  }
-
-                /* Could be the end of the bracket expression.  If it's
-                   not (i.e., when the bracket expression is `[]' so
-                   far), the ']' character bit gets set way below.  */
-                if (c == ']' && p != p1 + 1)
-                  break;
-
-                /* Look ahead to see if it's a range when the last thing
-                   was a character class.  */
-                if (had_char_class && c == '-' && *p != ']')
-                  FREE_STACK_RETURN (REG_ERANGE);
-
-                /* Look ahead to see if it's a range when the last thing
-                   was a character: if this is a hyphen not at the
-                   beginning or the end of a list, then it's the range
-                   operator.  */
-                if (c == '-'
-                    && !(p - 2 >= pattern && p[-2] == '[')
-                    && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
-                    && *p != ']')
-                  {
-                    reg_errcode_t ret
-                      = compile_range (range_start, &p, pend, translate,
-                                       syntax, b);
-                    if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
-                    range_start = 0xffffffff;
-                  }
-
-                else if (p[0] == '-' && p[1] != ']')
-                  { /* This handles ranges made up of characters only.  */
-                    reg_errcode_t ret;
-
-                    /* Move past the `-'.  */
-                    PATFETCH (c1);
-
-                    ret = compile_range (c, &p, pend, translate, syntax, b);
-                    if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
-                    range_start = 0xffffffff;
-                  }
-
-                /* See if we're at the beginning of a possible character
-                   class.  */
-
-                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
-                  { /* Leave room for the null.  */
-                    char str[CHAR_CLASS_MAX_LENGTH + 1];
-
-                    PATFETCH (c);
-                    c1 = 0;
-
-                    /* If pattern is `[[:'.  */
-                    if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                    for (;;)
-                      {
-                        PATFETCH (c);
-                        if ((c == ':' && *p == ']') || p == pend)
-                          break;
-                        if (c1 < CHAR_CLASS_MAX_LENGTH)
-                          str[c1++] = c;
-                        else
-                          /* This is in any case an invalid class name.  */
-                          str[0] = '\0';
-                      }
-                    str[c1] = '\0';
-
-                    /* If isn't a word bracketed by `[:' and `:]':
-                       undo the ending character, the letters, and leave
-                       the leading `:' and `[' (but set bits for them).  */
-                    if (c == ':' && *p == ']')
-                      {
-#if defined _LIBC || WIDE_CHAR_SUPPORT
-                        boolean is_lower = STREQ (str, "lower");
-                        boolean is_upper = STREQ (str, "upper");
-                        wctype_t wt;
-                        int ch;
-
-                        wt = IS_CHAR_CLASS (str);
-                        if (wt == 0)
-                          FREE_STACK_RETURN (REG_ECTYPE);
-
-                        /* Throw away the ] at the end of the character
-                           class.  */
-                        PATFETCH (c);
-
-                        if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                        for (ch = 0; ch < 1 << BYTEWIDTH; ++ch)
-                          {
-# ifdef _LIBC
-                            if (__iswctype (__btowc (ch), wt))
-                              SET_LIST_BIT (ch);
-# else
-                            if (iswctype (btowc (ch), wt))
-                              SET_LIST_BIT (ch);
-# endif
-
-                            if (translate && (is_upper || is_lower)
-                                && (ISUPPER (ch) || ISLOWER (ch)))
-                              SET_LIST_BIT (ch);
-                          }
-
-                        had_char_class = true;
-#else
-                        int ch;
-                        boolean is_alnum = STREQ (str, "alnum");
-                        boolean is_alpha = STREQ (str, "alpha");
-                        boolean is_blank = STREQ (str, "blank");
-                        boolean is_cntrl = STREQ (str, "cntrl");
-                        boolean is_digit = STREQ (str, "digit");
-                        boolean is_graph = STREQ (str, "graph");
-                        boolean is_lower = STREQ (str, "lower");
-                        boolean is_print = STREQ (str, "print");
-                        boolean is_punct = STREQ (str, "punct");
-                        boolean is_space = STREQ (str, "space");
-                        boolean is_upper = STREQ (str, "upper");
-                        boolean is_xdigit = STREQ (str, "xdigit");
-
-                        if (!IS_CHAR_CLASS (str))
-                          FREE_STACK_RETURN (REG_ECTYPE);
-
-                        /* Throw away the ] at the end of the character
-                           class.  */
-                        PATFETCH (c);
-
-                        if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                        for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
-                          {
-                            /* This was split into 3 if's to
-                               avoid an arbitrary limit in some compiler.  */
-                            if (   (is_alnum  && ISALNUM (ch))
-                                || (is_alpha  && ISALPHA (ch))
-                                || (is_blank  && ISBLANK (ch))
-                                || (is_cntrl  && ISCNTRL (ch)))
-                              SET_LIST_BIT (ch);
-                            if (   (is_digit  && ISDIGIT (ch))
-                                || (is_graph  && ISGRAPH (ch))
-                                || (is_lower  && ISLOWER (ch))
-                                || (is_print  && ISPRINT (ch)))
-                              SET_LIST_BIT (ch);
-                            if (   (is_punct  && ISPUNCT (ch))
-                                || (is_space  && ISSPACE (ch))
-                                || (is_upper  && ISUPPER (ch))
-                                || (is_xdigit && ISXDIGIT (ch)))
-                              SET_LIST_BIT (ch);
-                            if (   translate && (is_upper || is_lower)
-                                && (ISUPPER (ch) || ISLOWER (ch)))
-                              SET_LIST_BIT (ch);
-                          }
-                        had_char_class = true;
-#endif  /* libc || wctype.h */
-                      }
-                    else
-                      {
-                        c1++;
-                        while (c1--)
-                          PATUNFETCH;
-                        SET_LIST_BIT ('[');
-                        SET_LIST_BIT (':');
-                        range_start = ':';
-                        had_char_class = false;
-                      }
-                  }
-                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '=')
-                  {
-                    unsigned char str[MB_LEN_MAX + 1];
-#ifdef _LIBC
-                    uint32_t nrules =
-                      _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
-#endif
-
-                    PATFETCH (c);
-                    c1 = 0;
-
-                    /* If pattern is `[[='.  */
-                    if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                    for (;;)
-                      {
-                        PATFETCH (c);
-                        if ((c == '=' && *p == ']') || p == pend)
-                          break;
-                        if (c1 < MB_LEN_MAX)
-                          str[c1++] = c;
-                        else
-                          /* This is in any case an invalid class name.  */
-                          str[0] = '\0';
-                      }
-                    str[c1] = '\0';
-
-                    if (c == '=' && *p == ']' && str[0] != '\0')
-                      {
-                        /* If we have no collation data we use the default
-                           collation in which each character is in a class
-                           by itself.  It also means that ASCII is the
-                           character set and therefore we cannot have character
-                           with more than one byte in the multibyte
-                           representation.  */
-#ifdef _LIBC
-                        if (nrules == 0)
-#endif
-                          {
-                            if (c1 != 1)
-                              FREE_STACK_RETURN (REG_ECOLLATE);
-
-                            /* Throw away the ] at the end of the equivalence
-                               class.  */
-                            PATFETCH (c);
-
-                            /* Set the bit for the character.  */
-                            SET_LIST_BIT (str[0]);
-                          }
-#ifdef _LIBC
-                        else
-                          {
-                            /* Try to match the byte sequence in `str' against
-                               those known to the collate implementation.
-                               First find out whether the bytes in `str' are
-                               actually from exactly one character.  */
-                            const int32_t *table;
-                            const unsigned char *weights;
-                            const unsigned char *extra;
-                            const int32_t *indirect;
-                            int32_t idx;
-                            const unsigned char *cp = str;
-                            int ch;
-
-                            /* This #include defines a local function!  */
-# include <locale/weight.h>
-
-                            table = (const int32_t *)
-                              _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
-                            weights = (const unsigned char *)
-                              _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
-                            extra = (const unsigned char *)
-                              _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
-                            indirect = (const int32_t *)
-                              _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
-
-                            idx = findidx (&cp);
-                            if (idx == 0 || cp < str + c1)
-                              /* This is no valid character.  */
-                              FREE_STACK_RETURN (REG_ECOLLATE);
-
-                            /* Throw away the ] at the end of the equivalence
-                               class.  */
-                            PATFETCH (c);
-
-                            /* Now we have to go throught the whole table
-                               and find all characters which have the same
-                               first level weight.
-
-                               XXX Note that this is not entirely correct.
-                               we would have to match multibyte sequences
-                               but this is not possible with the current
-                               implementation.  */
-                            for (ch = 1; ch < 256; ++ch)
-                              /* XXX This test would have to be changed if we
-                                 would allow matching multibyte sequences.  */
-                              if (table[ch] > 0)
-                                {
-                                  int32_t idx2 = table[ch];
-                                  size_t len = weights[idx2];
-
-                                  /* Test whether the lenghts match.  */
-                                  if (weights[idx] == len)
-                                    {
-                                      /* They do.  New compare the bytes of
-                                         the weight.  */
-                                      size_t cnt = 0;
-
-                                      while (cnt < len
-                                             && (weights[idx + 1 + cnt]
-                                                 == weights[idx2 + 1 + cnt]))
-                                        ++len;
-
-                                      if (cnt == len)
-                                        /* They match.  Mark the character as
-                                           acceptable.  */
-                                        SET_LIST_BIT (ch);
-                                    }
-                                }
-                          }
-#endif
-                        had_char_class = true;
-                      }
-                    else
-                      {
-                        c1++;
-                        while (c1--)
-                          PATUNFETCH;
-                        SET_LIST_BIT ('[');
-                        SET_LIST_BIT ('=');
-                        range_start = '=';
-                        had_char_class = false;
-                      }
-                  }
-                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '.')
-                  {
-                    unsigned char str[128];     /* Should be large enough.  */
-#ifdef _LIBC
-                    uint32_t nrules =
-                      _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
-#endif
-
-                    PATFETCH (c);
-                    c1 = 0;
-
-                    /* If pattern is `[[='.  */
-                    if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                    for (;;)
-                      {
-                        PATFETCH (c);
-                        if ((c == '.' && *p == ']') || p == pend)
-                          break;
-                        if (c1 < sizeof (str))
-                          str[c1++] = c;
-                        else
-                          /* This is in any case an invalid class name.  */
-                          str[0] = '\0';
-                      }
-                    str[c1] = '\0';
-
-                    if (c == '.' && *p == ']' && str[0] != '\0')
-                      {
-                        /* If we have no collation data we use the default
-                           collation in which each character is the name
-                           for its own class which contains only the one
-                           character.  It also means that ASCII is the
-                           character set and therefore we cannot have character
-                           with more than one byte in the multibyte
-                           representation.  */
-#ifdef _LIBC
-                        if (nrules == 0)
-#endif
-                          {
-                            if (c1 != 1)
-                              FREE_STACK_RETURN (REG_ECOLLATE);
-
-                            /* Throw away the ] at the end of the equivalence
-                               class.  */
-                            PATFETCH (c);
-
-                            /* Set the bit for the character.  */
-                            SET_LIST_BIT (str[0]);
-                            range_start = ((const unsigned char *) str)[0];
-                          }
-#ifdef _LIBC
-                        else
-                          {
-                            /* Try to match the byte sequence in `str' against
-                               those known to the collate implementation.
-                               First find out whether the bytes in `str' are
-                               actually from exactly one character.  */
-                            int32_t table_size;
-                            const int32_t *symb_table;
-                            const unsigned char *extra;
-                            int32_t idx;
-                            int32_t elem;
-                            int32_t second;
-                            int32_t hash;
-
-                            table_size =
-                              _NL_CURRENT_WORD (LC_COLLATE,
-                                                _NL_COLLATE_SYMB_HASH_SIZEMB);
-                            symb_table = (const int32_t *)
-                              _NL_CURRENT (LC_COLLATE,
-                                           _NL_COLLATE_SYMB_TABLEMB);
-                            extra = (const unsigned char *)
-                              _NL_CURRENT (LC_COLLATE,
-                                           _NL_COLLATE_SYMB_EXTRAMB);
-
-                            /* Locate the character in the hashing table.  */
-                            hash = elem_hash (str, c1);
-
-                            idx = 0;
-                            elem = hash % table_size;
-                            second = hash % (table_size - 2);
-                            while (symb_table[2 * elem] != 0)
-                              {
-                                /* First compare the hashing value.  */
-                                if (symb_table[2 * elem] == hash
-                                    && c1 == extra[symb_table[2 * elem + 1]]
-                                    && memcmp (str,
-                                               &extra[symb_table[2 * elem + 1]
-                                                     + 1],
-                                               c1) == 0)
-                                  {
-                                    /* Yep, this is the entry.  */
-                                    idx = symb_table[2 * elem + 1];
-                                    idx += 1 + extra[idx];
-                                    break;
-                                  }
-
-                                /* Next entry.  */
-                                elem += second;
-                              }
-
-                            if (symb_table[2 * elem] == 0)
-                              /* This is no valid character.  */
-                              FREE_STACK_RETURN (REG_ECOLLATE);
-
-                            /* Throw away the ] at the end of the equivalence
-                               class.  */
-                            PATFETCH (c);
-
-                            /* Now add the multibyte character(s) we found
-                               to the acceptabed list.
-
-                               XXX Note that this is not entirely correct.
-                               we would have to match multibyte sequences
-                               but this is not possible with the current
-                               implementation.  Also, we have to match
-                               collating symbols, which expand to more than
-                               one file, as a whole and not allow the
-                               individual bytes.  */
-                            c1 = extra[idx++];
-                            if (c1 == 1)
-                              range_start = extra[idx];
-                            while (c1-- > 0)
-                              SET_LIST_BIT (extra[idx++]);
-                          }
-#endif
-                        had_char_class = false;
-                      }
-                    else
-                      {
-                        c1++;
-                        while (c1--)
-                          PATUNFETCH;
-                        SET_LIST_BIT ('[');
-                        SET_LIST_BIT ('.');
-                        range_start = '.';
-                        had_char_class = false;
-                      }
-                  }
-                else
-                  {
-                    had_char_class = false;
-                    SET_LIST_BIT (c);
-                    range_start = c;
-                  }
-              }
-
-            /* Discard any (non)matching list bytes that are all 0 at the
-               end of the map.  Decrease the map-length byte too.  */
-            while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
-              b[-1]--;
-            b += b[-1];
-          }
-          break;
-
-
-        case '(':
-          if (syntax & RE_NO_BK_PARENS)
-            goto handle_open;
-          else
-            goto normal_char;
-
-
-        case ')':
-          if (syntax & RE_NO_BK_PARENS)
-            goto handle_close;
-          else
-            goto normal_char;
-
-
-        case '\n':
-          if (syntax & RE_NEWLINE_ALT)
-            goto handle_alt;
-          else
-            goto normal_char;
-
-
-        case '|':
-          if (syntax & RE_NO_BK_VBAR)
-            goto handle_alt;
-          else
-            goto normal_char;
-
-
-        case '{':
-           if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
-             goto handle_interval;
-           else
-             goto normal_char;
-
-
-        case '\\':
-          if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
-
-          /* Do not translate the character after the \, so that we can
-             distinguish, e.g., \B from \b, even if we normally would
-             translate, e.g., B to b.  */
-          PATFETCH_RAW (c);
-
-          switch (c)
-            {
-            case '(':
-              if (syntax & RE_NO_BK_PARENS)
-                goto normal_backslash;
-
-            handle_open:
-              bufp->re_nsub++;
-              regnum++;
-
-              if (COMPILE_STACK_FULL)
-                {
-                  RETALLOC (compile_stack.stack, compile_stack.size << 1,
-                            compile_stack_elt_t);
-                  if (compile_stack.stack == NULL) return REG_ESPACE;
-
-                  compile_stack.size <<= 1;
-                }
-
-              /* These are the values to restore when we hit end of this
-                 group.  They are all relative offsets, so that if the
-                 whole pattern moves because of realloc, they will still
-                 be valid.  */
-              COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
-              COMPILE_STACK_TOP.fixup_alt_jump
-                = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
-              COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
-              COMPILE_STACK_TOP.regnum = regnum;
-
-              /* We will eventually replace the 0 with the number of
-                 groups inner to this one.  But do not push a
-                 start_memory for groups beyond the last one we can
-                 represent in the compiled pattern.  */
-              if (regnum <= MAX_REGNUM)
-                {
-                  COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
-                  BUF_PUSH_3 (start_memory, regnum, 0);
-                }
-
-              compile_stack.avail++;
-
-              fixup_alt_jump = 0;
-              laststart = 0;
-              begalt = b;
-              /* If we've reached MAX_REGNUM groups, then this open
-                 won't actually generate any code, so we'll have to
-                 clear pending_exact explicitly.  */
-              pending_exact = 0;
-              break;
-
-
-            case ')':
-              if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
-
-              if (COMPILE_STACK_EMPTY)
-                {
-                  if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
-                    goto normal_backslash;
-                  else
-                    FREE_STACK_RETURN (REG_ERPAREN);
-                }
-
-            handle_close:
-              if (fixup_alt_jump)
-                { /* Push a dummy failure point at the end of the
-                     alternative for a possible future
-                     `pop_failure_jump' to pop.  See comments at
-                     `push_dummy_failure' in `re_match_2'.  */
-                  BUF_PUSH (push_dummy_failure);
-
-                  /* We allocated space for this jump when we assigned
-                     to `fixup_alt_jump', in the `handle_alt' case below.  */
-                  STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
-                }
-
-              /* See similar code for backslashed left paren above.  */
-              if (COMPILE_STACK_EMPTY)
-                {
-                  if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
-                    goto normal_char;
-                  else
-                    FREE_STACK_RETURN (REG_ERPAREN);
-                }
-
-              /* Since we just checked for an empty stack above, this
-                 ``can't happen''.  */
-              assert (compile_stack.avail != 0);
-              {
-                /* We don't just want to restore into `regnum', because
-                   later groups should continue to be numbered higher,
-                   as in `(ab)c(de)' -- the second group is #2.  */
-                regnum_t this_group_regnum;
-
-                compile_stack.avail--;
-                begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
-                fixup_alt_jump
-                  = COMPILE_STACK_TOP.fixup_alt_jump
-                    ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
-                    : 0;
-                laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
-                this_group_regnum = COMPILE_STACK_TOP.regnum;
-                /* If we've reached MAX_REGNUM groups, then this open
-                   won't actually generate any code, so we'll have to
-                   clear pending_exact explicitly.  */
-                pending_exact = 0;
-
-                /* We're at the end of the group, so now we know how many
-                   groups were inside this one.  */
-                if (this_group_regnum <= MAX_REGNUM)
-                  {
-                    unsigned char *inner_group_loc
-                      = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
-
-                    *inner_group_loc = regnum - this_group_regnum;
-                    BUF_PUSH_3 (stop_memory, this_group_regnum,
-                                regnum - this_group_regnum);
-                  }
-              }
-              break;
-
-
-            case '|':                                   /* `\|'.  */
-              if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
-                goto normal_backslash;
-            handle_alt:
-              if (syntax & RE_LIMITED_OPS)
-                goto normal_char;
-
-              /* Insert before the previous alternative a jump which
-                 jumps to this alternative if the former fails.  */
-              GET_BUFFER_SPACE (3);
-              INSERT_JUMP (on_failure_jump, begalt, b + 6);
-              pending_exact = 0;
-              b += 3;
-
-              /* The alternative before this one has a jump after it
-                 which gets executed if it gets matched.  Adjust that
-                 jump so it will jump to this alternative's analogous
-                 jump (put in below, which in turn will jump to the next
-                 (if any) alternative's such jump, etc.).  The last such
-                 jump jumps to the correct final destination.  A picture:
-                          _____ _____
-                          |   | |   |
-                          |   v |   v
-                         a | b   | c
-
-                 If we are at `b', then fixup_alt_jump right now points to a
-                 three-byte space after `a'.  We'll put in the jump, set
-                 fixup_alt_jump to right after `b', and leave behind three
-                 bytes which we'll fill in when we get to after `c'.  */
-
-              if (fixup_alt_jump)
-                STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
-
-              /* Mark and leave space for a jump after this alternative,
-                 to be filled in later either by next alternative or
-                 when know we're at the end of a series of alternatives.  */
-              fixup_alt_jump = b;
-              GET_BUFFER_SPACE (3);
-              b += 3;
-
-              laststart = 0;
-              begalt = b;
-              break;
-
-
-            case '{':
-              /* If \{ is a literal.  */
-              if (!(syntax & RE_INTERVALS)
-                     /* If we're at `\{' and it's not the open-interval
-                        operator.  */
-                  || (syntax & RE_NO_BK_BRACES))
-                goto normal_backslash;
-
-            handle_interval:
-              {
-                /* If got here, then the syntax allows intervals.  */
-
-                /* At least (most) this many matches must be made.  */
-                int lower_bound = -1, upper_bound = -1;
-
-                beg_interval = p - 1;
-
-                if (p == pend)
-                  {
-                    if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
-                      goto unfetch_interval;
-                    else
-                      FREE_STACK_RETURN (REG_EBRACE);
-                  }
-
-                GET_UNSIGNED_NUMBER (lower_bound);
-
-                if (c == ',')
-                  {
-                    GET_UNSIGNED_NUMBER (upper_bound);
-                    if ((!(syntax & RE_NO_BK_BRACES) && c != '\\')
-                        || ((syntax & RE_NO_BK_BRACES) && c != '}'))
-                      FREE_STACK_RETURN (REG_BADBR);
-
-                    if (upper_bound < 0)
-                      upper_bound = RE_DUP_MAX;
-                  }
-                else
-                  /* Interval such as `{1}' => match exactly once. */
-                  upper_bound = lower_bound;
-
-                if (lower_bound < 0 || upper_bound > RE_DUP_MAX
-                    || lower_bound > upper_bound)
-                  {
-                    if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
-                      goto unfetch_interval;
-                    else
-                      FREE_STACK_RETURN (REG_BADBR);
-                  }
-
-                if (!(syntax & RE_NO_BK_BRACES))
-                  {
-                    if (c != '\\') FREE_STACK_RETURN (REG_EBRACE);
-
-                    PATFETCH (c);
-                  }
-
-                if (c != '}')
-                  {
-                    if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
-                      goto unfetch_interval;
-                    else
-                      FREE_STACK_RETURN (REG_BADBR);
-                  }
-
-                /* We just parsed a valid interval.  */
-
-                /* If it's invalid to have no preceding re.  */
-                if (!laststart)
-                  {
-                    if (syntax & RE_CONTEXT_INVALID_OPS)
-                      FREE_STACK_RETURN (REG_BADRPT);
-                    else if (syntax & RE_CONTEXT_INDEP_OPS)
-                      laststart = b;
-                    else
-                      goto unfetch_interval;
-                  }
-
-                /* If the upper bound is zero, don't want to succeed at
-                   all; jump from `laststart' to `b + 3', which will be
-                   the end of the buffer after we insert the jump.  */
-                 if (upper_bound == 0)
-                   {
-                     GET_BUFFER_SPACE (3);
-                     INSERT_JUMP (jump, laststart, b + 3);
-                     b += 3;
-                   }
-
-                 /* Otherwise, we have a nontrivial interval.  When
-                    we're all done, the pattern will look like:
-                      set_number_at <jump count> <upper bound>
-                      set_number_at <succeed_n count> <lower bound>
-                      succeed_n <after jump addr> <succeed_n count>
-                      <body of loop>
-                      jump_n <succeed_n addr> <jump count>
-                    (The upper bound and `jump_n' are omitted if
-                    `upper_bound' is 1, though.)  */
-                 else
-                   { /* If the upper bound is > 1, we need to insert
-                        more at the end of the loop.  */
-                     unsigned nbytes = 10 + (upper_bound > 1) * 10;
-
-                     GET_BUFFER_SPACE (nbytes);
-
-                     /* Initialize lower bound of the `succeed_n', even
-                        though it will be set during matching by its
-                        attendant `set_number_at' (inserted next),
-                        because `re_compile_fastmap' needs to know.
-                        Jump to the `jump_n' we might insert below.  */
-                     INSERT_JUMP2 (succeed_n, laststart,
-                                   b + 5 + (upper_bound > 1) * 5,
-                                   lower_bound);
-                     b += 5;
-
-                     /* Code to initialize the lower bound.  Insert
-                        before the `succeed_n'.  The `5' is the last two
-                        bytes of this `set_number_at', plus 3 bytes of
-                        the following `succeed_n'.  */
-                     insert_op2 (set_number_at, laststart, 5, lower_bound, b);
-                     b += 5;
-
-                     if (upper_bound > 1)
-                       { /* More than one repetition is allowed, so
-                            append a backward jump to the `succeed_n'
-                            that starts this interval.
-
-                            When we've reached this during matching,
-                            we'll have matched the interval once, so
-                            jump back only `upper_bound - 1' times.  */
-                         STORE_JUMP2 (jump_n, b, laststart + 5,
-                                      upper_bound - 1);
-                         b += 5;
-
-                         /* The location we want to set is the second
-                            parameter of the `jump_n'; that is `b-2' as
-                            an absolute address.  `laststart' will be
-                            the `set_number_at' we're about to insert;
-                            `laststart+3' the number to set, the source
-                            for the relative address.  But we are
-                            inserting into the middle of the pattern --
-                            so everything is getting moved up by 5.
-                            Conclusion: (b - 2) - (laststart + 3) + 5,
-                            i.e., b - laststart.
-
-                            We insert this at the beginning of the loop
-                            so that if we fail during matching, we'll
-                            reinitialize the bounds.  */
-                         insert_op2 (set_number_at, laststart, b - laststart,
-                                     upper_bound - 1, b);
-                         b += 5;
-                       }
-                   }
-                pending_exact = 0;
-                beg_interval = NULL;
-              }
-              break;
-
-            unfetch_interval:
-              /* If an invalid interval, match the characters as literals.  */
-               assert (beg_interval);
-               p = beg_interval;
-               beg_interval = NULL;
-
-               /* normal_char and normal_backslash need `c'.  */
-               PATFETCH (c);
-
-               if (!(syntax & RE_NO_BK_BRACES))
-                 {
-                   if (p > pattern  &&  p[-1] == '\\')
-                     goto normal_backslash;
-                 }
-               goto normal_char;
-
-#ifdef emacs
-            /* There is no way to specify the before_dot and after_dot
-               operators.  rms says this is ok.  --karl  */
-            case '=':
-              BUF_PUSH (at_dot);
-              break;
-
-            case 's':
-              laststart = b;
-              PATFETCH (c);
-              BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
-              break;
-
-            case 'S':
-              laststart = b;
-              PATFETCH (c);
-              BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
-              break;
-#endif /* emacs */
-
-
-            case 'w':
-              if (syntax & RE_NO_GNU_OPS)
-                goto normal_char;
-              laststart = b;
-              BUF_PUSH (wordchar);
-              break;
-
-
-            case 'W':
-              if (syntax & RE_NO_GNU_OPS)
-                goto normal_char;
-              laststart = b;
-              BUF_PUSH (notwordchar);
-              break;
-
-
-            case '<':
-              if (syntax & RE_NO_GNU_OPS)
-                goto normal_char;
-              BUF_PUSH (wordbeg);
-              break;
-
-            case '>':
-              if (syntax & RE_NO_GNU_OPS)
-                goto normal_char;
-              BUF_PUSH (wordend);
-              break;
-
-            case 'b':
-              if (syntax & RE_NO_GNU_OPS)
-                goto normal_char;
-              BUF_PUSH (wordbound);
-              break;
-
-            case 'B':
-              if (syntax & RE_NO_GNU_OPS)
-                goto normal_char;
-              BUF_PUSH (notwordbound);
-              break;
-
-            case '`':
-              if (syntax & RE_NO_GNU_OPS)
-                goto normal_char;
-              BUF_PUSH (begbuf);
-              break;
-
-            case '\'':
-              if (syntax & RE_NO_GNU_OPS)
-                goto normal_char;
-              BUF_PUSH (endbuf);
-              break;
-
-            case '1': case '2': case '3': case '4': case '5':
-            case '6': case '7': case '8': case '9':
-              if (syntax & RE_NO_BK_REFS)
-                goto normal_char;
-
-              c1 = c - '0';
-
-              if (c1 > regnum)
-                FREE_STACK_RETURN (REG_ESUBREG);
-
-              /* Can't back reference to a subexpression if inside of it.  */
-              if (group_in_compile_stack (compile_stack, (regnum_t) c1))
-                goto normal_char;
-
-              laststart = b;
-              BUF_PUSH_2 (duplicate, c1);
-              break;
-
-
-            case '+':
-            case '?':
-              if (syntax & RE_BK_PLUS_QM)
-                goto handle_plus;
-              else
-                goto normal_backslash;
-
-            default:
-            normal_backslash:
-              /* You might think it would be useful for \ to mean
-                 not to translate; but if we don't translate it
-                 it will never match anything.  */
-              c = TRANSLATE (c);
-              goto normal_char;
-            }
-          break;
-
-
-        default:
-        /* Expects the character in `c'.  */
-        normal_char:
-              /* If no exactn currently being built.  */
-          if (!pending_exact
-
-              /* If last exactn not at current position.  */
-              || pending_exact + *pending_exact + 1 != b
-
-              /* We have only one byte following the exactn for the count.  */
-              || *pending_exact == (1 << BYTEWIDTH) - 1
-
-              /* If followed by a repetition operator.  */
-              || *p == '*' || *p == '^'
-              || ((syntax & RE_BK_PLUS_QM)
-                  ? *p == '\\' && (p[1] == '+' || p[1] == '?')
-                  : (*p == '+' || *p == '?'))
-              || ((syntax & RE_INTERVALS)
-                  && ((syntax & RE_NO_BK_BRACES)
-                      ? *p == '{'
-                      : (p[0] == '\\' && p[1] == '{'))))
-            {
-              /* Start building a new exactn.  */
-
-              laststart = b;
-
-              BUF_PUSH_2 (exactn, 0);
-              pending_exact = b - 1;
-            }
-
-          BUF_PUSH (c);
-          (*pending_exact)++;
-          break;
-        } /* switch (c) */
-    } /* while p != pend */
-
-
-  /* Through the pattern now.  */
-
-  if (fixup_alt_jump)
-    STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
-
-  if (!COMPILE_STACK_EMPTY)
-    FREE_STACK_RETURN (REG_EPAREN);
-
-  /* If we don't want backtracking, force success
-     the first time we reach the end of the compiled pattern.  */
-  if (syntax & RE_NO_POSIX_BACKTRACKING)
-    BUF_PUSH (succeed);
-
-  free (compile_stack.stack);
-
-  /* We have succeeded; set the length of the buffer.  */
-  bufp->used = b - bufp->buffer;
-
-#ifdef REGEX_DEBUG
-  if (debug)
-    {
-      DEBUG_PRINT1 ("\nCompiled pattern: \n");
-      print_compiled_pattern (bufp);
-    }
-#endif /* REGEX_DEBUG */
-
-#ifndef MATCH_MAY_ALLOCATE
-  /* Initialize the failure stack to the largest possible stack.  This
-     isn't necessary unless we're trying to avoid calling alloca in
-     the search and match routines.  */
-  {
-    int num_regs = bufp->re_nsub + 1;
-
-    /* Since DOUBLE_FAIL_STACK refuses to double only if the current size
-       is strictly greater than re_max_failures, the largest possible stack
-       is 2 * re_max_failures failure points.  */
-    if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS))
-      {
-        fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS);
-
-# ifdef emacs
-        if (! fail_stack.stack)
-          fail_stack.stack
-            = (fail_stack_elt_t *) xmalloc (fail_stack.size
-                                            * sizeof (fail_stack_elt_t));
-        else
-          fail_stack.stack
-            = (fail_stack_elt_t *) xrealloc (fail_stack.stack,
-                                             (fail_stack.size
-                                              * sizeof (fail_stack_elt_t)));
-# else /* not emacs */
-        if (! fail_stack.stack)
-          fail_stack.stack
-            = (fail_stack_elt_t *) malloc (fail_stack.size
-                                           * sizeof (fail_stack_elt_t));
-        else
-          fail_stack.stack
-            = (fail_stack_elt_t *) realloc (fail_stack.stack,
-                                            (fail_stack.size
-                                             * sizeof (fail_stack_elt_t)));
-# endif /* not emacs */
-      }
-
-    regex_grow_registers (num_regs);
-  }
-#endif /* not MATCH_MAY_ALLOCATE */
-
-  return REG_NOERROR;
-} /* regex_compile */
-/* Subroutines for `regex_compile'.  */
-
-/* Store OP at LOC followed by two-byte integer parameter ARG.  */
-
-static void
-store_op1 (
-    re_opcode_t op,
-    unsigned char *loc,
-    int arg)
-{
-  *loc = (unsigned char) op;
-  STORE_NUMBER (loc + 1, arg);
-}
-
-
-/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
-
-static void
-store_op2 (
-    re_opcode_t op,
-    unsigned char *loc,
-    int arg1, int arg2)
-{
-  *loc = (unsigned char) op;
-  STORE_NUMBER (loc + 1, arg1);
-  STORE_NUMBER (loc + 3, arg2);
-}
-
-
-/* Copy the bytes from LOC to END to open up three bytes of space at LOC
-   for OP followed by two-byte integer parameter ARG.  */
-
-static void
-insert_op1 (
-    re_opcode_t op,
-    unsigned char *loc,
-    int arg,
-    unsigned char *end) 
-{
-  register unsigned char *pfrom = end;
-  register unsigned char *pto = end + 3;
-
-  while (pfrom != loc)
-    *--pto = *--pfrom;
-
-  store_op1 (op, loc, arg);
-}
-
-
-/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
-
-static void
-insert_op2 (
-    re_opcode_t op,
-    unsigned char *loc,
-    int arg1, int arg2,
-    unsigned char *end)
-{
-  register unsigned char *pfrom = end;
-  register unsigned char *pto = end + 5;
-
-  while (pfrom != loc)
-    *--pto = *--pfrom;
-
-  store_op2 (op, loc, arg1, arg2);
-}
-
-
-/* P points to just after a ^ in PATTERN.  Return true if that ^ comes
-   after an alternative or a begin-subexpression.  We assume there is at
-   least one character before the ^.  */
-
-static boolean
-at_begline_loc_p (
-    const char *pattern, const char *p,
-    reg_syntax_t syntax)
-{
-  const char *prev = p - 2;
-  boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
-
-  return
-       /* After a subexpression?  */
-       (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
-       /* After an alternative?  */
-    || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
-}
-
-
-/* The dual of at_begline_loc_p.  This one is for $.  We assume there is
-   at least one character after the $, i.e., `P < PEND'.  */
-
-static boolean
-at_endline_loc_p (
-    const char *p, const char *pend,
-    reg_syntax_t syntax)
-{
-  const char *next = p;
-  boolean next_backslash = *next == '\\';
-  const char *next_next = p + 1 < pend ? p + 1 : 0;
-
-  return
-       /* Before a subexpression?  */
-       (syntax & RE_NO_BK_PARENS ? *next == ')'
-        : next_backslash && next_next && *next_next == ')')
-       /* Before an alternative?  */
-    || (syntax & RE_NO_BK_VBAR ? *next == '|'
-        : next_backslash && next_next && *next_next == '|');
-}
-
-
-/* Returns true if REGNUM is in one of COMPILE_STACK's elements and
-   false if it's not.  */
-
-static boolean
-group_in_compile_stack (
-    compile_stack_type compile_stack,
-    regnum_t regnum)
-{
-  int this_element;
-
-  for (this_element = compile_stack.avail - 1;
-       this_element >= 0;
-       this_element--)
-    if (compile_stack.stack[this_element].regnum == regnum)
-      return true;
-
-  return false;
-}
-
-
-/* Read the ending character of a range (in a bracket expression) from the
-   uncompiled pattern *P_PTR (which ends at PEND).  We assume the
-   starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
-   Then we set the translation of all bits between the starting and
-   ending characters (inclusive) in the compiled pattern B.
-
-   Return an error code.
-
-   We use these short variable names so we can use the same macros as
-   `regex_compile' itself.  */
-
-static reg_errcode_t
-compile_range (
-     unsigned int range_start_char,
-     const char **p_ptr, const char *pend,
-     RE_TRANSLATE_TYPE translate,
-     reg_syntax_t syntax,
-     unsigned char *b)
-{
-  unsigned this_char;
-
-  const char *p = *p_ptr;
-  reg_errcode_t ret;
-  char range_start[2];
-  char range_end[2];
-  char ch[2];
-
-  if (p == pend)
-    return REG_ERANGE;
-
-  /* Fetch the endpoints without translating them; the
-     appropriate translation is done in the bit-setting loop below.  */
-  range_start[0] = range_start_char;
-  range_start[1] = '\0';
-  range_end[0] = p[0];
-  range_end[1] = '\0';
-
-  /* Have to increment the pointer into the pattern string, so the
-     caller isn't still at the ending character.  */
-  (*p_ptr)++;
-
-  /* Report an error if the range is empty and the syntax prohibits this.  */
-  ret = syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
-
-  /* Here we see why `this_char' has to be larger than an `unsigned
-     char' -- we would otherwise go into an infinite loop, since all
-     characters <= 0xff.  */
-  ch[1] = '\0';
-  for (this_char = 0; this_char <= (unsigned char) -1; ++this_char)
-    {
-      ch[0] = this_char;
-      if (strcoll (range_start, ch) <= 0 && strcoll (ch, range_end) <= 0)
-        {
-          SET_LIST_BIT (TRANSLATE (this_char));
-          ret = REG_NOERROR;
-        }
-    }
-
-  return ret;
-}
-/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
-   BUFP.  A fastmap records which of the (1 << BYTEWIDTH) possible
-   characters can start a string that matches the pattern.  This fastmap
-   is used by re_search to skip quickly over impossible starting points.
-
-   The caller must supply the address of a (1 << BYTEWIDTH)-byte data
-   area as BUFP->fastmap.
-
-   We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
-   the pattern buffer.
-
-   Returns 0 if we succeed, -2 if an internal error.   */
-
-int
-re_compile_fastmap (
-     struct re_pattern_buffer *bufp)
-{
-  int j, k;
-#ifdef MATCH_MAY_ALLOCATE
-  fail_stack_type fail_stack;
-#endif
-#ifndef REGEX_MALLOC
-  char *destination;
-#endif
-
-  register char *fastmap = bufp->fastmap;
-  unsigned char *pattern = bufp->buffer;
-  unsigned char *p = pattern;
-  register unsigned char *pend = pattern + bufp->used;
-
-#ifdef REL_ALLOC
-  /* This holds the pointer to the failure stack, when
-     it is allocated relocatably.  */
-  fail_stack_elt_t *failure_stack_ptr;
-#endif
-
-  /* Assume that each path through the pattern can be null until
-     proven otherwise.  We set this false at the bottom of switch
-     statement, to which we get only if a particular path doesn't
-     match the empty string.  */
-  boolean path_can_be_null = true;
-
-  /* We aren't doing a `succeed_n' to begin with.  */
-  boolean succeed_n_p = false;
-
-  assert (fastmap != NULL && p != NULL);
-
-  INIT_FAIL_STACK ();
-  bzero (fastmap, 1 << BYTEWIDTH);  /* Assume nothing's valid.  */
-  bufp->fastmap_accurate = 1;       /* It will be when we're done.  */
-  bufp->can_be_null = 0;
-
-  while (1)
-    {
-      if (p == pend || *p == succeed)
-        {
-          /* We have reached the (effective) end of pattern.  */
-          if (!FAIL_STACK_EMPTY ())
-            {
-              bufp->can_be_null |= path_can_be_null;
-
-              /* Reset for next path.  */
-              path_can_be_null = true;
-
-              p = fail_stack.stack[--fail_stack.avail].pointer;
-
-              continue;
-            }
-          else
-            break;
-        }
-
-      /* We should never be about to go beyond the end of the pattern.  */
-      assert (p < pend);
-
-      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
-        {
-
-        /* I guess the idea here is to simply not bother with a fastmap
-           if a backreference is used, since it's too hard to figure out
-           the fastmap for the corresponding group.  Setting
-           `can_be_null' stops `re_search_2' from using the fastmap, so
-           that is all we do.  */
-        case duplicate:
-          bufp->can_be_null = 1;
-          goto done;
-
-
-      /* Following are the cases which match a character.  These end
-         with `break'.  */
-
-        case exactn:
-          fastmap[p[1]] = 1;
-          break;
-
-
-        case charset:
-          for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
-            if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
-              fastmap[j] = 1;
-          break;
-
-
-        case charset_not:
-          /* Chars beyond end of map must be allowed.  */
-          for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
-            fastmap[j] = 1;
-
-          for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
-            if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
-              fastmap[j] = 1;
-          break;
-
-
-        case wordchar:
-          for (j = 0; j < (1 << BYTEWIDTH); j++)
-            if (SYNTAX (j) == Sword)
-              fastmap[j] = 1;
-          break;
-
-
-        case notwordchar:
-          for (j = 0; j < (1 << BYTEWIDTH); j++)
-            if (SYNTAX (j) != Sword)
-              fastmap[j] = 1;
-          break;
-
-
-        case anychar:
-          {
-            int fastmap_newline = fastmap['\n'];
-
-            /* `.' matches anything ...  */
-            for (j = 0; j < (1 << BYTEWIDTH); j++)
-              fastmap[j] = 1;
-
-            /* ... except perhaps newline.  */
-            if (!(bufp->syntax & RE_DOT_NEWLINE))
-              fastmap['\n'] = fastmap_newline;
-
-            /* Return if we have already set `can_be_null'; if we have,
-               then the fastmap is irrelevant.  Something's wrong here.  */
-            else if (bufp->can_be_null)
-              goto done;
-
-            /* Otherwise, have to check alternative paths.  */
-            break;
-          }
-
-#ifdef emacs
-        case syntaxspec:
-          k = *p++;
-          for (j = 0; j < (1 << BYTEWIDTH); j++)
-            if (SYNTAX (j) == (enum syntaxcode) k)
-              fastmap[j] = 1;
-          break;
-
-
-        case notsyntaxspec:
-          k = *p++;
-          for (j = 0; j < (1 << BYTEWIDTH); j++)
-            if (SYNTAX (j) != (enum syntaxcode) k)
-              fastmap[j] = 1;
-          break;
-
-
-      /* All cases after this match the empty string.  These end with
-         `continue'.  */
-
-
-        case before_dot:
-        case at_dot:
-        case after_dot:
-          continue;
-#endif /* emacs */
-
-
-        case no_op:
-        case begline:
-        case endline:
-        case begbuf:
-        case endbuf:
-        case wordbound:
-        case notwordbound:
-        case wordbeg:
-        case wordend:
-        case push_dummy_failure:
-          continue;
-
-
-        case jump_n:
-        case pop_failure_jump:
-        case maybe_pop_jump:
-        case jump:
-        case jump_past_alt:
-        case dummy_failure_jump:
-          EXTRACT_NUMBER_AND_INCR (j, p);
-          p += j;
-          if (j > 0)
-            continue;
-
-          /* Jump backward implies we just went through the body of a
-             loop and matched nothing.  Opcode jumped to should be
-             `on_failure_jump' or `succeed_n'.  Just treat it like an
-             ordinary jump.  For a * loop, it has pushed its failure
-             point already; if so, discard that as redundant.  */
-          if ((re_opcode_t) *p != on_failure_jump
-              && (re_opcode_t) *p != succeed_n)
-            continue;
-
-          p++;
-          EXTRACT_NUMBER_AND_INCR (j, p);
-          p += j;
-
-          /* If what's on the stack is where we are now, pop it.  */
-          if (!FAIL_STACK_EMPTY ()
-              && fail_stack.stack[fail_stack.avail - 1].pointer == p)
-            fail_stack.avail--;
-
-          continue;
-
-
-        case on_failure_jump:
-        case on_failure_keep_string_jump:
-        handle_on_failure_jump:
-          EXTRACT_NUMBER_AND_INCR (j, p);
-
-          /* For some patterns, e.g., `(a?)?', `p+j' here points to the
-             end of the pattern.  We don't want to push such a point,
-             since when we restore it above, entering the switch will
-             increment `p' past the end of the pattern.  We don't need
-             to push such a point since we obviously won't find any more
-             fastmap entries beyond `pend'.  Such a pattern can match
-             the null string, though.  */
-          if (p + j < pend)
-            {
-              if (!PUSH_PATTERN_OP (p + j, fail_stack))
-                {
-                  RESET_FAIL_STACK ();
-                  return -2;
-                }
-            }
-          else
-            bufp->can_be_null = 1;
-
-          if (succeed_n_p)
-            {
-              EXTRACT_NUMBER_AND_INCR (k, p);   /* Skip the n.  */
-              succeed_n_p = false;
-            }
-
-          continue;
-
-
-        case succeed_n:
-          /* Get to the number of times to succeed.  */
-          p += 2;
-
-          /* Increment p past the n for when k != 0.  */
-          EXTRACT_NUMBER_AND_INCR (k, p);
-          if (k == 0)
-            {
-              p -= 4;
-              succeed_n_p = true;  /* Spaghetti code alert.  */
-              goto handle_on_failure_jump;
-            }
-          continue;
-
-
-        case set_number_at:
-          p += 4;
-          continue;
-
-
-        case start_memory:
-        case stop_memory:
-          p += 2;
-          continue;
-
-
-        default:
-          abort (); /* We have listed all the cases.  */
-        } /* switch *p++ */
-
-      /* Getting here means we have found the possible starting
-         characters for one path of the pattern -- and that the empty
-         string does not match.  We need not follow this path further.
-         Instead, look at the next alternative (remembered on the
-         stack), or quit if no more.  The test at the top of the loop
-         does these things.  */
-      path_can_be_null = false;
-      p = pend;
-    } /* while p */
-
-  /* Set `can_be_null' for the last path (also the first path, if the
-     pattern is empty).  */
-  bufp->can_be_null |= path_can_be_null;
-
- done:
-  RESET_FAIL_STACK ();
-  return 0;
-} /* re_compile_fastmap */
-#ifdef _LIBC
-weak_alias (__re_compile_fastmap, re_compile_fastmap)
-#endif
-/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
-   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
-   this memory for recording register information.  STARTS and ENDS
-   must be allocated using the malloc library routine, and must each
-   be at least NUM_REGS * sizeof (regoff_t) bytes long.
-
-   If NUM_REGS == 0, then subsequent matches should allocate their own
-   register data.
-
-   Unless this function is called, the first search or match using
-   PATTERN_BUFFER will allocate its own register data, without
-   freeing the old data.  */
-
-void
-re_set_registers (
-    struct re_pattern_buffer *bufp,
-    struct re_registers *regs,
-    unsigned num_regs,
-    regoff_t *starts, regoff_t *ends)
-{
-  if (num_regs)
-    {
-      bufp->regs_allocated = REGS_REALLOCATE;
-      regs->num_regs = num_regs;
-      regs->start = starts;
-      regs->end = ends;
-    }
-  else
-    {
-      bufp->regs_allocated = REGS_UNALLOCATED;
-      regs->num_regs = 0;
-      regs->start = regs->end = (regoff_t *) 0;
-    }
-}
-#ifdef _LIBC
-weak_alias (__re_set_registers, re_set_registers)
-#endif
-/* Searching routines.  */
-
-/* Like re_search_2, below, but only one string is specified, and
-   doesn't let you say where to stop matching. */
-
-int
-re_search (
-     struct re_pattern_buffer *bufp,
-     const char *string,
-     int size, int startpos, int range,
-     struct re_registers *regs)
-{
-  return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
-                      regs, size);
-}
-#ifdef _LIBC
-weak_alias (__re_search, re_search)
-#endif
-
-
-/* Using the compiled pattern in BUFP->buffer, first tries to match the
-   virtual concatenation of STRING1 and STRING2, starting first at index
-   STARTPOS, then at STARTPOS + 1, and so on.
-
-   STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
-
-   RANGE is how far to scan while trying to match.  RANGE = 0 means try
-   only at STARTPOS; in general, the last start tried is STARTPOS +
-   RANGE.
-
-   In REGS, return the indices of the virtual concatenation of STRING1
-   and STRING2 that matched the entire BUFP->buffer and its contained
-   subexpressions.
-
-   Do not consider matching one past the index STOP in the virtual
-   concatenation of STRING1 and STRING2.
-
-   We return either the position in the strings at which the match was
-   found, -1 if no match, or -2 if error (such as failure
-   stack overflow).  */
-
-int
-re_search_2 (
-     struct re_pattern_buffer *bufp,
-     const char *string1, const char *string2,
-     int size1, int size2,
-     int startpos,
-     int range,
-     struct re_registers *regs,
-     int stop)
-{
-  int val;
-  register char *fastmap = bufp->fastmap;
-  register RE_TRANSLATE_TYPE translate = bufp->translate;
-  int total_size = size1 + size2;
-  int endpos = startpos + range;
-
-  /* Check for out-of-range STARTPOS.  */
-  if (startpos < 0 || startpos > total_size)
-    return -1;
-
-  /* Fix up RANGE if it might eventually take us outside
-     the virtual concatenation of STRING1 and STRING2.
-     Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE.  */
-  if (endpos < 0)
-    range = 0 - startpos;
-  else if (endpos > total_size)
-    range = total_size - startpos;
-
-  /* If the search isn't to be a backwards one, don't waste time in a
-     search for a pattern that must be anchored.  */
-  if (bufp->used > 0 && range > 0
-      && ((re_opcode_t) bufp->buffer[0] == begbuf
-          /* `begline' is like `begbuf' if it cannot match at newlines.  */
-          || ((re_opcode_t) bufp->buffer[0] == begline
-              && !bufp->newline_anchor)))
-    {
-      if (startpos > 0)
-        return -1;
-      else
-        range = 1;
-    }
-
-#ifdef emacs
-  /* In a forward search for something that starts with \=.
-     don't keep searching past point.  */
-  if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0)
-    {
-      range = PT - startpos;
-      if (range <= 0)
-        return -1;
-    }
-#endif /* emacs */
-
-  /* Update the fastmap now if not correct already.  */
-  if (fastmap && !bufp->fastmap_accurate)
-    if (re_compile_fastmap (bufp) == -2)
-      return -2;
-
-  /* Loop through the string, looking for a place to start matching.  */
-  for (;;)
-    {
-      /* If a fastmap is supplied, skip quickly over characters that
-         cannot be the start of a match.  If the pattern can match the
-         null string, however, we don't need to skip characters; we want
-         the first null string.  */
-      if (fastmap && startpos < total_size && !bufp->can_be_null)
-        {
-          if (range > 0)        /* Searching forwards.  */
-            {
-              register const char *d;
-              register int lim = 0;
-              int irange = range;
-
-              if (startpos < size1 && startpos + range >= size1)
-                lim = range - (size1 - startpos);
-
-              d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
-
-              /* Written out as an if-else to avoid testing `translate'
-                 inside the loop.  */
-              if (translate)
-                while (range > lim
-                       && !fastmap[(unsigned char)
-                                   translate[(unsigned char) *d++]])
-                  range--;
-              else
-                while (range > lim && !fastmap[(unsigned char) *d++])
-                  range--;
-
-              startpos += irange - range;
-            }
-          else                          /* Searching backwards.  */
-            {
-              register char c = (size1 == 0 || startpos >= size1
-                                 ? string2[startpos - size1]
-                                 : string1[startpos]);
-
-              if (!fastmap[(unsigned char) TRANSLATE (c)])
-                goto advance;
-            }
-        }
-
-      /* If can't match the null string, and that's all we have left, fail.  */
-      if (range >= 0 && startpos == total_size && fastmap
-          && !bufp->can_be_null)
-        return -1;
-
-      val = re_match_2_internal (bufp, string1, size1, string2, size2,
-                                 startpos, regs, stop);
-#ifndef REGEX_MALLOC
-# ifdef C_ALLOCA
-      alloca (0);
-# endif
-#endif
-
-      if (val >= 0)
-        return startpos;
-
-      if (val == -2)
-        return -2;
-
-    advance:
-      if (!range)
-        break;
-      else if (range > 0)
-        {
-          range--;
-          startpos++;
-        }
-      else
-        {
-          range++;
-          startpos--;
-        }
-    }
-  return -1;
-} /* re_search_2 */
-#ifdef _LIBC
-weak_alias (__re_search_2, re_search_2)
-#endif
-/* This converts PTR, a pointer into one of the search strings `string1'
-   and `string2' into an offset from the beginning of that string.  */
-#define POINTER_TO_OFFSET(ptr)                  \
-  (FIRST_STRING_P (ptr)                         \
-   ? ((regoff_t) ((ptr) - string1))             \
-   : ((regoff_t) ((ptr) - string2 + size1)))
-
-/* Macros for dealing with the split strings in re_match_2.  */
-
-#define MATCHING_IN_FIRST_STRING  (dend == end_match_1)
-
-/* Call before fetching a character with *d.  This switches over to
-   string2 if necessary.  */
-#define PREFETCH()                                                      \
-  while (d == dend)                                                     \
-    {                                                                   \
-      /* End of string2 => fail.  */                                    \
-      if (dend == end_match_2)                                          \
-        goto fail;                                                      \
-      /* End of string1 => advance to string2.  */                      \
-      d = string2;                                                      \
-      dend = end_match_2;                                               \
-    }
-
-
-/* Test if at very beginning or at very end of the virtual concatenation
-   of `string1' and `string2'.  If only one string, it's `string2'.  */
-#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
-#define AT_STRINGS_END(d) ((d) == end2)
-
-
-/* Test if D points to a character which is word-constituent.  We have
-   two special cases to check for: if past the end of string1, look at
-   the first character in string2; and if before the beginning of
-   string2, look at the last character in string1.  */
-#define WORDCHAR_P(d)                                                   \
-  (SYNTAX ((d) == end1 ? *string2                                       \
-           : (d) == string2 - 1 ? *(end1 - 1) : *(d))                   \
-   == Sword)
-
-/* Disabled due to a compiler bug -- see comment at case wordbound */
-#if 0
-/* Test if the character before D and the one at D differ with respect
-   to being word-constituent.  */
-#define AT_WORD_BOUNDARY(d)                                             \
-  (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)                             \
-   || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
-#endif
-
-/* Free everything we malloc.  */
-#ifdef MATCH_MAY_ALLOCATE
-# define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL
-# define FREE_VARIABLES()                                               \
-  do {                                                                  \
-    REGEX_FREE_STACK (fail_stack.stack);                                \
-    FREE_VAR (regstart);                                                \
-    FREE_VAR (regend);                                                  \
-    FREE_VAR (old_regstart);                                            \
-    FREE_VAR (old_regend);                                              \
-    FREE_VAR (best_regstart);                                           \
-    FREE_VAR (best_regend);                                             \
-    FREE_VAR (reg_info);                                                \
-    FREE_VAR (reg_dummy);                                               \
-    FREE_VAR (reg_info_dummy);                                          \
-  } while (0)
-#else
-# define FREE_VARIABLES() ((void)0) /* Do nothing!  But inhibit gcc warning. */
-#endif /* not MATCH_MAY_ALLOCATE */
-
-/* These values must meet several constraints.  They must not be valid
-   register values; since we have a limit of 255 registers (because
-   we use only one byte in the pattern for the register number), we can
-   use numbers larger than 255.  They must differ by 1, because of
-   NUM_FAILURE_ITEMS above.  And the value for the lowest register must
-   be larger than the value for the highest register, so we do not try
-   to actually save any registers when none are active.  */
-#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
-#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
-/* Matching routines.  */
-
-#ifndef emacs   /* Emacs never uses this.  */
-/* re_match is like re_match_2 except it takes only a single string.  */
-
-int
-re_match (
-     struct re_pattern_buffer *bufp,
-     const char *string,
-     int size, int pos,
-     struct re_registers *regs)
-{
-  int result = re_match_2_internal (bufp, NULL, 0, string, size,
-                                    pos, regs, size);
-# ifndef REGEX_MALLOC
-#  ifdef C_ALLOCA
-  alloca (0);
-#  endif
-# endif
-  return result;
-}
-# ifdef _LIBC
-weak_alias (__re_match, re_match)
-# endif
-#endif /* not emacs */
-
-static boolean group_match_null_string_p _RE_ARGS ((unsigned char **p,
-                                                    unsigned char *end,
-                                                register_info_type *reg_info));
-static boolean alt_match_null_string_p _RE_ARGS ((unsigned char *p,
-                                                  unsigned char *end,
-                                                register_info_type *reg_info));
-static boolean common_op_match_null_string_p _RE_ARGS ((unsigned char **p,
-                                                        unsigned char *end,
-                                                register_info_type *reg_info));
-static int bcmp_translate _RE_ARGS ((const char *s1, const char *s2,
-                                     int len, char *translate));
-
-/* re_match_2 matches the compiled pattern in BUFP against the
-   the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
-   and SIZE2, respectively).  We start matching at POS, and stop
-   matching at STOP.
-
-   If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
-   store offsets for the substring each group matched in REGS.  See the
-   documentation for exactly how many groups we fill.
-
-   We return -1 if no match, -2 if an internal error (such as the
-   failure stack overflowing).  Otherwise, we return the length of the
-   matched substring.  */
-
-int re_match_2 (
-     struct re_pattern_buffer *bufp,
-     const char *string1, const char *string2,
-     int size1, int size2,
-     int pos,
-     struct re_registers *regs,
-     int stop)
-{
-  int result = re_match_2_internal (bufp, string1, size1, string2, size2,
-                                    pos, regs, stop);
-#ifndef REGEX_MALLOC
-# ifdef C_ALLOCA
-  alloca (0);
-# endif
-#endif
-  return result;
-}
-#ifdef _LIBC
-weak_alias (__re_match_2, re_match_2)
-#endif
-
-/* This is a separate function so that we can force an alloca cleanup
-   afterwards.  */
-static int re_match_2_internal (
-     struct re_pattern_buffer *bufp,
-     const char *string1, int size1,
-     const char *string2, int size2,
-     int pos,
-     struct re_registers *regs,
-     int stop)
-{
-  /* General temporaries.  */
-  int mcnt;
-  unsigned char *p1;
-
-  /* Just past the end of the corresponding string.  */
-  const char *end1, *end2;
-
-  /* Pointers into string1 and string2, just past the last characters in
-     each to consider matching.  */
-  const char *end_match_1, *end_match_2;
-
-  /* Where we are in the data, and the end of the current string.  */
-  const char *d, *dend;
-
-  /* Where we are in the pattern, and the end of the pattern.  */
-  unsigned char *p = bufp->buffer;
-  register unsigned char *pend = p + bufp->used;
-
-  /* Mark the opcode just after a start_memory, so we can test for an
-     empty subpattern when we get to the stop_memory.  */
-  unsigned char *just_past_start_mem = 0;
-
-  /* We use this to map every character in the string.  */
-  RE_TRANSLATE_TYPE translate = bufp->translate;
-
-  /* Failure point stack.  Each place that can handle a failure further
-     down the line pushes a failure point on this stack.  It consists of
-     restart, regend, and reg_info for all registers corresponding to
-     the subexpressions we're currently inside, plus the number of such
-     registers, and, finally, two char *'s.  The first char * is where
-     to resume scanning the pattern; the second one is where to resume
-     scanning the strings.  If the latter is zero, the failure point is
-     a ``dummy''; if a failure happens and the failure point is a dummy,
-     it gets discarded and the next next one is tried.  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
-  fail_stack_type fail_stack;
-#endif
-#ifdef REGEX_DEBUG
-  static unsigned failure_id;
-  unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
-#endif
-
-#ifdef REL_ALLOC
-  /* This holds the pointer to the failure stack, when
-     it is allocated relocatably.  */
-  fail_stack_elt_t *failure_stack_ptr;
-#endif
-
-  /* We fill all the registers internally, independent of what we
-     return, for use in backreferences.  The number here includes
-     an element for register zero.  */
-  size_t num_regs = bufp->re_nsub + 1;
-
-  /* The currently active registers.  */
-  active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG;
-  active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG;
-
-  /* Information on the contents of registers. These are pointers into
-     the input strings; they record just what was matched (on this
-     attempt) by a subexpression part of the pattern, that is, the
-     regnum-th regstart pointer points to where in the pattern we began
-     matching and the regnum-th regend points to right after where we
-     stopped matching the regnum-th subexpression.  (The zeroth register
-     keeps track of what the whole pattern matches.)  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  const char **regstart, **regend;
-#endif
-
-  /* If a group that's operated upon by a repetition operator fails to
-     match anything, then the register for its start will need to be
-     restored because it will have been set to wherever in the string we
-     are when we last see its open-group operator.  Similarly for a
-     register's end.  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  const char **old_regstart, **old_regend;
-#endif
-
-  /* The is_active field of reg_info helps us keep track of which (possibly
-     nested) subexpressions we are currently in. The matched_something
-     field of reg_info[reg_num] helps us tell whether or not we have
-     matched any of the pattern so far this time through the reg_num-th
-     subexpression.  These two fields get reset each time through any
-     loop their register is in.  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
-  register_info_type *reg_info;
-#endif
-
-  /* The following record the register info as found in the above
-     variables when we find a match better than any we've seen before.
-     This happens as we backtrack through the failure points, which in
-     turn happens only if we have not yet matched the entire string. */
-  unsigned best_regs_set = false;
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  const char **best_regstart, **best_regend;
-#endif
-
-  /* Logically, this is `best_regend[0]'.  But we don't want to have to
-     allocate space for that if we're not allocating space for anything
-     else (see below).  Also, we never need info about register 0 for
-     any of the other register vectors, and it seems rather a kludge to
-     treat `best_regend' differently than the rest.  So we keep track of
-     the end of the best match so far in a separate variable.  We
-     initialize this to NULL so that when we backtrack the first time
-     and need to test it, it's not garbage.  */
-  const char *match_end = NULL;
-
-  /* This helps SET_REGS_MATCHED avoid doing redundant work.  */
-  int set_regs_matched_done = 0;
-
-  /* Used when we pop values we don't care about.  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  const char **reg_dummy;
-  register_info_type *reg_info_dummy;
-#endif
-
-#ifdef REGEX_DEBUG
-  /* Counts the total number of registers pushed.  */
-  unsigned num_regs_pushed = 0;
-#endif
-
-  DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
-
-  INIT_FAIL_STACK ();
-
-#ifdef MATCH_MAY_ALLOCATE
-  /* Do not bother to initialize all the register variables if there are
-     no groups in the pattern, as it takes a fair amount of time.  If
-     there are groups, we include space for register 0 (the whole
-     pattern), even though we never use it, since it simplifies the
-     array indexing.  We should fix this.  */
-  if (bufp->re_nsub)
-    {
-      regstart = REGEX_TALLOC (num_regs, const char *);
-      regend = REGEX_TALLOC (num_regs, const char *);
-      old_regstart = REGEX_TALLOC (num_regs, const char *);
-      old_regend = REGEX_TALLOC (num_regs, const char *);
-      best_regstart = REGEX_TALLOC (num_regs, const char *);
-      best_regend = REGEX_TALLOC (num_regs, const char *);
-      reg_info = REGEX_TALLOC (num_regs, register_info_type);
-      reg_dummy = REGEX_TALLOC (num_regs, const char *);
-      reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
-
-      if (!(regstart && regend && old_regstart && old_regend && reg_info
-            && best_regstart && best_regend && reg_dummy && reg_info_dummy))
-        {
-          FREE_VARIABLES ();
-          return -2;
-        }
-    }
-  else
-    {
-      /* We must initialize all our variables to NULL, so that
-         `FREE_VARIABLES' doesn't try to free them.  */
-      regstart = regend = old_regstart = old_regend = best_regstart
-        = best_regend = reg_dummy = NULL;
-      reg_info = reg_info_dummy = (register_info_type *) NULL;
-    }
-#endif /* MATCH_MAY_ALLOCATE */
-
-  /* The starting position is bogus.  */
-  if (pos < 0 || pos > size1 + size2)
-    {
-      FREE_VARIABLES ();
-      return -1;
-    }
-
-  /* Initialize subexpression text positions to -1 to mark ones that no
-     start_memory/stop_memory has been seen for. Also initialize the
-     register information struct.  */
-  for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
-    {
-      regstart[mcnt] = regend[mcnt]
-        = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
-
-      REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
-      IS_ACTIVE (reg_info[mcnt]) = 0;
-      MATCHED_SOMETHING (reg_info[mcnt]) = 0;
-      EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
-    }
-
-  /* We move `string1' into `string2' if the latter's empty -- but not if
-     `string1' is null.  */
-  if (size2 == 0 && string1 != NULL)
-    {
-      string2 = string1;
-      size2 = size1;
-      string1 = 0;
-      size1 = 0;
-    }
-  end1 = string1 + size1;
-  end2 = string2 + size2;
-
-  /* Compute where to stop matching, within the two strings.  */
-  if (stop <= size1)
-    {
-      end_match_1 = string1 + stop;
-      end_match_2 = string2;
-    }
-  else
-    {
-      end_match_1 = end1;
-      end_match_2 = string2 + stop - size1;
-    }
-
-  /* `p' scans through the pattern as `d' scans through the data.
-     `dend' is the end of the input string that `d' points within.  `d'
-     is advanced into the following input string whenever necessary, but
-     this happens before fetching; therefore, at the beginning of the
-     loop, `d' can be pointing at the end of a string, but it cannot
-     equal `string2'.  */
-  if (size1 > 0 && pos <= size1)
-    {
-      d = string1 + pos;
-      dend = end_match_1;
-    }
-  else
-    {
-      d = string2 + pos - size1;
-      dend = end_match_2;
-    }
-
-  DEBUG_PRINT1 ("The compiled pattern is:\n");
-  DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
-  DEBUG_PRINT1 ("The string to match is: `");
-  DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
-  DEBUG_PRINT1 ("'\n");
-
-  /* This loops over pattern commands.  It exits by returning from the
-     function if the match is complete, or it drops through if the match
-     fails at this starting point in the input data.  */
-  boolean same_str_p;
-  for (;;)
-    {
-#ifdef _LIBC
-      DEBUG_PRINT2 ("\n%p: ", p);
-#else
-      DEBUG_PRINT2 ("\n0x%x: ", p);
-#endif
-
-      if (p == pend)
-        { /* End of pattern means we might have succeeded.  */
-          DEBUG_PRINT1 ("end of pattern ... ");
-
-          /* If we haven't matched the entire string, and we want the
-             longest match, try backtracking.  */
-          if (d != end_match_2)
-            {
-              /* 1 if this match ends in the same string (string1 or string2)
-                 as the best previous match.  */
-              same_str_p = (FIRST_STRING_P (match_end)
-                                    == MATCHING_IN_FIRST_STRING);
-              /* 1 if this match is the best seen so far.  */
-              boolean best_match_p;
-
-              /* AIX compiler got confused when this was combined
-                 with the previous declaration.  */
-              if (same_str_p)
-                best_match_p = d > match_end;
-              else
-                best_match_p = !MATCHING_IN_FIRST_STRING;
-
-              DEBUG_PRINT1 ("backtracking.\n");
-
-              if (!FAIL_STACK_EMPTY ())
-                { /* More failure points to try.  */
-
-                  /* If exceeds best match so far, save it.  */
-                  if (!best_regs_set || best_match_p)
-                    {
-                      best_regs_set = true;
-                      match_end = d;
-
-                      DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
-
-                      for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
-                        {
-                          best_regstart[mcnt] = regstart[mcnt];
-                          best_regend[mcnt] = regend[mcnt];
-                        }
-                    }
-                  goto fail;
-                }
-
-              /* If no failure points, don't restore garbage.  And if
-                 last match is real best match, don't restore second
-                 best one. */
-              else if (best_regs_set && !best_match_p)
-                {
-restore_best_regs:
-                  /* Restore best match.  It may happen that `dend ==
-                     end_match_1' while the restored d is in string2.
-                     For example, the pattern `x.*y.*z' against the
-                     strings `x-' and `y-z-', if the two strings are
-                     not consecutive in memory.  */
-                  DEBUG_PRINT1 ("Restoring best registers.\n");
-
-                  d = match_end;
-                  dend = ((d >= string1 && d <= end1)
-                           ? end_match_1 : end_match_2);
-
-                  for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
-                    {
-                      regstart[mcnt] = best_regstart[mcnt];
-                      regend[mcnt] = best_regend[mcnt];
-                    }
-                }
-            } /* d != end_match_2 */
-
-        succeed_label:
-          DEBUG_PRINT1 ("Accepting match.\n");
-
-          /* If caller wants register contents data back, do it.  */
-          if (regs && !bufp->no_sub)
-            {
-              /* Have the register data arrays been allocated?  */
-              if (bufp->regs_allocated == REGS_UNALLOCATED)
-                { /* No.  So allocate them with malloc.  We need one
-                     extra element beyond `num_regs' for the `-1' marker
-                     GNU code uses.  */
-                  regs->num_regs = MAX (RE_NREGS, num_regs + 1);
-                  regs->start = TALLOC (regs->num_regs, regoff_t);
-                  regs->end = TALLOC (regs->num_regs, regoff_t);
-                  if (regs->start == NULL || regs->end == NULL)
-                    {
-                      FREE_VARIABLES ();
-                      return -2;
-                    }
-                  bufp->regs_allocated = REGS_REALLOCATE;
-                }
-              else if (bufp->regs_allocated == REGS_REALLOCATE)
-                { /* Yes.  If we need more elements than were already
-                     allocated, reallocate them.  If we need fewer, just
-                     leave it alone.  */
-                  if (regs->num_regs < num_regs + 1)
-                    {
-                      regs->num_regs = num_regs + 1;
-                      RETALLOC (regs->start, regs->num_regs, regoff_t);
-                      RETALLOC (regs->end, regs->num_regs, regoff_t);
-                      if (regs->start == NULL || regs->end == NULL)
-                        {
-                          FREE_VARIABLES ();
-                          return -2;
-                        }
-                    }
-                }
-              else
-                {
-                  /* These braces fend off a "empty body in an else-statement"
-                     warning under GCC when assert expands to nothing.  */
-                  assert (bufp->regs_allocated == REGS_FIXED);
-                }
-
-              /* Convert the pointer data in `regstart' and `regend' to
-                 indices.  Register zero has to be set differently,
-                 since we haven't kept track of any info for it.  */
-              if (regs->num_regs > 0)
-                {
-                  regs->start[0] = pos;
-                  regs->end[0] = (MATCHING_IN_FIRST_STRING
-                                  ? ((regoff_t) (d - string1))
-                                  : ((regoff_t) (d - string2 + size1)));
-                }
-
-              /* Go through the first `min (num_regs, regs->num_regs)'
-                 registers, since that is all we initialized.  */
-              for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs);
-                   mcnt++)
-                {
-                  if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
-                    regs->start[mcnt] = regs->end[mcnt] = -1;
-                  else
-                    {
-                      regs->start[mcnt]
-                        = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]);
-                      regs->end[mcnt]
-                        = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]);
-                    }
-                }
-
-              /* If the regs structure we return has more elements than
-                 were in the pattern, set the extra elements to -1.  If
-                 we (re)allocated the registers, this is the case,
-                 because we always allocate enough to have at least one
-                 -1 at the end.  */
-              for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++)
-                regs->start[mcnt] = regs->end[mcnt] = -1;
-            } /* regs && !bufp->no_sub */
-
-          DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
-                        nfailure_points_pushed, nfailure_points_popped,
-                        nfailure_points_pushed - nfailure_points_popped);
-          DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
-
-          mcnt = d - pos - (MATCHING_IN_FIRST_STRING
-                            ? string1
-                            : string2 - size1);
-
-          DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
-
-          FREE_VARIABLES ();
-          return mcnt;
-        }
-
-      /* Otherwise match next pattern command.  */
-      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
-        {
-        /* Ignore these.  Used to ignore the n of succeed_n's which
-           currently have n == 0.  */
-        case no_op:
-          DEBUG_PRINT1 ("EXECUTING no_op.\n");
-          break;
-
-        case succeed:
-          DEBUG_PRINT1 ("EXECUTING succeed.\n");
-          goto succeed_label;
-
-        /* Match the next n pattern characters exactly.  The following
-           byte in the pattern defines n, and the n bytes after that
-           are the characters to match.  */
-        case exactn:
-          mcnt = *p++;
-          DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
-
-          /* This is written out as an if-else so we don't waste time
-             testing `translate' inside the loop.  */
-          if (translate)
-            {
-              do
-                {
-                  PREFETCH ();
-                  if ((unsigned char) translate[(unsigned char) *d++]
-                      != (unsigned char) *p++)
-                    goto fail;
-                }
-              while (--mcnt);
-            }
-          else
-            {
-              do
-                {
-                  PREFETCH ();
-                  if (*d++ != (char) *p++) goto fail;
-                }
-              while (--mcnt);
-            }
-          SET_REGS_MATCHED ();
-          break;
-
-
-        /* Match any character except possibly a newline or a null.  */
-        case anychar:
-          DEBUG_PRINT1 ("EXECUTING anychar.\n");
-
-          PREFETCH ();
-
-          if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
-              || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
-            goto fail;
-
-          SET_REGS_MATCHED ();
-          DEBUG_PRINT2 ("  Matched `%d'.\n", *d);
-          d++;
-          break;
-
-
-        case charset:
-        case charset_not:
-          {
-            register unsigned char c;
-            boolean bnot = (re_opcode_t) *(p - 1) == charset_not;
-
-            DEBUG_PRINT2 ("EXECUTING charset%s.\n", bnot ? "_not" : "");
-
-            PREFETCH ();
-            c = TRANSLATE (*d); /* The character to match.  */
-
-            /* Cast to `unsigned' instead of `unsigned char' in case the
-               bit list is a full 32 bytes long.  */
-            if (c < (unsigned) (*p * BYTEWIDTH)
-                && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-              bnot = !bnot;
-
-            p += 1 + *p;
-
-            if (!bnot) goto fail;
-
-            SET_REGS_MATCHED ();
-            d++;
-            break;
-          }
-
-
-        /* The beginning of a group is represented by start_memory.
-           The arguments are the register number in the next byte, and the
-           number of groups inner to this one in the next.  The text
-           matched within the group is recorded (in the internal
-           registers data structure) under the register number.  */
-        case start_memory:
-          DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
-
-          /* Find out if this group can match the empty string.  */
-          p1 = p;               /* To send to group_match_null_string_p.  */
-
-          if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
-            REG_MATCH_NULL_STRING_P (reg_info[*p])
-              = group_match_null_string_p (&p1, pend, reg_info);
-
-          /* Save the position in the string where we were the last time
-             we were at this open-group operator in case the group is
-             operated upon by a repetition operator, e.g., with `(a*)*b'
-             against `ab'; then we want to ignore where we are now in
-             the string in case this attempt to match fails.  */
-          old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
-                             ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
-                             : regstart[*p];
-          DEBUG_PRINT2 ("  old_regstart: %d\n",
-                         POINTER_TO_OFFSET (old_regstart[*p]));
-
-          regstart[*p] = d;
-          DEBUG_PRINT2 ("  regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
-
-          IS_ACTIVE (reg_info[*p]) = 1;
-          MATCHED_SOMETHING (reg_info[*p]) = 0;
-
-          /* Clear this whenever we change the register activity status.  */
-          set_regs_matched_done = 0;
-
-          /* This is the new highest active register.  */
-          highest_active_reg = *p;
-
-          /* If nothing was active before, this is the new lowest active
-             register.  */
-          if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
-            lowest_active_reg = *p;
-
-          /* Move past the register number and inner group count.  */
-          p += 2;
-          just_past_start_mem = p;
-
-          break;
-
-
-        /* The stop_memory opcode represents the end of a group.  Its
-           arguments are the same as start_memory's: the register
-           number, and the number of inner groups.  */
-        case stop_memory:
-          DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
-
-          /* We need to save the string position the last time we were at
-             this close-group operator in case the group is operated
-             upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
-             against `aba'; then we want to ignore where we are now in
-             the string in case this attempt to match fails.  */
-          old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
-                           ? REG_UNSET (regend[*p]) ? d : regend[*p]
-                           : regend[*p];
-          DEBUG_PRINT2 ("      old_regend: %d\n",
-                         POINTER_TO_OFFSET (old_regend[*p]));
-
-          regend[*p] = d;
-          DEBUG_PRINT2 ("      regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
-
-          /* This register isn't active anymore.  */
-          IS_ACTIVE (reg_info[*p]) = 0;
-
-          /* Clear this whenever we change the register activity status.  */
-          set_regs_matched_done = 0;
-
-          /* If this was the only register active, nothing is active
-             anymore.  */
-          if (lowest_active_reg == highest_active_reg)
-            {
-              lowest_active_reg = NO_LOWEST_ACTIVE_REG;
-              highest_active_reg = NO_HIGHEST_ACTIVE_REG;
-            }
-          else
-            { /* We must scan for the new highest active register, since
-                 it isn't necessarily one less than now: consider
-                 (a(b)c(d(e)f)g).  When group 3 ends, after the f), the
-                 new highest active register is 1.  */
-              unsigned char r = *p - 1;
-              while (r > 0 && !IS_ACTIVE (reg_info[r]))
-                r--;
-
-              /* If we end up at register zero, that means that we saved
-                 the registers as the result of an `on_failure_jump', not
-                 a `start_memory', and we jumped to past the innermost
-                 `stop_memory'.  For example, in ((.)*) we save
-                 registers 1 and 2 as a result of the *, but when we pop
-                 back to the second ), we are at the stop_memory 1.
-                 Thus, nothing is active.  */
-              if (r == 0)
-                {
-                  lowest_active_reg = NO_LOWEST_ACTIVE_REG;
-                  highest_active_reg = NO_HIGHEST_ACTIVE_REG;
-                }
-              else
-                highest_active_reg = r;
-            }
-
-          /* If just failed to match something this time around with a
-             group that's operated on by a repetition operator, try to
-             force exit from the ``loop'', and restore the register
-             information for this group that we had before trying this
-             last match.  */
-          if ((!MATCHED_SOMETHING (reg_info[*p])
-               || just_past_start_mem == p - 1)
-              && (p + 2) < pend)
-            {
-              boolean is_a_jump_n = false;
-
-              p1 = p + 2;
-              mcnt = 0;
-              switch ((re_opcode_t) *p1++)
-                {
-                  case jump_n:
-                    is_a_jump_n = true;
-                  case pop_failure_jump:
-                  case maybe_pop_jump:
-                  case jump:
-                  case dummy_failure_jump:
-                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-                    if (is_a_jump_n)
-                      p1 += 2;
-                    break;
-
-                  default:
-                    /* do nothing */ ;
-                }
-              p1 += mcnt;
-
-              /* If the next operation is a jump backwards in the pattern
-                 to an on_failure_jump right before the start_memory
-                 corresponding to this stop_memory, exit from the loop
-                 by forcing a failure after pushing on the stack the
-                 on_failure_jump's jump in the pattern, and d.  */
-              if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
-                  && (re_opcode_t) p1[3] == start_memory && p1[4] == *p)
-                {
-                  /* If this group ever matched anything, then restore
-                     what its registers were before trying this last
-                     failed match, e.g., with `(a*)*b' against `ab' for
-                     regstart[1], and, e.g., with `((a*)*(b*)*)*'
-                     against `aba' for regend[3].
-
-                     Also restore the registers for inner groups for,
-                     e.g., `((a*)(b*))*' against `aba' (register 3 would
-                     otherwise get trashed).  */
-
-                  if (EVER_MATCHED_SOMETHING (reg_info[*p]))
-                    {
-                      unsigned r;
-
-                      EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
-
-                      /* Restore this and inner groups' (if any) registers.  */
-                      for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1);
-                           r++)
-                        {
-                          regstart[r] = old_regstart[r];
-
-                          /* xx why this test?  */
-                          if (old_regend[r] >= regstart[r])
-                            regend[r] = old_regend[r];
-                        }
-                    }
-                  p1++;
-                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-                  PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
-
-                  goto fail;
-                }
-            }
-
-          /* Move past the register number and the inner group count.  */
-          p += 2;
-          break;
-
-
-        /* \<digit> has been turned into a `duplicate' command which is
-           followed by the numeric value of <digit> as the register number.  */
-        case duplicate:
-          {
-            register const char *d2, *dend2;
-            int regno = *p++;   /* Get which register to match against.  */
-            DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
-
-            /* Can't back reference a group which we've never matched.  */
-            if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
-              goto fail;
-
-            /* Where in input to try to start matching.  */
-            d2 = regstart[regno];
-
-            /* Where to stop matching; if both the place to start and
-               the place to stop matching are in the same string, then
-               set to the place to stop, otherwise, for now have to use
-               the end of the first string.  */
-
-            dend2 = ((FIRST_STRING_P (regstart[regno])
-                      == FIRST_STRING_P (regend[regno]))
-                     ? regend[regno] : end_match_1);
-            for (;;)
-              {
-                /* If necessary, advance to next segment in register
-                   contents.  */
-                while (d2 == dend2)
-                  {
-                    if (dend2 == end_match_2) break;
-                    if (dend2 == regend[regno]) break;
-
-                    /* End of string1 => advance to string2. */
-                    d2 = string2;
-                    dend2 = regend[regno];
-                  }
-                /* At end of register contents => success */
-                if (d2 == dend2) break;
-
-                /* If necessary, advance to next segment in data.  */
-                PREFETCH ();
-
-                /* How many characters left in this segment to match.  */
-                mcnt = dend - d;
-
-                /* Want how many consecutive characters we can match in
-                   one shot, so, if necessary, adjust the count.  */
-                if (mcnt > dend2 - d2)
-                  mcnt = dend2 - d2;
-
-                /* Compare that many; failure if mismatch, else move
-                   past them.  */
-                if (translate
-                    ? bcmp_translate (d, d2, mcnt, translate)
-                    : memcmp (d, d2, mcnt))
-                  goto fail;
-                d += mcnt, d2 += mcnt;
-
-                /* Do this because we've match some characters.  */
-                SET_REGS_MATCHED ();
-              }
-          }
-          break;
-
-
-        /* begline matches the empty string at the beginning of the string
-           (unless `not_bol' is set in `bufp'), and, if
-           `newline_anchor' is set, after newlines.  */
-        case begline:
-          DEBUG_PRINT1 ("EXECUTING begline.\n");
-
-          if (AT_STRINGS_BEG (d))
-            {
-              if (!bufp->not_bol) break;
-            }
-          else if (d[-1] == '\n' && bufp->newline_anchor)
-            {
-              break;
-            }
-          /* In all other cases, we fail.  */
-          goto fail;
-
-
-        /* endline is the dual of begline.  */
-        case endline:
-          DEBUG_PRINT1 ("EXECUTING endline.\n");
-
-          if (AT_STRINGS_END (d))
-            {
-              if (!bufp->not_eol) break;
-            }
-
-          /* We have to ``prefetch'' the next character.  */
-          else if ((d == end1 ? *string2 : *d) == '\n'
-                   && bufp->newline_anchor)
-            {
-              break;
-            }
-          goto fail;
-
-
-        /* Match at the very beginning of the data.  */
-        case begbuf:
-          DEBUG_PRINT1 ("EXECUTING begbuf.\n");
-          if (AT_STRINGS_BEG (d))
-            break;
-          goto fail;
-
-
-        /* Match at the very end of the data.  */
-        case endbuf:
-          DEBUG_PRINT1 ("EXECUTING endbuf.\n");
-          if (AT_STRINGS_END (d))
-            break;
-          goto fail;
-
-
-        /* on_failure_keep_string_jump is used to optimize `.*\n'.  It
-           pushes NULL as the value for the string on the stack.  Then
-           `pop_failure_point' will keep the current value for the
-           string, instead of restoring it.  To see why, consider
-           matching `foo\nbar' against `.*\n'.  The .* matches the foo;
-           then the . fails against the \n.  But the next thing we want
-           to do is match the \n against the \n; if we restored the
-           string value, we would be back at the foo.
-
-           Because this is used only in specific cases, we don't need to
-           check all the things that `on_failure_jump' does, to make
-           sure the right things get saved on the stack.  Hence we don't
-           share its code.  The only reason to push anything on the
-           stack at all is that otherwise we would have to change
-           `anychar's code to do something besides goto fail in this
-           case; that seems worse than this.  */
-        case on_failure_keep_string_jump:
-          DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
-
-          EXTRACT_NUMBER_AND_INCR (mcnt, p);
-#ifdef _LIBC
-          DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt);
-#else
-          DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
-#endif
-
-          PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
-          break;
-
-
-        /* Uses of on_failure_jump:
-
-           Each alternative starts with an on_failure_jump that points
-           to the beginning of the next alternative.  Each alternative
-           except the last ends with a jump that in effect jumps past
-           the rest of the alternatives.  (They really jump to the
-           ending jump of the following alternative, because tensioning
-           these jumps is a hassle.)
-
-           Repeats start with an on_failure_jump that points past both
-           the repetition text and either the following jump or
-           pop_failure_jump back to this on_failure_jump.  */
-        case on_failure_jump:
-        on_failure:
-          DEBUG_PRINT1 ("EXECUTING on_failure_jump");
-
-          EXTRACT_NUMBER_AND_INCR (mcnt, p);
-#ifdef _LIBC
-          DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt);
-#else
-          DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
-#endif
-
-          /* If this on_failure_jump comes right before a group (i.e.,
-             the original * applied to a group), save the information
-             for that group and all inner ones, so that if we fail back
-             to this point, the group's information will be correct.
-             For example, in \(a*\)*\1, we need the preceding group,
-             and in \(zz\(a*\)b*\)\2, we need the inner group.  */
-
-          /* We can't use `p' to check ahead because we push
-             a failure point to `p + mcnt' after we do this.  */
-          p1 = p;
-
-          /* We need to skip no_op's before we look for the
-             start_memory in case this on_failure_jump is happening as
-             the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
-             against aba.  */
-          while (p1 < pend && (re_opcode_t) *p1 == no_op)
-            p1++;
-
-          if (p1 < pend && (re_opcode_t) *p1 == start_memory)
-            {
-              /* We have a new highest active register now.  This will
-                 get reset at the start_memory we are about to get to,
-                 but we will have saved all the registers relevant to
-                 this repetition op, as described above.  */
-              highest_active_reg = *(p1 + 1) + *(p1 + 2);
-              if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
-                lowest_active_reg = *(p1 + 1);
-            }
-
-          DEBUG_PRINT1 (":\n");
-          PUSH_FAILURE_POINT (p + mcnt, d, -2);
-          break;
-
-
-        /* A smart repeat ends with `maybe_pop_jump'.
-           We change it to either `pop_failure_jump' or `jump'.  */
-        case maybe_pop_jump:
-          EXTRACT_NUMBER_AND_INCR (mcnt, p);
-          DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
-          {
-            register unsigned char *p2 = p;
-
-            /* Compare the beginning of the repeat with what in the
-               pattern follows its end. If we can establish that there
-               is nothing that they would both match, i.e., that we
-               would have to backtrack because of (as in, e.g., `a*a')
-               then we can change to pop_failure_jump, because we'll
-               never have to backtrack.
-
-               This is not true in the case of alternatives: in
-               `(a|ab)*' we do need to backtrack to the `ab' alternative
-               (e.g., if the string was `ab').  But instead of trying to
-               detect that here, the alternative has put on a dummy
-               failure point which is what we will end up popping.  */
-
-            /* Skip over open/close-group commands.
-               If what follows this loop is a ...+ construct,
-               look at what begins its body, since we will have to
-               match at least one of that.  */
-            while (1)
-              {
-                if (p2 + 2 < pend
-                    && ((re_opcode_t) *p2 == stop_memory
-                        || (re_opcode_t) *p2 == start_memory))
-                  p2 += 3;
-                else if (p2 + 6 < pend
-                         && (re_opcode_t) *p2 == dummy_failure_jump)
-                  p2 += 6;
-                else
-                  break;
-              }
-
-            p1 = p + mcnt;
-            /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
-               to the `maybe_finalize_jump' of this case.  Examine what
-               follows.  */
-
-            /* If we're at the end of the pattern, we can change.  */
-            if (p2 == pend)
-              {
-                /* Consider what happens when matching ":\(.*\)"
-                   against ":/".  I don't really understand this code
-                   yet.  */
-                p[-3] = (unsigned char) pop_failure_jump;
-                DEBUG_PRINT1
-                  ("  End of pattern: change to `pop_failure_jump'.\n");
-              }
-
-            else if ((re_opcode_t) *p2 == exactn
-                     || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
-              {
-                register unsigned char c
-                  = *p2 == (unsigned char) endline ? '\n' : p2[2];
-
-                if ((re_opcode_t) p1[3] == exactn && p1[5] != c)
-                  {
-                    p[-3] = (unsigned char) pop_failure_jump;
-                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
-                                  c, p1[5]);
-                  }
-
-                else if ((re_opcode_t) p1[3] == charset
-                         || (re_opcode_t) p1[3] == charset_not)
-                  {
-                    int bnot = (re_opcode_t) p1[3] == charset_not;
-
-                    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
-                        && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-                      bnot = !bnot;
-
-                    /* `not' is equal to 1 if c would match, which means
-                        that we can't change to pop_failure_jump.  */
-                    if (!bnot)
-                      {
-                        p[-3] = (unsigned char) pop_failure_jump;
-                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
-                      }
-                  }
-              }
-            else if ((re_opcode_t) *p2 == charset)
-              {
-                /* We win if the first character of the loop is not part
-                   of the charset.  */
-                if ((re_opcode_t) p1[3] == exactn
-                    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5]
-                          && (p2[2 + p1[5] / BYTEWIDTH]
-                              & (1 << (p1[5] % BYTEWIDTH)))))
-                  {
-                    p[-3] = (unsigned char) pop_failure_jump;
-                    DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
-                  }
-
-                else if ((re_opcode_t) p1[3] == charset_not)
-                  {
-                    int idx;
-                    /* We win if the charset_not inside the loop
-                       lists every character listed in the charset after.  */
-                    for (idx = 0; idx < (int) p2[1]; idx++)
-                      if (! (p2[2 + idx] == 0
-                             || (idx < (int) p1[4]
-                                 && ((p2[2 + idx] & ~ p1[5 + idx]) == 0))))
-                        break;
-
-                    if (idx == p2[1])
-                      {
-                        p[-3] = (unsigned char) pop_failure_jump;
-                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
-                      }
-                  }
-                else if ((re_opcode_t) p1[3] == charset)
-                  {
-                    int idx;
-                    /* We win if the charset inside the loop
-                       has no overlap with the one after the loop.  */
-                    for (idx = 0;
-                         idx < (int) p2[1] && idx < (int) p1[4];
-                         idx++)
-                      if ((p2[2 + idx] & p1[5 + idx]) != 0)
-                        break;
-
-                    if (idx == p2[1] || idx == p1[4])
-                      {
-                        p[-3] = (unsigned char) pop_failure_jump;
-                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
-                      }
-                  }
-              }
-          }
-          p -= 2;               /* Point at relative address again.  */
-          if ((re_opcode_t) p[-1] != pop_failure_jump)
-            {
-              p[-1] = (unsigned char) jump;
-              DEBUG_PRINT1 ("  Match => jump.\n");
-              goto unconditional_jump;
-            }
-        /* Note fall through.  */
-
-
-        /* The end of a simple repeat has a pop_failure_jump back to
-           its matching on_failure_jump, where the latter will push a
-           failure point.  The pop_failure_jump takes off failure
-           points put on by this pop_failure_jump's matching
-           on_failure_jump; we got through the pattern to here from the
-           matching on_failure_jump, so didn't fail.  */
-        case pop_failure_jump:
-          {
-            /* We need to pass separate storage for the lowest and
-               highest registers, even though we don't care about the
-               actual values.  Otherwise, we will restore only one
-               register from the stack, since lowest will == highest in
-               `pop_failure_point'.  */
-            active_reg_t dummy_low_reg, dummy_high_reg;
-            unsigned char *pdummy;
-            const char *sdummy;
-
-            DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
-            POP_FAILURE_POINT (sdummy, pdummy,
-                               dummy_low_reg, dummy_high_reg,
-                               reg_dummy, reg_dummy, reg_info_dummy);
-          }
-          /* Note fall through.  */
-
-        unconditional_jump:
-#ifdef _LIBC
-          DEBUG_PRINT2 ("\n%p: ", p);
-#else
-          DEBUG_PRINT2 ("\n0x%x: ", p);
-#endif
-          /* Note fall through.  */
-
-        /* Unconditionally jump (without popping any failure points).  */
-        case jump:
-          EXTRACT_NUMBER_AND_INCR (mcnt, p);    /* Get the amount to jump.  */
-          DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
-          p += mcnt;                            /* Do the jump.  */
-#ifdef _LIBC
-          DEBUG_PRINT2 ("(to %p).\n", p);
-#else
-          DEBUG_PRINT2 ("(to 0x%x).\n", p);
-#endif
-          break;
-
-
-        /* We need this opcode so we can detect where alternatives end
-           in `group_match_null_string_p' et al.  */
-        case jump_past_alt:
-          DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
-          goto unconditional_jump;
-
-
-        /* Normally, the on_failure_jump pushes a failure point, which
-           then gets popped at pop_failure_jump.  We will end up at
-           pop_failure_jump, also, and with a pattern of, say, `a+', we
-           are skipping over the on_failure_jump, so we have to push
-           something meaningless for pop_failure_jump to pop.  */
-        case dummy_failure_jump:
-          DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
-          /* It doesn't matter what we push for the string here.  What
-             the code at `fail' tests is the value for the pattern.  */
-          PUSH_FAILURE_POINT (NULL, NULL, -2);
-          goto unconditional_jump;
-
-
-        /* At the end of an alternative, we need to push a dummy failure
-           point in case we are followed by a `pop_failure_jump', because
-           we don't want the failure point for the alternative to be
-           popped.  For example, matching `(a|ab)*' against `aab'
-           requires that we match the `ab' alternative.  */
-        case push_dummy_failure:
-          DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
-          /* See comments just above at `dummy_failure_jump' about the
-             two zeroes.  */
-          PUSH_FAILURE_POINT (NULL, NULL, -2);
-          break;
-
-        /* Have to succeed matching what follows at least n times.
-           After that, handle like `on_failure_jump'.  */
-        case succeed_n:
-          EXTRACT_NUMBER (mcnt, p + 2);
-          DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
-
-          assert (mcnt >= 0);
-          /* Originally, this is how many times we HAVE to succeed.  */
-          if (mcnt > 0)
-            {
-               mcnt--;
-               p += 2;
-               STORE_NUMBER_AND_INCR (p, mcnt);
-#ifdef _LIBC
-               DEBUG_PRINT3 ("  Setting %p to %d.\n", p - 2, mcnt);
-#else
-               DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p - 2, mcnt);
-#endif
-            }
-          else if (mcnt == 0)
-            {
-#ifdef _LIBC
-              DEBUG_PRINT2 ("  Setting two bytes from %p to no_op.\n", p+2);
-#else
-              DEBUG_PRINT2 ("  Setting two bytes from 0x%x to no_op.\n", p+2);
-#endif
-              p[2] = (unsigned char) no_op;
-              p[3] = (unsigned char) no_op;
-              goto on_failure;
-            }
-          break;
-
-        case jump_n:
-          EXTRACT_NUMBER (mcnt, p + 2);
-          DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
-
-          /* Originally, this is how many times we CAN jump.  */
-          if (mcnt)
-            {
-               mcnt--;
-               STORE_NUMBER (p + 2, mcnt);
-#ifdef _LIBC
-               DEBUG_PRINT3 ("  Setting %p to %d.\n", p + 2, mcnt);
-#else
-               DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p + 2, mcnt);
-#endif
-               goto unconditional_jump;
-            }
-          /* If don't have to jump any more, skip over the rest of command.  */
-          else
-            p += 4;
-          break;
-
-        case set_number_at:
-          {
-            DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
-
-            EXTRACT_NUMBER_AND_INCR (mcnt, p);
-            p1 = p + mcnt;
-            EXTRACT_NUMBER_AND_INCR (mcnt, p);
-#ifdef _LIBC
-            DEBUG_PRINT3 ("  Setting %p to %d.\n", p1, mcnt);
-#else
-            DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p1, mcnt);
-#endif
-            STORE_NUMBER (p1, mcnt);
-            break;
-          }
-
-#if 0
-        /* The DEC Alpha C compiler 3.x generates incorrect code for the
-           test  WORDCHAR_P (d - 1) != WORDCHAR_P (d)  in the expansion of
-           AT_WORD_BOUNDARY, so this code is disabled.  Expanding the
-           macro and introducing temporary variables works around the bug.  */
-
-        case wordbound:
-          DEBUG_PRINT1 ("EXECUTING wordbound.\n");
-          if (AT_WORD_BOUNDARY (d))
-            break;
-          goto fail;
-
-        case notwordbound:
-          DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
-          if (AT_WORD_BOUNDARY (d))
-            goto fail;
-          break;
-#else
-        case wordbound:
-        {
-          boolean prevchar, thischar;
-
-          DEBUG_PRINT1 ("EXECUTING wordbound.\n");
-          if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
-            break;
-
-          prevchar = WORDCHAR_P (d - 1);
-          thischar = WORDCHAR_P (d);
-          if (prevchar != thischar)
-            break;
-          goto fail;
-        }
-
-      case notwordbound:
-        {
-          boolean prevchar, thischar;
-
-          DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
-          if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
-            goto fail;
-
-          prevchar = WORDCHAR_P (d - 1);
-          thischar = WORDCHAR_P (d);
-          if (prevchar != thischar)
-            goto fail;
-          break;
-        }
-#endif
-
-        case wordbeg:
-          DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
-          if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
-            break;
-          goto fail;
-
-        case wordend:
-          DEBUG_PRINT1 ("EXECUTING wordend.\n");
-          if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
-              && (!WORDCHAR_P (d) || AT_STRINGS_END (d)))
-            break;
-          goto fail;
-
-#ifdef emacs
-        case before_dot:
-          DEBUG_PRINT1 ("EXECUTING before_dot.\n");
-          if (PTR_CHAR_POS ((unsigned char *) d) >= point)
-            goto fail;
-          break;
-
-        case at_dot:
-          DEBUG_PRINT1 ("EXECUTING at_dot.\n");
-          if (PTR_CHAR_POS ((unsigned char *) d) != point)
-            goto fail;
-          break;
-
-        case after_dot:
-          DEBUG_PRINT1 ("EXECUTING after_dot.\n");
-          if (PTR_CHAR_POS ((unsigned char *) d) <= point)
-            goto fail;
-          break;
-
-        case syntaxspec:
-          DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
-          mcnt = *p++;
-          goto matchsyntax;
-
-        case wordchar:
-          DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
-          mcnt = (int) Sword;
-        matchsyntax:
-          PREFETCH ();
-          /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
-          d++;
-          if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt)
-            goto fail;
-          SET_REGS_MATCHED ();
-          break;
-
-        case notsyntaxspec:
-          DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
-          mcnt = *p++;
-          goto matchnotsyntax;
-
-        case notwordchar:
-          DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
-          mcnt = (int) Sword;
-        matchnotsyntax:
-          PREFETCH ();
-          /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
-          d++;
-          if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt)
-            goto fail;
-          SET_REGS_MATCHED ();
-          break;
-
-#else /* not emacs */
-        case wordchar:
-          DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
-          PREFETCH ();
-          if (!WORDCHAR_P (d))
-            goto fail;
-          SET_REGS_MATCHED ();
-          d++;
-          break;
-
-        case notwordchar:
-          DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
-          PREFETCH ();
-          if (WORDCHAR_P (d))
-            goto fail;
-          SET_REGS_MATCHED ();
-          d++;
-          break;
-#endif /* not emacs */
-
-        default:
-          abort ();
-        }
-      continue;  /* Successfully executed one pattern command; keep going.  */
-
-
-    /* We goto here if a matching operation fails. */
-    fail:
-      if (!FAIL_STACK_EMPTY ())
-        { /* A restart point is known.  Restore to that state.  */
-          DEBUG_PRINT1 ("\nFAIL:\n");
-          POP_FAILURE_POINT (d, p,
-                             lowest_active_reg, highest_active_reg,
-                             regstart, regend, reg_info);
-
-          /* If this failure point is a dummy, try the next one.  */
-          if (!p)
-            goto fail;
-
-          /* If we failed to the end of the pattern, don't examine *p.  */
-          assert (p <= pend);
-          if (p < pend)
-            {
-              boolean is_a_jump_n = false;
-
-              /* If failed to a backwards jump that's part of a repetition
-                 loop, need to pop this failure point and use the next one.  */
-              switch ((re_opcode_t) *p)
-                {
-                case jump_n:
-                  is_a_jump_n = true;
-                case maybe_pop_jump:
-                case pop_failure_jump:
-                case jump:
-                  p1 = p + 1;
-                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-                  p1 += mcnt;
-
-                  if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
-                      || (!is_a_jump_n
-                          && (re_opcode_t) *p1 == on_failure_jump))
-                    goto fail;
-                  break;
-                default:
-                  /* do nothing */ ;
-                }
-            }
-
-          if (d >= string1 && d <= end1)
-            dend = end_match_1;
-        }
-      else
-        break;   /* Matching at this starting point really fails.  */
-    } /* for (;;) */
-
-  if (best_regs_set)
-    goto restore_best_regs;
-
-  FREE_VARIABLES ();
-
-  return -1;                            /* Failure to match.  */
-} /* re_match_2 */
-/* Subroutine definitions for re_match_2.  */
-
-
-/* We are passed P pointing to a register number after a start_memory.
-
-   Return true if the pattern up to the corresponding stop_memory can
-   match the empty string, and false otherwise.
-
-   If we find the matching stop_memory, sets P to point to one past its number.
-   Otherwise, sets P to an undefined byte less than or equal to END.
-
-   We don't handle duplicates properly (yet).  */
-
-static boolean
-group_match_null_string_p (
-    unsigned char **p, unsigned char *end,
-    register_info_type *reg_info)
-{
-  int mcnt;
-  /* Point to after the args to the start_memory.  */
-  unsigned char *p1 = *p + 2;
-
-  while (p1 < end)
-    {
-      /* Skip over opcodes that can match nothing, and return true or
-         false, as appropriate, when we get to one that can't, or to the
-         matching stop_memory.  */
-
-      switch ((re_opcode_t) *p1)
-        {
-        /* Could be either a loop or a series of alternatives.  */
-        case on_failure_jump:
-          p1++;
-          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-
-          /* If the next operation is not a jump backwards in the
-             pattern.  */
-
-          if (mcnt >= 0)
-            {
-              /* Go through the on_failure_jumps of the alternatives,
-                 seeing if any of the alternatives cannot match nothing.
-                 The last alternative starts with only a jump,
-                 whereas the rest start with on_failure_jump and end
-                 with a jump, e.g., here is the pattern for `a|b|c':
-
-                 /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
-                 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
-                 /exactn/1/c
-
-                 So, we have to first go through the first (n-1)
-                 alternatives and then deal with the last one separately.  */
-
-
-              /* Deal with the first (n-1) alternatives, which start
-                 with an on_failure_jump (see above) that jumps to right
-                 past a jump_past_alt.  */
-
-              while ((re_opcode_t) p1[mcnt-3] == jump_past_alt)
-                {
-                  /* `mcnt' holds how many bytes long the alternative
-                     is, including the ending `jump_past_alt' and
-                     its number.  */
-
-                  if (!alt_match_null_string_p (p1, p1 + mcnt - 3,
-                                                      reg_info))
-                    return false;
-
-                  /* Move to right after this alternative, including the
-                     jump_past_alt.  */
-                  p1 += mcnt;
-
-                  /* Break if it's the beginning of an n-th alternative
-                     that doesn't begin with an on_failure_jump.  */
-                  if ((re_opcode_t) *p1 != on_failure_jump)
-                    break;
-
-                  /* Still have to check that it's not an n-th
-                     alternative that starts with an on_failure_jump.  */
-                  p1++;
-                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-                  if ((re_opcode_t) p1[mcnt-3] != jump_past_alt)
-                    {
-                      /* Get to the beginning of the n-th alternative.  */
-                      p1 -= 3;
-                      break;
-                    }
-                }
-
-              /* Deal with the last alternative: go back and get number
-                 of the `jump_past_alt' just before it.  `mcnt' contains
-                 the length of the alternative.  */
-              EXTRACT_NUMBER (mcnt, p1 - 2);
-
-              if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info))
-                return false;
-
-              p1 += mcnt;       /* Get past the n-th alternative.  */
-            } /* if mcnt > 0 */
-          break;
-
-
-        case stop_memory:
-          assert (p1[1] == **p);
-          *p = p1 + 2;
-          return true;
-
-
-        default:
-          if (!common_op_match_null_string_p (&p1, end, reg_info))
-            return false;
-        }
-    } /* while p1 < end */
-
-  return false;
-} /* group_match_null_string_p */
-
-
-/* Similar to group_match_null_string_p, but doesn't deal with alternatives:
-   It expects P to be the first byte of a single alternative and END one
-   byte past the last. The alternative can contain groups.  */
-
-static boolean
-alt_match_null_string_p (
-    unsigned char *p, unsigned char *end,
-    register_info_type *reg_info)
-{
-  int mcnt;
-  unsigned char *p1 = p;
-
-  while (p1 < end)
-    {
-      /* Skip over opcodes that can match nothing, and break when we get
-         to one that can't.  */
-
-      switch ((re_opcode_t) *p1)
-        {
-        /* It's a loop.  */
-        case on_failure_jump:
-          p1++;
-          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-          p1 += mcnt;
-          break;
-
-        default:
-          if (!common_op_match_null_string_p (&p1, end, reg_info))
-            return false;
-        }
-    }  /* while p1 < end */
-
-  return true;
-} /* alt_match_null_string_p */
-
-
-/* Deals with the ops common to group_match_null_string_p and
-   alt_match_null_string_p.
-
-   Sets P to one after the op and its arguments, if any.  */
-
-static boolean
-common_op_match_null_string_p (
-    unsigned char **p, unsigned char *end,
-    register_info_type *reg_info)
-{
-  int mcnt;
-  boolean ret;
-  int reg_no;
-  unsigned char *p1 = *p;
-
-  switch ((re_opcode_t) *p1++)
-    {
-    case no_op:
-    case begline:
-    case endline:
-    case begbuf:
-    case endbuf:
-    case wordbeg:
-    case wordend:
-    case wordbound:
-    case notwordbound:
-#ifdef emacs
-    case before_dot:
-    case at_dot:
-    case after_dot:
-#endif
-      break;
-
-    case start_memory:
-      reg_no = *p1;
-      assert (reg_no > 0 && reg_no <= MAX_REGNUM);
-      ret = group_match_null_string_p (&p1, end, reg_info);
-
-      /* Have to set this here in case we're checking a group which
-         contains a group and a back reference to it.  */
-
-      if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
-        REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
-
-      if (!ret)
-        return false;
-      break;
-
-    /* If this is an optimized succeed_n for zero times, make the jump.  */
-    case jump:
-      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-      if (mcnt >= 0)
-        p1 += mcnt;
-      else
-        return false;
-      break;
-
-    case succeed_n:
-      /* Get to the number of times to succeed.  */
-      p1 += 2;
-      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-
-      if (mcnt == 0)
-        {
-          p1 -= 4;
-          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
-          p1 += mcnt;
-        }
-      else
-        return false;
-      break;
-
-    case duplicate:
-      if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
-        return false;
-      break;
-
-    case set_number_at:
-      p1 += 4;
-
-    default:
-      /* All other opcodes mean we cannot match the empty string.  */
-      return false;
-  }
-
-  *p = p1;
-  return true;
-} /* common_op_match_null_string_p */
-
-
-/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
-   bytes; nonzero otherwise.  */
-
-static int
-bcmp_translate (
-     const char *s1, const char *s2,
-     register int len,
-     RE_TRANSLATE_TYPE translate)
-{
-  register const unsigned char *p1 = (const unsigned char *) s1;
-  register const unsigned char *p2 = (const unsigned char *) s2;
-  while (len)
-    {
-      if (translate[*p1++] != translate[*p2++]) return 1;
-      len--;
-    }
-  return 0;
-}
-/* Entry points for GNU code.  */
-
-/* re_compile_pattern is the GNU regular expression compiler: it
-   compiles PATTERN (of length SIZE) and puts the result in BUFP.
-   Returns 0 if the pattern was valid, otherwise an error string.
-
-   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
-   are set in BUFP on entry.
-
-   We call regex_compile to do the actual compilation.  */
-
-const char *
-re_compile_pattern (
-     const char *pattern,
-     size_t length,
-     struct re_pattern_buffer *bufp)
-{
-  reg_errcode_t ret;
-
-  /* GNU code is written to assume at least RE_NREGS registers will be set
-     (and at least one extra will be -1).  */
-  bufp->regs_allocated = REGS_UNALLOCATED;
-
-  /* And GNU code determines whether or not to get register information
-     by passing null for the REGS argument to re_match, etc., not by
-     setting no_sub.  */
-  bufp->no_sub = 0;
-
-  /* Match anchors at newline.  */
-  bufp->newline_anchor = 1;
-
-  ret = regex_compile (pattern, length, re_syntax_options, bufp);
-
-  if (!ret)
-    return NULL;
-  return gettext (re_error_msgid + re_error_msgid_idx[(int) ret]);
-}
-#ifdef _LIBC
-weak_alias (__re_compile_pattern, re_compile_pattern)
-#endif
-/* Entry points compatible with 4.2 BSD regex library.  We don't define
-   them unless specifically requested.  */
-
-#if defined _REGEX_RE_COMP || defined _LIBC
-
-/* BSD has one and only one pattern buffer.  */
-static struct re_pattern_buffer re_comp_buf;
-
-char *
-#ifdef _LIBC
-/* Make these definitions weak in libc, so POSIX programs can redefine
-   these names if they don't use our functions, and still use
-   regcomp/regexec below without link errors.  */
-weak_function
-#endif
-re_comp (
-    const char *s)
-{
-  reg_errcode_t ret;
-
-  if (!s)
-    {
-      if (!re_comp_buf.buffer)
-        return gettext ("No previous regular expression");
-      return 0;
-    }
-
-  if (!re_comp_buf.buffer)
-    {
-      re_comp_buf.buffer = (unsigned char *) malloc (200);
-      if (re_comp_buf.buffer == NULL)
-        return (char *) gettext (re_error_msgid
-                                 + re_error_msgid_idx[(int) REG_ESPACE]);
-      re_comp_buf.allocated = 200;
-
-      re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
-      if (re_comp_buf.fastmap == NULL)
-        return (char *) gettext (re_error_msgid
-                                 + re_error_msgid_idx[(int) REG_ESPACE]);
-    }
-
-  /* Since `re_exec' always passes NULL for the `regs' argument, we
-     don't need to initialize the pattern buffer fields which affect it.  */
-
-  /* Match anchors at newlines.  */
-  re_comp_buf.newline_anchor = 1;
-
-  ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
-
-  if (!ret)
-    return NULL;
-
-  /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
-  return (char *) gettext (re_error_msgid + re_error_msgid_idx[(int) ret]);
-}
-
-
-int
-#ifdef _LIBC
-weak_function
-#endif
-re_exec (s)
-    const char *s;
-{
-  const int len = strlen (s);
-  return
-    0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
-}
-
-#endif /* _REGEX_RE_COMP */
-/* POSIX.2 functions.  Don't define these for Emacs.  */
-
-#ifndef emacs
-
-/* regcomp takes a regular expression as a string and compiles it.
-
-   PREG is a regex_t *.  We do not expect any fields to be initialized,
-   since POSIX says we shouldn't.  Thus, we set
-
-     `buffer' to the compiled pattern;
-     `used' to the length of the compiled pattern;
-     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
-       REG_EXTENDED bit in CFLAGS is set; otherwise, to
-       RE_SYNTAX_POSIX_BASIC;
-     `newline_anchor' to REG_NEWLINE being set in CFLAGS;
-     `fastmap' to an allocated space for the fastmap;
-     `fastmap_accurate' to zero;
-     `re_nsub' to the number of subexpressions in PATTERN.
-
-   PATTERN is the address of the pattern string.
-
-   CFLAGS is a series of bits which affect compilation.
-
-     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
-     use POSIX basic syntax.
-
-     If REG_NEWLINE is set, then . and [^...] don't match newline.
-     Also, regexec will try a match beginning after every newline.
-
-     If REG_ICASE is set, then we considers upper- and lowercase
-     versions of letters to be equivalent when matching.
-
-     If REG_NOSUB is set, then when PREG is passed to regexec, that
-     routine will report only success or failure, and nothing about the
-     registers.
-
-   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
-   the return codes and their meanings.)  */
-
-int
-regcomp (
-    regex_t *preg,
-    const char *pattern,
-    int cflags)
-{
-  reg_errcode_t ret;
-  reg_syntax_t syntax
-    = (cflags & REG_EXTENDED) ?
-      RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
-
-  /* regex_compile will allocate the space for the compiled pattern.  */
-  preg->buffer = 0;
-  preg->allocated = 0;
-  preg->used = 0;
-
-  /* Try to allocate space for the fastmap.  */
-  preg->fastmap = (char *) malloc (1 << BYTEWIDTH);
-
-  if (cflags & REG_ICASE)
-    {
-      unsigned i;
-
-      preg->translate
-        = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE
-                                      * sizeof (*(RE_TRANSLATE_TYPE)0));
-      if (preg->translate == NULL)
-        return (int) REG_ESPACE;
-
-      /* Map uppercase characters to corresponding lowercase ones.  */
-      for (i = 0; i < CHAR_SET_SIZE; i++)
-        preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i;
-    }
-  else
-    preg->translate = NULL;
-
-  /* If REG_NEWLINE is set, newlines are treated differently.  */
-  if (cflags & REG_NEWLINE)
-    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
-      syntax &= ~RE_DOT_NEWLINE;
-      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
-      /* It also changes the matching behavior.  */
-      preg->newline_anchor = 1;
-    }
-  else
-    preg->newline_anchor = 0;
-
-  preg->no_sub = !!(cflags & REG_NOSUB);
-
-  /* POSIX says a null character in the pattern terminates it, so we
-     can use strlen here in compiling the pattern.  */
-  ret = regex_compile (pattern, strlen (pattern), syntax, preg);
-
-  /* POSIX doesn't distinguish between an unmatched open-group and an
-     unmatched close-group: both are REG_EPAREN.  */
-  if (ret == REG_ERPAREN) ret = REG_EPAREN;
-
-  if (ret == REG_NOERROR && preg->fastmap)
-    {
-      /* Compute the fastmap now, since regexec cannot modify the pattern
-         buffer.  */
-      if (re_compile_fastmap (preg) == -2)
-        {
-          /* Some error occurred while computing the fastmap, just forget
-             about it.  */
-          free (preg->fastmap);
-          preg->fastmap = NULL;
-        }
-    }
-
-  return (int) ret;
-}
-#ifdef _LIBC
-weak_alias (__regcomp, regcomp)
-#endif
-
-
-/* regexec searches for a given pattern, specified by PREG, in the
-   string STRING.
-
-   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
-   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
-   least NMATCH elements, and we set them to the offsets of the
-   corresponding matched substrings.
-
-   EFLAGS specifies `execution flags' which affect matching: if
-   REG_NOTBOL is set, then ^ does not match at the beginning of the
-   string; if REG_NOTEOL is set, then $ does not match at the end.
-
-   We return 0 if we find a match and REG_NOMATCH if not.  */
-
-int
-regexec (
-    const regex_t *preg,
-    const char *string,
-    size_t nmatch,
-    regmatch_t pmatch[],
-    int eflags)
-{
-  int ret;
-  struct re_registers regs;
-  regex_t private_preg;
-  int len = strlen (string);
-  boolean want_reg_info = !preg->no_sub && nmatch > 0;
-
-  private_preg = *preg;
-
-  private_preg.not_bol = !!(eflags & REG_NOTBOL);
-  private_preg.not_eol = !!(eflags & REG_NOTEOL);
-
-  /* The user has told us exactly how many registers to return
-     information about, via `nmatch'.  We have to pass that on to the
-     matching routines.  */
-  private_preg.regs_allocated = REGS_FIXED;
-
-  if (want_reg_info)
-    {
-      regs.num_regs = nmatch;
-      regs.start = TALLOC (nmatch * 2, regoff_t);
-      if (regs.start == NULL)
-        return (int) REG_NOMATCH;
-      regs.end = regs.start + nmatch;
-    }
-
-  /* Perform the searching operation.  */
-  ret = re_search (&private_preg, string, len,
-                   /* start: */ 0, /* range: */ len,
-                   want_reg_info ? &regs : (struct re_registers *) 0);
-
-  /* Copy the register information to the POSIX structure.  */
-  if (want_reg_info)
-    {
-      if (ret >= 0)
-        {
-          unsigned r;
-
-          for (r = 0; r < nmatch; r++)
-            {
-              pmatch[r].rm_so = regs.start[r];
-              pmatch[r].rm_eo = regs.end[r];
-            }
-        }
-
-      /* If we needed the temporary register info, free the space now.  */
-      free (regs.start);
-    }
-
-  /* We want zero return to mean success, unlike `re_search'.  */
-  return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
-}
-#ifdef _LIBC
-weak_alias (__regexec, regexec)
-#endif
-
-
-/* Returns a message corresponding to an error code, ERRCODE, returned
-   from either regcomp or regexec.   We don't use PREG here.  */
-
-size_t
-regerror (
-    int errcode,
-    const regex_t *preg,
-    char *errbuf,
-    size_t errbuf_size)
-{
-  const char *msg;
-  size_t msg_size;
-
-  if (errcode < 0
-      || errcode >= (int) (sizeof (re_error_msgid_idx)
-                           / sizeof (re_error_msgid_idx[0])))
-    /* Only error codes returned by the rest of the code should be passed
-       to this routine.  If we are given anything else, or if other regex
-       code generates an invalid error code, then the program has a bug.
-       Dump core so we can fix it.  */
-    abort ();
-
-  msg = gettext (re_error_msgid + re_error_msgid_idx[errcode]);
-
-  msg_size = strlen (msg) + 1; /* Includes the null.  */
-
-  if (errbuf_size != 0)
-    {
-      if (msg_size > errbuf_size)
-        {
-#if defined HAVE_MEMPCPY || defined _LIBC
-          *((char *) __mempcpy (errbuf, msg, errbuf_size - 1)) = '\0';
-#else
-          memcpy (errbuf, msg, errbuf_size - 1);
-          errbuf[errbuf_size - 1] = 0;
-#endif
-        }
-      else
-        memcpy (errbuf, msg, msg_size);
-    }
-
-  return msg_size;
-}
-#ifdef _LIBC
-weak_alias (__regerror, regerror)
-#endif
-
-
-/* Free dynamically allocated space used by PREG.  */
-
-void
-regfree (
-    regex_t *preg)
-{
-  if (preg->buffer != NULL)
-    free (preg->buffer);
-  preg->buffer = NULL;
-
-  preg->allocated = 0;
-  preg->used = 0;
-
-  if (preg->fastmap != NULL)
-    free (preg->fastmap);
-  preg->fastmap = NULL;
-  preg->fastmap_accurate = 0;
-
-  if (preg->translate != NULL)
-    free (preg->translate);
-  preg->translate = NULL;
-}
-
-#ifdef _LIBC
-weak_alias (__regfree, regfree)
-#endif
-
-#endif /* not emacs  */
-
-#endif
index d66a5cc98322dfadd55be6447f0c8b675cec094a..fc70892cfd516ab164b0c8232ae3182e2f6f21f3 100644 (file)
  *
  */
 /*
-   Copyright (C) 2000-2004 Kern Sibbald and John Walker
+   Copyright (C) 2001-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 as
-   published by the Free Software Foundation; either version 2 of
-   the License, or (at your option) any later version.
+   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 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.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
+   the file LICENSE for additional details.
 
  */
 
index 8abd1b8311ea7b100c97debf610094b5cb774779..178410945cd470ee3d84dd3f2821e283d40ce1ad 100644 (file)
  *
  */
 /*
-   Copyright (C) 2000-2003 Kern Sibbald and John Walker
+   Copyright (C) 2001-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 as
-   published by the Free Software Foundation; either version 2 of
-   the License, or (at your option) any later version.
+   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 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.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
+   the file LICENSE for additional details.
 
  */
 
index cfb5751300de698e97bd015f0090bebdd4a42bf5..53c40242104bf875df494576396a809dad3f7ab2 100644 (file)
@@ -49,6 +49,16 @@ void strip_trailing_junk(char *cmd)
       *p-- = 0;
 }
 
+/* Strip any trailing newline characters from the string */
+void strip_trailing_newline(char *cmd)
+{
+   char *p;
+   p = cmd + strlen(cmd) - 1;
+
+   while ((p >= cmd) && (*p == '\n' || *p == '\r'))
+      *p-- = 0;
+}
+
 /* Strip any trailing slashes from a directory path */
 void strip_trailing_slashes(char *dir)
 {
index 7fe164f96c695a4675d08fac69f5287df6a0fca4..5ad10e539a9f5ae88c24adf1fdeb29b26bb9c3b3 100644 (file)
@@ -188,8 +188,10 @@ void sm_free(const char *file, int line, void *fp)
       V(mutex);
       Emsg2(M_ABORT, 0, _("Buffer overrun called from %s:%d\n"), file, line);
    }
-   sm_buffers--;
-   sm_bytes -= head->ablen;
+   if (sm_buffers > 0) {
+      sm_buffers--;
+      sm_bytes -= head->ablen;
+   }
 
    qdchain(qp);
    V(mutex);
@@ -283,8 +285,8 @@ void *sm_realloc(const char *fname, int lineno, void *ptr, unsigned int size)
       return NULL from  realloc()  and  leave  the  buffer  in  PTR
       intact.  */
 
-   sm_buffers--;
-   sm_bytes -= head->ablen;
+// sm_buffers--;
+// sm_bytes -= head->ablen;
 
    if ((buf = smalloc(fname, lineno, size)) != NULL) {
       memcpy(buf, ptr, (int) sm_min(size, osize));
index 978e1aede9552ed239eb12c1d411501ed8dc873f..b35069ec3fe1a7984ad6700e74a391f0b572347f 100644 (file)
@@ -36,7 +36,6 @@
 
  */
 
-
 #include "bacula.h"
 #include <assert.h>
 
@@ -49,10 +48,21 @@ extern time_t watchdog_time;
 /* No anonymous ciphers, no <128 bit ciphers, no export ciphers, no MD5 ciphers */
 #define TLS_DEFAULT_CIPHERS "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"
 
+/* Array of mutexes for use with OpenSSL static locking */
+static pthread_mutex_t *mutexes;
+
+/* OpenSSL dynamic locking structure */
+struct CRYPTO_dynlock_value {
+   pthread_mutex_t mutex;
+};
+
+/* Are we initialized? */
+static int tls_initialized = false;
+
 /* TLS Context Structure */
 struct TLS_Context {
    SSL_CTX *openssl;
-   CRYPTO_PEM_PASSWD_CB *pem_callback;
+   TLS_PEM_PASSWD_CB *pem_callback;
    const void *pem_userdata;
 };
 
@@ -60,6 +70,20 @@ struct TLS_Connection {
    SSL *openssl;
 };
 
+/* post all per-thread openssl errors */
+static void openssl_post_errors(int code, const char *errstring)
+{
+   char buf[512];
+   unsigned long sslerr;
+
+   /* Pop errors off of the per-thread queue */
+   while((sslerr = ERR_get_error()) != 0) {
+      /* Acquire the human readable string */
+      ERR_error_string_n(sslerr, (char *) &buf, sizeof(buf));
+      Emsg2(M_ERROR, 0, "%s: ERR=%s\n", errstring, buf);
+   }
+}
+
 /*
  * OpenSSL certificate verification callback.
  * OpenSSL has already performed internal certificate verification.
@@ -87,8 +111,18 @@ static int openssl_verify_peer(int ok, X509_STORE_CTX *store)
    return ok;
 }
 
+/*
+ * Default PEM encryption passphrase callback.
+ * Returns an empty password.
+ */
+static int tls_default_pem_callback(char *buf, int size, const void *userdata)
+{
+   bstrncpy(buf, "", size);
+   return (strlen(buf));
+}
+
 /* Dispatch user PEM encryption callbacks */
-static int tls_pem_callback_dispatch (char *buf, int size, int rwflag, void *userdata)
+static int openssl_pem_callback_dispatch (char *buf, int size, int rwflag, void *userdata)
 {
    TLS_CONTEXT *ctx = (TLS_CONTEXT *) userdata;
    return (ctx->pem_callback(buf, size, ctx->pem_userdata));
@@ -101,7 +135,7 @@ static int tls_pem_callback_dispatch (char *buf, int size, int rwflag, void *use
  */
 TLS_CONTEXT *new_tls_context(const char *ca_certfile, const char *ca_certdir,
                              const char *certfile, const char *keyfile,
-                             CRYPTO_PEM_PASSWD_CB *pem_callback,
+                             TLS_PEM_PASSWD_CB *pem_callback,
                              const void *pem_userdata, const char *dhfile,
                              bool verify_peer)
 {
@@ -124,10 +158,10 @@ TLS_CONTEXT *new_tls_context(const char *ca_certfile, const char *ca_certdir,
       ctx->pem_callback = pem_callback;
       ctx->pem_userdata = pem_userdata;
    } else {
-      ctx->pem_callback = crypto_default_pem_callback;
+      ctx->pem_callback = tls_default_pem_callback;
       ctx->pem_userdata = NULL;
    }
-   SSL_CTX_set_default_passwd_cb(ctx->openssl, tls_pem_callback_dispatch);
+   SSL_CTX_set_default_passwd_cb(ctx->openssl, openssl_pem_callback_dispatch);
    SSL_CTX_set_default_passwd_cb_userdata(ctx->openssl, (void *) ctx);
 
    /*
@@ -333,7 +367,7 @@ bool tls_postconnect_verify_host(TLS_CONNECTION *tls, const char *host)
             for (j = 0; j < sk_CONF_VALUE_num(val); j++) {
                nval = sk_CONF_VALUE_value(val, j);
                if (strcmp(nval->name, "DNS") == 0) {
-                  if (strcasecmp(nval->value, host) == 0) {
+                  if (strcasecmp(nval->name, host) == 0) {
                      auth_success = true;
                      goto success;
                   }
@@ -664,6 +698,234 @@ int tls_bsock_readn(BSOCK *bsock, char *ptr, int32_t nbytes) {
    return (openssl_bsock_readwrite(bsock, ptr, nbytes, false));
 }
 
+/*
+ * Return an OpenSSL thread ID
+ *  Returns: thread ID
+ *
+ */
+static unsigned long get_openssl_thread_id (void)
+{
+   /* Comparison without use of pthread_equal() is mandated by the OpenSSL API */
+   return ((unsigned long) pthread_self());
+}
+
+/*
+ * Allocate a dynamic OpenSSL mutex
+ */
+static struct CRYPTO_dynlock_value *openssl_create_dynamic_mutex (const char *file, int line)
+{
+   struct CRYPTO_dynlock_value *dynlock;
+   int stat;
+
+   dynlock = (struct CRYPTO_dynlock_value *) malloc(sizeof(struct CRYPTO_dynlock_value));
+
+   if ((stat = pthread_mutex_init(&dynlock->mutex, NULL)) != 0) {
+      Emsg1(M_ABORT, 0, _("Unable to init mutex: ERR=%s\n"), strerror(stat));
+   }
+
+   return dynlock;
+}
+
+static void openssl_update_dynamic_mutex (int mode, struct CRYPTO_dynlock_value *dynlock, const char *file, int line)
+{
+   if (mode & CRYPTO_LOCK) {
+      P(dynlock->mutex);
+   } else {
+      V(dynlock->mutex);
+   }
+}
+
+static void openssl_destroy_dynamic_mutex (struct CRYPTO_dynlock_value *dynlock, const char *file, int line)
+{
+   int stat;
+
+   if ((stat = pthread_mutex_destroy(&dynlock->mutex)) != 0) {
+      Emsg1(M_ABORT, 0, _("Unable to destroy mutex: ERR=%s\n"), strerror(stat));
+   }
+
+   free(dynlock);
+}
+
+/*
+ * (Un)Lock a static OpenSSL mutex
+ */
+static void openssl_update_static_mutex (int mode, int i, const char *file, int line)
+{
+   if (mode & CRYPTO_LOCK) {
+      P(mutexes[i]);
+   } else {
+      V(mutexes[i]);
+   }
+}
+
+/*
+ * Initialize OpenSSL thread support
+ *  Returns: 0 on success
+ *           errno on failure
+ */
+static int openssl_init_threads (void)
+{
+   int i, numlocks;
+   int stat;
+
+
+   /* Set thread ID callback */
+   CRYPTO_set_id_callback(get_openssl_thread_id);
+
+   /* Initialize static locking */
+   numlocks = CRYPTO_num_locks();
+   mutexes = (pthread_mutex_t *) malloc(numlocks * sizeof(pthread_mutex_t));
+   for (i = 0; i < numlocks; i++) {
+      if ((stat = pthread_mutex_init(&mutexes[i], NULL)) != 0) {
+         Emsg1(M_ERROR, 0, _("Unable to init mutex: ERR=%s\n"), strerror(stat));
+         return stat;
+      }
+   }
+
+   /* Set static locking callback */
+   CRYPTO_set_locking_callback(openssl_update_static_mutex);
+
+   /* Initialize dyanmic locking */
+   CRYPTO_set_dynlock_create_callback(openssl_create_dynamic_mutex);
+   CRYPTO_set_dynlock_lock_callback(openssl_update_dynamic_mutex);
+   CRYPTO_set_dynlock_destroy_callback(openssl_destroy_dynamic_mutex);
+
+   return 0;
+}
+
+/*
+ * Clean up OpenSSL threading support
+ */
+static void openssl_cleanup_threads (void)
+{
+   int i, numlocks;
+   int stat;
+
+   /* Unset thread ID callback */
+   CRYPTO_set_id_callback(NULL);
+  
+   /* Deallocate static lock mutexes */
+   numlocks = CRYPTO_num_locks();
+   for (i = 0; i < numlocks; i++) {
+      if ((stat = pthread_mutex_destroy(&mutexes[i])) != 0) {
+         /* We don't halt execution, reporting the error should be sufficient */
+         Emsg1(M_ERROR, 0, _("Unable to destroy mutex: ERR=%s\n"), strerror(stat));
+      }
+   }
+
+   /* Unset static locking callback */
+   CRYPTO_set_locking_callback(NULL);
+
+   /* Free static lock array */
+   free(mutexes);
+
+   /* Unset dynamic locking callbacks */
+   CRYPTO_set_dynlock_create_callback(NULL);
+   CRYPTO_set_dynlock_lock_callback(NULL);
+   CRYPTO_set_dynlock_destroy_callback(NULL);
+}
+
+
+/*
+ * Seed TLS PRNG
+ *  Returns: 1 on success
+ *           0 on failure
+ */
+static int seed_tls_prng (void)
+{
+   const char *names[]  = { "/dev/urandom", "/dev/random", NULL };
+   int i;
+
+   // ***FIXME***
+   // Win32 Support
+   // Read saved entropy?
+
+   for (i = 0; names[i]; i++) {
+      if (RAND_load_file(names[i], 1024) != -1) {
+         /* Success */
+         return 1;
+      }
+   }
+
+   /* Fail */
+   return 0;
+}
+
+/*
+ * Save TLS Entropy
+ *  Returns: 1 on success
+ *           0 on failure
+ */
+static int save_tls_prng (void)
+{
+   // ***FIXME***
+   // Implement PRNG state save
+   return 1;
+}
+
+/*
+ * Perform global initialization of TLS
+ * This function is not thread safe.
+ *  Returns: 0 on success
+ *           errno on failure
+ */
+int init_tls (void)
+{
+   int stat;
+
+   if ((stat = openssl_init_threads()) != 0) {
+      Emsg1(M_ABORT, 0, _("Unable to init OpenSSL threading: ERR=%s\n"), strerror(stat));
+   }
+
+   /* Load libssl and libcrypto human-readable error strings */
+   SSL_load_error_strings();
+
+   /* Register OpenSSL ciphers */
+   SSL_library_init();
+
+   if (!seed_tls_prng()) {
+      Emsg0(M_ERROR_TERM, 0, _("Failed to seed OpenSSL PRNG\n"));
+   }
+
+   tls_initialized = true;
+
+   return stat;
+}
+
+/*
+ * Perform global cleanup of TLS
+ * All TLS connections must be closed before calling this function.
+ * This function is not thread safe.
+ *  Returns: 0 on success
+ *           errno on failure
+ */
+int cleanup_tls (void)
+{
+   /*
+    * Ensure that we've actually been initialized; Doing this here decreases the
+    * complexity of client's termination/cleanup code.
+    */
+   if (!tls_initialized) {
+      return 0;
+   }
+
+   if (!save_tls_prng()) {
+      Emsg0(M_ERROR, 0, _("Failed to save OpenSSL PRNG\n"));
+   }
+
+   openssl_cleanup_threads();
+
+   /* Free libssl and libcrypto error strings */
+   ERR_free_strings();
+
+   /* Free memory used by PRNG */
+   RAND_cleanup();
+
+   tls_initialized = false;
+
+   return 0;
+}
+
 #else /* HAVE_OPENSSL */
 # error No TLS implementation available.
 #endif /* !HAVE_OPENSSL */
@@ -671,9 +933,11 @@ int tls_bsock_readn(BSOCK *bsock, char *ptr, int32_t nbytes) {
 #else
 
 /* Dummy routines */
+int init_tls(void) { return 0; }
+int cleanup_tls (void) { return 0; }
 TLS_CONTEXT *new_tls_context(const char *ca_certfile, const char *ca_certdir,
                              const char *certfile, const char *keyfile,
-                             CRYPTO_PEM_PASSWD_CB *pem_callback,
+                             TLS_PEM_PASSWD_CB *pem_callback,
                              const void *pem_userdata, const char *dhfile,
                              bool verify_peer)
 {
index 28d6fd6111e8e73f545c5a6edbca7f7ab995dbc8..13595dd17faa99ad34c7410e28ad5e3e2e0076e2 100644 (file)
@@ -50,4 +50,7 @@ typedef struct TLS_Context TLS_CONTEXT;
 /* Opaque TLS Connection Structure */
 typedef struct TLS_Connection TLS_CONNECTION;
 
+/* PEM Decryption Passphrase Callback */
+typedef int (TLS_PEM_PASSWD_CB) (char *buf, int size, const void *userdata);
+
 #endif /* __TLS_H_ */
index 90cf6044a0b67fe1f0122d91322422f326aaf4b6..95799f2498b19841340da8a8b976e3872fcc08de 100644 (file)
@@ -510,7 +510,7 @@ void make_session_key(char *key, char *seed, int mode)
  *  %d = Director's name
  *  %e = Job Exit code
  *  %i = JobId
- *  %j = Unique Job name
+ *  %j = Unique Job id
  *  %l = job level
  *  %n = Unadorned Job name
  *  %s = Since time
index ba70f04ef69b53cf94d6230722d101981afe085d..2b9e2141ea25c03bb9698f8b4a997fe0407d009f 100644 (file)
@@ -23,14 +23,14 @@ first_rule: all
 dummy:
 
 # bacula-sd
-SDOBJS =  stored.o ansi_label.o \
+SVROBJS = stored.o ansi_label.o \
          autochanger.o acquire.o append.o \
          askdir.o authenticate.o \
          block.o butil.o dev.o \
          device.o dircmd.o dvd.o ebcdic.c fd_cmds.o job.o \
-         label.o mac.o match_bsr.o mount.o parse_bsr.o \
+         label.o match_bsr.o mount.o parse_bsr.o \
          pythonsd.o read.o read_record.o record.o \
-         reserve.o scan.o \
+         reserve.o \
          spool.o status.o stored_conf.o wait.o
 
 # btape
@@ -38,33 +38,35 @@ TAPEOBJS = btape.o block.o butil.o dev.o device.o label.o \
           ansi_label.o dvd.o ebcdic.o \
           autochanger.o acquire.o mount.o record.o read_record.o \
           reserve.o \
-          stored_conf.o match_bsr.o parse_bsr.o scan.o spool.o wait.o
+          stored_conf.o match_bsr.o parse_bsr.o spool.o wait.o
 
 # bls
 BLSOBJS = bls.o block.o butil.o device.o dev.o label.o match_bsr.o \
          ansi_label.o dvd.o ebcdic.o \
          autochanger.o acquire.o mount.o parse_bsr.o record.o  \
-         read_record.o reserve.o scan.o stored_conf.o spool.o wait.o
+          reserve.o \
+         read_record.o stored_conf.o spool.o wait.o
 
 # bextract
 BEXTOBJS = bextract.o block.o device.o dev.o label.o record.o \
           ansi_label.o dvd.o ebcdic.o \
           autochanger.o acquire.o mount.o match_bsr.o parse_bsr.o butil.o \
-          pythonsd.o read_record.o reserve.o \
-          scan.o stored_conf.o spool.o wait.o
+          pythonsd.o reserve.o \
+          read_record.o stored_conf.o spool.o wait.o
 
 # bscan
 SCNOBJS = bscan.o block.o device.o dev.o label.o \
          ansi_label.o dvd.o ebcdic.o \
          autochanger.o acquire.o mount.o record.o match_bsr.o parse_bsr.o \
-         butil.o read_record.o scan.o reserve.o stored_conf.o spool.o wait.o
+         reserve.o \
+         butil.o read_record.o stored_conf.o spool.o wait.o
 
 # bcopy
 COPYOBJS = bcopy.o block.o device.o dev.o label.o \
           ansi_label.o dvd.o ebcdic.o \
           autochanger.o acquire.o mount.o record.o match_bsr.o parse_bsr.o \
-          butil.o read_record.o reserve.o \
-          scan.o stored_conf.o spool.o wait.o
+          reserve.o \
+          butil.o read_record.o stored_conf.o spool.o wait.o
 
 
 
@@ -87,13 +89,13 @@ all: Makefile bacula-sd @STATIC_SD@ bls bextract bscan btape bcopy
        @echo "===== Make of stored is good ===="
        @echo " "
 
-bacula-sd: $(SDOBJS) ../lib/libbac.a
-       $(CXX) $(WLDFLAGS) $(LDFLAGS) -L../lib -o $@ $(SDOBJS) $(FDLIBS) \
+bacula-sd: $(SVROBJS) ../lib/libbac.a
+       $(CXX) $(WLDFLAGS) $(LDFLAGS) -L../lib -o $@ $(SVROBJS) $(FDLIBS) \
          -lbac -lm $(PYTHON_LIBS) $(DLIB) $(LIBS) $(WRAPLIBS) \
          $(GETTEXT_LIBS) $(OPENSSL_LIBS)
 
-static-bacula-sd: $(SDOBJS) ../lib/libbac.a
-       $(CXX) $(WLDFLAGS) $(LDFLAGS) -static -L../lib -o $@ $(SDOBJS) $(FDLIBS) \
+static-bacula-sd: $(SVROBJS) ../lib/libbac.a
+       $(CXX) $(WLDFLAGS) $(LDFLAGS) -static -L../lib -o $@ $(SVROBJS) $(FDLIBS) \
         -lbac -lm $(PYTHON_LIBS) $(DLIB) $(LIBS) $(WRAPLIBS) \
         $(GETTEXT_LIBS) $(OPENSSL_LIBS)
        strip $@
index 4d32968cfc13a05e5d2ea2f6a69d478404b9bca0..156c73cf1e0fc5fc6bd80c1915a220d339b964fe 100644 (file)
@@ -23,9 +23,6 @@
 #include "bacula.h"                   /* pull in global headers */
 #include "stored.h"                   /* pull in Storage Deamon headers */
 
-/* Forward referenced functions */
-static void detach_dcr_from_dev(DCR *dcr);
-
 
 /*********************************************************************
  * Acquire device for reading. 
@@ -36,17 +33,18 @@ static void detach_dcr_from_dev(DCR *dcr);
  *  Returns: NULL if failed for any reason
  *           dcr  if successful
  */
-bool acquire_device_for_read(DCR *dcr)
+DCR *acquire_device_for_read(DCR *dcr)
 {
    DEVICE *dev = dcr->dev;
    JCR *jcr = dcr->jcr;
-   bool ok = false;
+   bool vol_ok = false;
    bool tape_previously_mounted;
    bool tape_initially_mounted;
    VOL_LIST *vol;
    bool try_autochanger = true;
    int i;
    int vol_label_status;
+   int retry = 0;
    
    dev->block(BST_DOING_ACQUIRE);
 
@@ -70,71 +68,6 @@ bool acquire_device_for_read(DCR *dcr)
       goto get_out;                   /* should not happen */   
    }
    bstrncpy(dcr->VolumeName, vol->VolumeName, sizeof(dcr->VolumeName));
-   bstrncpy(dcr->media_type, vol->MediaType, sizeof(dcr->media_type));
-   dcr->VolCatInfo.Slot = vol->Slot;
-    
-   /*
-    * If the MediaType requested for this volume is not the
-    *  same as the current drive, we attempt to find the same
-    *  device that was used to write the orginal volume.  If
-    *  found, we switch to using that device.
-    */
-   Dmsg2(100, "MediaType dcr=%s dev=%s\n", dcr->media_type, dev->device->media_type);
-   if (dcr->media_type[0] && strcmp(dcr->media_type, dev->device->media_type) != 0) {
-      RCTX rctx;
-      DIRSTORE *store;
-      int stat;
-      memset(&rctx, 0, sizeof(RCTX));
-      rctx.jcr = jcr;
-      jcr->reserve_msgs = New(alist(10, not_owned_by_alist));
-      rctx.any_drive = true;
-      rctx.device_name = vol->device;
-      store = new DIRSTORE;
-      memset(store, 0, sizeof(DIRSTORE));
-      store->name[0] = 0; /* No dir name */
-      bstrncpy(store->media_type, vol->MediaType, sizeof(store->media_type));
-      bstrncpy(store->pool_name, dcr->pool_name, sizeof(store->pool_name));
-      bstrncpy(store->pool_type, dcr->pool_type, sizeof(store->pool_type));
-      store->append = false;
-      rctx.store = store;
-      
-      /*
-       * Note, if search_for_device() succeeds, we get a new_dcr,
-       *  which we do not use except for the dev info.
-       */
-      stat = search_res_for_device(rctx);
-      release_msgs(jcr);              /* release queued messages */
-      if (stat == 1) {
-         DCR *new_dcr = jcr->read_dcr;
-         dev->unblock();
-         detach_dcr_from_dev(dcr);    /* release old device */
-         /* Copy important info from the new dcr */
-         dev = dcr->dev = new_dcr->dev; 
-         jcr->read_dcr = dcr; 
-         dcr->device = new_dcr->device;
-         dcr->max_job_spool_size = dcr->device->max_job_spool_size;
-         if (dev->fd != 0 && jcr && jcr->JobType != JT_SYSTEM) {
-            dev->attached_dcrs->append(dcr);  /* attach dcr to device */
-         }
-         new_dcr->VolumeName[0] = 0;
-         free_dcr(new_dcr);
-         dev->block(BST_DOING_ACQUIRE); 
-         Jmsg(jcr, M_INFO, 0, _("Media Type change.  New device %s chosen.\n"),
-            dev->print_name());
-         bstrncpy(dcr->VolumeName, vol->VolumeName, sizeof(dcr->VolumeName));
-         bstrncpy(dcr->media_type, vol->MediaType, sizeof(dcr->media_type));
-         dcr->VolCatInfo.Slot = vol->Slot;
-         bstrncpy(dcr->pool_name, store->pool_name, sizeof(dcr->pool_name));
-         bstrncpy(dcr->pool_type, store->pool_type, sizeof(dcr->pool_type));
-      } else if (stat == 0) {   /* device busy */
-         Dmsg1(000, "Device %s is busy.\n", vol->device);
-      } else {
-         /* error */
-         Jmsg1(jcr, M_FATAL, 0, _("No suitable device found to read Volume \"%s\"\n"),
-            vol->VolumeName);
-         goto get_out;
-      }
-   }
 
    init_device_wait_timers(dcr);
 
@@ -149,7 +82,11 @@ bool acquire_device_for_read(DCR *dcr)
       Jmsg1(jcr, M_WARNING, 0, "%s", jcr->errmsg);
    }
    
-   for (i=0; i<5; i++) {
+   for ( ;; ) {
+      /* If not polling limit retries */
+      if (!dev->poll && retry++ > 10) {
+         break;
+      }
       dev->clear_labeled();              /* force reread of label */
       if (job_canceled(jcr)) {
          Mmsg1(dev->errmsg, _("Job %d canceled.\n"), jcr->JobId);
@@ -164,12 +101,12 @@ bool acquire_device_for_read(DCR *dcr)
       if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
          if (dev->dev_errno == EIO) {   /* no tape loaded */
            Jmsg3(jcr, M_WARNING, 0, _("Read open device %s Volume \"%s\" failed (EIO): ERR=%s\n"),
-                 dev->print_name(), dcr->VolumeName, dev->bstrerror());
+                 dev->print_name(), dcr->VolumeName, strerror_dev(dev));
             goto default_path;
          }
          
          Jmsg3(jcr, M_FATAL, 0, _("Read open device %s Volume \"%s\" failed: ERR=%s\n"),
-             dev->print_name(), dcr->VolumeName, dev->bstrerror());
+             dev->print_name(), dcr->VolumeName, strerror_dev(dev));
          goto get_out;
       }
       Dmsg1(100, "opened dev %s OK\n", dev->print_name());
@@ -180,7 +117,7 @@ bool acquire_device_for_read(DCR *dcr)
       vol_label_status = read_dev_volume_label(dcr);
       switch (vol_label_status) {
       case VOL_OK:
-         ok = true;
+         vol_ok = true;
          memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
          break;                    /* got it */
       case VOL_IO_ERROR:
@@ -198,17 +135,22 @@ bool acquire_device_for_read(DCR *dcr)
             tape_initially_mounted = false;
             goto default_path;
          }
+         /* If polling and got a previous bad name, ignore it */
+         if (dev->poll && strcmp(dev->BadVolName, dev->VolHdr.VolumeName) == 0) {
+            goto default_path;
+         } else {
+             bstrncpy(dev->BadVolName, dev->VolHdr.VolumeName, sizeof(dev->BadVolName));
+         }
          /* Fall through */
       default:
          Jmsg1(jcr, M_WARNING, 0, "%s", jcr->errmsg);
 default_path:
          tape_previously_mounted = true;
          
-         /*
-          * If the device requires mount, close it, so the device can be ejected.
-          */
+         /* If the device requires mount, close it, so the device can be ejected.
+          * FIXME: This should perhaps be done for all devices. */
          if (dev->requires_mount()) {
-            dev->close();
+            force_close_device(dev);
          }
          
          /* Call autochanger only once unless ask_sysop called */
@@ -233,7 +175,7 @@ default_path:
       } /* end switch */
       break;
    } /* end for loop */
-   if (!ok) {
+   if (!vol_ok) {
       Jmsg1(jcr, M_FATAL, 0, _("Too many errors trying to mount device %s.\n"),
             dev->print_name());
       goto get_out;
@@ -255,7 +197,8 @@ get_out:
    }
    V(dev->mutex);
    dev->unblock();
-   return ok;
+   Dmsg1(000, "jcr->dcr=%p\n", jcr->dcr);
+   return dcr;
 }
 
 
@@ -373,7 +316,7 @@ DCR *acquire_device_for_append(DCR *dcr)
    P(dev->mutex);
    if (dcr->reserved_device) {
       dev->reserved_device--;
-      Dmsg2(100, "Dec reserve=%d dev=%s\n", dev->reserved_device, dev->print_name());
+      Dmsg1(100, "Dec reserve=%d\n", dev->reserved_device);
       dcr->reserved_device = false;
    }
    V(dev->mutex);
@@ -387,15 +330,15 @@ get_out:
    P(dev->mutex);
    if (dcr->reserved_device) {
       dev->reserved_device--;
-      Dmsg2(100, "Dec reserve=%d dev=%s\n", dev->reserved_device, dev->print_name());
+      Dmsg1(100, "Dec reserve=%d\n", dev->reserved_device);
       dcr->reserved_device = false;
    }
    V(dev->mutex);
+   free_dcr(dcr);
    dev->unblock();
    return NULL;
 }
 
-
 /*
  * This job is done, so release the device. From a Unix standpoint,
  *  the device remains open.
@@ -408,12 +351,12 @@ bool release_device(DCR *dcr)
    bool ok = true;
 
    lock_device(dev);
-   Dmsg2(100, "release_device device %s is %s\n", dev->print_name(), dev->is_tape()?"tape":"disk");
+   Dmsg1(100, "release_device device is %s\n", dev->is_tape()?"tape":"disk");
 
    /* if device is reserved, job never started, so release the reserve here */
    if (dcr->reserved_device) {
       dev->reserved_device--;
-      Dmsg2(100, "Dec reserve=%d dev=%s\n", dev->reserved_device, dev->print_name());
+      Dmsg1(100, "Dec reserve=%d\n", dev->reserved_device);
       dcr->reserved_device = false;
    }
 
@@ -461,7 +404,8 @@ bool release_device(DCR *dcr)
 
    /* If no writers, close if file or !CAP_ALWAYS_OPEN */
    if (dev->num_writers == 0 && (!dev->is_tape() || !dev_cap(dev, CAP_ALWAYSOPEN))) {
-      dev->close();
+      offline_or_rewind_dev(dev);
+      close_device(dev);
    }
 
    /* Fire off Alert command and include any output */
@@ -552,18 +496,22 @@ static void remove_dcr_from_dcrs(DCR *dcr)
 }
 #endif
 
-static void detach_dcr_from_dev(DCR *dcr)
+/*
+ * Free up all aspects of the given dcr -- i.e. dechain it,
+ *  release allocated memory, zap pointers, ...
+ */
+void free_dcr(DCR *dcr)
 {
+   JCR *jcr = dcr->jcr;
    DEVICE *dev = dcr->dev;
 
    if (dcr->reserved_device) {
-      dcr->reserved_device = false;
       lock_device(dev);
       dev->reserved_device--;
       Dmsg2(100, "Dec reserve=%d dev=%s\n", dev->reserved_device, dev->print_name());
       dcr->reserved_device = false;
       /* If we set read mode in reserving, remove it */
-      if (dev->can_read()) {
+       if (dev->can_read()) {
          dev->clear_read();
       }
       if (dev->num_writers < 0) {
@@ -574,24 +522,10 @@ static void detach_dcr_from_dev(DCR *dcr)
    }
 
    /* Detach this dcr only if the dev is initialized */
-   if (dcr->dev->fd != 0 && dcr->jcr && dcr->jcr->JobType != JT_SYSTEM) {
-      dcr->dev->attached_dcrs->remove(dcr);  /* detach dcr from device */
+   if (dev->fd != 0 && jcr && jcr->JobType != JT_SYSTEM) {
+      dev->attached_dcrs->remove(dcr);  /* detach dcr from device */
 //    remove_dcr_from_dcrs(dcr);      /* remove dcr from jcr list */
    }
-   free_unused_volume(dcr);           /* free unused vols attached to this dcr */
-   pthread_cond_broadcast(&dcr->dev->wait_next_vol);
-   pthread_cond_broadcast(&wait_device_release);
-}
-
-/*
- * Free up all aspects of the given dcr -- i.e. dechain it,
- *  release allocated memory, zap pointers, ...
- */
-void free_dcr(DCR *dcr)
-{
-
-   detach_dcr_from_dev(dcr);
-
    if (dcr->block) {
       free_block(dcr->block);
    }
@@ -601,5 +535,8 @@ void free_dcr(DCR *dcr)
    if (dcr->jcr) {
       dcr->jcr->dcr = NULL;
    }
+   free_unused_volume(dcr);           /* free unused vols attached to this dcr */
    free(dcr);
+   pthread_cond_broadcast(&dev->wait_next_vol);
+   pthread_cond_broadcast(&wait_device_release);
 }
index eeae53420bd481965aec63da5ae870ba0f4ca95a..4c6c12d53b8c5ab0b6e852d58bc97c4c66e98c08 100644 (file)
@@ -5,7 +5,7 @@
  *  Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -69,7 +69,6 @@ bool do_append_data(JCR *jcr)
 
    if (!acquire_device_for_append(dcr)) {
       set_jcr_job_status(jcr, JS_ErrorTerminated);
-      jcr->dcr = NULL;
       return false;
    }
 
@@ -93,7 +92,7 @@ bool do_append_data(JCR *jcr)
     */
    if (!write_session_label(dcr, SOS_LABEL)) {
       Jmsg1(jcr, M_FATAL, 0, _("Write session label failed. ERR=%s\n"),
-         dev->bstrerror());
+         strerror_dev(dev));
       set_jcr_job_status(jcr, JS_ErrorTerminated);
       ok = false;
    }
@@ -203,9 +202,9 @@ bool do_append_data(JCR *jcr)
                        rec.remainder);
             if (!write_block_to_device(dcr)) {
                Dmsg2(90, "Got write_block_to_dev error on device %s. %s\n",
-                  dev->print_name(), dev->bstrerror());
+                  dev->print_name(), strerror_dev(dev));
                Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"),
-                     dev->print_name(), dev->bstrerror());
+                     dev->print_name(), strerror_dev(dev));
                ok = false;
                break;
             }
@@ -220,8 +219,8 @@ bool do_append_data(JCR *jcr)
             stream_to_ascii(buf2, rec.Stream, rec.FileIndex), rec.data_len);
 
          /* Send attributes and digest to Director for Catalog */
-         if (stream == STREAM_UNIX_ATTRIBUTES || stream == STREAM_UNIX_ATTRIBUTES_EX ||
-             crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
+         if (stream == STREAM_UNIX_ATTRIBUTES    || stream == STREAM_MD5_SIGNATURE ||
+             stream == STREAM_UNIX_ATTRIBUTES_EX || stream == STREAM_SHA1_SIGNATURE) {
             if (!jcr->no_attributes) {
                if (are_attributes_spooled(jcr)) {
                   jcr->dir_bsock->spool = true;
@@ -252,7 +251,10 @@ bool do_append_data(JCR *jcr)
    /* Create Job status for end of session label */
    set_jcr_job_status(jcr, ok?JS_Terminated:JS_ErrorTerminated);
 
-   Dmsg1(200, "Write EOS label JobStatus=%c\n", jcr->JobStatus);
+   Dmsg1(200, "Write session label JobStatus=%d\n", jcr->JobStatus);
+   if ((!ok || job_canceled(jcr)) && dev->VolCatInfo.VolCatName[0] == 0) {
+      Pmsg0(000, _("NULL Volume name. This shouldn't happen!!!\n"));
+   }
 
    /*
     * If !OK, check if we can still write. This may not be the case
@@ -261,7 +263,7 @@ bool do_append_data(JCR *jcr)
    if (ok || dev->can_write()) {
       if (!write_session_label(dcr, EOS_LABEL)) {
          Jmsg1(jcr, M_FATAL, 0, _("Error writting end session label. ERR=%s\n"),
-               dev->bstrerror());
+               strerror_dev(dev));
          set_jcr_job_status(jcr, JS_ErrorTerminated);
          ok = false;
       }
@@ -272,7 +274,7 @@ bool do_append_data(JCR *jcr)
       /* Flush out final partial block of this session */
       if (!write_block_to_device(dcr)) {
          Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"),
-               dev->print_name(), dev->bstrerror());
+               dev->print_name(), strerror_dev(dev));
          Dmsg0(100, _("Set ok=FALSE after write_block_to_device.\n"));
          ok = false;
       }
index 16557abd989d1b1e724cd438ae396dbde69f09ba..8d31f72fc5a61c23a12108b61621570e15592bad 100644 (file)
@@ -162,7 +162,7 @@ static bool do_get_volume_info(DCR *dcr)
        return false;
     }
     memset(&vol, 0, sizeof(vol));
-    Dmsg1(100, "<dird %s", dir->msg);
+    Dmsg1(110, "<dird %s", dir->msg);
     n = sscanf(dir->msg, OK_media, vol.VolCatName,
                &vol.VolCatJobs, &vol.VolCatFiles,
                &vol.VolCatBlocks, &vol.VolCatBytes,
@@ -174,7 +174,7 @@ static bool do_get_volume_info(DCR *dcr)
                &vol.EndFile, &vol.EndBlock, &vol.VolCatParts,
                &vol.LabelType);
     if (n != 21) {
-       Dmsg2(100, "Bad response from Dir fields=%d: %s", n, dir->msg);
+       Dmsg2(110, "Bad response from Dir fields=%d: %s", n, dir->msg);
        Mmsg(jcr->errmsg, _("Error getting Volume info: %s"), dir->msg);
        return false;
     }
@@ -228,10 +228,6 @@ bool dir_find_next_appendable_volume(DCR *dcr)
     JCR *jcr = dcr->jcr;
     BSOCK *dir = jcr->dir_bsock;
     bool found = false;
-    /* This mutex should keep different devices from getting the
-     * same Volume.  
-     */
-    static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
     Dmsg0(200, "dir_find_next_appendable_volume\n");
     /*
@@ -239,7 +235,7 @@ bool dir_find_next_appendable_volume(DCR *dcr)
      *   the most available could already be mounted on another
      *   drive, so we continue looking for a not in use Volume.
      */
-    P(mutex);
+    lock_reservations();
     for (int vol_index=1;  vol_index < 20; vol_index++) {
        bash_spaces(dcr->media_type);
        bash_spaces(dcr->pool_name);
@@ -257,7 +253,8 @@ bool dir_find_next_appendable_volume(DCR *dcr)
              continue;
           }
        } else {
-          Dmsg0(200, "No volume info, return false\n");
+          Dmsg2(100, "No vol. index %d return false. dev=%s\n", vol_index,
+             dcr->dev->print_name());
           found = false;
           break;
        }
@@ -265,11 +262,11 @@ bool dir_find_next_appendable_volume(DCR *dcr)
     if (found) {
        Dmsg0(400, "dir_find_next_appendable_volume return true\n");
        new_volume(dcr, dcr->VolumeName);   /* reserve volume */
-       V(mutex);
+       unlock_reservations();
        return true;
     }
     dcr->VolumeName[0] = 0;
-    V(mutex);
+    unlock_reservations();
     return false;
 }
 
@@ -520,7 +517,7 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr)
       }
 
       if (dev->is_dvd()) {   
-         unmount_dvd(dev, 0);
+         unmount_dev(dev, 0);
       }
       
       /*
index e135852474046f086a8038758eef5cd0b12da48a..8c822b9ebbd7eb1295d0ce050a07a3151db7b795 100644 (file)
@@ -105,7 +105,6 @@ int autoload_device(DCR *dcr, int writing, BSOCK *dir)
    POOLMEM *changer;
 
    if (!dev->is_autochanger()) {
-      Dmsg0(200, "======== NOT AUTOCHANGER ======\n");
       return 0;
    }
    slot = dcr->VolCatInfo.InChanger ? dcr->VolCatInfo.Slot : 0;
@@ -155,8 +154,8 @@ int autoload_device(DCR *dcr, int writing, BSOCK *dir)
          dcr->VolCatInfo.Slot = slot;    /* slot to be loaded */
          changer = edit_device_codes(dcr, changer, 
                       dcr->device->changer_command, "load");
-         dev->close();
-         Dmsg1(200, "Run program=%s\n", changer);
+         offline_or_rewind_dev(dev);
+         force_close_device(dev);
          status = run_program(changer, timeout, NULL);
          if (status == 0) {
             Jmsg(jcr, M_INFO, 0, _("3305 Autochanger \"load slot %d, drive %d\", status is OK.\n"),
@@ -220,9 +219,8 @@ int get_autochanger_loaded_slot(DCR *dcr)
         drive);
    changer = edit_device_codes(dcr, changer, dcr->device->changer_command, "loaded");
    *results = 0;
-   Dmsg1(200, "Run program=%s\n", changer);
    status = run_program(changer, timeout, results);
-   Dmsg3(200, "run_prog: %s stat=%d result=%s\n", changer, status, results);
+   Dmsg3(50, "run_prog: %s stat=%d result=%s\n", changer, status, results);
    if (status == 0) {
       loaded = str_to_int32(results);
       if (loaded > 0) {
@@ -302,8 +300,8 @@ bool unload_autochanger(DCR *dcr, int loaded)
       dcr->VolCatInfo.Slot = loaded;
       changer = edit_device_codes(dcr, changer, 
                    dcr->device->changer_command, "unload");
-      dev->close();
-      Dmsg1(200, "Run program=%s\n", changer);
+      offline_or_rewind_dev(dev);
+      force_close_device(dev);
       int stat = run_program(changer, timeout, NULL);
       dcr->VolCatInfo.Slot = slot;
       if (stat != 0) {
@@ -337,6 +335,7 @@ static bool unload_other_drive(DCR *dcr, int slot)
    bool found = false;
    bool first = true;
 
+
    if (!changer) {
       return false;
    }
@@ -367,9 +366,9 @@ static bool unload_other_drive(DCR *dcr, int slot)
    }
    P(dev->mutex);
    if (dev->is_busy()) {
-      Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" is in use by device %s\n"),
+      Jmsg(jcr, M_WARNING, 0, _("Volume %s is in use by device %s\n"),
            dcr->VolumeName, dev->print_name());
-      Dmsg2(200, "Volume \"%s\" is in use by device %s\n",
+      Dmsg2(200, "Volume %s is in use by device %s\n",
            dcr->VolumeName, dev->print_name());
       V(dev->mutex);
       return false;
@@ -384,16 +383,15 @@ static bool unload_other_drive(DCR *dcr, int slot)
    Dmsg2(200, "Issuing autochanger \"unload slot %d, drive %d\" command.\n",
         slot, dev->drive_index);
 
+   save_slot = dcr->VolCatInfo.Slot;
    save_dev = dcr->dev;
    dcr->dev = dev;
-   save_slot = dcr->VolCatInfo.Slot;
    dcr->VolCatInfo.Slot = slot;
    changer_cmd = edit_device_codes(dcr, changer_cmd, 
                 dcr->device->changer_command, "unload");
-   dev->close();
-   Dmsg2(200, "close dev=%s reserve=%d\n", dev->print_name(), 
-      dev->reserved_device);
    Dmsg1(200, "Run program=%s\n", changer_cmd);
+   offline_or_rewind_dev(dev);
+   force_close_device(dev);
    int stat = run_program(changer_cmd, timeout, NULL);
    dcr->VolCatInfo.Slot = save_slot;
    dcr->dev = save_dev;
index b072bd9a935b6dcba88be5c7c2cc297c723badb1..08e9ba6614bebaef83254d7ab8a095fd298e32c6 100644 (file)
@@ -190,8 +190,8 @@ int main (int argc, char *argv[])
    free_jcr(in_jcr);
    free_jcr(out_jcr);
 
-   in_dev->term();
-   out_dev->term();
+   term_dev(in_dev);
+   term_dev(out_dev);
    return 0;
 }
 
@@ -231,16 +231,16 @@ static bool record_cb(DCR *in_dcr, DEV_RECORD *rec)
                        rec->remainder);
             if (!write_block_to_device(out_jcr->dcr)) {
                Dmsg2(90, "Got write_block_to_dev error on device %s: ERR=%s\n",
-                  out_dev->print_name(), out_dev->bstrerror());
+                  out_dev->print_name(), strerror_dev(out_dev));
                Jmsg(out_jcr, M_FATAL, 0, _("Cannot fixup device error. %s\n"),
-                     out_dev->bstrerror());
+                     strerror_dev(out_dev));
             }
          }
          if (!write_block_to_device(out_jcr->dcr)) {
             Dmsg2(90, "Got write_block_to_dev error on device %s: ERR=%s\n",
-               out_dev->print_name(), out_dev->bstrerror());
+               out_dev->print_name(), strerror_dev(out_dev));
             Jmsg(out_jcr, M_FATAL, 0, _("Cannot fixup device error. %s\n"),
-                  out_dev->bstrerror());
+                  strerror_dev(out_dev));
          }
          break;
       case EOM_LABEL:
@@ -261,9 +261,9 @@ static bool record_cb(DCR *in_dcr, DEV_RECORD *rec)
                  rec->remainder);
       if (!write_block_to_device(out_jcr->dcr)) {
          Dmsg2(90, "Got write_block_to_dev error on device %s: ERR=%s\n",
-            out_dev->print_name(), out_dev->bstrerror());
+            out_dev->print_name(), strerror_dev(out_dev));
          Jmsg(out_jcr, M_FATAL, 0, _("Cannot fixup device error. %s\n"),
-               out_dev->bstrerror());
+               strerror_dev(out_dev));
          break;
       }
    }
index 4d1cf2051d1c2fb84264cb29ae5ab6621346de63..ec1a670831d654c368e4955d48438616018d8f88 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -246,7 +246,7 @@ static void do_extract(char *devname)
    release_device(dcr);
    free_attr(attr);
    free_jcr(jcr);
-   dev->term();
+   term_dev(dev);
 
    printf(_("%u files restored.\n"), num_files);
    return;
@@ -432,8 +432,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       break;
 
    case STREAM_SIGNED_DIGEST:
-   case STREAM_ENCRYPTED_SESSION_DATA:
-      // TODO landonf: Investigate crypto support in the storage daemon
+      // TODO landonf: Investigate signed digest support in the storage daemon
       break;
 
    case STREAM_PROGRAM_NAMES:
index d1d7b2669d7db30d84128d061da24ae6728a5cb2..1a38ee7c81b7c4652909508c472cf8e90cdb9b3e 100644 (file)
@@ -9,7 +9,7 @@
  *
  */
 /*
-   Copyright (C) 2001-2006 Kern Sibbald
+   Copyright (C) 2001-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -480,7 +480,7 @@ bool write_block_to_dev(DCR *dcr)
       if (weof_dev(dev, 1) != 0) {            /* write eof */
          Dmsg0(190, "WEOF error in max file size.\n");
          Jmsg(jcr, M_FATAL, 0, _("Unable to write EOF. ERR=%s\n"), 
-            dev->bstrerror());
+            strerror_dev(dev));
          terminate_writing_volume(dcr);
          dev->dev_errno = ENOSPC;
          return false;
@@ -613,20 +613,20 @@ static void reread_last_block(DCR *dcr)
     */
    if (dev->is_tape() && dev_cap(dev, CAP_BSR)) {
       /* Now back up over what we wrote and read the last block */
-      if (!dev->bsf(1)) {
+      if (!bsf_dev(dev, 1)) {
          berrno be;
          ok = false;
          Jmsg(jcr, M_ERROR, 0, _("Backspace file at EOT failed. ERR=%s\n"), 
               be.strerror(dev->dev_errno));
       }
-      if (ok && dev->has_cap(CAP_TWOEOF) && !dev->bsf(1)) {
+      if (ok && dev_cap(dev, CAP_TWOEOF) && !bsf_dev(dev, 1)) {
          berrno be;
          ok = false;
          Jmsg(jcr, M_ERROR, 0, _("Backspace file at EOT failed. ERR=%s\n"), 
               be.strerror(dev->dev_errno));
       }
       /* Backspace over record */
-      if (ok && !dev->bsr(1)) {
+      if (ok && !bsr_dev(dev, 1)) {
          berrno be;
          ok = false;
          Jmsg(jcr, M_ERROR, 0, _("Backspace record at EOT failed. ERR=%s\n"), 
@@ -637,7 +637,7 @@ static void reread_last_block(DCR *dcr)
           *    rewind(), but if we do that, higher levels in cleaning up, will
           *    most likely write the EOS record over the beginning of the
           *    tape.  The rewind *is* done later in mount.c when another
-          *    tape is requested. Note, the clrerror_dev() call in bsr()
+          *    tape is requested. Note, the clrerror_dev() call in bsr_dev()
           *    calls ioctl(MTCERRSTAT), which *should* fix the problem.
           */
       }
@@ -649,12 +649,17 @@ static void reread_last_block(DCR *dcr)
             Jmsg(jcr, M_ERROR, 0, _("Re-read last block at EOT failed. ERR=%s"), 
                  dev->errmsg);
          } else {
-            if (lblock->BlockNumber+1 == block->BlockNumber) {
-               Jmsg(jcr, M_INFO, 0, _("Re-read of last block succeeded.\n"));
-            } else {
+            /*
+             * If we wrote block and the block numbers don't agree
+             *  we have a possible problem.
+             */
+            if (lblock->VolSessionId == block->VolSessionId &&
+                lblock->BlockNumber+1 != block->BlockNumber) {
                Jmsg(jcr, M_ERROR, 0, _(
-"Re-read of last block failed. Last block=%u Current block=%u.\n"),
+"Re-read of last block OK, but block numbers differ. Last block=%u Current block=%u.\n"),
                     lblock->BlockNumber, block->BlockNumber);
+            } else {
+               Jmsg(jcr, M_INFO, 0, _("Re-read of last block succeeded.\n"));
             }
          }
          free_block(lblock);
@@ -801,7 +806,7 @@ static bool do_dvd_size_checks(DCR *dcr)
       
       if (dvd_open_next_part(dcr) < 0) {
          Jmsg2(dcr->jcr, M_FATAL, 0, _("Unable to open device next part %s: ERR=%s\n"),
-                dev->print_name(), dev->bstrerror());
+                dev->print_name(), strerror_dev(dev));
          dev->dev_errno = EIO;
          return false;
       }
@@ -911,7 +916,7 @@ reread:
         (dev->part < dev->num_parts)) {
       if (dvd_open_next_part(dcr) < 0) {
          Jmsg2(dcr->jcr, M_FATAL, 0, _("Unable to open device next part %s: ERR=%s\n"),
-               dev->print_name(), dev->bstrerror());
+               dev->print_name(), strerror_dev(dev));
          dev->dev_errno = EIO;
          return false;
       }
@@ -994,8 +999,8 @@ reread:
       /* Attempt to reposition to re-read the block */
       if (dev->is_tape()) {
          Dmsg0(200, "BSR for reread; block too big for buffer.\n");
-         if (!dev->bsr(1)) {
-            Jmsg(jcr, M_ERROR, 0, "%s", dev->bstrerror());
+         if (!bsr_dev(dev, 1)) {
+            Jmsg(jcr, M_ERROR, 0, "%s", strerror_dev(dev));
             block->read_len = 0;
             return false;
          }
index d0e317340afa9d86249a491036c5d797611063f6..8dbea4c8c2d4ae53d93922394d67c7da381f8a00 100644 (file)
@@ -45,7 +45,6 @@ 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;
@@ -216,7 +215,6 @@ int main (int argc, char *argv[])
       }
       dcr = jcr->dcr;
       rec = new_record();
-      block = new_block(dev);
       attr = new_attr();
       /*
        * Assume that we have already read the volume label.
@@ -251,9 +249,8 @@ static void do_close(JCR *jcr)
    release_device(jcr->dcr);
    free_attr(attr);
    free_record(rec);
-   free_block(block);
    free_jcr(jcr);
-   dev->term();
+   term_dev(dev);
 }
 
 
@@ -261,6 +258,7 @@ static void do_close(JCR *jcr)
 static void do_blocks(char *infname)
 {
    char buf1[100], buf2[100];
+   DEV_BLOCK *block = dcr->block;
    for ( ;; ) {
       if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
          Dmsg1(100, "!read_block(): ERR=%s\n", dev->strerror());
@@ -279,7 +277,7 @@ static void do_blocks(char *infname)
             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;
@@ -409,7 +407,6 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess
    case EOS_LABEL:
       rtype = _("End Job Session");
       break;
-   case 0:
    case EOM_LABEL:
       rtype = _("End of Medium");
       break;
index d88a10991a5f37662e2bfa0c7ad3d7f004144caa..68ff836e263993a00eef79af22bf220c01349947 100644 (file)
@@ -10,7 +10,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2001-2006 Kern Sibbald
+   Copyright (C) 2001-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -48,7 +48,7 @@ static int  create_client_record(B_DB *db, CLIENT_DBR *cr);
 static int  create_fileset_record(B_DB *db, FILESET_DBR *fsr);
 static int  create_jobmedia_record(B_DB *db, JCR *jcr);
 static JCR *create_jcr(JOB_DBR *jr, DEV_RECORD *rec, uint32_t JobId);
-static int update_digest_record(B_DB *db, char *digest, DEV_RECORD *rec, int type);
+static int update_SIG_record(B_DB *db, char *SIGbuf, DEV_RECORD *rec, int type);
 
 
 /* Global variables */
@@ -292,7 +292,7 @@ int main (int argc, char *argv[])
    }
 
    free_jcr(bjcr);
-   dev->term();
+   term_dev(dev);
    return 0;
 }
 
@@ -373,7 +373,6 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    DEVICE *dev = dcr->dev;
    JCR *bjcr = dcr->jcr;
    DEV_BLOCK *block = dcr->block;
-   char digest[BASE64_SIZE(CRYPTO_DIGEST_MAX_SIZE)];
 
    if (rec->data_len > 0) {
       mr.VolBytes += rec->data_len + WRITE_RECHDR_LENGTH; /* Accumulate Volume bytes */
@@ -702,51 +701,24 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       free_jcr(mjcr);                 /* done using JCR */
       break;
 
-   case STREAM_MD5_DIGEST:
-      bin_to_base64(digest, (char *)rec->data, CRYPTO_DIGEST_MD5_SIZE);
+   case STREAM_MD5_SIGNATURE:
+      char MD5buf[50];
+      bin_to_base64(MD5buf, (char *)rec->data, 16); /* encode 16 bytes */
       if (verbose > 1) {
-         Pmsg1(000, _("Got MD5 record: %s\n"), digest);
+         Pmsg1(000, _("Got MD5 record: %s\n"), MD5buf);
       }
-      update_digest_record(db, digest, rec, CRYPTO_DIGEST_MD5);
+      update_SIG_record(db, MD5buf, rec, MD5_SIG);
       break;
 
-   case STREAM_SHA1_DIGEST:
-      bin_to_base64(digest, (char *)rec->data, CRYPTO_DIGEST_SHA1_SIZE);
+   case STREAM_SHA1_SIGNATURE:
+      char SIGbuf[50];
+      bin_to_base64(SIGbuf, (char *)rec->data, 20); /* encode 20 bytes */
       if (verbose > 1) {
-         Pmsg1(000, _("Got SHA1 record: %s\n"), digest);
+         Pmsg1(000, _("Got SHA1 record: %s\n"), SIGbuf);
       }
-      update_digest_record(db, digest, rec, CRYPTO_DIGEST_SHA1);
+      update_SIG_record(db, SIGbuf, rec, SHA1_SIG);
       break;
 
-   case STREAM_SHA256_DIGEST:
-      bin_to_base64(digest, (char *)rec->data, CRYPTO_DIGEST_SHA256_SIZE);
-      if (verbose > 1) {
-         Pmsg1(000, _("Got SHA256 record: %s\n"), digest);
-      }
-      update_digest_record(db, digest, rec, CRYPTO_DIGEST_SHA256);
-      break;
-
-   case STREAM_SHA512_DIGEST:
-      bin_to_base64(digest, (char *)rec->data, CRYPTO_DIGEST_SHA512_SIZE);
-      if (verbose > 1) {
-         Pmsg1(000, _("Got SHA512 record: %s\n"), digest);
-      }
-      update_digest_record(db, digest, rec, CRYPTO_DIGEST_SHA512);
-      break;
-
-   case STREAM_ENCRYPTED_SESSION_DATA:
-      // TODO landonf: Investigate crypto support in bscan
-      if (verbose > 1) {
-         Pmsg0(000, _("Got signed digest record\n"));
-      }
-      break;
-
-   case STREAM_SIGNED_DIGEST:
-      // TODO landonf: Investigate crypto support in bscan
-      if (verbose > 1) {
-         Pmsg0(000, _("Got signed digest record\n"));
-      }
-      break;
 
    case STREAM_PROGRAM_NAMES:
       if (verbose) {
@@ -1178,7 +1150,7 @@ static int create_jobmedia_record(B_DB *db, JCR *mjcr)
 /*
  * Simulate the database call that updates the MD5/SHA1 record
  */
-static int update_digest_record(B_DB *db, char *digest, DEV_RECORD *rec, int type)
+static int update_SIG_record(B_DB *db, char *SIGbuf, DEV_RECORD *rec, int type)
 {
    JCR *mjcr;
 
@@ -1198,7 +1170,7 @@ static int update_digest_record(B_DB *db, char *digest, DEV_RECORD *rec, int typ
       return 1;
    }
 
-   if (!db_add_digest_to_file_record(bjcr, db, mjcr->FileId, digest, type)) {
+   if (!db_add_SIG_to_file_record(bjcr, db, mjcr->FileId, SIGbuf, type)) {
       Pmsg1(0, _("Could not add MD5/SHA1 to File record. ERR=%s\n"), db_strerror(db));
       free_jcr(mjcr);
       return 0;
@@ -1252,7 +1224,10 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr)
    DEVICE *dev = dcr->dev;
    Dmsg0(20, "Enter dir_ask_sysop_to_mount_volume\n");
    /* Close device so user can use autochanger if desired */
-   dev->close();
+   if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
+      offline_dev(dev);
+   }
+   force_close_device(dev);
    fprintf(stderr, _("Mount Volume \"%s\" on device %s and press return when ready: "),
          dcr->VolumeName, dev->print_name());
    getchar();
index c8979749be3b2b45f13b04caae36a0eb712a0ce5..aa5301e37a121ff1749546f13e2fcaea44c46493 100644 (file)
@@ -138,7 +138,7 @@ int get_cmd(const char *prompt);
 
 /*********************************************************************
  *
- *         Main Bacula Pool Creation Program
+ *   Bacula tape testing program
  *
  */
 int main(int margc, char *margv[])
@@ -303,7 +303,7 @@ static void terminate_btape(int stat)
    jcr = NULL;
 
    if (dev) {
-      dev->term();
+      term_dev(dev);
    }
 
    if (debug_level > 10)
@@ -363,7 +363,7 @@ static void labelcmd()
 
    if (!dev->is_open()) {
       if (!first_open_device(dcr)) {
-         Pmsg1(0, _("Device open failed. ERR=%s\n"), dev->bstrerror());
+         Pmsg1(0, _("Device open failed. ERR=%s\n"), strerror_dev(dev));
       }
    }
    dev->rewind(dcr);
@@ -388,13 +388,13 @@ static void readlabelcmd()
       Pmsg0(0, _("Volume label read correctly.\n"));
       break;
    case VOL_IO_ERROR:
-      Pmsg1(0, _("I/O error on device: ERR=%s"), dev->bstrerror());
+      Pmsg1(0, _("I/O error on device: ERR=%s"), strerror_dev(dev));
       break;
    case VOL_NAME_ERROR:
       Pmsg0(0, _("Volume name error\n"));
       break;
    case VOL_CREATE_ERROR:
-      Pmsg1(0, _("Error creating label. ERR=%s"), dev->bstrerror());
+      Pmsg1(0, _("Error creating label. ERR=%s"), strerror_dev(dev));
       break;
    case VOL_VERSION_ERROR:
       Pmsg0(0, _("Volume version error.\n"));
@@ -421,7 +421,7 @@ static void loadcmd()
 {
 
    if (!load_dev(dev)) {
-      Pmsg1(0, _("Bad status from load. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from load. ERR=%s\n"), strerror_dev(dev));
    } else
       Pmsg1(0, _("Loaded %s\n"), dev->print_name());
 }
@@ -432,7 +432,7 @@ static void loadcmd()
 static void rewindcmd()
 {
    if (!dev->rewind(dcr)) {
-      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), strerror_dev(dev));
       clrerror_dev(dev, -1);
    } else {
       Pmsg1(0, _("Rewound %s\n"), dev->print_name());
@@ -462,7 +462,7 @@ static void weofcmd()
    }
 
    if ((stat = weof_dev(dev, num)) < 0) {
-      Pmsg2(0, _("Bad status from weof %d. ERR=%s\n"), stat, dev->bstrerror());
+      Pmsg2(0, _("Bad status from weof %d. ERR=%s\n"), stat, strerror_dev(dev));
       return;
    } else {
       if (num==1) {
@@ -483,8 +483,8 @@ static void weofcmd()
  */
 static void eomcmd()
 {
-   if (!dev->eod()) {
-      Pmsg1(0, "%s", dev->bstrerror());
+   if (!eod_dev(dev)) {
+      Pmsg1(0, "%s", strerror_dev(dev));
       return;
    } else {
       Pmsg0(0, _("Moved to end of medium.\n"));
@@ -513,8 +513,8 @@ static void bsfcmd()
       num = 1;
    }
 
-   if (!dev->bsf(num)) {
-      Pmsg1(0, _("Bad status from bsf. ERR=%s\n"), dev->bstrerror());
+   if (!bsf_dev(dev, num)) {
+      Pmsg1(0, _("Bad status from bsf. ERR=%s\n"), strerror_dev(dev));
    } else {
       Pmsg2(0, _("Backspaced %d file%s.\n"), num, num==1?"":"s");
    }
@@ -532,8 +532,8 @@ static void bsrcmd()
    if (num <= 0) {
       num = 1;
    }
-   if (!dev->bsr(num)) {
-      Pmsg1(0, _("Bad status from bsr. ERR=%s\n"), dev->bstrerror());
+   if (!bsr_dev(dev, num)) {
+      Pmsg1(0, _("Bad status from bsr. ERR=%s\n"), strerror_dev(dev));
    } else {
       Pmsg2(0, _("Backspaced %d record%s.\n"), num, num==1?"":"s");
    }
@@ -699,19 +699,19 @@ static int re_read_block_test()
    if (dev_cap(dev, CAP_TWOEOF)) {
       weofcmd();
    }
-   if (!dev->bsf(1)) {
-      Pmsg1(0, _("Backspace file failed! ERR=%s\n"), dev->bstrerror());
+   if (!bsf_dev(dev, 1)) {
+      Pmsg1(0, _("Backspace file failed! ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    if (dev_cap(dev, CAP_TWOEOF)) {
-      if (!dev->bsf(1)) {
-         Pmsg1(0, _("Backspace file failed! ERR=%s\n"), dev->bstrerror());
+      if (!bsf_dev(dev, 1)) {
+         Pmsg1(0, _("Backspace file failed! ERR=%s\n"), strerror_dev(dev));
          goto bail_out;
       }
    }
    Pmsg0(0, _("Backspaced over EOF OK.\n"));
-   if (!dev->bsr(1)) {
-      Pmsg1(0, _("Backspace record failed! ERR=%s\n"), dev->bstrerror());
+   if (!bsr_dev(dev, 1)) {
+      Pmsg1(0, _("Backspace record failed! ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    Pmsg0(0, _("Backspace record OK.\n"));
@@ -772,7 +772,7 @@ static int write_read_test()
    block = dcr->block;
    rec = new_record();
    if (!dev->rewind(dcr)) {
-      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    rec->data = check_pool_memory_size(rec->data, block->buf_len);
@@ -814,7 +814,7 @@ static int write_read_test()
       weofcmd();
    }
    if (!dev->rewind(dcr)) {
-      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    } else {
       Pmsg0(0, _("Rewind OK.\n"));
@@ -884,7 +884,7 @@ static int position_test()
    empty_block(block);
    rec = new_record();
    if (!dev->rewind(dcr)) {
-      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    rec->data = check_pool_memory_size(rec->data, block->buf_len);
@@ -926,7 +926,7 @@ static int position_test()
       weofcmd();
    }
    if (!dev->rewind(dcr)) {
-      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    } else {
       Pmsg0(0, _("Rewind OK.\n"));
@@ -970,7 +970,7 @@ static int position_test()
          continue;
       }
       Pmsg2(-1, _("Reposition to file:block %d:%d\n"), file, blk);
-      if (!dev->reposition(file, blk)) {
+      if (!reposition_dev(dev, file, blk)) {
          Pmsg0(0, _("Reposition error.\n"));
          goto bail_out;
       }
@@ -1053,7 +1053,7 @@ static int append_test()
    if (dev_cap(dev, CAP_TWOEOF)) {
       weofcmd();
    }
-   dev->close();              /* release device */
+   force_close_device(dev);              /* release device */
    if (!open_the_device()) {
       return -1;
    }
@@ -1147,8 +1147,9 @@ try_again:
    Dmsg1(100, "Results from loaded query=%s\n", results);
    if (loaded) {
       dcr->VolCatInfo.Slot = loaded;
+      offline_or_rewind_dev(dev);
       /* We are going to load a new tape, so close the device */
-      dev->close();
+      force_close_device(dev);
       Pmsg2(-1, _("3302 Issuing autochanger \"unload %d %d\" command.\n"),
          loaded, dev->drive_index);
       changer = edit_device_codes(dcr, changer, 
@@ -1173,7 +1174,7 @@ try_again:
    changer = edit_device_codes(dcr, changer, 
                 dcr->device->changer_command, "load");
    Dmsg1(100, "Changer=%s\n", changer);
-   dev->close();
+   force_close_device(dev);
    status = run_program(changer, timeout, results);
    if (status == 0) {
       Pmsg2(-1,  _("3303 Autochanger \"load %d %d\" status is OK.\n"),
@@ -1194,7 +1195,7 @@ try_again:
     */
    bmicrosleep(sleep_time, 0);
    if (!dev->rewind(dcr) || weof_dev(dev,1) < 0) {
-      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), strerror_dev(dev));
       clrerror_dev(dev, -1);
       Pmsg0(-1, _("\nThe test failed, probably because you need to put\n"
                 "a longer sleep time in the mtx-script in the load) case.\n"
@@ -1206,7 +1207,7 @@ try_again:
    }
 
    if ((status = weof_dev(dev, 1)) < 0) {
-      Pmsg2(0, _("Bad status from weof %d. ERR=%s\n"), status, dev->bstrerror());
+      Pmsg2(0, _("Bad status from weof %d. ERR=%s\n"), status, strerror_dev(dev));
       goto bail_out;
    } else {
       Pmsg1(0, _("Wrote EOF to %s\n"), dev->print_name());
@@ -1274,7 +1275,7 @@ test_again:
    rewindcmd();
    Pmsg0(0, _("Now forward spacing 1 file.\n"));
    if (!dev->fsf(1)) {
-      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    Pmsg2(-1, _("We should be in file 1. I am at file %d. %s\n"),
@@ -1286,7 +1287,7 @@ test_again:
 
    Pmsg0(0, _("Now forward spacing 2 files.\n"));
    if (!dev->fsf(2)) {
-      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    Pmsg2(-1, _("We should be in file 3. I am at file %d. %s\n"),
@@ -1299,7 +1300,7 @@ test_again:
    rewindcmd();
    Pmsg0(0, _("Now forward spacing 4 files.\n"));
    if (!dev->fsf(4)) {
-      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    Pmsg2(-1, _("We should be in file 4. I am at file %d. %s\n"),
@@ -1317,7 +1318,7 @@ test_again:
    Pmsg0(-1, "\n");
    Pmsg0(0, _("Now forward spacing 1 more file.\n"));
    if (!dev->fsf(1)) {
-      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), strerror_dev(dev));
    }
    Pmsg2(-1, _("We should be in file 5. I am at file %d. %s\n"),
       dev->file, dev->file == 5 ? _("This is correct!") : _("This is NOT correct!!!!"));
@@ -1464,7 +1465,7 @@ static void fsfcmd()
       num = 1;
    }
    if (!dev->fsf(num)) {
-      Pmsg1(0, _("Bad status from fsf. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from fsf. ERR=%s\n"), strerror_dev(dev));
       return;
    }
    if (num == 1) {
@@ -1486,7 +1487,7 @@ static void fsrcmd()
       num = 1;
    }
    if (!dev->fsr(num)) {
-      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
+      Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), strerror_dev(dev));
       return;
    }
    if (num == 1) {
@@ -1593,7 +1594,7 @@ static void scancmd()
          clrerror_dev(dev, -1);
          Mmsg2(dev->errmsg, _("read error on %s. ERR=%s.\n"),
             dev->dev_name, be.strerror());
-         Pmsg2(0, _("Bad status from read %d. ERR=%s\n"), stat, dev->bstrerror());
+         Pmsg2(0, _("Bad status from read %d. ERR=%s\n"), stat, strerror_dev(dev));
          if (blocks > 0) {
             if (blocks==1) {
                printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
@@ -1670,7 +1671,7 @@ static void scan_blocks()
    tot_files = dev->file;
    for (;;) {
       if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
-         Dmsg1(100, "!read_block(): ERR=%s\n", dev->bstrerror());
+         Dmsg1(100, "!read_block(): ERR=%s\n", strerror_dev(dev));
          if (dev->state & ST_EOT) {
             if (blocks > 0) {
                if (blocks==1) {
@@ -1709,7 +1710,7 @@ static void scan_blocks()
             printf(_("Short block read.\n"));
             continue;
          }
-         printf(_("Error reading block. ERR=%s\n"), dev->bstrerror());
+         printf(_("Error reading block. ERR=%s\n"), strerror_dev(dev));
          goto bail_out;
       }
       if (block->block_len != block_size) {
@@ -1755,7 +1756,7 @@ static void statcmd()
 {
    int debug = debug_level;
    debug_level = 30;
-   Pmsg2(0, _("Device status: %u. ERR=%s\n"), status_dev(dev), dev->bstrerror());
+   Pmsg2(0, _("Device status: %u. ERR=%s\n"), status_dev(dev), strerror_dev(dev));
 #ifdef xxxx
    dump_volume_label(dev);
 #endif
@@ -1851,7 +1852,7 @@ static void fillcmd()
    if (!write_session_label(dcr, SOS_LABEL)) {
       set_jcr_job_status(jcr, JS_ErrorTerminated);
       Jmsg1(jcr, M_FATAL, 0, _("Write session label failed. ERR=%s\n"),
-         dev->bstrerror());
+         strerror_dev(dev));
       ok = false;
    }
    Pmsg0(-1, _("Wrote Start of Session label.\n"));
@@ -1972,7 +1973,7 @@ static void fillcmd()
          set_jcr_job_status(jcr, JS_ErrorTerminated);
       }
       if (!write_session_label(dcr, EOS_LABEL)) {
-         Pmsg1(000, _("Error writting end session label. ERR=%s\n"), dev->bstrerror());
+         Pmsg1(000, _("Error writting end session label. ERR=%s\n"), strerror_dev(dev));
          ok = false;
       }
       /* Write out final block of this session */
@@ -2102,11 +2103,11 @@ static void do_unfill()
       /* Multiple Volume tape */
       /* Close device so user can use autochanger if desired */
       if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
-         dev->offline();
+         offline_dev(dev);
       }
       autochanger = autoload_device(dcr, 1, NULL);
       if (!autochanger) {
-         dev->close();
+         force_close_device(dev);
          get_cmd(_("Mount first tape. Press enter when ready: "));
       }
       free_restore_volume_list(jcr);
@@ -2114,7 +2115,8 @@ static void do_unfill()
       set_volume_name("TestVolume1", 1);
       jcr->bsr = NULL;
       create_restore_volume_list(jcr);
-      dev->close();
+      close_device(dev);
+      dev->state &= ~(ST_READ|ST_APPEND);
       dev->num_writers = 0;
       if (!acquire_device_for_read(dcr)) {
          Pmsg1(-1, "%s", dev->errmsg);
@@ -2137,13 +2139,13 @@ static void do_unfill()
    read_records(dcr, quickie_cb, my_mount_next_read_volume);
    Pmsg4(-1, _("Reposition from %u:%u to %u:%u\n"), dev->file, dev->block_num,
          last_file, last_block_num);
-   if (!dev->reposition(last_file, last_block_num)) {
-      Pmsg1(-1, _("Reposition error. ERR=%s\n"), dev->bstrerror());
+   if (!reposition_dev(dev, last_file, last_block_num)) {
+      Pmsg1(-1, _("Reposition error. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    Pmsg1(-1, _("Reading block %u.\n"), last_block_num);
    if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
-      Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
+      Pmsg1(-1, _("Error reading block: ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    if (compare_blocks(last_block, block)) {
@@ -2165,7 +2167,7 @@ static void do_unfill()
    /* Multiple Volume tape */
    /* Close device so user can use autochanger if desired */
    if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
-      dev->offline();
+      offline_dev(dev);
    }
 
    free_restore_volume_list(jcr);
@@ -2174,7 +2176,7 @@ static void do_unfill()
    create_restore_volume_list(jcr);
    autochanger = autoload_device(dcr, 1, NULL);
    if (!autochanger) {
-      dev->close();
+      force_close_device(dev);
       get_cmd(_("Mount second tape. Press enter when ready: "));
    }
 
@@ -2188,13 +2190,13 @@ static void do_unfill()
     * on the previous tape.
     */
    Pmsg2(-1, _("Reposition from %u:%u to 0:1\n"), dev->file, dev->block_num);
-   if (!dev->reposition(0, 1)) {
-      Pmsg1(-1, _("Reposition error. ERR=%s\n"), dev->bstrerror());
+   if (!reposition_dev(dev, 0, 1)) {
+      Pmsg1(-1, _("Reposition error. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
    if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
-      Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
+      Pmsg1(-1, _("Error reading block: ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    if (compare_blocks(first_block, block)) {
@@ -2204,13 +2206,13 @@ static void do_unfill()
    /* Now find and compare the last block */
    Pmsg4(-1, _("Reposition from %u:%u to %u:%u\n"), dev->file, dev->block_num,
          last_file, last_block_num);
-   if (!dev->reposition(last_file, last_block_num)) {
-      Pmsg1(-1, _("Reposition error. ERR=%s\n"), dev->bstrerror());
+   if (!reposition_dev(dev, last_file, last_block_num)) {
+      Pmsg1(-1, _("Reposition error. ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
    if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
-      Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
+      Pmsg1(-1, _("Error reading block: ERR=%s\n"), strerror_dev(dev));
       goto bail_out;
    }
    if (compare_blocks(last_block, block)) {
@@ -2337,7 +2339,7 @@ static int flush_block(DEV_BLOCK *block, int dump)
       } else {
          /* Full test in progress */
          if (!fixup_device_block_write_error(jcr->dcr)) {
-            Pmsg1(000, _("Cannot fixup device error. %s\n"), dev->bstrerror());
+            Pmsg1(000, _("Cannot fixup device error. %s\n"), strerror_dev(dev));
             ok = false;
             unlock_device(dev);
             return 0;
@@ -2675,7 +2677,11 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr)
    if (dcr->VolumeName[0] == 0) {
       return dir_ask_sysop_to_create_appendable_volume(dcr);
    }
-   dev->close();
+   /* Close device so user can use autochanger if desired */
+   if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
+      offline_dev(dev);
+   }
+   force_close_device(dev);
    Pmsg1(-1, "%s", dev->errmsg);           /* print reason */
    if (dcr->VolumeName[0] == 0 || strcmp(dcr->VolumeName, "TestVolume2") == 0) {
       fprintf(stderr, _("Mount second Volume on device %s and press return when ready: "),
@@ -2700,11 +2706,11 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr)
    }
    /* Close device so user can use autochanger if desired */
    if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
-      dev->offline();
+      offline_dev(dev);
    }
    autochanger = autoload_device(dcr, 1, NULL);
    if (!autochanger) {
-      dev->close();
+      force_close_device(dev);
       fprintf(stderr, _("Mount blank Volume on device %s and press return when ready: "),
          dev->print_name());
       getchar();
@@ -2747,7 +2753,8 @@ static bool my_mount_next_read_volume(DCR *dcr)
    set_volume_name("TestVolume2", 2);
    jcr->bsr = NULL;
    create_restore_volume_list(jcr);
-   dev->close();
+   close_device(dev);
+   dev->clear_read();
    if (!acquire_device_for_read(dcr)) {
       Pmsg2(0, _("Cannot open Dev=%s, Vol=%s\n"), dev->print_name(), dcr->VolumeName);
       return false;
index 44f190761fb94f402b2dc999697f9af5e8b9b579..43a8088a8f909425cd9c8dacddb39afc687db04c 100644 (file)
@@ -12,7 +12,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   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
@@ -93,7 +93,7 @@ JCR *setup_jcr(const char *name, char *dev_name, BSR *bsr,
    pm_strcpy(jcr->fileset_md5, "Dummy.fileset.md5");
 
    init_autochangers();
-   init_volume_list();
+   create_volume_list();
 
    dcr = setup_to_access_device(jcr, dev_name, VolumeName, mode);
    if (!dcr) {
@@ -121,6 +121,8 @@ static DCR *setup_to_access_device(JCR *jcr, char *dev_name,
    DCR *dcr;
    char VolName[MAX_NAME_LENGTH];
 
+   init_reservations_lock();
+
    /*
     * If no volume name already given and no bsr, and it is a file,
     * try getting name from Filename
index a00a6e25ea74af9c1b922601350f704d8525074a..294c17d9c33cda68bc667f92c6506eb5768a683a 100644 (file)
@@ -103,7 +103,7 @@ init_dev(JCR *jcr, DEVRES *device)
    DCR *dcr = NULL;
    DEVICE *dev;
 
-   
+
    /* If no device type specified, try to guess */
    if (!device->dev_type) {
       /* Check that device is available */
@@ -129,8 +129,9 @@ init_dev(JCR *jcr, DEVRES *device)
       }
    }
 
-   dev = (DEVICE *)malloc(sizeof(DEVICE));
+   dev = (DEVICE *)get_memory(sizeof(DEVICE));
    memset(dev, 0, sizeof(DEVICE));
+   dev->state = ST_MALLOC;
 
    /* Copy user supplied device parameters from Resource */
    dev->dev_name = get_memory(strlen(device->device_name)+1);
@@ -138,7 +139,6 @@ init_dev(JCR *jcr, DEVRES *device)
    dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
    /* We edit "Resource-name" (physical-name) */
    Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
-   Dmsg1(400, "Allocate dev=%s\n", dev->print_name());
    dev->capabilities = device->cap_bits;
    dev->min_block_size = device->min_block_size;
    dev->max_block_size = device->max_block_size;
@@ -154,7 +154,7 @@ init_dev(JCR *jcr, DEVRES *device)
    dev->autoselect = device->autoselect;
    dev->dev_type = device->dev_type;
    if (dev->is_tape()) { /* No parts on tapes */
-      dev->max_part_size = 0;
+       dev->max_part_size = 0;
    } else {
       dev->max_part_size = device->max_part_size;
    }
@@ -162,9 +162,7 @@ init_dev(JCR *jcr, DEVRES *device)
    if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
       dev->vol_poll_interval = 60;
    }
-   /* Link the dev and device structures together */
    dev->device = device;
-   device->dev = dev;
 
    if (dev->is_fifo()) {
       dev->capabilities |= CAP_STREAM; /* set stream device */
@@ -274,7 +272,7 @@ DEVICE::open(DCR *dcr, int omode)
       bstrncpy(VolCatInfo.VolCatName, dcr->VolumeName, sizeof(VolCatInfo.VolCatName));
    }
 
-   Dmsg4(29, "open dev: type=%d dev_name=%s vol=%s mode=%s\n", dev_type,
+   Dmsg4(29, "open dev: tape=%d dev_name=%s vol=%s mode=%s\n", is_tape(),
          print_name(), VolCatInfo.VolCatName, mode_to_str(omode));
    state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
    label_type = B_BACULA_LABEL;
@@ -285,12 +283,9 @@ DEVICE::open(DCR *dcr, int omode)
       open_dvd_device(dcr, omode);
    } else {
       Dmsg1(100, "call open_file_device mode=%s\n", mode_to_str(omode));
-      open_file_device(dcr, omode);
+      open_file_device(omode);
    }
    state |= preserve;                 /* reset any important state info */
-   if (preserve) {
-      Dmsg1(000, "preserve=0x%x\n", preserve);
-   }
    return fd;
 }
 
@@ -301,7 +296,11 @@ void DEVICE::set_mode(int new_mode)
       mode = O_CREAT | O_RDWR | O_BINARY;
       break;
    case OPEN_READ_WRITE:
-      mode = O_RDWR | O_BINARY;
+      if (is_dvd() || is_file()) {
+         mode = O_CREAT | O_RDWR | O_BINARY;
+      } else {
+         mode = O_RDWR | O_BINARY;
+      }
       break;
    case OPEN_READ_ONLY:
       mode = O_RDONLY | O_BINARY;
@@ -405,14 +404,10 @@ void DEVICE::set_blocking()
 /*
  * Open a file device
  */
-void DEVICE::open_file_device(DCR *dcr, int omode) 
+void DEVICE::open_file_device(int omode) 
 {
    POOL_MEM archive_name(PM_FNAME);
 
-   if (is_autochanger()) {
-      get_autochanger_loaded_slot(dcr);
-   }
-
    /*
     * Handle opening of File Archive (not a tape)
     */     
@@ -437,12 +432,15 @@ void DEVICE::open_file_device(DCR *dcr, int omode)
       pm_strcat(archive_name, VolCatInfo.VolCatName);
    }
 
-   mount(1);                          /* do mount if required */
          
+   Dmsg3(29, "open dev: %s dev=%s mode=%s\n", is_dvd()?"DVD":"disk",
+         archive_name.c_str(), mode_to_str(omode));
    openmode = omode;
+   Dmsg2(100, "openmode=%d %s\n", openmode, mode_to_str(openmode));
+   
    set_mode(omode);
    /* If creating file, give 0640 permissions */
-   Dmsg3(29, "open disk: mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode), 
+   Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode), 
          archive_name.c_str(), mode);
    /* Use system open() */
    if ((fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
@@ -456,13 +454,13 @@ void DEVICE::open_file_device(DCR *dcr, int omode)
       dev_errno = 0;
       update_pos_dev(this);                /* update position */
    }
-   Dmsg4(29, "open dev: disk fd=%d opened, part=%d/%d, part_size=%u\n", 
-      fd, part, num_parts, part_size);
+   Dmsg5(29, "open dev: %s fd=%d opened, part=%d/%d, part_size=%u\n", 
+      is_dvd()?"DVD":"disk", fd, part, num_parts, 
+      part_size);
 }
 
 /*
- * Open a DVD device. N.B. at this point, dcr->VolCatInfo.VolCatName 
- *  (NB:??? I think it's VolCatInfo.VolCatName that is right)
+ * Open a DVD device. N.B. at this point, dcr->VolCatInfo.VolCatName (NB:??? I think it's VolCatInfo.VolCatName that is right)
  *  has the desired Volume name, but there is NO assurance that
  *  any other field of VolCatInfo is correct.
  */
@@ -499,20 +497,21 @@ void DEVICE::open_dvd_device(DCR *dcr, int omode)
       dcr->dev->num_parts = dcr->VolCatInfo.VolCatParts;
    }
 
-   if (mount_dvd(this, 1)) {
+   if (mount_dev(this, 1)) {
       if ((num_parts == 0) && (!truncating)) {
          /* If we can mount the device, and we are not truncating the DVD, we usually want to abort. */
          /* There is one exception, if there is only one 0-sized file on the DVD, with the right volume name,
-          * we continue (it's the method used by truncate_dvd to truncate a volume). */
+          * we continue (it's the method used by truncate_dvd_dev to truncate a volume). */
          if (!check_can_write_on_non_blank_dvd(dcr)) {
             Mmsg(errmsg, _("The media in the device %s is not empty, please blank it before writing anything to it.\n"), print_name());
             Emsg0(M_FATAL, 0, errmsg);
-            unmount_dvd(this, 1); /* Unmount the device, so the operator can change it. */
+            unmount_dev(this, 1); /* Unmount the device, so the operator can change it. */
             clear_opened();
             return;
          }
       }
-   } else {
+   }
+   else {
       /* We cannot mount the device */
       if (num_parts == 0) {
          /* Run free space, check there is a media. */
@@ -625,7 +624,7 @@ bool DEVICE::rewind(DCR *dcr)
    unsigned int i;
    bool first = true;
 
-   Dmsg3(400, "rewind res=%d fd=%d %s\n", reserved_device, fd, print_name());
+   Dmsg3(29, "rewind res=%d fd=%d %s\n", reserved_device, fd, print_name());
    if (fd < 0) {
       if (!is_dvd()) { /* In case of major error, the fd is not open on DVD, so we don't want to abort. */
          dev_errno = EBADF;
@@ -760,54 +759,56 @@ void DEVICE::set_ateot()
  *  Returns: true  on succes
  *           false on error
  */
-bool DEVICE::eod()
+bool
+eod_dev(DEVICE *dev)
 {
    struct mtop mt_com;
    struct mtget mt_stat;
    bool ok = true;
    off_t pos;
 
-   if (fd < 0) {
-      dev_errno = EBADF;
-      Mmsg1(errmsg, _("Bad call to eod_dev. Device %s not open\n"), print_name());
+   if (dev->fd < 0) {
+      dev->dev_errno = EBADF;
+      Mmsg1(dev->errmsg, _("Bad call to eod_dev. Device %s not open\n"),
+            dev->print_name());
       return false;
    }
 
 #if defined (__digital__) && defined (__unix__)
-   return fsf(VolCatInfo.VolCatFiles);
+   return dev->fsf(dev->VolCatInfo.VolCatFiles);
 #endif
 
    Dmsg0(29, "eod_dev\n");
-   if (at_eot()) {
+   if (dev->at_eot()) {
       return true;
    }
-   state &= ~(ST_EOF);  /* remove EOF flags */
-   block_num = file = 0;
-   file_size = 0;
-   file_addr = 0;
-   if (is_fifo() || is_prog()) {
+   dev->state &= ~(ST_EOF);  /* remove EOF flags */
+   dev->block_num = dev->file = 0;
+   dev->file_size = 0;
+   dev->file_addr = 0;
+   if (dev->is_fifo() || dev->is_prog()) {
       return true;
    }
-   if (!is_tape()) {
-      pos = lseek_dev(this, (off_t)0, SEEK_END);
+   if (!dev->is_tape()) {
+      pos = lseek_dev(dev, (off_t)0, SEEK_END);
 //    Dmsg1(100, "====== Seek to %lld\n", pos);
       if (pos >= 0) {
-         update_pos_dev(this);
-         state |= ST_EOT;
+         update_pos_dev(dev);
+         dev->state |= ST_EOT;
          return true;
       }
-      dev_errno = errno;
+      dev->dev_errno = errno;
       berrno be;
-      Mmsg2(errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
-             print_name(), be.strerror());
+      Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
+             dev->print_name(), be.strerror());
       return false;
    }
 #ifdef MTEOM
-   if (has_cap(CAP_FASTFSF) && !has_cap(CAP_EOM)) {
+   if (dev_cap(dev, CAP_FASTFSF) && !dev_cap(dev, CAP_EOM)) {
       Dmsg0(100,"Using FAST FSF for EOM\n");
       /* If unknown position, rewind */
-      if (!dev_get_os_pos(this, &mt_stat)) {
-        if (!rewind(NULL)) {
+      if (!dev_get_os_pos(dev, &mt_stat)) {
+        if (!dev->rewind(NULL)) {
           return false;
         }
       }
@@ -822,33 +823,33 @@ bool DEVICE::eod()
       }
    }
 
-   if (has_cap(CAP_MTIOCGET) && (has_cap(CAP_FASTFSF) || has_cap(CAP_EOM))) {
-      if (has_cap(CAP_EOM)) {
+   if (dev_cap(dev, CAP_MTIOCGET) && (dev_cap(dev, CAP_FASTFSF) || dev_cap(dev, CAP_EOM))) {
+      if (dev_cap(dev, CAP_EOM)) {
          Dmsg0(100,"Using EOM for EOM\n");
          mt_com.mt_op = MTEOM;
          mt_com.mt_count = 1;
       }
 
-      if (ioctl(fd, MTIOCTOP, (char *)&mt_com) < 0) {
+      if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
          berrno be;
-         clrerror_dev(this, mt_com.mt_op);
+         clrerror_dev(dev, mt_com.mt_op);
          Dmsg1(50, "ioctl error: %s\n", be.strerror());
-         update_pos_dev(this);
-         Mmsg2(errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
-            print_name(), be.strerror());
+         update_pos_dev(dev);
+         Mmsg2(dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
+            dev->print_name(), be.strerror());
          return false;
       }
 
-      if (!dev_get_os_pos(this, &mt_stat)) {
+      if (!dev_get_os_pos(dev, &mt_stat)) {
          berrno be;
-         clrerror_dev(this, -1);
-         Mmsg2(errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
-            print_name(), be.strerror());
+         clrerror_dev(dev, -1);
+         Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
+            dev->print_name(), be.strerror());
          return false;
       }
       Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
-      set_ateof();
-      file = mt_stat.mt_fileno;
+      dev->set_ateof();
+      dev->file = mt_stat.mt_fileno;
    } else {
 #else
    {
@@ -856,29 +857,29 @@ bool DEVICE::eod()
       /*
        * Rewind then use FSF until EOT reached
        */
-      if (!rewind(NULL)) {
+      if (!dev->rewind(NULL)) {
          return false;
       }
       /*
        * Move file by file to the end of the tape
        */
       int file_num;
-      for (file_num=file; !at_eot(); file_num++) {
+      for (file_num=dev->file; !dev->at_eot(); file_num++) {
          Dmsg0(200, "eod_dev: doing fsf 1\n");
-         if (!fsf(1)) {
+         if (!dev->fsf(1)) {
             Dmsg0(200, "fsf error.\n");
             return false;
          }
          /*
           * Avoid infinite loop by ensuring we advance.
           */
-         if (file_num == (int)file) {
+         if (file_num == (int)dev->file) {
             struct mtget mt_stat;
             Dmsg1(100, "fsf did not advance from file %d\n", file_num);
-            set_ateof();
-            if (dev_get_os_pos(this, &mt_stat)) {
-               Dmsg2(100, "Adjust file from %d to %d\n", file , mt_stat.mt_fileno);
-               file = mt_stat.mt_fileno;
+            dev->set_ateof();
+            if (dev_get_os_pos(dev, &mt_stat)) {
+               Dmsg2(100, "Adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
+               dev->file = mt_stat.mt_fileno;
             }       
             break;
          }
@@ -889,21 +890,21 @@ bool DEVICE::eod()
     * MTEOM, so we must backup so that appending overwrites
     * the second EOF.
     */
-   if (has_cap(CAP_BSFATEOM)) {
+   if (dev_cap(dev, CAP_BSFATEOM)) {
       struct mtget mt_stat;
       /* Backup over EOF */
-      ok = bsf(1);
+      ok = bsf_dev(dev, 1);
       /* If BSF worked and fileno is known (not -1), set file */
-      if (dev_get_os_pos(this, &mt_stat)) {
-         Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", file , mt_stat.mt_fileno);
-         file = mt_stat.mt_fileno;
+      if (dev_get_os_pos(dev, &mt_stat)) {
+         Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
+         dev->file = mt_stat.mt_fileno;
       } else {
-         file++;                 /* wing it -- not correct on all OSes */
+         dev->file++;                 /* wing it -- not correct on all OSes */
       }
    } else {
-      update_pos_dev(this);                   /* update position */
+      update_pos_dev(dev);                   /* update position */
    }
-   Dmsg1(200, "EOD dev->file=%d\n", file);
+   Dmsg1(200, "EOD dev->file=%d\n", dev->file);
    return ok;
 }
 
@@ -1018,7 +1019,7 @@ uint32_t status_dev(DEVICE *dev)
          Pmsg0(-20, " IM_REP_EN");
       }
 #endif /* !SunOS && !OSF */
-      if (dev->has_cap(CAP_MTIOCGET)) {
+      if (dev_cap(dev, CAP_MTIOCGET)) {
          Pmsg2(-20, _(" file=%d block=%d\n"), mt_stat.mt_fileno, mt_stat.mt_blkno);
       } else {
          Pmsg2(-20, _(" file=%d block=%d\n"), -1, -1);
@@ -1080,44 +1081,44 @@ bool load_dev(DEVICE *dev)
  *  Returns: true  on success
  *           false on failure
  */
-bool DEVICE::offline()
+bool offline_dev(DEVICE *dev)
 {
    struct mtop mt_com;
 
-   if (!is_tape()) {
+   if (!dev || dev->fd < 0 || !dev->is_tape()) {
       return true;                    /* device not open */
    }
 
-   state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
-   block_num = file = 0;
-   file_size = 0;
-   file_addr = 0;
-   part = 0;
+   dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
+   dev->block_num = dev->file = 0;
+   dev->file_size = 0;
+   dev->file_addr = 0;
+   dev->part = 0;
 #ifdef MTUNLOCK
    mt_com.mt_op = MTUNLOCK;
    mt_com.mt_count = 1;
-   ioctl(fd, MTIOCTOP, (char *)&mt_com);
+   ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
 #endif
    mt_com.mt_op = MTOFFL;
    mt_com.mt_count = 1;
-   if (ioctl(fd, MTIOCTOP, (char *)&mt_com) < 0) {
+   if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
       berrno be;
-      dev_errno = errno;
-      Mmsg2(errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
-         print_name(), be.strerror());
+      dev->dev_errno = errno;
+      Mmsg2(dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
+         dev->print_name(), be.strerror());
       return false;
    }
-   Dmsg1(100, "Offlined device %s\n", print_name());
+   Dmsg1(100, "Offlined device %s\n", dev->print_name());
    return true;
 }
 
-bool DEVICE::offline_or_rewind()
+bool offline_or_rewind_dev(DEVICE *dev)
 {
-   if (fd < 0) {
+   if (dev->fd < 0) {
       return false;
    }
-   if (has_cap(CAP_OFFLINEUNMOUNT)) {
-      return offline();
+   if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
+      return offline_dev(dev);
    } else {
    /*
     * Note, this rewind probably should not be here (it wasn't
@@ -1126,8 +1127,8 @@ bool DEVICE::offline_or_rewind()
     *  such as backspacing after writing and EOF. If it is not
     *  done, all future references to the drive get and I/O error.
     */
-      clrerror_dev(this, MTREW);
-      return rewind(NULL);
+      clrerror_dev(dev, MTREW);
+      return dev->rewind(NULL);
    }
 }
 
@@ -1170,7 +1171,7 @@ bool DEVICE::fsf(int num)
     *  the SCSI driver will ensure that we do not
     *  forward space past the end of the medium.
     */
-   if (has_cap(CAP_FSF) && has_cap(CAP_MTIOCGET) && has_cap(CAP_FASTFSF)) {
+   if (dev_cap(this, CAP_FSF) && dev_cap(this, CAP_MTIOCGET) && dev_cap(this, CAP_FASTFSF)) {
       mt_com.mt_op = MTFSF;
       mt_com.mt_count = num;
       stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
@@ -1196,7 +1197,7 @@ bool DEVICE::fsf(int num)
     *  is the only way we can be sure that we don't read
     *  two consecutive EOF marks, which means End of Data.
     */
-   } else if (has_cap(CAP_FSF)) {
+   } else if (dev_cap(this, CAP_FSF)) {
       POOLMEM *rbuf;
       int rbuf_len;
       Dmsg0(200, "FSF has cap_fsf\n");
@@ -1296,38 +1297,39 @@ bool DEVICE::fsf(int num)
  *  Returns: false on failure
  *           true  on success
  */
-bool DEVICE::bsf(int num)
+bool
+bsf_dev(DEVICE *dev, int num)
 {
    struct mtop mt_com;
    int stat;
 
-   if (fd < 0) {
-      dev_errno = EBADF;
-      Mmsg0(errmsg, _("Bad call to bsf. Device not open\n"));
-      Emsg0(M_FATAL, 0, errmsg);
+   if (dev->fd < 0) {
+      dev->dev_errno = EBADF;
+      Mmsg0(dev->errmsg, _("Bad call to bsf_dev. Device not open\n"));
+      Emsg0(M_FATAL, 0, dev->errmsg);
       return false;
    }
 
-   if (!is_tape()) {
-      Mmsg1(errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
-         print_name());
+   if (!dev->is_tape()) {
+      Mmsg1(dev->errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
+         dev->print_name());
       return false;
    }
-   Dmsg0(29, "bsf\n");
-   state &= ~(ST_EOT|ST_EOF);
-   file -= num;
-   file_addr = 0;
-   file_size = 0;
+   Dmsg0(29, "bsf_dev\n");
+   dev->state &= ~(ST_EOT|ST_EOF);
+   dev->file -= num;
+   dev->file_addr = 0;
+   dev->file_size = 0;
    mt_com.mt_op = MTBSF;
    mt_com.mt_count = num;
-   stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
+   stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
    if (stat < 0) {
       berrno be;
-      clrerror_dev(this, MTBSF);
-      Mmsg2(errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
-         print_name(), be.strerror());
+      clrerror_dev(dev, MTBSF);
+      Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
+         dev->print_name(), be.strerror());
    }
-   update_pos_dev(this);
+   update_pos_dev(dev);
    return stat == 0;
 }
 
@@ -1352,7 +1354,7 @@ bool DEVICE::fsr(int num)
    if (!is_tape()) {
       return false;
    }
-   if (!has_cap(CAP_FSR)) {
+   if (!dev_cap(this, CAP_FSR)) {
       Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
       return false;
    }
@@ -1393,40 +1395,41 @@ bool DEVICE::fsr(int num)
  *   Returns:  false on failure
  *             true  on success
  */
-bool DEVICE::bsr(int num)
+bool
+bsr_dev(DEVICE *dev, int num)
 {
    struct mtop mt_com;
    int stat;
 
-   if (fd < 0) {
-      dev_errno = EBADF;
-      Mmsg0(errmsg, _("Bad call to bsr_dev. Device not open\n"));
-      Emsg0(M_FATAL, 0, errmsg);
+   if (dev->fd < 0) {
+      dev->dev_errno = EBADF;
+      Mmsg0(dev->errmsg, _("Bad call to bsr_dev. Device not open\n"));
+      Emsg0(M_FATAL, 0, dev->errmsg);
       return false;
    }
 
-   if (!is_tape()) {
+   if (!dev->is_tape()) {
       return false;
    }
 
-   if (!has_cap(CAP_BSR)) {
-      Mmsg1(errmsg, _("ioctl MTBSR not permitted on %s.\n"), print_name());
+   if (!dev_cap(dev, CAP_BSR)) {
+      Mmsg1(dev->errmsg, _("ioctl MTBSR not permitted on %s.\n"), dev->print_name());
       return false;
    }
 
    Dmsg0(29, "bsr_dev\n");
-   block_num -= num;
-   state &= ~(ST_EOF|ST_EOT|ST_EOF);
+   dev->block_num -= num;
+   dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
    mt_com.mt_op = MTBSR;
    mt_com.mt_count = num;
-   stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
+   stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
    if (stat < 0) {
       berrno be;
-      clrerror_dev(this, MTBSR);
-      Mmsg2(errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
-         print_name(), be.strerror());
+      clrerror_dev(dev, MTBSR);
+      Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
+         dev->print_name(), be.strerror());
    }
-   update_pos_dev(this);
+   update_pos_dev(dev);
    return stat == 0;
 }
 
@@ -1435,58 +1438,59 @@ bool DEVICE::bsr(int num)
  * Returns: false on failure
  *          true  on success
  */
-bool DEVICE::reposition(uint32_t rfile, uint32_t rblock)
+bool
+reposition_dev(DEVICE *dev, uint32_t file, uint32_t block)
 {
-   if (fd < 0) {
-      dev_errno = EBADF;
-      Mmsg0(errmsg, _("Bad call to reposition. Device not open\n"));
-      Emsg0(M_FATAL, 0, errmsg);
+   if (dev->fd < 0) {
+      dev->dev_errno = EBADF;
+      Mmsg0(dev->errmsg, _("Bad call to reposition_dev. Device not open\n"));
+      Emsg0(M_FATAL, 0, dev->errmsg);
       return false;
    }
 
-   if (!is_tape()) {
-      off_t pos = (((off_t)rfile)<<32) + (off_t)rblock;
+   if (!dev->is_tape()) {
+      off_t pos = (((off_t)file)<<32) + (off_t)block;
       Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
-      if (lseek_dev(this, pos, SEEK_SET) == (off_t)-1) {
+      if (lseek_dev(dev, pos, SEEK_SET) == (off_t)-1) {
          berrno be;
-         dev_errno = errno;
-         Mmsg2(errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
-            print_name(), be.strerror());
+         dev->dev_errno = errno;
+         Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
+            dev->print_name(), be.strerror());
          return false;
       }
-      file = rfile;
-      block_num = rblock;
-      file_addr = pos;
+      dev->file = file;
+      dev->block_num = block;
+      dev->file_addr = pos;
       return true;
    }
-   Dmsg4(100, "reposition from %u:%u to %u:%u\n",
-      file, block_num, rfile, rblock);
-   if (rfile < file) {
+   Dmsg4(100, "reposition_dev from %u:%u to %u:%u\n",
+      dev->file, dev->block_num, file, block);
+   if (file < dev->file) {
       Dmsg0(100, "Rewind\n");
-      if (!rewind(NULL)) {
+      if (!dev->rewind(NULL)) {
          return false;
       }
    }
-   if (rfile > file) {
-      Dmsg1(100, "fsf %d\n", rfile-file);
-      if (!fsf(rfile-file)) {
-         Dmsg1(100, "fsf failed! ERR=%s\n", bstrerror());
+   if (file > dev->file) {
+      Dmsg1(100, "fsf %d\n", file-dev->file);
+      if (!dev->fsf(file-dev->file)) {
+         Dmsg1(100, "fsf failed! ERR=%s\n", strerror_dev(dev));
          return false;
       }
-      Dmsg2(100, "wanted_file=%d at_file=%d\n", rfile, file);
+      Dmsg2(100, "wanted_file=%d at_file=%d\n", file, dev->file);
    }
-   if (rblock < block_num) {
-      Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
-      Dmsg0(100, "bsf 1\n");
-      bsf(1);
+   if (block < dev->block_num) {
+      Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
+      Dmsg0(100, "bsf_dev 1\n");
+      bsf_dev(dev, 1);
       Dmsg0(100, "fsf_dev 1\n");
-      fsf(1);
-      Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
+      dev->fsf(1);
+      Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
    }
-   if (has_cap(CAP_POSITIONBLOCKS) && rblock > block_num) {
+   if (dev_cap(dev, CAP_POSITIONBLOCKS) && block > dev->block_num) {
       /* Ignore errors as Bacula can read to the correct block */
-      Dmsg1(100, "fsr %d\n", rblock-block_num);
-      return fsr(rblock-block_num);
+      Dmsg1(100, "fsr %d\n", block-dev->block_num);
+      return dev->fsr(block-dev->block_num);
    }
    return true;
 }
@@ -1541,6 +1545,18 @@ weof_dev(DEVICE *dev, int num)
    return stat;
 }
 
+/*
+ * Return string message with last error in English
+ *  Be careful not to call this routine from within dev.c
+ *  while editing an Mmsg() or you will end up in a recursive
+ *  loop creating a Segmentation Violation.
+ */
+char *
+strerror_dev(DEVICE *dev)
+{
+   return dev->errmsg;
+}
+
 
 /*
  * If implemented in system, clear the tape
@@ -1661,31 +1677,33 @@ clrerror_dev(DEVICE *dev, int func)
 }
 
 /*
- * Close the device
+ * Flush buffer contents
+ *  No longer used.
  */
-void DEVICE::close()
+int flush_dev(DEVICE *dev)
 {
-   Dmsg1(100, "close_dev %s\n", print_name());
-   if (has_cap(CAP_OFFLINEUNMOUNT)) {
-      offline();
-   }
-   if (fd >= 0) {
-      ::close(fd);
-   } else {
-      return;                         /* already closed */
+   return 1;
+}
+
+static void do_close(DEVICE *dev)
+{
+
+   Dmsg1(100, "really close_dev %s\n", dev->print_name());
+   if (dev->fd >= 0) {
+      ::close(dev->fd);
    }
 
-   if (is_dvd() && !unmount_dvd(this, 1)) {
-      Dmsg1(0, "Cannot unmount device %s.\n", print_name());
+   if (!unmount_dev(dev, 1)) {
+      Dmsg1(0, "Cannot unmount device %s.\n", dev->print_name());
    }
    
    /* Remove the last part file if it is empty */
-   if (num_parts > 0) {
+   if (dev->num_parts > 0) {
       struct stat statp;
       POOL_MEM archive_name(PM_FNAME);
-      part = num_parts;
-      Dmsg1(100, "Call make_dvd_filename. Vol=%s\n", VolCatInfo.VolCatName);
-      make_spooled_dvd_filename(this, archive_name);
+      dev->part = dev->num_parts;
+      Dmsg1(100, "Call make_dvd_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
+      make_spooled_dvd_filename(dev, archive_name);
       /* Check that the part file is empty */
       if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
          Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
@@ -1694,263 +1712,59 @@ void DEVICE::close()
    }
    
    /* Clean up device packet so it can be reused */
-   clear_opened();
-   state &= ~(ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
-   label_type = B_BACULA_LABEL;
-   file = block_num = 0;
-   file_size = 0;
-   file_addr = 0;
-   part = 0;
-   num_parts = 0;
-   part_size = 0;
-   part_start = 0;
-   EndFile = EndBlock = 0;
-   memset(&VolCatInfo, 0, sizeof(VolCatInfo));
-   free_volume(this);
-   memset(&VolHdr, 0, sizeof(VolHdr));
-   if (tid) {
-      stop_thread_timer(tid);
-      tid = 0;
-   }
-   openmode = 0;
+   dev->clear_opened();
+   dev->state &= ~(ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
+   dev->label_type = B_BACULA_LABEL;
+   dev->file = dev->block_num = 0;
+   dev->file_size = 0;
+   dev->file_addr = 0;
+   dev->part = 0;
+   dev->num_parts = 0;
+   dev->part_size = 0;
+   dev->part_start = 0;
+   dev->EndFile = dev->EndBlock = 0;
+   free_volume(dev);
+   memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
+   memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
+   if (dev->tid) {
+      stop_thread_timer(dev->tid);
+      dev->tid = 0;
+   }
+   dev->openmode = 0;
 }
 
+/*
+ * Close the device
+ */
+void DEVICE::close()
+{
+   do_close(this);
+}
 
 
-bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
+bool truncate_dev(DCR *dcr) /* We need the DCR for DVD-writing */
 {
-   Dmsg1(100, "truncate_dev %s\n", print_name());
-   if (is_tape()) {
+   DEVICE *dev = dcr->dev;
+
+   Dmsg1(100, "truncate_dev %s\n", dev->print_name());
+   if (dev->is_tape()) {
       return true;                    /* we don't really truncate tapes */
       /* maybe we should rewind and write and eof ???? */
    }
    
-   if (is_dvd()) {
-      return truncate_dvd(dcr);
+   if (dev->is_dvd()) {
+      return truncate_dvd_dev(dcr);
    }
    
-   if (ftruncate(fd, 0) != 0) {
+   if (ftruncate(dev->fd, 0) != 0) {
       berrno be;
-      Mmsg2(errmsg, _("Unable to truncate device %s. ERR=%s\n"), 
-            print_name(), be.strerror());
-      return false;
-   }
-   return true;
-}
-
-/* Mount the device.
- * If timeout, wait until the mount command returns 0.
- * If !timeout, try to mount the device only once.
- */
-bool DEVICE::mount(int timeout) 
-{
-   Dmsg0(90, "Enter mount\n");
-   if (is_mounted()) {
-      return true;
-   } else if (requires_mount()) {
-      return do_mount(1, timeout);
-   }       
-   return true;
-}
-
-/* Unmount the device
- * If timeout, wait until the unmount command returns 0.
- * If !timeout, try to unmount the device only once.
- */
-bool DEVICE::unmount(int timeout) 
-{
-   Dmsg0(90, "Enter unmount_dvd\n");
-   if (is_mounted()) {
-      return do_mount(0, timeout);
-   }
-   return true;
-}
-
-/* (Un)mount the device */
-bool DEVICE::do_mount(int mount, int dotimeout) 
-{
-   POOL_MEM ocmd(PM_FNAME);
-   POOLMEM *results;
-   char *icmd;
-   int status, timeout;
-   
-   sm_check(__FILE__, __LINE__, false);
-   if (mount) {
-      if (is_mounted()) {
-         Dmsg0(200, "======= mount=1\n");
-         return true;
-      }
-      icmd = device->mount_command;
-   } else {
-      if (!is_mounted()) {
-         Dmsg0(200, "======= mount=0\n");
-         return true;
-      }
-      icmd = device->unmount_command;
-   }
-   
-   edit_mount_codes(ocmd, icmd);
-   
-   Dmsg2(000, "do_mount_dvd: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted());
-
-   if (dotimeout) {
-      /* Try at most 1 time to (un)mount the device. This should perhaps be configurable. */
-      timeout = 1;
-   } else {
-      timeout = 0;
-   }
-   results = get_memory(2000);
-   results[0] = 0;
-   /* If busy retry each second */
-   while ((status = run_program_full_output(ocmd.c_str(), 
-                       max_open_wait/2, results)) != 0) {
-      /* Doesn't work with internationalisation (This is not a problem) */
-      if (fnmatch("*is already mounted on", results, 0) == 0) {
-         break;
-      }
-      if (timeout-- > 0) {
-         /* Sometimes the device cannot be mounted because it is already mounted.
-          * Try to unmount it, then remount it */
-         if (mount) {
-            Dmsg1(400, "Trying to unmount the device %s...\n", print_name());
-            do_mount(0, 0);
-         }
-         bmicrosleep(1, 0);
-         continue;
-      }
-      Dmsg2(40, "Device %s cannot be mounted. ERR=%s\n", print_name(), results);
-      Mmsg(errmsg, _("Device %s cannot be mounted. ERR=%s\n"), 
-           print_name(), results);
-      /*
-       * Now, just to be sure it is not mounted, try to read the
-       *  filesystem.
-       */
-      DIR* dp;
-      struct dirent *entry, *result;
-      int name_max;
-      int count;
-      
-      name_max = pathconf(".", _PC_NAME_MAX);
-      if (name_max < 1024) {
-         name_max = 1024;
-      }
-         
-      if (!(dp = opendir(device->mount_point))) {
-         berrno be;
-         dev_errno = errno;
-         Dmsg3(29, "do_mount: failed to open dir %s (dev=%s), ERR=%s\n", 
-               device->mount_point, print_name(), be.strerror());
-         goto get_out;
-      }
-      
-      entry = (struct dirent *)malloc(sizeof(struct dirent) + name_max + 1000);
-      count = 0;
-      while (1) {
-         if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) {
-            dev_errno = EIO;
-            Dmsg2(129, "do_mount: failed to find suitable file in dir %s (dev=%s)\n", 
-                  device->mount_point, print_name());
-            break;
-         }
-         if ((strcmp(result->d_name, ".")) && (strcmp(result->d_name, "..")) && (strcmp(result->d_name, ".keep"))) {
-            count++; /* result->d_name != ., .. or .keep (Gentoo-specific) */
-            break;
-         } else {
-            Dmsg2(129, "do_mount: ignoring %s in %s\n", result->d_name, device->mount_point);
-         }
-      }
-      free(entry);
-      closedir(dp);
-      
-      Dmsg1(29, "do_mount: got %d files in the mount point (not counting ., .. and .keep)\n", count);
-      
-      if (count > 0) {
-         mount = 1;                      /* If we got more than ., .. and .keep */
-         break;                          /*   there must be something mounted */
-      }
-get_out:
-      set_mounted(false);
-      sm_check(__FILE__, __LINE__, false);
-      free_pool_memory(results);
-      Dmsg0(200, "============ mount=0\n");
+      Mmsg2(dev->errmsg, _("Unable to truncate device %s. ERR=%s\n"), 
+            dev->print_name(), be.strerror());
       return false;
    }
-   
-   set_mounted(mount);              /* set/clear mounted flag */
-   free_pool_memory(results);
-   Dmsg1(200, "============ mount=%d\n", mount);
    return true;
 }
 
-/*
- * Edit codes into (Un)MountCommand, Write(First)PartCommand
- *  %% = %
- *  %a = archive device name
- *  %e = erase (set if cannot mount and first part)
- *  %n = part number
- *  %m = mount point
- *  %v = last part name
- *
- *  omsg = edited output message
- *  imsg = input string containing edit codes (%x)
- *
- */
-void DEVICE::edit_mount_codes(POOL_MEM &omsg, const char *imsg)
-{
-   const char *p;
-   const char *str;
-   char add[20];
-   
-   POOL_MEM archive_name(PM_FNAME);
-
-   omsg.c_str()[0] = 0;
-   Dmsg1(800, "edit_mount_codes: %s\n", imsg);
-   for (p=imsg; *p; p++) {
-      if (*p == '%') {
-         switch (*++p) {
-         case '%':
-            str = "%";
-            break;
-         case 'a':
-            str = dev_name;
-            break;
-         case 'e':
-            if (num_parts == 0) {
-               str = "1";
-            } else {
-               str = "0";
-            }
-            break;
-         case 'n':
-            bsnprintf(add, sizeof(add), "%d", part);
-            str = add;
-            break;
-         case 'm':
-            str = device->mount_point;
-            break;
-         case 'v':
-            make_spooled_dvd_filename(this, archive_name);
-            str = archive_name.c_str();
-            break;
-         default:
-            add[0] = '%';
-            add[1] = *p;
-            add[2] = 0;
-            str = add;
-            break;
-         }
-      } else {
-         add[0] = *p;
-         add[1] = 0;
-         str = add;
-      }
-      Dmsg1(1900, "add_str %s\n", str);
-      pm_strcat(omsg, (char *)str);
-      Dmsg1(1800, "omsg=%s\n", omsg.c_str());
-   }
-}
-
-
 /* Return the resource name for the device */
 const char *DEVICE::name() const
 {
@@ -1978,35 +1792,41 @@ uint32_t dev_file(DEVICE *dev)
 /*
  * Free memory allocated for the device
  */
-void DEVICE::term(void)
+void
+term_dev(DEVICE *dev)
 {
-   Dmsg1(900, "term dev: %s\n", print_name());
-   close();
-   if (dev_name) {
-      free_memory(dev_name);
-      dev_name = NULL;
-   }
-   if (prt_name) {
-      free_memory(prt_name);
-      prt_name = NULL;
-   }
-   if (errmsg) {
-      free_pool_memory(errmsg);
-      errmsg = NULL;
-   }
-   pthread_mutex_destroy(&mutex);
-   pthread_cond_destroy(&wait);
-   pthread_cond_destroy(&wait_next_vol);
-   pthread_mutex_destroy(&spool_mutex);
-   rwl_destroy(&lock);
-   if (attached_dcrs) {
-      delete attached_dcrs;
-      attached_dcrs = NULL;
-   }
-   if (device) {
-      device->dev = NULL;
-   }
-   free((char *)this);
+   if (!dev) {
+      dev->dev_errno = EBADF;
+      Mmsg0(dev->errmsg, _("Bad call to term_dev. Device not open\n"));
+      Emsg0(M_FATAL, 0, dev->errmsg);
+      return;
+   }
+   Dmsg1(29, "term_dev: %s\n", dev->print_name());
+   do_close(dev);
+   if (dev->dev_name) {
+      free_memory(dev->dev_name);
+      dev->dev_name = NULL;
+   }
+   if (dev->prt_name) {
+      free_memory(dev->prt_name);
+      dev->prt_name = NULL;
+   }
+   if (dev->errmsg) {
+      free_pool_memory(dev->errmsg);
+      dev->errmsg = NULL;
+   }
+   pthread_mutex_destroy(&dev->mutex);
+   pthread_cond_destroy(&dev->wait);
+   pthread_cond_destroy(&dev->wait_next_vol);
+   pthread_mutex_destroy(&dev->spool_mutex);
+   rwl_destroy(&dev->lock);
+   if (dev->attached_dcrs) {
+      delete dev->attached_dcrs;
+      dev->attached_dcrs = NULL;
+   }
+   if (dev->state & ST_MALLOC) {
+      free_pool_memory((POOLMEM *)dev);
+   }
 }
 
 /*
@@ -2082,10 +1902,10 @@ void set_os_device_parameters(DEVICE *dev)
       }
       mt_com.mt_op = MTSETDRVBUFFER;
       mt_com.mt_count = MT_ST_CLEARBOOLEANS;
-      if (!dev->has_cap(CAP_TWOEOF)) {
+      if (!dev_cap(dev, CAP_TWOEOF)) {
          mt_com.mt_count |= MT_ST_TWO_FM;
       }
-      if (dev->has_cap(CAP_EOM)) {
+      if (dev_cap(dev, CAP_EOM)) {
          mt_com.mt_count |= MT_ST_FAST_MTEOM;
       }
       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
@@ -2143,7 +1963,7 @@ void set_os_device_parameters(DEVICE *dev)
 
 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
 {
-   return dev->has_cap(CAP_MTIOCGET) && 
+   return dev_cap(dev, CAP_MTIOCGET) && 
           ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
           mt_stat->mt_fileno >= 0;
 }
index 72a960704401acd6e0bbacb0c510f09d7380c625..7d62347ff8b09a8fb3e39d04905420d08d0df422 100644 (file)
@@ -309,6 +309,8 @@ public:
                      dev_blocked == BST_WAITING_FOR_SYSOP ||
                      dev_blocked == BST_UNMOUNTED_WAITING_FOR_SYSOP); };
    bool weof() { return !weof_dev(this, 1); };
+   bool fsr(int num);   /* in dev.c */
+   bool fsf(int num);   /* in dev.c */
    const char *strerror() const;
    const char *archive_name() const;
    const char *name() const;
@@ -319,7 +321,7 @@ public:
    void set_eof() { state |= ST_EOF; };
    void set_append() { state |= ST_APPEND; };
    void set_labeled() { state |= ST_LABEL; };
-   inline void set_read() { state |= ST_READ; };
+   void set_read() { state |= ST_READ; };
    void set_offline() { state |= ST_OFFLINE; };
    void set_mounted() { state |= ST_MOUNTED; };
    void set_media() { state |= ST_MEDIA; };
@@ -339,28 +341,14 @@ public:
    void clear_mounted() { state &= ~ST_MOUNTED; };
    void clear_media() { state &= ~ST_MEDIA; };
    void clear_short_block() { state &= ~ST_SHORT; };
-   void clear_freespace_ok() { state &= ~ST_FREESPACE_OK; };
-   char *bstrerror(void) { return errmsg; };
+   void clear_freespace_ok() { state &= ~ST_FREESPACE_OK; }
 
-   void block(int why);          /* in dev.c */
-   void unblock();               /* in dev.c */
-   void close();                 /* in dev.c */
-   bool truncate(DCR *dcr);      /* in dev.c */
+   void block(int why); /* in dev.c */
+   void unblock();      /* in dev.c */
+   void close();        /* in dev.c */
    int open(DCR *dcr, int mode); /* in dev.c */
-   void term(void);              /* in dev.c */
-   bool rewind(DCR *dcr);        /* in dev.c */
-   bool mount(int timeout);      /* in dev.c */
-   bool unmount(int timeout);    /* in dev.c */
-   void edit_mount_codes(POOL_MEM &omsg, const char *imsg); /* in dev.c */
-   bool offline_or_rewind();     /* in dev.c */
-   bool offline();               /* in dev.c */
-   bool bsf(int count);          /* in dev.c */
-   bool eod();                   /* in dev.c */
-   bool fsr(int num);            /* in dev.c */
-   bool fsf(int num);            /* in dev.c */
-   bool bsr(int num);            /* in dev.c */
-   bool scan_dir_for_volume(DCR *dcr); /* in scan.c */
-   bool reposition(uint32_t rfile, uint32_t rblock); /* in dev.c */
+   bool rewind(DCR *dcr);         /* in dev.c */
+
 
    void set_blocked(int block) { dev_blocked = block; };
    int  get_blocked() const { return dev_blocked; };
@@ -368,12 +356,11 @@ public:
    bool is_blocked() const { return dev_blocked != BST_NOT_BLOCKED; };
 
 private:
-   bool do_mount(int mount, int timeout);      /* in dev.c */
-   void set_mode(int omode);                   /* in dev.c */
+   void set_mode(int omode); /* in dev.c */
    void open_tape_device(DCR *dcr, int omode); /* in dev.c */
-   void open_file_device(DCR *dcr, int omode); /* in dev.c */
-   void open_dvd_device(DCR *dcr, int omode);  /* in dev.c */
-   void set_blocking();                        /* in dev.c */
+   void open_file_device(int omode); /* in dev.c */
+   void open_dvd_device(DCR *dcr, int omode); /* in dev.c */
+   void set_blocking(); /* in dev.c */
 
 };
 
index 30f6c403f6309a6ec211397ea79ff1236a62dff6..c7407d5d2411f51102022158da453041b51a5cbe 100644 (file)
@@ -291,17 +291,38 @@ bool open_device(DCR *dcr)
       /* If polling, ignore the error */
       /* If DVD, also ignore the error, very often you cannot open the device
        * (when there is no DVD, or when the one inserted is a wrong one) */
-      if (!dev->poll && !dev->is_dvd() && !dev->is_removable()) {
+      if ((!dev->poll) && (!dev->is_dvd())) {
          Jmsg2(dcr->jcr, M_FATAL, 0, _("Unable to open device %s: ERR=%s\n"),
-            dev->print_name(), dev->bstrerror());
+            dev->print_name(), strerror_dev(dev));
          Pmsg2(000, _("Unable to open archive %s: ERR=%s\n"), 
-            dev->print_name(), dev->bstrerror());
+            dev->print_name(), strerror_dev(dev));
       }
       return false;
    }
    return true;
 }
 
+/*
+ * Release any Volume attached to this device 
+ *  then close the device.
+ */
+void close_device(DEVICE *dev)
+{
+   free_volume(dev);
+   dev->close();
+}
+
+/*
+ */
+void force_close_device(DEVICE *dev)
+{
+   if (!dev || dev->fd < 0) {
+      return;
+   }
+   Dmsg1(29, "Force close_dev %s\n", dev->print_name());
+   free_volume(dev);
+   dev->close();
+}
 
 
 void dev_lock(DEVICE *dev)
index a371688fe336aeed6cea6487d8323b5a531a23a3..10c3a205905713df9b432215ea2a7623bad47a46 100644 (file)
@@ -20,7 +20,7 @@
  *
  */
 /*
-   Copyright (C) 2001-2006 Kern Sibbald
+   Copyright (C) 2001-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -71,7 +71,6 @@ static bool setdebug_cmd(JCR *jcr);
 static bool cancel_cmd(JCR *cjcr);
 static bool mount_cmd(JCR *jcr);
 static bool unmount_cmd(JCR *jcr);
-static bool bootstrap_cmd(JCR *jcr);
 static bool changer_cmd(JCR *sjcr);
 static bool do_label(JCR *jcr, int relabel);
 static DCR *find_device(JCR *jcr, POOL_MEM &dev_name, int drive);
@@ -192,7 +191,7 @@ void *handle_connection_request(void *arg)
       if ((bnet_stat = bnet_recv(bs)) <= 0) {
          break;               /* connection terminated */
       }
-      Dmsg1(199, "<dird: %s\n", bs->msg);
+      Dmsg1(199, "<dird: %s", bs->msg);
       /* Ensure that device initialization is complete */
       while (!init_done) {
          bmicrosleep(1, 0);
@@ -262,13 +261,13 @@ static bool cancel_cmd(JCR *cjcr)
       if (!(jcr=get_jcr_by_full_name(Job))) {
          bnet_fsend(dir, _("3904 Job %s not found.\n"), Job);
       } else {
-         P(jcr->mutex);
+         jcr->lock();
          oldStatus = jcr->JobStatus;
          set_jcr_job_status(jcr, JS_Canceled);
          if (!jcr->authenticated && oldStatus == JS_WaitFD) {
             pthread_cond_signal(&jcr->job_start_wait); /* wake waiting thread */
          }
-         V(jcr->mutex);
+         jcr->unlock();
          if (jcr->file_bsock) {
             bnet_sig(jcr->file_bsock, BNET_TERMINATE);
          }
@@ -345,9 +344,9 @@ static bool do_label(JCR *jcr, int relabel)
          dev = dcr->dev;
          P(dev->mutex);               /* Use P to avoid indefinite block */
          if (!dev->is_open()) {
-            Dmsg1(400, "Can %slabel. Device is not open\n", relabel?"re":"");
+            Dmsg0(400, "Can relabel. Device is not open\n");
             label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
-            dev->close();
+            force_close_device(dev);
          /* Under certain "safe" conditions, we can steal the lock */
          } else if (dev->can_steal_lock()) {
             Dmsg0(400, "Can relabel. can_steal_lock\n");
@@ -391,27 +390,15 @@ static void label_volume_if_ok(DCR *dcr, char *oldname,
    bsteal_lock_t hold;
    DEVICE *dev = dcr->dev;
    int label_status;
-   int mode;
 
    steal_device_lock(dev, &hold, BST_WRITING_LABEL);
    Dmsg1(100, "Stole device %s lock, writing label.\n", dev->print_name());
 
+   /* Note, try_autoload_device() opens the device */
    if (!try_autoload_device(dcr->jcr, slot, newname)) {
       goto bail_out;                  /* error */
    }
 
-   /* Ensure that the device is open -- autoload_device() closes it */
-   if (dev->is_tape()) {
-      mode = OPEN_READ_WRITE;
-   } else {
-      mode = CREATE_READ_WRITE;
-   }
-   if (dev->open(dcr, mode) < 0) {
-      bnet_fsend(dir, _("3910 Unable to open device %s: ERR=%s\n"),
-         dev->print_name(), dev->strerror());
-      return;      
-   }
-
    /* See what we have for a Volume */
    label_status = read_dev_volume_label(dcr);
    
@@ -441,7 +428,7 @@ static void label_volume_if_ok(DCR *dcr, char *oldname,
    case VOL_IO_ERROR:
    case VOL_NO_LABEL:
       if (!write_new_volume_label_to_dev(dcr, newname, poolname)) {
-         bnet_fsend(dir, _("3912 Failed to label Volume: ERR=%s\n"), dev->bstrerror());
+         bnet_fsend(dir, _("3912 Failed to label Volume: ERR=%s\n"), strerror_dev(dev));
          break;
       }
       bstrncpy(dcr->VolumeName, newname, sizeof(dcr->VolumeName));
@@ -450,7 +437,7 @@ static void label_volume_if_ok(DCR *dcr, char *oldname,
          newname, dev->print_name());
       break;
    case VOL_NO_MEDIA:
-      bnet_fsend(dir, _("3912 Failed to label Volume: ERR=%s\n"), dev->bstrerror());
+      bnet_fsend(dir, _("3912 Failed to label Volume: ERR=%s\n"), strerror_dev(dev));
       break;
    default:
       bnet_fsend(dir, _("3913 Cannot label Volume. "
@@ -528,42 +515,40 @@ static DCR *find_device(JCR *jcr, POOL_MEM &devname, int drive)
          break;
       }
    }
-   if (!found) {
-      foreach_res(changer, R_AUTOCHANGER) {
-         /* Find resource, and make sure we were able to open it */
-         if (fnmatch(devname.c_str(), changer->hdr.name, 0) == 0) {
-            /* Try each device in this AutoChanger */
-            foreach_alist(device, changer->device) {
-               Dmsg1(100, "Try changer device %s\n", device->hdr.name);
-               if (!device->dev) {
-                  device->dev = init_dev(jcr, device);
-               }
-               if (!device->dev) {
-                  Dmsg1(100, "Device %s could not be opened. Skipped\n", devname.c_str());
-                  Jmsg(jcr, M_WARNING, 0, _("\n"
-                     "     Device \"%s\" in changer \"%s\" requested by DIR could not be opened or does not exist.\n"),
-                       device->hdr.name, devname.c_str());
-                  continue;
-               }
-               if (!device->dev->autoselect) {
-                  Dmsg1(100, "Device %s not autoselect skipped.\n", devname.c_str());
-                  continue;              /* device is not available */
-               }
-               if (drive < 0 || drive == (int)device->dev->drive_index) {
-                  Dmsg1(20, "Found changer device %s\n", device->hdr.name);
-                  found = true;
-                  break;
-               }
-               Dmsg3(100, "Device %s drive wrong: want=%d got=%d skipping\n",
-                  devname.c_str(), drive, (int)device->dev->drive_index);
+   foreach_res(changer, R_AUTOCHANGER) {
+      /* Find resource, and make sure we were able to open it */
+      if (fnmatch(devname.c_str(), changer->hdr.name, 0) == 0) {
+         /* Try each device in this AutoChanger */
+         foreach_alist(device, changer->device) {
+            Dmsg1(100, "Try changer device %s\n", device->hdr.name);
+            if (!device->dev) {
+               device->dev = init_dev(jcr, device);
+            }
+            if (!device->dev) {
+               Dmsg1(100, "Device %s could not be opened. Skipped\n", devname.c_str());
+               Jmsg(jcr, M_WARNING, 0, _("\n"
+                  "     Device \"%s\" in changer \"%s\" requested by DIR could not be opened or does not exist.\n"),
+                    device->hdr.name, devname.c_str());
+               continue;
             }
-            break;                    /* we found it but could not open a device */
+            if (!device->dev->autoselect) {
+               Dmsg1(100, "Device %s not autoselect skipped.\n", devname.c_str());
+               continue;              /* device is not available */
+            }
+            if (drive < 0 || drive == (int)device->dev->drive_index) {
+               Dmsg1(20, "Found changer device %s\n", device->hdr.name);
+               found = true;
+               break;
+            }
+            Dmsg3(100, "Device %s drive wrong: want=%d got=%d skipping\n",
+               devname.c_str(), drive, (int)device->dev->drive_index);
          }
+         break;                    /* we found it but could not open a device */
       }
    }
 
    if (found) {
-      Dmsg1(100, "Found device %s\n", device->hdr.name);
+      Dmsg1(100, "Found changer device %s\n", device->hdr.name);
       dcr = new_dcr(jcr, device->dev);
       dcr->device = device;
       jcr->dcr = dcr;
@@ -606,7 +591,7 @@ static bool mount_cmd(JCR *jcr)
             /* We freed the device, so reopen it and wake any waiting threads */
             if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
                bnet_fsend(dir, _("3901 open device failed: ERR=%s\n"),
-                  dev->bstrerror());
+                  strerror_dev(dev));
                if (dev->dev_blocked == BST_UNMOUNTED) {
                   /* We blocked the device, so unblock it */
                   Dmsg0(100, "Unmounted. Unblocking device\n");
@@ -659,7 +644,7 @@ static bool mount_cmd(JCR *jcr)
             } else if (dev->is_tape()) {
                if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
                   bnet_fsend(dir, _("3901 open device failed: ERR=%s\n"),
-                     dev->bstrerror());
+                     strerror_dev(dev));
                   break;
                }
                read_label(dcr);
@@ -672,11 +657,11 @@ static bool mount_cmd(JCR *jcr)
                              dev->print_name());
                }
             } else if (dev->is_dvd()) {
-               if (mount_dvd(dev, 1)) {
+               if (mount_dev(dev, 1)) {
                   bnet_fsend(dir, _("3002 Device %s is mounted.\n"), 
                      dev->print_name());
                } else {
-                  bnet_fsend(dir, _("3907 %s"), dev->bstrerror());
+                  bnet_fsend(dir, _("3907 %s"), strerror_dev(dev));
                } 
             } else { /* must be file */
                bnet_fsend(dir, _("3906 File device %s is always mounted.\n"),
@@ -730,7 +715,8 @@ static bool unmount_cmd(JCR *jcr)
             Dmsg2(90, "%d waiter dev_block=%d. doing unmount\n", dev->num_waiting,
                dev->dev_blocked);
             if (!unload_autochanger(jcr->dcr, -1)) {
-               dev->close();
+               offline_or_rewind_dev(dev);
+               force_close_device(dev);
             }
             dev->dev_blocked = BST_UNMOUNTED_WAITING_FOR_SYSOP;
             bnet_fsend(dir, _("3001 Device %s unmounted.\n"), 
@@ -757,7 +743,8 @@ static bool unmount_cmd(JCR *jcr)
             dev->dev_blocked = BST_UNMOUNTED;
             dev->no_wait_id = 0;
             if (!unload_autochanger(jcr->dcr, -1)) {
-               dev->close();
+               offline_or_rewind_dev(dev);
+               force_close_device(dev);
             }
             bnet_fsend(dir, _("3002 Device %s unmounted.\n"), 
                dev->print_name());
@@ -841,10 +828,6 @@ static bool release_cmd(JCR *jcr)
 }
 
 
-static bool bootstrap_cmd(JCR *jcr)
-{
-   return get_bootstrap_file(jcr, jcr->dir_bsock);
-}
 
 /*
  * Autochanger command from Director
@@ -873,7 +856,7 @@ static bool changer_cmd(JCR *jcr)
       if (dcr) {
          dev = dcr->dev;
          P(dev->mutex);               /* Use P to avoid indefinite block */
-         if (!dev->device->changer_res) {     
+         if (!dev->device->changer_res) {
             bnet_fsend(dir, _("3995 Device %s is not an autochanger.\n"), 
                dev->print_name());
          /* Under certain "safe" conditions, we can steal the lock */
@@ -919,7 +902,7 @@ static bool readlabel_cmd(JCR *jcr)
          P(dev->mutex);               /* Use P to avoid indefinite block */
          if (!dev->is_open()) {
             read_volume_label(jcr, dev, Slot);
-            dev->close();
+            force_close_device(dev);
          /* Under certain "safe" conditions, we can steal the lock */
          } else if (dev->can_steal_lock()) {
             read_volume_label(jcr, dev, Slot);
@@ -942,7 +925,6 @@ static bool readlabel_cmd(JCR *jcr)
    return true;
 }
 
-
 /*
  * Read the tape label
  *
@@ -983,6 +965,7 @@ static bool try_autoload_device(JCR *jcr, int slot, const char *VolName)
 {
    DCR *dcr = jcr->dcr;
    BSOCK *dir = jcr->dir_bsock;
+   DEVICE *dev = dcr->dev;
 
    bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
    dcr->VolCatInfo.Slot = slot;
@@ -990,6 +973,13 @@ static bool try_autoload_device(JCR *jcr, int slot, const char *VolName)
    if (autoload_device(dcr, 0, dir) < 0) {    /* autoload if possible */
       return false;
    }
+
+   /* Ensure that the device is open -- autoload_device() closes it */
+   if (dev->open(dcr, OPEN_READ_WRITE) < 0) {
+      bnet_fsend(dir, _("3910 Unable to open device %s: ERR=%s\n"),
+         dev->print_name(), dev->strerror());
+      return false;
+   }
    return true;
 }
 
index 828425691106fb5cf6cb87db20df1e0287a9bdf2..417cf5fcec0fad34143699161341700c004b17d1 100644 (file)
@@ -8,7 +8,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2005-2006 Kern Sibbald
+   Copyright (C) 2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -26,7 +26,8 @@
 #include "stored.h"
 
 /* Forward referenced functions */
-static bool do_mount_dvd(DEVICE* dev, int mount, int dotimeout);
+static void edit_device_codes_dev(DEVICE *dev, POOL_MEM &omsg, const char *imsg);
+static bool do_mount_dev(DEVICE* dev, int mount, int dotimeout);
 static void add_file_and_part_name(DEVICE *dev, POOL_MEM &archive_name);
 
 /* 
@@ -65,20 +66,20 @@ static void add_file_and_part_name(DEVICE *dev, POOL_MEM &archive_name)
       bsnprintf(partnumber, sizeof(partnumber), "%d", dev->part);
       pm_strcat(archive_name, partnumber);
    }
-   Dmsg1(400, "Exit make_dvd_filename: arch=%s\n", archive_name.c_str());
+   Dmsg1(100, "Exit make_dvd_filename: arch=%s\n", archive_name.c_str());
 }  
 
 /* Mount the device.
  * If timeout, wait until the mount command returns 0.
  * If !timeout, try to mount the device only once.
  */
-bool mount_dvd(DEVICE* dev, int timeout) 
+bool mount_dev(DEVICE* dev, int timeout) 
 {
-   Dmsg0(90, "Enter mount_dvd\n");
+   Dmsg0(90, "Enter mount_dev\n");
    if (dev->is_mounted()) {
       return true;
    } else if (dev->requires_mount()) {
-      return do_mount_dvd(dev, 1, timeout);
+      return do_mount_dev(dev, 1, timeout);
    }       
    return true;
 }
@@ -87,20 +88,17 @@ bool mount_dvd(DEVICE* dev, int timeout)
  * If timeout, wait until the unmount command returns 0.
  * If !timeout, try to unmount the device only once.
  */
-bool unmount_dvd(DEVICE *dev, int timeout) 
+bool unmount_dev(DEVICE *dev, int timeout) 
 {
-   if (!dev->is_dvd()) {
-      return true;
-   }
-   Dmsg0(90, "Enter unmount_dvd\n");
+   Dmsg0(90, "Enter unmount_dev\n");
    if (dev->is_mounted()) {
-      return do_mount_dvd(dev, 0, timeout);
+      return do_mount_dev(dev, 0, timeout);
    }
    return true;
 }
 
 /* (Un)mount the device */
-static bool do_mount_dvd(DEVICE* dev, int mount, int dotimeout) 
+static bool do_mount_dev(DEVICE* dev, int mount, int dotimeout) 
 {
    POOL_MEM ocmd(PM_FNAME);
    POOLMEM *results;
@@ -122,9 +120,9 @@ static bool do_mount_dvd(DEVICE* dev, int mount, int dotimeout)
       icmd = dev->device->unmount_command;
    }
    
-   dev->edit_mount_codes(ocmd, icmd);
+   edit_device_codes_dev(dev, ocmd, icmd);
    
-   Dmsg2(200, "do_mount_dvd: cmd=%s mounted=%d\n", ocmd.c_str(), !!dev->is_mounted());
+   Dmsg2(200, "do_mount_dev: cmd=%s mounted=%d\n", ocmd.c_str(), !!dev->is_mounted());
 
    if (dotimeout) {
       /* Try at most 1 time to (un)mount the device. This should perhaps be configurable. */
@@ -146,7 +144,7 @@ static bool do_mount_dvd(DEVICE* dev, int mount, int dotimeout)
           * Try to unmount it, then remount it */
          if (mount) {
             Dmsg1(400, "Trying to unmount the device %s...\n", dev->print_name());
-            do_mount_dvd(dev, 0, 0);
+            do_mount_dev(dev, 0, 0);
          }
          bmicrosleep(1, 0);
          continue;
@@ -161,7 +159,7 @@ static bool do_mount_dvd(DEVICE* dev, int mount, int dotimeout)
       DIR* dp;
       struct dirent *entry, *result;
       int name_max;
-      int count;
+      int count = 0;
       
       name_max = pathconf(".", _PC_NAME_MAX);
       if (name_max < 1024) {
@@ -171,34 +169,31 @@ static bool do_mount_dvd(DEVICE* dev, int mount, int dotimeout)
       if (!(dp = opendir(dev->device->mount_point))) {
          berrno be;
          dev->dev_errno = errno;
-         Dmsg3(29, "do_mount_dvd: failed to open dir %s (dev=%s), ERR=%s\n", 
+         Dmsg3(29, "open_mounted_dev: failed to open dir %s (dev=%s), ERR=%s\n", 
                dev->device->mount_point, dev->print_name(), be.strerror());
          goto get_out;
       }
       
       entry = (struct dirent *)malloc(sizeof(struct dirent) + name_max + 1000);
-      count = 0;
       while (1) {
          if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) {
             dev->dev_errno = EIO;
-            Dmsg2(129, "do_mount_dvd: failed to find suitable file in dir %s (dev=%s)\n", 
+            Dmsg2(129, "open_mounted_dev: failed to find suitable file in dir %s (dev=%s)\n", 
                   dev->device->mount_point, dev->print_name());
             break;
          }
-         if (strcmp(result->d_name, ".") && strcmp(result->d_name, "..") && 
-             strcmp(result->d_name, ".keep")) {
+         if ((strcmp(result->d_name, ".")) && (strcmp(result->d_name, "..")) && (strcmp(result->d_name, ".keep"))) {
             count++; /* result->d_name != ., .. or .keep (Gentoo-specific) */
-            break;
          }
          else {
-            Dmsg2(129, "do_mount_dvd: ignoring %s in %s\n", 
+            Dmsg2(129, "open_mounted_dev: ignoring %s in %s\n", 
                   result->d_name, dev->device->mount_point);
          }
       }
       free(entry);
       closedir(dp);
       
-      Dmsg1(29, "do_mount_dvd: got %d files in the mount point (not counting ., .. and .keep)\n", count);
+      Dmsg1(29, "open_mounted_dev: got %d files in the mount point (not counting ., .. and .keep)\n", count);
       
       if (count > 0) {
          mount = 1;                      /* If we got more than ., .. and .keep */
@@ -233,7 +228,7 @@ void update_free_space_dev(DEVICE* dev)
    char ed1[50];
    
    /* The device must be mounted in order to dvd-freespace to work */
-   mount_dvd(dev, 1);
+   mount_dev(dev, 1);
    
    sm_check(__FILE__, __LINE__, false);
    icmd = dev->device->free_space_command;
@@ -248,7 +243,7 @@ void update_free_space_dev(DEVICE* dev)
       return;
    }
    
-   dev->edit_mount_codes(ocmd, icmd);
+   edit_device_codes_dev(dev, ocmd, icmd);
    
    Dmsg1(29, "update_free_space_dev: cmd=%s\n", ocmd.c_str());
 
@@ -259,7 +254,7 @@ void update_free_space_dev(DEVICE* dev)
    
    while (1) {
       if (run_program_full_output(ocmd.c_str(), dev->max_open_wait/2, results) == 0) {
-         Dmsg1(400, "Free space program run : %s\n", results);
+         Dmsg1(100, "Free space program run : %s\n", results);
          free = str_to_int64(results);
          if (free >= 0) {
             dev->free_space = free;
@@ -303,7 +298,7 @@ void update_free_space_dev(DEVICE* dev)
  * Write a part (Vol, Vol.1, ...) from the spool to the DVD   
  * This routine does not update the part number, so normally, you
  *  should call open_next_part()
- * It is also called from truncate_dvd to "blank" the medium, as
+ * It is also called from truncate_dvd_dev to "blank" the medium, as
  *  well as from block.c when the DVD is full to write the last part.
  */
 bool dvd_write_part(DCR *dcr) 
@@ -347,7 +342,7 @@ bool dvd_write_part(DCR *dcr)
    Dmsg3(29, "dvd_write_part: device is %s, part is %d, is_mounted=%d\n", dev->print_name(), dev->part, dev->is_mounted());
    icmd = dev->device->write_part_command;
    
-   dev->edit_mount_codes(ocmd, icmd);
+   edit_device_codes_dev(dev, ocmd, icmd);
       
    /*
     * original line follows
@@ -395,7 +390,7 @@ bool dvd_write_part(DCR *dcr)
    
    /* growisofs umounted the device, so remount it (it will update the free space) */
    dev->clear_mounted();
-   mount_dvd(dev, 1);
+   mount_dev(dev, 1);
    Jmsg(dcr->jcr, M_INFO, 0, _("Remaining free space %s on %s\n"), 
       edit_uint64_with_commas(dev->free_space, ed1), dev->print_name());
    sm_check(__FILE__, __LINE__, false);
@@ -472,7 +467,7 @@ int dvd_open_next_part(DCR *dcr)
          }
       }
 
-      Dmsg2(400, "num_parts=%d part=%d\n", dev->num_parts, dev->part);
+      Dmsg2(100, "num_parts=%d part=%d\n", dev->num_parts, dev->part);
       dev->VolCatInfo.VolCatParts = dev->part;
       make_spooled_dvd_filename(dev, archive_name);   /* makes spool name */
       
@@ -497,11 +492,11 @@ int dvd_open_next_part(DCR *dcr)
     *  think it is not needed.
     */
    if (dev->num_parts < dev->part) {
-      Dmsg2(400, "Set npart=%d to part=%d\n", dev->num_parts, dev->part);
+      Dmsg2(100, "Set npart=%d to part=%d\n", dev->num_parts, dev->part);
       dev->num_parts = dev->part;
       dev->VolCatInfo.VolCatParts = dev->part;
    }
-   Dmsg2(400, "Call dev->open(vol=%s, mode=%d\n", dev->VolCatInfo.VolCatName, 
+   Dmsg2(50, "Call dev->open(vol=%s, mode=%d\n", dev->VolCatInfo.VolCatName, 
          dev->openmode);
    /* Open next part */
    
@@ -537,17 +532,17 @@ int dvd_open_first_part(DCR *dcr, int mode)
    dev->part_start = 0;
    dev->part = 0;
    
-   Dmsg2(400, "Call dev->open(vol=%s, mode=%d)\n", dcr->VolCatInfo.VolCatName, 
+   Dmsg2(50, "Call dev->open(vol=%s, mode=%d)\n", dcr->VolCatInfo.VolCatName, 
          mode);
    int append = dev->can_append();
    if (dev->open(dcr, mode) < 0) {
-      Dmsg0(400, "open dev() failed\n");
+      Dmsg0(50, "open dev() failed\n");
       return -1;
    }
    if (append && (dev->part == dev->num_parts)) { /* If needed, set the append flag back */
       dev->set_append();
    }
-   Dmsg2(400, "Leave open_first_part state=%s append=%d\n", dev->is_open()?"open":"not open", dev->can_append());
+   Dmsg2(50, "Leave open_first_part state=%s append=%d\n", dev->is_open()?"open":"not open", dev->can_append());
    
    return dev->fd;
 }
@@ -560,17 +555,17 @@ off_t lseek_dev(DEVICE *dev, off_t offset, int whence)
    off_t pos;
    char ed1[50], ed2[50];
    
-   Dmsg3(400, "Enter lseek_dev fd=%d part=%d nparts=%d\n", dev->fd,
+   Dmsg3(100, "Enter lseek_dev fd=%d part=%d nparts=%d\n", dev->fd,
       dev->part, dev->num_parts);
    if (!dev->is_dvd()) { 
-      Dmsg0(400, "Using sys lseek\n");
+      Dmsg0(100, "Using sys lseek\n");
       return lseek(dev->fd, offset, whence);
    }
       
    dcr = (DCR *)dev->attached_dcrs->first();  /* any dcr will do */
    switch(whence) {
    case SEEK_SET:
-      Dmsg2(400, "lseek_dev SEEK_SET to %s (part_start=%s)\n",
+      Dmsg2(100, "lseek_dev SEEK_SET to %s (part_start=%s)\n",
          edit_uint64(offset, ed1), edit_uint64(dev->part_start, ed2));
       if ((uint64_t)offset >= dev->part_start) {
          if (((uint64_t)offset == dev->part_start) || ((uint64_t)offset < (dev->part_start+dev->part_size))) {
@@ -583,7 +578,7 @@ off_t lseek_dev(DEVICE *dev, off_t offset, int whence)
          } else {
             /* Load next part, and start again */
             if (dvd_open_next_part(dcr) < 0) {
-               Dmsg0(400, "lseek_dev failed while trying to open the next part\n");
+               Dmsg0(100, "lseek_dev failed while trying to open the next part\n");
                return -1;
             }
             return lseek_dev(dev, offset, SEEK_SET);
@@ -596,27 +591,27 @@ off_t lseek_dev(DEVICE *dev, off_t offset, int whence)
           * until the right one is loaded
           */
          if (dvd_open_first_part(dcr, dev->openmode) < 0) {
-            Dmsg0(400, "lseek_dev failed while trying to open the first part\n");
+            Dmsg0(100, "lseek_dev failed while trying to open the first part\n");
             return -1;
          }
          return lseek_dev(dev, offset, SEEK_SET);
       }
       break;
    case SEEK_CUR:
-      Dmsg1(400, "lseek_dev SEEK_CUR to %s\n", edit_uint64(offset, ed1));
+      Dmsg1(100, "lseek_dev SEEK_CUR to %s\n", edit_uint64(offset, ed1));
       if ((pos = lseek(dev->fd, (off_t)0, SEEK_CUR)) < 0) {
          return pos;   
       }
       pos += dev->part_start;
       if (offset == 0) {
-         Dmsg1(400, "lseek_dev SEEK_CUR returns %s\n", edit_uint64(pos, ed1));
+         Dmsg1(100, "lseek_dev SEEK_CUR returns %s\n", edit_uint64(pos, ed1));
          return pos;
       } else { /* Not used in Bacula, but should work */
          return lseek_dev(dev, pos, SEEK_SET);
       }
       break;
    case SEEK_END:
-      Dmsg1(400, "lseek_dev SEEK_END to %s\n", edit_uint64(offset, ed1));
+      Dmsg1(100, "lseek_dev SEEK_END to %s\n", edit_uint64(offset, ed1));
       /*
        * Bacula does not use offsets for SEEK_END
        *  Also, Bacula uses seek_end only when it wants to
@@ -625,7 +620,7 @@ off_t lseek_dev(DEVICE *dev, off_t offset, int whence)
        *  itself is read-only (as currently implemented).
        */
       if (offset > 0) { /* Not used by bacula */
-         Dmsg1(400, "lseek_dev SEEK_END called with an invalid offset %s\n", 
+         Dmsg1(100, "lseek_dev SEEK_END called with an invalid offset %s\n", 
             edit_uint64(offset, ed1));
          errno = EINVAL;
          return -1;
@@ -637,7 +632,7 @@ off_t lseek_dev(DEVICE *dev, off_t offset, int whence)
          if ((pos = lseek(dev->fd, (off_t)0, SEEK_END)) < 0) {
             return pos;   
          } else {
-            Dmsg1(400, "lseek_dev SEEK_END returns %s\n", 
+            Dmsg1(100, "lseek_dev SEEK_END returns %s\n", 
                   edit_uint64(pos + dev->part_start, ed1));
             return pos + dev->part_start;
          }
@@ -652,19 +647,19 @@ off_t lseek_dev(DEVICE *dev, off_t offset, int whence)
          int modesave = dev->openmode;
          /* Works because num_parts > 0. */
          if (dvd_open_first_part(dcr, OPEN_READ_ONLY) < 0) {
-            Dmsg0(400, "lseek_dev failed while trying to open the first part\n");
+            Dmsg0(100, "lseek_dev failed while trying to open the first part\n");
             return -1;
          }
          if (dev->num_parts > 0) {
             while (dev->part < (dev->num_parts-1)) {
                if (dvd_open_next_part(dcr) < 0) {
-                  Dmsg0(400, "lseek_dev failed while trying to open the next part\n");
+                  Dmsg0(100, "lseek_dev failed while trying to open the next part\n");
                   return -1;
                }
             }
             dev->openmode = modesave;
             if (dvd_open_next_part(dcr) < 0) {
-               Dmsg0(400, "lseek_dev failed while trying to open the next part\n");
+               Dmsg0(100, "lseek_dev failed while trying to open the next part\n");
                return -1;
             }
          }
@@ -688,7 +683,7 @@ bool dvd_close_job(DCR *dcr)
     * that requires mount, it will be written to the device.
     */
    if (dev->is_dvd() && jcr->write_part_after_job && (dev->part_size > 0)) {
-      Dmsg1(400, "Writing last part=%d write_partafter_job is set.\n",
+      Dmsg1(100, "Writing last part=%d write_partafter_job is set.\n",
          dev->part);
       if (dev->part < dev->num_parts) {
          Jmsg3(jcr, M_FATAL, 0, _("Error while writing, current part number is less than the total number of parts (%d/%d, device=%s)\n"),
@@ -703,7 +698,7 @@ bool dvd_close_job(DCR *dcr)
          update the part number. */
       if (ok && (dvd_open_next_part(dcr) < 0)) {
          Jmsg2(jcr, M_FATAL, 0, _("Unable to write part %s: ERR=%s\n"),
-               dev->print_name(), dev->bstrerror());
+               dev->print_name(), strerror_dev(dev));
          dev->dev_errno = EIO;
          ok = false;
       }
@@ -713,7 +708,7 @@ bool dvd_close_job(DCR *dcr)
    return ok;
 }
 
-bool truncate_dvd(DCR *dcr) {
+bool truncate_dvd_dev(DCR *dcr) {
    DEVICE* dev = dcr->dev;
 
    /* Set num_parts to zero (on disk) */
@@ -721,17 +716,17 @@ bool truncate_dvd(DCR *dcr) {
    dcr->VolCatInfo.VolCatParts = 0;
    dev->VolCatInfo.VolCatParts = 0;
    
-   Dmsg0(400, "truncate_dvd: Opening first part (1)...\n");
+   Dmsg0(100, "truncate_dvd_dev: Opening first part (1)...\n");
    
    dev->truncating = true;
    if (dvd_open_first_part(dcr, OPEN_READ_WRITE) < 0) {
-      Dmsg0(400, "truncate_dvd: Error while opening first part (1).\n");
+      Dmsg0(100, "truncate_dvd_dev: Error while opening first part (1).\n");
       dev->truncating = false;
       return false;
    }
    dev->truncating = false;
 
-   Dmsg0(400, "truncate_dvd: Truncating...\n");
+   Dmsg0(100, "truncate_dvd_dev: Truncating...\n");
 
    /* If necessary, truncate it. */
    if (ftruncate(dev->fd, 0) != 0) {
@@ -745,10 +740,10 @@ bool truncate_dvd(DCR *dcr) {
    dev->fd = -1;
    dev->clear_opened();
    
-   Dmsg0(400, "truncate_dvd: Opening first part (2)...\n");
+   Dmsg0(100, "truncate_dvd_dev: Opening first part (2)...\n");
    
    if (!dvd_write_part(dcr)) {
-      Dmsg0(400, "truncate_dvd: Error while writing to DVD.\n");
+      Dmsg0(100, "truncate_dvd_dev: Error while writing to DVD.\n");
       return false;
    }
    
@@ -758,7 +753,7 @@ bool truncate_dvd(DCR *dcr) {
    dev->VolCatInfo.VolCatParts = 0;
    
    if (dvd_open_first_part(dcr, OPEN_READ_WRITE) < 0) {
-      Dmsg0(400, "truncate_dvd: Error while opening first part (2).\n");
+      Dmsg0(100, "truncate_dvd_dev: Error while opening first part (2).\n");
       return false;
    }
 
@@ -797,7 +792,8 @@ bool check_can_write_on_non_blank_dvd(DCR *dcr) {
          Dmsg2(129, "check_can_write_on_non_blank_dvd: failed to find suitable file in dir %s (dev=%s)\n", 
                dev->device->mount_point, dev->print_name());
          break;
-      } else {
+      }
+      else {
          Dmsg2(99, "check_can_write_on_non_blank_dvd: found %s (versus %s)\n", 
                result->d_name, dev->VolCatInfo.VolCatName);
          if (strcmp(result->d_name, dev->VolCatInfo.VolCatName) == 0) {
@@ -817,7 +813,7 @@ bool check_can_write_on_non_blank_dvd(DCR *dcr) {
             }
             Dmsg2(99, "check_can_write_on_non_blank_dvd: size of %s is %d\n", 
                filename.c_str(), filestat.st_size);
-            matched = filestat.st_size == 0;
+            matched = (filestat.st_size == 0);
          }
       }
       count++;
@@ -828,9 +824,77 @@ bool check_can_write_on_non_blank_dvd(DCR *dcr) {
    Dmsg2(29, "check_can_write_on_non_blank_dvd: got %d files in the mount point (matched=%d)\n", count, matched);
    
    if (count != 3) {
-      /* There are more than 3 files (., .., and the volume file) */
+      /* There is more than 3 files (., .., and the volume file) */
       return false;
    }
    
    return matched;
 }
+
+/*
+ * Edit codes into (Un)MountCommand, Write(First)PartCommand
+ *  %% = %
+ *  %a = archive device name
+ *  %e = erase (set if cannot mount and first part)
+ *  %n = part number
+ *  %m = mount point
+ *  %v = last part name
+ *
+ *  omsg = edited output message
+ *  imsg = input string containing edit codes (%x)
+ *
+ */
+static void edit_device_codes_dev(DEVICE* dev, POOL_MEM &omsg, const char *imsg)
+{
+   const char *p;
+   const char *str;
+   char add[20];
+   
+   POOL_MEM archive_name(PM_FNAME);
+
+   omsg.c_str()[0] = 0;
+   Dmsg1(800, "edit_device_codes: %s\n", imsg);
+   for (p=imsg; *p; p++) {
+      if (*p == '%') {
+         switch (*++p) {
+         case '%':
+            str = "%";
+            break;
+         case 'a':
+            str = dev->dev_name;
+            break;
+         case 'e':
+            if (dev->num_parts == 0) {
+               str = "1";
+            } else {
+               str = "0";
+            }
+            break;
+         case 'n':
+            bsnprintf(add, sizeof(add), "%d", dev->part);
+            str = add;
+            break;
+         case 'm':
+            str = dev->device->mount_point;
+            break;
+         case 'v':
+            make_spooled_dvd_filename(dev, archive_name);
+            str = archive_name.c_str();
+            break;
+         default:
+            add[0] = '%';
+            add[1] = *p;
+            add[2] = 0;
+            str = add;
+            break;
+         }
+      } else {
+         add[0] = *p;
+         add[1] = 0;
+         str = add;
+      }
+      Dmsg1(1900, "add_str %s\n", str);
+      pm_strcat(omsg, (char *)str);
+      Dmsg1(1800, "omsg=%s\n", omsg.c_str());
+   }
+}
index aca7e3c0d497570f14686de35083f9ff6e3ec50f..0387f2399eb7e30bc050ef7d3f08d296cd070cd4 100644 (file)
@@ -13,7 +13,7 @@
  *
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -53,10 +53,9 @@ 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);
+bool bootstrap_cmd(JCR *jcr);
 
 struct s_cmds {
    const char *cmd;
@@ -94,7 +93,7 @@ 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[]   =
+static char Job_end[]   =
    "3099 Job %s end JobStatus=%d JobFiles=%d JobBytes=%s\n";
 
 /*
@@ -138,7 +137,7 @@ 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)) {    /* do command */
+            if (!fd_cmds[i].func(jcr) || job_canceled(jcr)) { /* do command */
                set_jcr_job_status(jcr, JS_ErrorTerminated);
                quit = true;
             }
@@ -310,13 +309,9 @@ static bool read_open_session(JCR *jcr)
    return true;
 }
 
-static bool bootstrap_cmd(JCR *jcr)
-{
-   return get_bootstrap_file(jcr, jcr->file_bsock);
-}
-
-bool get_bootstrap_file(JCR *jcr, BSOCK *sock)
+bool bootstrap_cmd(JCR *jcr)
 {
+   BSOCK *fd = jcr->file_bsock;
    POOLMEM *fname = get_pool_memory(PM_FNAME);
    FILE *bs;
    bool ok = false;
@@ -335,9 +330,9 @@ bool get_bootstrap_file(JCR *jcr, BSOCK *sock)
          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);
+   while (bnet_recv(fd) >= 0) {
+       Dmsg1(400, "stored<filed: bootstrap file %s", fd->msg);
+       fputs(fd->msg, bs);
    }
    fclose(bs);
    jcr->bsr = parse_bsr(jcr, jcr->RestoreBootstrap);
@@ -355,10 +350,10 @@ bail_out:
    free_pool_memory(jcr->RestoreBootstrap);
    jcr->RestoreBootstrap = NULL;
    if (!ok) {
-      bnet_fsend(sock, ERROR_bootstrap);
+      bnet_fsend(fd, ERROR_bootstrap);
       return false;
    }
-   return bnet_fsend(sock, OK_bootstrap);
+   return bnet_fsend(fd, OK_bootstrap);
 }
 
 
index 4809fc72861c1bdacacb9a9d77d9cb1771afb8a7..6a139c3cce7d589af1bc0e3888238c3e07e89684 100644 (file)
 #include "bacula.h"
 #include "stored.h"
 
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
 /* Imported variables */
 extern uint32_t VolSessionTime;
 
 /* Imported functions */
 extern uint32_t newVolSessionId();
-extern bool do_mac(JCR *jcr);
 
 /* Requests from the Director daemon */
 static char jobcmd[] = "JobId=%d job=%127s job_name=%127s client_name=%127s "
@@ -39,7 +40,7 @@ static char jobcmd[] = "JobId=%d job=%127s job_name=%127s client_name=%127s "
 
 /* Responses sent to Director daemon */
 static char OKjob[]     = "3000 OK Job SDid=%u SDtime=%u Authorization=%s\n";
-static char BAD_job[]   = "3915 Bad Job command: %s\n";
+static char BAD_job[]   = "3915 Bad Job command. stat=%d CMD: %s\n";
 //static char OK_query[]  = "3001 OK query\n";
 //static char NO_query[]  = "3918 Query failed\n";
 //static char BAD_query[] = "3917 Bad query command: %s\n";
@@ -62,22 +63,22 @@ bool job_cmd(JCR *jcr)
    POOL_MEM job_name, client_name, job, fileset_name, fileset_md5;
    int JobType, level, spool_attributes, no_attributes, spool_data;
    int write_part_after_job, PreferMountedVols;
-
+   int stat;
    JCR *ojcr;
 
    /*
     * Get JobId and permissions from Director
     */
    Dmsg1(100, "<dird: %s", dir->msg);
-   if (sscanf(dir->msg, jobcmd, &JobId, job.c_str(), job_name.c_str(),
+   stat = sscanf(dir->msg, jobcmd, &JobId, job.c_str(), job_name.c_str(),
               client_name.c_str(),
               &JobType, &level, fileset_name.c_str(), &no_attributes,
               &spool_attributes, fileset_md5.c_str(), &spool_data, 
-              &write_part_after_job, &PreferMountedVols) != 13) {
+              &write_part_after_job, &PreferMountedVols);
+   if (stat != 13) {
       pm_strcpy(jcr->errmsg, dir->msg);
-      bnet_fsend(dir, BAD_job, jcr->errmsg);
+      bnet_fsend(dir, BAD_job, stat, jcr->errmsg);
       Dmsg1(100, ">dird: %s", dir->msg);
-      Emsg1(M_FATAL, 0, _("Bad Job Command from Director: %s\n"), jcr->errmsg);
       set_jcr_job_status(jcr, JS_ErrorTerminated);
       return false;
    }
@@ -142,7 +143,7 @@ bool run_cmd(JCR *jcr)
    case JT_COPY:
    case JT_ARCHIVE:
       jcr->authenticated = true;
-      do_mac(jcr);
+      run_job(jcr);
       return false;
    }
 
@@ -159,14 +160,14 @@ bool run_cmd(JCR *jcr)
     *  when he does, we will be released, unless the 30 minutes
     *  expires.
     */
-   P(jcr->mutex);
+   P(mutex);
    for ( ;!job_canceled(jcr); ) {
-      errstat = pthread_cond_timedwait(&jcr->job_start_wait, &jcr->mutex, &timeout);
+      errstat = pthread_cond_timedwait(&jcr->job_start_wait, &mutex, &timeout);
       if (errstat == 0 || errstat == ETIMEDOUT) {
          break;
       }
    }
-   V(jcr->mutex);
+   V(mutex);
 
    memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key));
 
@@ -215,12 +216,10 @@ void handle_filed_connection(BSOCK *fd, char *job_name)
       Dmsg1(110, "OK Authentication Job %s\n", jcr->Job);
    }
 
-   P(jcr->mutex);
    if (!jcr->authenticated) {
       set_jcr_job_status(jcr, JS_ErrorTerminated);
    }
    pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */
-   V(jcr->mutex);
    free_jcr(jcr);
    return;
 }
index 612c2b4b97a006f37f42662f464b238f4ff9855d..ee0d4fbd74392773cd0db984bf0d88b5e96d3a7b 100644 (file)
@@ -8,7 +8,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -71,9 +71,7 @@ int read_dev_volume_label(DCR *dcr)
       dev->VolHdr.VolumeName[0]?dev->VolHdr.VolumeName:"*NULL*");
 
    if (!dev->is_open()) {
-      if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
-         return VOL_IO_ERROR;
-      }
+      Emsg0(M_ABORT, 0, _("BAD call to read_dev_volume_label\n"));
    }
    if (dev->is_labeled()) {              /* did we already read label? */
       /* Compare Volume Names allow special wild card */
@@ -102,7 +100,7 @@ int read_dev_volume_label(DCR *dcr)
 
    if (!dev->rewind(dcr)) {
       Mmsg(jcr->errmsg, _("Couldn't rewind device %s: ERR=%s\n"), 
-         dev->print_name(), dev->bstrerror());
+         dev->print_name(), strerror_dev(dev));
       Dmsg1(30, "return VOL_NO_MEDIA: %s", jcr->errmsg);
       return VOL_NO_MEDIA;
    }
@@ -141,14 +139,14 @@ int read_dev_volume_label(DCR *dcr)
    if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
       Mmsg(jcr->errmsg, _("Requested Volume \"%s\" on %s is not a Bacula "
            "labeled Volume, because: ERR=%s"), NPRT(VolName), 
-           dev->print_name(), dev->bstrerror());
+           dev->print_name(), strerror_dev(dev));
       Dmsg1(30, "%s", jcr->errmsg);
    } else if (!read_record_from_block(block, record)) {
       Mmsg(jcr->errmsg, _("Could not read Volume label from block.\n"));
       Dmsg1(30, "%s", jcr->errmsg);
    } else if (!unser_volume_label(dev, record)) {
       Mmsg(jcr->errmsg, _("Could not unserialize Volume label: ERR=%s\n"),
-         dev->bstrerror());
+         strerror_dev(dev));
       Dmsg1(30, "%s", jcr->errmsg);
    } else if (strcmp(dev->VolHdr.Id, BaculaId) != 0 &&
               strcmp(dev->VolHdr.Id, OldBaculaId) != 0) {
@@ -289,6 +287,8 @@ bool write_volume_label_to_block(DCR *dcr)
  *            after the label will be destroyed,
  *            in fact, we write the label 5 times !!!!
  *
+ *  This routine expects that open_device() was previously called.
+ *
  *  This routine should be used only when labeling a blank tape.
  */
 bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, const char *PoolName)
@@ -300,16 +300,13 @@ bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, const char *Po
    empty_block(dcr->block);
 
    if (dev->open(dcr, OPEN_READ_WRITE) < 0) {
-      /* If device is not tape, attempt to create it */
-      if (dev->is_tape() || dev->open(dcr, CREATE_READ_WRITE) < 0) {
-         goto bail_out;
-      }
+      goto bail_out;
    }
    Dmsg1(150, "Label type=%d\n", dev->label_type);
    if (!dev->rewind(dcr)) {
       free_volume(dev);
       memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
-      Dmsg2(30, "Bad status on %s from rewind: ERR=%s\n", dev->print_name(), dev->bstrerror());
+      Dmsg2(30, "Bad status on %s from rewind: ERR=%s\n", dev->print_name(), strerror_dev(dev));
       if (!forge_on) {
          goto bail_out;
       }
@@ -338,7 +335,7 @@ bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, const char *Po
    /* Temporarily mark in append state to enable writing */
    dev->set_append();
    if (!write_record_to_block(dcr->block, dcr->rec)) {
-      Dmsg2(30, "Bad Label write on %s: ERR=%s\n", dev->print_name(), dev->bstrerror());
+      Dmsg2(30, "Bad Label write on %s: ERR=%s\n", dev->print_name(), strerror_dev(dev));
       goto bail_out;
    } else {
       Dmsg2(30, "Wrote label of %d bytes to %s\n", dcr->rec->data_len, dev->print_name());
@@ -346,7 +343,7 @@ bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, const char *Po
 
    Dmsg0(99, "Call write_block_to_dev()\n");
    if (!write_block_to_dev(dcr)) {
-      Dmsg2(30, "Bad Label write on %s: ERR=%s\n", dev->print_name(), dev->bstrerror());
+      Dmsg2(30, "Bad Label write on %s: ERR=%s\n", dev->print_name(), strerror_dev(dev));
       goto bail_out;
    }
    Dmsg0(99, " Wrote block to device\n");
@@ -401,12 +398,12 @@ bool rewrite_volume_label(DCR *dcr, bool recycle)
    if (!dev_cap(dev, CAP_STREAM)) {
       if (!dev->rewind(dcr)) {
          Jmsg2(jcr, M_WARNING, 0, _("Rewind error on device %s: ERR=%s\n"),
-               dev->print_name(), dev->bstrerror());
+               dev->print_name(), strerror_dev(dev));
       }
       if (recycle) {
-         if (!dev->truncate(dcr)) {
+         if (!truncate_dev(dcr)) {
             Jmsg2(jcr, M_WARNING, 0, _("Truncate error on device %s: ERR=%s\n"),
-                  dev->print_name(), dev->bstrerror());
+                  dev->print_name(), strerror_dev(dev));
          }
       }
 
@@ -428,7 +425,7 @@ bool rewrite_volume_label(DCR *dcr, bool recycle)
       Dmsg1(200, "Attempt to write to device fd=%d.\n", dev->fd);
       if (!write_block_to_dev(dcr)) {
          Jmsg2(jcr, M_ERROR, 0, _("Unable to write device %s: ERR=%s\n"),
-            dev->print_name(), dev->bstrerror());
+            dev->print_name(), strerror_dev(dev));
          Dmsg0(200, "===ERROR write block to dev\n");
          return false;
       }
diff --git a/bacula/src/stored/mac.c b/bacula/src/stored/mac.c
deleted file mode 100644 (file)
index aedbf10..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * SD -- mac.c --  responsible for doing
- *     migration, archive, and copy jobs.
- *
- *     Kern Sibbald, January MMVI
- *
- *   Version $Id$
- */
-/*
-   Copyright (C) 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"
-
-/* Import functions */
-extern char Job_end[];   
-
-/* Forward referenced subroutines */
-static bool record_cb(DCR *dcr, DEV_RECORD *rec);
-
-
-/*
- *  Read Data and send to File Daemon
- *   Returns: false on failure
- *            true  on success
- */
-bool do_mac(JCR *jcr)
-{
-   bool ok = true;
-   BSOCK *dir = jcr->dir_bsock;
-   const char *Type;
-   char ec1[50];
-   DEVICE *dev;
-
-   switch(jcr->JobType) {
-   case JT_MIGRATE:
-      Type = "Migration";
-      break;
-   case JT_ARCHIVE:
-      Type = "Archive";
-      break;
-   case JT_COPY:
-      Type = "Copy";
-      break;
-   default:
-      Type = "Unknown";
-      break;
-   }
-
-
-   Dmsg0(20, "Start read data.\n");
-
-
-   create_restore_volume_list(jcr);
-   if (jcr->NumVolumes == 0) {
-      Jmsg(jcr, M_FATAL, 0, _("No Volume names found for %s.\n"), Type);
-      free_restore_volume_list(jcr);
-      return false;
-   }
-
-   Dmsg3(200, "Found %d volumes names for %s. First=%s\n", jcr->NumVolumes,
-      jcr->VolList->VolumeName, Type);
-
-   /* Ready device for reading */
-   if (!acquire_device_for_read(jcr->read_dcr)) {
-      ok = false;
-      goto bail_out;
-   }
-
-   if (!acquire_device_for_append(jcr->dcr)) {
-      set_jcr_job_status(jcr, JS_ErrorTerminated);
-      ok = false;
-      goto bail_out;
-   }
-   jcr->dcr->VolFirstIndex = jcr->dcr->VolLastIndex = 0;
-   jcr->run_time = time(NULL);
-
-   ok = read_records(jcr->read_dcr, record_cb, mount_next_read_volume);
-
-bail_out:
-
-   dev = jcr->dcr->dev;
-   if (ok || dev->can_write()) {
-      /* Flush out final partial block of this session */
-      if (!write_block_to_device(jcr->dcr)) {
-         Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"),
-               dev->print_name(), dev->bstrerror());
-         Dmsg0(100, _("Set ok=FALSE after write_block_to_device.\n"));
-         ok = false;
-      }
-   }  
-
-
-   if (ok && dev->is_dvd()) {
-      ok = dvd_close_job(jcr->dcr);   /* do DVD cleanup if any */
-   }
-   /* Release the device -- and send final Vol info to DIR */
-   release_device(jcr->dcr);
-
-   if (!release_device(jcr->read_dcr)) {
-      ok = false;
-   }
-
-   free_restore_volume_list(jcr);
-
-
-   if (!ok || job_canceled(jcr)) {
-      discard_attribute_spool(jcr);
-   } else {
-      commit_attribute_spool(jcr);
-   }
-
-   dir_send_job_status(jcr);          /* update director */
-
-
-   Dmsg0(30, "Done reading.\n");
-   jcr->end_time = time(NULL);
-   dequeue_messages(jcr);             /* send any queued messages */
-   if (ok) {
-      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));
-   Dmsg4(400, Job_end, jcr->Job, jcr->JobStatus, jcr->JobFiles, ec1); 
-       
-   bnet_sig(dir, BNET_EOD);           /* send EOD to Director daemon */
-
-   return ok;
-}
-
-/*
- * Called here for each record from read_records()
- *  Returns: true if OK
- *           false if error
- */
-static bool record_cb(DCR *dcr, DEV_RECORD *rec)
-{
-   bool ok = true;
-   JCR *jcr = dcr->jcr;
-   char buf1[100], buf2[100];
-   int32_t stream;   
-   
-   switch (rec->FileIndex) {                        
-   case PRE_LABEL:
-   case VOL_LABEL:
-   case EOT_LABEL:
-      return true;                    /* don't write vol labels */
-   }
-   rec->VolSessionId = jcr->VolSessionId;
-   rec->VolSessionTime = jcr->VolSessionTime;
-   Dmsg4(850, "before writ_rec FI=%d SessId=%d Strm=%s len=%d\n",
-      rec->FileIndex, rec->VolSessionId, 
-      stream_to_ascii(buf1, rec->Stream,rec->FileIndex),
-      rec->data_len);
-
-   while (!write_record_to_block(jcr->dcr->block, rec)) {
-      Dmsg2(850, "!write_record_to_block data_len=%d rem=%d\n", rec->data_len,
-                 rec->remainder);
-      if (!write_block_to_device(jcr->dcr)) {
-         DEVICE *dev = jcr->dcr->dev;
-         Dmsg2(90, "Got write_block_to_dev error on device %s. %s\n",
-            dev->print_name(), dev->bstrerror());
-         Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"),
-               dev->print_name(), dev->bstrerror());
-         return false;
-      }
-   }
-   jcr->JobBytes += rec->data_len;   /* increment bytes this job */
-   if (rec->FileIndex > 0) {
-      jcr->JobFiles = rec->FileIndex;
-   }
-   Dmsg4(850, "write_record FI=%s SessId=%d Strm=%s len=%d\n",
-      FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId,
-      stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len);
-
-   /* Send attributes and digest to Director for Catalog */
-   stream = rec->Stream;
-   if (stream == STREAM_UNIX_ATTRIBUTES || stream == STREAM_UNIX_ATTRIBUTES_EX ||
-       crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
-      if (!jcr->no_attributes) {
-         if (are_attributes_spooled(jcr)) {
-            jcr->dir_bsock->spool = true;
-         }
-         Dmsg0(850, "Send attributes to dir.\n");
-         if (!dir_update_file_attributes(jcr->dcr, rec)) {
-            jcr->dir_bsock->spool = false;
-            Jmsg(jcr, M_FATAL, 0, _("Error updating file attributes. ERR=%s\n"),
-               bnet_strerror(jcr->dir_bsock));
-            return false;
-         }
-         jcr->dir_bsock->spool = false;
-      }
-   }
-
-   return ok;
-}
index 8b86db484be6ff9e20f644f6155960e68700a10a..65100cdcc0a03ece306f8fde628247a6ca0bedb7 100644 (file)
@@ -8,7 +8,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2002-2006 Kern Sibbald
+   Copyright (C) 2002-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
 #include "stored.h"                   /* pull in Storage Deamon headers */
 
 static void mark_volume_not_inchanger(DCR *dcr);
-static int try_autolabel(DCR *dcr);
-
-enum {
-   try_next_vol = 1,
-   try_read_vol,
-   try_error,
-   try_default
-};
 
 /*
  * If release is set, we rewind the current volume,
@@ -55,10 +47,8 @@ bool mount_next_write_volume(DCR *dcr, bool release)
    DEVICE *dev = dcr->dev;
    JCR *jcr = dcr->jcr;
    DEV_BLOCK *block = dcr->block;
-   int mode;
 
-   Dmsg2(150, "Enter mount_next_volume(release=%d) dev=%s\n", release,
-      dev->print_name());
+   Dmsg1(150, "Enter mount_next_volume(release=%d)\n", release);
 
    init_device_wait_timers(dcr);
 
@@ -133,12 +123,12 @@ mount_next_vol:
     *   and read the label. If there is no tape in the drive,
     *   we will err, recurse and ask the operator the next time.
     */
-   if (!release && dev->is_tape() && dev->has_cap(CAP_AUTOMOUNT)) {
+   if (!release && dev->is_tape() && dev_cap(dev, CAP_AUTOMOUNT)) {
       Dmsg0(150, "(1)Ask=0\n");
       ask = false;                 /* don't ask SYSOP this time */
    }
    /* Don't ask if not removable */
-   if (!dev->is_removable()) {
+   if (!dev_cap(dev, CAP_REM)) {
       Dmsg0(150, "(2)Ask=0\n");
       ask = false;
    }
@@ -154,30 +144,15 @@ mount_next_vol:
    }
    Dmsg1(150, "want vol=%s\n", dcr->VolumeName);
 
-   if (dev->poll && dev->has_cap(CAP_CLOSEONPOLL)) {
-      dev->close();
+   if (dev->poll && dev_cap(dev, CAP_CLOSEONPOLL)) {
+      force_close_device(dev);
    }
 
    /* Ensure the device is open */
-   if (dev_cap(dev, CAP_STREAM)) {
-      mode = OPEN_WRITE_ONLY;
-   } else {
-      mode = OPEN_READ_WRITE;
-   }
-   while (dev->open(dcr, mode) < 0) {
-      Dmsg0(150, "open_device failed\n");
-      if (dev->is_file() && dev->is_removable()) {
-         Dmsg0(150, "call scan_dir_for_vol\n");
-         if (dev->scan_dir_for_volume(dcr)) {
-            break;                    /* got a valid volume */
-         }
-      }
-      if (try_autolabel(dcr) == try_read_vol) {
-         break;                       /* created a new volume label */
-      }
+   if (!open_device(dcr)) {
       /* If DVD, ignore the error, very often you cannot open the device
        * (when there is no DVD, or when the one inserted is a wrong one) */
-      if (dev->poll || dev->is_dvd() || dev->is_removable()) {
+      if ((dev->poll) || (dev->is_dvd())) {
          goto mount_next_vol;
       } else {
          return false;
@@ -192,7 +167,7 @@ read_volume:
     * If we are writing to a stream device, ASSUME the volume label
     *  is correct.
     */
-   if (dev->has_cap(CAP_STREAM)) {
+   if (dev_cap(dev, CAP_STREAM)) {
       vol_label_status = VOL_OK;
       create_volume_label(dev, dcr->VolumeName, "Default");
       dev->VolHdr.LabelType = PRE_LABEL;
@@ -219,7 +194,7 @@ read_volume:
       VOLUME_CAT_INFO VolCatInfo, devVolCatInfo;
 
       /* If not removable, Volume is broken */
-      if (!dev->is_removable()) {
+      if (!dev_cap(dev, CAP_REM)) {
          Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on device %s.\n"),
             dcr->VolumeName, dev->print_name());
          mark_volume_in_error(dcr);
@@ -230,7 +205,8 @@ read_volume:
       /* If polling and got a previous bad name, ignore it */
       if (dev->poll && strcmp(dev->BadVolName, dev->VolHdr.VolumeName) == 0) {
          ask = true;
-         Dmsg1(200, "Vol Name error supress due to poll. Name=%s\n", dcr->VolumeName);
+         Dmsg1(200, "Vol Name error supress due to poll. Name=%s\n",
+            dcr->VolumeName);
          goto mount_next_vol;
       }
       /*
@@ -244,19 +220,20 @@ read_volume:
       /* Check if this is a valid Volume in the pool */
       bstrncpy(dcr->VolumeName, dev->VolHdr.VolumeName, sizeof(dcr->VolumeName));
       if (!dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) {
-         /* Restore desired volume name, note device info out of sync */
-         /* This gets the info regardless of the Pool */
+         /* Saved bad volume name */
+         bstrncpy(dev->BadVolName, dev->VolHdr.VolumeName, sizeof(dev->BadVolName));
+         Jmsg(jcr, M_WARNING, 0, _("Director wanted Volume \"%s\" for device %s.\n"
+              "    Current Volume \"%s\" not acceptable because:\n"
+              "    %s"),
+             VolCatInfo.VolCatName, dev->print_name(),
+             dev->VolHdr.VolumeName, jcr->dir_bsock->msg);
+         /* This gets the info regardless of the Pool so we can change chgr status  */
          bstrncpy(dcr->VolumeName, dev->VolHdr.VolumeName, sizeof(dcr->VolumeName));
          if (autochanger && !dir_get_volume_info(dcr, GET_VOL_INFO_FOR_READ)) {
             mark_volume_not_inchanger(dcr);
          }
+         /* Restore original info */
          memcpy(&dev->VolCatInfo, &devVolCatInfo, sizeof(dev->VolCatInfo));
-         bstrncpy(dev->BadVolName, dev->VolHdr.VolumeName, sizeof(dev->BadVolName));
-         Jmsg(jcr, M_WARNING, 0, _("Director wanted Volume \"%s\".\n"
-              "    Current Volume \"%s\" not acceptable because:\n"
-              "    %s"),
-             VolCatInfo.VolCatName, dev->VolHdr.VolumeName,
-             jcr->dir_bsock->msg);
          ask = true;
          goto mount_next_vol;
       }
@@ -278,17 +255,49 @@ read_volume:
       }
       /* Fall through wanted */
    case VOL_NO_LABEL:
-      switch (try_autolabel(dcr)) {
-      case try_next_vol:
+      /*
+       * If permitted, we label the device, make sure we can do
+       *   it by checking that the VolCatBytes is zero => not labeled,
+       *   once the Volume is labeled we don't want to label another
+       *   blank tape with the same name.  For disk, we go ahead and
+       *   label it anyway, because the OS insures that there is only
+       *   one Volume with that name.
+       * As noted above, at this point dcr->VolCatInfo has what
+       *   the Director wants and dev->VolCatInfo has info on the
+       *   previous tape (or nothing).
+       */
+      if (dev_cap(dev, CAP_LABEL) && (dcr->VolCatInfo.VolCatBytes == 0 ||
+            (!dev->is_tape() && strcmp(dcr->VolCatInfo.VolCatStatus,
+                                   "Recycle") == 0))) {
+         Dmsg0(150, "Create volume label\n");
+         /* Create a new Volume label and write it to the device */
+         if (!write_new_volume_label_to_dev(dcr, dcr->VolumeName,
+                dcr->pool_name)) {
+            Dmsg0(150, "!write_vol_label\n");
+            mark_volume_in_error(dcr);
+            goto mount_next_vol;
+         }
+         Dmsg0(150, "dir_update_vol_info. Set Append\n");
+         /* Copy Director's info into the device info */
+         memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
+         if (!dir_update_volume_info(dcr, true)) {  /* indicate tape labeled */
+            return false;
+         }
+         Jmsg(jcr, M_INFO, 0, _("Labeled new Volume \"%s\" on device %s.\n"),
+            dcr->VolumeName, dev->print_name());
+         goto read_volume;      /* read label we just wrote */
+      }
+      if (!dev_cap(dev, CAP_LABEL) && dcr->VolCatInfo.VolCatBytes == 0) {
+         Jmsg(jcr, M_INFO, 0, _("Warning device %s not configured to autolabel Volumes.\n"), 
+            dev->print_name());
+      }
+      /* If not removable, Volume is broken */
+      if (!dev_cap(dev, CAP_REM)) {
+         Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on device %s.\n"),
+            dcr->VolumeName, dev->print_name());
+         mark_volume_in_error(dcr);
          goto mount_next_vol;
-      case try_read_vol:
-         goto read_volume;
-      case try_error:
-         return false;
-      case try_default:
-         break;
       }
-
       /* NOTE! Fall-through wanted. */
    case VOL_NO_MEDIA:
    default:
@@ -301,7 +310,7 @@ read_volume:
       ask = true;
       /* Needed, so the medium can be changed */
       if (dev->requires_mount()) {
-         dev->close();
+         close_device(dev);  
       }
       goto mount_next_vol;
    }
@@ -333,9 +342,9 @@ read_volume:
       Dmsg0(200, "Device previously written, moving to end of data\n");
       Jmsg(jcr, M_INFO, 0, _("Volume \"%s\" previously written, moving to end of data.\n"),
          dcr->VolumeName);
-      if (!dev->eod()) {
+      if (!eod_dev(dev)) {
          Jmsg(jcr, M_ERROR, 0, _("Unable to position to end of data on device %s: ERR=%s\n"),
-            dev->print_name(), dev->bstrerror());
+            dev->print_name(), strerror_dev(dev));
          mark_volume_in_error(dcr);
          goto mount_next_vol;
       }
@@ -395,60 +404,10 @@ read_volume:
       empty_block(block);             /* we used it for reading so set for write */
    }
    dev->set_append();
-   Dmsg1(150, "set APPEND, normal return from mount_next_write_volume. dev=%s\n",
-      dev->print_name());
-
+   Dmsg0(150, "set APPEND, normal return from read_dev_for_append\n");
    return true;
 }
 
-/*
- * If permitted, we label the device, make sure we can do
- *   it by checking that the VolCatBytes is zero => not labeled,
- *   once the Volume is labeled we don't want to label another
- *   blank tape with the same name.  For disk, we go ahead and
- *   label it anyway, because the OS insures that there is only
- *   one Volume with that name.
- * As noted above, at this point dcr->VolCatInfo has what
- *   the Director wants and dev->VolCatInfo has info on the
- *   previous tape (or nothing).
- */
-static int try_autolabel(DCR *dcr)
-{
-   DEVICE *dev = dcr->dev;
-   if (dev->has_cap(CAP_LABEL) && (dcr->VolCatInfo.VolCatBytes == 0 ||
-         (!dev->is_tape() && strcmp(dcr->VolCatInfo.VolCatStatus,
-                                "Recycle") == 0))) {
-      Dmsg0(150, "Create volume label\n");
-      /* Create a new Volume label and write it to the device */
-      if (!write_new_volume_label_to_dev(dcr, dcr->VolumeName,
-             dcr->pool_name)) {
-         Dmsg0(150, "!write_vol_label\n");
-         mark_volume_in_error(dcr);
-         return try_next_vol;
-      }
-      Dmsg0(150, "dir_update_vol_info. Set Append\n");
-      /* Copy Director's info into the device info */
-      memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
-      if (!dir_update_volume_info(dcr, true)) {  /* indicate tape labeled */
-         return try_error;
-      }
-      Jmsg(dcr->jcr, M_INFO, 0, _("Labeled new Volume \"%s\" on device %s.\n"),
-         dcr->VolumeName, dev->print_name());
-      return try_read_vol;   /* read label we just wrote */
-   }
-   if (!dev->has_cap(CAP_LABEL) && dcr->VolCatInfo.VolCatBytes == 0) {
-      Jmsg(dcr->jcr, M_INFO, 0, _("Warning device %s not configured to autolabel Volumes.\n"), 
-         dev->print_name());
-   }
-   /* If not removable, Volume is broken */
-   if (!dev->is_removable()) {
-      Jmsg(dcr->jcr, M_WARNING, 0, _("Volume \"%s\" not on device %s.\n"),
-         dcr->VolumeName, dev->print_name());
-      mark_volume_in_error(dcr);
-      return try_next_vol;
-   }
-   return try_default;
-}
 
 
 /*
@@ -512,12 +471,13 @@ void release_volume(DCR *dcr)
    dcr->VolumeName[0] = 0;
 
    if (dev->is_open() && (!dev->is_tape() || !dev_cap(dev, CAP_ALWAYSOPEN))) {
-      dev->close();
+      offline_or_rewind_dev(dev);
+      close_device(dev);
    }
 
    /* If we have not closed the device, then at least rewind the tape */
    if (dev->is_open()) {
-      dev->offline_or_rewind();
+      offline_or_rewind_dev(dev);
    }
    Dmsg0(190, "release_volume\n");
 }
@@ -535,7 +495,8 @@ bool mount_next_read_volume(DCR *dcr)
     * End Of Tape -- mount next Volume (if another specified)
     */
    if (jcr->NumVolumes > 1 && jcr->CurVolume < jcr->NumVolumes) {
-      dev->close();
+      close_device(dev);
+      dev->clear_read();
       if (!acquire_device_for_read(dcr)) {
          Jmsg2(jcr, M_FATAL, 0, _("Cannot open Dev=%s, Vol=%s\n"), dev->print_name(),
                dcr->VolumeName);
index 7b7da1390e08cbd97e4c2d317972b2c0ad06b6df..ea2367e2b80dd88d3dc15867437cc50276d396ba 100644 (file)
@@ -23,7 +23,7 @@ uint32_t new_VolSessionId();
 
 /* From acquire.c */
 DCR     *acquire_device_for_append(DCR *dcr);
-bool     acquire_device_for_read(DCR *dcr);
+DCR     *acquire_device_for_read(DCR *dcr);
 bool     release_device(DCR *dcr);
 DCR     *new_dcr(JCR *jcr, DEVICE *dev);
 void     free_dcr(DCR *dcr);
@@ -91,6 +91,7 @@ void     clrerror_dev(DEVICE *dev, int func);
 bool     update_pos_dev(DEVICE *dev);
 bool     rewind_dev(DEVICE *dev);
 bool     load_dev(DEVICE *dev);
+bool     offline_dev(DEVICE *dev);
 int      flush_dev(DEVICE *dev);
 int      weof_dev(DEVICE *dev, int num);
 int      write_block(DEVICE *dev);
@@ -98,9 +99,12 @@ uint32_t status_dev(DEVICE *dev);
 bool     eod_dev(DEVICE *dev);
 bool     fsf_dev(DEVICE *dev, int num);
 bool     bsf_dev(DEVICE *dev, int num);
+bool     bsr_dev(DEVICE *dev, int num);
 void     attach_jcr_to_device(DEVICE *dev, JCR *jcr);
 void     detach_jcr_from_device(DEVICE *dev, JCR *jcr);
 JCR     *next_attached_jcr(DEVICE *dev, JCR *jcr);
+bool     offline_or_rewind_dev(DEVICE *dev);
+bool     reposition_dev(DEVICE *dev, uint32_t file, uint32_t block);
 void     init_device_wait_timers(DCR *dcr);
 void     init_jcr_device_wait_timers(JCR *jcr);
 bool     double_dev_wait_time(DEVICE *dev);
@@ -114,16 +118,18 @@ uint32_t dev_file(DEVICE *dev);
 int  dvd_open_next_part(DCR *dcr);
 bool dvd_write_part(DCR *dcr); 
 bool dvd_close_job(DCR *dcr);
-bool mount_dvd(DEVICE* dev, int timeout);
-bool unmount_dvd(DEVICE* dev, int timeout);
+bool mount_dev(DEVICE* dev, int timeout);
+bool unmount_dev(DEVICE* dev, int timeout);
 void update_free_space_dev(DEVICE *dev);
 void make_mounted_dvd_filename(DEVICE *dev, POOL_MEM &archive_name);
 void make_spooled_dvd_filename(DEVICE *dev, POOL_MEM &archive_name);
-bool truncate_dvd(DCR *dcr);
+bool truncate_dvd_dev(DCR *dcr);
 bool check_can_write_on_non_blank_dvd(DCR *dcr);
 
 /* From device.c */
 bool     open_device(DCR *dcr);
+void     close_device(DEVICE *dev);
+void     force_close_device(DEVICE *dev);
 bool     first_open_device(DCR *dcr);
 bool     fixup_device_block_write_error(DCR *dcr);
 void     _lock_device(const char *file, int line, DEVICE *dev);
@@ -144,7 +150,7 @@ void     *handle_connection_request(void *arg);
 
 /* From fd_cmds.c */
 void     run_job(JCR *jcr);
-bool get_bootstrap_file(JCR *jcr, BSOCK *bsock);
+bool     bootstrap_cmd(JCR *jcr);
 
 /* From job.c */
 void     stored_free_jcr(JCR *jcr);
@@ -208,12 +214,16 @@ bool read_records(DCR *dcr,
        bool mount_cb(DCR *dcr));
 
 /* From reserve.c */
+void    init_reservations_lock();
+void    term_reservations_lock();
+void    lock_reservations();
+void    unlock_reservations();
 void    release_volume(DCR *dcr);
 VOLRES *new_volume(DCR *dcr, const char *VolumeName);
 VOLRES *find_volume(const char *VolumeName);
 bool    free_volume(DEVICE *dev);
 void    free_unused_volume(DCR *dcr);
-void    init_volume_list();
+void    create_volume_list();
 void    free_volume_list();
 void    list_volumes(BSOCK *user);
 bool    is_volume_in_use(DCR *dcr);
@@ -222,7 +232,6 @@ bool    find_suitable_device_for_job(JCR *jcr, RCTX &rctx);
 int     search_res_for_device(RCTX &rctx);
 void    release_msgs(JCR *jcr);
 
-
 /* From spool.c */
 bool    begin_data_spool          (DCR *dcr);
 bool    discard_data_spool        (DCR *dcr);
index 7b1cffdb4ca7920b4d89d8d9d7ce38926a2abdc9..e481cdd7c5de74a089aeda1690cb3dd9de0347d8 100644 (file)
@@ -7,27 +7,22 @@
  *   Version $Id$
  *
  */
-
 /*
-   Copyright (C) 2005 Kern Sibbald
+   Copyright (C) 2005-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 as
-   published by the Free Software Foundation; either version 2 of
-   the License, or (at your option) any later version.
+   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 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.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
+   the file LICENSE for additional details.
 
  */
 
+
 #include "bacula.h"
 #include "stored.h"
 
@@ -55,18 +50,18 @@ struct s_vars {
 };
 
 static struct s_vars getvars[] = {
-   { N_("Job"),        "s"},          /* 0 */
-   { N_("SDName"),     "s"},          /* 1 */
-   { N_("Level"),      "s"},          /* 2 */
-   { N_("Type"),       "s"},          /* 3 */
-   { N_("JobId"),      "i"},          /* 4 */
-   { N_("Client"),     "s"},          /* 5 */
-   { N_("Pool"),       "s"},          /* 6 */
-   { N_("MediaType"),  "s"},          /* 7 */
-   { N_("JobName"),    "s"},          /* 8 */
-   { N_("JobStatus"),  "s"},          /* 9 */
-   { N_("VolumeName"), "s"},          /* 10 */
-   { N_("Device"),     "s"},          /* 11 */
+   { NT_("Job"),        "s"},          /* 0 */
+   { NT_("SDName"),     "s"},          /* 1 */
+   { NT_("Level"),      "s"},          /* 2 */
+   { NT_("Type"),       "s"},          /* 3 */
+   { NT_("JobId"),      "i"},          /* 4 */
+   { NT_("Client"),     "s"},          /* 5 */
+   { NT_("Pool"),       "s"},          /* 6 */
+   { NT_("MediaType"),  "s"},          /* 7 */
+   { NT_("JobName"),    "s"},          /* 8 */
+   { NT_("JobStatus"),  "s"},          /* 9 */
+   { NT_("VolumeName"), "s"},          /* 10 */
+   { NT_("Device"),     "s"},          /* 11 */
 
    { NULL,             NULL}
 };
@@ -74,7 +69,7 @@ static struct s_vars getvars[] = {
 
 /* Writable variables */
 static struct s_vars setvars[] = {
-   { N_("JobReport"),   "s"},
+   { NT_("JobReport"),   "s"},
 
    { NULL,             NULL}
 };
@@ -238,7 +233,8 @@ int generate_job_event(JCR *jcr, const char *event)
       return 0;
    }
 
-   PyEval_AcquireLock();
+   lock_python();
+// PyEval_AcquireLock();
 
    method = find_method(events, method, event);
    if (!method) {
@@ -259,7 +255,8 @@ int generate_job_event(JCR *jcr, const char *event)
    Py_XDECREF(result);
 
 bail_out:
-   PyEval_ReleaseLock();
+   unlock_python();
+// PyEval_ReleaseLock();
    return stat;
 }
 
index 412b4a20b73e214a2f15ed4ad03b38479ee81663..2eb35186655f1390907607a4d528f77e33c180ff 100644 (file)
@@ -6,7 +6,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -75,7 +75,7 @@ bool do_read_data(JCR *jcr)
    /* Send end of data to FD */
    bnet_sig(fd, BNET_EOD);
 
-   if (!release_device(jcr->read_dcr)) {
+   if (!release_device(dcr)) {
       ok = false;
    }
 
index f450574132e785bd752de366be731631f27b92c6..a3cdbbfbe0e541d9e8e36aefb8951f2168c48f9c 100644 (file)
@@ -14,7 +14,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -86,11 +86,6 @@ bool read_records(DCR *dcr,
                break;
             }
             jcr->mount_next_volume = false;
-            /*  
-             * The Device can change at the end of a tape, so refresh it
-             *   from the dcr.
-             */
-            dev = dcr->dev;
             /*
              * We just have a new tape up, now read the label (first record)
              *  and pass it off to the callback routine, then continue
@@ -107,10 +102,10 @@ bool read_records(DCR *dcr,
 
          } else if (dev->at_eof()) {
             if (verbose) {
-               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);
             }
-            Dmsg3(200, "Got EOF at file %u  on device %s, Volume \"%s\"\n",
+            Dmsg3(200, "End of file %u  on device %s, Volume \"%s\"\n",
                   dev->file, dev->print_name(), dcr->VolumeName);
             continue;
          } else if (dev->is_short_block()) {
@@ -210,7 +205,7 @@ bool read_records(DCR *dcr,
                Dmsg2(300, "All done=(file:block) %u:%u\n", dev->file, dev->block_num);
                break;
             } else if (stat == 0) {  /* no match */
-               Dmsg4(300, "BSR no match: clear rem=%d FI=%d before set_eof pos %u:%u\n",
+               Dmsg4(300, "Clear rem=%d FI=%d before set_eof pos %u:%u\n",
                   rec->remainder, rec->FileIndex, dev->file, dev->block_num);
                rec->remainder = 0;
                rec->state &= ~REC_PARTIAL_RECORD;
@@ -228,7 +223,7 @@ bool read_records(DCR *dcr,
             break;                    /* read second part of record */
          }
          ok = record_cb(dcr, rec);
-         if (crypto_digest_stream_type(rec->Stream) != CRYPTO_DIGEST_NONE) {
+         if (rec->Stream == STREAM_MD5_SIGNATURE || rec->Stream == STREAM_SHA1_SIGNATURE) {
             Dmsg3(300, "Done FI=%u before set_eof pos %u:%u\n", rec->FileIndex,
                   dev->file, dev->block_num);
             if (match_set_eof(jcr->bsr, rec) && try_repositioning(jcr, rec, dev)) {
@@ -285,7 +280,7 @@ static bool try_repositioning(JCR *jcr, DEV_RECORD *rec, DEVICE *dev)
       Dmsg4(300, "Try_Reposition from (file:block) %u:%u to %u:%u\n",
             dev->file, dev->block_num, bsr->volfile->sfile,
             bsr->volblock->sblock);
-      dev->reposition(bsr->volfile->sfile, bsr->volblock->sblock);
+      reposition_dev(dev, bsr->volfile->sfile, bsr->volblock->sblock);
       rec->Block = 0;
    }
    return false;
@@ -309,7 +304,7 @@ static BSR *position_to_first_file(JCR *jcr, DEVICE *dev)
             bsr->volfile->sfile, bsr->volblock->sblock);
          Dmsg2(300, "Forward spacing to file:block %u:%u.\n",
             bsr->volfile->sfile, bsr->volblock->sblock);
-         dev->reposition(bsr->volfile->sfile, bsr->volblock->sblock);
+         reposition_dev(dev, bsr->volfile->sfile, bsr->volblock->sblock);
       }
    }
    return bsr;
index 130a2884b71a6f3e38e978aa0b60d48550662912..522c50a49bb1da48c3fe543a7a747a09be1c3935 100644 (file)
@@ -115,18 +115,6 @@ const char *stream_to_ascii(char *buf, int stream, int fi)
        return "SHA512";
     case STREAM_SIGNED_DIGEST:
        return "SIGNED-DIGEST";
-    case STREAM_ENCRYPTED_SESSION_DATA:
-       return "ENCRYPTED-SESSION-DATA";
-    case STREAM_ENCRYPTED_FILE_DATA:
-       return "ENCRYPTED-FILE";
-    case STREAM_ENCRYPTED_FILE_GZIP_DATA:
-       return "ENCRYPTED-GZIP";
-    case STREAM_ENCRYPTED_WIN32_DATA:
-       return "ENCRYPTED-WIN32-DATA";
-    case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
-       return "ENCRYPTED-WIN32-GZIP";
-    case STREAM_ENCRYPTED_MACOS_FORK_DATA:
-       return "ENCRYPTED-MACOS-RSRC";
     case -STREAM_UNIX_ATTRIBUTES:
        return "contUATTR";
     case -STREAM_FILE_DATA:
@@ -161,18 +149,6 @@ const char *stream_to_ascii(char *buf, int stream, int fi)
        return "contSHA512";
     case -STREAM_SIGNED_DIGEST:
        return "contSIGNED-DIGEST";
-    case -STREAM_ENCRYPTED_SESSION_DATA:
-       return "contENCRYPTED-SESSION-DATA";
-    case -STREAM_ENCRYPTED_FILE_DATA:
-       return "contENCRYPTED-FILE";
-    case -STREAM_ENCRYPTED_FILE_GZIP_DATA:
-       return "contENCRYPTED-GZIP";
-    case -STREAM_ENCRYPTED_WIN32_DATA:
-       return "contENCRYPTED-WIN32-DATA";
-    case -STREAM_ENCRYPTED_WIN32_GZIP_DATA:
-       return "contENCRYPTED-WIN32-GZIP";
-    case -STREAM_ENCRYPTED_MACOS_FORK_DATA:
-       return "contENCRYPTED-MACOS-RSRC";
     default:
        sprintf(buf, "%d", stream);
        return buf;
index dd38158e44bc8b23a58d73682e8468f2af8a2f05..1859001811d71f83d6269eef9d0cf38acd600c92 100644 (file)
 #include "bacula.h"
 #include "stored.h"
 
-
 static dlist *vol_list = NULL;
 static pthread_mutex_t vol_list_lock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t search_lock = PTHREAD_MUTEX_INITIALIZER;
 
 /* Forward referenced functions */
 static int can_reserve_drive(DCR *dcr, RCTX &rctx);
@@ -67,6 +65,45 @@ static int my_compare(void *item1, void *item2)
    return strcmp(((VOLRES *)item1)->vol_name, ((VOLRES *)item2)->vol_name);
 }
 
+static brwlock_t reservation_lock;
+
+void init_reservations_lock()
+{
+   int errstat;
+   if ((errstat=rwl_init(&reservation_lock)) != 0) {
+      berrno be;
+      Emsg1(M_ABORT, 0, _("Unable to initialize reservation lock. ERR=%s\n"),
+            be.strerror(errstat));
+   }
+
+}
+
+void term_reservations_lock()
+{
+   rwl_destroy(&reservation_lock);
+}
+
+/* This applies to a drive and to Volumes */
+void lock_reservations()
+{
+   int errstat;
+   if ((errstat=rwl_writelock(&reservation_lock)) != 0) {
+      berrno be;
+      Emsg2(M_ABORT, 0, "rwl_writelock failure. stat=%d: ERR=%s\n",
+           errstat, be.strerror(errstat));
+   }
+}
+
+void unlock_reservations()
+{
+   int errstat;
+   if ((errstat=rwl_writeunlock(&reservation_lock)) != 0) {
+      berrno be;
+      Emsg2(M_ABORT, 0, "rwl_writeunlock failure. stat=%d: ERR=%s\n",
+           errstat, be.strerror(errstat));
+   }
+}
+
 
 /*
  * Put a new Volume entry in the Volume list. This
@@ -81,6 +118,12 @@ VOLRES *new_volume(DCR *dcr, const char *VolumeName)
    VOLRES *vol, *nvol;
 
    Dmsg1(400, "new_volume %s\n", VolumeName);
+   /* 
+    * We lock the reservations system here to ensure
+    *  when adding a new volume that no newly scheduled
+    *  job can reserve it.
+    */
+   lock_reservations();
    P(vol_list_lock);
    if (dcr->dev) {
 again:
@@ -100,16 +143,27 @@ again:
    vol->vol_name = bstrdup(VolumeName);
    vol->dev = dcr->dev;
    vol->dcr = dcr;
+   Dmsg2(100, "New Vol=%s dev=%s\n", VolumeName, dcr->dev->print_name());
    nvol = (VOLRES *)vol_list->binary_insert(vol, my_compare);
    if (nvol != vol) {
       free(vol->vol_name);
       free(vol);
       vol = NULL;
       if (dcr->dev) {
-         nvol->dev = dcr->dev;
+         DEVICE *dev = nvol->dev;
+         if (!dev->is_busy()) {
+            Dmsg3(100, "Swap vol=%s from dev=%s to %s\n", VolumeName,
+               dev->print_name(), dcr->dev->print_name());
+            nvol->dev = dcr->dev;
+            dev->VolHdr.VolumeName[0] = 0;
+         } else {
+            Dmsg3(100, "!!!! could not swap vol=%s from dev=%s to %s\n", VolumeName,
+               dev->print_name(), dcr->dev->print_name());
+         }
       }
    }
    V(vol_list_lock);
+   unlock_reservations();
    return vol;
 }
 
@@ -122,6 +176,7 @@ again:
 VOLRES *find_volume(const char *VolumeName)
 {
    VOLRES vol, *fvol;
+   /* Do not lock reservations here */
    P(vol_list_lock);
    vol.vol_name = bstrdup(VolumeName);
    fvol = (VOLRES *)vol_list->binary_search(&vol, my_compare);
@@ -140,8 +195,9 @@ bool free_volume(DEVICE *dev)
 {
    VOLRES vol, *fvol;
 
-  P(vol_list_lock);
+   P(vol_list_lock);
    if (dev->VolHdr.VolumeName[0] == 0) {
+      Dmsg1(100, "free_volume: no vol on dev %s\n", dev->print_name());
       /*
        * Our device has no VolumeName listed, but
        *  search the list for any Volume attached to
@@ -151,6 +207,7 @@ bool free_volume(DEVICE *dev)
          if (fvol && fvol->dev == dev) {
             vol_list->remove(fvol);
             if (fvol->vol_name) {
+               Dmsg2(100, "free_volume %s dev=%s\n", fvol->vol_name, dev->print_name());
                free(fvol->vol_name);
             }
             free(fvol);
@@ -164,6 +221,7 @@ bool free_volume(DEVICE *dev)
    fvol = (VOLRES *)vol_list->binary_search(&vol, my_compare);
    if (fvol) {
       vol_list->remove(fvol);
+      Dmsg2(100, "free_volume %s dev=%s\n", fvol->vol_name, dev->print_name());
       free(fvol->vol_name);
       free(fvol);
    }
@@ -184,6 +242,7 @@ void free_unused_volume(DCR *dcr)
       if (vol->dcr == dcr && (vol->dev == NULL || 
           strcmp(vol->vol_name, vol->dev->VolHdr.VolumeName) != 0)) {
          vol_list->remove(vol);
+         Dmsg1(100, "free_unused_olume %s\n", vol->vol_name);
          free(vol->vol_name);
          free(vol);
          break;
@@ -198,6 +257,7 @@ void free_unused_volume(DCR *dcr)
 void list_volumes(BSOCK *user)  
 {
    VOLRES *vol;
+   P(vol_list_lock);
    for (vol=(VOLRES *)vol_list->first(); vol; vol=(VOLRES *)vol_list->next(vol)) {
       if (vol->dev) {
          bnet_fsend(user, "%s on device %s\n", vol->vol_name, vol->dev->print_name());
@@ -205,10 +265,11 @@ void list_volumes(BSOCK *user)
          bnet_fsend(user, "%s\n", vol->vol_name);
       }
    }
+   V(vol_list_lock);
 }
       
 /* Create the Volume list */
-void init_volume_list()
+void create_volume_list()
 {
    VOLRES *dummy = NULL;
    if (vol_list == NULL) {
@@ -223,29 +284,36 @@ void free_volume_list()
    if (!vol_list) {
       return;
    }
+   P(vol_list_lock);
    for (vol=(VOLRES *)vol_list->first(); vol; vol=(VOLRES *)vol_list->next(vol)) {
       Dmsg3(000, "Unreleased Volume=%s dcr=0x%x dev=0x%x\n", vol->vol_name,
          vol->dcr, vol->dev);
    }
    delete vol_list;
    vol_list = NULL;
+   V(vol_list_lock);
 }
 
 bool is_volume_in_use(DCR *dcr)
 {
    VOLRES *vol = find_volume(dcr->VolumeName);
    if (!vol) {
+      Dmsg1(100, "Vol=%s not in use.\n", dcr->VolumeName);
       return false;                   /* vol not in list */
    }
    if (!vol->dev) {                   /* vol not attached to device */
+      Dmsg1(100, "Vol=%s has no dev.\n", dcr->VolumeName);
       return false;
    }
    if (dcr->dev == vol->dev) {        /* same device OK */
+      Dmsg1(100, "Vol=%s on same dev.\n", dcr->VolumeName);
       return false;
    }
    if (!vol->dev->is_busy()) {
+      Dmsg2(100, "Vol=%s dev=%s not busy.\n", dcr->VolumeName, vol->dev->print_name());
       return false;
    }
+   Dmsg2(100, "Vol=%s used by %s.\n", dcr->VolumeName, vol->dev->print_name());
    return true;
 }
 
@@ -320,11 +388,11 @@ static bool use_storage_cmd(JCR *jcr)
    /* ***FIXME**** remove after 1.38 release */
    char *device_name;
    foreach_alist(store, jcr->dirstore) {
-      Dmsg5(100, "Storage=%s media_type=%s pool=%s pool_type=%s append=%d\n", 
+      Dmsg5(110, "Storage=%s media_type=%s pool=%s pool_type=%s append=%d\n", 
          store->name, store->media_type, store->pool_name, 
          store->pool_type, store->append);
       foreach_alist(device_name, store->device) {
-         Dmsg1(100, "   Device=%s\n", device_name);
+         Dmsg1(110, "   Device=%s\n", device_name);
       }
    }
 #endif
@@ -341,9 +409,10 @@ static bool use_storage_cmd(JCR *jcr)
     */
    if (ok) {
       bool first = true;           /* print wait message once */
+      bool fail = false;
       rctx.notify_dir = true;
-      for ( ; !job_canceled(jcr); ) {
-         P(search_lock);           /* only one thread at a time */
+      lock_reservations();
+      for ( ; !fail && !job_canceled(jcr); ) {
          while ((msg = (char *)msgs->pop())) {
             free(msg);
          }
@@ -357,7 +426,7 @@ static bool use_storage_cmd(JCR *jcr)
             rctx.PreferMountedVols = false;                
             rctx.exact_match = false;
             rctx.autochanger_only = true;
-            Dmsg5(100, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
+            Dmsg5(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
                rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
                rctx.autochanger_only, rctx.any_drive);
             if ((ok = find_suitable_device_for_job(jcr, rctx))) {
@@ -372,7 +441,7 @@ static bool use_storage_cmd(JCR *jcr)
                rctx.try_low_use_drive = false;
             }
             rctx.autochanger_only = false;
-            Dmsg5(100, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
+            Dmsg5(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
                rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
                rctx.autochanger_only, rctx.any_drive);
             if ((ok = find_suitable_device_for_job(jcr, rctx))) {
@@ -383,7 +452,7 @@ static bool use_storage_cmd(JCR *jcr)
          rctx.PreferMountedVols = true;
          rctx.exact_match = true;
          rctx.autochanger_only = false;
-         Dmsg5(100, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
+         Dmsg5(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
             rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
             rctx.autochanger_only, rctx.any_drive);
          if ((ok = find_suitable_device_for_job(jcr, rctx))) {
@@ -391,7 +460,7 @@ static bool use_storage_cmd(JCR *jcr)
          }
          /* Look for any mounted drive */
          rctx.exact_match = false;
-         Dmsg5(100, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
+         Dmsg5(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
             rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
             rctx.autochanger_only, rctx.any_drive);
          if ((ok = find_suitable_device_for_job(jcr, rctx))) {
@@ -399,53 +468,47 @@ static bool use_storage_cmd(JCR *jcr)
          }
          /* Try any drive */
          rctx.any_drive = true;
-         Dmsg5(100, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
+         Dmsg5(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
             rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
             rctx.autochanger_only, rctx.any_drive);
          if ((ok = find_suitable_device_for_job(jcr, rctx))) {
             break;
          }
-         /* Unlock before possible wait */
-         V(search_lock);
+         /* Keep reservations locked *except* during wait_for_device() */
+         unlock_reservations();
          if (!rctx.suitable_device || !wait_for_device(jcr, first)) {
-            break;       /* Get out, failure ... */
+            Dmsg0(100, "Fail. !suitable_device || !wait_for_device\n");
+            fail = true;
          }   
+         lock_reservations();
          first = false;
          bnet_sig(dir, BNET_HEARTBEAT);  /* Inform Dir that we are alive */
       }
-      /* Note if !ok then search_lock is already cleared */
-      if (ok) {
-         V(search_lock);
-         goto all_done;
-      } 
-
-      /*
-       * If we get here, there are no suitable devices available, which
-       *  means nothing configured.  If a device is suitable but busy
-       *  with another Volume, we will not come here.
-       */
-      if (verbose) {
+      unlock_reservations();
+      if (!ok) {
+         /*
+          * If we get here, there are no suitable devices available, which
+          *  means nothing configured.  If a device is suitable but busy
+          *  with another Volume, we will not come here.
+          */
          unbash_spaces(dir->msg);
          pm_strcpy(jcr->errmsg, dir->msg);
          Jmsg(jcr, M_INFO, 0, _("Failed command: %s\n"), jcr->errmsg);
-      }
-      Jmsg(jcr, M_FATAL, 0, _("\n"
-         "     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD Device resources.\n"),
-           dev_name.c_str(), media_type.c_str());
-      bnet_fsend(dir, NO_device, dev_name.c_str());
+         Jmsg(jcr, M_FATAL, 0, _("\n"
+            "     Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD Device resources.\n"),
+              dev_name.c_str(), media_type.c_str());
+         bnet_fsend(dir, NO_device, dev_name.c_str());
 
-      Dmsg1(100, ">dird: %s", dir->msg);
+         Dmsg1(100, ">dird: %s", dir->msg);
+      }
    } else {
       unbash_spaces(dir->msg);
       pm_strcpy(jcr->errmsg, dir->msg);
-      if (verbose) {
-         Jmsg(jcr, M_INFO, 0, _("Failed command: %s\n"), jcr->errmsg);
-      }
+      Jmsg(jcr, M_FATAL, 0, _("Failed command: %s\n"), jcr->errmsg);
       bnet_fsend(dir, BAD_use, jcr->errmsg);
       Dmsg1(100, ">dird: %s", dir->msg);
    }
 
-all_done:
    release_msgs(jcr);
    return ok;
 }
@@ -458,13 +521,13 @@ void release_msgs(JCR *jcr)
    if (!msgs) {
       return;
    }
-   P(search_lock);
+   lock_reservations();
    while ((msg = (char *)msgs->pop())) {
       free(msg);
    }
    delete msgs;
    jcr->reserve_msgs = NULL;
-   V(search_lock);
+   unlock_reservations();
 }
 
 /*
@@ -480,7 +543,7 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx)
     * For each storage device that the user specified, we
     *  search and see if there is a resource for that device.
     */
-   Dmsg4(100, "PrefMnt=%d exact=%d suitable=%d chgronly=%d\n",
+   Dmsg4(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d\n",
       rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
       rctx.autochanger_only);
    ok = false;
@@ -495,10 +558,10 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx)
             ok = true;
             break;
          } else if (stat == 0) {      /* device busy */
-            Dmsg1(100, "Suitable device found=%s, not used: busy\n", device_name);
+            Dmsg1(110, "Suitable device found=%s, not used: busy\n", device_name);
          } else {
             /* otherwise error */
-            Dmsg0(100, "No suitable device found.\n");
+            Dmsg0(110, "No suitable device found.\n");
          }
       }
       if (ok) {
@@ -520,7 +583,7 @@ int search_res_for_device(RCTX &rctx)
    bool ok;
    int stat;
 
-   Dmsg1(100, "Search res for %s\n", rctx.device_name);
+   Dmsg1(110, "Search res for %s\n", rctx.device_name);
    /* Look through Autochangers first */
    foreach_res(changer, R_AUTOCHANGER) {
       Dmsg1(150, "Try match changer res=%s\n", changer->hdr.name);
@@ -528,7 +591,7 @@ int search_res_for_device(RCTX &rctx)
       if (fnmatch(rctx.device_name, changer->hdr.name, 0) == 0) {
          /* Try each device in this AutoChanger */
          foreach_alist(rctx.device, changer->device) {
-            Dmsg1(100, "Try changer device %s\n", rctx.device->hdr.name);
+            Dmsg1(110, "Try changer device %s\n", rctx.device->hdr.name);
             stat = reserve_device(rctx);
             if (stat != 1) {             /* try another device */
                continue;
@@ -592,7 +655,7 @@ static int reserve_device(RCTX &rctx)
    const int name_len = MAX_NAME_LENGTH;
 
    /* Make sure MediaType is OK */
-   Dmsg2(100, "MediaType device=%s request=%s\n",
+   Dmsg2(110, "MediaType device=%s request=%s\n",
          rctx.device->media_type, rctx.store->media_type);
    if (strcmp(rctx.device->media_type, rctx.store->media_type) != 0) {
       return -1;
@@ -616,7 +679,7 @@ static int reserve_device(RCTX &rctx)
    }  
 
    rctx.suitable_device = true;
-   Dmsg2(100, "Try reserve %s JobId=%u\n", rctx.device->hdr.name,
+   Dmsg2(110, "Try reserve %s JobId=%u\n", rctx.device->hdr.name,
          rctx.jcr->JobId);
    dcr = new_dcr(rctx.jcr, rctx.device->dev);
    if (!dcr) {
@@ -659,7 +722,7 @@ static int reserve_device(RCTX &rctx)
    }
    if (!ok) {
       free_dcr(dcr);
-      Dmsg0(100, "Not OK.\n");
+      Dmsg0(110, "Not OK.\n");
       return 0;
    }
    return 1;
@@ -679,7 +742,10 @@ static bool reserve_device_for_read(DCR *dcr)
 
    ASSERT(dcr);
 
+   /* Get locks in correct order */
+   unlock_reservations();
    P(dev->mutex);
+   lock_reservations();
 
    if (is_device_unmounted(dev)) {             
       Dmsg1(200, "Device %s is BLOCKED due to user unmount.\n", dev->print_name());
@@ -741,7 +807,7 @@ static bool reserve_device_for_append(DCR *dcr, RCTX &rctx)
    if (dev->can_read()) {
       Mmsg(jcr->errmsg, _("3603 JobId=%u device %s is busy reading.\n"), 
          jcr->JobId, dev->print_name());
-      Dmsg1(100, "%s", jcr->errmsg);
+      Dmsg1(110, "%s", jcr->errmsg);
       queue_reserve_message(jcr);
       goto bail_out;
    }
@@ -750,16 +816,16 @@ static bool reserve_device_for_append(DCR *dcr, RCTX &rctx)
    if (is_device_unmounted(dev)) {
       Mmsg(jcr->errmsg, _("3604 JobId=%u device %s is BLOCKED due to user unmount.\n"), 
          jcr->JobId, dev->print_name());
-      Dmsg1(100, "%s", jcr->errmsg);
+      Dmsg1(110, "%s", jcr->errmsg);
       queue_reserve_message(jcr);
       goto bail_out;
    }
 
-   Dmsg1(100, "reserve_append device is %s\n", dev->is_tape()?"tape":"disk");
+   Dmsg1(110, "reserve_append device is %s\n", dev->is_tape()?"tape":"disk");
 
    /* Now do detailed tests ... */
    if (can_reserve_drive(dcr, rctx) != 1) {
-      Dmsg0(100, "can_reserve_drive!=1\n");
+      Dmsg0(110, "can_reserve_drive!=1\n");
       goto bail_out;
    }
 
@@ -784,7 +850,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
    DEVICE *dev = dcr->dev;
    JCR *jcr = dcr->jcr;
 
-   Dmsg5(100, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
+   Dmsg5(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
          rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
          rctx.autochanger_only, rctx.any_drive);
 
@@ -797,7 +863,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
        *  helps spread the load to the least used drives.  
        */
       if (rctx.try_low_use_drive && dev == rctx.low_use_drive) {
-         Dmsg3(100, "OK dev=%s == low_drive=%s. JobId=%u\n",
+         Dmsg3(110, "OK dev=%s == low_drive=%s. JobId=%u\n",
             dev->print_name(), rctx.low_use_drive->print_name(), jcr->JobId);
          return 1;
       }
@@ -807,13 +873,13 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
          if ((dev->num_writers + dev->reserved_device) < rctx.num_writers) {
             rctx.num_writers = dev->num_writers + dev->reserved_device;
             rctx.low_use_drive = dev;
-            Dmsg2(100, "set low use drive=%s num_writers=%d\n", dev->print_name(),
+            Dmsg2(110, "set low use drive=%s num_writers=%d\n", dev->print_name(),
                rctx.num_writers);
          } else {
-            Dmsg1(100, "not low use num_writers=%d\n", dev->num_writers+ 
+            Dmsg1(110, "not low use num_writers=%d\n", dev->num_writers+ 
                dev->reserved_device);
          }
-         Dmsg1(100, "failed: !prefMnt && busy. JobId=%u\n", jcr->JobId);
+         Dmsg1(110, "failed: !prefMnt && busy. JobId=%u\n", jcr->JobId);
          Mmsg(jcr->errmsg, _("3605 JobId=%u wants free drive but device %s is busy.\n"), 
             jcr->JobId, dev->print_name());
          queue_reserve_message(jcr);
@@ -825,7 +891,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
          Mmsg(jcr->errmsg, _("3606 JobId=%u wants mounted, but drive %s has no Volume.\n"), 
             jcr->JobId, dev->print_name());
          queue_reserve_message(jcr);
-         Dmsg1(100, "failed: want mounted -- no vol JobId=%u\n", jcr->JobId);
+         Dmsg1(110, "failed: want mounted -- no vol JobId=%u\n", jcr->JobId);
          return 0;                 /* No volume mounted */
       }
 
@@ -836,7 +902,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
             jcr->JobId, rctx.VolumeName, dev->VolHdr.VolumeName, 
             dev->print_name());
          queue_reserve_message(jcr);
-         Dmsg2(100, "failed: Not exact match have=%s want=%s\n",
+         Dmsg2(110, "failed: Not exact match have=%s want=%s\n",
                dev->VolHdr.VolumeName, rctx.VolumeName);
          return 0;
       }
@@ -871,7 +937,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
             Mmsg(jcr->errmsg, _("3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"), 
                   jcr->JobId, dcr->pool_name, dev->pool_name, dev->print_name());
             queue_reserve_message(jcr);
-            Dmsg2(100, "failed: busy num_writers=0, reserved, pool=%s wanted=%s\n",
+            Dmsg2(110, "failed: busy num_writers=0, reserved, pool=%s wanted=%s\n",
                dev->pool_name, dcr->pool_name);
             return 0;                 /* wait */
          }
@@ -914,7 +980,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
          Mmsg(jcr->errmsg, _("3609 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" on drive %s.\n"), 
                jcr->JobId, dcr->pool_name, dev->pool_name, dev->print_name());
          queue_reserve_message(jcr);
-         Dmsg2(100, "failed: busy num_writers>0, can_append, pool=%s wanted=%s\n",
+         Dmsg2(110, "failed: busy num_writers>0, can_append, pool=%s wanted=%s\n",
             dev->pool_name, dcr->pool_name);
          return 0;                    /* wait */
       }
@@ -929,7 +995,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
    Mmsg(jcr->errmsg, _("3911 JobId=%u failed reserve drive %s.\n"), 
          jcr->JobId, dev->print_name());
    queue_reserve_message(jcr);
-   Dmsg2(100, "failed: No reserve %s JobId=%u\n", dev->print_name(), jcr->JobId);
+   Dmsg2(110, "failed: No reserve %s JobId=%u\n", dev->print_name(), jcr->JobId);
    return 0;
 }
 
@@ -972,10 +1038,10 @@ void send_drive_reserve_messages(JCR *jcr, BSOCK *user)
    alist *msgs;
    char *msg;
 
-   P(search_lock);
+   lock_reservations();
    msgs = jcr->reserve_msgs;
    if (!msgs || msgs->size() == 0) {
-      V(search_lock);
+      unlock_reservations();
       return;
    }
    for (i=msgs->size()-1; i >= 0; i--) {
@@ -986,5 +1052,5 @@ void send_drive_reserve_messages(JCR *jcr, BSOCK *user)
          break;
       }
    }
-   V(search_lock);
+   unlock_reservations();
 }
diff --git a/bacula/src/stored/scan.c b/bacula/src/stored/scan.c
deleted file mode 100644 (file)
index 5700ec2..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *
- *   scan.c scan a directory (on a removable file) for a valid
- *      Volume name. If found, open the file for append.
- *
- *    Kern Sibbald, MMVI
- *
- *   Version $Id$
- */
-/*
-   Copyright (C) 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"
-
-/* Forward referenced functions */
-static bool is_volume_name_legal(char *name);
-
-
-bool DEVICE::scan_dir_for_volume(DCR *dcr)
-{
-   DIR* dp;
-   struct dirent *entry, *result;
-   int name_max;
-   char *mount_point;
-   VOLUME_CAT_INFO dcrVolCatInfo, devVolCatInfo;
-   struct stat statp;
-   bool found = false;
-   POOL_MEM fname(PM_FNAME);
-   bool need_slash = false;
-   int len;
-
-   
-   name_max = pathconf(".", _PC_NAME_MAX);
-   if (name_max < 1024) {
-      name_max = 1024;
-   }
-
-   if (device->mount_point) {
-      mount_point = device->mount_point;
-   } else {
-      mount_point = device->device_name;
-   }
-      
-   if (!(dp = opendir(mount_point))) {
-      berrno be;
-      dev_errno = errno;
-      Dmsg3(29, "scan_dir_for_vol: failed to open dir %s (dev=%s), ERR=%s\n", 
-            mount_point, print_name(), be.strerror());
-      goto get_out;
-   }
-   
-   len = strlen(mount_point);
-   if (len > 0) {
-      need_slash = mount_point[len - 1] != '/';
-   }
-   entry = (struct dirent *)malloc(sizeof(struct dirent) + name_max + 1000);
-   for ( ;; ) {
-      if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) {
-         dev_errno = EIO;
-         Dmsg2(129, "scan_dir_for_vol: failed to find suitable file in dir %s (dev=%s)\n", 
-               mount_point, print_name());
-         break;
-      }
-      if (strcmp(result->d_name, ".") == 0 || 
-          strcmp(result->d_name, "..") == 0) {
-         continue;
-      }
-       
-      if (!is_volume_name_legal(result->d_name)) {
-         continue;
-      }
-      pm_strcpy(fname, mount_point);
-      if (need_slash) {
-         pm_strcat(fname, "/");
-      }
-      pm_strcat(fname, result->d_name);
-      if (lstat(fname.c_str(), &statp) != 0 ||
-          !S_ISREG(statp.st_mode)) {
-         continue;                 /* ignore directories & special files */
-      }
-
-      /*
-       * OK, we got a different volume mounted. First save the
-       *  requested Volume info (dcr) structure, then query if
-       *  this volume is really OK. If not, put back the desired
-       *  volume name, mark it not in changer and continue.
-       */
-      memcpy(&dcrVolCatInfo, &dcr->VolCatInfo, sizeof(dcrVolCatInfo));
-      memcpy(&devVolCatInfo, &VolCatInfo, sizeof(devVolCatInfo));
-      /* Check if this is a valid Volume in the pool */
-      bstrncpy(dcr->VolumeName, result->d_name, sizeof(dcr->VolumeName));
-      if (!dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) {
-         continue;
-      }
-      /* This was not the volume we expected, but it is OK with
-       * the Director, so use it.
-       */
-      memcpy(&VolCatInfo, &dcr->VolCatInfo, sizeof(VolCatInfo));
-      found = true;
-      break;                /* got a Volume */
-   }
-   free(entry);
-   closedir(dp);
-   
-get_out:
-   sm_check(__FILE__, __LINE__, false);
-   return found;
-}
-
-/*
- * Check if the Volume name has legal characters
- * If ua is non-NULL send the message
- */
-static bool is_volume_name_legal(char *name)
-{
-   int len;
-   const char *p;
-   const char *accept = ":.-_";
-
-   /* Restrict the characters permitted in the Volume name */
-   for (p=name; *p; p++) {
-      if (B_ISALPHA(*p) || B_ISDIGIT(*p) || strchr(accept, (int)(*p))) {
-         continue;
-      }
-      return false;
-   }
-   len = strlen(name);
-   if (len >= MAX_NAME_LENGTH) {
-      return false;
-   }
-   if (len == 0) {
-      return false;
-   }
-   return true;
-}
index 9cf930447b916eabdd81a7e5cd91efec16eb8e53..cd73dea27b6df7b41a0e040d8df0c1cfd43f6054 100644 (file)
@@ -246,7 +246,7 @@ static bool despool_data(DCR *dcr, bool commit)
       ok = write_block_to_device(dcr);
       if (!ok) {
          Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"),
-               dcr->dev->print_name(), dcr->dev->bstrerror());
+               dcr->dev->print_name(), strerror_dev(dcr->dev));
       }
       Dmsg3(800, "Write block ok=%d FI=%d LI=%d\n", ok, block->FirstIndex, block->LastIndex);
    }
index eff170455ee0d65fe1e22cdfdfa4d8b5437ac7be..596bbafc1493e3142f47dcb34fc190ef9806951f 100644 (file)
@@ -155,7 +155,7 @@ bool status_cmd(JCR *jcr)
 
       } else {
          if (dev) {
-            bnet_fsend(user, _("Device %s is not open.\n"), dev->print_name());
+            bnet_fsend(user, _("Device %s is not open or does not exist.\n"), dev->print_name());
          } else {
             bnet_fsend(user, _("Device \"%s\" is not open or does not exist.\n"), device->hdr.name);
          }
index 71d180a6bfd39c49648edda0ccc4efe1786b7c25..e0e30c1519010ae5487c089245bb77b4a1ec9e64 100644 (file)
@@ -193,6 +193,8 @@ int main (int argc, char *argv[])
       Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
    }
 
+   init_reservations_lock();
+
    if (test_config) {
       terminate_stored(0);
    }
@@ -228,7 +230,7 @@ int main (int argc, char *argv[])
     /*
      * Start the device allocation thread
      */
-   init_volume_list();                /* do before device_init */
+   create_volume_list();              /* do before device_init */
    if (pthread_create(&thid, NULL, device_initialization, NULL) != 0) {
       Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), strerror(errno));
    }
@@ -449,7 +451,7 @@ void *device_initialization(void *arg)
 
    foreach_res(device, R_DEVICE) {
       Dmsg1(90, "calling init_dev %s\n", device->device_name);
-      dev = init_dev(NULL, device);
+      device->dev = dev = init_dev(NULL, device);
       Dmsg1(10, "SD init done %s\n", device->device_name);
       if (!dev) {
          Jmsg1(NULL, M_ERROR, 0, _("Could not initialize %s\n"), device->device_name);
@@ -548,8 +550,7 @@ void terminate_stored(int sig)
       Dmsg1(10, "Term device %s\n", device->device_name);
       if (device->dev) {
          free_volume(device->dev);
-         device->dev->term();
-         device->dev = NULL;
+         term_dev(device->dev);
       } else {
          Dmsg1(10, "No dev structure %s\n", device->device_name);
       }
@@ -564,6 +565,7 @@ void terminate_stored(int sig)
    if (debug_level > 10) {
       print_memory_pool_stats();
    }
+   term_reservations_lock();
    term_msg();
    stop_watchdog();
    cleanup_crypto();
index 99e5652fe0b4766b439e4867c6b418dcb05a1efa..03699ff0e4f6ba43fb4ab4034384bbd493eba802 100644 (file)
@@ -36,7 +36,6 @@ RES **res_head = sres_head;
 /* Forward referenced subroutines */
 static void store_devtype(LEX *lc, RES_ITEM *item, int index, int pass);
 
-
 /* We build the current resource here statically,
  * then move it to dynamic memory */
 URES res_all;
@@ -61,9 +60,9 @@ static RES_ITEM store_items[] = {
    {"scriptsdirectory",      store_dir,  ITEM(res_store.scripts_directory), 0, 0, 0},
    {"maximumconcurrentjobs", store_pint, ITEM(res_store.max_concurrent_jobs), 0, ITEM_DEFAULT, 10},
    {"heartbeatinterval",     store_time, ITEM(res_store.heartbeat_interval), 0, ITEM_DEFAULT, 0},
-   {"tlsenable",             store_bit,     ITEM(res_store.tls_enable), 1, 0, 0},
-   {"tlsrequire",            store_bit,     ITEM(res_store.tls_require), 1, 0, 0},
-   {"tlsverifypeer",         store_bit,     ITEM(res_store.tls_verify_peer), 1, ITEM_DEFAULT, 1},
+   {"tlsenable",             store_yesno,     ITEM(res_store.tls_enable), 1, 0, 0},
+   {"tlsrequire",            store_yesno,     ITEM(res_store.tls_require), 1, 0, 0},
+   {"tlsverifypeer",         store_yesno,     ITEM(res_store.tls_verify_peer), 1, ITEM_DEFAULT, 1},
    {"tlscacertificatefile",  store_dir,       ITEM(res_store.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir",   store_dir,       ITEM(res_store.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate",        store_dir,       ITEM(res_store.tls_certfile), 0, 0, 0},
@@ -79,10 +78,10 @@ static RES_ITEM dir_items[] = {
    {"name",        store_name,     ITEM(res_dir.hdr.name),   0, ITEM_REQUIRED, 0},
    {"description", store_str,      ITEM(res_dir.hdr.desc),   0, 0, 0},
    {"password",    store_password, ITEM(res_dir.password),   0, ITEM_REQUIRED, 0},
-   {"monitor",     store_bit,    ITEM(res_dir.monitor),   1, ITEM_DEFAULT, 0},
-   {"tlsenable",            store_bit,     ITEM(res_dir.tls_enable), 1, 0, 0},
-   {"tlsrequire",           store_bit,     ITEM(res_dir.tls_require), 1, 0, 0},
-   {"tlsverifypeer",        store_bit,     ITEM(res_dir.tls_verify_peer), 1, ITEM_DEFAULT, 1},
+   {"monitor",     store_yesno,    ITEM(res_dir.monitor),   1, ITEM_DEFAULT, 0},
+   {"tlsenable",            store_yesno,     ITEM(res_dir.tls_enable), 1, 0, 0},
+   {"tlsrequire",           store_yesno,     ITEM(res_dir.tls_require), 1, 0, 0},
+   {"tlsverifypeer",        store_yesno,     ITEM(res_dir.tls_verify_peer), 1, ITEM_DEFAULT, 1},
    {"tlscacertificatefile", store_dir,       ITEM(res_dir.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir",  store_dir,       ITEM(res_dir.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate",       store_dir,       ITEM(res_dir.tls_certfile), 0, 0, 0},
@@ -99,37 +98,37 @@ static RES_ITEM dev_items[] = {
    {"mediatype",             store_strname,ITEM(res_dev.media_type),      0, ITEM_REQUIRED, 0},
    {"devicetype",            store_devtype,ITEM(res_dev.dev_type), 0, 0, 0},
    {"archivedevice",         store_strname,ITEM(res_dev.device_name),     0, ITEM_REQUIRED, 0},
-   {"hardwareendoffile",     store_bit,  ITEM(res_dev.cap_bits), CAP_EOF,  ITEM_DEFAULT, 1},
-   {"hardwareendofmedium",   store_bit,  ITEM(res_dev.cap_bits), CAP_EOM,  ITEM_DEFAULT, 1},
-   {"backwardspacerecord",   store_bit,  ITEM(res_dev.cap_bits), CAP_BSR,  ITEM_DEFAULT, 1},
-   {"backwardspacefile",     store_bit,  ITEM(res_dev.cap_bits), CAP_BSF,  ITEM_DEFAULT, 1},
-   {"bsfateom",              store_bit,  ITEM(res_dev.cap_bits), CAP_BSFATEOM, ITEM_DEFAULT, 0},
-   {"twoeof",                store_bit,  ITEM(res_dev.cap_bits), CAP_TWOEOF, ITEM_DEFAULT, 0},
-   {"forwardspacerecord",    store_bit,  ITEM(res_dev.cap_bits), CAP_FSR,  ITEM_DEFAULT, 1},
-   {"forwardspacefile",      store_bit,  ITEM(res_dev.cap_bits), CAP_FSF,  ITEM_DEFAULT, 1},
-   {"fastforwardspacefile",  store_bit,  ITEM(res_dev.cap_bits), CAP_FASTFSF, ITEM_DEFAULT, 1},
-   {"removablemedia",        store_bit,  ITEM(res_dev.cap_bits), CAP_REM,  ITEM_DEFAULT, 1},
-   {"randomaccess",          store_bit,  ITEM(res_dev.cap_bits), CAP_RACCESS, 0, 0},
-   {"automaticmount",        store_bit,  ITEM(res_dev.cap_bits), CAP_AUTOMOUNT,  ITEM_DEFAULT, 0},
-   {"labelmedia",            store_bit,  ITEM(res_dev.cap_bits), CAP_LABEL,      ITEM_DEFAULT, 0},
-   {"alwaysopen",            store_bit,  ITEM(res_dev.cap_bits), CAP_ALWAYSOPEN, ITEM_DEFAULT, 1},
-   {"autochanger",           store_bit,  ITEM(res_dev.cap_bits), CAP_AUTOCHANGER, ITEM_DEFAULT, 0},
-   {"closeonpoll",           store_bit,  ITEM(res_dev.cap_bits), CAP_CLOSEONPOLL, ITEM_DEFAULT, 0},
-   {"blockpositioning",      store_bit,  ITEM(res_dev.cap_bits), CAP_POSITIONBLOCKS, ITEM_DEFAULT, 1},
-   {"usemtiocget",           store_bit,  ITEM(res_dev.cap_bits), CAP_MTIOCGET, ITEM_DEFAULT, 1},
-   {"checklabels",           store_bit,  ITEM(res_dev.cap_bits), CAP_CHECKLABELS, ITEM_DEFAULT, 0},
-   {"requiresmount",         store_bit,  ITEM(res_dev.cap_bits), CAP_REQMOUNT, ITEM_DEFAULT, 0},
-   {"offlineonunmount",      store_bit,  ITEM(res_dev.cap_bits), CAP_OFFLINEUNMOUNT, ITEM_DEFAULT, 0},
-   {"autoselect",            store_bit,  ITEM(res_dev.autoselect), 1, ITEM_DEFAULT, 1},
+   {"hardwareendoffile",     store_yesno,  ITEM(res_dev.cap_bits), CAP_EOF,  ITEM_DEFAULT, 1},
+   {"hardwareendofmedium",   store_yesno,  ITEM(res_dev.cap_bits), CAP_EOM,  ITEM_DEFAULT, 1},
+   {"backwardspacerecord",   store_yesno,  ITEM(res_dev.cap_bits), CAP_BSR,  ITEM_DEFAULT, 1},
+   {"backwardspacefile",     store_yesno,  ITEM(res_dev.cap_bits), CAP_BSF,  ITEM_DEFAULT, 1},
+   {"bsfateom",              store_yesno,  ITEM(res_dev.cap_bits), CAP_BSFATEOM, ITEM_DEFAULT, 0},
+   {"twoeof",                store_yesno,  ITEM(res_dev.cap_bits), CAP_TWOEOF, ITEM_DEFAULT, 0},
+   {"forwardspacerecord",    store_yesno,  ITEM(res_dev.cap_bits), CAP_FSR,  ITEM_DEFAULT, 1},
+   {"forwardspacefile",      store_yesno,  ITEM(res_dev.cap_bits), CAP_FSF,  ITEM_DEFAULT, 1},
+   {"fastforwardspacefile",  store_yesno,  ITEM(res_dev.cap_bits), CAP_FASTFSF, ITEM_DEFAULT, 1},
+   {"removablemedia",        store_yesno,  ITEM(res_dev.cap_bits), CAP_REM,  ITEM_DEFAULT, 1},
+   {"randomaccess",          store_yesno,  ITEM(res_dev.cap_bits), CAP_RACCESS, 0, 0},
+   {"automaticmount",        store_yesno,  ITEM(res_dev.cap_bits), CAP_AUTOMOUNT,  ITEM_DEFAULT, 0},
+   {"labelmedia",            store_yesno,  ITEM(res_dev.cap_bits), CAP_LABEL,      ITEM_DEFAULT, 0},
+   {"alwaysopen",            store_yesno,  ITEM(res_dev.cap_bits), CAP_ALWAYSOPEN, ITEM_DEFAULT, 1},
+   {"autochanger",           store_yesno,  ITEM(res_dev.cap_bits), CAP_AUTOCHANGER, ITEM_DEFAULT, 0},
+   {"closeonpoll",           store_yesno,  ITEM(res_dev.cap_bits), CAP_CLOSEONPOLL, ITEM_DEFAULT, 0},
+   {"blockpositioning",      store_yesno,  ITEM(res_dev.cap_bits), CAP_POSITIONBLOCKS, ITEM_DEFAULT, 1},
+   {"usemtiocget",           store_yesno,  ITEM(res_dev.cap_bits), CAP_MTIOCGET, ITEM_DEFAULT, 1},
+   {"checklabels",           store_yesno,  ITEM(res_dev.cap_bits), CAP_CHECKLABELS, ITEM_DEFAULT, 0},
+   {"requiresmount",         store_yesno,  ITEM(res_dev.cap_bits), CAP_REQMOUNT, ITEM_DEFAULT, 0},
+   {"offlineonunmount",      store_yesno,  ITEM(res_dev.cap_bits), CAP_OFFLINEUNMOUNT, ITEM_DEFAULT, 0},
+   {"autoselect",            store_yesno,  ITEM(res_dev.autoselect), 1, ITEM_DEFAULT, 1},
    {"changerdevice",         store_strname,ITEM(res_dev.changer_name), 0, 0, 0},
    {"changercommand",        store_strname,ITEM(res_dev.changer_command), 0, 0, 0},
    {"alertcommand",          store_strname,ITEM(res_dev.alert_command), 0, 0, 0},
-   {"maximumchangerwait",    store_pint,   ITEM(res_dev.max_changer_wait), 0, ITEM_DEFAULT, 5 * 60},
-   {"maximumopenwait",       store_pint,   ITEM(res_dev.max_open_wait), 0, ITEM_DEFAULT, 5 * 60},
+   {"maximumchangerwait",    store_time,   ITEM(res_dev.max_changer_wait), 0, ITEM_DEFAULT, 5 * 60},
+   {"maximumopenwait",       store_time,   ITEM(res_dev.max_open_wait), 0, ITEM_DEFAULT, 5 * 60},
    {"maximumopenvolumes",    store_pint,   ITEM(res_dev.max_open_vols), 0, ITEM_DEFAULT, 1},
    {"maximumnetworkbuffersize", store_pint, ITEM(res_dev.max_network_buffer_size), 0, 0, 0},
    {"volumepollinterval",    store_time,   ITEM(res_dev.vol_poll_interval), 0, 0, 0},
-   {"maximumrewindwait",     store_pint,   ITEM(res_dev.max_rewind_wait), 0, ITEM_DEFAULT, 5 * 60},
+   {"maximumrewindwait",     store_time,   ITEM(res_dev.max_rewind_wait), 0, ITEM_DEFAULT, 5 * 60},
    {"minimumblocksize",      store_pint,   ITEM(res_dev.min_block_size), 0, 0, 0},
    {"maximumblocksize",      store_pint,   ITEM(res_dev.max_block_size), 0, 0, 0},
    {"maximumvolumesize",     store_size,   ITEM(res_dev.max_volume_size), 0, 0, 0},
@@ -160,7 +159,7 @@ static RES_ITEM changer_items[] = {
 };
 
 
-// {"mountanonymousvolumes", store_bit,  ITEM(res_dev.cap_bits), CAP_ANONVOLS,   ITEM_DEFAULT, 0},
+// {"mountanonymousvolumes", store_yesno,  ITEM(res_dev.cap_bits), CAP_ANONVOLS,   ITEM_DEFAULT, 0},
 
 
 /* Message resource */
index 6cc91f3eea6c86d2b036a7db985b58f87acd62a1..e1db10d0bc37a05e97f14f85f9e19f0a460cda82 100644 (file)
@@ -112,9 +112,9 @@ public:
    int   autoselect;                  /* Automatically select from AutoChanger */
    uint32_t drive_index;              /* Autochanger drive index */
    uint32_t cap_bits;                 /* Capabilities of this device */
-   uint32_t max_changer_wait;         /* Changer timeout */
-   uint32_t max_rewind_wait;          /* maximum secs to wait for rewind */
-   uint32_t max_open_wait;            /* maximum secs to wait for open */
+   utime_t max_changer_wait;          /* Changer timeout */
+   utime_t max_rewind_wait;           /* maximum secs to wait for rewind */
+   utime_t max_open_wait;             /* maximum secs to wait for open */
    uint32_t max_open_vols;            /* maximum simultaneous open volumes */
    uint32_t min_block_size;           /* min block size */
    uint32_t max_block_size;           /* max block size */
index 85555618182e13fad3af5e392d77e8f44a1132ef..a4c4351441634c96157dd3d2e36082c6b205efe2 100644 (file)
@@ -9,7 +9,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -190,7 +190,7 @@ bool wait_for_device(JCR *jcr, bool first)
    struct timespec timeout;
    int stat = 0;
    bool ok = true;
-   const int wait_time = 5 * 60;       /* wait 5 minutes */
+   const int wait_time = 5 * 60;        /* wait 5 minutes */
 
    Dmsg0(100, "Enter wait_for_device\n");
    P(device_release_mutex);
index 95b53e95e4d8bf6ecf6344375c9e04f2a3a80201..23dc73c31c2166b7016e797e7525d02c0b427d5e 100644 (file)
@@ -1,3 +1,5 @@
+bwild
+bregex
 testls
 1
 Makefile
index 2debf389cb351c618d95e5e90348d8fdf5c3a380..9891ee645fbd4ed20fce77af3dcc3befc6b76c09 100644 (file)
@@ -38,11 +38,11 @@ EXTRAOBJS = @OBJLIST@
 DIRCONFOBJS = ../dird/dird_conf.o ../dird/run_conf.o ../dird/inc_conf.o
 
 NODIRTOOLS = bsmtp
-DIRTOOLS = bsmtp dbcheck fstype testfind testls
+DIRTOOLS = bsmtp dbcheck fstype testfind testls bregex bwild
 TOOLS = $(@DIR_TOOLS@)
 
 INSNODIRTOOLS = bsmtp
-INSDIRTOOLS = bsmtp dbcheck
+INSDIRTOOLS = bsmtp dbcheck bwild bregex
 INSTOOLS = $(INS@DIR_TOOLS@)
 
 
@@ -75,13 +75,23 @@ testls: ../findlib/libfind.a ../lib/libbac.a testls.o
        $(CXX) -g $(LDFLAGS) -L. -L../lib -L../findlib -o $@ testls.o \
          $(DLIB) -lfind -lbac -lm $(LIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS)
 
+bregex: ../findlib/libfind.a ../lib/libbac.a bregex.o
+       $(CXX) -g $(LDFLAGS) -L. -L../lib -o $@ bregex.o \
+         $(DLIB) -lbac -lm $(LIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS)
+
+bwild: ../findlib/libfind.a ../lib/libbac.a bwild.o
+       $(CXX) -g $(LDFLAGS) -L. -L../lib -o $@ bwild.o \
+         $(DLIB) -lbac -lm $(LIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS)
+
+
+
 Makefile: $(srcdir)/Makefile.in $(topdir)/config.status
        cd $(topdir) \
          && CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
 clean:
        @$(RMF) bsmtp core core.* a.out *.o *.bak *~ *.intpro *.extpro 1 2 3
-       @$(RMF) testfind dbcheck testls fstype
+       @$(RMF) $(DIRTOOLS)
 
 realclean: clean
        @$(RMF) tags
@@ -97,13 +107,14 @@ devclean: realclean
 # Allow non-root execution of bsmtp for non-root Directors
 install: $(INSTOOLS)
        @for tool in ${INSTOOLS} ; do \
-               $(INSTALL_PROGRAM) $$tool $(DESTDIR)$(sbindir)/$$tool ; \
+          $(INSTALL_PROGRAM) $$tool $(DESTDIR)$(sbindir)/$$tool ; \
        done
        chmod 755 $(DESTDIR)$(sbindir)/bsmtp
 
 uninstall:
-       (cd $(DESTDIR)$(sbindir); $(RMF) bsmtp)
-       (cd $(DESTDIR)$(sbindir); $(RMF) dbcheck)
+       @for tool in ${INSTOOLS} ; do \
+          $(RMF) $(DESTDIR)$(sbindir)/$$tool ; \
+       done
 
 
 
diff --git a/bacula/src/tools/bregex.c b/bacula/src/tools/bregex.c
new file mode 100644 (file)
index 0000000..f565e83
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * Test program for testing regular expressions.
+ */
+/*
+   Copyright (C) 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"
+
+//#define TESTLIB
+#ifdef TESTLIB
+
+#include "lib/bregex.h"
+
+#else
+#ifndef HAVE_REGEX_H
+#include "lib/bregex.h"
+#else
+#include <regex.h>
+#endif
+
+#endif
+
+
+static void usage()
+{
+   fprintf(stderr,
+"\n"
+"Usage: bregex [-d debug_level] -f <data-file>\n"
+"       -f          specify file of data to be matched\n"
+"       -l          suppress line numbers\n"
+"       -n          print lines that do not match\n"
+"       -?          print this message.\n"
+"\n\n");
+
+   exit(1);
+}
+
+
+int main(int argc, char *const *argv)
+{
+   regex_t preg;
+   char prbuf[500];
+   char *fname = NULL;
+   int rc, ch;
+   char data[1000];
+   char pat[500];
+   FILE *fd;
+   bool match_only = true;
+   int lineno;
+   bool no_linenos = false;
+   
+
+   setlocale(LC_ALL, "");
+   bindtextdomain("bacula", LOCALEDIR);
+   textdomain("bacula");
+
+   while ((ch = getopt(argc, argv, "d:f:n?")) != -1) {
+      switch (ch) {
+      case 'd':                       /* set debug level */
+         debug_level = atoi(optarg);
+         if (debug_level <= 0) {
+            debug_level = 1;
+         }
+         break;
+
+      case 'f':                       /* data */
+         fname = optarg;
+         break;
+
+      case 'l':
+         no_linenos = true;
+         break;
+
+      case 'n':
+         match_only = false;
+         break;
+
+      case '?':
+      default:
+         usage();
+
+      }
+   }
+   argc -= optind;
+   argv += optind;
+
+   if (!fname) {
+      printf("A data file must be specified.\n");
+      usage();
+   }
+
+   for ( ;; ) {
+      printf("Enter regex pattern: ");
+      if (fgets(pat, sizeof(pat)-1, stdin) == NULL) {
+         break;
+      }
+      strip_trailing_newline(pat);
+      if (pat[0] == 0) {
+         exit(0);
+      }
+      rc = regcomp(&preg, pat, REG_EXTENDED);
+      if (rc != 0) {
+         regerror(rc, &preg, prbuf, sizeof(prbuf));
+         printf("Regex compile error: %s\n", prbuf);
+         continue;
+      }
+      fd = fopen(fname, "r");
+      if (!fd) {
+         printf(_("Could not open data file: %s\n"), fname);
+         exit(1);
+      }
+      lineno = 0;
+      while (fgets(data, sizeof(data)-1, fd)) {
+         const int nmatch = 30;
+         regmatch_t pmatch[nmatch];
+         strip_trailing_newline(data);
+         lineno++;
+         rc = regexec(&preg, data, nmatch, pmatch,  0);
+         if ((match_only && rc == 0) || (!match_only && rc != 0)) {
+            if (no_linenos) {
+               printf("%s\n", data);
+            } else {
+               printf("%5d: %s\n", lineno, data);
+            }
+         }
+      }
+      fclose(fd);
+      regfree(&preg);
+   }
+   exit(0);
+}
index ab6883db736c914bb0fc37687b740159a84d315c..5c22b0c830a0833f6fdec6906f31d11180ab85bf 100644 (file)
@@ -1,5 +1,5 @@
 /*
-   Copyright (C) 2001-2005 Kern Sibbald
+  Copyright (C) 2001-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
@@ -125,6 +125,8 @@ _("\n"
 "       -f          set the From: field\n"
 "       -h          use mailhost:port as the SMTP server\n"
 "       -s          set the Subject: field\n"
+"       -r          set the Reply-To: field\n"
+"       -l          set the maximum number of lines that should be sent (default: unlimited)\n"
 "       -?          print this message.\n"
 "\n"), MY_NAME);
 
@@ -142,18 +144,20 @@ int main (int argc, char *argv[])
     struct sockaddr_in sin;
     struct hostent *hp;
     int s, r, i, ch;
+    unsigned long maxlines, lines;
     struct passwd *pwd;
     char *cp, *p;
     time_t now = time(NULL);
     struct tm tm;
     
-   setlocale(LC_ALL, "");
+   setlocale(LC_ALL, "en_US");
    bindtextdomain("bacula", LOCALEDIR);
    textdomain("bacula");
 
    my_name_is(argc, argv, "bsmtp");
+   maxlines = 0;
 
-   while ((ch = getopt(argc, argv, "c:d:f:h:r:s:?")) != -1) {
+   while ((ch = getopt(argc, argv, "c:d:f:h:r:s:l:?")) != -1) {
       switch (ch) {
       case 'c':
          Dmsg1(20, "cc=%s\n", optarg);
@@ -191,6 +195,11 @@ int main (int argc, char *argv[])
          reply_addr = optarg;
          break;
 
+      case 'l':
+        Dmsg1(20, "maxlines=%s\n", optarg);
+        maxlines = (unsigned long) atol(optarg);
+        break;
+
       case '?':
       default:
          usage();
@@ -313,42 +322,58 @@ hp:
     *  Send message header
     */
    fprintf(sfp, "From: %s\r\n", from_addr);
+   Dmsg1(10, "From: %s\r\n", from_addr);
    if (subject) {
       fprintf(sfp, "Subject: %s\r\n", subject);
+      Dmsg1(10, "Subject: %s\r\n", subject);
    }
    if (reply_addr) {
       fprintf(sfp, "Reply-To: %s\r\n", reply_addr);
+      Dmsg1(10, "Reply-To: %s\r\n", reply_addr);
    }
    if (err_addr) {
       fprintf(sfp, "Errors-To: %s\r\n", err_addr);
+      Dmsg1(10, "Errors-To: %s\r\n", err_addr);
    }
    if ((pwd = getpwuid(getuid())) == 0) {
       fprintf(sfp, "Sender: userid-%d@%s\r\n", (int)getuid(), my_hostname);
+      Dmsg2(10, "Sender: userid-%d@%s\r\n", (int)getuid(), my_hostname);
    } else {
       fprintf(sfp, "Sender: %s@%s\r\n", pwd->pw_name, my_hostname);
+      Dmsg2(10, "Sender: %s@%s\r\n", pwd->pw_name, my_hostname);
    }
 
    fprintf(sfp, "To: %s", argv[0]);
+   Dmsg1(10, "To: %s", argv[0]);
    for (i = 1; i < argc; i++) {
       fprintf(sfp, ",%s", argv[i]);
+      Dmsg1(10, ",%s", argv[i]);
    }
 
    fprintf(sfp, "\r\n");
+   Dmsg0(10, "\r\n");
    if (cc_addr) {
       fprintf(sfp, "Cc: %s\r\n", cc_addr);
+      Dmsg1(10, "Cc: %s\r\n", cc_addr);
    }
 
    /* Add RFC822 date */
    localtime_r(&now, &tm);
    strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S %z", &tm);
    fprintf(sfp, "Date: %s\r\n", buf);
+   Dmsg1(10, "Date: %s\r\n", buf);
 
    fprintf(sfp, "\r\n");
 
    /*
     *  Send message body
     */
+   lines = 0;
    while (fgets(buf, sizeof(buf), stdin)) {
+      if (maxlines > 0 && ++lines > maxlines) {
+         Dmsg1(20, "skip line because of maxlines limit: %lu\n", maxlines);
+        continue;
+      }
       buf[strlen(buf)-1] = 0;
       if (strcmp(buf, ".") == 0) { /* quote lone dots */
          fprintf(sfp, "..\r\n");
@@ -357,6 +382,11 @@ hp:
       }
    }
 
+   if (lines > maxlines) {
+      Dmsg1(10, "hit maxlines limit: %lu\n", maxlines);
+      fprintf(sfp, "\r\n[maximum of %lu lines exceeded, skipped %lu lines of output]\r\n", maxlines, lines-maxlines);
+   }
+
    /*
     *  Send SMTP quit command
     */
diff --git a/bacula/src/tools/bwild.c b/bacula/src/tools/bwild.c
new file mode 100644 (file)
index 0000000..65b6a2d
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Test program for testing wild card expressions
+ */
+/*
+   Copyright (C) 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 "lib/fnmatch.h"
+
+
+static void usage()
+{
+   fprintf(stderr,
+"\n"
+"Usage: bwild [-d debug_level] -f <data-file>\n"
+"       -f          specify file of data to be matched\n"
+"       -i          use case insenitive match\n"
+"       -l          suppress line numbers\n"
+"       -n          print lines that do not match\n"
+"       -?          print this message.\n"
+"\n\n");
+
+   exit(1);
+}
+
+int main(int argc, char *const *argv)
+{
+   char *fname = NULL;
+   int rc, ch;
+   char data[1000];
+   char pat[500];
+   FILE *fd;
+   bool match_only = true;
+   int lineno;
+   bool no_linenos = false;
+   int ic = 0;
+   
+
+   setlocale(LC_ALL, "");
+   bindtextdomain("bacula", LOCALEDIR);
+   textdomain("bacula");
+
+   while ((ch = getopt(argc, argv, "d:f:in?")) != -1) {
+      switch (ch) {
+      case 'd':                       /* set debug level */
+         debug_level = atoi(optarg);
+         if (debug_level <= 0) {
+            debug_level = 1;
+         }
+         break;
+
+      case 'f':                       /* data */
+         fname = optarg;
+         break;
+
+      case 'i':                       /* ignore case */
+         ic = FNM_CASEFOLD;
+         break;
+
+      case 'l':
+         no_linenos = true;
+         break;
+
+      case 'n':
+         match_only = false;
+         break;
+
+      case '?':
+      default:
+         usage();
+
+      }
+   }
+   argc -= optind;
+   argv += optind;
+
+   if (!fname) {
+      printf("A data file must be specified.\n");
+      usage();
+   }
+
+   for ( ;; ) {
+      printf("Enter a wild-card: ");
+      if (fgets(pat, sizeof(pat)-1, stdin) == NULL) {
+         break;
+      }
+      strip_trailing_newline(pat);
+      if (pat[0] == 0) {
+         exit(0);
+      }
+      fd = fopen(fname, "r");
+      if (!fd) {
+         printf(_("Could not open data file: %s\n"), fname);
+         exit(1);
+      }
+      lineno = 0;
+      while (fgets(data, sizeof(data)-1, fd)) {
+         strip_trailing_newline(data);
+         lineno++;
+         rc = fnmatch(pat, data, ic);
+         if ((match_only && rc == 0) || (!match_only && rc != 0)) {
+            if (no_linenos) {
+               printf("%s\n", data);
+            } else {
+               printf("%5d: %s\n", lineno, data);
+            }
+         }
+      }
+      fclose(fd);
+   }
+   exit(0);
+}
index 18cfdf04f47a544384d3b6321ca8c7ba37ce89c6..7614c2052a4eba451cc828f8de8372742dc87809 100644 (file)
@@ -8,14 +8,14 @@
 *   1. The generic lexical scanner in lib/lex.c and lib/lex.h
 *
 *   2. The generic config  scanner in lib/parse_config.c and
-*       lib/parse_config.h.
-*       These files contain the parser code, some utility
-*       routines, and the common store routines (name, int,
-*       string).
+*      lib/parse_config.h.
+*      These files contain the parser code, some utility
+*      routines, and the common store routines (name, int,
+*      string).
 *
 *   3. The daemon specific file, which contains the Resource
-*       definitions as well as any specific store routines
-*       for the resource records.
+*      definitions as well as any specific store routines
+*      for the resource records.
 *
 *     Nicolas Boichat, August MMIV
 *
@@ -69,12 +69,12 @@ int  res_all_size = sizeof(res_all);
 /*
 *    Monitor Resource
 *
-*   name           handler     value                 code flags    default_value
+*   name          handler     value                 code flags    default_value
 */
 static RES_ITEM mon_items[] = {
    {"name",        store_name,     ITEM(res_monitor.hdr.name), 0, ITEM_REQUIRED, 0},
    {"description", store_str,      ITEM(res_monitor.hdr.desc), 0, 0, 0},
-   {"requiressl",  store_bit,    ITEM(res_monitor.require_ssl), 1, ITEM_DEFAULT, 0},
+   {"requiressl",  store_yesno,    ITEM(res_monitor.require_ssl), 1, ITEM_DEFAULT, 0},
    {"password",    store_password, ITEM(res_monitor.password), 0, ITEM_REQUIRED, 0},
    {"refreshinterval",  store_time,ITEM(res_monitor.RefreshInterval),  0, ITEM_DEFAULT, 5},
    {"fdconnecttimeout", store_time,ITEM(res_monitor.FDConnectTimeout), 0, ITEM_DEFAULT, 60 * 30},
@@ -88,14 +88,14 @@ static RES_ITEM dir_items[] = {
    {"description", store_str,      ITEM(res_dir.hdr.desc), 0, 0, 0},
    {"dirport",     store_int,      ITEM(res_dir.DIRport),  0, ITEM_DEFAULT, 9101},
    {"address",     store_str,      ITEM(res_dir.address),  0, 0, 0},
-   {"enablessl",   store_bit,    ITEM(res_dir.enable_ssl), 1, ITEM_DEFAULT, 0},
+   {"enablessl",   store_yesno,    ITEM(res_dir.enable_ssl), 1, ITEM_DEFAULT, 0},
    {NULL, NULL, NULL, 0, 0, 0}
 };
 
 /*
 *    Client or File daemon resource
 *
-*   name           handler     value                 code flags    default_value
+*   name          handler     value                 code flags    default_value
 */
 
 static RES_ITEM cli_items[] = {
@@ -104,13 +104,13 @@ static RES_ITEM cli_items[] = {
    {"address",  store_str,        ITEM(res_client.address),  0, ITEM_REQUIRED, 0},
    {"fdport",   store_pint,       ITEM(res_client.FDport),   0, ITEM_DEFAULT, 9102},
    {"password", store_password,   ITEM(res_client.password), 0, ITEM_REQUIRED, 0},
-   {"enablessl", store_bit,     ITEM(res_client.enable_ssl), 1, ITEM_DEFAULT, 0},
+   {"enablessl", store_yesno,     ITEM(res_client.enable_ssl), 1, ITEM_DEFAULT, 0},
    {NULL, NULL, NULL, 0, 0, 0}
 };
 
 /* Storage daemon resource
 *
-*   name           handler     value                 code flags    default_value
+*   name          handler     value                 code flags    default_value
 */
 static RES_ITEM store_items[] = {
    {"name",        store_name,     ITEM(res_store.hdr.name),   0, ITEM_REQUIRED, 0},
@@ -120,7 +120,7 @@ static RES_ITEM store_items[] = {
    {"sdaddress",   store_str,      ITEM(res_store.address),    0, 0, 0},
    {"password",    store_password, ITEM(res_store.password),   0, ITEM_REQUIRED, 0},
    {"sdpassword",  store_password, ITEM(res_store.password),   0, 0, 0},
-   {"enablessl",   store_bit,    ITEM(res_store.enable_ssl),  1, ITEM_DEFAULT, 0},
+   {"enablessl",   store_yesno,    ITEM(res_store.enable_ssl),  1, ITEM_DEFAULT, 0},
    {NULL, NULL, NULL, 0, 0, 0}
 };
 
@@ -131,7 +131,7 @@ static RES_ITEM store_items[] = {
 *  NOTE!!! keep it in the same order as the R_codes
 *    or eliminate all resources[rindex].name
 *
-*  name      items        rcode        res_head
+*  name             items        rcode        res_head
 */
 RES_TABLE resources[] = {
    {"monitor",      mon_items,    R_MONITOR},
@@ -152,7 +152,7 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm
       sendit(sock, _("No %s resource defined\n"), res_to_str(type));
       return;
    }
-   if (type < 0) {                    /* no recursion */
+   if (type < 0) {                   /* no recursion */
       type = - type;
       recurse = false;
    }
@@ -194,7 +194,7 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm
 */
 void free_resource(RES *sres, int type)
 {
-   RES *nres;                         /* next resource if linked */
+   RES *nres;                        /* next resource if linked */
    URES *res = (URES *)sres;
 
    if (res == NULL)
@@ -258,14 +258,14 @@ void save_resource(int type, RES_ITEM *items, int pass)
    */
    for (i=0; items[i].name; i++) {
       if (items[i].flags & ITEM_REQUIRED) {
-         if (!bit_is_set(i, res_all.res_monitor.hdr.item_present)) {
-               Emsg2(M_ERROR_TERM, 0, _("%s item is required in %s resource, but not found.\n"),
-                  items[i].name, resources[rindex]);
-         }
+        if (!bit_is_set(i, res_all.res_monitor.hdr.item_present)) {
+              Emsg2(M_ERROR_TERM, 0, _("%s item is required in %s resource, but not found.\n"),
+                 items[i].name, resources[rindex]);
+        }
       }
       /* If this triggers, take a look at lib/parse_conf.h */
       if (i >= MAX_RES_ITEMS) {
-         Emsg1(M_ERROR_TERM, 0, _("Too many items in %s resource\n"), resources[rindex]);
+        Emsg1(M_ERROR_TERM, 0, _("Too many items in %s resource\n"), resources[rindex]);
       }
    }
 
@@ -282,22 +282,22 @@ void save_resource(int type, RES_ITEM *items, int pass)
       case R_CLIENT:
       case R_STORAGE:
       case R_DIRECTOR:
-         break;
+        break;
       default:
-         Emsg1(M_ERROR, 0, _("Unknown resource type %d in save_resource.\n"), type);
-         error = 1;
-         break;
+        Emsg1(M_ERROR, 0, _("Unknown resource type %d in save_resource.\n"), type);
+        error = 1;
+        break;
       }
       /* Note, the resource name was already saved during pass 1,
       * so here, we can just release it.
       */
       if (res_all.res_monitor.hdr.name) {
-         free(res_all.res_monitor.hdr.name);
-         res_all.res_monitor.hdr.name = NULL;
+        free(res_all.res_monitor.hdr.name);
+        res_all.res_monitor.hdr.name = NULL;
       }
       if (res_all.res_monitor.hdr.desc) {
-         free(res_all.res_monitor.hdr.desc);
-         res_all.res_monitor.hdr.desc = NULL;
+        free(res_all.res_monitor.hdr.desc);
+        res_all.res_monitor.hdr.desc = NULL;
       }
       return;
    }
@@ -330,21 +330,21 @@ void save_resource(int type, RES_ITEM *items, int pass)
       memcpy(res, &res_all, size);
       if (!res_head[rindex]) {
    res_head[rindex] = (RES *)res; /* store first entry */
-         Dmsg3(900, "Inserting first %s res: %s index=%d\n", res_to_str(type),
-         res->res_monitor.hdr.name, rindex);
+        Dmsg3(900, "Inserting first %s res: %s index=%d\n", res_to_str(type),
+        res->res_monitor.hdr.name, rindex);
       } else {
    RES *next;
    /* Add new res to end of chain */
    for (next=res_head[rindex]; next->next; next=next->next) {
       if (strcmp(next->name, res->res_monitor.hdr.name) == 0) {
-         Emsg2(M_ERROR_TERM, 0,
-                  _("Attempt to define second %s resource named \"%s\" is not permitted.\n"),
-         resources[rindex].name, res->res_monitor.hdr.name);
+        Emsg2(M_ERROR_TERM, 0,
+                 _("Attempt to define second %s resource named \"%s\" is not permitted.\n"),
+        resources[rindex].name, res->res_monitor.hdr.name);
       }
    }
    next->next = (RES *)res;
-         Dmsg4(900, "Inserting %s res: %s index=%d pass=%d\n", res_to_str(type),
-         res->res_monitor.hdr.name, rindex, pass);
+        Dmsg4(900, "Inserting %s res: %s index=%d pass=%d\n", res_to_str(type),
+        res->res_monitor.hdr.name, rindex, pass);
       }
    }
 }
index 0870424a324937ba02da22175e32f1da2e4c9bd9..4587ce8073c2e12fc02fea9421f3bed4d41f274a 100644 (file)
@@ -3,9 +3,9 @@
  */
 
 #undef  VERSION
-#define VERSION "1.39.5"
-#define BDATE   "20 February 2006"
-#define LSMDATE "20Feb06"
+#define VERSION "1.38.9"
+#define BDATE   "02 May 2006"
+#define LSMDATE "02May06"
 
 /* Debug flags */
 #undef  DEBUG
@@ -15,7 +15,7 @@
 #define TRACE_FILE 1
 
 /* If this is set stdout will not be closed on startup */
-#define DEVELOPER 1
+/* #define DEVELOPER 1 */
 
 /* #define USE_BSNPRINTF */
 
diff --git a/bacula/src/win32/License.txt b/bacula/src/win32/License.txt
deleted file mode 100644 (file)
index 3a9e9b2..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright Â©2002-2004, Kern Sibbald
-
-This software is provided 'as-is', without any express or implied
-warranty.  In no event will the authors be held liable for any damages
-arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it
-freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not
-   claim that you wrote the original software.  If you use this software
-   in a product, an acknowledgment in the product documentation would be
-   appreciated but is not required.
-
-2.  Altered versions must be plainly marked as such, and must not be
-    misrepresented as being the original software.
-
-3. This notice may not be removed or altered from any distribution.
index df2c8f7f8de7092216691992340ea3fd32680227..1fe3accd993914dca393dd02b721faee1428b843 100644 (file)
@@ -57,11 +57,11 @@ CLEAN :
         -@erase "$(INTDIR)\bsys.obj"
         -@erase "$(INTDIR)\btime.obj"
         -@erase "$(INTDIR)\btimers.obj"
+        -@erase "$(INTDIR)\chksum.obj"
         -@erase "$(INTDIR)\compat.obj"
         -@erase "$(INTDIR)\cram-md5.obj"
         -@erase "$(INTDIR)\crc32.obj"
         -@erase "$(INTDIR)\create_file.obj"
-        -@erase "$(INTDIR)\crypto.obj"
         -@erase "$(INTDIR)\daemon.obj"
         -@erase "$(INTDIR)\dlist.obj"
         -@erase "$(INTDIR)\edit.obj"
@@ -90,7 +90,7 @@ CLEAN :
         -@erase "$(INTDIR)\print.obj"
         -@erase "$(INTDIR)\pythonlib.obj"
         -@erase "$(INTDIR)\queue.obj"
-        -@erase "$(INTDIR)\regex.obj"
+        -@erase "$(INTDIR)\bregex.obj"
         -@erase "$(INTDIR)\restore.obj"
         -@erase "$(INTDIR)\res.obj"
         -@erase "$(INTDIR)\rwlock.obj"
@@ -154,11 +154,11 @@ LINK32_OBJS= \
         "$(INTDIR)\bsys.obj" \
         "$(INTDIR)\btime.obj" \
         "$(INTDIR)\btimers.obj" \
+        "$(INTDIR)\chksum.obj" \
         "$(INTDIR)\compat.obj" \
         "$(INTDIR)\cram-md5.obj" \
         "$(INTDIR)\crc32.obj" \
         "$(INTDIR)\create_file.obj" \
-        "$(INTDIR)\crypto.obj" \
         "$(INTDIR)\daemon.obj" \
         "$(INTDIR)\dlist.obj" \
         "$(INTDIR)\edit.obj" \
@@ -187,7 +187,7 @@ LINK32_OBJS= \
         "$(INTDIR)\print.obj" \
         "$(INTDIR)\pythonlib.obj" \
         "$(INTDIR)\queue.obj" \
-        "$(INTDIR)\regex.obj" \
+        "$(INTDIR)\bregex.obj" \
         "$(INTDIR)\restore.obj" \
         "$(INTDIR)\res.obj" \
         "$(INTDIR)\rwlock.obj" \
@@ -271,6 +271,8 @@ CLEAN :
         -@erase "$(INTDIR)\btime.sbr"
         -@erase "$(INTDIR)\btimers.obj"
         -@erase "$(INTDIR)\btimers.sbr"
+        -@erase "$(INTDIR)\chksum.obj"
+        -@erase "$(INTDIR)\chksum.sbr"
         -@erase "$(INTDIR)\compat.obj"
         -@erase "$(INTDIR)\compat.sbr"
         -@erase "$(INTDIR)\cram-md5.obj"
@@ -279,8 +281,6 @@ CLEAN :
         -@erase "$(INTDIR)\crc32.sbr"
         -@erase "$(INTDIR)\create_file.obj"
         -@erase "$(INTDIR)\create_file.sbr"
-        -@erase "$(INTDIR)\crypto.obj"
-        -@erase "$(INTDIR)\crypto.sbr"
         -@erase "$(INTDIR)\daemon.obj"
         -@erase "$(INTDIR)\daemon.sbr"
         -@erase "$(INTDIR)\dlist.obj"
@@ -337,8 +337,8 @@ CLEAN :
         -@erase "$(INTDIR)\pythonlib.sbr"
         -@erase "$(INTDIR)\queue.obj"
         -@erase "$(INTDIR)\queue.sbr"
-        -@erase "$(INTDIR)\regex.obj"
-        -@erase "$(INTDIR)\regex.sbr"
+        -@erase "$(INTDIR)\bregex.obj"
+        -@erase "$(INTDIR)\bregex.sbr"
         -@erase "$(INTDIR)\restore.obj"
         -@erase "$(INTDIR)\restore.sbr"
         -@erase "$(INTDIR)\res.obj"
@@ -430,11 +430,11 @@ BSC32_SBRS= \
         "$(INTDIR)\bsys.sbr" \
         "$(INTDIR)\btime.sbr" \
         "$(INTDIR)\btimers.sbr" \
+        "$(INTDIR)\chksum.sbr" \
         "$(INTDIR)\compat.sbr" \
         "$(INTDIR)\cram-md5.sbr" \
         "$(INTDIR)\crc32.sbr" \
         "$(INTDIR)\create_file.sbr" \
-        "$(INTDIR)\crypto.sbr" \
         "$(INTDIR)\daemon.sbr" \
         "$(INTDIR)\dlist.sbr" \
         "$(INTDIR)\edit.sbr" \
@@ -463,7 +463,7 @@ BSC32_SBRS= \
         "$(INTDIR)\print.sbr" \
         "$(INTDIR)\pythonlib.sbr" \
         "$(INTDIR)\queue.sbr" \
-        "$(INTDIR)\regex.sbr" \
+        "$(INTDIR)\bregex.sbr" \
         "$(INTDIR)\restore.sbr" \
         "$(INTDIR)\res.sbr" \
         "$(INTDIR)\rwlock.sbr" \
@@ -520,11 +520,11 @@ LINK32_OBJS= \
         "$(INTDIR)\bsys.obj" \
         "$(INTDIR)\btime.obj" \
         "$(INTDIR)\btimers.obj" \
+        "$(INTDIR)\chksum.obj" \
         "$(INTDIR)\compat.obj" \
         "$(INTDIR)\cram-md5.obj" \
         "$(INTDIR)\crc32.obj" \
         "$(INTDIR)\create_file.obj" \
-        "$(INTDIR)\crypto.obj" \
         "$(INTDIR)\daemon.obj" \
         "$(INTDIR)\dlist.obj" \
         "$(INTDIR)\edit.obj" \
@@ -553,7 +553,7 @@ LINK32_OBJS= \
         "$(INTDIR)\print.obj" \
         "$(INTDIR)\pythonlib.obj" \
         "$(INTDIR)\queue.obj" \
-        "$(INTDIR)\regex.obj" \
+        "$(INTDIR)\bregex.obj" \
         "$(INTDIR)\restore.obj" \
         "$(INTDIR)\res.obj" \
         "$(INTDIR)\rwlock.obj" \
@@ -944,98 +944,97 @@ SOURCE=..\lib\btimers.cpp
 !ENDIF 
 
 
-SOURCE=..\compat\compat.cpp
+SOURCE=..\filed\chksum.cpp
 
 !IF  "$(CFG)" == "baculafd - Win32 Release"
 
 
-"$(INTDIR)\compat.obj" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\chksum.obj" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ELSEIF  "$(CFG)" == "baculafd - Win32 Debug"
 
 
-"$(INTDIR)\compat.obj"  "$(INTDIR)\compat.sbr" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\chksum.obj" "$(INTDIR)\chksum.sbr" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ENDIF 
 
-SOURCE="..\lib\cram-md5.cpp"
+
+SOURCE=..\compat\compat.cpp
 
 !IF  "$(CFG)" == "baculafd - Win32 Release"
 
 
-"$(INTDIR)\cram-md5.obj" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\compat.obj" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ELSEIF  "$(CFG)" == "baculafd - Win32 Debug"
 
 
-"$(INTDIR)\cram-md5.obj"        "$(INTDIR)\cram-md5.sbr" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\compat.obj"  "$(INTDIR)\compat.sbr" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ENDIF 
 
-SOURCE=..\lib\crc32.cpp
+SOURCE="..\lib\cram-md5.cpp"
 
 !IF  "$(CFG)" == "baculafd - Win32 Release"
 
 
-"$(INTDIR)\crc32.obj" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\cram-md5.obj" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ELSEIF  "$(CFG)" == "baculafd - Win32 Debug"
 
 
-"$(INTDIR)\crc32.obj"   "$(INTDIR)\crc32.sbr" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\cram-md5.obj"        "$(INTDIR)\cram-md5.sbr" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ENDIF 
 
-SOURCE=..\findlib\create_file.cpp
+SOURCE=..\lib\crc32.cpp
 
 !IF  "$(CFG)" == "baculafd - Win32 Release"
 
 
-"$(INTDIR)\create_file.obj" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\crc32.obj" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ELSEIF  "$(CFG)" == "baculafd - Win32 Debug"
 
 
-"$(INTDIR)\create_file.obj"     "$(INTDIR)\create_file.sbr" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\crc32.obj"   "$(INTDIR)\crc32.sbr" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ENDIF 
 
-
-SOURCE=..\lib\crypto.cpp
+SOURCE=..\findlib\create_file.cpp
 
 !IF  "$(CFG)" == "baculafd - Win32 Release"
 
 
-"$(INTDIR)\crypto.obj" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\create_file.obj" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ELSEIF  "$(CFG)" == "baculafd - Win32 Debug"
 
 
-"$(INTDIR)\crypto.obj"   "$(INTDIR)\crypto.sbr" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\create_file.obj"     "$(INTDIR)\create_file.sbr" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ENDIF 
 
-
 SOURCE=..\lib\daemon.cpp
 
 !IF  "$(CFG)" == "baculafd - Win32 Release"
@@ -1542,19 +1541,19 @@ SOURCE=..\lib\queue.cpp
 
 !ENDIF 
 
-SOURCE=..\lib\regex.cpp
+SOURCE=..\lib\bregex.cpp
 
 !IF  "$(CFG)" == "baculafd - Win32 Release"
 
 
-"$(INTDIR)\regex.obj" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\bregex.obj" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ELSEIF  "$(CFG)" == "baculafd - Win32 Debug"
 
 
-"$(INTDIR)\regex.obj"   "$(INTDIR)\regex.sbr" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\bregex.obj"   "$(INTDIR)\bregex.sbr" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
index 4528fe54588c1c11bc8cdf2d1a97c81298a1c170..60f9fa63ef96939bbe00cf206c09a66bfe1a7c6a 100644 (file)
@@ -90,7 +90,7 @@ CLEAN :
         -@erase "$(INTDIR)\print.obj"
         -@erase "$(INTDIR)\pythonlib.obj"
         -@erase "$(INTDIR)\queue.obj"
-        -@erase "$(INTDIR)\regex.obj"
+        -@erase "$(INTDIR)\bregex.obj"
         -@erase "$(INTDIR)\restore.obj"
         -@erase "$(INTDIR)\res.obj"
         -@erase "$(INTDIR)\rwlock.obj"
@@ -184,7 +184,7 @@ LINK32_OBJS= \
         "$(INTDIR)\print.obj" \
         "$(INTDIR)\pythonlib.obj" \
         "$(INTDIR)\queue.obj" \
-        "$(INTDIR)\regex.obj" \
+        "$(INTDIR)\bregex.obj" \
         "$(INTDIR)\restore.obj" \
         "$(INTDIR)\res.obj" \
         "$(INTDIR)\rwlock.obj" \
@@ -331,8 +331,8 @@ CLEAN :
         -@erase "$(INTDIR)\pythonlib.sbr"
         -@erase "$(INTDIR)\queue.obj"
         -@erase "$(INTDIR)\queue.sbr"
-        -@erase "$(INTDIR)\regex.obj"
-        -@erase "$(INTDIR)\regex.sbr"
+        -@erase "$(INTDIR)\bregex.obj"
+        -@erase "$(INTDIR)\bregex.sbr"
         -@erase "$(INTDIR)\restore.obj"
         -@erase "$(INTDIR)\restore.sbr"
         -@erase "$(INTDIR)\res.obj"
@@ -451,7 +451,7 @@ BSC32_SBRS= \
         "$(INTDIR)\print.sbr" \
         "$(INTDIR)\pythonlib.sbr" \
         "$(INTDIR)\queue.sbr" \
-        "$(INTDIR)\regex.sbr" \
+        "$(INTDIR)\bregex.sbr" \
         "$(INTDIR)\restore.sbr" \
         "$(INTDIR)\res.sbr" \
         "$(INTDIR)\rwlock.sbr" \
@@ -538,7 +538,7 @@ LINK32_OBJS= \
         "$(INTDIR)\print.obj" \
         "$(INTDIR)\pythonlib.obj" \
         "$(INTDIR)\queue.obj" \
-        "$(INTDIR)\regex.obj" \
+        "$(INTDIR)\bregex.obj" \
         "$(INTDIR)\restore.obj" \
         "$(INTDIR)\res.obj" \
         "$(INTDIR)\rwlock.obj" \
@@ -1523,19 +1523,19 @@ SOURCE=..\lib\queue.cpp
 
 !ENDIF 
 
-SOURCE=..\lib\regex.cpp
+SOURCE=..\lib\bregex.cpp
 
 !IF  "$(CFG)" == "baculafd - Win32 Release"
 
 
-"$(INTDIR)\regex.obj" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\bregex.obj" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
 !ELSEIF  "$(CFG)" == "baculafd - Win32 Debug"
 
 
-"$(INTDIR)\regex.obj"   "$(INTDIR)\regex.sbr" : $(SOURCE) "$(INTDIR)"
+"$(INTDIR)\bregex.obj"   "$(INTDIR)\bregex.sbr" : $(SOURCE) "$(INTDIR)"
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
index 75387df27267cffa886a30f6045ccde79deafa69..94beae42f0ce0eb3d4ca5e6aa5b446865fadf0c8 100644 (file)
@@ -4,7 +4,7 @@
 // Copyright transferred from MATRIX-Computer GmbH to
 //   Kern Sibbald by express permission.
 //
-//  Copyright (C) 2005 Kern Sibbald
+//  Copyright (C) 2005-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
@@ -67,6 +67,8 @@ using namespace std;
 #ifdef B_VSS_XP
    #pragma message("compile VSS for Windows XP")   
    #define VSSClientGeneric VSSClientXP
+   // wait is not available under XP...
+   #define VSS_TIMEOUT
 
    #include "vss/inc/WinXP/vss.h"
    #include "vss/inc/WinXP/vswriter.h"
@@ -85,6 +87,9 @@ using namespace std;
 #ifdef B_VSS_W2K3
    #pragma message("compile VSS for Windows 2003")
    #define VSSClientGeneric VSSClient2003
+   // wait x ms for a VSS asynchronous operation (-1 = infinite)
+   // unfortunately, it doesn't work, so do not set timeout
+   #define VSS_TIMEOUT
 
    #include "vss/inc/Win2003/vss.h"
    #include "vss/inc/Win2003/vswriter.h"
@@ -277,8 +282,10 @@ BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore)
 
 void VSSClientGeneric::WaitAndCheckForAsyncOperation(IVssAsync* pAsync)
 {
-     // Wait until the async operation finishes
-    HRESULT hr = pAsync->Wait();
+    // Wait until the async operation finishes
+    // unfortunately we can't use a timeout here yet.
+    // the interface would allow it on W2k3, but it is not implemented yet....
+    HRESULT hr = pAsync->Wait(VSS_TIMEOUT);
 
     // Check the result of the asynchronous operation
     HRESULT hrReturned = S_OK;
index 4a117ec1f90b45f5067269d92a0748ba9e8710e2..7d0c98213b814e75b2754200d1c9681b8a3ab00b 100644 (file)
@@ -54,7 +54,6 @@ CLEAN :
         -@erase "$(INTDIR)\console_conf.obj"
         -@erase "$(INTDIR)\cram-md5.obj"
         -@erase "$(INTDIR)\crc32.obj"
-        -@erase "$(INTDIR)\crypto.obj"
         -@erase "$(INTDIR)\dlist.obj"
         -@erase "$(INTDIR)\edit.obj"
         -@erase "$(INTDIR)\getopt.obj"
@@ -107,7 +106,6 @@ LINK32_OBJS= \
         "$(INTDIR)\console_conf.obj" \
         "$(INTDIR)\cram-md5.obj" \
         "$(INTDIR)\crc32.obj" \
-        "$(INTDIR)\crypto.obj" \
         "$(INTDIR)\dlist.obj" \
         "$(INTDIR)\edit.obj" \
         "$(INTDIR)\getopt.obj" \
@@ -165,7 +163,6 @@ CLEAN :
         -@erase "$(INTDIR)\console_conf.obj"
         -@erase "$(INTDIR)\cram-md5.obj"
         -@erase "$(INTDIR)\crc32.obj"
-        -@erase "$(INTDIR)\crypto.obj"
         -@erase "$(INTDIR)\dlist.obj"
         -@erase "$(INTDIR)\edit.obj"
         -@erase "$(INTDIR)\getopt.obj"
@@ -219,7 +216,6 @@ LINK32_OBJS= \
         "$(INTDIR)\console_conf.obj" \
         "$(INTDIR)\cram-md5.obj" \
         "$(INTDIR)\crc32.obj" \
-        "$(INTDIR)\crypto.obj" \
         "$(INTDIR)\dlist.obj" \
         "$(INTDIR)\edit.obj" \
         "$(INTDIR)\getopt.obj" \
@@ -370,13 +366,6 @@ SOURCE=..\lib\crc32.cpp
         $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
-SOURCE=..\lib\crypto.cpp
-
-"$(INTDIR)\crypto.obj" : $(SOURCE) "$(INTDIR)"
-        $(CPP) $(CPP_PROJ) $(SOURCE)
-
-
-
 SOURCE=..\lib\dlist.cpp
 
 "$(INTDIR)\dlist.obj" : $(SOURCE) "$(INTDIR)"
diff --git a/bacula/src/win32/filed/chksum.cpp b/bacula/src/win32/filed/chksum.cpp
new file mode 100644 (file)
index 0000000..de3fd34
--- /dev/null
@@ -0,0 +1 @@
+#include "../../filed/chksum.c"
diff --git a/bacula/src/win32/lib/bregex.cpp b/bacula/src/win32/lib/bregex.cpp
new file mode 100644 (file)
index 0000000..5ae3914
--- /dev/null
@@ -0,0 +1 @@
+#include "../../lib/bregex.c"
diff --git a/bacula/src/win32/lib/crypto.cpp b/bacula/src/win32/lib/crypto.cpp
deleted file mode 100644 (file)
index 961ae75..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../lib/crypto.c"
diff --git a/bacula/src/win32/lib/regex.cpp b/bacula/src/win32/lib/regex.cpp
deleted file mode 100644 (file)
index 1bef229..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../lib/regex.c"
index fa0cca5b99a1fcb16468c1593a019c89307e0f25..075b4215d5cc88853e7990bd74bbcb8309300dee 100644 (file)
@@ -32,7 +32,7 @@ pebuilder:
        cp -f ../wx-console/Release/wx-console.exe bacula/files/
        cp -f ../../../../depkgs-win32/pthreads/pthreadVCE.dll bacula/files/
        cp -f c:/windows/system32/msvcr71.dll bacula/files
-       cp -f ../License.txt bacula/files/
+       cp -f ../../../LICENSE bacula/files/
 
 zip: pebuilder
        zip -r ../winbacula-bartpe-@VERSION@.zip bacula README
index 617e5b3e7520e4d961dfb1a00a2427eca23c27b0..af9ba879073eba6aac3247f12a08af2bbaa89085 100755 (executable)
@@ -49,7 +49,7 @@
 ; Pull in pages
 ;
  !insertmacro MUI_PAGE_WELCOME
-;  !insertmacro MUI_PAGE_LICENSE "License.txt"
+;  !insertmacro MUI_PAGE_LICENSE "..\..\LICENSE"
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
@@ -106,7 +106,8 @@ Section "Bacula File Service" SecService
   File baculafd\Release\bacula-fd.exe
   File c:\windows\system32\msvcr71.dll
   File ..\..\..\depkgs-win32\pthreads\pthreadVCE.dll
-  File License.txt
+  File ..\..\LICENSE
+  Delete /REBOOTOK "$INSTDIR\bin\License.txt"
   IfFileExists "$INSTDIR\bin\bacula-fd.conf" newconf 
   File baculafd\bacula-fd.conf
   goto do_service
index 9f044978aea680eac33de4922c84c9a8c6b6b5ad..f97c202452e1ba1bea771cc2498e2a351a96e61d 100644 (file)
@@ -13,7 +13,6 @@
 ..\lib\btime
 ..\lib\cram-md5
 ..\lib\crc32
-..\lib\crypto
 ..\lib\daemon
 ..\lib\dlist
 ..\lib\edit
index 863dd927c8b45f33a9dcddc4923cc512977db0b4..f5c116914e06c415adfb4132b75996ef1688e982 100644 (file)
@@ -55,7 +55,6 @@ CLEAN :
        -@erase "$(INTDIR)\btime.obj"
        -@erase "$(INTDIR)\cram-md5.obj"
        -@erase "$(INTDIR)\crc32.obj"
-       -@erase "$(INTDIR)\crypto.obj"
        -@erase "$(INTDIR)\daemon.obj"
        -@erase "$(INTDIR)\dlist.obj"
        -@erase "$(INTDIR)\edit.obj"
@@ -133,7 +132,6 @@ LINK32_OBJS= \
        "$(INTDIR)\btime.obj" \
        "$(INTDIR)\cram-md5.obj" \
        "$(INTDIR)\crc32.obj" \
-       "$(INTDIR)\crypto.obj" \
        "$(INTDIR)\daemon.obj" \
        "$(INTDIR)\dlist.obj" \
        "$(INTDIR)\edit.obj" \
@@ -227,8 +225,6 @@ CLEAN :
        -@erase "$(INTDIR)\cram-md5.sbr"
        -@erase "$(INTDIR)\crc32.obj
        -@erase "$(INTDIR)\crc32.sbr"
-       -@erase "$(INTDIR)\crypto.obj
-       -@erase "$(INTDIR)\crypto.sbr"
        -@erase "$(INTDIR)\daemon.obj
        -@erase "$(INTDIR)\daemon.sbr"
        -@erase "$(INTDIR)\dlist.obj
@@ -346,7 +342,6 @@ BSC32_SBRS= \
        "$(INTDIR)\btime.sbr" \
        "$(INTDIR)\cram-md5.sbr" \
        "$(INTDIR)\crc32.sbr" \
-       "$(INTDIR)\crypto.sbr" \
        "$(INTDIR)\daemon.sbr" \
        "$(INTDIR)\dlist.sbr" \
        "$(INTDIR)\edit.sbr" \
@@ -419,7 +414,6 @@ LINK32_OBJS= \
        "$(INTDIR)\btime.obj" \
        "$(INTDIR)\cram-md5.obj" \
        "$(INTDIR)\crc32.obj" \
-       "$(INTDIR)\crypto.obj" \
        "$(INTDIR)\daemon.obj" \
        "$(INTDIR)\dlist.obj" \
        "$(INTDIR)\edit.obj" \
@@ -803,25 +797,6 @@ SOURCE=..\lib\crc32.cpp
 !ENDIF 
 
 
-FILENAME=crypto
-SOURCE=..\lib\crypto.cpp
-!IF  "$(CFG)" == "wx-console - Win32 Release"
-
-
-"$(INTDIR)\$(FILENAME).obj" : $(SOURCE) "$(INTDIR)"
-       $(CPP) $(CPP_PROJ) $(SOURCE)
-
-
-!ELSEIF  "$(CFG)" == "wx-console - Win32 Debug"
-
-
-"$(INTDIR)\$(FILENAME).obj"    "$(INTDIR)\$(FILENAME).sbr" : $(SOURCE) "$(INTDIR)"
-       $(CPP) $(CPP_PROJ) $(SOURCE)
-
-
-!ENDIF 
-
-
 FILENAME=daemon
 SOURCE=..\lib\daemon.cpp
 !IF  "$(CFG)" == "wx-console - Win32 Release"
index 214887256da33496f0a7795edd564e6c962c98f9..293f49699c23077d6264dc8ef3c61009f284080d 100644 (file)
@@ -126,7 +126,7 @@ depend:
        @$(MV) Makefile Makefile.bak
        @$(SED) "/^# DO NOT DELETE:/,$$ d" Makefile.bak > Makefile
        @$(ECHO) "# DO NOT DELETE: nice dependency list follows" >> Makefile
-       @$(CXX) -S -M $(CPPFLAGS) $(CONS_CPPFLAGS) -I$(srcdir) -I$(basedir) $(CONSSRCS) >> Makefile
+       @$(CXX) -S -M $(CPPFLAGS) $(CONS_CPPFLAGS) -I$(srcdir) -I$(basedir) $(OPENSSL_INC) $(CONSSRCS) >> Makefile
        @if test -f Makefile ; then \
            $(RMF) Makefile.bak; \
        else \
index b6c05f7151c080624a8eb50cb8942f4de59df569..c13abcac29e18502686ddf3a481689dd393a1a64 100644 (file)
@@ -81,8 +81,8 @@ static RES_ITEM cons_items[] = {
    {"rcfile",      store_dir,      ITEM(res_cons.rc_file), 0, 0, 0},
    {"historyfile", store_dir,      ITEM(res_cons.hist_file), 0, 0, 0},
    {"password",    store_password, ITEM(res_cons.password), 0, ITEM_REQUIRED, 0},
-   {"tlsenable",      store_bit,     ITEM(res_cons.tls_enable), 1, 0, 0},
-   {"tlsrequire",     store_bit,     ITEM(res_cons.tls_require), 1, 0, 0},
+   {"tlsenable",      store_yesno,     ITEM(res_cons.tls_enable), 1, 0, 0},
+   {"tlsrequire",     store_yesno,     ITEM(res_cons.tls_require), 1, 0, 0},
    {"tlscacertificatefile", store_dir, ITEM(res_cons.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir", store_dir,  ITEM(res_cons.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate", store_dir,       ITEM(res_cons.tls_certfile), 0, 0, 0},
@@ -98,8 +98,8 @@ static RES_ITEM dir_items[] = {
    {"dirport",     store_int,      ITEM(res_dir.DIRport),  0, ITEM_DEFAULT, 9101},
    {"address",     store_str,      ITEM(res_dir.address),  0, 0, 0},
    {"password",    store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0},
-   {"tlsenable",      store_bit,     ITEM(res_dir.tls_enable), 1, 0, 0},
-   {"tlsrequire",     store_bit,     ITEM(res_dir.tls_require), 1, 0, 0},
+   {"tlsenable",      store_yesno,     ITEM(res_dir.tls_enable), 1, 0, 0},
+   {"tlsrequire",     store_yesno,     ITEM(res_dir.tls_require), 1, 0, 0},
    {"tlscacertificatefile", store_dir, ITEM(res_dir.tls_ca_certfile), 0, 0, 0},
    {"tlscacertificatedir", store_dir,  ITEM(res_dir.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate", store_dir,       ITEM(res_dir.tls_certfile), 0, 0, 0},
index fa1d3bf5f95f60a6b0a4de795986b4bd108fe88b..2c2411e18934ce54b1fe5ac69e8ef1c8d24f9976 100644 (file)
@@ -7,21 +7,18 @@
  *    Version $Id$
  */
 /*
-   Copyright (C) 2004 Kern Sibbald and John Walker
+   Copyright (C) 2004-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
-   as published by the Free Software Foundation; either version 2
-   of the License, or (at your option) any later version.
+   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
-   GNU General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
+   the file LICENSE for additional 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.
  */
 
 #ifndef CONSOLE_THREAD_H
index 66f93a7dd281184006df4b0cd937185c0f2d96c1..9de83b09438a589dba5252202a05198139fb6936 100644 (file)
@@ -271,7 +271,7 @@ AC_OUTPUT([    \
           autoconf/Make.common \
           Makefile \
           bimagemgr/Makefile \
-          bimagemgr/bacula-bimagemgr.spec \
+          bacula-gui.spec \
           $PFILES ],  
          [ ]
 )
diff --git a/gui/bacula-gui.spec.in b/gui/bacula-gui.spec.in
new file mode 100644 (file)
index 0000000..5b7a5e3
--- /dev/null
@@ -0,0 +1,214 @@
+# Bacula Web GUI RPM spec file
+# Copyright (C) 2004-2006 Kern Sibbald
+
+# Platform defines
+
+%define rhel 0
+%{?build_rhel:%define rhel 1}
+
+%define suse 0
+%{?build_suse:%define suse 1}
+
+%define mdk 0
+%{?build_mdk:%define mdk 1}
+
+# test for a platform definition
+%if ! %{rhel} && ! %{suse} && ! %{mdk}
+%{error: You must specify a platform. Please examine the spec file.}
+exit 1
+%endif
+
+# source package names
+%define web bacula-web
+%define bimagemgr bimagemgr
+
+# set destination directories
+%define cgidir /var/www/cgi-bin
+%define docdir /var/www/html
+%define sysconfdir /etc/bacula
+%if %{suse}
+%define cgidir /srv/www/cgi-bin
+%define docdir /srv/www/htdocs
+%endif
+
+# set ownership of files
+%define binowner root
+%define bingroup root
+%define dataowner apache
+%define datagroup apache
+%if %{suse}
+%define dataowner wwwrun
+%define datagroup www
+%endif
+
+Summary: Bacula - The Network Backup Solution
+Name: bacula-gui
+Version: @VERSION@
+Release: 1
+Group: System Environment/Daemons
+Copyright: GPL v2
+Source0: %{web}-%{version}.tar.gz
+Source1: %{bimagemgr}-%{version}.tar.gz
+Source2: bacula-docs-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-root
+URL: http://www.bacula.org/
+BuildArchitectures: noarch
+Vendor: The Bacula Team
+Distribution: The Bacula Team 
+Packager: D. Scott Barninger <barninger at fairfieldcomputers dot com>
+
+%description
+Bacula is a set of computer programs that permit you (or the system 
+administrator) to manage backup, recovery, and verification of computer 
+data across a network of computers of different kinds. bacula-gui is a 
+set of web server based tools used to manage backups.
+
+%package bimagemgr
+Summary: Bacula - The Network Backup Solution
+Group: System Environment/Daemons
+
+Requires: perl, perl-DBI, bacula-server, cdrecord, mkisofs
+%if %{mdk}
+Requires: apache
+%else
+Requires: httpd
+%endif
+
+Obsoletes: bacula-bimagemgr
+
+%description bimagemgr
+Bacula is a set of computer programs that permit you (or the system 
+administrator) to manage backup, recovery, and verification of computer 
+data across a network of computers of different kinds. bimagemgr is a 
+utility to manage backups made to files intended for burning to CDR 
+disk. bimagemgr allows you to easily see which Volumes have been written 
+to more recently than they have been recorded to CDR disk and record those 
+which have.
+
+%package web
+Summary: Bacula - The Network Backup Solution
+Group: System Environment/Daemons
+
+Requires: php >= 4, bacula-server
+%if %{mdk}
+Requires: apache
+%else
+Requires: httpd
+%endif
+
+%description web
+Bacula is a set of computer programs that permit you (or the system 
+administrator) to manage backup, recovery, and verification of computer 
+data across a network of computers of different kinds. bacula-web is a 
+web server based utility to monitor your bacula server.
+
+%prep
+
+# unpack both sources inside a directory with package name and version
+%setup -c %{name} -D -b 1
+%setup -c %{name} -T -D -b 2
+
+%build
+
+%install
+
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
+rm -rf docs
+
+mkdir -p $RPM_BUILD_ROOT%{cgidir}
+mkdir -p $RPM_BUILD_ROOT%{docdir}/%{web}
+mkdir -p $RPM_BUILD_ROOT%{sysconfdir}
+
+# install bimagemgr files
+cp -p %{bimagemgr}-%{version}/bimagemgr.pl $RPM_BUILD_ROOT%{cgidir}/
+cp -p %{bimagemgr}-%{version}/create_cdimage_table.pl $RPM_BUILD_ROOT%{sysconfdir}/
+cp -p %{bimagemgr}-%{version}/README $RPM_BUILD_ROOT%{sysconfdir}/README.bimagemgr
+cp -p %{bimagemgr}-%{version}/bimagemgr.gif $RPM_BUILD_ROOT%{docdir}/
+cp -p %{bimagemgr}-%{version}/cdrom_spins.gif $RPM_BUILD_ROOT%{docdir}/
+cp -p %{bimagemgr}-%{version}/clearpixel.gif $RPM_BUILD_ROOT%{docdir}/
+cp -p %{bimagemgr}-%{version}/temp.html $RPM_BUILD_ROOT%{docdir}/
+
+chmod 755 $RPM_BUILD_ROOT%{cgidir}/bimagemgr.pl
+chmod 750 $RPM_BUILD_ROOT%{sysconfdir}/create_cdimage_table.pl
+chmod 644 $RPM_BUILD_ROOT%{sysconfdir}/README.bimagemgr
+chmod 644 $RPM_BUILD_ROOT%{docdir}/*.gif
+chmod 664 $RPM_BUILD_ROOT%{docdir}/temp.html
+
+# install bacula-web files
+cp -p %{web}-%{version}/README $RPM_BUILD_ROOT%{sysconfdir}/README.bacula-web
+cp -r -p %{web}-%{version}/* $RPM_BUILD_ROOT%{docdir}/%{web}/
+
+chmod 644 $RPM_BUILD_ROOT%{sysconfdir}/README.bacula-web
+
+# remove the standard doc files from the install directory
+rm -f $RPM_BUILD_ROOT%{docdir}/%{web}/ChangeLog
+rm -f $RPM_BUILD_ROOT%{docdir}/%{web}/CONTACT
+rm -f $RPM_BUILD_ROOT%{docdir}/%{web}/COPYING
+rm -f $RPM_BUILD_ROOT%{docdir}/%{web}/README
+rm -f $RPM_BUILD_ROOT%{docdir}/%{web}/TODO
+
+# setup the docs dir
+mkdir -p docs/%{bimagemgr}
+mkdir docs/%{web}
+
+cp -p %{bimagemgr}-%{version}/README docs/%{bimagemgr}/
+
+cp -p %{web}-%{version}/README docs/%{web}/
+cp -p %{web}-%{version}/ChangeLog docs/%{web}/
+cp -p %{web}-%{version}/CONTACT docs/%{web}/
+cp -p %{web}-%{version}/COPYING docs/%{web}/
+cp -p bacula-docs-%{version}/%{web}/%{web}.pdf docs/%{web}/
+
+%clean
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
+rm -rf docs
+
+%files bimagemgr
+%defattr(-,root,root)
+%doc docs/%{bimagemgr}/*
+
+%defattr(-,%{binowner},%{bingroup})
+%{cgidir}/bimagemgr.pl
+%{sysconfdir}/create_cdimage_table.pl
+%{sysconfdir}/README.bimagemgr
+%{docdir}/bimagemgr.gif
+%{docdir}/cdrom_spins.gif
+%{docdir}/clearpixel.gif
+
+%defattr(-,%{dataowner},%{datagroup})
+%{docdir}/temp.html
+
+%files web
+%defattr(-,root,root)
+%doc docs/%{web}/*
+
+%defattr(-,%{binowner},%{bingroup})
+%{sysconfdir}/README.bacula-web
+
+%defattr(-,%{dataowner},%{datagroup})
+%{docdir}/%{web}/*.php
+%{docdir}/%{web}/*.po
+%{docdir}/%{web}/*.inc
+%config(noreplace) %{docdir}/%{web}/configs
+%{docdir}/%{web}/external_packages
+%{docdir}/%{web}/images
+%{docdir}/%{web}/js
+%{docdir}/%{web}/locale
+%{docdir}/%{web}/templates
+%{docdir}/%{web}/templates_c
+
+%changelog
+* Sun May 07 2006 D. Scott Barninger <barninger at fairfieldcomputers.com>
+- refine files section for web
+- add documentation
+* Sat May 06 2006 D. Scott Barninger <barninger at fairfieldcomputers.com>
+- was bimagemgr spec convert to bacula-gui spec. include bacula-web
+* Thu Dec 09 2004 D. Scott Barninger <barninger at fairfieldcomputers.com>
+- ASSIGNMENT OF COPYRIGHT
+- FOR VALUE RECEIVED, D. Scott Barninger hereby sells, transfers and 
+- assigns unto Kern Sibbald, his successors, assigns and personal representatives, 
+- all right, title and interest in and to the copyright in this software RPM
+- spec file. D. Scott Barninger warrants good title to said copyright, that it is 
+- free of all liens, encumbrances or any known claims against said copyright.
+* Sun Nov 14 2004 D. Scott Barninger <barninger at fairfieldcomputers.com>
+- initial spec file
index a8e449e5789e971ae1ccab76222569e925ec5a4d..faedd0f56c264fa6ca7b52a6e063897c79c2da2b 100644 (file)
@@ -1,5 +1,5 @@
 bimagemgr.pl
-14 Nov 2004
+06 May 2006
 
 This is a utility to monitor and burn file backups to CDR. It is a web
 based interface written in perl. It requires perl and an apache or other
@@ -45,10 +45,22 @@ Note: step 3 should also be done in /etc/init.d/bacula-sd but released versions
 of this file prior to 1.36 do not support it. In that case it would be necessary after 
 a reboot of the server to execute '/etc/bacula/bacula restart'.
 
-For bacula-1.36 installed from rpm -
+For bacula-1.38 installed from tarball -
+1. Your configure statement should include:
+       --with-dir-user=bacula
+        --with-dir-group=bacula
+        --with-sd-user=bacula
+        --with-sd-group=disk
+        --with-fd-user=root
+        --with-fd-group=bacula
+2. Add the user apache to the bacula group for Red Hat or Mandrake systems. 
+For SuSE systems add the user wwwrun to the bacula group.
+3. Check/change ownership of all of your Volume files to root.bacula
+
+For bacula-1.36 or bacula-1.38 installed from rpm -
 1. Add the user apache to the group bacula for Red Hat or Mandrake systems. 
 For SuSE systems add the user wwwrun to the bacula group.
-2. Change ownership of all of your Volume files to root.bacula
+2. Check/change ownership of all of your Volume files to root.bacula
 
 bimagemgr will now be able to read the Volume files but they are still not 
 world readable.
@@ -60,4 +72,5 @@ be taken if you are sure of the security of your environment as it exposes
 the backup Volume files to world read.
 
 That's it. Call the script from a web browser as http://server/cgi-bin/bimagemgr.pl
-place a blank cd in your recorder and press a Burn button.
+place a blank cd in your recorder and press a Burn button. See the bimagemgr section 
+in the bacula manual for more information.
diff --git a/gui/bimagemgr/bacula-bimagemgr.spec.in b/gui/bimagemgr/bacula-bimagemgr.spec.in
deleted file mode 100644 (file)
index e4cc92b..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-# Bacula Image Manager RPM spec file
-# Copyright (C) 2004 Kern Sibbald
-
-# Platform defines
-
-%define rhel 0
-%{?build_rhel:%define rhel 1}
-
-%define suse 0
-%{?build_suse:%define suse 1}
-
-%define mdk 0
-%{?build_mdk:%define mdk 1}
-
-# test for a platform definition
-%if ! %{rhel} && ! %{suse} && ! %{mdk}
-%{error: You must specify a platform. Please examine the spec file.}
-exit 1
-%endif
-
-# set destination directories
-%define cgidir /var/www/cgi-bin
-%define docdir /var/www/html
-%define sysconfdir /etc/bacula
-%if %{suse}
-%define cgidir /srv/www/cgi-bin
-%define docdir /srv/www/htdocs
-%endif
-
-# set ownership of files
-%define binowner root
-%define bingroup root
-%define dataowner apache
-%define datagroup apache
-%if %{suse}
-%define dataowner wwwrun
-%define datagroup www
-%endif
-
-Summary: Bacula - The Network Backup Solution
-Name: bacula
-Version: @VERSION@
-Release: 1
-Group: System Environment/Daemons
-Copyright: GPL v2
-Source: %{name}-%{version}.tar.gz
-BuildRoot: %{_tmppath}/%{name}-root
-URL: http://www.bacula.org/
-BuildArchitectures: noarch
-Vendor: The Bacula Team
-Distribution: The Bacula Team 
-Packager: D. Scott Barninger <barninger at fairfieldcomputers dot com>
-
-%description
-
-%package bimagemgr
-Summary: Bacula - The Network Backup Solution
-Group: System Environment/Daemons
-
-Requires: perl, perl-DBI, bacula-server, cdrecord, mkisofs
-%if %{mdk}
-Requires: apache
-%else
-Requires: httpd
-%endif
-
-%description bimagemgr
-Bacula is a set of computer programs that permit you (or the system 
-administrator) to manage backup, recovery, and verification of computer 
-data across a network of computers of different kinds. bimagemgr is a 
-utility to manage backups made to files intended for burning to CDR 
-disk. bimagemgr allows you to easily see which Volumes have been written 
-to more recently than they have been recorded to CDR disk and record those 
-which have.
-
-
-%prep
-
-%setup 
-
-%build
-
-%install
-
-[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
-
-mkdir -p $RPM_BUILD_ROOT/%{cgidir}
-mkdir -p $RPM_BUILD_ROOT/%{docdir}
-mkdir -p $RPM_BUILD_ROOT/%{sysconfdir}
-
-cp -p src/bimagemgr/bimagemgr.pl $RPM_BUILD_ROOT/%{cgidir}/
-cp -p src/bimagemgr/create_cdimage_table.pl $RPM_BUILD_ROOT/%{sysconfdir}/
-cp -p src/bimagemgr/README $RPM_BUILD_ROOT/%{sysconfdir}/README.bimagemgr
-cp -p src/bimagemgr/bimagemgr.gif $RPM_BUILD_ROOT/%{docdir}/
-cp -p src/bimagemgr/cdrom_spins.gif $RPM_BUILD_ROOT/%{docdir}/
-cp -p src/bimagemgr/clearpixel.gif $RPM_BUILD_ROOT/%{docdir}/
-cp -p src/bimagemgr/temp.html $RPM_BUILD_ROOT/%{docdir}/
-
-chmod 755 $RPM_BUILD_ROOT/%{cgidir}/bimagemgr.pl
-chmod 750 $RPM_BUILD_ROOT/%{sysconfdir}/create_cdimage_table.pl
-chmod 644 $RPM_BUILD_ROOT/%{sysconfdir}/README.bimagemgr
-chmod 644 $RPM_BUILD_ROOT/%{docdir}/*
-chmod 664 $RPM_BUILD_ROOT/%{docdir}/temp.html
-
-%clean
-[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
-
-%files bimagemgr
-%defattr(-,%{binowner},%{bingroup})
-%{cgidir}/bimagemgr.pl
-%{sysconfdir}/create_cdimage_table.pl
-%{sysconfdir}/README.bimagemgr
-%{docdir}/bimagemgr.gif
-%{docdir}/cdrom_spins.gif
-%{docdir}/clearpixel.gif
-
-%defattr(-,%{dataowner},%{datagroup})
-%{docdir}/temp.html
-
-%post bimagemgr
-
-%preun bimagemgr
-
-%changelog
-* Thu Dec 09 2004 D. Scott Barninger <barninger at fairfieldcomputers.com>
-- ASSIGNMENT OF COPYRIGHT
-- FOR VALUE RECEIVED, D. Scott Barninger hereby sells, transfers and 
-- assigns unto Kern Sibbald, his successors, assigns and personal representatives, 
-- all right, title and interest in and to the copyright in this software RPM
-- spec file. D. Scott Barninger warrants good title to said copyright, that it is 
-- free of all liens, encumbrances or any known claims against said copyright.
-* Sun Nov 14 2004 D. Scott Barninger <barninger at fairfieldcomputers.com>
-- initial spec file
index 1ddab913d82312ce6aa935060437692ecac6cf41..71ed96d5e30e5a0e8f0bc301a609efb06232788e 100755 (executable)
@@ -2428,7 +2428,7 @@ MCOMMON=./autoconf/Make.common
 
 
 
-                                                  ac_config_files="$ac_config_files autoconf/Make.common Makefile bimagemgr/Makefile bimagemgr/bacula-bimagemgr.spec $PFILES"
+                                                  ac_config_files="$ac_config_files autoconf/Make.common Makefile bimagemgr/Makefile bacula-gui.spec $PFILES"
           ac_config_commands="$ac_config_commands default"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -2987,7 +2987,7 @@ do
   "autoconf/Make.common" ) CONFIG_FILES="$CONFIG_FILES autoconf/Make.common" ;;
   "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
   "bimagemgr/Makefile" ) CONFIG_FILES="$CONFIG_FILES bimagemgr/Makefile" ;;
-  "bimagemgr/bacula-bimagemgr.spec" ) CONFIG_FILES="$CONFIG_FILES bimagemgr/bacula-bimagemgr.spec" ;;
+  "bacula-gui.spec" ) CONFIG_FILES="$CONFIG_FILES bacula-gui.spec" ;;
   "$PFILES" ) CONFIG_FILES="$CONFIG_FILES $PFILES" ;;
   "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
   *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
diff --git a/regress/.cvsignore b/regress/.cvsignore
deleted file mode 100644 (file)
index 90b65e5..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-config.out
-build
-bin
-test.out
-weird-files
-weird-files2
-diff
-tmp
-working
-Makefile
-test1.out
-time.out
diff --git a/regress/Makefile.in b/regress/Makefile.in
deleted file mode 100644 (file)
index b1fc696..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# Makefile for Bacula regression testing
-#
-#  Note, Makefile is built from Makefile.in, which you should not really 
-#    need to change, by envoking:
-#
-#  ./config <user's configuration>
-# e.g.
-#
-#  ./config kern.conf
-#
-#
-
-# suck in user's configuration
-@CONFIG@
-
-first_rule: all
-
-all:
-
-setup: bacula sed
-
-# 
-# Some machines cannot handle the sticky bit and other garbage that
-#  is in weird-files, so we load and run it only on Linux machines.
-#
-bacula: all
-       @rm -rf bin build weird-files tmp
-       (if test x`uname` = xLinux -o x`uname` = xFreeBSD ; then \
-          tar xfz weird-files.tar.gz ;\
-        fi)
-       rm -rf tmp working
-       mkdir tmp working
-       echo "Doing: scripts/setup ${BACULA_SOURCE} ${EMAIL} ${WHICHDB} ${TCPWRAPPERS} ${OPENSSL}"
-       scripts/setup ${BACULA_SOURCE} ${EMAIL} ${WHICHDB} ${TCPWRAPPERS} ${SMTP_HOST} ${OPENSSL}
-
-sed:
-       echo "Doing: scripts/do_sed ${EMAIL} ${TAPE_DRIVE} ${AUTOCHANGER} ${AUTOCHANGER_PATH} ${TAPE_DRIVE1} ${SMTP_HOST}"
-       scripts/do_sed ${EMAIL} ${TAPE_DRIVE} ${AUTOCHANGER} ${AUTOCHANGER_PATH} ${TAPE_DRIVE1} ${SMTP_HOST}
-
-# Run all non-root userid tests
-test: 
-       ./all-non-root-tests
-
-# run all file and tape tests
-full_test:
-       ./all-tape-and-file-tests
-
-# These tests require you to run as root
-root_test:
-       ./all-root-tests
-
-clean:
-       scripts/cleanup
-       rm -f /tmp/file-list
-       rm -f tmp/* working/*
-       rm -f test.out
-       rm -f diff
-       rm -f 1 2 3 scripts/1 scripts/2 scripts/3 tests/1 tests/2 tests/3
-       @find . -name .#* -exec $(RMF) {} \;
-
-# Reset our userid after running as root
-reset:
-       chown -R ${USER}:${USER} . tmp working
-       scripts/cleanup
-       rm -f /tmp/file-list tmp/file-list
-       rm -f tmp/* working/*
-
-distclean: clean
-       rm -rf bin build weird-files weird-files weird-files2 tmp working
-       rm -f scripts/*.conf
-                     
diff --git a/regress/README b/regress/README
deleted file mode 100644 (file)
index 5b96107..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-             Bacula Regression
-               Kern Sibbald
-
-This is Bacula's regression script directory.
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-Warning!!!! Make sure not to run it on the same system 
-with your production Catalog because the tables will all
-be cleared. You can run it on the your production system
-if you use a different database.
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
-To set it up, create your personal configuration file, by
-copying prototype.conf to xxx.conf or simply editing prototype.conf
-directly.
-
-Then edit your conf file and define appropriate values
-for the variables that are in that file.  If you want to see
-a real example, look at kern.conf, but please don't use my
-email address!
-
-Make sure that depkgs is pre-built if it isn't 
-already: (cd your-depkgs; make sqlite).
-Using the .conf file, you can now select between any Catalog type:
-SQLite, SQLite3, MySQL, or PostgreSQL.  Be aware, however, if you
-use an installed database on a production server, running these
-tests will delete all the tables !!!!!!!!!!!!!!!!!!  I run my
-tests on a non-production machine, and in addition, I normally use
-SQLite as the database, while my production uses MySQL.
-
-Then do:
-
-   ./config xxx.conf
-   make setup
-
-You run the above one time.  This will build a Makefile from
-Makefile.in and your xxx.conf file, copy the Bacula source,
-configure, build it, and configure all the Bacula scripts
-and conf files.  If you change your source, you will need to
-redo this command.
-
-Then you can run any of the tests in the tests subdirectory.
-Each test whose name ends in -root requires you to be root for
-a resonable run.  Each test is totally independent of any other
-test. Aside from the required "make setup", each test is totally
-self-initalizing and should clean up after itself.
-
-The tests expect you to execute them from the main regress 
-directory!               
-
-You can run all the disk based tests by doing:
-
-  ./do_file
-
-You can run all the disk and most of the tape tests by doing:
-
-  ./do_all
-
-Each of the above calls one or more scripts. By looking at the
-scripts available in this directory, you can see that there are a number
-of options for running tests.
-
-You can run them individually as:
-
-   tests/two-jobs-test
-
-or all non-root tests (my normal testing under my account)
-
-  ./all-non-root-tests
-
-or all tests (I only run these before a production release):
-
-   su
-   ./all-tests
-
-
-after running the root tests, while still root, it is a good idea
-to do:
-
-   make reset
-
-this cleans up any files that may be created with root permissions.
-
-If you want to add more tests, do so by putting the shell script 
-in the tests subdirectory. Be careful when adding (or better not)
-new clients, pools, and such to the test-bacula-dir.conf.in file
-as it may invalidate a good number of tests, which respond to
-questions by answering with a number (i.e. the order of the selection
-list is known). It might be better to add your own testb-bacula...
-configuration file.  
-
-To avoid re-doing a make setup if you have made a change to the
-conf files, and you do not need a new copy of the source, you can simply do:
-
-   make sed
-
-Debugging failed tests:
-The simplest thing to do is to edit tests/xxxx where xxxx is the name of
-the test, and change the line "debug=0" to "debug=1".  If the test has
-not been updated to have the debug variable, please notify Kern, and I
-will be happy to fix it -- I am upgrading them one at a time.
-
-Also, if you run from time to time on a computer that is not connected
-to the network, please be sure that "hostname" is set to "localhost",
-otherwise, your tests may fail because the hostname used by Bacula's
-./configure cannot be properly resolved.
diff --git a/regress/all-non-root-2tape-tests b/regress/all-non-root-2tape-tests
deleted file mode 100755 (executable)
index 5201731..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-#
-# Run all tape tests
-#
-tests/test0
-tests/two-volume-tape
-tests/incremental-2tape
-echo " "
-echo " "
-echo "2 Tape Test results"
-cat test.out
-scripts/cleanup
diff --git a/regress/all-non-root-tape-tests b/regress/all-non-root-tape-tests
deleted file mode 100755 (executable)
index 7987031..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-#
-# Run all tape tests
-#
-. config.out
-if test ! x$AUTOCHANGER = x/dev/null ; then
-   mtx -f $AUTOCHANGER load 1 >/dev/null &2>/dev/null
-fi
-cp test.out test1.out
-tests/test0
-tests/backup-bacula-tape
-tests/bscan-tape
-tests/btape-fill-tape
-tests/fixed-block-size-tape
-tests/four-concurrent-jobs-tape
-tests/four-jobs-tape
-tests/incremental-tape
-tests/relabel-tape
-tests/restore-by-file-tape
-tests/small-file-size-tape
-tests/truncate-bug-tape
-tests/two-pool-tape
-tests/2drive-incremental-2tape
-echo " "
-echo " "
-echo "Test results"
-cat test.out
-scripts/cleanup
diff --git a/regress/all-non-root-tests b/regress/all-non-root-tests
deleted file mode 100755 (executable)
index 1438441..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-#
-# Run all tests
-#
-tests/test0
-echo " "
-tests/auto-label-test
-tests/backup-bacula-test
-tests/bextract-test
-tests/bscan-test
-tests/bsr-opt-test
-tests/compressed-test
-tests/concurrent-jobs-test
-tests/differential-test
-tests/four-concurrent-jobs-test
-tests/four-jobs-test
-tests/incremental-test
-tests/query-test
-tests/recycle-test
-tests/restore2-by-file-test
-tests/restore-by-file-test
-tests/restore-disk-seek-test
-tests/six-vol-test
-tests/span-vol-test
-tests/sparse-compressed-test
-tests/sparse-test
-tests/two-jobs-test
-tests/two-vol-test
-tests/verify-vol-test
-tests/weird-files2-test
-tests/weird-files-test
-# 
-# The following are Virtual Disk Autochanger tests
-tests/two-pool-test
-tests/two-volume-test
-tests/incremental-2disk
-tests/2drive-incremental-2disk
-tests/scratch-pool-test
-echo " "
-echo "Test results"
-cat test.out
-scripts/cleanup
diff --git a/regress/all-root-tests b/regress/all-root-tests
deleted file mode 100755 (executable)
index 3f077bb..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# Run all root tests
-#
-rm -f test.out
-tests/dev-test-root
-tests/etc-test-root
-tests/lib-test-root
-tests/usr-tape-root
-cat test.out
-scripts/cleanup
diff --git a/regress/all-tape-and-file-tests b/regress/all-tape-and-file-tests
deleted file mode 100755 (executable)
index f3e7269..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-#
-# Run all tests
-#
-./all-non-root-tests
-./endtime
-./all-non-root-tape-tests
diff --git a/regress/all-tests b/regress/all-tests
deleted file mode 100755 (executable)
index b1b2b35..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-#
-# Run all tests
-#
-./all-non-root-tests
-./all-root-tests
-cat test.out
-scripts/cleanup
diff --git a/regress/config b/regress/config
deleted file mode 100755 (executable)
index 4bc4f52..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#/bin/sh
-#
-# First argument is expected to be a user's configuration file
-#
-if ! test -e $1 ; then
-   echo "Arg1 must specify a config file (e.g. prototype.conf)"
-   exit 1
-fi
-sed -e "/@CONFIG@/r $1" -e "s/@CONFIG@//" Makefile.in >Makefile
diff --git a/regress/do_all b/regress/do_all
deleted file mode 100755 (executable)
index cc89df2..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-/home/kern/bacula/bin/startmysql
-make setup
-./starttime
-if [ ! -e bin/tape_options ] ; then
-  touch bin/tape_options
-fi
-./all-tape-and-file-tests
-./endtime
-./all-non-root-2tape-tests
-./endtime
diff --git a/regress/do_all_tapes b/regress/do_all_tapes
deleted file mode 100755 (executable)
index dd07d2e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-make setup
-./all-non-root-tape-tests
diff --git a/regress/do_file b/regress/do_file
deleted file mode 100755 (executable)
index 5fe0a82..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-#  /home/kern/bacula/bin/startmysql
-make setup
-./starttime
-./all-non-root-tests
-./endtime
diff --git a/regress/endtime b/regress/endtime
deleted file mode 100755 (executable)
index faf419f..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/python
-from time import time as now 
-t = now()
-fn = open('time.out', 'r')
-s = fn.readline()     
-fn.close()
-diff = t - float(s)
-h = int(diff / 3600)
-m = int((diff - h * 3600) / 60)
-sec = diff - h * 3600 - m * 60
-print 'Total time = %d:%02d:%02d or %d secs' % (h, m, sec, t - float(s))
diff --git a/regress/file b/regress/file
deleted file mode 100755 (executable)
index 8f20890..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-./all-non-root-tests
diff --git a/regress/freebsd.conf b/regress/freebsd.conf
deleted file mode 100644 (file)
index 823eb9c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-# Where to get the source to be tested
-# BACULA_SOURCE="${HOME}/bacula/branch-1.36.2"
-BACULA_SOURCE="${HOME}/bacula/k"
-
-# Where to send email   !!!!! Change me !!!!!!!
-EMAIL=kern@sibbald.com
-SMTP_HOST="matou.sibbald.com"
-
-# Full "default" path where to find sqlite (no quotes!)
-SQLITE_DIR=${HOME}/bacula/depkgs/sqlite
-
-TAPE_DRIVE="/dev/nsa0"
-# if you don't have an autochanger set AUTOCHANGER to /dev/null
-AUTOCHANGER="/dev/sg0"
-# For two drive tests -- set to /dev/null if you do not have it
-TAPE_DRIVE1="/dev/null"
-
-# This must be the path to the autochanger including its name
-AUTOCHANGER_PATH="/usr/local/sbin/mtx"
-
-# Set your database here
-WHICHDB?="--with-sqlite=${SQLITE_DIR}"
-#WHICHDB="--with-mysql=${HOME}/mysql"
-
-# Set this to "--with-tcp-wrappers" or "--without-tcp-wrappers"
-TCPWRAPPERS="--with-tcp-wrappers"
-
-# Set this to "" to disable OpenSSL support, "--with-openssl=yes"
-# to enable it, or provide the path to the OpenSSL installation,
-# eg "--with-openssl=/usr/local"
-OPENSSL=""
diff --git a/regress/kern.conf b/regress/kern.conf
deleted file mode 100644 (file)
index 2499dea..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-# Where to get the source to be tested
-# BACULA_SOURCE="${HOME}/bacula/branch-1.38"
-BACULA_SOURCE="${HOME}/bacula/k"
-
-# Where to send email   !!!!! Change me !!!!!!!
-EMAIL=kern@sibbald.com
-SMTP_HOST="localhost"
-
-# Full "default" path where to find sqlite (no quotes!)
-#SQLITE_DIR=${HOME}/bacula/depkgs/sqlite3
-SQLITE_DIR=${HOME}/bacula/depkgs/sqlite
-
-TAPE_DRIVE="/dev/nst0"
-# if you don't have an autochanger set AUTOCHANGER to /dev/null
-AUTOCHANGER="/dev/sg3"
-# For two drive tests -- set to /dev/null if you do not have it 
-TAPE_DRIVE1="/dev/nst1"
-
-# This must be the path to the autochanger including its name
-AUTOCHANGER_PATH="/usr/sbin/mtx"
-
-# Set your database here
-WHICHDB?="--with-sqlite=${SQLITE_DIR}"
-#WHICHDB="--with-mysql=${HOME}/mysql"
-#WHICHDB="--with-postgresql"
-
-# Set this to "--with-tcp-wrappers" or "--without-tcp-wrappers"
-TCPWRAPPERS="--with-tcp-wrappers"
-
-# Set this to "" to disable OpenSSL support, "--with-openssl=yes"
-# to enable it, or provide the path to the OpenSSL installation,
-# eg "--with-openssl=/usr/local"
-OPENSSL=""
diff --git a/regress/misc-tests b/regress/misc-tests
deleted file mode 100644 (file)
index dd2734c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-tests/btape-fill-full-tape
-tests/eot-fail-tape
diff --git a/regress/prototype.conf b/regress/prototype.conf
deleted file mode 100644 (file)
index 2106878..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# Prototype personal configuration file for the regression 
-#  scripts.  Either edit this file directly, or better copy
-#  it elsewhere so it won't get overwritten.          
-#
-
-#
-# Where to get the source to be tested
-#
-BACULA_SOURCE=
-
-# Where to send email messages
-#
-EMAIL=
-SMTP_HOST=localhost
-
-# Full "default" path where to find sqlite. 
-# This is only used if you do not specify a database override on the
-# make command.  
-#
-#    N.B. DON'T PUT QOUTES AROUND THE PATH.
-#
-SQLITE_DIR=${HOME}/bacula/depkgs/sqlite
-
-#
-# The device name of your tape drive if you have one
-#
-TAPE_DRIVE=/dev/nst0
-TAPE_DRIVE1=/dev/null
-
-#
-# if you don't have an autochanger set AUTOCHANGER to /dev/null
-#
-AUTOCHANGER=/dev/sg0
-
-#
-# This must be the path to the autochanger including its name
-#
-AUTOCHANGER_PATH=/bin/mtx
-
-# Set your database here
-WHICHDB?="--with-sqlite=${SQLITE_DIR}"
-#WHICHDB="--with-mysql=${HOME}/mysql"
-
-# Set this to "--with-tcp-wrappers" or "--without-tcp-wrappers"
-TCPWRAPPERS="--with-tcp-wrappers"
-
-# Set this to "" to disable OpenSSL support, "--with-openssl=yes"
-# to enable it, or provide the path to the OpenSSL installation,
-# eg "--with-openssl=/usr/local"
-OPENSSL=""
diff --git a/regress/run b/regress/run
deleted file mode 100755 (executable)
index d48e262..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-bin/bacula start
-bin/bconsole -c bin/bconsole.conf
diff --git a/regress/scripts/.cvsignore b/regress/scripts/.cvsignore
deleted file mode 100644 (file)
index 640b3a1..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-crypto-bacula-fd.conf
-new-test-bacula-dir.conf
-bacula-dir.conf
-bacula-fd.conf
-bacula-sd.conf
-console.conf
-bconsole.conf
-test-bacula-dir.conf
-test-bacula-fd.conf
-test-bacula-sd.conf
-test-console.conf
-testa-bacula-dir.conf
-bacula-dir-tape.conf
-bacula-sd-tape.conf
-bacula-sd-2tape.conf
-cleanup-tape
-cleanup-2tape
-prepare-two-tapes
-cleanup-2drive
-bacula-sd-2drive.conf
-bacula-sd-win32-tape.conf
-bacula-sd-2drive.conf
-bacula-dir-win32-tape.conf
-win32-bacula-dir-tape.conf
diff --git a/regress/scripts/bacula-dir-tape.conf.in b/regress/scripts/bacula-dir-tape.conf.in
deleted file mode 100644 (file)
index dc24753..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-#
-# Default Bacula Director Configuration file
-#
-#  The only thing that MUST be changed is to add one or more
-#   file or directory names in the Include directive of the
-#   FileSet resource.
-#
-#  For Bacula release 1.33
-#
-#  You might also want to change the default email address
-#   from root to your address.  See the "mail" and "operator"
-#   directives in the Messages resource.
-#
-
-Director {                            # define myself
-  Name = @hostname@-dir
-  DIRport = 8101                # where we listen for UA connections
-  QueryFile = "@scriptdir@/query.sql"
-  WorkingDirectory = "@working_dir@"
-  PidDirectory = "@piddir@"
-  Maximum Concurrent Jobs = 4
-  Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3"
-  Messages = Daemon
-}
-
-#
-# Define the main nightly save backup job
-#   By default, this job will back up to disk in /tmp
-Job {
-  Name = "NightlySave"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = DDS-4
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-  Maximum Concurrent Jobs = 4
-  SpoolData = yes
-# Prefer Mounted Volumes = no
-}
-
-Job {
-  Name = "NightlySave1"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = DDS-4
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-  Maximum Concurrent Jobs = 4
-  SpoolData = yes
-# Prefer Mounted Volumes = no
-  Client Run Before Job = "/bin/sleep 120"
-}
-
-Job {
-  Name = "NightlySave2"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = DDS-4
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-  Maximum Concurrent Jobs = 4
-  SpoolData = yes
-# Prefer Mounted Volumes = no
-}
-
-
-# Standard Restore template, to be changed by Console program
-Job {
-  Name = "RestoreFiles"
-  Type = Restore
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = DDS-4
-  Messages = Standard
-  Pool = Default
-  Where = /tmp/bacula-restores
-}
-
-
-# List of files to be backed up
-FileSet {
-  Name = "Full Set"
-  Include { Options { signature=MD5 }
-    File =  </tmp/file-list
-  }
-}
-
-
-#
-# When to do the backups, full backup on first sunday of the month,
-#  differential (i.e. incremental since full) every other sunday,
-#  and incremental backups other days
-Schedule {
-  Name = "WeeklyCycle"
-  Run = Full 1st sun at 1:05
-  Run = Differential 2nd-5th sun at 1:05
-  Run = Incremental mon-sat at 1:05
-}
-
-# Client (File Services) to backup
-Client {
-  Name = @hostname@-fd
-  Address = @hostname@
-  FDPort = 8102
-  Catalog = MyCatalog
-  Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc"          # password for FileDaemon
-  File Retention = 30d                # 30 days
-  Job Retention = 180d                # six months
-  AutoPrune = yes                     # Prune expired Jobs/Files
-  Maximum Concurrent Jobs = 4
-}
-
-# Definition of DDS tape storage device
-Storage {
-  Name = DDS-4
-  Address = @hostname@                # N.B. Use a fully qualified name here
-  SDPort = 8103
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"          # password for Storage daemon
-  Device = DDS-4                      # must be same as Device in Storage daemon
-  Media Type = DDS-4                  # must be same as MediaType in Storage daemon
-  Maximum Concurrent Jobs = 4
-# Autochanger = yes
-}
-
-
-# Generic catalog service
-Catalog {
-  Name = MyCatalog
-  dbname = bacula; user = bacula; password = ""
-}
-
-# Reasonable message delivery -- send most everything to email address
-#  and to the console
-Messages {
-  Name = Standard
-  mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
-  operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: Intervention needed for %j\" %r"
-  MailOnError = @job_email@ = all, !terminate
-  operator = @job_email@ = mount
-  console = all, !skipped, !terminate, !restored
-#
-# WARNING! the following will create a file that you must cycle from
-#          time to time as it will grow indefinitely. However, it will
-#          also keep all your messages if the scroll off the console.
-#
-  append = "@working_dir@/log" = all, !skipped
-}
-
-#
-# Message delivery for daemon messages (no job).
-Messages {
-  Name = Daemon
-  mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula\) %r\" -s \"Bacula daemon message\" %r"
-  mail = @job_email@ = all, !skipped            
-  console = all, !skipped, !saved
-  append = "@working_dir@/log" = all, !skipped
-}
-
-    
-# Default pool definition
-Pool {
-  Name = Default
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-}
-
-Pool {
-  Name = Full
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-}
-
-Pool {
-  Name = Inc
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-}
-
-Pool {
-  Name = Scratch
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-}
-
diff --git a/regress/scripts/bacula-dir-win32-tape.conf.in b/regress/scripts/bacula-dir-win32-tape.conf.in
deleted file mode 100644 (file)
index 919edc4..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-#
-# Default Bacula Director Configuration file
-#
-#  The only thing that MUST be changed is to add one or more
-#   file or directory names in the Include directive of the
-#   FileSet resource.
-#
-#  For Bacula release 1.33
-#
-#  You might also want to change the default email address
-#   from root to your address.  See the "mail" and "operator"
-#   directives in the Messages resource.
-#
-
-Director {                            # define myself
-  Name = @hostname@-dir
-  DIRport = 8101                # where we listen for UA connections
-  QueryFile = "@scriptdir@/query.sql"
-  WorkingDirectory = "@working_dir@"
-  PidDirectory = "@piddir@"
-  Maximum Concurrent Jobs = 4
-  Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3"
-  Messages = Daemon
-}
-
-#
-# Define the main nightly save backup job
-#   By default, this job will back up to disk in /tmp
-Job {
-  Name = "NightlySave"
-  Type = Backup
-  Client=Tibs
-  FileSet="Full Set"
-  Storage = DDS-4
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-  Maximum Concurrent Jobs = 4
-  SpoolData = yes
-}
-
-
-# Standard Restore template, to be changed by Console program
-Job {
-  Name = "RestoreFiles"
-  Type = Restore
-  Client=Tibs
-  FileSet="Full Set"
-  Storage = DDS-4
-  Messages = Standard
-  Pool = Default
-  Where = /tmp/bacula-restores
-}
-
-
-# List of files to be backed up
-FileSet {
-  Name = "Full Set"
-  Enable VSS = yes
-  Include { Options { signature=MD5 }
-    File =  "c:"
-  }
-}
-
-
-#
-# When to do the backups, full backup on first sunday of the month,
-#  differential (i.e. incremental since full) every other sunday,
-#  and incremental backups other days
-Schedule {
-  Name = "WeeklyCycle"
-  Run = Full 1st sun at 1:05
-  Run = Differential 2nd-5th sun at 1:05
-  Run = Incremental mon-sat at 1:05
-}
-
-# Client (File Services) to backup
-Client {
-  Name = Tibs
-  Address = tibs
-  FDPort = 9102
-  Catalog = MyCatalog
-  Password = "xBzFq+a9llZyGyfMaNO9e3outP86/1AUAT8P34RoT62G"
-  File Retention = 30d                # 30 days
-  Job Retention = 180d                # six months
-  AutoPrune = yes                     # Prune expired Jobs/Files
-  Maximum Concurrent Jobs = 4
-}
-
-# Definition of DDS tape storage device
-Storage {
-  Name = DDS-4
-  Address = 192.168.68.112            # N.B. Use a fully qualified name here
-  SDPort = 8103
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"          # password for Storage daemon
-  Device = DDS-4                      # must be same as Device in Storage daemon
-  Media Type = DDS-4                  # must be same as MediaType in Storage daemon
-  AutoChanger = yes
-  Maximum Concurrent Jobs = 4
-}
-
-
-# Generic catalog service
-Catalog {
-  Name = MyCatalog
-  dbname = bacula; user = bacula; password = ""
-}
-
-# Reasonable message delivery -- send most everything to email address
-#  and to the console
-Messages {
-  Name = Standard
-  mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
-  operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: Intervention needed for %j\" %r"
-  MailOnError = @job_email@ = all, !terminate
-  operator = @job_email@ = mount
-  console = all, !skipped, !terminate, !restored
-#
-# WARNING! the following will create a file that you must cycle from
-#          time to time as it will grow indefinitely. However, it will
-#          also keep all your messages if the scroll off the console.
-#
-  append = "@working_dir@/log" = all, !skipped
-}
-
-#
-# Message delivery for daemon messages (no job).
-Messages {
-  Name = Daemon
-  mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula\) %r\" -s \"Bacula daemon message\" %r"
-  mail = @job_email@ = all, !skipped            
-  console = all, !skipped, !saved
-  append = "@working_dir@/log" = all, !skipped
-}
-
-    
-# Default pool definition
-Pool {
-  Name = Default
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-  Accept Any Volume = yes             # write on any volume in the pool
-}
diff --git a/regress/scripts/bacula-sd-2disk-drive.conf b/regress/scripts/bacula-sd-2disk-drive.conf
deleted file mode 100644 (file)
index 1d56020..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.39
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = localhost-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "/home/kern/bacula/regress/working"
-  Pid Directory = "/home/kern/bacula/regress/working"
-  Subsys Directory = "/home/kern/bacula/regress/working"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = localhost-dir
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-Autochanger {
-  Name = DDS-4
-  Changer Device = /home/kern/bacula/regress/tmp/disk-changer/conf
-  Changer Command ="/home/kern/bacula/regress/bin/disk-changer %c %o %S %a %d"
-  Device = Drive-0, Drive-1
-}
-
-Device {
-  Name = Drive-0
-  Device Type = File
-  Media Type = DDS-4
-  Archive Device = /home/kern/bacula/regress/tmp/disk-changer/drive0
-  AutomaticMount = yes;               # when device opened, read it
-  Autochanger = yes
-  Drive Index = 0
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-# Maximum File Size = 1000000
-}
-
-Device {
-  Name = Drive-1
-  Device Type = File
-  Media Type = DDS-4
-  Archive Device = /home/kern/bacula/regress/tmp/disk-changer/drive1
-  AutomaticMount = yes;               # when device opened, read it
-  Autochanger = yes
-  Drive Index = 1
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-# Maximum File Size = 1000000
-}
-
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = localhost-dir = all, !terminate
-}
diff --git a/regress/scripts/bacula-sd-2disk-drive.conf.in b/regress/scripts/bacula-sd-2disk-drive.conf.in
deleted file mode 100644 (file)
index 6f6acce..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.39
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = @hostname@-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "@working_dir@"
-  Pid Directory = "@piddir@"
-  Subsys Directory = "@subsysdir@"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = @hostname@-dir
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-Autochanger {
-  Name = DDS-4
-  Changer Device = @disk_drive@/conf
-  Changer Command ="@scriptdir@/disk-changer %c %o %S %a %d"
-  Device = Drive-0, Drive-1
-}
-
-Device {
-  Name = Drive-0
-  Device Type = File
-  Media Type = DDS-4
-  Archive Device = @disk_drive@/drive0
-  AutomaticMount = yes;               # when device opened, read it
-  Autochanger = yes
-  Drive Index = 0
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-# Maximum File Size = 1000000
-}
-
-Device {
-  Name = Drive-1
-  Device Type = File
-  Media Type = DDS-4
-  Archive Device = @disk_drive@/drive1
-  AutomaticMount = yes;               # when device opened, read it
-  Autochanger = yes
-  Drive Index = 1
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-# Maximum File Size = 1000000
-}
-
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = @hostname@-dir = all, !terminate
-}
diff --git a/regress/scripts/bacula-sd-2disk.conf b/regress/scripts/bacula-sd-2disk.conf
deleted file mode 100644 (file)
index 154d3d3..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.39
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = localhost-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "/home/kern/bacula/regress/working"
-  Pid Directory = "/home/kern/bacula/regress/working"
-  Subsys Directory = "/home/kern/bacula/regress/working"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = localhost-dir
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-Autochanger {
-  Name = DDS-4
-  Changer Device = /home/kern/bacula/regress/tmp/disk-changer/conf
-  Changer Command ="/home/kern/bacula/regress/bin/disk-changer %c %o %S %a %d"
-  Device = Drive-0
-}
-
-Device {
-  Name = Drive-0                   # 
-  Device Type = File
-  Media Type = DDS-4
-  Archive Device = /home/kern/bacula/regress/tmp/disk-changer/drive0
-  AutomaticMount = yes;               # when device opened, read it
-  Autochanger = yes
-  Drive Index = 0
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-# Maximum File Size = 1000000
-}
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = localhost-dir = all, !terminate
-}
diff --git a/regress/scripts/bacula-sd-2disk.conf.in b/regress/scripts/bacula-sd-2disk.conf.in
deleted file mode 100644 (file)
index 313dfe4..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.39
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = @hostname@-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "@working_dir@"
-  Pid Directory = "@piddir@"
-  Subsys Directory = "@subsysdir@"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = @hostname@-dir
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-Autochanger {
-  Name = DDS-4
-  Changer Device = @disk_drive@/conf
-  Changer Command ="@scriptdir@/disk-changer %c %o %S %a %d"
-  Device = Drive-0
-}
-
-Device {
-  Name = Drive-0                   # 
-  Device Type = File
-  Media Type = DDS-4
-  Archive Device = @disk_drive@/drive0
-  AutomaticMount = yes;               # when device opened, read it
-  Autochanger = yes
-  Drive Index = 0
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-# Maximum File Size = 1000000
-}
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = @hostname@-dir = all, !terminate
-}
diff --git a/regress/scripts/bacula-sd-2drive.conf.in b/regress/scripts/bacula-sd-2drive.conf.in
deleted file mode 100644 (file)
index cf3d543..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.33
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = @hostname@-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "@working_dir@"
-  Pid Directory = "@piddir@"
-  Subsys Directory = "@subsysdir@"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = @hostname@-dir
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-Autochanger {
-  Name = DDS-4
-  Changer Device = @autochanger@
-  Changer Command ="@scriptdir@/mtx-changer %c %o %S %a %d"
-  Device = Drive-0, Drive-1
-}
-
-Device {
-  Name = Drive-0
-  Media Type = DDS-4
-  Archive Device = @tape_drive@
-  AutomaticMount = yes;               # when device opened, read it
-  Autochanger = yes
-  Drive Index = 0
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-  @@sbindir@/tape_options
-# Maximum File Size = 1000000
-}
-
-Device {
-  Name = Drive-1
-  Media Type = DDS-4
-  Archive Device = @tape_drive1@
-  AutomaticMount = yes;               # when device opened, read it
-  Autochanger = yes
-  Drive Index = 1
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-  @@sbindir@/tape_options
-# Maximum File Size = 1000000
-}
-
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = @hostname@-dir = all, !terminate
-}
diff --git a/regress/scripts/bacula-sd-2tape.conf.in b/regress/scripts/bacula-sd-2tape.conf.in
deleted file mode 100644 (file)
index 84e4c91..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.33
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = @hostname@-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "@working_dir@"
-  Pid Directory = "@piddir@"
-  Subsys Directory = "@subsysdir@"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = @hostname@-dir
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-Autochanger {
-  Name = DDS-4
-  Changer Device = @autochanger@
-  Changer Command ="@scriptdir@/mtx-changer %c %o %S %a %d"
-  Device = Drive-0
-}
-
-Device {
-  Name = Drive-0                   # 
-  Media Type = DDS-4
-  Archive Device = @tape_drive@
-  AutomaticMount = yes;               # when device opened, read it
-  Autochanger = yes
-  Drive Index = 0
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-  @@sbindir@/tape_options
-# Maximum File Size = 1000000
-}
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = @hostname@-dir = all, !terminate
-}
diff --git a/regress/scripts/bacula-sd-tape.conf.in b/regress/scripts/bacula-sd-tape.conf.in
deleted file mode 100644 (file)
index 62023f2..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.33
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = @hostname@-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "@working_dir@"
-  Pid Directory = "@piddir@"
-  Subsys Directory = "@subsysdir@"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = @hostname@-dir
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-
-Device {
-  Name = DDS-4                     # 
-  Media Type = DDS-4
-  Archive Device = @tape_drive@
-  AutomaticMount = yes;               # when device opened, read it
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-  @@sbindir@/tape_options
-# Maximum File Size = 1000000
-# MaximumVolumeSize = 100M
-}
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = @hostname@-dir = all, !terminate
-}
diff --git a/regress/scripts/bacula-sd.conf.in b/regress/scripts/bacula-sd.conf.in
deleted file mode 100644 (file)
index c035ea9..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.33
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = rufus-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "/home/kern/bacula/regress/working"
-  Pid Directory = "/home/kern/bacula/regress/working"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = rufus-dir
-  Password = "BzlEl8haeFmnv/Lv8V6zDzUBgFFQNsUtny6VkmccQpOy"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-
-Device {
-  Name = FileStorage
-  Media Type = File
-  Archive Device = @tmpdir@
-  LabelMedia = yes;                   # lets Bacula label unlabeled media
-  Random Access = Yes;
-  AutomaticMount = yes;               # when device opened, read it
-  RemovableMedia = no;
-  AlwaysOpen = no;
-}
-
-#Device {
-#  Name = DDS-4                        # 
-#  Media Type = DDS-4
-#  Archive Device = /dev/nst0
-#  AutomaticMount = yes;               # when device opened, read it
-#  AlwaysOpen = yes;
-#  RemovableMedia = yes;
-#}
-
-#
-# A very old Exabyte with no end of media detection
-#
-#Device {
-#  Name = "Exabyte 8mm"
-#  Media Type = "8mm"
-#  Archive Device = /dev/nst0
-#  Hardware end of medium = No;
-#  AutomaticMount = yes;               # when device opened, read it
-#  AlwaysOpen = Yes;
-#  RemovableMedia = yes;
-#}
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = rufus-dir = all, !terminate
-}
diff --git a/regress/scripts/check_for_zombie_jobs b/regress/scripts/check_for_zombie_jobs
deleted file mode 100755 (executable)
index 1542f0f..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/sh
-#
-# Check for zombie jobs (not terminated).
-# Also scan logs for ERROR messages
-#
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output tmp/dir.out
-status dir
-@output tmp/fd.out
-status client
-@output tmp/sd.out
-status $1
-@output
-quit
-END_OF_DATA
-grep "No Jobs running." tmp/dir.out 2>&1 >/dev/null
-if [ $? != 0 ] ; then
-  echo " "
-  echo "  !!!! Zombie Jobs in Director !!!!"
-  echo "  !!!! Zombie Jobs in Director !!!!" >>test.out
-  echo " "
-fi
-grep "No Jobs running." tmp/fd.out 2>&1 >/dev/null
-if [ $? != 0 ] ; then
-  echo " "
-  echo "  !!!! Zombie Jobs in File daemon !!!!"
-  echo "  !!!! Zombie Jobs in File daemon !!!!" >>test.out
-  echo " "
-fi
-grep "No Jobs running." tmp/sd.out 2>&1 >/dev/null
-if [ $? != 0 ] ; then
-  echo " "
-  echo "  !!!! Zombie Jobs in Storage daemon !!!!"
-  echo "  !!!! Zombie Jobs in Storage daemon !!!!" >>test.out
-  echo " "
-fi
-grep "ERROR" tmp/log*.out 2>&1 >/dev/null
-if [ $? = 0 ] ; then
-  echo " "
-  echo "  !!!! ERROR in log output !!!!"
-  echo "  !!!! ERROR in log output !!!!" >>test.out
-  echo " "
-fi
-grep "Fatal Error" tmp/log*.out 2>&1 >/dev/null
-if [ $? = 0 ] ; then
-  echo " "
-  echo "  !!!! Fatal Error in log output !!!!"
-  echo "  !!!! Fatal Error in log output !!!!" >>test.out
-  echo " "
-fi
-
diff --git a/regress/scripts/cleanup b/regress/scripts/cleanup
deleted file mode 100755 (executable)
index bca32b3..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-#
-# Cleanup left over files -- both before and after test run
-#
-rm -rf /tmp/TestVolume001 /tmp/bacula-restores /tmp/Small*
-rm -rf tmp/original tmp/bacula-restores tmp/Small* tmp/TestVolume*
-rm -rf tmp/restored tmp/largefile tmp/bscan.bsr tmp/log*.out
-rm -rf /tmp/sed_tmp /tmp/file-list
-rm -rf tmp/build tmp/restore-list tmp/restore2-list
-rm -rf tmp/fd.out tmp/dir.out tmp/sd.out
-rm -rf working/log tmp/TEST-*
-rm -rf working/*restore*.bsr
-
-bin/bacula stop 2>&1 >/dev/null
-cd bin
-./drop_bacula_tables >/dev/null 2>&1
-./make_bacula_tables >/dev/null 2>&1
-./grant_bacula_privileges >/dev/null 2>&1
-cd ..
diff --git a/regress/scripts/cleanup-2drive.in b/regress/scripts/cleanup-2drive.in
deleted file mode 100755 (executable)
index 32b27c0..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/sh
-#
-# Cleanup left over files -- both before and after test run
-#
-scripts/cleanup
-
-if test x@autochanger@ != x/dev/null; then
-   slot=`bin/mtx-changer @autochanger@ loaded 0 @tape_drive1@ 1`
-   echo "Slot $slot in drive 1"
-   if test x$slot != x0 ; then
-      echo "unload slot $slot in drive 1"
-      bin/mtx-changer @autochanger@ unload $slot @tape_drive1@ 1
-   fi
-   slot=`bin/mtx-changer @autochanger@ loaded 0 @tape_drive@ 0`
-   echo "Slot $slot in drive 0"
-   if test x$slot != x0 ; then
-      echo "unload slot $slot in drive 0"
-      bin/mtx-changer @autochanger@ unload $slot @tape_drive@ 0
-   fi
-
-
-   slot=`bin/mtx-changer @autochanger@ loaded 0 @tape_drive1@ 1`
-   if test x$slot != x2; then
-      echo "load slot 2 in drive 1"
-      bin/mtx-changer @autochanger@ load 2 @tape_drive1@ 1
-   fi
-   echo "WEOF drive 1"
-   mt -f @tape_drive1@ rewind
-   mt -f @tape_drive1@ weof
-   echo "unload slot 2 in drive 1"
-   bin/mtx-changer @autochanger@ unload 2 @tape_drive1@ 1
-
-   slot=`bin/mtx-changer @autochanger@ loaded 0 @tape_drive@ 0`
-   echo "Slot $slot in drive 0"
-   if test x$slot != x1; then
-      echo "load slot 1 in drive 0"
-      bin/mtx-changer @autochanger@ load 1 @tape_drive@ 0
-   fi
-   echo "WEOF drive 0"
-   mt -f @tape_drive@ rewind
-   mt -f @tape_drive@ weof
-   echo "unload slot 1 from drive 0"
-   bin/mtx-changer @autochanger@ unload 1 @tape_drive@ 0
-fi
diff --git a/regress/scripts/cleanup-2tape.in b/regress/scripts/cleanup-2tape.in
deleted file mode 100755 (executable)
index 0f33ec9..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-#
-# Cleanup left over files -- both before and after test run
-#
-scripts/cleanup
-
-if test x@autochanger@ != x/dev/null; then
-   drive=`bin/mtx-changer @autochanger@ loaded 0 dummy 0`
-   if test x${drive} != x2; then
-      bin/mtx-changer @autochanger@ unload 0 @tape_drive@ 0
-      bin/mtx-changer @autochanger@ load 2 @tape_drive@ 0
-   fi
-   mt -f @tape_drive@ rewind
-   mt -f @tape_drive@ weof
-fi
-
-
-#
-# If we have an autochanger always load tape in slot 1
-#
-if test x@autochanger@ != x/dev/null; then
-   drive=`bin/mtx-changer @autochanger@ loaded 0 dummy 0`
-   if test x${drive} != x1; then
-      bin/mtx-changer @autochanger@ unload 0 @tape_drive@ 0
-      bin/mtx-changer @autochanger@ load 1 @tape_drive@ 0
-   fi
-fi
-
-mt -f @tape_drive@ rewind
-mt -f @tape_drive@ weof
diff --git a/regress/scripts/cleanup-tape.in b/regress/scripts/cleanup-tape.in
deleted file mode 100755 (executable)
index 98ed537..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-#
-# Cleanup left over files -- both before and after test run
-#
-scripts/cleanup
-
-mt -f @tape_drive@ rewind
-mt -f @tape_drive@ weof
diff --git a/regress/scripts/copy-2disk-confs b/regress/scripts/copy-2disk-confs
deleted file mode 100755 (executable)
index 40f1860..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf
-/bin/cp -f scripts/bacula-sd-2disk.conf bin/bacula-sd.conf
-/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/test-console.conf bin/bconsole.conf
-outf="tmp/sed_tmp"
-echo "s%# Autochanger = yes%  Autochanger = yes%g" >${outf}
-cp bin/bacula-dir.conf tmp/1
-sed -f ${outf} tmp/1 >bin/bacula-dir.conf
-
diff --git a/regress/scripts/copy-2disk-drive-confs b/regress/scripts/copy-2disk-drive-confs
deleted file mode 100755 (executable)
index 7a5dcd3..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf
-/bin/cp -f scripts/bacula-sd-2disk-drive.conf bin/bacula-sd.conf
-/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/test-console.conf bin/bconsole.conf
-outf="tmp/sed_tmp"
-echo "s%# Autochanger = yes%  Autochanger = yes%g" >${outf}
-cp bin/bacula-dir.conf tmp/1
-sed -f ${outf} tmp/1 >bin/bacula-dir.conf
-
diff --git a/regress/scripts/copy-2drive-confs b/regress/scripts/copy-2drive-confs
deleted file mode 100755 (executable)
index 0388c4c..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf
-/bin/cp -f scripts/bacula-sd-2drive.conf bin/bacula-sd.conf
-/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/test-console.conf bin/bconsole.conf
-outf="tmp/sed_tmp"
-echo "s%# Autochanger = yes%  Autochanger = yes%g" >${outf}
-cp bin/bacula-dir.conf tmp/1
-sed -f ${outf} tmp/1 >bin/bacula-dir.conf
-
-# get proper SD tape definitions
-cp -f scripts/linux_tape_options bin/tape_options
-if test x`uname` = xFreeBSD ; then
-   cp -f scripts/freebsd_tape_options bin/tape_options
-fi
diff --git a/regress/scripts/copy-2tape-confs b/regress/scripts/copy-2tape-confs
deleted file mode 100755 (executable)
index e23adc5..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf
-/bin/cp -f scripts/bacula-sd-2tape.conf bin/bacula-sd.conf
-/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/test-console.conf bin/bconsole.conf
-outf="tmp/sed_tmp"
-echo "s%# Autochanger = yes%  Autochanger = yes%g" >${outf}
-cp bin/bacula-dir.conf tmp/1
-sed -f ${outf} tmp/1 >bin/bacula-dir.conf
-
-# get proper SD tape definitions
-cp -f scripts/linux_tape_options bin/tape_options
-if test x`uname` = xFreeBSD ; then
-   cp -f scripts/freebsd_tape_options bin/tape_options
-fi
diff --git a/regress/scripts/copy-confs b/regress/scripts/copy-confs
deleted file mode 100755 (executable)
index c12a20a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/bacula-dir.conf bin/bacula-dir.conf
-/bin/cp -f scripts/bacula-sd.conf bin/bacula-sd.conf
-/bin/cp -f scripts/bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/bconsole.conf bin/bconsole.conf
-
-# get proper SD tape definitions
-cp -f scripts/linux_tape_options bin/tape_options
-if test x`uname` = xFreeBSD ; then
-   cp -f scripts/freebsd_tape_options bin/tape_options
-fi
diff --git a/regress/scripts/copy-crypto-confs b/regress/scripts/copy-crypto-confs
deleted file mode 100755 (executable)
index 28df20c..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/new-test-bacula-dir.conf bin/bacula-dir.conf
-/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf
-/bin/cp -f scripts/crypto-bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/test-console.conf bin/bconsole.conf
-/bin/cp -f scripts/cryptokeypair.pem bin/cryptokeypair.pem
diff --git a/regress/scripts/copy-tape-confs b/regress/scripts/copy-tape-confs
deleted file mode 100755 (executable)
index c8dae32..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf
-/bin/cp -f scripts/bacula-sd-tape.conf bin/bacula-sd.conf
-/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/test-console.conf bin/bconsole.conf
-
-# get proper SD tape definitions
-cp -f scripts/linux_tape_options bin/tape_options
-if test x`uname` = xFreeBSD ; then
-   cp -f scripts/freebsd_tape_options bin/tape_options
-fi
diff --git a/regress/scripts/copy-test-confs b/regress/scripts/copy-test-confs
deleted file mode 100755 (executable)
index 5552c77..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/new-test-bacula-dir.conf bin/bacula-dir.conf
-/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf
-/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/test-console.conf bin/bconsole.conf
-
-# get proper SD tape definitions
-cp -f scripts/linux_tape_options bin/tape_options
-if test x`uname` = xFreeBSD ; then
-   cp -f scripts/freebsd_tape_options bin/tape_options
-fi
diff --git a/regress/scripts/copy-testa-confs b/regress/scripts/copy-testa-confs
deleted file mode 100755 (executable)
index 46116b9..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/testa-bacula-dir.conf bin/bacula-dir.conf
-/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf
-/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/test-console.conf bin/bconsole.conf
-
-# get proper SD tape definitions
-cp -f scripts/linux_tape_options bin/tape_options
-if test x`uname` = xFreeBSD ; then
-   cp -f scripts/freebsd_tape_options bin/tape_options
-fi
diff --git a/regress/scripts/copy-win32-confs b/regress/scripts/copy-win32-confs
deleted file mode 100755 (executable)
index 7cda59a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-/bin/cp -f scripts/win32-bacula-dir-tape.conf bin/bacula-dir.conf
-/bin/cp -f scripts/win32-bacula-sd-tape.conf bin/bacula-sd.conf
-/bin/cp -f scripts/win32-bacula-fd.conf bin/bacula-fd.conf
-/bin/cp -f scripts/test-console.conf bin/bconsole.conf
-
-# get proper SD tape definitions
-cp -f scripts/linux_tape_options bin/tape_options
-if test x`uname` = xFreeBSD ; then
-   cp -f scripts/freebsd_tape_options bin/tape_options
-fi
diff --git a/regress/scripts/crypto-bacula-fd.conf.in b/regress/scripts/crypto-bacula-fd.conf.in
deleted file mode 100644 (file)
index ec4152d..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# Default  Bacula File Daemon Configuration file
-#
-#  For Bacula release 1.33
-#
-# There is not much to change here except perhaps the
-# File daemon Name to
-#
-
-#
-# List Directors who are permitted to contact this File daemon
-#
-Director {
-  Name = @hostname@-dir
-  Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc"
-}
-
-#
-# "Global" File daemon configuration specifications
-#
-FileDaemon {                          # this is me
-  Name = @hostname@-fd
-  FDport = 8102                  # where we listen for the director
-  WorkingDirectory = "@working_dir@"
-  Pid Directory = "@piddir@"
-  SubSys Directory = "@subsysdir@"
-  PKI Signatures = Yes
-  PKI Encryption = Yes
-  PKI Keypair = "@scriptdir@/cryptokeypair.pem"
-}
-
-# Send all messages except skipped files back to Director
-Messages {
-  Name = Standard
-  director = @hostname@-dir = all, !terminate
-}
diff --git a/regress/scripts/cryptokeypair.pem b/regress/scripts/cryptokeypair.pem
deleted file mode 100644 (file)
index a9ee617..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEA0sNbRqIUnck2ztve3GNRaMZSz95KauSqlMPSQV+i0jZNXm31
-bemJKDbeYr7NBIo5C8FqLlUgk3nh+GzeoQ+wTJ3qphdY+I4rL3q8kweDjSpvnXBw
-L722jH+UOSKDeRol7lMCOwooyY0r4cSsE/AIHfKts6D2DV8hUzbuxy1s4wwfJDnF
-BQtpXJbLL7JfAKYlgqHBteDLkfKikcqIuPGjvcsKBsun4HXZuQ1y1looRW6N7UM/
-QwBfRYpJVQc4h/mwue2gzhChlOTWyKJKZxuiwftTv7xHXw/yUpeth6OdALj8sbOB
-OXMV9Hb3HSO3UftI2LpwuzKW6OgBXWAecuYGxQIDAQABAoIBAQCGchQxtIbOOGL8
-BgneMITn/0soSrbSBVhDWb8v8J/e1MD58c7T9FuICahG+UuzD7FgLFtdfvQu31sk
-q95Ag8+EsF/U36Pjul0WBodwiySB0oYsumL2MWDXszKMV9XiVKnJo64Sl2J5X9KU
-TG8wsLec0we3RIBw+zQ47xvWdsW09wfdDg38f6mUlcoH5uAlMkGILAm5myo8vZ1r
-0GNmV5m60FKm9K0pGVTUk2KhdenMQYyOMPhJB5J+corkJN0FqFosfl6E1zlavqff
-olq/oviZEeoGZrOjnKhm/xFXI9N0iO9sdgKV/5sFXAk+XyJSeMU3DQHcpnXU+Dro
-Ow/VKoABAoGBAPO5BJQQombCOrPMPUM3IgEOJX7xDvni/Bh6VAnZVvHndiPWwjpS
-u6fuq77++hHOzhZsGZKYEc83amSIOnFAXQav7UCRZhHR9bWyHsBNK8hpDI5yYsag
-0SUOS8TSvhxpY4UlaWlnIVwH3OYmcAFdEyfXbPyOt3ayH+BiY3/Br7bFAoGBAN1h
-TOhKJERbGGkQ4d/QHWjjjnXnBSje6UAZNyJa0/L9Lc9TquePYK5noeTl1fU2LLPo
-l41T2BFb/0iuxYuobb8vPc0IRmRMAMLeoRCS7V2Gds3fhqINndnfASOEAuqDfcKQ
-mpYjNbYGFNn40YQNaAn7Uxs5vhb4kP5OY62rQhABAoGAGPysAn4eGEjrecmDsmNx
-oggQQg52yZnC3MOV4BifOFfRneUDrrUStinbA87iVncMW/IjQQtEMClvR/VLgJbn
-sqrQuSDvBP6woTssuexvg7F5bxU9GT4dkx3/GKO+h+0qHdlzEDJZkjTgKdxg+VLQ
-hvIoI1CCcLHcYMXVi6CQ4j0CgYEAjHAYYNf/79k2QBi0oc4dihepnUQD8uyOXdph
-LoseH+za7cZvCdzcAWe+vT3MoHVQoITx93bz//czmIE+0pzzmjA27WXNefz5EqY2
-2RPMPuN5ZJrjhtRKihc9WrF5RBpMYmxnlM0bWrC685g0GaiDkql8DC5yV5IyMRG7
-jEWzcAECgYAb78NE1FvfBF+z8H2j+Pa0uyuFF1YNW2dr/v0p2atE2AUzxA/Soo2V
-8G+c9qQlYequcrQLN19tZAs9DCUFdCw+lMlKBoJiWVOA33L2neT1UpDY+64rFZL6
-S91HXGq2FKjFTovcDsfw5CgHk64zn9BzX4peCGkbDkbxh7wadx4Hkw==
------END RSA PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIIEcTCCA1mgAwIBAgIJAL/Bgtto2kTWMA0GCSqGSIb3DQEBBAUAMIGBMQswCQYD
-VQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQg
-V2lkZ2l0cyBQdHkgTHRkMRkwFwYDVQQDExB0ZXN0LmV4YW1wbGUuY29tMR8wHQYJ
-KoZIhvcNAQkBFhB0ZXN0QGV4YW1wbGUuY29tMB4XDTA1MTEwMjAzMTI1MloXDTA1
-MTIwMjAzMTI1MlowgYExCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRl
-MSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxGTAXBgNVBAMTEHRl
-c3QuZXhhbXBsZS5jb20xHzAdBgkqhkiG9w0BCQEWEHRlc3RAZXhhbXBsZS5jb20w
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSw1tGohSdyTbO297cY1Fo
-xlLP3kpq5KqUw9JBX6LSNk1ebfVt6YkoNt5ivs0EijkLwWouVSCTeeH4bN6hD7BM
-neqmF1j4jisveryTB4ONKm+dcHAvvbaMf5Q5IoN5GiXuUwI7CijJjSvhxKwT8Agd
-8q2zoPYNXyFTNu7HLWzjDB8kOcUFC2lclssvsl8ApiWCocG14MuR8qKRyoi48aO9
-ywoGy6fgddm5DXLWWihFbo3tQz9DAF9FiklVBziH+bC57aDOEKGU5NbIokpnG6LB
-+1O/vEdfD/JSl62Ho50AuPyxs4E5cxX0dvcdI7dR+0jYunC7Mpbo6AFdYB5y5gbF
-AgMBAAGjgekwgeYwHQYDVR0OBBYEFGGSblAAcqocdavoGyiTv88YuHLaMIG2BgNV
-HSMEga4wgauAFGGSblAAcqocdavoGyiTv88YuHLaoYGHpIGEMIGBMQswCQYDVQQG
-EwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lk
-Z2l0cyBQdHkgTHRkMRkwFwYDVQQDExB0ZXN0LmV4YW1wbGUuY29tMR8wHQYJKoZI
-hvcNAQkBFhB0ZXN0QGV4YW1wbGUuY29tggkAv8GC22jaRNYwDAYDVR0TBAUwAwEB
-/zANBgkqhkiG9w0BAQQFAAOCAQEAO16yp0yQjglmDLXsoBofRTKynP3R3Z5wWy7D
-YvLAUcR/AvG+WZRfrTmi8fZ+Km5rbVrujPsWiK27k6Md0380Z3KY+mjnCcElxNbA
-7I5CG2NZEkmequyy5p/crexUg/TZdvvF0xmJyUS7ArPv7yzSXtncvSvoBaj1AdK7
-R3OFKhG8KBSfAmrSylBQDONuuvM851XO5KKSyXSJa8R7bs5hHcBCILAEYKklWopp
-JuPJqB/zaIymY5KrpKJE4z80Nv0IAE5aP1JX5g80/R/pzPjWkpIYtkUjDOZs3fDR
-eJA2cUWE0WoVE4fTGYLHAXrIV1wkn4Onu48nq94HhUpyc2brLw==
------END CERTIFICATE-----
diff --git a/regress/scripts/do_sed b/regress/scripts/do_sed
deleted file mode 100755 (executable)
index 8357611..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/bin/sh
-#
-if test $# != 6 ; then
-   echo "First arg must be email name"
-   echo "  and the second must be a tape drive"
-   echo "  and the third must be a tape control name or /dev/null"
-   echo "  and the fourth must be the full path to the mtx program"
-   echo "  and the fifth must be tape drive 1 or /dev/null"
-   echo "  and the sixth must be the smtp or email host"
-   exit 1
-fi
-cwd=`pwd`
-mkdir -p ${cwd}/bin
-out="/tmp/sed_tmp"
-HOST="localhost"
-# Create sed command script
-echo "s%@sbindir@%${cwd}/bin%g" >${out}
-echo "s%@scriptdir@%${cwd}/bin%g" >>${out}
-echo "s%@working_dir@%${cwd}/working%g" >>${out}
-echo "s%@piddir@%${cwd}/working%g" >>${out}
-echo "s%@subsysdir@%${cwd}/working%g" >>${out}
-echo "s%@job_email@%${1}%g" >>${out}
-echo "s%@tape_drive@%${2}%g" >>${out}
-echo "s%@autochanger@%${3}%g" >>${out}
-echo "s%@tmpdir@%${cwd}/tmp%g" >>${out}
-echo "s%@hostname@%${HOST}%g" >>${out}
-echo "s%@changer_path@%${4}%g" >>${out}
-echo "s%@tape_drive1@%${5}%g" >>${out}
-echo "s%@smtp_host@%${6}%g" >>${out}
-echo "s%@disk_drive@%${cwd}/tmp/disk-changer%g" >>${out}
-
-echo "AUTOCHANGER=\"${3}\"" >config.out
-echo "TAPE_DRIVE1=\"${5}\"" >>config.out
-
-
-# process .in files with sed script
-sed -f ${out} ${cwd}/scripts/test-bacula-dir.conf.in >${cwd}/scripts/test-bacula-dir.conf
-sed -f ${out} ${cwd}/scripts/new-test-bacula-dir.conf.in >${cwd}/scripts/new-test-bacula-dir.conf
-sed -f ${out} ${cwd}/scripts/testa-bacula-dir.conf.in >${cwd}/scripts/testa-bacula-dir.conf
-sed -f ${out} ${cwd}/scripts/test-bacula-fd.conf.in >${cwd}/scripts/test-bacula-fd.conf
-sed -f ${out} ${cwd}/scripts/test-bacula-sd.conf.in >${cwd}/scripts/test-bacula-sd.conf
-sed -f ${out} ${cwd}/scripts/test-console.conf.in >${cwd}/scripts/test-console.conf
-sed -f ${out} ${cwd}/scripts/crypto-bacula-fd.conf.in >${cwd}/scripts/crypto-bacula-fd.conf
-sed -f ${out} ${cwd}/scripts/bacula-dir-tape.conf.in >${cwd}/scripts/bacula-dir-tape.conf
-sed -f ${out} ${cwd}/scripts/win32-bacula-dir-tape.conf.in >${cwd}/scripts/win32-bacula-dir-tape.conf
-sed -f ${out} ${cwd}/scripts/bacula-sd-tape.conf.in >${cwd}/scripts/bacula-sd-tape.conf
-sed -f ${out} ${cwd}/scripts/bacula-sd-2tape.conf.in >${cwd}/scripts/bacula-sd-2tape.conf
-sed -f ${out} ${cwd}/scripts/bacula-sd-2disk.conf.in >${cwd}/scripts/bacula-sd-2disk.conf
-sed -f ${out} ${cwd}/scripts/bacula-sd-2drive.conf.in >${cwd}/scripts/bacula-sd-2drive.conf
-sed -f ${out} ${cwd}/scripts/bacula-sd-2disk-drive.conf.in >${cwd}/scripts/bacula-sd-2disk-drive.conf
-sed -f ${out} ${cwd}/scripts/cleanup-tape.in >${cwd}/scripts/cleanup-tape
-sed -f ${out} ${cwd}/scripts/cleanup-2tape.in >${cwd}/scripts/cleanup-2tape
-sed -f ${out} ${cwd}/scripts/cleanup-2drive.in >${cwd}/scripts/cleanup-2drive
-sed -f ${out} ${cwd}/scripts/prepare-two-tapes.in >${cwd}/scripts/prepare-two-tapes
-
-cp ${cwd}/bin/bacula-sd.conf /tmp/bac$$
-sed s%/tmp%${cwd}/tmp%g /tmp/bac$$ >${cwd}/bin/bacula-sd.conf
-chmod 777 ${cwd}/scripts/cleanup-*tape ${cwd}/scripts/cleanup-*drive ${cwd}/scripts/prepare-two-tapes
-rm -f /tmp/bac$$
-cp ${cwd}/bin/mtx-changer /tmp/bac$$
-sed "s%^MTX.*$%MTX=${4}%g" /tmp/bac$$ >${cwd}/bin/mtx-changer
-chmod 777 ${cwd}/bin/mtx-changer
-
-# get proper SD tape definitions
-cp -f ${cwd}/scripts/linux_tape_options ${cwd}/bin/tape_options
-if test x`uname` = xFreeBSD ; then
-   cp -f ${cwd}/scripts/freebsd_tape_options ${cwd}/bin/tape_options
-fi
-
-rm -f ${out}
-rm -f /tmp/bac$$
diff --git a/regress/scripts/exclude-dev-test b/regress/scripts/exclude-dev-test
deleted file mode 100644 (file)
index 4165ea1..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-dev/ptmx
-dev/pts
-dev/rd/c5d2
-dev/rd
-dev/shm
diff --git a/regress/scripts/exclude-etc-test b/regress/scripts/exclude-etc-test
deleted file mode 100644 (file)
index f59ca8d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-etc/mail/statistics
diff --git a/regress/scripts/exclude-lib-test b/regress/scripts/exclude-lib-test
deleted file mode 100644 (file)
index 5be32f4..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-lib/ld-2.2.5.so
-lib/libtermcap.so.2.0.8
-lib/libc-2.2.5.so
-lib/libnsl-2.2.5.so
-lib/libnss_files-2.2.5.so
diff --git a/regress/scripts/flist b/regress/scripts/flist
deleted file mode 100644 (file)
index 019eb57..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/build/configure
-/build/src/stored/bextract
-/build/src/tools/testfind
-/build/Makefile.in
-/build/src/dird/bacula-dir
-/build/src/console/bconsole
-/build/src/filed/bacula-fd
-/build/src/findlib/find_one.c
-/build/src/jcr.h
-/build/platforms/Makefile.in
-/build/platforms/redhat/Makefile.in
-/build/scripts/Makefile.in
-/build/src/filed/win32/winservice.cpp
-/build/src/filed/restore.c
-/build/autoconf/configure.in
-/build/examples/afs-bacula
-/build/src/win32/winbacula.nsi.in
-/build/autoconf/configure.in
-/build/src/version.h
-/build/src/lib/message.c
-/build/src/lib/bnet_server.c
-/build/src/lib/libbac.a
diff --git a/regress/scripts/freebsd_tape_options b/regress/scripts/freebsd_tape_options
deleted file mode 100644 (file)
index 05be344..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# FreeBSD tape drive options
-#
-Hardware End of Medium = no
-Fast Forward Space File = no
-BSF at EOM = yes
-Backward Space Record = no
-TWO EOF = yes
diff --git a/regress/scripts/linux_osst_tape_options b/regress/scripts/linux_osst_tape_options
deleted file mode 100644 (file)
index 5def0c0..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-  Minimum Block Size = 32768
-  Maximum Block Size = 32768
-  Hardware End of Medium = yes
-  BSF at EOM = yes
-  Fast Forward Space File = yes
-  Two EOF = no
-
diff --git a/regress/scripts/linux_tape_options b/regress/scripts/linux_tape_options
deleted file mode 100644 (file)
index 601eb82..0000000
+++ /dev/null
@@ -1 +0,0 @@
-# nothing needed for Linux
diff --git a/regress/scripts/new-test-bacula-dir.conf.in b/regress/scripts/new-test-bacula-dir.conf.in
deleted file mode 100644 (file)
index a91b7c4..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-#
-# Default Bacula Director Configuration file
-#
-#  The only thing that MUST be changed is to add one or more
-#   file or directory names in the Include directive of the
-#   FileSet resource.
-#
-#  For Bacula release 1.33 
-#
-#  You might also want to change the default email address
-#   from root to your address.  See the "mail" and "operator"
-#   directives in the Messages resource.
-#
-
-Director {                            # define myself
-  Name = @hostname@-dir
-  DIRport = 8101                # where we listen for UA connections
-  QueryFile = "@scriptdir@/query.sql"
-  WorkingDirectory = "@working_dir@"
-  PidDirectory = "@piddir@"
-  SubSysDirectory = "@subsysdir@"
-  Maximum Concurrent Jobs = 4
-  Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3"         # Console password
-  Messages = Standard
-}
-
-#
-# Define the main nightly save backup job
-#   By default, this job will back up to disk in /tmp
-Job {
-  Name = "NightlySave"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-  Maximum Concurrent Jobs = 4
-  SpoolData=yes
-}
-
-Job {
-  Name = "MonsterSave"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File1
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-
-Job {
-  Name = "VerifyVolume"
-  Type = Verify
-  Level = VolumeToCatalog
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-
-Job {
-  Name = "SparseTest"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="SparseSet"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-Job {
-  Name = "CompressedTest"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="CompressedSet"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Maximum Concurrent Jobs = 4
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-Job {
-  Name = "SparseCompressedTest"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="SparseCompressedSet"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-
-# Backup the catalog database (after the nightly save)
-Job {
-  Name = "BackupCatalog"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="Catalog"
-#  Schedule = "WeeklyCycleAfterBackup"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  # This creates an ASCII copy of the catalog
-  RunBeforeJob = "@sbindir@/make_catalog_backup -u bacula"
-  # This deletes the copy of the catalog
-  RunAfterJob  = "@sbindir@/delete_catalog_backup"
-  Write Bootstrap = "@working_dir@/BackupCatalog.bsr"
-}
-
-# Standard Restore template, to be changed by Console program
-Job {
-  Name = "RestoreFiles"
-  Type = Restore
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Where = /tmp/bacula-restores
-}
-
-
-# List of files to be backed up
-FileSet {
-  Name = "Full Set"
-  Include {  Options { signature=MD5 }
-     File =  </tmp/file-list
-  }
-}
-
-FileSet {
-  Name = "SparseSet"
-  Include {
-    Options {
-      signature=MD5 sparse=yes
-    }
-    File = </tmp/file-list
-  }
-}
-
-FileSet {
-  Name = "CompressedSet"
-  Include {
-    Options {
-      signature=MD5 compression=GZIP 
-    }
-    File = </tmp/file-list
-  }
-}
-
-FileSet {
-  Name = "SparseCompressedSet"
-  Include {
-    Options {
-      signature=MD5 compression=GZIP
-    }
-    File = </tmp/file-list
-  }
-}
-
-
-
-#
-# When to do the backups, full backup on first sunday of the month,
-#  differential (i.e. incremental since full) every other sunday,
-#  and incremental backups other days
-Schedule {
-  Name = "WeeklyCycle"
-  Run = Full 1st sun at 1:05
-  Run = Differential 2nd-5th sun at 1:05
-  Run = Incremental mon-sat at 1:05
-}
-
-# This schedule does the catalog. It starts after the WeeklyCycle
-Schedule {
-  Name = "WeeklyCycleAfterBackup"
-  Run = Full sun-sat at 1:10
-}
-
-# This is the backup of the catalog
-FileSet {
-  Name = "Catalog"
-  Include {
-    Options {
-      signature=MD5
-    }
-    File = /home/kern/bacula/regress/bin/working/bacula.sql
-  }
-}
-
-# Client (File Services) to backup
-Client {
-  Name = @hostname@-fd
-  Address = @hostname@
-  FDPort = 8102
-  Catalog = MyCatalog
-  Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc"          # password for FileDaemon
-  File Retention = 30d                # 30 days
-  Job Retention = 180d                # six months
-  AutoPrune = yes                     # Prune expired Jobs/Files
-  Maximum Concurrent Jobs = 4
-}
-
-# Definiton of file storage device
-Storage {
-  Name = File
-  Address = @hostname@                # N.B. Use a fully qualified name here
-  SDPort = 8103
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-  Device = FileStorage
-  Media Type = File
-  Maximum Concurrent Jobs = 4
-}
-
-Storage {
-  Name = File1
-  Address = @hostname@                # N.B. Use a fully qualified name here
-  SDPort = 8103
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-  Device = FileStorage1
-  Media Type = File1
-  Maximum Concurrent Jobs = 4
-}
-
-
-# Definition of DLT tape storage device
-#Storage {
-#  Name = DLTDrive
-#  Address = @hostname@                # N.B. Use a fully qualified name here
-#  SDPort = 8103
-#  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"          # password for Storage daemon
-#  Device = "HP DLT 80"                # must be same as Device in Storage daemon
-#  Media Type = DLT8000                # must be same as MediaType in Storage daemon
-#}
-
-# Definition of DDS tape storage device
-#Storage {
-#  Name = SDT-10000
-#  Address = @hostname@                # N.B. Use a fully qualified name here
-#  SDPort = 8103
-#  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"          # password for Storage daemon
-#  Device = SDT-10000                  # must be same as Device in Storage daemon
-#  Media Type = DDS-4                  # must be same as MediaType in Storage daemon
-#}
-
-# Definition of 8mm tape storage device
-#Storage {
-#  Name = "8mmDrive"
-#  Address = @hostname@                # N.B. Use a fully qualified name here
-#  SDPort = 8103
-#  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-#  Device = "Exabyte 8mm"
-#  MediaType = "8mm"
-#}
-
-
-# Generic catalog service
-Catalog {
-  Name = MyCatalog
-  dbname = bacula; user = bacula; password = ""
-}
-
-# Reasonable message delivery -- send most everything to email address
-#  and to the console
-Messages {
-  Name = Standard
-  mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
-  operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: Intervention needed for %j\" %r"
-  MailOnError = @job_email@ = all
-  operator = @job_email@ = mount
-  console = all, !skipped, !terminate, !restored
-#
-# WARNING! the following will create a file that you must cycle from
-#          time to time as it will grow indefinitely. However, it will
-#          also keep all your messages if the scroll off the console.
-#
-  append = "@working_dir@/log" = all, !skipped
-}
-
-Messages {
-  Name = NoEmail
-  mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
-  console = all, !skipped, !terminate
-#
-# WARNING! the following will create a file that you must cycle from
-#          time to time as it will grow indefinitely. However, it will
-#          also keep all your messages if the scroll off the console.
-#
-  append = "@working_dir@/log" = all, !skipped
-}
-
-    
-# Default pool definition
-Pool {
-  Name = Default
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-  Accept Any Volume = yes             # write on any volume in the pool
-# Label Format = "TEST-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}:${NumVols}"
-}
diff --git a/regress/scripts/prepare-two-disks b/regress/scripts/prepare-two-disks
deleted file mode 100755 (executable)
index d7d97bd..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-#
-# Create two blank tapes
-#
-rm -rf tmp/disk-changer
-mkdir tmp/disk-changer
diff --git a/regress/scripts/prepare-two-tapes.in b/regress/scripts/prepare-two-tapes.in
deleted file mode 100755 (executable)
index f31c0ab..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-#
-# Create two blank tapes
-#
-@changer_path@ -f @autochanger@ unload
-@changer_path@ -f @autochanger@ load 1
-mt -f @tape_drive@ rewind
-mt -f @tape_drive@ weof
-@changer_path@ -f @autochanger@ unload
-@changer_path@ -f @autochanger@ load 2
-mt -f @tape_drive@ rewind
-mt -f @tape_drive@ weof
-#@changer_path@ -f @autochanger@ unload
diff --git a/regress/scripts/regress-config b/regress/scripts/regress-config
deleted file mode 100755 (executable)
index 7fdae76..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-#
-# This is the configuration script for regression testing
-#
-
-CFLAGS="-g -O2 -Wall" \
- ./configure \
-    --sbindir=$1/bin \
-    --sysconfdir=$1/bin \
-    --mandir=$1/bin \
-    --with-pid-dir=$1/working \
-    --with-subsys-dir=$1/working \
-    --enable-smartalloc \
-    --disable-readline \
-    --with-working-dir=$1/working \
-    --with-dump-email=$2 \
-    --with-job-email=$2 \
-    --with-smtp-host=$5 \
-    $3 \
-    --with-baseport=8101 \
-    $4 \
-    $6
-
-exit 0
diff --git a/regress/scripts/setup b/regress/scripts/setup
deleted file mode 100755 (executable)
index 8b15d75..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/sh
-#
-# Script to setup running Bacula regression tests
-#
-cwd=`pwd`
-if [ $# != 6 ] ; then
-   echo "Incorrect number of arguments. Got $#. Need:"
-   echo "setup bacula-src email-address --with-DBNAME --with-tcp-wrappers"
-   echo " "
-   exit 1
-fi
-if [ ! -d $1 ] ; then
-   echo "Arg 1 must be a Bacula release directory."
-   echo " "
-   exit 1
-fi
-rm -rf build bin
-# Copy new source
-echo "Copying source from $1"
-cp -rp $1 build
-cp scripts/regress-config build
-cd build
-rm -f Makefile config.cache
-# Run Bacula configuration, make, install
-./regress-config ${cwd} $2 $3 $4 $5 $6
-make
-make install
-cp src/tools/testls ../bin
-
-cd ..
-bin/bacula stop
-cd bin
-./create_bacula_database bacula
-./drop_bacula_tables bacula
-./make_bacula_tables bacula
-./grant_bacula_privileges bacula
-cd ..
-# Start and stop Bacula to ensure conf files are OK
-bin/bacula start
-bin/bacula stop
-#
-# Save Bacula default conf files for later use
-#
-cp -f bin/*.conf scripts
diff --git a/regress/scripts/test-bacula-dir.conf.in b/regress/scripts/test-bacula-dir.conf.in
deleted file mode 100644 (file)
index 4283c9f..0000000
+++ /dev/null
@@ -1,313 +0,0 @@
-#
-# Default Bacula Director Configuration file
-#
-#  The only thing that MUST be changed is to add one or more
-#   file or directory names in the Include directive of the
-#   FileSet resource.
-#
-#  For Bacula release 1.33 
-#
-#  You might also want to change the default email address
-#   from root to your address.  See the "mail" and "operator"
-#   directives in the Messages resource.
-#
-
-Director {                            # define myself
-  Name = @hostname@-dir
-  DIRport = 8101                # where we listen for UA connections
-  QueryFile = "@scriptdir@/query.sql"
-  WorkingDirectory = "@working_dir@"
-  PidDirectory = "@piddir@"
-  SubSysDirectory = "@subsysdir@"
-  Maximum Concurrent Jobs = 4
-  Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3"         # Console password
-  Messages = Daemon
-}
-
-#
-# Define the main nightly save backup job
-#   By default, this job will back up to disk in /tmp
-Job {
-  Name = "NightlySave"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-  Maximum Concurrent Jobs = 4
-  SpoolData=yes
-}
-
-Job {
-  Name = "MonsterSave"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File1
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-
-Job {
-  Name = "VerifyVolume"
-  Type = Verify
-  Level = VolumeToCatalog
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-
-Job {
-  Name = "SparseTest"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="SparseSet"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-Job {
-  Name = "CompressedTest"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="CompressedSet"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Maximum Concurrent Jobs = 4
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-# Max Run Time = 15 seconds
-}
-
-Job {
-  Name = "SparseCompressedTest"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="SparseCompressedSet"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-
-# Backup the catalog database (after the nightly save)
-Job {
-  Name = "BackupCatalog"
-  Type = Backup
-  Client=@hostname@-fd 
-  FileSet="Catalog"
-#  Schedule = "WeeklyCycleAfterBackup"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  # This creates an ASCII copy of the catalog
-  RunBeforeJob = "@sbindir@/make_catalog_backup -u bacula"
-  # This deletes the copy of the catalog
-  RunAfterJob  = "@sbindir@/delete_catalog_backup"
-  Write Bootstrap = "@working_dir@/BackupCatalog.bsr"
-}
-
-# Standard Restore template, to be changed by Console program
-Job {
-  Name = "RestoreFiles"
-  Type = Restore
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Where = /tmp/bacula-restores
-}
-
-
-# List of files to be backed up
-FileSet {
-  Name = "Full Set"
-  Include  { Options { signature=MD5 }
-    File = </tmp/file-list
-  }
-}
-
-FileSet {
-  Name = "SparseSet"
-  Include { Options { signature=MD5; sparse=yes }
-    File=</tmp/file-list
-  }
-}
-
-FileSet {
-  Name = "CompressedSet"
-  Include {
-    Options { signature=MD5; compression=GZIP }
-    File =</tmp/file-list
-  }
-}
-
-FileSet {
-  Name = "SparseCompressedSet"
-  Include {
-    Options {
-      signature=MD5; compression=GZIP
-    }
-    File= </tmp/file-list
-  }
-}
-
-
-
-#
-# When to do the backups, full backup on first sunday of the month,
-#  differential (i.e. incremental since full) every other sunday,
-#  and incremental backups other days
-Schedule {
-  Name = "WeeklyCycle"
-  Run = Full 1st sun at 1:05
-  Run = Differential 2nd-5th sun at 1:05
-  Run = Incremental mon-sat at 1:05
-}
-
-# This schedule does the catalog. It starts after the WeeklyCycle
-Schedule {
-  Name = "WeeklyCycleAfterBackup"
-  Run = Full sun-sat at 1:10
-}
-
-# This is the backup of the catalog
-FileSet {
-  Name = "Catalog"
-  Include { Options { signature=MD5 }
-     File=/home/kern/bacula/regress/bin/working/bacula.sql
-  }
-}
-
-# Client (File Services) to backup
-Client {
-  Name = @hostname@-fd
-  Address = @hostname@
-  FDPort = 8102
-  Catalog = MyCatalog
-  Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc"          # password for FileDaemon
-  File Retention = 30d                # 30 days
-  Job Retention = 180d                # six months
-  AutoPrune = yes                     # Prune expired Jobs/Files
-  Maximum Concurrent Jobs = 4
-}
-
-# Definiton of file storage device
-Storage {
-  Name = File
-  Address = @hostname@                # N.B. Use a fully qualified name here
-  SDPort = 8103
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-  Device = FileStorage
-  Media Type = File
-  Maximum Concurrent Jobs = 4
-}
-
-Storage {
-  Name = File1
-  Address = @hostname@                # N.B. Use a fully qualified name here
-  SDPort = 8103
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-  Device = FileStorage1
-  Media Type = File1
-  Maximum Concurrent Jobs = 4
-}
-
-
-# Definition of DLT tape storage device
-#Storage {
-#  Name = DLTDrive
-#  Address = @hostname@                # N.B. Use a fully qualified name here
-#  SDPort = 8103
-#  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"          # password for Storage daemon
-#  Device = "HP DLT 80"                # must be same as Device in Storage daemon
-#  Media Type = DLT8000                # must be same as MediaType in Storage daemon
-#}
-
-# Definition of DDS tape storage device
-#Storage {
-#  Name = SDT-10000
-#  Address = @hostname@                # N.B. Use a fully qualified name here
-#  SDPort = 8103
-#  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"          # password for Storage daemon
-#  Device = SDT-10000                  # must be same as Device in Storage daemon
-#  Media Type = DDS-4                  # must be same as MediaType in Storage daemon
-#}
-
-# Definition of 8mm tape storage device
-#Storage {
-#  Name = "8mmDrive"
-#  Address = @hostname@                # N.B. Use a fully qualified name here
-#  SDPort = 8103
-#  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-#  Device = "Exabyte 8mm"
-#  MediaType = "8mm"
-#}
-
-
-# Generic catalog service
-Catalog {
-  Name = MyCatalog
-  dbname = bacula; user = bacula; password = ""
-}
-
-# Reasonable message delivery -- send most everything to email address
-#  and to the console
-Messages {
-  Name = Standard
-  mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
-  operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: Intervention needed for %j\" %r"
-  MailOnError = @job_email@ = all
-  operator = @job_email@ = mount
-  console = all, !skipped, !terminate, !restored
-#
-# WARNING! the following will create a file that you must cycle from
-#          time to time as it will grow indefinitely. However, it will
-#          also keep all your messages if the scroll off the console.
-#
-  append = "@working_dir@/log" = all, !skipped
-}
-
-Messages {
-  Name = NoEmail
-  mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
-  console = all, !skipped, !terminate
-#
-# WARNING! the following will create a file that you must cycle from
-#          time to time as it will grow indefinitely. However, it will
-#          also keep all your messages if the scroll off the console.
-#
-  append = "@working_dir@/log" = all, !skipped
-}
-
-#
-# Message delivery for daemon messages (no job).
-Messages {
-  Name = Daemon
-  mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula\) %r\" -s \"Bacula daemon message\" %r"
-  mail = @job_email@ = all, !skipped            
-  console = all, !skipped, !saved
-  append = "@working_dir@/log" = all, !skipped
-}
-    
-# Default pool definition
-Pool {
-  Name = Default
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-  Accept Any Volume = yes             # write on any volume in the pool
-}
diff --git a/regress/scripts/test-bacula-fd.conf.in b/regress/scripts/test-bacula-fd.conf.in
deleted file mode 100644 (file)
index 1879119..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Default  Bacula File Daemon Configuration file
-#
-#  For Bacula release 1.33
-#
-# There is not much to change here except perhaps the
-# File daemon Name to
-#
-
-#
-# List Directors who are permitted to contact this File daemon
-#
-Director {
-  Name = @hostname@-dir
-  Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc"
-}
-
-#
-# "Global" File daemon configuration specifications
-#
-FileDaemon {                          # this is me
-  Name = @hostname@-fd
-  FDport = 8102                  # where we listen for the director
-  WorkingDirectory = "@working_dir@"
-  Pid Directory = "@piddir@"
-  SubSys Directory = "@subsysdir@"
-}
-
-# Send all messages except skipped files back to Director
-Messages {
-  Name = Standard
-  director = @hostname@-dir = all, !terminate
-}
diff --git a/regress/scripts/test-bacula-sd.conf.in b/regress/scripts/test-bacula-sd.conf.in
deleted file mode 100644 (file)
index 390e0fb..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.33
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = @hostname@-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "@working_dir@"
-  Pid Directory = "@piddir@"
-  Subsys Directory = "@subsysdir@"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = @hostname@-dir
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-
-Device {
-  Name = FileStorage
-  Media Type = File
-  Archive Device = @tmpdir@
-  LabelMedia = yes;                   # lets Bacula label unlabelled media
-  Random Access = Yes;
-  AutomaticMount = yes;               # when device opened, read it
-  RemovableMedia = no;
-  AlwaysOpen = no;
-# Maximum File Size = 10KB
-}
-
-Device {
-  Name = FileStorage1
-  Media Type = File1
-  Archive Device = @tmpdir@
-  LabelMedia = yes;                   # lets Bacula label unlabelled media
-  Random Access = Yes;
-  AutomaticMount = yes;               # when device opened, read it
-  RemovableMedia = no;
-  AlwaysOpen = no;
-}
-
-
-#Device {
-#  Name = "HP DLT 80"
-#  Media Type = DLT8000
-#  Archive Device = /dev/nst0
-#  AutomaticMount = yes;               # when device opened, read it
-#  AlwaysOpen = yes;
-#  RemovableMedia = yes;
-#}
-
-#Device {
-#  Name = SDT-7000                     # 
-#  Media Type = DDS-2
-#  Archive Device = /dev/nst0
-#  AutomaticMount = yes;               # when device opened, read it
-#  AlwaysOpen = yes;
-#  RemovableMedia = yes;
-#}
-
-#Device {
-#  Name = Floppy
-#  Media Type = Floppy
-#  Archive Device = /mnt/floppy
-#  RemovableMedia = yes;
-#  Random Access = Yes;
-#  AutomaticMount = yes;               # when device opened, read it
-#  AlwaysOpen = no;
-#}
-
-#
-# A very old Exabyte with no end of media detection
-#
-#Device {
-#  Name = "Exabyte 8mm"
-#  Media Type = "8mm"
-#  Archive Device = /dev/nst0
-#  Hardware end of medium = No;
-#  AutomaticMount = yes;               # when device opened, read it
-#  AlwaysOpen = Yes;
-#  RemovableMedia = yes;
-#}
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = @hostname@-dir = all, !terminate
-}
diff --git a/regress/scripts/test-console.conf.in b/regress/scripts/test-console.conf.in
deleted file mode 100644 (file)
index 0fe916b..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Bacula User Agent (or Console) Configuration File
-#
-
-Director {
-  Name = @hostname@-dir
-  DIRport = 8101
-  address = @hostname@
-  Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3"
-}
diff --git a/regress/scripts/testa-bacula-dir.conf.in b/regress/scripts/testa-bacula-dir.conf.in
deleted file mode 100644 (file)
index 1e75eec..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-#
-# TestA   Bacula Director Configuration file
-#
-#  For Bacula release 1.30 (12 April 2003) -- redhat 7.3
-#
-
-Director {                            # define myself
-  Name = @hostname@-dir
-  DIRport = 8101                # where we listen for UA connections
-  QueryFile = "@scriptdir@/query.sql"
-  WorkingDirectory = "@working_dir@"
-  PidDirectory = "@piddir@"
-  SubSysDirectory = "@subsysdir@"
-  Maximum Concurrent Jobs = 1
-  Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3"         # Console password
-  Messages = Standard
-}
-
-
-Job {
-  Name = "MultiVol"
-  Type = Backup
-  Client=@hostname@-fd 
-  Level = Full
-  FileSet="Full Set"
-  Storage = File 
-  Messages = Standard
-  Write Bootstrap = "@working_dir@/SmallVols.bsr"
-  Pool = SmallVols
-  SpoolData = yes
-}
-
-
-Job {
-  Name = "VerifyVolume"
-  Type = Verify
-  Level = VolumeToCatalog
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-}
-
-
-
-# Standard Restore template, to be changed by Console program
-Job {
-  Name = "RestoreFiles"
-  Type = Restore
-  Client=@hostname@-fd 
-  FileSet="Full Set"
-  Storage = File
-  Messages = Standard
-  Pool = Default
-  Where = /tmp/bacula-restores
-}
-
-
-# List of files to be backed up
-FileSet {
-  Name = "Full Set"
-  Include { Options { signature=SHA1 }
-    File =</tmp/file-list
-  }
-}
-
-
-# Client (File Services) to backup
-Client {
-  Name = @hostname@-fd
-  Address = @hostname@
-  FDPort = 8102
-  Catalog = MyCatalog
-  Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc"          # password for FileDaemon
-  File Retention = 30d                # 30 days
-  Job Retention = 180d                # six months
-  AutoPrune = yes                     # Prune expired Jobs/Files
-}
-
-# Definiton of file storage device
-Storage {
-  Name = File
-  Address = @hostname@                # N.B. Use a fully qualified name here
-  SDPort = 8103
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-  Device = FileStorage
-  Media Type = File
-}
-
-Storage {
-  Name = File1
-  Address = @hostname@                # N.B. Use a fully qualified name here
-  SDPort = 8103
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-  Device = FileStorage1
-  Media Type = File1
-}
-
-
-# Generic catalog service
-Catalog {
-  Name = MyCatalog
-  dbname = bacula; user = bacula; password = ""
-}
-
-# Reasonable message delivery -- send most everything to email address
-#  and to the console
-Messages {
-  Name = Standard
-  mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
-  operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: Intervention needed for %j\" %r"
-  MailOnError = @job_email@ = all, !terminate
-  operator = @job_email@ = mount
-  console = all, !skipped, !terminate
-
-  append = "@working_dir@/log" = all, !skipped
-}
-
-Messages {
-  Name = NoEmail
-  mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
-  console = all, !skipped, !terminate, !restored
-  append = "@working_dir@/log" = all, !skipped
-}
-
-    
-# Default pool definition
-Pool {
-  Name = Default
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-  Accept Any Volume = yes             # write on any volume in the pool
-}
-
-Pool {
-  Name = SmallVols
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-  Accept Any Volume = yes             # write on any volume in the pool
-  Maximum Volumes = 10
-  MaximumVolumeBytes = 10M
-  LabelFormat = Small
-}
diff --git a/regress/scripts/win32-bacula-dir-tape.conf.in b/regress/scripts/win32-bacula-dir-tape.conf.in
deleted file mode 100644 (file)
index 5c2af4f..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-#
-# Default Bacula Director Configuration file
-#
-#  The only thing that MUST be changed is to add one or more
-#   file or directory names in the Include directive of the
-#   FileSet resource.
-#
-#  For Bacula release 1.33
-#
-#  You might also want to change the default email address
-#   from root to your address.  See the "mail" and "operator"
-#   directives in the Messages resource.
-#
-
-Director {                            # define myself
-  Name = rufus-dir
-  DIRport = 8101                # where we listen for UA connections
-  QueryFile = "@scriptdir@/query.sql"
-  WorkingDirectory = "@working_dir@"
-  PidDirectory = "@piddir@"
-  Maximum Concurrent Jobs = 4
-  Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3"
-  Messages = Daemon
-}
-
-#
-# Define the main nightly save backup job
-#   By default, this job will back up to disk in /tmp
-Job {
-  Name = "NightlySave"
-  Type = Backup
-  Client=Tibs
-  FileSet="Full Set"
-  Storage = DDS-4
-  Messages = Standard
-  Pool = Default
-  Write Bootstrap = "@working_dir@/NightlySave.bsr"
-  Maximum Concurrent Jobs = 4
-  SpoolData = yes
-}
-
-
-# Standard Restore template, to be changed by Console program
-Job {
-  Name = "RestoreFiles"
-  Type = Restore
-  Client=Tibs
-  FileSet="Full Set"
-  Storage = DDS-4
-  Messages = Standard
-  Pool = Default
-  Where = /tmp/bacula-restores
-}
-
-
-# List of files to be backed up
-FileSet {
-  Name = "Full Set"
-  Enable VSS = yes
-  Include { Options { signature=MD5; portable=no  
-      compression=GZIP }
-#   File =  "c:/cygwin"   # big   
-    File =  "c:/cygwin/home/kern/bacula/k"
-  }
-}
-
-
-#
-# When to do the backups, full backup on first sunday of the month,
-#  differential (i.e. incremental since full) every other sunday,
-#  and incremental backups other days
-Schedule {
-  Name = "WeeklyCycle"
-  Run = Full 1st sun at 1:05
-  Run = Differential 2nd-5th sun at 1:05
-  Run = Incremental mon-sat at 1:05
-}
-
-# Client (File Services) to backup
-Client {
-  Name = Tibs
-  Address = tibs
-  FDPort = 9102
-  Catalog = MyCatalog
-  Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3"
-  File Retention = 30d                # 30 days
-  Job Retention = 180d                # six months
-  AutoPrune = yes                     # Prune expired Jobs/Files
-  Maximum Concurrent Jobs = 4
-}
-
-Client {
-  Name = localhost-fd
-  Address = localhost
-  FDPort = 8102
-  Catalog = MyCatalog
-  Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc"
-  File Retention = 30d                # 30 days
-  Job Retention = 180d                # six months
-  AutoPrune = yes                     # Prune expired Jobs/Files
-  Maximum Concurrent Jobs = 4
-}
-
-
-# Definition of DDS tape storage device
-Storage {
-  Name = DDS-4
-  Address = 192.168.68.112            # N.B. Use a fully qualified name here
-  SDPort = 8103
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"          # password for Storage daemon
-  Device = DDS-4                      # must be same as Device in Storage daemon
-  Media Type = DDS-4                  # must be same as MediaType in Storage daemon
-  AutoChanger = yes
-  Maximum Concurrent Jobs = 4
-}
-
-
-# Generic catalog service
-Catalog {
-  Name = MyCatalog
-  dbname = bacula; user = bacula; password = ""
-}
-
-# Reasonable message delivery -- send most everything to email address
-#  and to the console
-Messages {
-  Name = Standard
-  mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: %t %e of %c %l\" %r"
-  operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression\) %r\" -s \"Bacula: Intervention needed for %j\" %r"
-  MailOnError = @job_email@ = all, !terminate
-  operator = @job_email@ = mount
-  console = all, !skipped, !terminate, !restored
-#
-# WARNING! the following will create a file that you must cycle from
-#          time to time as it will grow indefinitely. However, it will
-#          also keep all your messages if the scroll off the console.
-#
-  append = "@working_dir@/log" = all, !skipped
-}
-
-#
-# Message delivery for daemon messages (no job).
-Messages {
-  Name = Daemon
-  mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula\) %r\" -s \"Bacula daemon message\" %r"
-  mail = @job_email@ = all, !skipped            
-  console = all, !skipped, !saved
-  append = "@working_dir@/log" = all, !skipped
-}
-
-    
-# Default pool definition
-Pool {
-  Name = Default
-  Pool Type = Backup
-  Recycle = yes                       # Bacula can automatically recycle Volumes
-  AutoPrune = yes                     # Prune expired volumes
-  Volume Retention = 365d             # one year
-  Accept Any Volume = yes             # write on any volume in the pool
-}
diff --git a/regress/scripts/win32-bacula-fd.conf b/regress/scripts/win32-bacula-fd.conf
deleted file mode 100644 (file)
index 115b83d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Default  Bacula File Daemon Configuration file
-#
-#  For Bacula release 1.33
-#
-# There is not much to change here except perhaps the
-# File daemon Name to
-#
-
-#
-# List Directors who are permitted to contact this File daemon
-#
-Director {
-  Name = rufus-dir
-  Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc"
-}
-
-#
-# "Global" File daemon configuration specifications
-#
-FileDaemon {                          # this is me
-  Name = localhost-fd
-  FDport = 8102                  # where we listen for the director
-  WorkingDirectory = "/home/kern/bacula/regress/working"
-  Pid Directory = "/home/kern/bacula/regress/working"
-  SubSys Directory = "/home/kern/bacula/regress/working"
-}
-
-# Send all messages except skipped files back to Director
-Messages {
-  Name = Standard
-  director = rufus-dir = all, !terminate
-}
diff --git a/regress/scripts/win32-bacula-sd-tape.conf b/regress/scripts/win32-bacula-sd-tape.conf
deleted file mode 100644 (file)
index 8589d67..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# Default Bacula Storage Daemon Configuration file
-#
-#  For Bacula release 1.33
-#
-# You may need to change the name of your tape drive
-#   on the "Archive Device" directive in the Device
-#   resource.  If you change the Name and/or the 
-#   "Media Type" in the Device resource, please ensure
-#   that dird.conf has corresponding changes.
-#
-
-Storage {                             # definition of myself
-  Name = localhost-sd
-  SDPort = 8103                  # Director's port      
-  WorkingDirectory = "/home/kern/bacula/regress/working"
-  Pid Directory = "/home/kern/bacula/regress/working"
-  Subsys Directory = "/home/kern/bacula/regress/working"
-}
-
-#
-# List Directors who are permitted to contact Storage daemon
-#
-Director {
-  Name = rufus-dir
-  Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9"
-}
-
-#
-# Devices supported by this Storage daemon
-# To connect, the Director's bacula-dir.conf must have the
-#  same Name and MediaType. 
-#
-
-Device {
-  Name = DDS-4                     # 
-  Media Type = DDS-4
-  Archive Device = /dev/nst0
-  AutomaticMount = yes;               # when device opened, read it
-  AlwaysOpen = yes;
-  RemovableMedia = yes;
-  @/home/kern/bacula/regress/bin/tape_options
-# Maximum File Size = 1000000
-# MaximumVolumeSize = 100M
-}
-
-# 
-# Send all messages to the Director, 
-# mount messages also are sent to the email address
-#
-Messages {
-  Name = Standard
-  director = rufus-dir = all, !terminate
-}
diff --git a/regress/starttime b/regress/starttime
deleted file mode 100755 (executable)
index 5c2bd41..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/python
-from time import time as now 
-
-fn = open('time.out', 'w+')
-fn.write('%s' % now())
-fn.close()
diff --git a/regress/tape b/regress/tape
deleted file mode 100755 (executable)
index 718cefe..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-./all-non-root-tape-tests
diff --git a/regress/tests/.cvsignore b/regress/tests/.cvsignore
deleted file mode 100644 (file)
index 1191247..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-1
-2
diff --git a/regress/tests/2drive-incremental-2disk b/regress/tests/2drive-incremental-2disk
deleted file mode 100755 (executable)
index b61bcd9..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory then create some           
-#   new files, do an Incremental and restore those two files.
-#
-# This script uses the virtual disk autochanger and two drives
-#
-. config.out
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-bin/bacula stop  2>&1 >/dev/null
-cd bin
-./drop_bacula_tables >/dev/null 2>&1
-./make_bacula_tables >/dev/null 2>&1
-./grant_bacula_privileges 2>&1 >/dev/null
-cd ..
-
-scripts/copy-2disk-drive-confs
-scripts/prepare-two-disks
-echo "${cwd}/tmp/build" >/tmp/file-list
-if test ! -d ${cwd}/tmp/build ; then
-   mkdir ${cwd}/tmp/build
-fi
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp
-echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list
-echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list
-cd ${cwd}
-
-# Turn off Prefer Mounted Volumes so we use 2 drives
-outf="tmp/sed_tmp"
-echo "s%# Prefer Mounted Volumes%  Prefer Mounted Volumes%g" >${outf}
-cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1
-# Comment the next line out to write everything to one drive
-#  otherwise, it writes the two jobs to different drives
-sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf
-
-echo " "
-echo " "
-echo " === Starting 2drive-incremental-2disk test ==="
-echo " === Starting 2drive-incremental-2disk test ===" >>working/log
-echo " "
-
-# Write out bconsole commands
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0
-label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=1
-@#setdebug level=100 storage=DDS-4
-run job=NightlySave yes
-run job=NightlySave yes
-run job=NightlySave yes
-run job=NightlySave yes
-run job=NightlySave yes
-@sleep 3
-status storage=DDS-4
-wait
-list volumes
-list jobs
-status storage=DDS-4
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt
-echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-@# Force Incremental on the second Volume
-update volume=TestVolume001 VolStatus=Used
-status storage=DDS-4
-@#setdebug level=400 storage=DDS-4
-run level=Incremental job=NightlySave yes
-wait
-list volumes
-status storage=DDS-4
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores 
-7
-<${cwd}/tmp/restore-list
-
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-#
-# Delete .c files because we will only restored the txt files
-#
-rm -f tmp/build/*.c
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! 2drive-incremental-2disk test Bacula source failed!!! !!!!! "
-   echo "  !!!!! 2drive-incremental-2disk test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== 2drive-incremental-2disk test Bacula source OK ===== "
-   echo "  ===== 2drive-incremental-2disk test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/2drive-incremental-2tape b/regress/tests/2drive-incremental-2tape
deleted file mode 100755 (executable)
index cc33251..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory then create some           
-#   new files, do an Incremental and restore those two files.
-#
-# This script uses the autochanger and two tapes
-#
-. config.out
-if test x${TAPE_DRIVE1} = x/dev/null ; then
-   echo "Skipping 2drive-incremenatal-2tape test. No second drive."
-   exit
-fi
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-bin/bacula stop  2>&1 >/dev/null
-cd bin
-./drop_bacula_tables >/dev/null 2>&1
-./make_bacula_tables >/dev/null 2>&1
-./grant_bacula_privileges 2>&1 >/dev/null
-cd ..
-
-scripts/copy-2drive-confs
-scripts/cleanup-2drive
-echo "${cwd}/tmp/build" >/tmp/file-list
-if test ! -d ${cwd}/tmp/build ; then
-   mkdir ${cwd}/tmp/build
-fi
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp
-echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list
-echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list
-cd ${cwd}
-
-# Turn off Prefer Mounted Volumes so we use 2 drives
-outf="tmp/sed_tmp"
-echo "s%# Prefer Mounted Volumes%  Prefer Mounted Volumes%g" >${outf}
-cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1
-# Comment the next line out to write everything to one drive
-#  otherwise, it writes the two jobs to different drives
-sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf
-
-echo " "
-echo " "
-echo " === Starting 2drive-incremental-2tape test ==="
-echo " === Starting 2drive-incremental-2tape test ===" >>working/log
-echo " "
-
-# Write out bconsole commands
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0
-label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=1
-@#setdebug level=100 storage=DDS-4
-run job=NightlySave yes
-run job=NightlySave yes
-run job=NightlySave yes
-run job=NightlySave yes
-run job=NightlySave yes
-@sleep 3
-status storage=DDS-4
-wait
-list volumes
-list jobs
-status storage=DDS-4
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt
-echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-@# Force Incremental on the second Volume
-update volume=TestVolume001 VolStatus=Used
-status storage=DDS-4
-@#setdebug level=400 storage=DDS-4
-run level=Incremental job=NightlySave yes
-wait
-list volumes
-status storage=DDS-4
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores 
-7
-<${cwd}/tmp/restore-list
-
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-#
-# Delete .c files because we will only restored the txt files
-#
-rm -f tmp/build/*.c
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! 2drive-incremental-2tape test Bacula source failed!!! !!!!! "
-   echo "  !!!!! 2drive-incremental-2tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== 2drive-incremental-2tape test Bacula source OK ===== "
-   echo "  ===== 2drive-incremental-2tape test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/auto-label-test b/regress/tests/auto-label-test
deleted file mode 100755 (executable)
index b507d88..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-#!/bin/sh
-#
-#  Test if Bacula can automatically create a Volume label.
-#
-
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1
-sed "s%# Label Format%  Label Format%" ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf
-
-echo " "
-echo " "
-echo " === Starting auto-label-test at `date +%R:%S` ==="
-echo " === Starting auto-label-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-status all
-status all
-list pools
-messages
-@#setdebug level=400 storage=File
-run job=CompressedTest storage=File yes
-list pools
-list volumes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File
-unmark *
-mark *
-count
-ls *
-dir *
-find Makefile
-pwd
-lsmark
-estimate
-?
-help
-done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! auto-label-test failed!!! !!!!! "
-   echo "  !!!!! auto-label-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== auto-label-test OK ===== "
-   echo "  ===== auto-label-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/backup-bacula-tape b/regress/tests/backup-bacula-tape
deleted file mode 100755 (executable)
index 37c4238..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#   to a tape then restore it, we do that twice to ensure that
-#   we can correctly append to a tape.
-# We also use the purge and the relabel commands as
-#   well as a pile of status storage commands.
-#
-debug=0 
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting Backup Bacula tape test at `date +%R:%S` ==="
-echo " === Starting Backup Bacula tape test at `date +%R:%S` ===" >>working/log
-echo " "
-
-# Write out bconsole commands
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-purge volume=TestVolume001
-relabel pool=Default storage=DDS-4 oldVolume=TestVolume001 volume=TestVolume002 slot=0
-purge volume=TestVolume002
-relabel pool=Default storage=DDS-4 oldVolume=TestVolume002 volume=TestVolume001 slot=0
-run job=NightlySave yes
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-@sleep 1
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-@sleep 1
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-@sleep 1
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-@sleep 1
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-status storage=DDS-4
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-list volumes
-messages
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-bin/bacula stop 2>&1 >/dev/null
-#
-# Now do a second backup after making a few changes
-#
-touch ${cwd}/build/src/dird/*.c
-echo "test test" > ${cwd}/build/src/dird/xxx
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-list volumes
-run job=NightlySave yes
-wait
-list volumes
-messages
-@# 
-@# now do a second restore
-@#
-@$out tmp/log2.out
-list volumes
-restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-list volumes
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-scripts/check_for_zombie_jobs storage=DDS-4
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Backup Bacula tape test failed!!! !!!!! "
-   echo "  !!!!! Backup Bacula tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Backup Bacula tape test OK ===== "
-   echo "  ===== Backup Bacula tape test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/backup-bacula-test b/regress/tests/backup-bacula-test
deleted file mode 100755 (executable)
index 0943efe..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory
-#   then restore it.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-confs
-scripts/cleanup
-
-echo " "
-echo " "
-echo " === Starting Backup Bacula Test at `date +%R:%S` ==="
-echo " === Starting Backup Bacula Test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label volume=TestVolume001
-@#setdebug level=100 storage=File
-run job=Client1 yes
-status storage=File
-status storage=File
-status storage=File
-status storage=File
-status storage=File
-status storage=File
-sleep 1
-status storage=File
-status storage=File
-status storage=File
-status storage=File
-status storage=File
-sleep 1
-status storage=File
-status storage=File
-status storage=File
-status storage=File
-status storage=File
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out  
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Backup Bacula Test failed!!! !!!!! "
-   echo "  !!!!! Backup Bacula Test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== Backup Bacula Test OK ===== "
-   echo "  ===== Backup Bacula Test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/backup-win32-tape b/regress/tests/backup-win32-tape
deleted file mode 100755 (executable)
index 3723b53..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#   to a tape then restore it, we do that twice to ensure that
-#   we can correctly append to a tape.
-#
-cwd=`pwd`
-scripts/copy-win32-confs
-scripts/cleanup-tape
-
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting Backup Win32 tape test at `date +%R:%S` ==="
-echo " === Starting Backup Win32 tape test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA
-@output /dev/null
-messages
-@tee tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-run job=NightlySave yes
-@sleep 10
-status storage=DDS-4
-@sleep 30
-messages
-wait
-messages
-@# 
-@# now do a restore
-@#
-@#output tmp/log2.out
-@#restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-@#yes
-@#wait
-@#messages
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=DDS-4
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-if [ $bstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Backup Win32 tape test failed!!! !!!!! "
-   echo "  !!!!! Backup Win32 tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Backup Win32 tape test OK ===== "
-   echo "  ===== Backup Win32 tape test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/bextract-test b/regress/tests/bextract-test
deleted file mode 100755 (executable)
index b0626da..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory but 
-#   split the archive into two volumes, then build a BSR with
-#   the restore command and use bextract to restore the files.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting bextract-test at `date +%R:%S` ==="
-echo " === Starting bextract-test at `date +%R:%S` ===" >working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=File1 volume=TestVolume001
-label storage=File1 volume=TestVolume002
-update Volume=TestVolume001 MaxVolBytes=3000000
-run job=NightlySave storage=File1 yes
-wait
-messages
-@# 
-@# now build the bsr file
-@#
-@$out tmp/log2.out
-restore bootstrap=${cwd}/working/restore.bsr where=${cwd}/tmp/bacula-restores select all storage=File1 done
-no
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File1
-bin/bacula stop 2>&1 >/dev/null
-mkdir -p ${cwd}/tmp/bacula-restores
-exit
-bin/bextract -b working/restore.bsr -c bin/bacula-sd.conf ${cwd}/tmp ${cwd}/tmp/bacula-restores 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-diff -r build  tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! bextract-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! bextract-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== bextract-test Bacula source OK ===== "
-   echo "  ===== bextract-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/bscan-tape b/regress/tests/bscan-tape
deleted file mode 100755 (executable)
index 5225103..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the compressed option
-#   then backup four times, each with incremental then 
-#   do a bscan and restore.
-#   It should require at least 4 different bsrs.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "${cwd}/build" >/tmp/file-list
-
-cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-sed "s%# Maximum File Size%  Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-
-echo " "
-echo " "
-echo " === Starting bscan-tape at `date +%R:%S` ==="
-echo " === Starting bscan-tape at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-estimate job=NightlySave listing
-estimate job=NightlySave listing
-estimate job=NightlySave listing
-messages
-@$out tmp/log1.out
-setdebug level=2 storage=DDS-4
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-run job=NightlySave yes
-wait
-run job=NightlySave level=Full yes
-wait
-run job=NightlySave level=Full yes
-wait
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-scripts/check_for_zombie_jobs storage=DDS-4
-echo "Backup 1 done"
-# make some files for the incremental to pick up
-touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o
-touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
-   
-#
-# run a second job
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-run job=NightlySave level=Incremental yes
-wait
-messages
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-echo "Backup 2 done"
-touch ${cwd}/build/src/dird/*.c
-touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
-#
-# run a third job
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-run job=NightlySave level=Incremental yes
-wait
-messages
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-echo "Backup 3 done"
-# make some files for the incremental to pick up
-touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
-#echo "abc" > ${cwd}/build/src/lib/dummy
-#
-# run a fourth job
-#
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-run job=NightlySave level=Incremental yes
-wait
-messages
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-echo "Backup 4 done"
-#
-# now drop and recreate the database
-#
-cd bin
-./drop_bacula_tables >/dev/null 2>&1
-./make_bacula_tables >/dev/null 2>&1
-./grant_bacula_privileges 2>&1 >/dev/null
-cd ..
-
-bin/bacula stop 2>&1 >/dev/null
-echo "volume=TestVolume001" >tmp/bscan.bsr
-bin/bscan -w working -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf DDS-4 2>&1 >/dev/null
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@$out /dev/null
-messages
-@$out tmp/log2.out
-@# 
-@# now do a restore
-@#
-restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=DDS-4
-rm -f  ${cwd}/build/src/lib/dummy
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! bscan-tape Bacula source failed!!! !!!!! "
-   echo "  !!!!! bscan-tape failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== bscan-tape Bacula source OK ===== "
-   echo "  ===== bscan-tape OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/bscan-test b/regress/tests/bscan-test
deleted file mode 100755 (executable)
index 3e854da..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory but 
-#   split the archive into two volumes then bscan it
-#   into the catalog after the backup. It also to a limited
-#   extent tests the purge volume and delete volume commands.
-#
-
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting bscan-test at `date +%R:%S` ==="
-echo " === Starting bscan-test at `date +%R:%S` ===" >working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=File1
-TestVolume001
-label storage=File1
-TestVolume002
-update Volume=TestVolume001 MaxVolBytes=3000000
-run job=NightlySave storage=File1
-yes
-wait
-messages
-@$out /dev/null
-@#
-@# now purge the Volume
-@#
-purge volume=TestVolume001
-purge volume=TestVolume002
-delete volume=TestVolume001
-yes
-delete volume=TestVolume002
-yes
-messages
-quit
-END_OF_DATA
-
-# run backup
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File1
-bin/bacula stop 2>&1 >/dev/null
-echo "volume=TestVolume001|TestVolume002" >tmp/bscan.bsr
-
-if test "$debug" -eq 1 ; then
-  bin/bscan -w working -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf ${cwd}/tmp
-else
-  bin/bscan -w working -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf ${cwd}/tmp 2>&1 >/dev/null
-fi
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log2.out
-@# 
-@# now do a restore
-@#
-@#setdebug level=400 storage=File1
-restore bootstrap=${cwd}/tmp/kern.bsr where=${cwd}/tmp/bacula-restores select all storage=File1 done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-# now run restore
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-
-scripts/check_for_zombie_jobs storage=File1
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build  tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! bscan-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! bscan-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== bscan-test Bacula source OK ===== "
-   echo "  ===== bscan-test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/bsr-opt-test b/regress/tests/bsr-opt-test
deleted file mode 100755 (executable)
index e2bf556..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory but 
-#   split the archive into two volumes, then restore
-#   files on only one of the volumes and ensure that
-#   the other volume is not used.  I.e. bsr optimization
-#   works.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting bsr-opt-test at `date +%R:%S` ==="
-echo " === Starting bsr-opt-test at `date +%R:%S` ===" >working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=File1 volume=TestVolume001
-label storage=File1 volume=TestVolume002
-update Volume=TestVolume001 MaxVolBytes=3000000
-run job=NightlySave storage=File1 yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore bootstrap=${cwd}/working/restore.bsr where=${cwd}/tmp/bacula-restores select storage=File1
-unmark *
-cd ${cwd}/build/src/cats
-mark *
-ls
-done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File1
-bin/bacula stop 2>&1 >/dev/null
-#
-# This test is not really reliable. What we want to do is
-#   to select files on only one Volume, then insure here
-#   that only one Volume is chosen.
-#
-grep TestVolume002 working/restore.bsr 2>&1 >/dev/null
-bsrstat=$?
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build/src/cats  tmp/bacula-restores${cwd}/build/src/cats 2>&1 >/dev/null
-if [ $? != 0 -o $bsrstat != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! bsr-opt-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! bsr-opt-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   elif [ $bsrstat != 0 ] ; then
-      echo "  !!!!! Volume selection error         !!!!! "
-      echo "  !!!!! Volume selection error         !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== bsr-opt-test Bacula source OK ===== "
-   echo "  ===== bsr-opt-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/btape-fill-full-tape b/regress/tests/btape-fill-full-tape
deleted file mode 100755 (executable)
index c61e5dd..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-#
-# Test the fill command in btape
-#
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-
-echo " "
-echo " "
-echo " === Starting btape fill test at `date +%R:%S` ==="
-echo " === Starting btape fill test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/btape -c bin/bacula-sd.conf DDS-4 <<END_OF_DATA 2>&1 >tmp/log1.out
-fill
-s
-
-quit
-END_OF_DATA
-
-
-grep "^The last block on the tape matches\. Test succeeded\." tmp/log1.out 2>&1 >/dev/null
-if [ $? != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! btape fill test failed!!! !!!!! "
-   echo "  !!!!! btape fill test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== btape fill test OK ===== "
-   echo "  ===== btape fill test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/btape-fill-tape b/regress/tests/btape-fill-tape
deleted file mode 100755 (executable)
index c97fd11..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-#
-# Test the fill command in btape
-#
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-
-echo "${cwd}/build" >/tmp/file-list
-
-cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-sed "s%# MaximumVolumeSize%  MaximumVolumeSize%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-
-echo " "
-echo " "
-echo " === Starting btape fill test at `date +%R:%S` ==="
-echo " === Starting btape fill test at `date +%R:%S` ===" >>working/log
-echo " "
-exit
-bin/btape -c bin/bacula-sd.conf DDS-4 <<END_OF_DATA 2>&1 >tmp/log1.out
-fill
-s
-
-quit
-END_OF_DATA
-
-
-grep "^The last block on the tape matches\. Test succeeded\." tmp/log1.out 2>&1 >/dev/null
-if [ $? != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! btape fill test failed!!! !!!!! "
-   echo "  !!!!! btape fill test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== btape fill test OK ===== "
-   echo "  ===== btape fill test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/compressed-test b/regress/tests/compressed-test
deleted file mode 100755 (executable)
index c373a58..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the compressed option
-#   then restore it.
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting compressed-test at `date +%R:%S` ==="
-echo " === Starting compressed-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-exit
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@tee /dev/null
-status all
-status all
-messages
-@tee tmp/log1.out
-label storage=File volume=TestVolume001
-run job=CompressedTest storage=File yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@tee tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File
-unmark *
-mark *
-done
-yes
-wait
-messages
-@tee
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! compressed-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! compressed-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== compressed-test Bacula source OK ===== "
-   echo "  ===== compressed-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/concurrent-jobs-test b/regress/tests/concurrent-jobs-test
deleted file mode 100755 (executable)
index dafddc5..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/bin/sh
-#
-# Run two jobs at the same time
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/tmp/largefile" >/tmp/file-list
-if test -c /dev/urandom ; then
-# Create 56MB file with random data
-   echo "Creating a 56MB file with random data ..."
-   dd if=/dev/urandom of=${cwd}/tmp/largefile bs=1024 count=55000
-else
-   echo "Creating a 56MB file with bacula-dir data ..."
-   dd if=bin/bacula-dir of=${cwd}/tmp/1 bs=1024 count=1000
-   cat ${cwd}/tmp/1 ${cwd}/tmp/1 ${cwd}/tmp/1 ${cwd}/tmp/1 ${cwd}/tmp/1 >${cwd}/tmp/2
-   rm -f ${cwd}/tmp/1
-   cat ${cwd}/tmp/2 ${cwd}/tmp/2 ${cwd}/tmp/2 ${cwd}/tmp/2 ${cwd}/tmp/2 >>${cwd}/tmp/3
-   rm -f ${cwd}/tmp/2
-   cat ${cwd}/tmp/3 ${cwd}/tmp/3 ${cwd}/tmp/3 ${cwd}/tmp/3 ${cwd}/tmp/3 >${cwd}/tmp/largefile
-   rm -f ${cwd}/tmp/3
-fi 
-
-echo "largefile created"
-
-echo " "
-echo " "
-echo " === Starting concurrent-jobs-test at `date +%R:%S` ==="
-echo " === Starting concurrent-jobs-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-run job=CompressedTest level=Full yes
-run job=CompressedTest level=Full yes
-run job=CompressedTest level=Full yes
-run job=CompressedTest level=Full yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File
-unmark *
-mark *
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff tmp/largefile  tmp/bacula-restores${cwd}/tmp/largefile 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! concurrent-jobs-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! concurrent-jobs-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== concurrent-jobs-test Bacula source OK ===== "
-   echo "  ===== concurrent-jobs-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/dev-test-root b/regress/tests/dev-test-root
deleted file mode 100755 (executable)
index a032875..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory
-#   then restore it.
-#
-MUID=`/usr/bin/id -u`
-if [ $MUID != 0 ] ; then
-   echo " "
-   echo "You must be root to run this test."
-   echo "  ===== !!!! dev-test-root not run !!!! ===== "
-   echo "  ===== !!!! dev-test-root not run !!!! ===== " >>test.out
-   echo " "
-   exit 1
-fi
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "/dev" >/tmp/file-list
-
-echo " "
-echo " "
-echo " ===     Starting dev-test-root test       ==="
-echo " "
-echo " ===  Note, this test can fail for trivial ==="
-echo " ===  reasons on non-Linux systems.        ==="
-echo " "
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-bin/bacula stop 2>&1 >/dev/null
-cd /
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test dev >${cwd}/tmp/original
-cd ${cwd}/tmp/bacula-restores
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test dev >${cwd}/tmp/restored
-cd ${cwd}/tmp
-#
-# Use sed to cut out parts that *always* change
-#
-cat >sed.scr <<END_OF_DATA
-s%.*dev$%dev%
-s%.*[0-9][0-9]:[0-9][0-9]:[0-9][0-9] dev/ptmx%dev/ptmx%
-s%.*[0-9][0-9]:[0-9][0-9]:[0-9][0-9] dev/ttyp1%dev/ttyp1%
-s%.*[0-9][0-9]:[0-9][0-9]:[0-9][0-9] dev/null%dev/null%
-END_OF_DATA
-
-# strip file system change messages then sed and sort
-grep -v "Skip: File system change prohibited." original >1
-sed -f sed.scr 1 | sort >original
-#
-mv -f restored 1
-sed -f sed.scr 1 | sort >restored
-rm -f sed.scr
-#
-cd ${cwd}
-diff tmp/original tmp/restored 2>&1 1>/dev/null
-if [ $? != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  ===== !!!! dev-test-root failed !!!! ===== "
-   echo "  ===== !!!! dev-test-root failed !!!! ===== " >>test.out
-   echo " "
-else
-   echo "  ===== dev-test-root OK ===== "
-   echo "  ===== dev-test-root OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/differential-test b/regress/tests/differential-test
deleted file mode 100755 (executable)
index 3182e98..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory then create some           
-#   new files, do a differential and restore those two files.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/tmp/build" >/tmp/file-list
-mkdir ${cwd}/tmp/build
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp
-echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list
-echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list
-cd ${cwd}
-
-echo " "
-echo " "
-echo " === Starting differential-test at `date +%R:%S` ==="
-echo " === Starting differential-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=File volume=TestVolume002
-label storage=File volume=TestVolume001
-run job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt
-echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-@# Force differential on the second Volume
-update volume=TestVolume002 VolStatus=Used
-run level=differential job=CompressedTest yes
-wait
-messages
-@$out
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-run level=incremental job=CompressedTest yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores storage=File file=<${cwd}/tmp/restore-list
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-#
-# Delete .c files because we will only restore the txt files
-#
-rm -f tmp/build/*.c
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! differential-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! differential-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== differential-test Bacula source OK ===== "
-   echo "  ===== differential-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/eot-fail-tape b/regress/tests/eot-fail-tape
deleted file mode 100755 (executable)
index 049b745..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#  to two tapes where the maximum tape file size is set to 1M
-#
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "${cwd}/build" >/tmp/file-list
-
-out="tmp/sed_tmp"
-echo "s%# Maximum File Size%  Maximum File Size%g" >${out}
-cp -f ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-sed -f ${out} ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-
-echo " "
-echo " "
-echo " === Starting eot-fail-tape test at `date +%R:%S` ==="
-echo " === Starting eot-fail-tape test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start -d100
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@tee /dev/null
-messages
-@tee tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-update Volume=TestVolume001 MaxVolBytes=3000000
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@tee tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-messages
-@tee
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=DDS-4
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! eot-fail-tape test Bacula source failed!!! !!!!! "
-   echo "  !!!!! eot-fail-tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== eot-fail-tape test Bacula source OK ===== "
-   echo "  ===== eot-fail-tape test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/etc-test-root b/regress/tests/etc-test-root
deleted file mode 100755 (executable)
index 859745e..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory
-#   then restore it.
-#
-MUID=`/usr/bin/id -u`
-if [ $MUID != 0 ] ; then
-   echo " "
-   echo "You must be root to run this test."
-   echo "  ===== !!!! etc-test-root not run !!!! ===== "
-   echo "  ===== !!!! etc-test-root not run !!!! ===== " >>test.out
-   echo " "
-   exit 1
-fi
-echo " "
-echo " "
-echo " === Starting /etc save/restore test ==="
-echo " "
-echo " "
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "/etc" >/tmp/file-list
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File
-TestVolume001
-run job=NightlySave
-yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select    
-unmark *
-mark *
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-bin/bacula stop 2>&1 >/dev/null
-cd /
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test etc >${cwd}/tmp/1       
-cd ${cwd}/tmp/bacula-restores
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test etc >${cwd}/tmp/2
-sort <${cwd}/tmp/1 >${cwd}/tmp/original
-sort <${cwd}/tmp/2 >${cwd}/tmp/restored
-rm -f ${cwd}/tmp/1 ${cwd}/tmp/2
-cd ${cwd}
-diff tmp/original tmp/restored 2>&1 1>/dev/null
-if [ $? != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  ===== !!!! etc-test-root failed !!!! ===== "
-   echo "  ===== !!!! etc-test-root failed !!!! ===== " >>test.out
-   echo " "
-else
-   echo "  ===== etc-test-root OK ===== "
-   echo "  ===== etc-test-root OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/filed-crypto-test b/regress/tests/filed-crypto-test
deleted file mode 100755 (executable)
index 8cf9eb3..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup (with encryption) of the Bacula build directory
-#   then verify the signatures.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-crypto-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting Filed Encryption Test at `date +%R:%S` ==="
-echo " === Starting Filed Encryption Test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-setdebug level=1 storage=File sd
-label storage=File volume=TestVolume001
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores storage=File
-5
-mark *
-
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-sleep 2
-scripts/check_for_zombie_jobs storage=File 
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Filed Encryption Verification failed!!! !!!!! "
-   echo "  !!!!! Filed Encryption Verification failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== Filed Encryption Verification Test OK ===== "
-   echo "  ===== Filed Encryption Verification Test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/fixed-block-size-tape b/regress/tests/fixed-block-size-tape
deleted file mode 100755 (executable)
index 6998216..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#   to a tape where we set the minimum and maximum block
-#   sizes.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "${cwd}/build" >/tmp/file-list
-
-cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-echo "s%# Maximum Block Size%  Maximum Block Size%" >${cwd}/tmp/2
-echo "s%# Minimum Block Size%  Minimum Block Size%" >>${cwd}/tmp/2
-sed -f ${cwd}/tmp/2 ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-if [ $? != 0 ] ; then
-   echo " "
-   echo " "
-   echo "!!!! sed problem in Fixed Block Size test !!!!!"
-   echo " "
-   exit 1
-fi
-rm -f ${cwd}/tmp/1 ${cwd}/tmp/2
-
-echo " "
-echo " "
-echo " === Starting Fixed Block Size test at `date +%R:%S` ==="
-echo " === Starting Fixed Block Size test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=DDS-4
-unmark *
-mark *
-done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-scripts/check_for_zombie_jobs storage=DDS-4
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Fixed Block Size test Bacula source failed!!! !!!!! "
-   echo "  !!!!! Fixed Block Size test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Fixed Block Size test Bacula source OK ===== "
-   echo "  ===== Fixed Block Size test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/four-concurrent-jobs-tape b/regress/tests/four-concurrent-jobs-tape
deleted file mode 100755 (executable)
index 8dcf0d8..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/bin/sh
-#
-# Run two jobs at the same time
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting four-concurrent-jobs-tape at `date +%R:%S` ==="
-echo " === Starting four-concurrent-jobs-tape at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-run job=NightlySave level=Full Storage=DDS-4 yes
-run job=NightlySave level=Full Storage=DDS-4 yes
-run job=NightlySave level=Full Storage=DDS-4 yes
-run job=NightlySave level=Full Storage=DDS-4 yes
-@sleep 2
-status dir
-@sleep 5
-status dir
-status storage=DDS-4
-messages
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=DDS-4
-unmark *
-mark *
-done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! four-concurrent-jobs-tape Bacula source failed!!! !!!!! "
-   echo "  !!!!! four-concurrent-jobs-tape failed!!! !!!!! " >>test.out
-   echo " "
-   exit 1
-else
-   echo "  ===== four-concurrent-jobs-tape Bacula source OK ===== "
-   echo "  ===== four-concurrent-jobs-tape OK ===== " >>test.out
-   scripts/cleanup
-   exit 0
-fi
diff --git a/regress/tests/four-concurrent-jobs-test b/regress/tests/four-concurrent-jobs-test
deleted file mode 100755 (executable)
index 95d1368..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/bin/sh
-#
-# Run two jobs at the same time
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting four-concurrent-jobs-test at `date +%R:%S` ==="
-echo " === Starting four-concurrent-jobs-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File1
-TestVolume001
-label storage=File1
-TestVolume002
-update Volume=TestVolume001 MaxVolBytes=100000000
-@#50000000
-@#12
-run job=NightlySave level=Full Storage=File1
-yes
-reload
-run job=NightlySave level=Full Storage=File1
-yes
-reload
-run job=NightlySave level=Full Storage=File1
-yes
-reload
-run job=NightlySave level=Full Storage=File1
-yes
-reload
-reload
-reload
-reload
-@sleep 2
-status dir
-reload
-@sleep 5
-messages
-reload
-reload
-wait
-reload
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File1
-unmark *
-mark *
-done
-yes
-wait
-reload
-reload
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File1
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! four-concurrent-jobs-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! four-concurrent-jobs-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-   exit 1
-else
-   echo "  ===== four-concurrent-jobs-test Bacula source OK ===== "
-   echo "  ===== four-concurrent-jobs-test OK ===== " >>test.out
-#  scripts/cleanup
-   exit 0
-fi
diff --git a/regress/tests/four-jobs-tape b/regress/tests/four-jobs-tape
deleted file mode 100755 (executable)
index 92e2e95..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the compressed option
-#   then backup four times, each with incremental then finally restore.
-#   It should require at least 4 different bsrs.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting four-jobs-tape at `date +%R:%S` ==="
-echo " === Starting four-jobs-tape at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-estimate job=NightlySave listing
-estimate job=NightlySave listing
-estimate job=NightlySave listing
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-run job=NightlySave yes
-wait
-messages
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-echo "Backup 1 done"
-# make some files for the incremental to pick up
-touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o
-touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
-   
-#
-# run a second job
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-run job=NightlySave level=Incremental yes
-wait
-messages
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-echo "Backup 2 done"
-touch ${cwd}/build/src/dird/*.c
-touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
-#
-# run a third job
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-run job=NightlySave level=Incremental yes
-wait
-messages
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-echo "Backup 3 done"
-# make some files for the incremental to pick up
-touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
-#
-# run a fourth job
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-run job=NightlySave level=Incremental yes
-wait
-messages
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-echo "Backup 4 done"
-# 
-# now do several restores to ensure we cleanup between jobs
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-wait
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-wait
-@$out tmp/log2.out
-@#
-@# now unmount the tape and start two restores
-@#  at the same time
-@#
-unmount storage=DDS-4
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-restore where=${cwd}/tmp/bacula-restores select
-unmark *
-mark *
-done
-yes
-mount storage=DDS-4
-wait
-messages
-@$out
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! four-jobs-tape Bacula source failed!!! !!!!! "
-   echo "  !!!!! four-jobs-tape failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== four-jobs-tape Bacula source OK ===== "
-   echo "  ===== four-jobs-tape OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/four-jobs-test b/regress/tests/four-jobs-test
deleted file mode 100755 (executable)
index 828cc7c..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the compressed option
-#   then backup four times, each with incremental then finally restore.
-#   It should require at least 4 different bsrs.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting four-jobs-test at `date +%R:%S` ==="
-echo " === Starting four-jobs-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-estimate job=CompressedTest listing
-estimate job=CompressedTest listing
-estimate job=CompressedTest listing
-messages
-@$out tmp/log1.out
-label storage=File volume=TestVolume001
-run job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-echo "Backup 1 done"
-# make some files for the incremental to pick up
-touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o
-touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
-   
-#
-# run a second job
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out  tmp/log1.out
-run job=CompressedTest
-yes
-wait
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-echo "Backup 2 done"
-touch ${cwd}/build/src/dird/*.c
-touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
-#
-# run a third job
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-run job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-echo "Backup 3 done"
-# make some files for the incremental to pick up
-touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
-#
-# run a fourth job
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-run job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-echo "Backup 4 done"
-# 
-# now do several restores to ensure we cleanup between jobs
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-restore where=${cwd}/tmp/bacula-restores select all storage=File done
-yes
-wait
-restore where=${cwd}/tmp/bacula-restores select all storage=File done
-yes
-wait
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File
-unmark *
-mark *
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! four-jobs-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! four-jobs-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== four-jobs-test Bacula source OK ===== "
-   echo "  ===== four-jobs-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/incremental-2disk b/regress/tests/incremental-2disk
deleted file mode 100755 (executable)
index c888635..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory then create some           
-#   new files, do an Incremental and restore those two files.
-#
-# This script uses the virtual disk autochanger
-#
-. config.out
-if test x${AUTOCHANGER} = x/dev/null ; then
-   echo "incremental-2disk test skipped. No autochanger."
-   exit
-fi
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-bin/bacula stop  2>&1 >/dev/null
-cd bin
-./drop_bacula_tables >/dev/null 2>&1
-./make_bacula_tables >/dev/null 2>&1
-./grant_bacula_privileges 2>&1 >/dev/null
-cd ..
-
-scripts/copy-2disk-confs
-scripts/prepare-two-disks
-
-echo "${cwd}/tmp/build" >/tmp/file-list
-if test ! -d ${cwd}/tmp/build ; then
-   mkdir ${cwd}/tmp/build
-fi
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp
-echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list
-echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list
-cd ${cwd}
-
-echo " "
-echo " "
-echo " === Starting incremental-2disk test ==="
-echo " === Starting incremental-2disk test ===" >>working/log
-echo " "
-
-# Write out bconsole commands
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0
-label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=0
-run job=NightlySave yes
-wait
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt
-echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA
-@$out /dev/null
-messages
-@$out tmp/log1.out
-@# Force Incremental on the second Volume
-update volume=TestVolume001 VolStatus=Used
-run level=Incremental job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores 
-7
-<${cwd}/tmp/restore-list
-
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-#
-# Delete .c files because we will only restored the txt files
-#
-rm -f tmp/build/*.c
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! incremental-2disk test Bacula source failed!!! !!!!! "
-   echo "  !!!!! incremental-2disk test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== incremental-2disk test Bacula source OK ===== "
-   echo "  ===== incremental-2disk test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/incremental-2tape b/regress/tests/incremental-2tape
deleted file mode 100755 (executable)
index 1ee97cd..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory then create some           
-#   new files, do an Incremental and restore those two files.
-#
-# This script uses the autochanger and two tapes
-#
-. config.out
-if test x${AUTOCHANGER} = x/dev/null ; then
-   echo "incremental-2tape test skipped. No autochanger."
-   exit
-fi
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-bin/bacula stop  2>&1 >/dev/null
-cd bin
-./drop_bacula_tables >/dev/null 2>&1
-./make_bacula_tables >/dev/null 2>&1
-./grant_bacula_privileges 2>&1 >/dev/null
-cd ..
-
-scripts/copy-2tape-confs
-scripts/cleanup-2tape
-echo "${cwd}/tmp/build" >/tmp/file-list
-if test ! -d ${cwd}/tmp/build ; then
-   mkdir ${cwd}/tmp/build
-fi
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp
-echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list
-echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list
-cd ${cwd}
-
-echo " "
-echo " "
-echo " === Starting incremental-2tape test ==="
-echo " === Starting incremental-2tape test ===" >>working/log
-echo " "
-
-# Write out bconsole commands
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0
-label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=0
-run job=NightlySave yes
-wait
-messages
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt
-echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA
-@$out /dev/null
-messages
-@$out tmp/log1.out
-@# Force Incremental on the second Volume
-update volume=TestVolume001 VolStatus=Used
-run level=Incremental job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores 
-7
-<${cwd}/tmp/restore-list
-
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-#
-# Delete .c files because we will only restored the txt files
-#
-rm -f tmp/build/*.c
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! incremental-2tape test Bacula source failed!!! !!!!! "
-   echo "  !!!!! incremental-2tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== incremental-2tape test Bacula source OK ===== "
-   echo "  ===== incremental-2tape test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/incremental-tape b/regress/tests/incremental-tape
deleted file mode 100755 (executable)
index 4b827d7..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory then create some           
-#   new files, do an Incremental and restore those two files.
-#
-cwd=`pwd`
-
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "${cwd}/tmp/build" >/tmp/file-list
-if test ! -d ${cwd}/tmp/build ; then
-   mkdir ${cwd}/tmp/build
-fi
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp
-echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list
-echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list
-cd ${cwd}
-
-echo " "
-echo " "
-echo " === Starting incremental-tape test at `date +%R:%S` ==="
-echo " === Starting incremental-tape test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-run job=NightlySave yes
-wait
-messages
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=DDS-4
-echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt
-echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run level=Incremental job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores storage=DDS-4
-7
-<${cwd}/tmp/restore-list
-
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=DDS-4
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-#
-# Delete .c files because we will only restored the txt files
-#
-rm -f tmp/build/*.c
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! incremental-tape test Bacula source failed!!! !!!!! "
-   echo "  !!!!! incremental-tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== incremental-tape test Bacula source OK ===== "
-   echo "  ===== incremental-tape test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/incremental-test b/regress/tests/incremental-test
deleted file mode 100755 (executable)
index b7345e9..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory then create some           
-#   new files, do an Incremental and restore those two files.
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/tmp/build" >/tmp/file-list
-mkdir ${cwd}/tmp/build
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp
-echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list
-echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list
-cd ${cwd}
-
-echo " "
-echo " "
-echo " === Starting incremental-test at `date +%R:%S` ==="
-echo " === Starting incremental-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-label storage=File volume=TestVolume002
-run job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-#
-# Now create two new files to be restored later
-#
-sleep 1
-echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt
-cp -f ${cwd}/tmp/build/dird.c ${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-@# Force Incremental on the second Volume
-update volume=TestVolume001 VolStatus=Used
-run level=Differential job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-sleep 1
-touch ${cwd}/tmp/build/ficheriro1.txt
-touch ${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run level=Incremental job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-sleep 1
-cd ${cwd}/tmp/build
-cp -f ficheriro2.txt 1
-sed "s%a%b%g" 1 >ficheriro2.txt
-rm -f 1
-cd ${cwd}
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run level=Differential job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-sleep 1
-touch ${cwd}/tmp/build/ficheriro1.txt
-touch ${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run level=Incremental job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-sleep 1
-touch ${cwd}/tmp/build/ficheriro1.txt
-touch ${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run level=Incremental job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-sleep 1
-touch ${cwd}/tmp/build/ficheriro1.txt
-touch ${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run level=Incremental job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-sleep 1
-touch ${cwd}/tmp/build/ficheriro1.txt
-touch ${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run level=Incremental job=CompressedTest yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores storage=File file=<${cwd}/tmp/restore-list
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-#
-# Delete .c files because we will only restored the txt files
-#
-rm -f tmp/build/*.c
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! incremental-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! incremental-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== incremental-test Bacula source OK ===== "
-   echo "  ===== incremental-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/lib-tape-root b/regress/tests/lib-tape-root
deleted file mode 100755 (executable)
index 8701602..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the /lib directory
-#   then restore it.
-#
-cwd=`pwd`
-bin/bacula stop 2>&1 >/dev/null
-cd bin
-./drop_bacula_tables >/dev/null 2>&1
-./make_bacula_tables >/dev/null 2>&1
-./grant_bacula_privileges 2>&1 >/dev/null
-cd ..
-
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "/lib" >/tmp/file-list
-echo " "
-echo " "
-echo " === Starting lib-tape-root test ==="
-echo " "
-echo " "
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=DDS-4 Volume=TestVolume001 slot=0
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-bin/bacula stop 2>&1 >/dev/null
-cd /
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/original
-cd ${cwd}/tmp/bacula-restores
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/restored
-cd ${cwd}/tmp
-sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% original >1
-sort <1 >original
-#
-sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% restored >1
-sort <1 >restored
-rm -f 1
-#
-cd ${cwd}
-diff tmp/original tmp/restored 2>&1 1>/dev/nul
-if [ $? != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  ===== lib-tape-root failed!!! ===== "
-   echo "  ===== lib-tape-root failed!!! ===== " >>test.out
-   echo " "
-else
-   echo "  ===== lib-tape-root OK ===== "
-   echo "  ===== lib-tape-root OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/lib-test-root b/regress/tests/lib-test-root
deleted file mode 100755 (executable)
index 7efeb34..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory
-#   then restore it.
-#
-MUID=`/usr/bin/id -u`
-if [ $MUID != 0 ] ; then
-   echo " "
-   echo "You must be root to run this test."
-   echo "  ===== !!!! lib-test-root not run !!!! ===== "
-   echo "  ===== !!!! lib-test-root not run !!!! ===== " >>test.out
-   echo " "
-   exit 1
-fi
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "/lib" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting /lib save/restore test ==="
-echo " "
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File
-TestVolume001
-run job=NightlySave
-yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select    
-unmark *
-mark *
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-bin/bacula stop 2>&1 >/dev/null
-cd /
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-lib-test lib >${cwd}/tmp/original
-cd ${cwd}/tmp/bacula-restores
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-lib-test lib >${cwd}/tmp/restored
-cd ${cwd}/tmp
-sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% original >1
-sort <1 >original
-#
-sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% restored >1
-sort <1 >restored
-rm -f 1
-#
-cd ${cwd}
-diff tmp/original tmp/restored 2>&1 1>/dev/nul
-if [ $? != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  ===== !!!! lib-test-root failed !!!! ===== "
-   echo "  ===== !!!! lib-test-root failed !!!! ===== " >>test.out
-   echo " "
-else
-   echo "  ===== lib-test-root OK ===== "
-   echo "  ===== lib-test-root OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/query-test b/regress/tests/query-test
deleted file mode 100755 (executable)
index 20c459e..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory then create some           
-#   new files, do a Decremental then a bunch of query commands
-#   and finally restore the two files.
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/tmp/build" >/tmp/file-list
-mkdir ${cwd}/tmp/build
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp
-echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list
-echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list
-cd ${cwd}
-
-echo " "
-echo " "
-echo " === Starting query-test at `date +%R:%S` ==="
-echo " === Starting query-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-label storage=File volume=TestVolume002
-run job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt
-echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-@# Force decremental on the second Volume
-update volume=TestVolume001 VolStatus=Used
-run level=decremental job=CompressedTest yes
-wait
-messages
-@output
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run level=incremental job=CompressedTest yes
-wait
-messages
-@#
-@# Now do the queries
-@#
-query
-1
-query
-2
-ficheriro1.txt
-query
-3
-${cwd}/tmp/build/
-ficheriro1.txt
-Client1
-query
-7
-TestVolume001
-query
-8
-1
-query
-9
-Client1
-query
-10
-Default
-query
-11
-query
-12
-query
-13
-1
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores storage=File file=<${cwd}/tmp/restore-list
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-#
-# Delete .c files because we will only restored the txt files
-#
-rm -f tmp/build/*.c
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! query-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! query-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== query-test Bacula source OK ===== "
-   echo "  ===== query-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/recycle-test b/regress/tests/recycle-test
deleted file mode 100755 (executable)
index fd1c383..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory but 
-#   create three volumes and do six backups causing the
-#   volumes to be recycled, and cycling through the volumes
-#   twice. Tests maxvoljobs and volretention.
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting recycle-test at `date +%R:%S` ==="
-echo " === Starting recycle-test at `date +%R:%S` ===" >working/log
-echo " "
-
-#bin/bacula start 2>&1 >/dev/null
-bin/bacula start
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-label storage=File1 volume=TestVolume001
-label storage=File1 volume=TestVolume002
-label storage=File1 volume=TestVolume003
-update Volume=TestVolume001 volretention=10s
-update Volume=TestVolume001 maxvoljobs=1
-update Volume=TestVolume002 volretention=10s
-update Volume=TestVolume002 maxvoljobs=1
-update Volume=TestVolume003 volretention=10s
-update Volume=TestVolume003 maxvoljobs=1
-list volumes
-run job=NightlySave storage=File1 level=full yes
-wait
-messages
-list volumes
-run job=NightlySave storage=File1 level=full yes
-wait
-messages
-list volumes
-run job=NightlySave storage=File1 level=full yes
-wait
-messages
-list volumes
-@sleep 10
-run job=NightlySave storage=File1 level=full yes
-wait
-messages
-list volumes
-run job=NightlySave storage=File1 level=full yes
-wait
-messages
-@output tmp/log1.out
-list volumes
-run job=NightlySave storage=File1 level=full yes
-wait
-messages
-list volumes
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File1
-unmark *
-mark *
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File1
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build  tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! recycle-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! recycle-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== recycle-test Bacula source OK ===== "
-   echo "  ===== recycle-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/relabel-tape b/regress/tests/relabel-tape
deleted file mode 100755 (executable)
index b90c16e..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the compressed option
-#   then backup four times, each with incremental then finally restore.
-#   It should require at least 4 different bsrs.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting relabel-tape at `date +%R:%S` ==="
-echo " === Starting relabel-tape at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-run job=NightlySave level=Full yes
-wait
-messages
-add pool=Default
-0
-TestVolume002
-@# set status to append
-update volume=TestVolume001
-1
-.
-run job=NightlySave level=Full yes
-@sleep 20
-unmount
-unmount
-purge volume=TestVolume001
-relabel oldvolume=TestVolume001 volume=TestVolume003 slot=0 pool=Default
-list volumes
-mount
-messages
-wait
-run job=NightlySave level=Full yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-echo "Backup done"
-# 
-# now do several restores to ensure we cleanup between jobs
-#
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-wait
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-wait
-@$out tmp/log2.out
-@#
-@# now unmount the tape and start two restores
-@#  at the same time
-@#
-unmount storage=DDS-4
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-restore where=${cwd}/tmp/bacula-restores select
-unmark *
-mark *
-done
-yes
-mount storage=DDS-4
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-dstat=$?
-if [ $dstat != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! relabel-tape Bacula source failed!!! !!!!! "
-   echo "  !!!!! relabel-tape failed!!! !!!!! " >>test.out
-   echo "diff=$dstat backup=$bstat restore=$rstat"
-   echo " "
-else
-   echo "  ===== relabel-tape Bacula source OK ===== "
-   echo "  ===== relabel-tape OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/restore-by-file-tape b/regress/tests/restore-by-file-tape
deleted file mode 100755 (executable)
index 647c204..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#   to a tape where the maximum tape file size is set to 1M
-#   then restore a few files from it.  Note, by setting the maximum 
-#   file size to 1M, it runs very slow. There are about 64 files that
-#   are created during each of the two backups.
-#
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "${cwd}/build" >/tmp/file-list
-sed s%\^%${cwd}% ${cwd}/scripts/flist >${cwd}/tmp/restore2-list
-
-cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-sed "s%# Maximum File Size%  Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-
-echo " "
-echo " "
-echo " === Starting restore-by-file-tape test at `date +%R:%S` ==="
-echo " === Starting restore-by-file-tape test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-run job=NightlySave level=Full yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores storage=DDS-4 file=<${cwd}/tmp/restore2-list
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-dstat=0
-scripts/check_for_zombie_jobs storage=DDS-4
-#
-# We need to stop and start Bacula to
-#  test appending to a previously written tape
-#
-bin/bacula stop  2>&1 >/dev/null
-bin/bacula start 2>&1 >/dev/null
-for i in `cat ${cwd}/tmp/restore2-list`; do
-   diff $i ${cwd}/tmp/bacula-restores$i
-   if [ $? != 0 ] ; then
-      dstat=1
-   fi
-done
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-if [ $dstat != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! restore-by-file-tape test Bacula source failed!!! !!!!! "
-   echo "  !!!!! restore-by-file-tape test failed!!! !!!!! " >>test.out
-   echo " "
-   bin/bacula stop 2>&1 >/dev/null
-   exit 1
-else
-   echo "  First of two restores OK "
-fi
-rm -rf ${cwd}/tmp/bacula-restores
-#
-# Now do a second backup and restore
-#
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run job=NightlySave level=Full yes
-wait
-messages
-@#
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores
-7
-<${cwd}/tmp/restore2-list
-                                                                                        
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=DDS-4
-bin/bacula stop 2>&1 >/dev/null
-for i in `cat ${cwd}/tmp/restore2-list`; do
-   diff $i ${cwd}/tmp/bacula-restores$i
-   if [ $? != 0 ] ; then
-      dstat=1
-   fi
-done
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-if [ $dstat != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! restore-by-file-tape test Bacula source failed!!! !!!!! "
-   echo "  !!!!! restore-by-file-tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== restore-by-file-tape test Bacula source OK ===== "
-   echo "  ===== restore-by-file-tape test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/restore-by-file-test b/regress/tests/restore-by-file-test
deleted file mode 100755 (executable)
index f762b48..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the compressed option
-#   then restore it.
-#
-
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/tmp/build" >/tmp/file-list
-mkdir ${cwd}/tmp/build
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp/build
-ls >../1
-cd ..
-sed s%\^%${cwd}/tmp/build/% 1 >restore-list
-rm -f 1
-cd ${cwd}
-
-echo " "
-echo " "
-echo " === Starting restore-by-file-test at `date +%R:%S` ==="
-echo " === Starting restore-by-file-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=File volume=TestVolume001
-run job=CompressedTest yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores storage=File
-7
-<${cwd}/tmp/restore-list
-
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! restore-by-file-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! restore-by-file-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== restore-by-file-test Bacula source OK ===== "
-   echo "  ===== restore-by-file-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/restore-disk-seek-test b/regress/tests/restore-disk-seek-test
deleted file mode 100755 (executable)
index 9dd157a..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/bin/sh
-#
-# Run a backup of the full bacula build directory, but with the
-#   Maximum File Size set. Then do a restore of a few files to kick in
-#   disk seeking (not yet enabled), and ensure that the restored files
-#   match. Even though disk seeking is not yet enabled, this is a good test,
-#   and once it is enabled, this will test it.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/tmp/build" >/tmp/file-list
-rm -rf ${cwd}/tmp/build
-mkdir ${cwd}/tmp/build
-# Copy only the .c files (to be restored)
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-cd ${cwd}/tmp/build
-ls >../1
-cd ..
-sed s%\^%${cwd}/tmp/build/% 1 >restore-list
-# At this point restore-list contains the list
-#  of files we will restore
-rm -f 1
-cd ${cwd}
-# Now backup *everything* 
-rm -rf  ${cwd}/tmp/build
-mkdir ${cwd}/tmp/build
-cp -fp ${cwd}/build/src/dird/* ${cwd}/tmp/build
-# Enable MaximumFileSize
-cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-sed "s%# Maximum File Size%  Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-
-echo " "
-echo " "
-echo " === Starting restore-disk-seek-test at `date +%R:%S` ==="
-echo " === Starting restore-disk-seek-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=File volume=TestVolume001
-run job=CompressedTest yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-sql
-select * from JobMedia;
-
-restore bootstrap=${cwd}/tmp/kern.bsr where=${cwd}/tmp/bacula-restores storage=File
-7
-<${cwd}/tmp/restore-list
-
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-# Now setup a control directory of only what we *should* restore
-rm -rf ${cwd}/tmp/build
-mkdir  ${cwd}/tmp/build
-cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! restore-disk-seek-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! restore-disk-seek-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== restore-disk-seek-test Bacula source OK ===== "
-   echo "  ===== restore-disk-seek-test OK ===== " >>test.out
-#  scripts/cleanup
-#  rm -rf ${cwd}/tmp/build
-fi
diff --git a/regress/tests/restore2-by-file-test b/regress/tests/restore2-by-file-test
deleted file mode 100755 (executable)
index cfbf2cb..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the compressed option
-#   then restore a few selected files.
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-sed s%\^%${cwd}% ${cwd}/scripts/flist >${cwd}/tmp/restore2-list
-
-echo " "
-echo " "
-echo " === Starting restore2-by-file-test at `date +%R:%S` ==="
-echo " === Starting restore2-by-file-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-run job=CompressedTest yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores storage=File file=<${cwd}/tmp/restore2-list
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-dstat=0
-for i in `cat ${cwd}/tmp/restore2-list`; do  
-   diff $i ${cwd}/tmp/bacula-restores$i
-   if [ $? != 0 ] ; then
-      dstat=1
-   fi
-done
-if [ $dstat != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! restore2-by-file-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! restore2-by-file-test failed!!! !!!!! " >>test.out
-   echo " "
-   echo "Backup term status  = $bstat"
-   echo "Restore term status = $rstat"
-   echo "Diff status         = $dstat"
-   echo " "
-else
-   echo "  ===== restore2-by-file-test Bacula source OK ===== "
-   echo "  ===== restore2-by-file-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/scratch-pool-test b/regress/tests/scratch-pool-test
deleted file mode 100755 (executable)
index 44ba8fd..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#  to two tapes where the maximum tape file size is set to 1M
-#  Note, this test simulates the tape filling and writing to
-#   the next tape. One minor wrinkle: we create the two tapes
-#   in the Scratch pool, so they should be switched to the Default
-#   Pool automatically.
-#
-#  Note we use the viritual disk autochanger
-#
-debug=0
-. config.out
-if test x${AUTOCHANGER} = x/dev/null ; then
-   echo "two-volume-test skipped. No autochanger."
-   exit
-fi
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-scripts/cleanup
-scripts/copy-2disk-confs
-scripts/prepare-two-disks
-echo "${cwd}/build" >/tmp/file-list
-
-outf="tmp/sed_tmp"
-echo "s%# Maximum File Size%  Maximum File Size%g" >${outf}
-cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-
-echo " "
-echo " "
-echo " === Starting Scratch Pool Test at `date +%R:%S` ==="
-echo " === Starting Scratch Pool Test at `date +%R:%S` ===" >>working/log
-echo " "
-# Write out bconsole commands
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=1 pool=Scratch drive=0
-label storage=DDS-4 volume=TestVolume002 slot=2 pool=Scratch drive=0
-update Volume=TestVolume001 MaxVolBytes=3000000 pool=Scratch drive=0
-update Volume=TestVolume001 inchanger=no pool=Scratch drive=0
-@#setdebug level=200 storage=DDS-4
-llist volume=TestVolume001
-run job=NightlySave yes
-wait
-messages
-list volumes
-llist volume=TestVolume001
-quit
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-exit
-scripts/check_for_zombie_jobs storage=DDS-4
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Scratch Pool Test Bacula source failed!!! !!!!! "
-   echo "  !!!!! Scratch Pool Test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Scratch Pool Test Bacula source OK ===== "
-   echo "  ===== Scratch Pool Test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/six-vol-test b/regress/tests/six-vol-test
deleted file mode 100755 (executable)
index bdf6f84..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/bin/sh
-#
-# Create a 60MB file with random bytes. Back it up to 6 Volumes
-#   each constrained to 10MB using the automatic labeling feature.
-#
-
-if test ! -c /dev/urandom ; then
-   echo "No random device. Test skipped.\n"
-   exit 0
-fi
-cwd=`pwd`
-scripts/copy-testa-confs
-scripts/cleanup
-echo "${cwd}/tmp/largefile" >/tmp/file-list
-# Create 56MB file with random data
-echo "Creating a 56MB file with random data ..."
-dd if=/dev/urandom of=${cwd}/tmp/largefile bs=1024 count=55000
-echo "largefile created"
-
-echo " "
-echo " "
-echo " === Starting six-vol-test at `date +%R:%S` ==="
-echo " === Starting six-vol-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run job=MultiVol storage=File yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File
-unmark *
-mark *
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop  2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff tmp/largefile  tmp/bacula-restores${cwd}/tmp/largefile 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! six-vol-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! six-vol-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== six-vol-test Bacula source OK ===== "
-   echo "  ===== six-vol-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/small-file-size-tape b/regress/tests/small-file-size-tape
deleted file mode 100755 (executable)
index 4f8b011..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#   to a tape where the maximum tape file size is set to 1M
-#
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-
-echo "${cwd}/build" >/tmp/file-list
-cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-sed "s%# Maximum File Size%  Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-
-echo " "
-echo " "
-echo " === Starting Small File Size test at `date +%R:%S` ==="
-echo " === Starting Small File Size test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-setdebug level=2 storage=DDS-4
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=DDS-4
-unmark *
-mark *
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=DDS-4
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Small File Size test Bacula source failed!!! !!!!! "
-   echo "  !!!!! Small File Size test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Small File Size test Bacula source OK ===== "
-   echo "  ===== Small File Size test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/span-vol-test b/regress/tests/span-vol-test
deleted file mode 100755 (executable)
index dd9f08d..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory but 
-#   split the archive into four volumes, two of which are
-#   totally full. I.e. make sure that bsr selects all tapes 
-#   including those fully spanned.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting span-vol-test at `date +%R:%S` ==="
-echo " === Starting span-vol-test at `date +%R:%S` ===" >working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=File1 volume=TestVolume004
-label storage=File1 volume=TestVolume003
-label storage=File1 volume=TestVolume002
-label storage=File1 volume=TestVolume001
-update Volume=TestVolume004 MaxVolBytes=3000000
-update Volume=TestVolume003 MaxVolBytes=3000000
-update Volume=TestVolume002 MaxVolBytes=3000000
-run job=NightlySave storage=File1 yes
-wait
-list volumes
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File1
-unmark *
-mark *
-done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File1
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build  tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! span-vol-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! span-vol-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== span-vol-test Bacula source OK ===== "
-   echo "  ===== span-vol-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/sparse-compressed-test b/regress/tests/sparse-compressed-test
deleted file mode 100755 (executable)
index dde29ec..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the Sparse option
-#   then restore it.
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-bin/bacula stop 2>&1 >/dev/null
-
-echo " "
-echo " "
-echo " === Starting sparse-compressed-test at `date +%R:%S` ==="
-echo " === Starting sparse-compressed-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-run job=SparseCompressedTest yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out   
-restore where=${cwd}/tmp/bacula-restores select all storage=File done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File 
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! sparse-compressed-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! sparse-compressed-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== sparse-compressed-test Bacula source OK ===== "
-   echo "  ===== sparse-compressed-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/sparse-test b/regress/tests/sparse-test
deleted file mode 100755 (executable)
index 0e01188..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the Sparse option
-#   then restore it.
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting sparse-test at `date +%R:%S` ==="
-echo " === Starting sparse-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-run job=SparseTest yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File
-unmark *
-mark *
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File 
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! sparse-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! sparse-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== sparse-test Bacula source OK ===== "
-   echo "  ===== sparse-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/test0 b/regress/tests/test0
deleted file mode 100755 (executable)
index 0d0edd0..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-echo " " >test.out
-rm -f bin/working/*
diff --git a/regress/tests/truncate-bug-tape b/regress/tests/truncate-bug-tape
deleted file mode 100755 (executable)
index 040540d..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/sh
-#
-# Test for a tape truncation bug.
-#
-cwd=`pwd`
-
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting truncate-bug-tape test at `date +%R:%S` ==="
-echo " === Starting truncate-bug-tape test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default
-@# do a bunch of saves so we have 12 files on the tape
-run job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-run level=Full job=NightlySave yes
-wait
-messages
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=DDS-4
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-@# 
-@# now do a restore
-@#
-restore where=${cwd}/tmp/bacula-restores storage=DDS-4
-3
-@# select JobId=4 (i.e. file five on the tape)
-4
-cd ${cwd}/build
-@# mark a single file
-mark configure
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=DDS-4
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log2.out
-run level=Full job=NightlySave yes
-wait
-messages
-quit
-END_OF_DATA
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Backup OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-if [ $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! truncate-bug-tape test Bacula source failed!!! !!!!! "
-   echo "  !!!!! truncate-bug-tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== truncate-bug-tape test Bacula source OK ===== "
-   echo "  ===== truncate-bug-tape test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/two-jobs-test b/regress/tests/two-jobs-test
deleted file mode 100755 (executable)
index 8768362..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory using the compressed option
-#   then backup a second time and finally restore it
-#
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting two-jobs-test at `date +%R:%S` ==="
-echo " === Starting two-jobs-test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-setdebug level=15  storage=File
-@output /dev/null
-messages
-@output /dev/null
-estimate job=CompressedTest listing
-estimate job=CompressedTest listing
-estimate job=CompressedTest listing
-messages
-@output tmp/log1.out
-label storage=File volume=TestVolume001
-run job=CompressedTest yes
-wait
-messages
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File 
-echo "Backup 1 done"
-touch ${cwd}/build/src/dird/*.c
-#
-# run a second job
-#
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA 2>&1 >/dev/null
-@output /dev/null
-messages
-@output tmp/log1.out
-run job=CompressedTest
-yes
-wait
-messages
-@# 
-@# now do several restores to ensure we cleanup between jobs
-@#
-@output /dev/null
-restore where=${cwd}/tmp/bacula-restores select all storage=File done
-yes
-wait
-restore where=${cwd}/tmp/bacula-restores select all storage=File done
-yes
-wait
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File
-unmark *
-mark *
-done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-scripts/check_for_zombie_jobs storage=File
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! two-jobs-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! two-jobs-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== two-jobs-test Bacula source OK ===== "
-   echo "  ===== two-jobs-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/two-pool-tape b/regress/tests/two-pool-tape
deleted file mode 100755 (executable)
index a9dabe4..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/bin/sh
-#
-# This is Arno's test.  It uses two pools, two tapes, and
-#  an autochanger. Note, the Director has three Pools in its 
-#  conf:  Default, Full, and Inc.  Default is used in the
-#  NightlySave job by default.  What is backed up is what
-#  is in /tmp/file-list, which is by default the Bacula
-#  source code (i.e. the build directory).
-#
-. config.out
-if test x${AUTOCHANGER} = x/dev/null ; then
-   echo "two-pool-tape test skipped. No autochanger."
-   exit
-fi
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-scripts/cleanup
-scripts/copy-2tape-confs
-scripts/prepare-two-tapes
-# Make a relatively large backup set 5 x source code directory
-echo "${cwd}/build" >/tmp/file-list
-echo "${cwd}/build" >>/tmp/file-list
-echo "${cwd}/build" >>/tmp/file-list
-echo "${cwd}/build" >>/tmp/file-list
-echo "${cwd}/build" >>/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting Two Pool Tape test at `date +%R:%S` ==="
-echo " === Starting Two Pool Tape test at `date +%R:%S` ===" >>working/log
-echo " "
-# Write out bconsole commands to a file
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=1 pool=Full drive=0
-label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0
-list volumes
-@# Start job with Client run before and sleep
-run job=NightlySave1 level=Full pool=Default yes
-run job=NightlySave1 level=Full pool=Default yes
-run job=NightlySave1 level=Full pool=Default yes
-@# wait between starting jobs
-@sleep 60
-@#setdebug level=100 storage=DDS-4
-run job=NightlySave2 level=Full pool=Full yes
-run job=NightlySave2 level=Full pool=Full yes
-run job=NightlySave2 level=Full pool=Full yes
-@sleep 10
-messages
-@sleep 10
-messages
-@sleep 10
-status storage=DDS-4
-messages
-wait
-list volumes
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-# start Bacula and run bconsole commands
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-# Make sure no jobs are still running (debug check)
-scripts/check_for_zombie_jobs storage=DDS-4
-
-# stop Bacula
-bin/bacula stop 2>&1 >/dev/null
-# Check if backup done correctly
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Two Pool Tape test Bacula source failed!!! !!!!! "
-   echo "  !!!!! Two Pool Tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Two Pool Tape test Bacula source OK ===== "
-   echo "  ===== Two Pool Tape test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/two-pool-test b/regress/tests/two-pool-test
deleted file mode 100755 (executable)
index 9686b42..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/bin/sh
-#
-# This is Arno's test.  It uses two pools, two tapes, and
-#  an autochanger. Note, the Director has three Pools in its 
-#  conf:  Default, Full, and Inc.  Default is used in the
-#  NightlySave job by default.  What is backed up is what
-#  is in /tmp/file-list, which is by default the Bacula
-#  source code (i.e. the build directory).
-#
-#  Note, we use the virtual disk autochanger.
-#
-. config.out
-if test x${AUTOCHANGER} = x/dev/null ; then
-   echo "two-pool-test skipped. No autochanger."
-   exit
-fi
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-scripts/cleanup
-scripts/copy-2disk-confs
-scripts/prepare-two-disks
-# Make a relatively large backup set 5 x source code directory
-#  Reduced to 1 for portable
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting Two Pool Test at `date +%R:%S` ==="
-echo " === Starting Two Pool Test at `date +%R:%S` ===" >>working/log
-echo " "
-# Write out bconsole commands to a file
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=1 pool=Full drive=0
-label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0
-list volumes
-@# Start job with Client run before and sleep
-run job=NightlySave1 level=Full pool=Default yes
-run job=NightlySave1 level=Full pool=Default yes
-run job=NightlySave1 level=Full pool=Default yes
-@# wait between starting jobs
-@sleep 60
-@#setdebug level=100 storage=DDS-4
-run job=NightlySave2 level=Full pool=Full yes
-run job=NightlySave2 level=Full pool=Full yes
-run job=NightlySave2 level=Full pool=Full yes
-@sleep 10
-messages
-@sleep 10
-messages
-@sleep 10
-status storage=DDS-4
-messages
-wait
-list volumes
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-# start Bacula and run bconsole commands
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-# Make sure no jobs are still running (debug check)
-scripts/check_for_zombie_jobs storage=DDS-4
-
-# stop Bacula
-bin/bacula stop 2>&1 >/dev/null
-# Check if backup done correctly
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Two Pool Test Bacula source failed!!! !!!!! "
-   echo "  !!!!! Two Pool Test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Two Pool Test Bacula source OK ===== "
-   echo "  ===== Two Pool Test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/two-vol-test b/regress/tests/two-vol-test
deleted file mode 100755 (executable)
index 876b8fa..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory but 
-#   split the archive into two volumes
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting two-vol-test at `date +%R:%S` ==="
-echo " === Starting two-vol-test at `date +%R:%S` ===" >working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=File1 volume=TestVolume002
-label storage=File1 volume=TestVolume001
-update Volume=TestVolume002 MaxVolBytes=3000000
-run job=NightlySave storage=File1 yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all storage=File1 done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=File1
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build  tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! two-vol-test Bacula source failed!!! !!!!! "
-   echo "  !!!!! two-vol-test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== two-vol-test Bacula source OK ===== "
-   echo "  ===== two-vol-test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/two-volume-tape b/regress/tests/two-volume-tape
deleted file mode 100755 (executable)
index 5dc69f6..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#  to two tapes where the maximum tape file size is set to 1M
-#  Note, this test simulates the tape filling and writing to
-#   the next tape.
-#
-. config.out
-if test x${AUTOCHANGER} = x/dev/null ; then
-   echo "two-volume-tape test skipped. No autochanger."
-   exit
-fi
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-scripts/cleanup
-scripts/copy-2tape-confs
-scripts/prepare-two-tapes
-echo "${cwd}/build" >/tmp/file-list
-
-outf="tmp/sed_tmp"
-echo "s%# Maximum File Size%  Maximum File Size%g" >${outf}
-cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-
-echo " "
-echo " "
-echo " === Starting Two Volume Tape test at `date +%R:%S` ==="
-echo " === Starting Two Volume Tape test at `date +%R:%S` ===" >>working/log
-echo " "
-# Write out bconsole commands
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=1 pool=Default drive=0
-label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0
-update Volume=TestVolume001 MaxVolBytes=3000000 pool=Default drive=0
-@#setdebug level=1000 client 
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-scripts/check_for_zombie_jobs storage=DDS-4
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Two Volume Tape test Bacula source failed!!! !!!!! "
-   echo "  !!!!! Two Volume Tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Two Volume Tape test Bacula source OK ===== "
-   echo "  ===== Two Volume Tape test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/two-volume-test b/regress/tests/two-volume-test
deleted file mode 100755 (executable)
index 55b3bba..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#  to two tapes where the maximum tape file size is set to 1M
-#  Note, this test simulates the tape filling and writing to
-#   the next tape.
-#
-#  Note we use the viritual disk autochanger
-#
-. config.out
-if test x${AUTOCHANGER} = x/dev/null ; then
-   echo "two-volume-test skipped. No autochanger."
-   exit
-fi
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-cwd=`pwd`
-scripts/cleanup
-scripts/copy-2disk-confs
-scripts/prepare-two-disks
-echo "${cwd}/build" >/tmp/file-list
-
-outf="tmp/sed_tmp"
-echo "s%# Maximum File Size%  Maximum File Size%g" >${outf}
-cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1
-sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf
-
-echo " "
-echo " "
-echo " === Starting Two Volume Test at `date +%R:%S` ==="
-echo " === Starting Two Volume Test at `date +%R:%S` ===" >>working/log
-echo " "
-# Write out bconsole commands
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=1 pool=Default drive=0
-label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0
-update Volume=TestVolume001 MaxVolBytes=3000000 pool=Default drive=0
-@#setdebug level=1000 client 
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-scripts/check_for_zombie_jobs storage=DDS-4
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Two Volume Test Bacula source failed!!! !!!!! "
-   echo "  !!!!! Two Volume Test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Two Volume Test Bacula source OK ===== "
-   echo "  ===== Two Volume Test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/tests/usr-tape-root b/regress/tests/usr-tape-root
deleted file mode 100755 (executable)
index 0f5002d..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the /usr directory
-#   then restore it.
-#
-cwd=`pwd`
-scripts/copy-tape-confs
-scripts/cleanup-tape
-echo "/usr" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting usr-tape-root test ==="
-echo " "
-echo " "
-
-bin/bacula start 2>&1 >/dev/null
-bin/bconsole -c bin/bconsole.conf <<END_OF_DATA
-@output /dev/null
-messages
-@output tmp/log1.out
-label storage=DDS-4 Volume=TestVolume001 slot=0
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@output tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select all done
-yes
-wait
-messages
-@output
-quit
-END_OF_DATA
-bin/bacula stop 2>&1 >/dev/null
-cd /
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/original
-cd ${cwd}/tmp/bacula-restores
-${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/restored
-cd ${cwd}/tmp
-sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% original >1
-sort <1 >original
-#
-sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% restored >1
-sort <1 >restored
-rm -f 1
-#
-cd ${cwd}
-diff tmp/original tmp/restored 2>&1 1>/dev/nul
-if [ $? != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  ===== !!!! usr-tape-root failed !!!! ===== "
-   echo "  ===== !!!! usr-tape-root failed !!!! ===== " >>test.out
-   echo " "
-else
-   echo "  ===== usr-tape-root OK ===== "
-   echo "  ===== usr-tape-root OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/verify-vol-test b/regress/tests/verify-vol-test
deleted file mode 100755 (executable)
index 2df75d6..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory
-#   then verify the catalog.           
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting verify Volume Test at `date +%R:%S` ==="
-echo " === Starting verify Volume Test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-setdebug level=1 storage=File sd
-label storage=File volume=TestVolume001
-run job=NightlySave yes
-wait
-messages
-@# 
-@# now do a verify volume
-@#
-@$out ${cwd}/tmp/original
-run job=VerifyVolume
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-sleep 2
-scripts/check_for_zombie_jobs storage=File 
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Verify OK" ${cwd}/tmp/original 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Verify Volume failed!!! !!!!! "
-   echo "  !!!!! Verify Volume failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== Verify Volume Test OK ===== "
-   echo "  ===== Verify Volume Test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/weird-files-test b/regress/tests/weird-files-test
deleted file mode 100755 (executable)
index 5c1f447..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory
-#   then restore it.
-#
-debug=0 
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-if test ! -d weird-files ; then
-   echo " "
-   echo "Weird files not configured. Test not run."
-   exit 0
-fi
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-#
-# Note, we save the weird-files directory twice on purpose
-#  because this causes problems with hard linked files 
-#  that are only saved once.  In 1.33, Bacula now deals
-#  with this situation.
-#
-echo "${cwd}/weird-files" >/tmp/file-list
-echo "${cwd}/weird-files" >>/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting weird filenames test at `date +%R:%S` ==="
-echo " === Starting weird filenames test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=File
-TestVolume001
-run job=NightlySave
-yes
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=${cwd}/tmp/bacula-restores select storage=File
-unmark *
-mark *
-done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-scripts/check_for_zombie_jobs storage=File 
-bin/bacula stop 2>&1 >/dev/null
-${cwd}/bin/testls weird-files | sort >${cwd}/tmp/original
-cd tmp/bacula-restores${cwd}
-${cwd}/bin/testls weird-files | sort >${cwd}/tmp/restored
-cd ${cwd}
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Weird files test failed!!! !!!!! "
-   echo "  !!!!! Weird files test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== Weird files test OK ===== "
-   echo "  ===== Weird files test OK ===== " >>test.out
-   cd ${cwd}
-   scripts/cleanup
-fi
diff --git a/regress/tests/weird-files2-test b/regress/tests/weird-files2-test
deleted file mode 100755 (executable)
index fe5a50c..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory
-#   then restore it.
-#
-debug=0
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-if test ! -d weird-files ; then
-   echo " "
-   echo "weird files not configured. Test not run."
-   exit 0
-fi
-cwd=`pwd`
-scripts/copy-test-confs
-scripts/cleanup
-rm -rf weird-files2
-cp -Rp weird-files weird-files2
-echo "${cwd}/weird-files2" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting weird-files2 test at `date +%R:%S` ==="
-echo " === Starting weird-file2 test at `date +%R:%S` ===" >>working/log
-echo " "
-
-bin/testls weird-files2 >${cwd}/tmp/original
-
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@$out tmp/log1.out
-label storage=File volume=TestVolume001
-run job=NightlySave yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-scripts/check_for_zombie_jobs storage=File 
-#
-# Now mess up the a hard link, and a soft link
-#
-cd weird-files2
-rm -f hard-file2
-ln hard-file3 hard-file2
-rm -f soft-file2
-ln -s soft-file3 soft-file2
-cd ${cwd}
-cat <<END_OF_DATA >tmp/bconcmds
-@$out /dev/null
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where= storage=File
-5
-unmark *
-mark *
-done
-yes
-wait
-messages
-@$out
-quit
-END_OF_DATA
-
-if test "$debug" -eq 1 ; then
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-scripts/check_for_zombie_jobs storage=File 
-bin/bacula stop 2>&1 >/dev/null
-bin/testls weird-files2 >${cwd}/tmp/restored
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 >/dev/null
-if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Weird files2 test failed!!! !!!!! "
-   echo "  !!!!! Weird files2 test failed!!! !!!!! " >>test.out
-   if [ $bstat != 0 -o $rstat != 0 ] ; then
-      echo "  !!!!! Bad Job termination status     !!!!! "
-      echo "  !!!!! Bad Job termination status     !!!!! " >>test.out
-   else
-      echo "  !!!!! Restored files differ          !!!!! "
-      echo "  !!!!! Restored files differ          !!!!! " >>test.out
-   fi
-   echo " "
-else
-   echo "  ===== Weird files2 test OK ===== "
-   echo "  ===== Weird files2 test OK ===== " >>test.out
-   cd ${cwd}
-   scripts/cleanup
-   rm -rf weird-files2
-fi
diff --git a/regress/tests/win32-backup-tape b/regress/tests/win32-backup-tape
deleted file mode 100755 (executable)
index f51252e..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#   to a tape then restore it, we do that twice to ensure that
-#   we can correctly append to a tape.
-#
-debug=1
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-win32-confs
-scripts/cleanup-tape
-
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting Win32 Backup tape test at `date +%R:%S` ==="
-echo " === Starting Win32 Backup tape test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default drive=0
-run job=NightlySave yes
-@sleep 10
-status storage=DDS-4
-@sleep 30
-messages
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=c:/tmp/bacula-restores select all storage=DDS-4 done
-yes
-wait
-messages
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-if [ $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Win32 Backup tape test failed!!! !!!!! "
-   echo "  !!!!! Win32 Backup tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Win32 Backup tape test OK ===== "
-   echo "  ===== Win32 Backup tape test OK ===== " >>test.out
-   scripts/cleanup
-fi
diff --git a/regress/tests/win32-to-linux-tape b/regress/tests/win32-to-linux-tape
deleted file mode 100755 (executable)
index 7cced61..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/bin/sh
-#
-# Run a simple backup of the Bacula build directory 
-#   to a tape then restore it, we do that twice to ensure that
-#   we can correctly append to a tape.
-#
-debug=1
-if test "$debug" -eq 1 ; then
-  out="tee"
-else
-  out="output"
-fi
-
-cwd=`pwd`
-scripts/copy-win32-confs
-scripts/cleanup-tape
-
-echo "${cwd}/build" >/tmp/file-list
-
-echo " "
-echo " "
-echo " === Starting Win32 Backup tape test at `date +%R:%S` ==="
-echo " === Starting Win32 Backup tape test at `date +%R:%S` ===" >>working/log
-echo " "
-
-cat <<END_OF_DATA >tmp/bconcmds
-@output /dev/null
-messages
-@$out tmp/log1.out
-label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default drive=0
-run job=NightlySave yes
-@sleep 10
-status storage=DDS-4
-@sleep 30
-messages
-wait
-messages
-@# 
-@# now do a restore
-@#
-@$out tmp/log2.out
-restore where=c:/tmp/bacula-restores client=Tibs select all storage=DDS-4 done
-yes
-wait
-messages
-END_OF_DATA
-if test "$debug" -eq 1 ; then
-  bin/bacula start
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf
-else
-  bin/bacula start 2>&1 >/dev/null
-  cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf  2>&1 >/dev/null
-fi
-
-scripts/check_for_zombie_jobs storage=DDS-4
-
-bin/bacula stop 2>&1 >/dev/null
-grep "^  Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null
-bstat=$?
-grep "^  Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null
-rstat=$?
-if [ $bstat != 0 -o $rstat != 0 ] ; then
-   echo " "
-   echo " "
-   echo "  !!!!! Win32 Backup tape test failed!!! !!!!! "
-   echo "  !!!!! Win32 Backup tape test failed!!! !!!!! " >>test.out
-   echo " "
-else
-   echo "  ===== Win32 Backup tape test OK ===== "
-   echo "  ===== Win32 Backup tape test OK ===== " >>test.out
-#  scripts/cleanup
-fi
diff --git a/regress/weird-files.tar.gz b/regress/weird-files.tar.gz
deleted file mode 100644 (file)
index f84d1c0..0000000
Binary files a/regress/weird-files.tar.gz and /dev/null differ