X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=bacula%2Fsrc%2Fstored%2Faskdir.c;h=898dfa093f40c97e5618c83d0a419080b34c6a07;hb=79822b6b171cc2af23c6f3cd1608c59e15897a84;hp=00666364120724867a3545476a39bd657b1de2e3;hpb=65d5c800f488cb2f4618e7221019c94be909bd64;p=bacula%2Fbacula diff --git a/bacula/src/stored/askdir.c b/bacula/src/stored/askdir.c index 0066636412..898dfa093f 100644 --- a/bacula/src/stored/askdir.c +++ b/bacula/src/stored/askdir.c @@ -1,12 +1,12 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2009 Free Software Foundation Europe e.V. + Copyright (C) 2000-2010 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public + modify it under the terms of version three of the GNU Affero General Public License as published by the Free Software Foundation and included in the file LICENSE. @@ -15,7 +15,7 @@ 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 + You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -31,7 +31,6 @@ * * Kern Sibbald, December 2000 * - * Version $Id$ */ #include "bacula.h" /* pull in global headers */ @@ -74,7 +73,7 @@ static char Device_update[] = "DevUpd Job=%s device=%s " "changer_name=%s media_type=%s volume_name=%s\n"; -/* Send update information about a device to Director */ +/** Send update information about a device to Director */ bool dir_update_device(JCR *jcr, DEVICE *dev) { BSOCK *dir = jcr->dir_bsock; @@ -143,7 +142,7 @@ bool dir_update_changer(JCR *jcr, AUTOCHANGER *changer) #endif -/* +/** * Send current JobStatus to Director */ bool dir_send_job_status(JCR *jcr) @@ -151,7 +150,7 @@ bool dir_send_job_status(JCR *jcr) return jcr->dir_bsock->fsend(Job_status, jcr->Job, jcr->JobStatus); } -/* +/** * Common routine for: * dir_get_volume_info() * and @@ -173,6 +172,7 @@ static bool do_get_volume_info(DCR *dcr) int n; int32_t InChanger; + dcr->setVolCatInfo(false); if (dir->recv() <= 0) { Dmsg0(200, "getvolname error bnet_recv\n"); Mmsg(jcr->errmsg, _("Network error on bnet_recv in req_vol_info.\n")); @@ -197,6 +197,7 @@ static bool do_get_volume_info(DCR *dcr) return false; } vol.InChanger = InChanger; /* bool in structure */ + vol.is_valid = true; unbash_spaces(vol.VolCatName); bstrncpy(dcr->VolumeName, vol.VolCatName, sizeof(dcr->VolumeName)); dcr->VolCatInfo = vol; /* structure assignment */ @@ -207,7 +208,7 @@ static bool do_get_volume_info(DCR *dcr) } -/* +/** * Get Volume info for a specific volume from the Director's Database * * Returns: true on success (Director guarantees that Pool and MediaType @@ -223,12 +224,12 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) BSOCK *dir = jcr->dir_bsock; P(vol_info_mutex); - bstrncpy(dcr->VolCatInfo.VolCatName, dcr->VolumeName, sizeof(dcr->VolCatInfo.VolCatName)); - bash_spaces(dcr->VolCatInfo.VolCatName); - dir->fsend(Get_Vol_Info, jcr->Job, dcr->VolCatInfo.VolCatName, + dcr->setVolCatName(dcr->VolumeName); + bash_spaces(dcr->getVolCatName()); + dir->fsend(Get_Vol_Info, jcr->Job, dcr->getVolCatName(), writing==GET_VOL_INFO_FOR_WRITE?1:0); Dmsg1(100, ">dird %s", dir->msg); - unbash_spaces(dcr->VolCatInfo.VolCatName); + unbash_spaces(dcr->getVolCatName()); bool ok = do_get_volume_info(dcr); V(vol_info_mutex); return ok; @@ -236,7 +237,7 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) -/* +/** * Get info on the next appendable volume in the Director's database * * Returns: true on success dcr->VolumeName is volume @@ -313,7 +314,7 @@ get_out: } -/* +/** * After writing a Volume, send the updated statistics * back to the director. The information comes from the * dev record. @@ -330,7 +331,7 @@ bool dir_update_volume_info(DCR *dcr, bool label, bool update_LastWritten) POOL_MEM VolumeName; /* If system job, do not update catalog */ - if (jcr->get_JobType() == JT_SYSTEM) { + if (jcr->getJobType() == JT_SYSTEM) { return true; } @@ -342,7 +343,7 @@ bool dir_update_volume_info(DCR *dcr, bool label, bool update_LastWritten) /* Lock during Volume update */ P(vol_info_mutex); - Dmsg1(100, "Update cat VolFiles=%d\n", dev->file); + Dmsg1(100, "Update cat VolBytes=%lld\n", vol->VolCatBytes); /* Just labeled or relabeled the tape */ if (label) { bstrncpy(vol->VolCatStatus, "Append", sizeof(vol->VolCatStatus)); @@ -384,7 +385,7 @@ bail_out: return ok; } -/* +/** * After writing a Volume, create the JobMedia record. */ bool dir_create_jobmedia_record(DCR *dcr, bool zero) @@ -394,7 +395,7 @@ bool dir_create_jobmedia_record(DCR *dcr, bool zero) char ed1[50]; /* If system job, do not update catalog */ - if (jcr->get_JobType() == JT_SYSTEM) { + if (jcr->getJobType() == JT_SYSTEM) { return true; } @@ -439,8 +440,21 @@ bool dir_create_jobmedia_record(DCR *dcr, bool zero) } -/* +/** * Update File Attribute data + * We do the following: + * 1. expand the bsock buffer to be large enough + * 2. Write a "header" into the buffer with serialized data + * VolSessionId + * VolSeesionTime + * FileIndex + * Stream + * data length that follows + * start of raw byte data from the Device record. + * Note, this is primarily for Attribute data, but can + * also handle any device record. The Director must know + * the raw byte data format that is defined for each Stream. + * Now Restore Objects pass through here STREAM_RESTORE_OBJECT */ bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { @@ -465,11 +479,15 @@ bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) ser_bytes(rec->data, rec->data_len); dir->msglen = ser_length(dir->msg); Dmsg1(1800, ">dird %s\n", dir->msg); /* Attributes */ + if (rec->Stream == STREAM_UNIX_ATTRIBUTES || + rec->Stream == STREAM_UNIX_ATTRIBUTES_EX) { + dir->set_data_end(); /* set offset of last valid data */ + } return dir->send(); } -/* +/** * Request the sysop to create an appendable volume * * Entered with device blocked. @@ -494,6 +512,9 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) JCR *jcr = dcr->jcr; bool got_vol = false; + if (job_canceled(jcr)) { + return false; + } Dmsg0(400, "enter dir_ask_sysop_to_create_appendable_volume\n"); ASSERT(dev->blocked()); for ( ;; ) { @@ -510,8 +531,8 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) } else { if (stat == W_TIMEOUT || stat == W_MOUNT) { Mmsg(dev->errmsg, _( -"Job %s waiting. Cannot find any appendable volumes.\n" -"Please use the \"label\" command to create a new Volume for:\n" +"Job %s is waiting. Cannot find any appendable volumes.\n" +"Please use the \"label\" command to create a new Volume for:\n" " Storage: %s\n" " Pool: %s\n" " Media type: %s\n"), @@ -560,7 +581,7 @@ get_out: return true; } -/* +/** * Request to mount specific Volume * * Entered with device blocked and dcr->VolumeName is desired