X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fbscan.c;h=45f53f5332e447bc80d1323f1d9625fef7ef8203;hb=8102b76e72094489738398d30e0e6be72df9e0e6;hp=198325246512954c05943788aadba82950261df7;hpb=59b310539e83184635c0a1a91b0872df8bb64647;p=bacula%2Fbacula diff --git a/bacula/src/stored/bscan.c b/bacula/src/stored/bscan.c index 1983252465..45f53f5332 100644 --- a/bacula/src/stored/bscan.c +++ b/bacula/src/stored/bscan.c @@ -10,7 +10,7 @@ * Version $Id$ */ /* - Copyright (C) 2001, 2002 Kern Sibbald and John Walker + Copyright (C) 2001-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 @@ -36,12 +36,12 @@ /* Forward referenced functions */ static void do_scan(void); -static int record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec); +static bool record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec); static int create_file_attributes_record(B_DB *db, JCR *mjcr, char *fname, char *lname, int type, char *ap, DEV_RECORD *rec); static int create_media_record(B_DB *db, MEDIA_DBR *mr, VOLUME_LABEL *vl); -static int update_media_record(B_DB *db, MEDIA_DBR *mr); +static bool update_media_record(B_DB *db, MEDIA_DBR *mr); static int create_pool_record(B_DB *db, POOL_DBR *pr); static JCR *create_job_record(B_DB *db, JOB_DBR *mr, SESSION_LABEL *label, DEV_RECORD *rec); static int update_job_record(B_DB *db, JOB_DBR *mr, SESSION_LABEL *elabel, @@ -55,7 +55,7 @@ static int update_SIG_record(B_DB *db, char *SIGbuf, DEV_RECORD *rec, int type); /* Global variables */ STORES *me; -#ifdef HAVE_CYGWIN +#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32) int win32_client = 1; #else int win32_client = 0; @@ -80,34 +80,44 @@ static ATTR *attr; static time_t lasttime = 0; -static char *db_name = "bacula"; -static char *db_user = "bacula"; -static char *db_password = ""; -static char *db_host = NULL; -static char *wd = NULL; -static int update_db = 0; -static int update_vol_info = 0; -static int list_records = 0; +static const char *db_name = "bacula"; +static const char *db_user = "bacula"; +static const char *db_password = ""; +static const char *db_host = NULL; +static const char *wd = NULL; +static bool update_db = false; +static bool update_vol_info = false; +static bool list_records = false; static int ignored_msgs = 0; +static uint64_t currentVolumeSize; +static int64_t last_pct = -1; +static bool showProgress = false; +static int num_jobs = 0; +static int num_pools = 0; +static int num_media = 0; +static int num_files = 0; + #define CONFIG_FILE "bacula-sd.conf" char *configfile; - +bool forge_on = false; static void usage() { fprintf(stderr, _( +"Copyright (C) 2001-2004 Kern Sibbald and John Walker.\n" "\nVersion: " VERSION " (" BDATE ")\n\n" -"Usage: bscan [-d debug_level] \n" +"Usage: bscan [ options ] \n" " -b bootstrap specify a bootstrap file\n" " -c specify configuration file\n" " -d set debug level to nn\n" " -m update media info in database\n" " -n specify the database name (default bacula)\n" " -u specify database user name (default bacula)\n" -" -p 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" " -v verbose\n" @@ -127,8 +137,11 @@ int main (int argc, char *argv[]) init_msg(NULL, NULL); - while ((ch = getopt(argc, argv, "b:c:d:h:mn:p:rsu:vV:w:?")) != -1) { + while ((ch = getopt(argc, argv, "b:c:d:h:mn:pP:rsSu:vV:w:?")) != -1) { switch (ch) { + case 'S' : + showProgress = true; + break; case 'b': bsr = parse_bsr(NULL, optarg); break; @@ -151,7 +164,7 @@ int main (int argc, char *argv[]) break; case 'm': - update_vol_info = 1; + update_vol_info = true; break; case 'n': @@ -162,16 +175,20 @@ int main (int argc, char *argv[]) db_user = optarg; break; - case 'p': + case 'P': db_password = optarg; break; + case 'p': + forge_on = true; + break; + case 'r': - list_records = 1; + list_records = true; break; case 's': - update_db = 1; + update_db = true; break; case 'v': @@ -238,6 +255,12 @@ int main (int argc, char *argv[]) if (!dev) { exit(1); } + if (showProgress) { + struct stat sb; + fstat(dev->fd, &sb); + currentVolumeSize = sb.st_size; + Pmsg1(000, _("Current Volume Size = %" llu "\n"), currentVolumeSize); + } if ((db=db_init_database(NULL, db_name, db_user, db_password, db_host, 0, NULL)) == NULL) { Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n")); @@ -251,8 +274,12 @@ int main (int argc, char *argv[]) } do_scan(); + printf("Records %sadded to catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n", + update_db?"":"would have been ", + num_media, num_pools, num_jobs, num_files); free_jcr(bjcr); + term_dev(dev); return 0; } @@ -261,19 +288,24 @@ int main (int argc, char *argv[]) * the end of writing a tape by wiffling through the attached * jcrs creating jobmedia records. */ -static int bscan_mount_next_read_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) +static bool bscan_mount_next_read_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) { Dmsg1(100, "Walk attached jcrs. Volume=%s\n", dev->VolCatInfo.VolCatName); - for (JCR *mjcr=NULL; (mjcr=next_attached_jcr(dev, mjcr)); ) { + DCR *dcr; + foreach_dlist(dcr, dev->attached_dcrs) { + JCR *mjcr = dcr->jcr; + if (mjcr->JobId == 0) { + continue; + } if (verbose) { Pmsg1(000, _("Create JobMedia for Job %s\n"), mjcr->Job); } if (dev->state & ST_TAPE) { - mjcr->EndBlock = dev->EndBlock; - mjcr->EndFile = dev->EndFile; + dcr->EndBlock = dev->EndBlock; + dcr->EndFile = dev->EndFile; } else { - mjcr->EndBlock = (uint32_t)dev->file_addr; - mjcr->StartBlock = (uint32_t)(dev->file_addr >> 32); + dcr->EndBlock = (uint32_t)dev->file_addr; + dcr->EndFile = (uint32_t)(dev->file_addr >> 32); } if (!create_jobmedia_record(db, mjcr)) { Pmsg2(000, _("Could not create JobMedia record for Volume=%s Job=%s\n"), @@ -284,9 +316,14 @@ static int bscan_mount_next_read_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) * we call mount_next... with bscan's jcr because that is where we * have the Volume list, but we get attached. */ - int stat = mount_next_read_volume(jcr, dev, block); - /* we must once more detach ourselves (attached by mount_next ...) */ - detach_jcr_from_device(dev, jcr); /* detach bscan jcr */ + bool stat = mount_next_read_volume(jcr, dev, block); + + if (showProgress) { + struct stat sb; + fstat(dev->fd, &sb); + currentVolumeSize = sb.st_size; + Pmsg1(000, _("Current Volume Size = %" llu "\n"), currentVolumeSize); + } return stat; } @@ -302,23 +339,35 @@ static void do_scan() memset(&fr, 0, sizeof(fr)); /* Detach bscan's jcr as we are not a real Job on the tape */ - detach_jcr_from_device(dev, bjcr); - read_records(bjcr, dev, record_cb, bscan_mount_next_read_volume); - release_device(bjcr, dev); + read_records(bjcr->dcr, record_cb, bscan_mount_next_read_volume); +// release_device(bjcr); free_attr(attr); - term_dev(dev); } -static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) +/* + * Returns: true if OK + * false if error + */ +static bool record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) { JCR *mjcr; + DCR *dcr; char ec1[30]; if (rec->data_len > 0) { mr.VolBytes += rec->data_len + WRITE_RECHDR_LENGTH; /* Accumulate Volume bytes */ + if (showProgress) { + int64_t pct = (mr.VolBytes * 100) / currentVolumeSize; + if (pct != last_pct) { + fprintf(stdout, "done: %" lld "\n", pct); + fflush(stdout); + last_pct = pct; + } + } } + if (list_records) { Pmsg5(000, _("Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n"), rec->VolSessionId, rec->VolSessionTime, rec->FileIndex, @@ -329,7 +378,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) * */ if (rec->FileIndex < 0) { - int save_update_db = update_db; + bool save_update_db = update_db; if (verbose > 1) { dump_label_record(dev, rec, 1); @@ -337,7 +386,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) switch (rec->FileIndex) { case PRE_LABEL: Pmsg0(000, _("Volume is prelabeled. This tape cannot be scanned.\n")); - return 1; + return false; break; case VOL_LABEL: @@ -345,6 +394,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) /* Check Pool info */ bstrncpy(pr.Name, dev->VolHdr.PoolName, sizeof(pr.Name)); bstrncpy(pr.PoolType, dev->VolHdr.PoolType, sizeof(pr.PoolType)); + num_pools++; if (db_get_pool_record(bjcr, db, &pr)) { if (verbose) { Pmsg1(000, _("Pool record for %s found in DB.\n"), pr.Name); @@ -359,7 +409,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) if (strcmp(pr.PoolType, dev->VolHdr.PoolType) != 0) { Pmsg2(000, _("VOL_LABEL: PoolType mismatch. DB=%s Vol=%s\n"), pr.PoolType, dev->VolHdr.PoolType); - return 1; + return true; } else if (verbose) { Pmsg1(000, _("Pool type \"%s\" is OK.\n"), pr.PoolType); } @@ -368,6 +418,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) memset(&mr, 0, sizeof(mr)); bstrncpy(mr.VolumeName, dev->VolHdr.VolName, sizeof(mr.VolumeName)); mr.PoolId = pr.PoolId; + num_media++; if (db_get_media_record(bjcr, db, &mr)) { if (verbose) { Pmsg1(000, _("Media record for %s found in DB.\n"), mr.VolumeName); @@ -386,15 +437,15 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) if (strcmp(mr.MediaType, dev->VolHdr.MediaType) != 0) { Pmsg2(000, _("VOL_LABEL: MediaType mismatch. DB=%s Vol=%s\n"), mr.MediaType, dev->VolHdr.MediaType); - return 1; + return true; /* ignore error */ } else if (verbose) { Pmsg1(000, _("Media type \"%s\" is OK.\n"), mr.MediaType); } /* Reset some JCR variables */ - for (mjcr=NULL; (mjcr=next_attached_jcr(dev, mjcr)); ) { - mjcr->VolFirstIndex = mjcr->FileIndex = 0; - mjcr->StartBlock = mjcr->EndBlock = 0; - mjcr->StartFile = mjcr->EndFile = 0; + foreach_dlist(dcr, dev->attached_dcrs) { + dcr->VolFirstIndex = dcr->FileIndex = 0; + dcr->StartBlock = dcr->EndBlock = 0; + dcr->StartFile = dcr->EndFile = 0; } Pmsg1(000, _("VOL_LABEL: OK for Volume: %s\n"), mr.VolumeName); @@ -402,6 +453,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) case SOS_LABEL: mr.VolJobs++; + num_jobs++; if (ignored_msgs > 0) { Pmsg1(000, _("%d \"errors\" ignored before first Start of Session record.\n"), ignored_msgs); @@ -409,10 +461,10 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) } unser_session_label(&label, rec); memset(&jr, 0, sizeof(jr)); - jr.JobId = label.JobId; + bstrncpy(jr.Job, label.Job, sizeof(jr.Job)); if (db_get_job_record(bjcr, db, &jr)) { /* Job record already exists in DB */ - update_db = 0; /* don't change db in create_job_record */ + update_db = false; /* don't change db in create_job_record */ if (verbose) { Pmsg1(000, _("SOS_LABEL: Found Job record for JobId: %d\n"), jr.JobId); } @@ -430,19 +482,24 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) /* process label, if Job record exists don't update db */ mjcr = create_job_record(db, &jr, &label, rec); + dcr = mjcr->dcr; update_db = save_update_db; jr.PoolId = pr.PoolId; /* Set start positions into JCR */ if (dev->state & ST_TAPE) { - mjcr->StartBlock = dev->block_num; - mjcr->StartFile = dev->file; + /* + * Note, we have already advanced past current block, + * so the correct number is block_num - 1 + */ + dcr->StartBlock = dev->block_num - 1; + dcr->StartFile = dev->file; } else { - mjcr->StartBlock = (uint32_t)dev->file_addr; - mjcr->StartFile = (uint32_t)(dev->file_addr >> 32); + dcr->StartBlock = (uint32_t)dev->file_addr; + dcr->StartFile = (uint32_t)(dev->file_addr >> 32); } mjcr->start_time = jr.StartTime; - mjcr->JobLevel = jr.Level; + mjcr->JobLevel = jr.JobLevel; mjcr->client_name = get_pool_memory(PM_FNAME); pm_strcpy(&mjcr->client_name, label.ClientName); @@ -457,19 +514,19 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) Pmsg3(000, _("SOS_LABEL: VolSessId mismatch for JobId=%u. DB=%d Vol=%d\n"), jr.JobId, jr.VolSessionId, rec->VolSessionId); - return 1; + return true; /* ignore error */ } if (rec->VolSessionTime != jr.VolSessionTime) { Pmsg3(000, _("SOS_LABEL: VolSessTime mismatch for JobId=%u. DB=%d Vol=%d\n"), jr.JobId, jr.VolSessionTime, rec->VolSessionTime); - return 1; + return true; /* ignore error */ } if (jr.PoolId != pr.PoolId) { Pmsg3(000, _("SOS_LABEL: PoolId mismatch for JobId=%u. DB=%d Vol=%d\n"), jr.JobId, jr.PoolId, pr.PoolId); - return 1; + return true; /* ignore error */ } break; @@ -497,7 +554,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) /* Create JobMedia record */ create_jobmedia_record(db, mjcr); - detach_jcr_from_device(dev, mjcr); + dev->attached_dcrs->remove(mjcr->dcr); free_jcr(mjcr); break; @@ -511,8 +568,14 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) * them. */ if (update_db) { - for (mjcr=NULL; (mjcr=next_attached_jcr(dev, mjcr)); ) { + DCR *mdcr; + foreach_dlist(mdcr, dev->attached_dcrs) { + JCR *mjcr = mdcr->jcr; + if (!mjcr || mjcr->JobId == 0) { + continue; + } jr.JobId = mjcr->JobId; + /* Mark Job as Error Terimined */ jr.JobStatus = JS_ErrorTerminated; jr.JobFiles = mjcr->JobFiles; jr.JobBytes = mjcr->JobBytes; @@ -520,10 +583,11 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) jr.VolSessionTime = mjcr->VolSessionTime; jr.JobTDate = (utime_t)mjcr->start_time; jr.ClientId = mjcr->ClientId; - free_jcr(mjcr); if (!db_update_job_end_record(bjcr, db, &jr)) { Pmsg1(0, _("Could not update job record. ERR=%s\n"), db_strerror(db)); } + mjcr->dcr = NULL; + free_jcr(mjcr); } } mr.VolFiles = rec->File; @@ -537,7 +601,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) default: break; } /* end switch */ - return 1; + return true; } mjcr = get_jcr_by_session(rec->VolSessionId, rec->VolSessionTime); @@ -548,10 +612,11 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) } else { ignored_msgs++; } - return 1; + return true; } - if (mjcr->VolFirstIndex == 0) { - mjcr->VolFirstIndex = block->FirstIndex; + dcr = mjcr->dcr; + if (dcr->VolFirstIndex == 0) { + dcr->VolFirstIndex = block->FirstIndex; } /* File Attributes stream */ @@ -575,14 +640,17 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) } fr.JobId = mjcr->JobId; fr.FileId = 0; - if (db_get_file_attributes_record(bjcr, db, attr->fname, NULL, &fr)) { - if (verbose > 1) { - Pmsg1(000, _("File record already exists for: %s\n"), attr->fname); - } - } else { - create_file_attributes_record(db, mjcr, attr->fname, attr->lname, + num_files++; + if (verbose && (num_files & 0x7FFF) == 0) { + char ed1[30], ed2[30], ed3[30], ed4[30]; + Pmsg4(000, _("%s file records. At file:blk=%s:%s bytes=%s\n"), + edit_uint64_with_commas(num_files, ed1), + edit_uint64_with_commas(rec->File, ed2), + edit_uint64_with_commas(rec->Block, ed3), + edit_uint64_with_commas(mr.VolBytes, ed4)); + } + create_file_attributes_record(db, mjcr, attr->fname, attr->lname, attr->type, attr->attr, rec); - } free_jcr(mjcr); break; @@ -648,7 +716,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) Pmsg2(0, _("Unknown stream type!!! stream=%d data=%s\n"), rec->Stream, rec->data); break; } - return 1; + return true; } /* @@ -656,7 +724,7 @@ static int record_cb(JCR *bjcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) * Called from main free_jcr() routine in src/lib/jcr.c so * that we can do our Director specific cleanup of the jcr. */ -static void dird_free_jcr(JCR *jcr) +static void bscan_free_jcr(JCR *jcr) { Dmsg0(200, "Start dird free_jcr\n"); @@ -671,6 +739,10 @@ static void dird_free_jcr(JCR *jcr) if (jcr->RestoreBootstrap) { free(jcr->RestoreBootstrap); } + if (jcr->dcr) { + free_dcr(jcr->dcr); + jcr->dcr = NULL; + } Dmsg0(200, "End dird free_jcr\n"); } @@ -682,7 +754,7 @@ static int create_file_attributes_record(B_DB *db, JCR *mjcr, char *fname, char *lname, int type, char *ap, DEV_RECORD *rec) { - + DCR *dcr = mjcr->dcr; ar.fname = fname; ar.link = lname; ar.ClientId = mjcr->ClientId; @@ -690,10 +762,10 @@ static int create_file_attributes_record(B_DB *db, JCR *mjcr, ar.Stream = rec->Stream; ar.FileIndex = rec->FileIndex; ar.attr = ap; - if (mjcr->VolFirstIndex == 0) { - mjcr->VolFirstIndex = rec->FileIndex; + if (dcr->VolFirstIndex == 0) { + dcr->VolFirstIndex = rec->FileIndex; } - mjcr->FileIndex = rec->FileIndex; + dcr->FileIndex = rec->FileIndex; mjcr->JobFiles++; if (!update_db) { @@ -720,7 +792,8 @@ static int create_media_record(B_DB *db, MEDIA_DBR *mr, VOLUME_LABEL *vl) struct date_time dt; struct tm tm; - bstrncpy(mr->VolStatus, "Full", sizeof(mr->VolStatus)); + /* We mark Vols as Archive to keep them from being re-written */ + bstrncpy(mr->VolStatus, "Archive", sizeof(mr->VolStatus)); mr->VolRetention = 365 * 3600 * 24; /* 1 year */ if (vl->VerNum >= 11) { mr->FirstWritten = btime_to_utime(vl->write_btime); @@ -760,21 +833,21 @@ static int create_media_record(B_DB *db, MEDIA_DBR *mr, VOLUME_LABEL *vl) /* * Called at end of media to update it */ -static int update_media_record(B_DB *db, MEDIA_DBR *mr) +static bool update_media_record(B_DB *db, MEDIA_DBR *mr) { if (!update_db && !update_vol_info) { - return 1; + return true; } mr->LastWritten = lasttime; if (!db_update_media_record(bjcr, db, mr)) { Pmsg1(0, _("Could not update media record. ERR=%s\n"), db_strerror(db)); - return 0; + return false;; } if (verbose) { Pmsg1(000, _("Updated Media record at end of Volume: %s\n"), mr->VolumeName); } - return 1; + return true; } @@ -858,8 +931,8 @@ static JCR *create_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *label, struct tm tm; jr->JobId = label->JobId; - jr->Type = label->JobType; - jr->Level = label->JobLevel; + jr->JobType = label->JobType; + jr->JobLevel = label->JobLevel; jr->JobStatus = JS_Created; bstrncpy(jr->Name, label->JobName, sizeof(jr->Name)); bstrncpy(jr->Job, label->Job, sizeof(jr->Job)); @@ -950,10 +1023,11 @@ static int update_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *elabel, return 0; } if (verbose) { - Pmsg1(000, _("Updated Job termination record for new JobId=%u\n"), jr->JobId); + Pmsg2(000, _("Updated Job termination record for JobId=%u TermStat=%c\n"), jr->JobId, + jr->JobStatus); } if (verbose > 1) { - char *term_msg; + const char *term_msg; static char term_code[70]; char sdt[50], edt[50]; char ec1[30], ec2[30], ec3[30]; @@ -1012,24 +1086,25 @@ Termination: %s\n\n"), static int create_jobmedia_record(B_DB *db, JCR *mjcr) { JOBMEDIA_DBR jmr; + DCR *dcr = mjcr->dcr; if (dev->state & ST_TAPE) { - mjcr->EndBlock = dev->EndBlock; - mjcr->EndFile = dev->EndFile; + dcr->EndBlock = dev->EndBlock; + dcr->EndFile = dev->EndFile; } else { - mjcr->EndBlock = (uint32_t)dev->file_addr; - mjcr->EndFile = (uint32_t)(dev->file_addr >> 32); + dcr->EndBlock = (uint32_t)dev->file_addr; + dcr->EndFile = (uint32_t)(dev->file_addr >> 32); } memset(&jmr, 0, sizeof(jmr)); jmr.JobId = mjcr->JobId; jmr.MediaId = mr.MediaId; - jmr.FirstIndex = mjcr->VolFirstIndex; - jmr.LastIndex = mjcr->FileIndex; - jmr.StartFile = mjcr->StartFile; - jmr.EndFile = mjcr->EndFile; - jmr.StartBlock = mjcr->StartBlock; - jmr.EndBlock = mjcr->EndBlock; + jmr.FirstIndex = dcr->VolFirstIndex; + jmr.LastIndex = dcr->FileIndex; + jmr.StartFile = dcr->StartFile; + jmr.EndFile = dcr->EndFile; + jmr.StartBlock = dcr->StartBlock; + jmr.EndBlock = dcr->EndBlock; if (!update_db) { @@ -1065,7 +1140,7 @@ static int update_SIG_record(B_DB *db, char *SIGbuf, DEV_RECORD *rec, int type) return 0; } - if (!update_db) { + if (!update_db || mjcr->FileId == 0) { free_jcr(mjcr); return 1; } @@ -1093,9 +1168,9 @@ static JCR *create_jcr(JOB_DBR *jr, DEV_RECORD *rec, uint32_t JobId) * Transfer as much as possible to the Job JCR. Most important is * the JobId and the ClientId. */ - jobjcr = new_jcr(sizeof(JCR), dird_free_jcr); - jobjcr->JobType = jr->Type; - jobjcr->JobLevel = jr->Level; + jobjcr = new_jcr(sizeof(JCR), bscan_free_jcr); + jobjcr->JobType = jr->JobType; + jobjcr->JobLevel = jr->JobLevel; jobjcr->JobStatus = jr->JobStatus; bstrncpy(jobjcr->Job, jr->Job, sizeof(jobjcr->Job)); jobjcr->JobId = JobId; /* this is JobId on tape */ @@ -1104,23 +1179,26 @@ static JCR *create_jcr(JOB_DBR *jr, DEV_RECORD *rec, uint32_t JobId) jobjcr->VolSessionId = rec->VolSessionId; jobjcr->VolSessionTime = rec->VolSessionTime; jobjcr->ClientId = jr->ClientId; - attach_jcr_to_device(dev, jobjcr); +// attach_jcr_to_device(dev, jobjcr); + new_dcr(jobjcr, dev); return jobjcr; } /* Dummies to replace askdir.c */ -int dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) { return 1;} -int dir_find_next_appendable_volume(JCR *jcr) { return 1;} -int dir_update_volume_info(JCR *jcr, DEVICE *dev, int relabel) { return 1; } -int dir_create_jobmedia_record(JCR *jcr) { return 1; } -int dir_ask_sysop_to_mount_next_volume(JCR *jcr, DEVICE *dev) { return 1; } -int dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) { return 1;} -int dir_send_job_status(JCR *jcr) {return 1;} +bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { return 1;} +bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} +bool dir_update_volume_info(DCR *dcr, bool relabel) { return 1; } +bool dir_create_jobmedia_record(DCR *dcr) { return 1; } +bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } +bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} +bool dir_send_job_status(JCR *jcr) {return 1;} -int dir_ask_sysop_to_mount_volume(JCR *jcr, DEVICE *dev) +bool dir_ask_sysop_to_mount_volume(DCR *dcr) { - fprintf(stderr, _("Mount Volume %s on device %s and press return when ready: "), + DEVICE *dev = dcr->dev; + JCR *jcr = dcr->jcr; + fprintf(stderr, _("Mount Volume \"%s\" on device \"%s\" and press return when ready: "), jcr->VolumeName, dev_name(dev)); getchar(); return 1;