X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fcatreq.c;h=17ff0a194657b8cf3e69e9dfdf64b1abb266e75f;hb=a99080b63218b00f4f58416e08365ce49404abf7;hp=f2b4ca28de360db8ac64d7181788583afdd3d998;hpb=5714a90191fdc7ef9368600cfe0742bd324581db;p=bacula%2Fbacula diff --git a/bacula/src/dird/catreq.c b/bacula/src/dird/catreq.c index f2b4ca28de..17ff0a1946 100644 --- a/bacula/src/dird/catreq.c +++ b/bacula/src/dird/catreq.c @@ -13,7 +13,7 @@ * Version $Id$ */ /* - Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker + 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 @@ -41,223 +41,241 @@ */ /* Requests from the Storage daemon */ -static char Find_media[] = "CatReq Job=%127s FindMedia=%d\n"; +static char Find_media[] = "CatReq Job=%127s FindMedia=%d pool_name=%127s media_type=%127s\n"; static char Get_Vol_Info[] = "CatReq Job=%127s GetVolInfo VolName=%127s write=%d\n"; -static char Update_media[] = "CatReq Job=%127s UpdateMedia VolName=%s\ - VolJobs=%d VolFiles=%d VolBlocks=%d VolBytes=%" lld " VolMounts=%d\ - VolErrors=%d VolWrites=%d VolMaxBytes=%" lld " EndTime=%d VolStatus=%10s\ - Slot=%d relabel=%d\n"; +static char Update_media[] = "CatReq Job=%127s UpdateMedia VolName=%s" + " VolJobs=%u VolFiles=%u VolBlocks=%u VolBytes=%" lld " VolMounts=%u" + " VolErrors=%u VolWrites=%u MaxVolBytes=%" lld " EndTime=%d VolStatus=%10s" + " Slot=%d relabel=%d InChanger=%d VolReadTime=%" lld " VolWriteTime=%" lld + " VolParts=%u\n"; -static char Create_job_media[] = "CatReq Job=%127s CreateJobMedia \ - FirstIndex=%d LastIndex=%d StartFile=%d EndFile=%d \ - StartBlock=%d EndBlock=%d\n"; +static char Create_job_media[] = "CatReq Job=%127s CreateJobMedia " + " FirstIndex=%u LastIndex=%u StartFile=%u EndFile=%u " + " StartBlock=%u EndBlock=%u\n"; /* Responses sent to Storage daemon */ -static char OK_media[] = "1000 OK VolName=%s VolJobs=%d VolFiles=%d\ - VolBlocks=%d VolBytes=%" lld " VolMounts=%d VolErrors=%d VolWrites=%d\ - VolMaxBytes=%" lld " VolCapacityBytes=%" lld " VolStatus=%s Slot=%d\n"; +static char OK_media[] = "1000 OK VolName=%s VolJobs=%u VolFiles=%u" + " VolBlocks=%u VolBytes=%s VolMounts=%u VolErrors=%u VolWrites=%u" + " MaxVolBytes=%s VolCapacityBytes=%s VolStatus=%s Slot=%d" + " MaxVolJobs=%u MaxVolFiles=%u InChanger=%d VolReadTime=%s" + " VolWriteTime=%s EndFile=%u EndBlock=%u VolParts=%u LabelType=%d\n"; -static char OK_update[] = "1000 OK UpdateMedia\n"; +static char OK_create[] = "1000 OK CreateJobMedia\n"; -/* static char FileAttributes[] = "UpdCat Job=%127s FileAttributes "; */ +static int send_volume_info_to_storage_daemon(JCR *jcr, BSOCK *sd, MEDIA_DBR *mr) +{ + int stat; + char ed1[50], ed2[50], ed3[50], ed4[50], ed5[50]; + + jcr->MediaId = mr->MediaId; + pm_strcpy(jcr->VolumeName, mr->VolumeName); + bash_spaces(mr->VolumeName); + stat = bnet_fsend(sd, OK_media, mr->VolumeName, mr->VolJobs, + mr->VolFiles, mr->VolBlocks, edit_uint64(mr->VolBytes, ed1), + mr->VolMounts, mr->VolErrors, mr->VolWrites, + edit_uint64(mr->MaxVolBytes, ed2), + edit_uint64(mr->VolCapacityBytes, ed3), + mr->VolStatus, mr->Slot, mr->MaxVolJobs, mr->MaxVolFiles, + mr->InChanger, + edit_uint64(mr->VolReadTime, ed4), + edit_uint64(mr->VolWriteTime, ed5), + mr->EndFile, mr->EndBlock, + mr->VolParts, + mr->LabelType); + unbash_spaces(mr->VolumeName); + Dmsg2(100, "Vol Info for %s: %s", jcr->Job, sd->msg); + return stat; +} void catalog_request(JCR *jcr, BSOCK *bs, char *msg) { - MEDIA_DBR mr; + MEDIA_DBR mr, sdmr; JOBMEDIA_DBR jm; char Job[MAX_NAME_LENGTH]; - int index, ok, relabel, writing, retry = 0; - char *omsg; + char pool_name[MAX_NAME_LENGTH]; + int index, ok, label, writing; + POOLMEM *omsg; + POOL_DBR pr; memset(&mr, 0, sizeof(mr)); + memset(&sdmr, 0, sizeof(sdmr)); memset(&jm, 0, sizeof(jm)); /* * Request to find next appendable Volume for this Job */ - Dmsg1(120, "catreq %s", bs->msg); - if (sscanf(bs->msg, Find_media, &Job, &index) == 2) { - mr.PoolId = jcr->PoolId; - strcpy(mr.MediaType, jcr->store->media_type); - Dmsg3(120, "CatReq FindMedia: Id=%d, MediaType=%s, Status=%s\n", - mr.PoolId, mr.MediaType, mr.VolStatus); - /* - * Find the Next Volume for Append - */ -next_volume: - strcpy(mr.VolStatus, "Append"); /* want only appendable volumes */ - ok = db_find_next_volume(jcr->db, index, &mr); - if (!ok) { - /* Well, try finding recycled tapes */ - ok = find_recycled_volume(jcr, &mr); - Dmsg1(100, "find_recycled_volume1 %d\n", ok); - if (!ok) { - prune_volumes(jcr); - ok = recycle_a_volume(jcr, &mr); - Dmsg1(100, "find_recycled_volume2 %d\n", ok); - if (!ok) { - /* See if we can create a new Volume */ - ok = newVolume(jcr, &mr); - } - } - } - /* Check if use duration has expired */ - if (ok && jcr->pool->VolUseDuration > 0 && - strcmp(mr.VolStatus, "Recycle") != 0) { - utime_t now = time(NULL); - utime_t start = str_to_utime(mr.cFirstWritten); - if (start > 0 && jcr->pool->VolUseDuration <= (now - start)) { - Dmsg4(100, "Duration=%d now=%d start=%d now-start=%d\n", - (int)jcr->pool->VolUseDuration, (int)now, (int)start, (int)(now-start)); - Jmsg(jcr, M_INFO, 0, _("Max configured use duration exceeded. " - "Marking Volume \"%s\" as Used.\n"), mr.VolumeName); - strcpy(mr.VolStatus, "Used"); /* yes, mark as used */ - if (!db_update_media_record(jcr->db, &mr)) { - Jmsg(jcr, M_ERROR, 0, _("Catalog error updating Media record. %s"), - db_strerror(jcr->db)); - } else if (retry++ < 200) { /* sanity check */ - goto next_volume; - } else { - Jmsg(jcr, M_ERROR, 0, _( -"We seem to be looping trying to find the next volume. I give up. Ask operator.\n")); - } - ok = FALSE; /* give up */ - } + Dmsg1(100, "catreq %s", bs->msg); + if (!jcr->db) { + omsg = get_memory(bs->msglen+1); + pm_strcpy(omsg, bs->msg); + bnet_fsend(bs, "1990 Invalid Catalog Request: %s", omsg); + Jmsg1(jcr, M_FATAL, 0, _("Invalid Catalog request; DB not open: %s"), omsg); + free_memory(omsg); + return; + } + /* + * Find next appendable medium for SD + */ + 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)); + ok = db_get_pool_record(jcr, jcr->db, &pr); + if (ok) { + mr.PoolId = pr.PoolId; + ok = find_next_volume_for_append(jcr, &mr, true /*permit create new vol*/); } - /* - * Send Find Media response to Storage daemon + * Send Find Media response to Storage daemon */ if (ok) { - jcr->MediaId = mr.MediaId; - strcpy(jcr->VolumeName, mr.VolumeName); - bash_spaces(mr.VolumeName); - bnet_fsend(bs, OK_media, mr.VolumeName, mr.VolJobs, - mr.VolFiles, mr.VolBlocks, mr.VolBytes, mr.VolMounts, mr.VolErrors, - mr.VolWrites, mr.VolMaxBytes, mr.VolCapacityBytes, - mr.VolStatus, mr.Slot); + send_volume_info_to_storage_daemon(jcr, bs, &mr); } else { - bnet_fsend(bs, "1999 No Media\n"); + bnet_fsend(bs, "1901 No Media.\n"); + Dmsg0(500, "1901 No Media.\n"); } - /* + /* * Request to find specific Volume information */ } else if (sscanf(bs->msg, Get_Vol_Info, &Job, &mr.VolumeName, &writing) == 3) { - Dmsg1(120, "CatReq GetVolInfo Vol=%s\n", mr.VolumeName); + Dmsg1(500, "CatReq GetVolInfo Vol=%s\n", mr.VolumeName); /* * Find the Volume */ unbash_spaces(mr.VolumeName); - if (db_get_media_record(jcr->db, &mr)) { - int VolSuitable = 0; - jcr->MediaId = mr.MediaId; - Dmsg1(120, "VolumeInfo MediaId=%d\n", jcr->MediaId); - strcpy(jcr->VolumeName, mr.VolumeName); - if (!writing) { - VolSuitable = 1; /* accept anything for read */ - } else { - /* - * Make sure this volume is suitable for this job, i.e. - * it is either Append or Recycle and Media Type matches - * and Pool allows any volume. + if (db_get_media_record(jcr, jcr->db, &mr)) { + const char *reason = NULL; /* detailed reason for rejection */ + /* + * If we are reading, accept any volume (reason == NULL) + * If we are writing, check if the Volume is valid + * for this job, and do a recycle if necessary + */ + if (writing) { + /* + * SD wants to write this Volume, so make + * sure it is suitable for this job, i.e. + * Pool matches, and it is either Append or Recycle + * and Media Type matches and Pool allows any volume. */ - if (mr.PoolId == jcr->PoolId && - (strcmp(mr.VolStatus, "Append") == 0 || - strcmp(mr.VolStatus, "Recycle") == 0) && - strcmp(mr.MediaType, jcr->store->media_type) == 0 && - jcr->pool->accept_any_volume) { - VolSuitable = 1; + if (mr.PoolId != jcr->PoolId) { + reason = "not in Pool"; + } else if (strcmp(mr.MediaType, jcr->store->media_type) != 0) { + reason = "not correct MediaType"; + } else { + /* + * ****FIXME*** + * This test (accept_any_volume) is turned off + * because it doesn't properly check if the volume + * really is out of sequence! + * + * } else if (!jcr->pool->accept_any_volume) { + * reason = "Volume not in sequence"; + */ + + /* + * Now try recycling if necessary + * reason set non-NULL if we cannot use it + */ + check_if_volume_valid_or_recyclable(jcr, &mr, &reason); } } - if (VolSuitable) { + if (reason == NULL) { /* - * Send Find Media response to Storage daemon + * Send Find Media response to Storage daemon */ - bash_spaces(mr.VolumeName); - bnet_fsend(bs, OK_media, mr.VolumeName, mr.VolJobs, - mr.VolFiles, mr.VolBlocks, mr.VolBytes, mr.VolMounts, mr.VolErrors, - mr.VolWrites, mr.VolMaxBytes, mr.VolCapacityBytes, - mr.VolStatus, mr.Slot); - Dmsg5(200, "get_media_record PoolId=%d wanted %d, Status=%s, Slot=%d \ -MediaType=%s\n", mr.PoolId, jcr->PoolId, mr.VolStatus, mr.Slot, mr.MediaType); - } else { + send_volume_info_to_storage_daemon(jcr, bs, &mr); + } else { /* Not suitable volume */ - bnet_fsend(bs, "1998 Volume not appropriate.\n"); + bnet_fsend(bs, "1998 Volume \"%s\" status is %s, %s.\n", mr.VolumeName, + mr.VolStatus, reason); } } else { - bnet_fsend(bs, "1999 Volume Not Found.\n"); + bnet_fsend(bs, "1997 Volume \"%s\" not in catalog.\n", mr.VolumeName); + Dmsg1(400, "1997 Volume \"%s\" not in catalog.\n", mr.VolumeName); } - /* * Request to update Media record. Comes typically at the end - * of a Storage daemon Job Session + * of a Storage daemon Job Session, when labeling/relabeling a + * Volume, or when an EOF mark is written. */ - } else if (sscanf(bs->msg, Update_media, &Job, &mr.VolumeName, &mr.VolJobs, - &mr.VolFiles, &mr.VolBlocks, &mr.VolBytes, &mr.VolMounts, &mr.VolErrors, - &mr.VolWrites, &mr.VolMaxBytes, &mr.LastWritten, &mr.VolStatus, - &mr.Slot, &relabel) == 14) { - - /* - * Update Media Record - */ - - /* First handle Max Volume Bytes */ - if ((mr.VolMaxBytes > 0 && mr.VolBytes >= mr.VolMaxBytes)) { - Jmsg(jcr, M_INFO, 0, _("Max configure Volume bytes exceeded. " - "Marking Volume \"%s\" as Full.\n"), mr.VolumeName); - strcpy(mr.VolStatus, "Full"); - - /* Now see if Volume should only be used once */ - } else if (mr.VolBytes > 0 && jcr->pool->use_volume_once) { - Jmsg(jcr, M_INFO, 0, _("Volume used once. " - "Marking Volume \"%s\" as Used.\n"), mr.VolumeName); - strcpy(mr.VolStatus, "Used"); - - /* Now see if Max Jobs written to volume */ - } else if (jcr->pool->MaxVolJobs > 0 && - jcr->pool->MaxVolJobs <= mr.VolJobs) { - Jmsg(jcr, M_INFO, 0, _("Max configured Volume jobs exceeded. " - "Marking Volume \"%s\" as Used.\n"), mr.VolumeName); - strcpy(mr.VolStatus, "Used"); - - /* Finally, check Use duration expiration */ - } else if (jcr->pool->VolUseDuration > 0) { - MEDIA_DBR omr; - memset(&omr, 0, sizeof(omr)); /* clear media record */ - strcpy(omr.VolumeName, mr.VolumeName); /* copy Volume name */ - if (db_get_media_record(jcr->db, &omr)) { - utime_t start; - utime_t now = time(NULL); - start = str_to_utime(omr.cFirstWritten); - /* See if Vol Use has expired */ - if (start > 0 && jcr->pool->VolUseDuration <= (now - start)) { - Jmsg(jcr, M_INFO, 0, _("Max configured use duration exceeded. " - "Marking Volume \"%s\"as Used.\n"), mr.VolumeName); - strcpy(mr.VolStatus, "Used"); /* yes, mark as used */ - } - } else { - Jmsg(jcr, M_ERROR, 0, _("Unable to get Media record for Volume %s: ERR=%s\n"), - mr.VolumeName, db_strerror(jcr->db)); + } else if (sscanf(bs->msg, Update_media, &Job, &sdmr.VolumeName, + &sdmr.VolJobs, &sdmr.VolFiles, &sdmr.VolBlocks, &sdmr.VolBytes, + &sdmr.VolMounts, &sdmr.VolErrors, &sdmr.VolWrites, &sdmr.MaxVolBytes, + &sdmr.LastWritten, &sdmr.VolStatus, &sdmr.Slot, &label, &sdmr.InChanger, + &sdmr.VolReadTime, &sdmr.VolWriteTime, &sdmr.VolParts) == 18) { + + db_lock(jcr->db); + Dmsg3(400, "Update media %s oldStat=%s newStat=%s\n", sdmr.VolumeName, + mr.VolStatus, sdmr.VolStatus); + bstrncpy(mr.VolumeName, sdmr.VolumeName, sizeof(mr.VolumeName)); /* copy Volume name */ + unbash_spaces(mr.VolumeName); + if (!db_get_media_record(jcr, jcr->db, &mr)) { + Jmsg(jcr, M_ERROR, 0, _("Unable to get Media record for Volume %s: ERR=%s\n"), + mr.VolumeName, db_strerror(jcr->db)); + bnet_fsend(bs, "1991 Catalog Request for vol=%s failed: %s", + mr.VolumeName, db_strerror(jcr->db)); + db_unlock(jcr->db); + return; + } + /* Set first written time if this is first job */ + if (mr.FirstWritten == 0) { + mr.FirstWritten = jcr->start_time; /* use Job start time as first write */ + mr.set_first_written = true; + } + /* If we just labeled the tape set time */ + if (label || mr.LabelDate == 0) { + mr.LabelDate = jcr->start_time; + mr.set_label_date = true; + Dmsg2(400, "label=%d labeldate=%d\n", label, mr.LabelDate); + } else { + /* + * Insanity check for VolFiles get set to a smaller value + */ + if (sdmr.VolFiles < mr.VolFiles) { + Jmsg(jcr, M_FATAL, 0, _("Volume Files at %u being set to %u" + " for Volume \"%s\". This is incorrect.\n"), + mr.VolFiles, sdmr.VolFiles, mr.VolumeName); + bnet_fsend(bs, "1992 Update Media error\n"); + db_unlock(jcr->db); + return; } } - - Dmsg2(200, "db_update_media_record. Stat=%s Vol=%s\n", - mr.VolStatus, mr.VolumeName); - if (db_update_media_record(jcr->db, &mr)) { - bnet_fsend(bs, OK_update); - Dmsg0(190, "send OK\n"); + Dmsg2(400, "Update media: BefVolJobs=%u After=%u\n", mr.VolJobs, sdmr.VolJobs); + /* Copy updated values to original media record */ + mr.VolJobs = sdmr.VolJobs; + mr.VolFiles = sdmr.VolFiles; + mr.VolBlocks = sdmr.VolBlocks; + mr.VolBytes = sdmr.VolBytes; + mr.VolMounts = sdmr.VolMounts; + mr.VolErrors = sdmr.VolErrors; + mr.VolWrites = sdmr.VolWrites; + mr.LastWritten = sdmr.LastWritten; + mr.Slot = sdmr.Slot; + mr.InChanger = sdmr.InChanger; + mr.VolReadTime = sdmr.VolReadTime; + mr.VolWriteTime = sdmr.VolWriteTime; + mr.VolParts = sdmr.VolParts; + bstrncpy(mr.VolStatus, sdmr.VolStatus, sizeof(mr.VolStatus)); + + Dmsg2(400, "db_update_media_record. Stat=%s Vol=%s\n", mr.VolStatus, mr.VolumeName); + /* + * Check if it has expired, and if not update the DB. Note, if + * Volume has expired, has_volume_expired() will update the DB. + */ + if (has_volume_expired(jcr, &mr) || db_update_media_record(jcr, jcr->db, &mr)) { + send_volume_info_to_storage_daemon(jcr, bs, &mr); } else { - Jmsg(jcr, M_ERROR, 0, _("Catalog error updating Media record. %s"), + Jmsg(jcr, M_FATAL, 0, _("Catalog error updating Media record. %s"), db_strerror(jcr->db)); bnet_fsend(bs, "1992 Update Media error\n"); - Dmsg0(190, "send error\n"); + Dmsg0(400, "send error\n"); } + db_unlock(jcr->db); /* * Request to create a JobMedia record @@ -268,30 +286,35 @@ MediaType=%s\n", mr.PoolId, jcr->PoolId, mr.VolStatus, mr.Slot, mr.MediaType); jm.JobId = jcr->JobId; jm.MediaId = jcr->MediaId; - Dmsg6(100, "create_jobmedia JobId=%d MediaId=%d SF=%d EF=%d FI=%d LI=%d\n", + 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->db, &jm)) { - Jmsg(jcr, M_ERROR, 0, _("Catalog error creating JobMedia record. %s"), + if (!db_create_jobmedia_record(jcr, jcr->db, &jm)) { + Jmsg(jcr, M_FATAL, 0, _("Catalog error creating JobMedia record. %s"), db_strerror(jcr->db)); bnet_fsend(bs, "1991 Update JobMedia error\n"); } else { - Dmsg0(100, "JobMedia record created\n"); - bnet_fsend(bs, OK_update); + Dmsg0(400, "JobMedia record created\n"); + bnet_fsend(bs, OK_create); } } else { - omsg = (char *) get_memory(bs->msglen+1); - strcpy(omsg, bs->msg); - bnet_fsend(bs, "1990 Invalid Catalog Request: %s", omsg); + omsg = get_memory(bs->msglen+1); + pm_strcpy(omsg, bs->msg); + bnet_fsend(bs, "1990 Invalid Catalog Request: %s", omsg); + Jmsg1(jcr, M_FATAL, 0, _("Invalid Catalog request: %s"), omsg); free_memory(omsg); } - Dmsg1(120, ">CatReq response: %s", bs->msg); + Dmsg1(400, ">CatReq response: %s", bs->msg); + Dmsg1(400, "Leave catreq jcr 0x%x\n", jcr); return; } /* * Update File Attributes in the catalog with data - * sent by the Storage daemon. + * sent by the Storage daemon. Note, we receive the whole + * attribute record, but we select out only the stat packet, + * VolSessionId, VolSessionTime, FileIndex, and file name + * to store in the catalog. */ void catalog_update(JCR *jcr, BSOCK *bs, char *msg) { @@ -308,7 +331,7 @@ void catalog_update(JCR *jcr, BSOCK *bs, char *msg) if (!jcr->pool->catalog_files) { return; } - db_start_transaction(jcr->db); /* start transaction if not already open */ + db_start_transaction(jcr, jcr->db); /* start transaction if not already open */ skip_nonspaces(&p); /* UpdCat */ skip_spaces(&p); skip_nonspaces(&p); /* Job=nnn */ @@ -323,11 +346,11 @@ void catalog_update(JCR *jcr, BSOCK *bs, char *msg) unser_uint32(data_len); p += unser_length(p); - Dmsg1(99, "UpdCat msg=%s\n", bs->msg); - Dmsg5(99, "UpdCat VolSessId=%d VolSessT=%d FI=%d Strm=%d data_len=%d\n", + Dmsg1(400, "UpdCat msg=%s\n", bs->msg); + Dmsg5(400, "UpdCat VolSessId=%d VolSessT=%d FI=%d Strm=%d data_len=%d\n", VolSessionId, VolSessionTime, FileIndex, Stream, data_len); - if (Stream == STREAM_UNIX_ATTRIBUTES || Stream == STREAM_WIN32_ATTRIBUTES) { + if (Stream == STREAM_UNIX_ATTRIBUTES || Stream == STREAM_UNIX_ATTRIBUTES_EX) { skip_nonspaces(&p); /* skip FileIndex */ skip_spaces(&p); skip_nonspaces(&p); /* skip FileType */ @@ -336,35 +359,43 @@ void catalog_update(JCR *jcr, BSOCK *bs, char *msg) len = strlen(fname); /* length before attributes */ attr = &fname[len+1]; - Dmsg2(109, "dirdJobId; - Dmsg2(111, "dirddb, &ar)) { + if (!db_create_file_attributes_record(jcr, jcr->db, &ar)) { Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), db_strerror(jcr->db)); } - /* Save values for MD5 update */ + /* Save values for SIG update */ jcr->FileId = ar.FileId; jcr->FileIndex = FileIndex; - } else if (Stream == STREAM_MD5_SIGNATURE) { + } else if (Stream == STREAM_MD5_SIGNATURE || Stream == STREAM_SHA1_SIGNATURE) { fname = p; - if (jcr->FileIndex != FileIndex) { - Jmsg(jcr, M_WARNING, 0, "Got MD5 but not same File as attributes\n"); + if (jcr->FileIndex != FileIndex) { + Jmsg(jcr, M_WARNING, 0, "Got MD5/SHA1 but not same File as attributes\n"); } else { - /* Update MD5 signature in catalog */ - char MD5buf[50]; /* 24 bytes should be enough */ - bin_to_base64(MD5buf, fname, 16); - Dmsg2(190, "MD5len=%d MD5=%s\n", strlen(MD5buf), MD5buf); - if (!db_add_MD5_to_file_record(jcr->db, jcr->FileId, MD5buf)) { - Jmsg(jcr, M_ERROR, 0, _("Catalog error updating MD5. %s"), + /* 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(SIGbuf, fname, len); + Dmsg3(400, "SIGlen=%d SIG=%s type=%d\n", strlen(SIGbuf), SIGbuf, Stream); + if (!db_add_SIG_to_file_record(jcr, jcr->db, jcr->FileId, SIGbuf, type)) { + Jmsg(jcr, M_ERROR, 0, _("Catalog error updating MD5/SHA1. %s"), db_strerror(jcr->db)); } }