+Changes to 1.38.2:
+- 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.
Changes to 1.38.1:
+- 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.
+- Merge Scott's new spec files.
+- Add doc on setting up Win32 environment variable supplied
+ by Kees van den Broek.
+- Turn off API debug output unless debug set to avoid confusing
+ the user.
+- Add Solaris ACL detection in configure.in as supplied by
+ Attila Fulop.
+- 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.
+- Fix update slots to clear slot number of every slot before
+ setting it. This fixes (I believe) bug #471
+- Make unmount unload the autochanger slot.
+- Modify open() on mount to be read-only and non-blocking,
+ otherwise the mount can block for a long time.
+- Make a few error message numbers unique.
+- Make a few error messages more correct.
+- Apply patch from Thorsten to fix Win98 stat() command.
- Remove delete of CVS from all makefiles.
- Fix seg fault when clicking on Add button in wx-console
restore panel. Bug #470.
- Release Notes for Bacula 1.38.1
+ Release Notes for Bacula 1.38.2
Bacula code: Total files = 420 Total lines = 138,440 (*.h *.c *.in)
- 20,440 additional lines of code since version 1.36.3
+ 20,440 additional lines of code since version 1.36.3
-Changes since 1.38.0:
-- Fix autostart install for FreeBSD.
-- Fix several problems with PostgreSQL scripts.
+Changes to 1.38.2:
+- 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.
+
+Changes to 1.38.1:
+- Corrected ACL for Solaris (David Duchscher and Attila Fulop).
+- Add bacula_mail_summary.sh to examples directory. It makes
+ a single email summary of any number of jobs. Submitted
+ by Adrew J. Millar.
+- Unmount command now unloads autochanger.
+- Fix hang in FD (Martin Simmons)
+- Fix Win98 stat() problem in FD (Thorsten Engel)
+- Fix update slots which did not clear missing tapes.
+- Fix autostart install for FreeBSD (user reported)
+- Fix several problems with PostgreSQL scripts (Eric Bollinger)
- Critical: allow restore of the first file of non-portable Win32 backup.
- Important: with muliple concurrent jobs the autochanger could get
confused because of a missing mutex.
Kern's ToDo List
- 03 November 2005
+ 21 November 2005
Major development:
Project Developer
Version 1.37 Kern (see below)
========================================================
-Final items for 1.37 before release:
-
Document:
- Does ClientRunAfterJob fail the job on a bad return code?
- Document cleaning up the spool files:
- Does WildFile match against full name? Doc.
For 1.39:
+- Make sure that all do_prompt() calls in Dir check for
+ -1 (error) and -2 (cancel) returns.
- Look at -D_FORTIFY_SOURCE=2
- Add Win32 FileSet definition somewhere
- Look at fixing restore status stats in SD.
encountered, read many times (as it currently does), and if the
block cannot be read, skip to the next block, and try again. If
that fails, skip to the next file and try again, ...
+- Add level table:
+ create table LevelType (LevelType binary(1), LevelTypeLong tinyblob);
+ insert into LevelType (LevelType,LevelTypeLong) values
+ ("F","Full"),
+ ("D","Diff"),
+ ("I","Inc");
- Add ACL to restore only to original location.
- Add a recursive mark command (rmark) to restore.
- "Minimum Job Interval = nnn" sets minimum interval between Jobs
====
-=== Done
-- Save mount point for directories not traversed with onefs=yes.
-- Add seconds to start and end times in the Job report output.
-- if 2 concurrent backups are attempted on the same tape
- drive (autoloader) into different tape pools, one of them will exit
- fatally instead of halting until the drive is idle
-- Update StartTime if job held in Job Queue.
-- Look at www.nu2.nu/pebuilder as a helper for full windows
- bare metal restore. (done by Scott)
-- Fix orphanned buffers:
- Orphaned buffer: 24 bytes allocated at line 808 of rufus-dir job.c
- Orphaned buffer: 40 bytes allocated at line 45 of rufus-dir alist.c
-- Implement Preben's suggestion to add
- File System Types = ext2, ext3
- to FileSets, thus simplifying backup of *all* local partitions.
-- Try to open a device on each Job if it was not opened
- when the SD started.
-- Add dump of VolSessionId/Time and FileIndex with bls.
-- If Bacula does not find the right tape in the Autochanger,
- then mark the tape in error and move on rather than asking
- for operator intervention.
-- Cancel command should include JobId in list of Jobs.
-- Add performance testing hooks
-- Bootstrap from JobMedia records.
-- Implement WildFile and WildDir to solve problem of
- saving only *.doc files.
-- Fix
- Please use the "label" command to create a new Volume for:
- Storage: DDS-4-changer
- Media type:
- Pool: Default
- label
- The defined Storage resources are:
-- Copy Changer Device and Changer Command from Autochanger
- to Device resource in SD if none given in Device resource.
-- 1. Automatic use of more than one drive in an autochanger (done)
-- 2. Automatic selection of the correct drive for each Job (i.e.
- selects a drive with an appropriate Volume for the Job) (done)
-- 6. Allow multiple simultaneous Jobs referencing the same pool write
- to several tapes (some new directive(s) are are probably needed for
- this) (done)
-- Locking (done)
-- Key on Storage rather than Pool (done)
-- Allow multiple drives to use same Pool (change jobq.c DIR) (done).
-- Synchronize multiple drives so that not more
- than one loads a tape and any time (done)
-- 4. Use Changer Device and Changer Command specified in the
- Autochanger resource, if none is found in the Device resource.
- You can continue to specify them in the Device resource if you want
- or need them to be different for each device.
-- 5. Implement a new Device directive (perhaps "Autoselect = yes/no")
- that can allow a Device be part of an Autochanger, and hence the changer
- script protected, but if set to no, will prevent the Device from being
- automatically selected from the changer. This allows the device to
- be directly accessed through its Device name, but not through the
- AutoChanger name.
-#6 Select one from among Multiple Storage Devices for Job
-#5 Events that call a Python program
- (Implemented in Dir/SD)
-- Make sure the Device name is in the Query packet returned.
-- Don't start a second file job if one is already running.
-- Implement EOF/EOV labels for ANSI labels
-- Implement IBM labels.
-- When Python creates a new label, the tape is immediately
- recycled and no label created. This happens when using
- autolabeling -- even when Python doesn't generate the name.
-- Scratch Pool where the volumes can be re-assigned to any Pool.
-- 28-Mar 23:19 rufus-sd: acquire.c:379 Device "DDS-4" (/dev/nst0)
- is busy reading. Job 6 canceled.
-- Remove separate thread for opening devices in SD. On the other
- hand, don't block waiting for open() for devices.
-- Fix code to either handle updating NumVol or to calculate it in
- Dir next_vol.c
-- Ensure that you cannot exclude a directory or a file explicitly
- Included with File.
-#4 Embedded Python Scripting
- (Implemented in Dir/SD/FD)
-- Add Python writable variable for changing the Priority,
- Client, Storage, JobStatus (error), ...
-- SD Python
- - Solicit Events
-- Add disk seeking on restore; turn off seek on tapes.
- stored/match_bsr.c
-- Look at dird_conf.c:1000: warning: `int size'
- might be used uninitialized in this function
-- Indicate when a Job is purged/pruned during restore.
-- Implement some way to turn off automatic pruning in Jobs.
-- Implement a way an Admin Job can prune, possibly multiple
- clients -- Python script?
-- Look at Preben's acl.c error handling code.
-- SD crashes after a tape restore then doing a backup.
-- If drive is opened read/write, close it and re-open
- read-only if doing a restore, and vice-versa.
-- Windows restore:
- data-fd: RestoreFiles.2004-12-07_15.56.42 Error:
- > ..\findlib\../../findlib/create_file.c:275 Could not open e:/: ERR=Der
- > Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen
- > Prozess verwendet wird.
- Restore restores all files, but then fails at the end trying
- to set the attributes of e:
- from failed jobs.- Resolve the problem between Device name and Archive name,
- and fix SD messages.
-- Tell the "restore" user when browsing is no longer possible.
-- Add a restore directory-x
-- Write non-optimized bsrs from the JobMedia and Media records,
- even after Files are pruned.
-- Delete Stripe and Copy from VolParams to save space.
-- Fix option 2 of restore -- list where file is backed up -- require Client,
- then list last 20 backups.
-- Finish implementation of passing all Storage and Device needs to
- the SD.
-- Move test for max wait time exceeded in job.c up -- Peter's idea.
-## Consider moving docs to their own project.
-## Move rescue to its own project.
-- Add client version to the Client name line that prints in
- the Job report.
-- Fix the Rescue CDROM.
-- By the way: on page http://www.bacula.org/?page=tapedrives , at the
- bottom, the link to "Tape Testing Chapter" is broken. It goes to
- /html-manual/... while the others point to /rel-manual/...
-- Device resource needs the "name" of the SD.
-- Specify a single directory to restore.
-- Implement MediaType keyword in bsr?
-- Add a date and time stamp at the beginning of every line in the
- Job report (Volker Sauer).
-- Add level to estimate command.
-- Add "limit=n" for "list jobs"
-- Make bootstrap filename unique.
-- Make Dmsg look at global before calling subroutine.
-- From Chris Hull:
- it seems to be complaining about 12:00pm which should be a valid 12
- hour time. I changed the time to 11:59am and everything works fine.
- Also 12:00am works fine. 0:00pm also works (which I don't think
- should). None of the values 12:00pm - 12:59pm work for that matter.
-- Require restore via the restore command or make a restore Job
- get the bootstrap file.
-- Implement Maximum Job Spool Size
-- Fix 3993 error in SD. It forgets to look at autochanger
- resource for device command, ...
-- 3. Prevent two drives requesting the same Volume in any given
- autochanger, by checking if a Volume is mounted on another drive
- in an Autochanger.
-- Upgrade to MySQL 4.1.12 See:
- http://dev.mysql.com/doc/mysql/en/Server_SQL_mode.html
-- Add # Job Level date to bsr file
-- Implement "PreferMountedVolumes = yes|no" in Job resource.
-## Integrate web-bacula into a new Bacula project with
- bimagemgr.
-- Cleaning tapes should have Status "Cleaning" rather than append.
-- Make sure that Python has access to Client address/port so that
- it can check if Clients are alive.
-- Review all items in "restore".
-- Fix PostgreSQL GROUP BY problems in restore.
-- Fix PostgreSQL sql problems in bugs.
-- After rename
- 04-Jul 13:01 MainSD: Rufus.2005-07-04_01.05.02 Warning: Director wanted Volume
- "DLT-13Feb04".
- Current Volume "DLT-04Jul05" not acceptable because:
- 1997 Volume "DLT-13Feb04" not in catalog.
- 04-Jul 13:01 MainSD: Please mount Volume "DLT-04Jul05" on Storage Device
- "HP DLT 80" (/dev/nst0) for Job Rufus.2005-07-04_01.05.02
-## Create a new GUI chapter explaining all the GUI programs.
-- Make "update slots" when pointing to Autochanger, remove
- all Volumes from other drives. "update slots all-drives"?
- No, this is done by modifying mtx-changer to list what is
- in the drives.
-- Finish TLS implementation.
-- Port limiting -m in iptables to prevent DoS attacks
- could cause broken pipes on Bacula.
-6. Build and test the Volume Shadow Copy (VSS) for Win32.
-- Allow cancel of unknown Job
-- State not saved when closing Win32 FD by icon
-- bsr-opt-test fails. bsr deleted. Fix.
-- Move Python daemon variables from Job to Bacula object.
- WorkingDir, ConfigFile
-- Document that Bootstrap files can be written with cataloging
- turned off.
-- Document details of ANSI/IBM labels
-- OS linux 2.4
- 1) ADIC, DLT, FastStor 4000, 7*20GB
-- Linux Sony LIB-D81, AIT-3 library works.
-- Doc the following
- to activate, check or disable the hardware compression feature on my
- exb-8900 i use the exabyte "MammothTool" you can get it here:
- http://www.exabyte.com/support/online/downloads/index.cfm
- There is a solaris version of this tool. With option -C 0 or 1 you can
- disable or activate compression. Start this tool without any options for
- a small reference.
-- Document Heartbeat Interval in the dealing with firewalls section.
-- Document new CDROM directory.
-- On Win32 working directory must have drive letter ????
-- On Win32 working directory must be writable by SYSTEM to
- do restores.
-- Document that ChangerDevice is used for Alert command.
-- Add better documentation on how restores can be done
-8. Take one more try at making DVD writing work (no go)
-7. Write a bacula-web document
-- Why isn't the DEVICE structure defined when doing
- a reservation?
-- Multi-drive changer seems to only use drive 0
- Multiple drives don't seem to be opened.
-- My database is growing
-- Call GetLastError() in the berrno constructor rather
- than delaying until strerror.
-- Tape xxx in drive 0, requested in drive 1
-- The mount command does not work with drives other than 0.
-- A mount should cause the SD to re-examine what Slot is
- loaded.
-- The SD locks on to the first available drive then
- wants a Volume that is released but in another drive --
- chaos.
-- Run the regression scripts on Solaris and FreeBSD
-- Figure out how to package gui, and rescue programs.
-- Add a .dir command to restore tree code to eliminate the problem
-- Mount after manually unloading changer causes hang in SD
-- Fix JobACL with restore by JobId.
+=== Done -- see kernsdone
General:
+Changes to 1.38.2:
+20Oct05
+- 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.
+
Changes to 1.38.1:
14Oct05
- Apply SunOS patch for ACLs submitted by David Duchscher.
General:
Changes to 1.39.0:
+20Oct05
+- 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.
+14Oct05
+- 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.
13Oct05
- Remove the USE_WIN32STREAMEXTRACTION #defines (always on)
and correct a few minor problems to make it build on Linux.
--- /dev/null
+
+ This patch fixes the following bugs:
+
+- Fix crash in tray-monitor when daemon disconnects. Bug #479.
+- Fix bnet-server bug found on OpenBSD. Bug #486 (bug originator
+ says that this patch does not fix his problem)
+- 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
+
+This patch is applied to Bacula source version 1.38.1 and will
+produce Bacula source version 1.38.2. Apply it with:
+
+ cd <bacula-1.38.1-source>
+ ./configure (your options) if not already done
+ patch -p0 <1.38.1-to-1.38.2.patch
+ make
+ make install
+
+Index: kes-1.38
+===================================================================
+RCS file: /cvsroot/bacula/bacula/kes-1.38,v
+retrieving revision 1.1.2.13
+diff -u -r1.1.2.13 kes-1.38
+--- kes-1.38 14 Nov 2005 20:20:38 -0000 1.1.2.13
++++ kes-1.38 21 Nov 2005 12:53:36 -0000
+@@ -3,6 +3,17 @@
+
+ General:
+
++Changes after release of 1.38.1:
++20Oct05
++- 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
++
+ Changes to 1.38.1:
+ 14Oct05
+ - Apply SunOS patch for ACLs submitted by David Duchscher.
+Index: src/version.h
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/version.h,v
+retrieving revision 1.554.2.14
+diff -u -r1.554.2.14 version.h
+--- src/version.h 14 Nov 2005 14:21:58 -0000 1.554.2.14
++++ src/version.h 21 Nov 2005 12:53:37 -0000
+@@ -3,9 +3,9 @@
+ */
+
+ #undef VERSION
+-#define VERSION "1.38.1"
+-#define BDATE "14 November 2005"
+-#define LSMDATE "14Nov05"
++#define VERSION "1.38.2"
++#define BDATE "20 November 2005"
++#define LSMDATE "20Nov05"
+
+ /* Debug flags */
+ #undef DEBUG
+Index: src/dird/catreq.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/dird/catreq.c,v
+retrieving revision 1.77.2.1
+diff -u -r1.77.2.1 catreq.c
+--- src/dird/catreq.c 26 Oct 2005 14:02:04 -0000 1.77.2.1
++++ src/dird/catreq.c 21 Nov 2005 12:53:37 -0000
+@@ -10,7 +10,7 @@
+ * Basic tasks done here:
+ * Handle Catalog services.
+ *
+- * Version $Id: catreq.c,v 1.77.2.1 2005/10/26 14:02:04 kerns Exp $
++ * Version $Id: catreq.c,v 1.79 2005/10/11 20:40:52 kerns Exp $
+ */
+ /*
+ Copyright (C) 2001-2005 Kern Sibbald
+@@ -117,6 +117,7 @@
+ if (sscanf(bs->msg, Find_media, &Job, &index, &pool_name, &mr.MediaType) == 4) {
+ memset(&pr, 0, sizeof(pr));
+ bstrncpy(pr.Name, pool_name, sizeof(pr.Name));
++ unbash_spaces(pr.Name);
+ ok = db_get_pool_record(jcr, jcr->db, &pr);
+ if (ok) {
+ mr.PoolId = pr.PoolId;
+Index: src/dird/ua_restore.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/dird/ua_restore.c,v
+retrieving revision 1.101.2.1
+diff -u -r1.101.2.1 ua_restore.c
+--- src/dird/ua_restore.c 26 Oct 2005 14:02:04 -0000 1.101.2.1
++++ src/dird/ua_restore.c 21 Nov 2005 12:53:37 -0000
+@@ -10,7 +10,7 @@
+ *
+ * Kern Sibbald, July MMII
+ *
+- * Version $Id: ua_restore.c,v 1.101.2.1 2005/10/26 14:02:04 kerns Exp $
++ * Version $Id: ua_restore.c,v 1.102 2005/10/25 17:06:42 kerns Exp $
+ */
+ /*
+ Copyright (C) 2002-2005 Kern Sibbald
+@@ -573,6 +573,7 @@
+ }
+ return 2;
+
++ case -2: /* Period entered to cancel */
+ case 11: /* Cancel or quit */
+ return 0;
+ }
+Index: src/dird/ua_run.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/dird/ua_run.c,v
+retrieving revision 1.71
+diff -u -r1.71 ua_run.c
+--- src/dird/ua_run.c 10 Aug 2005 16:35:19 -0000 1.71
++++ src/dird/ua_run.c 21 Nov 2005 12:53:38 -0000
+@@ -851,6 +851,8 @@
+ bsendmsg(ua, _("You must set the bootstrap file to NULL to be able to specify a JobId.\n"));
+ }
+ goto try_again;
++ case -1: /* error or cancel */
++ goto bail_out;
+ default:
+ goto try_again;
+ }
+Index: src/dird/ua_select.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/dird/ua_select.c,v
+retrieving revision 1.65.2.1
+diff -u -r1.65.2.1 ua_select.c
+--- src/dird/ua_select.c 12 Nov 2005 17:30:52 -0000 1.65.2.1
++++ src/dird/ua_select.c 21 Nov 2005 12:53:39 -0000
+@@ -4,7 +4,7 @@
+ *
+ * Kern Sibbald, October MMI
+ *
+- * Version $Id: ua_select.c,v 1.65.2.1 2005/11/12 17:30:52 kerns Exp $
++ * Version $Id: ua_select.c,v 1.66 2005/11/12 17:31:19 kerns Exp $
+ */
+ /*
+ Copyright (C) 2001-2005 Kern Sibbald
+@@ -149,7 +149,9 @@
+ }
+ }
+ UnlockRes();
+- do_prompt(ua, _("Storage"), _("Select Storage resource"), name, sizeof(name));
++ if (do_prompt(ua, _("Storage"), _("Select Storage resource"), name, sizeof(name)) < 0) {
++ return NULL;
++ }
+ store = (STORE *)GetResWithName(R_STORAGE, name);
+ return store;
+ }
+@@ -170,7 +172,9 @@
+ }
+ }
+ UnlockRes();
+- do_prompt(ua, _("FileSet"), _("Select FileSet resource"), name, sizeof(name));
++ if (do_prompt(ua, _("FileSet"), _("Select FileSet resource"), name, sizeof(name)) < 0) {
++ return NULL;
++ }
+ fs = (FILESET *)GetResWithName(R_FILESET, name);
+ return fs;
+ }
+@@ -202,7 +206,9 @@
+ }
+ }
+ UnlockRes();
+- do_prompt(ua, _("Catalog"), _("Select Catalog resource"), name, sizeof(name));
++ if (do_prompt(ua, _("Catalog"), _("Select Catalog resource"), name, sizeof(name)) < 0) {
++ return NULL;
++ }
+ catalog = (CAT *)GetResWithName(R_CATALOG, name);
+ }
+ return catalog;
+@@ -225,7 +231,9 @@
+ }
+ }
+ UnlockRes();
+- do_prompt(ua, _("Job"), _("Select Job resource"), name, sizeof(name));
++ if (do_prompt(ua, _("Job"), _("Select Job resource"), name, sizeof(name)) < 0) {
++ return NULL;
++ }
+ job = (JOB *)GetResWithName(R_JOB, name);
+ return job;
+ }
+@@ -246,7 +254,9 @@
+ }
+ }
+ UnlockRes();
+- do_prompt(ua, _("Job"), _("Select Restore Job"), name, sizeof(name));
++ if (do_prompt(ua, _("Job"), _("Select Restore Job"), name, sizeof(name)) < 0) {
++ return NULL;
++ }
+ job = (JOB *)GetResWithName(R_JOB, name);
+ return job;
+ }
+@@ -269,7 +279,9 @@
+ }
+ }
+ UnlockRes();
+- do_prompt(ua, _("Client"), _("Select Client (File daemon) resource"), name, sizeof(name));
++ if (do_prompt(ua, _("Client"), _("Select Client (File daemon) resource"), name, sizeof(name)) < 0) {
++ return NULL;
++ }
+ client = (CLIENT *)GetResWithName(R_CLIENT, name);
+ return client;
+ }
+@@ -551,7 +563,9 @@
+ }
+ }
+ UnlockRes();
+- do_prompt(ua, _("Pool"), _("Select Pool resource"), name, sizeof(name));
++ if (do_prompt(ua, _("Pool"), _("Select Pool resource"), name, sizeof(name)) < 0) {
++ return NULL;
++ }
+ pool = (POOL *)GetResWithName(R_POOL, name);
+ return pool;
+ }
+@@ -673,12 +687,16 @@
+ * Returns: -1 on error
+ * index base 0 on success, and choice
+ * is copied to prompt if not NULL
++ * prompt is set to the chosen prompt item string
+ */
+ int do_prompt(UAContext *ua, const char *automsg, const char *msg, char *prompt, int max_prompt)
+ {
+ int i, item;
+ char pmsg[MAXSTRING];
+
++ if (prompt) {
++ *prompt = 0;
++ }
+ if (ua->num_prompts == 2) {
+ item = 1;
+ if (prompt) {
+@@ -698,15 +716,11 @@
+ bsendmsg(ua, "%6d: %s\n", i, ua->prompt[i]);
+ }
+
+- if (prompt) {
+- *prompt = 0;
+- }
+-
+ for ( ;; ) {
+ /* First item is the prompt string, not the items */
+ if (ua->num_prompts == 1) {
+ bsendmsg(ua, _("Selection is empty!\n"));
+- item = 0; /* list is empty ! */
++ item = -1; /* list is empty ! */
+ break;
+ }
+ if (ua->num_prompts == 2) {
+@@ -741,7 +755,7 @@
+ free(ua->prompt[i]);
+ }
+ ua->num_prompts = 0;
+- return item - 1;
++ return item>0 ? item-1 : item;
+ }
+
+
+Index: src/dird/ua_update.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/dird/ua_update.c,v
+retrieving revision 1.7
+diff -u -r1.7 ua_update.c
+--- src/dird/ua_update.c 28 Aug 2005 12:22:02 -0000 1.7
++++ src/dird/ua_update.c 21 Nov 2005 12:53:39 -0000
+@@ -590,7 +590,7 @@
+ update_all_vols_from_pool(ua);
+ return 1;
+ default: /* Done or error */
+- bsendmsg(ua, _("Selection done.\n"));
++ bsendmsg(ua, _("Selection terminated.\n"));
+ return 1;
+ }
+ }
+Index: src/filed/acl.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/filed/acl.c,v
+retrieving revision 1.10.2.1
+diff -u -r1.10.2.1 acl.c
+--- src/filed/acl.c 14 Nov 2005 20:20:38 -0000 1.10.2.1
++++ src/filed/acl.c 21 Nov 2005 12:53:39 -0000
+@@ -26,7 +26,7 @@
+ *
+ * Written by Preben 'Peppe' Guldberg, December MMIV
+ *
+- * Version $Id: acl.c,v 1.10.2.1 2005/11/14 20:20:38 kerns Exp $
++ * Version $Id: acl.c,v 1.11 2005/11/14 20:20:20 kerns Exp $
+ */
+ /*
+ Copyright (C) 2004-2005 Kern Sibbald
+@@ -140,7 +140,7 @@
+
+ if ((acl_text = acl_get(jcr->last_fname)) != NULL) {
+ len = pm_strcpy(jcr->acl_text, acl_text);
+- free(acl_text);
++ actuallyfree(acl_text);
+ return len;
+ }
+ return -1;
+@@ -270,7 +270,7 @@
+ if ((n = getacl(jcr->last_fname, n, acls)) > 0) {
+ if ((acl_text = acltostr(n, acls, FORM_SHORT)) != NULL) {
+ len = pm_strcpy(jcr->acl_text, acl_text);
+- free(acl_text);
++ actuallyfree(acl_text);
+ return len;
+ }
+ }
+Index: src/findlib/bfile.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/findlib/bfile.c,v
+retrieving revision 1.40
+diff -u -r1.40 bfile.c
+--- src/findlib/bfile.c 10 Aug 2005 16:35:19 -0000 1.40
++++ src/findlib/bfile.c 21 Nov 2005 12:53:39 -0000
+@@ -623,13 +623,10 @@
+ int bopen_rsrc(BFILE *bfd, const char *fname, int flags, mode_t mode)
+ {
+ POOLMEM *rsrc_fname;
+- size_t fname_len;
+
+- fname_len = strlen(fname);
+ rsrc_fname = get_pool_memory(PM_FNAME);
+- bstrncpy(rsrc_fname, fname, fname_len + 1);
+- bstrncpy(rsrc_fname + fname_len, _PATH_RSRCFORKSPEC,
+- strlen(_PATH_RSRCFORKSPEC) + 1);
++ pm_strcpy(rsrc_fname, fname);
++ pm_strcat(rsrc_fname, _PATH_RSRCFORKSPEC);
+ bopen(bfd, rsrc_fname, flags, mode);
+ free_pool_memory(rsrc_fname);
+ return bfd->fid;
+Index: src/lib/bnet_server.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/lib/bnet_server.c,v
+retrieving revision 1.39
+diff -u -r1.39 bnet_server.c
+--- src/lib/bnet_server.c 18 Aug 2005 15:37:40 -0000 1.39
++++ src/lib/bnet_server.c 21 Nov 2005 12:53:39 -0000
+@@ -153,7 +153,6 @@
+ /* Error, get out */
+ foreach_dlist(fd_ptr, &sockfds) {
+ close(fd_ptr->fd);
+- free((void *)fd_ptr);
+ }
+ Emsg1(M_FATAL, 0, _("Error in select: %s\n"), be.strerror());
+ break;
+Index: src/stored/autochanger.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/stored/autochanger.c,v
+retrieving revision 1.47.2.3
+diff -u -r1.47.2.3 autochanger.c
+--- src/stored/autochanger.c 12 Nov 2005 17:30:53 -0000 1.47.2.3
++++ src/stored/autochanger.c 21 Nov 2005 12:53:39 -0000
+@@ -4,7 +4,7 @@
+ *
+ * Kern Sibbald, August MMII
+ *
+- * Version $Id: autochanger.c,v 1.47.2.3 2005/11/12 17:30:53 kerns Exp $
++ * Version $Id: autochanger.c,v 1.51 2005/11/12 17:31:19 kerns Exp $
+ */
+ /*
+ Copyright (C) 2002-2005 Kern Sibbald
+@@ -163,6 +163,7 @@
+ rtn_stat = -1; /* hard error */
+ }
+ Dmsg2(400, "load slot %d status=%d\n", slot, status);
++ unlock_changer(dcr);
+ } else {
+ status = 0; /* we got what we want */
+ dev->Slot = slot; /* set currently loaded slot */
+@@ -174,7 +175,6 @@
+ } else {
+ rtn_stat = 0; /* no changer found */
+ }
+- unlock_changer(dcr);
+ free_pool_memory(changer);
+ return rtn_stat;
+
+Index: src/tray-monitor/tray-monitor.c
+===================================================================
+RCS file: /cvsroot/bacula/bacula/src/tray-monitor/tray-monitor.c,v
+retrieving revision 1.25.2.1
+diff -u -r1.25.2.1 tray-monitor.c
+--- src/tray-monitor/tray-monitor.c 1 Oct 2005 10:20:18 -0000 1.25.2.1
++++ src/tray-monitor/tray-monitor.c 21 Nov 2005 12:53:39 -0000
+@@ -4,7 +4,7 @@
+ *
+ * Nicolas Boichat, August MMIV
+ *
+- * Version $Id: tray-monitor.c,v 1.25.2.1 2005/10/01 10:20:18 kerns Exp $
++ * Version $Id: tray-monitor.c,v 1.26 2005/09/28 19:24:57 kerns Exp $
+ */
+
+ /*
+@@ -881,7 +881,7 @@
+ }
+
+ if (item->D_sock == NULL) {
+- g_slist_append(*list, (void *)_("Cannot connect to daemon.\n"));
++ g_slist_append(*list, g_string_new(_("Cannot connect to daemon.\n")));
+ changeStatusMessage(item, _("Cannot connect to daemon."));
+ item->state = error;
+ item->oldstate = error;
--- /dev/null
+20Nov05 1.38.1-to-1.38.2.patch
+ This patch fixes the following bugs:
+
+- Fix crash in tray-monitor when daemon disconnects. Bug #479.
+- Fix bnet-server bug found on OpenBSD. Bug #486 (bug originator
+ says this patch does not fix his problem)
+- 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
+
+
Notes: This would require the usage of disk-based volumes as comparing
files would not be feasible using a tape drive.
+Item 17: Quick release of FD-SD connection
+ Origin: Frank Volf (frank at deze dot org)
+ Date: 17 november 2005
+ Status:
+
+ What: In the bacula implementation a backup is finished after all data
+ and attributes are succesfully written to storage. When using a
+ tape backup it is very annoying that a backup can take a day,
+ simply because the current tape (or whatever) is full and the
+ administrator has not put a new one in. During that time the
+ system cannot be taken off-line, because there is still an open
+ session between the storage daemon and the file daemon on the
+ client.
+
+ Although this is a very good strategey for making "safe backups"
+ This can be annoying for e.g. laptops, that must remain
+ connected until the bacukp is completed.
+
+ Using a new feature called "migration" it will be possible to
+ spool first to harddisk (using a special 'spool' migration
+ scheme) and then migrate the backup to tape.
+
+ There is still the problem of getting the attributes committed.
+ If it takes a very long time to do, with the current code, the
+ job has not terminated, and the File daemon is not freed up. The
+ Storage daemon should release the File daemon as soon as all the
+ file data and all the attributes have been sent to it (the SD).
+ Currently the SD waits until everything is on tape and all the
+ attributes are transmitted to the Director before signalling
+ completion to the FD. I don't think I would have any problem
+ changing this. The reason is that even if the FD reports back to
+ the Dir that all is OK, the job will not terminate until the SD
+ has done the same thing -- so in a way keeping the SD-FD link
+ open to the very end is not really very productive ...
+
+ Why: Makes backup of laptops much easier.
+
============= Empty RFC form ===========
Item n: One line summary ...
============== End RFC form ==============
-Items completed for release 1.38.0:
-#4 Embedded Python Scripting (implemented in all Daemons)
-#5 Events that call a Python program (Implemented in all
- daemons, but more cleanup work to be done).
-#6 Select one from among Multiple Storage Devices for Job.
- This is already implemented in 1.37.
-#7 Single Job Writing to Multiple Storage Devices. This is
- currently implemented with a Clone feature.
-#- Full multiple drive Autochanger support (done in 1.37)
-#- Built in support for communications encryption (TLS)
- done by Landon Fuller.
-# Support for Unicode characters
- (via UTF-8) on Win32 machines thanks to Thorsten Engel.
-Item 8: Break the one-to-one Relationship between a Job and a
- Specific Storage Device (or Devices if #10 is implemented).
-
-Completed items from last year's list:
-Item 1: Multiple simultaneous Jobs. (done)
-Item 3: Write the bscan program -- also write a bcopy program (done).
-Item 5: Implement Label templates (done).
-Item 6: Write a regression script (done)
-Item 9: Add SSL to daemon communications (done by Landon Fuller)
-Item 10: Define definitive tape format (done)
-Item 3: GUI for interactive restore. Partially Implemented in 1.34
- Note, there is now a complete Webmin plugin, a partial
- GNOME console, and an excellent wx-console GUI.
-Item 4: GUI for interactive backup
-Item 2: Job Data Spooling.
- Done: Regular expression matching.
-Item 10: New daemon communication protocol (this has been dropped).
+Items completed for release 1.38.0 -- see kernsdone
if (sscanf(bs->msg, Find_media, &Job, &index, &pool_name, &mr.MediaType) == 4) {
memset(&pr, 0, sizeof(pr));
bstrncpy(pr.Name, pool_name, sizeof(pr.Name));
+ unbash_spaces(pr.Name);
ok = db_get_pool_record(jcr, jcr->db, &pr);
if (ok) {
mr.PoolId = pr.PoolId;
* associated with each Storage. It selects the first
* available one.
*
- * Note, the outer loop is not yet implemented.
*/
foreach_alist(storage, store) {
-// storage = (STORE *)store->first();
pm_strcpy(store_name, storage->hdr.name);
bash_spaces(store_name);
pm_strcpy(media_type, storage->media_type);
}
done = true;
switch (do_prompt(ua, "", _("Select item: "), NULL, 0)) {
- case -1: /* error */
+ case -1: /* error or cancel */
return 0;
case 0: /* list last 20 Jobs run */
gui_save = ua->jcr->gui;
bsendmsg(ua, _("You must set the bootstrap file to NULL to be able to specify a JobId.\n"));
}
goto try_again;
+ case -1: /* error or cancel */
+ goto bail_out;
default:
goto try_again;
}
}
}
UnlockRes();
- do_prompt(ua, _("Storage"), _("Select Storage resource"), name, sizeof(name));
+ if (do_prompt(ua, _("Storage"), _("Select Storage resource"), name, sizeof(name)) < 0) {
+ return NULL;
+ }
store = (STORE *)GetResWithName(R_STORAGE, name);
return store;
}
}
}
UnlockRes();
- do_prompt(ua, _("FileSet"), _("Select FileSet resource"), name, sizeof(name));
+ if (do_prompt(ua, _("FileSet"), _("Select FileSet resource"), name, sizeof(name)) < 0) {
+ return NULL;
+ }
fs = (FILESET *)GetResWithName(R_FILESET, name);
return fs;
}
}
}
UnlockRes();
- do_prompt(ua, _("Catalog"), _("Select Catalog resource"), name, sizeof(name));
+ if (do_prompt(ua, _("Catalog"), _("Select Catalog resource"), name, sizeof(name)) < 0) {
+ return NULL;
+ }
catalog = (CAT *)GetResWithName(R_CATALOG, name);
}
return catalog;
}
}
UnlockRes();
- do_prompt(ua, _("Job"), _("Select Job resource"), name, sizeof(name));
+ if (do_prompt(ua, _("Job"), _("Select Job resource"), name, sizeof(name)) < 0) {
+ return NULL;
+ }
job = (JOB *)GetResWithName(R_JOB, name);
return job;
}
}
}
UnlockRes();
- do_prompt(ua, _("Job"), _("Select Restore Job"), name, sizeof(name));
+ if (do_prompt(ua, _("Job"), _("Select Restore Job"), name, sizeof(name)) < 0) {
+ return NULL;
+ }
job = (JOB *)GetResWithName(R_JOB, name);
return job;
}
}
}
UnlockRes();
- do_prompt(ua, _("Client"), _("Select Client (File daemon) resource"), name, sizeof(name));
+ if (do_prompt(ua, _("Client"), _("Select Client (File daemon) resource"), name, sizeof(name)) < 0) {
+ return NULL;
+ }
client = (CLIENT *)GetResWithName(R_CLIENT, name);
return client;
}
}
}
UnlockRes();
- do_prompt(ua, _("Pool"), _("Select Pool resource"), name, sizeof(name));
+ if (do_prompt(ua, _("Pool"), _("Select Pool resource"), name, sizeof(name)) < 0) {
+ return NULL;
+ }
pool = (POOL *)GetResWithName(R_POOL, name);
return pool;
}
* Returns: -1 on error
* index base 0 on success, and choice
* is copied to prompt if not NULL
+ * prompt is set to the chosen prompt item string
*/
int do_prompt(UAContext *ua, const char *automsg, const char *msg, char *prompt, int max_prompt)
{
int i, item;
char pmsg[MAXSTRING];
+ if (prompt) {
+ *prompt = 0;
+ }
if (ua->num_prompts == 2) {
item = 1;
if (prompt) {
bsendmsg(ua, "%6d: %s\n", i, ua->prompt[i]);
}
- if (prompt) {
- *prompt = 0;
- }
-
for ( ;; ) {
/* First item is the prompt string, not the items */
if (ua->num_prompts == 1) {
bsendmsg(ua, _("Selection is empty!\n"));
- item = 0; /* list is empty ! */
+ item = -1; /* list is empty ! */
break;
}
if (ua->num_prompts == 2) {
free(ua->prompt[i]);
}
ua->num_prompts = 0;
- return item - 1;
+ return item>0 ? item-1 : item;
}
update_all_vols_from_pool(ua);
return 1;
default: /* Done or error */
- bsendmsg(ua, _("Selection done.\n"));
+ bsendmsg(ua, _("Selection terminated.\n"));
return 1;
}
}
if ((acl_text = acl_get(jcr->last_fname)) != NULL) {
len = pm_strcpy(jcr->acl_text, acl_text);
- free(acl_text);
+ actuallyfree(acl_text);
return len;
}
return -1;
if ((n = getacl(jcr->last_fname, n, acls)) > 0) {
if ((acl_text = acltostr(n, acls, FORM_SHORT)) != NULL) {
len = pm_strcpy(jcr->acl_text, acl_text);
- free(acl_text);
+ actuallyfree(acl_text);
return len;
}
}
/* Error, get out */
foreach_dlist(fd_ptr, &sockfds) {
close(fd_ptr->fd);
- free((void *)fd_ptr);
}
Emsg1(M_FATAL, 0, _("Error in select: %s\n"), be.strerror());
break;
rtn_stat = -1; /* hard error */
}
Dmsg2(400, "load slot %d status=%d\n", slot, status);
+ unlock_changer(dcr);
} else {
status = 0; /* we got what we want */
dev->Slot = slot; /* set currently loaded slot */
} else {
rtn_stat = 0; /* no changer found */
}
- unlock_changer(dcr);
free_pool_memory(changer);
return rtn_stat;
Dmsg2(300, "No nxt_bsr use_pos=%d repos=%d\n", root_bsr->use_positioning, root_bsr->reposition);
return NULL;
}
- Dmsg2(100, "use_pos=%d repos=%d\n", root_bsr->use_positioning, root_bsr->reposition);
+ Dmsg2(300, "use_pos=%d repos=%d\n", root_bsr->use_positioning, root_bsr->reposition);
root_bsr->mount_next_volume = false;
for (bsr=root_bsr; bsr; bsr=bsr->next) {
if (bsr->done || !match_volume(bsr, bsr->volume, &dev->VolHdr, 1)) {
bool match_set_eof(BSR *bsr, DEV_RECORD *rec)
{
BSR *rbsr = rec->bsr;
- Dmsg1(100, "match_set %d\n", rbsr != NULL);
+ Dmsg1(300, "match_set %d\n", rbsr != NULL);
if (!rbsr) {
return false;
}
if (rbsr->count && rbsr->found >= rbsr->count) {
rbsr->done = true;
rbsr->root->reposition = true;
- Dmsg2(100, "match_set_eof reposition count=%d found=%d\n",
+ Dmsg2(500, "match_set_eof reposition count=%d found=%d\n",
rbsr->count, rbsr->found);
return true;
}
goto no_match;
}
if (!match_volfile(bsr, bsr->volfile, rec, 1)) {
- Dmsg2(100, "Fail on file. bsr=%d rec=%d\n", bsr->volfile->efile,
+ Dmsg2(300, "Fail on file. bsr=%d rec=%d\n", bsr->volfile->efile,
rec->File);
goto no_match;
}
if (!match_sesstime(bsr, bsr->sesstime, rec, 1)) {
- Dmsg2(100, "Fail on sesstime. bsr=%d rec=%d\n",
+ Dmsg2(300, "Fail on sesstime. bsr=%d rec=%d\n",
bsr->sesstime->sesstime, rec->VolSessionTime);
goto no_match;
}
/* NOTE!! This test MUST come after the sesstime test */
if (!match_sessid(bsr, bsr->sessid, rec)) {
- Dmsg2(100, "Fail on sessid. bsr=%d rec=%d\n",
+ Dmsg2(300, "Fail on sessid. bsr=%d rec=%d\n",
bsr->sessid->sessid, rec->VolSessionId);
goto no_match;
}
if (!(rec->state & REC_ISTAPE)) {
return 1; /* All File records OK for this match */
}
-// Dmsg3(100, "match_volfile: sfile=%d efile=%d recfile=%d\n",
+// Dmsg3(300, "match_volfile: sfile=%d efile=%d recfile=%d\n",
// volfile->sfile, volfile->efile, rec->File);
if (volfile->sfile <= rec->File && volfile->efile >= rec->File) {
return 1;
if (volfile->done && done) {
bsr->done = true;
bsr->root->reposition = true;
- Dmsg2(100, "bsr done from volfile rec=%d volefile=%d\n",
+ Dmsg2(300, "bsr done from volfile rec=%d volefile=%d\n",
rec->File, volfile->efile);
}
return 0;
if (sesstime->done && done) {
bsr->done = true;
bsr->root->reposition = true;
- Dmsg0(100, "bsr done from sesstime\n");
+ Dmsg0(300, "bsr done from sesstime\n");
}
return 0;
}
if (findex->done && done) {
bsr->done = true;
bsr->root->reposition = true;
- Dmsg1(100, "bsr done from findex %d\n", rec->FileIndex);
+ Dmsg1(300, "bsr done from findex %d\n", rec->FileIndex);
}
return 0;
}
bool found = false;
int bps, sec;
JCR *jcr;
+ DCR *dcr;
char JobName[MAX_NAME_LENGTH];
char b1[30], b2[30], b3[30];
bnet_fsend(user, _("%s Job %s waiting for Client connection.\n"),
job_type_to_str(jcr->JobType), jcr->Job);
}
- if (jcr->dcr && jcr->dcr->device) {
+ dcr = jcr->dcr;
+ if (dcr && dcr->device) {
bstrncpy(JobName, jcr->Job, sizeof(JobName));
/* There are three periods after the Job name */
char *p;
*p = 0;
}
}
- bnet_fsend(user, _("%s %s job %s JobId=%d Volume=\"%s\" device=\"%s\"\n"),
+ bnet_fsend(user, _("%s %s job %s JobId=%d Volume=\"%s\"\n"
+ " pool=\"%s\" device=\"%s\"\n"),
job_level_to_str(jcr->JobLevel),
job_type_to_str(jcr->JobType),
JobName,
jcr->JobId,
- jcr->dcr->VolumeName,
- jcr->dcr->device->device_name);
+ dcr->VolumeName,
+ dcr->pool_name,
+ dcr->dev?dcr->dev->print_name():
+ dcr->device->device_name);
sec = time(NULL) - jcr->run_time;
if (sec <= 0) {
sec = 1;
res->res_dev.hdr.name,
res->res_dev.media_type, res->res_dev.device_name,
res->res_dev.label_type);
- sendit(sock, " rew_wait=%d min_bs=%d max_bs=%d\n",
+ sendit(sock, " rew_wait=%d min_bs=%d max_bs=%d chgr_wait=%d\n",
res->res_dev.max_rewind_wait, res->res_dev.min_block_size,
- res->res_dev.max_block_size);
+ res->res_dev.max_block_size, res->res_dev.max_changer_wait);
sendit(sock, " max_jobs=%d max_files=%" lld " max_size=%" lld "\n",
res->res_dev.max_volume_jobs, res->res_dev.max_volume_files,
res->res_dev.max_volume_size);
sendit(sock, " max_file_size=%" lld " capacity=%" lld "\n",
res->res_dev.max_file_size, res->res_dev.volume_capacity);
- sendit(sock, " spool_directory=%s\n", NPRT(res->res_dev.spool_directory));
- sendit(sock, " max_spool_size=%" lld " max_job_spool_size=%" lld "\n",
+ sendit(sock, " spool_directory=%s\n", NPRT(res->res_dev.spool_directory));
+ sendit(sock, " max_spool_size=%" lld " max_job_spool_size=%" lld "\n",
res->res_dev.max_spool_size, res->res_dev.max_job_spool_size);
if (res->res_dev.changer_res) {
sendit(sock, " changer=%p\n", res->res_dev.changer_res);
}
if (item->D_sock == NULL) {
- g_slist_append(*list, (void *)_("Cannot connect to daemon.\n"));
+ g_slist_append(*list, g_string_new(_("Cannot connect to daemon.\n")));
changeStatusMessage(item, _("Cannot connect to daemon."));
item->state = error;
item->oldstate = error;
#undef VERSION
#define VERSION "1.39.0"
-#define BDATE "13 November 2005"
-#define LSMDATE "13Nov05"
+#define BDATE "20 November 2005"
+#define LSMDATE "20Nov05"
/* Debug flags */
#undef DEBUG