X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fbutil.c;h=183e2ff019d374828066727a66d82c7dc24af682;hb=1c31d780ff8befc9ef13c681d991bf235cb5f735;hp=a23bb1646f796a553174a76754907bc6707772fb;hpb=3c4aa7c0dd0b6831656bdcc7703849f62471b689;p=bacula%2Fbacula diff --git a/bacula/src/stored/butil.c b/bacula/src/stored/butil.c index a23bb1646f..183e2ff019 100644 --- a/bacula/src/stored/butil.c +++ b/bacula/src/stored/butil.c @@ -1,7 +1,9 @@ /* * * Utility routines for "tool" programs such as bscan, bls, - * bextract, ... + * bextract, ... Some routines also used by Bacula. + * + * Kern Sibbald, MM * * Normally nothing in this file is called by the Storage * daemon because we interact more directly with the user @@ -10,7 +12,7 @@ * Version $Id$ */ /* - Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker + Copyright (C) 2000-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 @@ -32,6 +34,11 @@ #include "bacula.h" #include "stored.h" +/* Forward referenced functions */ +static DCR *setup_to_access_device(JCR *jcr, char *dev_name, const char *VolumeName, int mode); +static DEVRES *find_device_res(char *device_name, int mode); +static void my_free_jcr(JCR *jcr); + /* Imported variables -- eliminate some day */ extern char *configfile; @@ -62,110 +69,119 @@ char *rec_state_to_str(DEV_RECORD *rec) } #endif +/* + * Setup a "daemon" JCR for the various standalone + * tools (e.g. bls, bextract, bscan, ...) + */ +JCR *setup_jcr(const char *name, char *dev_name, BSR *bsr, + const char *VolumeName, int mode) +{ + DCR *dcr; + JCR *jcr = new_jcr(sizeof(JCR), my_free_jcr); + jcr->bsr = bsr; + jcr->VolSessionId = 1; + jcr->VolSessionTime = (uint32_t)time(NULL); + jcr->NumVolumes = 0; + jcr->JobId = 0; + jcr->JobType = JT_CONSOLE; + jcr->JobLevel = L_FULL; + jcr->JobStatus = JS_Terminated; + jcr->where = bstrdup(""); + jcr->job_name = get_pool_memory(PM_FNAME); + pm_strcpy(jcr->job_name, "Dummy.Job.Name"); + jcr->client_name = get_pool_memory(PM_FNAME); + pm_strcpy(jcr->client_name, "Dummy.Client.Name"); + bstrncpy(jcr->Job, name, sizeof(jcr->Job)); + jcr->fileset_name = get_pool_memory(PM_FNAME); + pm_strcpy(jcr->fileset_name, "Dummy.fileset.name"); + jcr->fileset_md5 = get_pool_memory(PM_FNAME); + pm_strcpy(jcr->fileset_md5, "Dummy.fileset.md5"); + + dcr = setup_to_access_device(jcr, dev_name, VolumeName, mode); + if (!dcr) { + return NULL; + } + if (!bsr && VolumeName) { + bstrncpy(dcr->VolumeName, VolumeName, sizeof(dcr->VolumeName)); + } + strcpy(dcr->pool_name, "Default"); + strcpy(dcr->pool_type, "Backup"); + return jcr; +} /* * Setup device, jcr, and prepare to access device. * If the caller wants read access, acquire the device, otherwise, * the caller will do it. */ -DEVICE *setup_to_access_device(JCR *jcr, int read_access) +static DCR *setup_to_access_device(JCR *jcr, char *dev_name, const char *VolumeName, int mode) { DEVICE *dev; - DEV_BLOCK *block; char *p; DEVRES *device; + DCR *dcr; + char VolName[MAX_NAME_LENGTH]; /* * If no volume name already given and no bsr, and it is a file, * try getting name from Filename */ - if (!jcr->bsr && jcr->VolumeName[0] == 0) { - if (strncmp(jcr->dev_name, "/dev/", 5) != 0) { + VolName[0] = 0; + if (!jcr->bsr && VolumeName[0] == 0) { + if (strncmp(dev_name, "/dev/", 5) != 0) { /* Try stripping file part */ - p = jcr->dev_name + strlen(jcr->dev_name); - while (p >= jcr->dev_name && *p != '/') + p = dev_name + strlen(dev_name); + + while (p >= dev_name && *p != '/') p--; if (*p == '/') { - strcpy(jcr->VolumeName, p+1); + bstrncpy(VolName, p+1, sizeof(VolName)); *p = 0; } } } - if ((device=find_device_res(jcr->dev_name, read_access)) == NULL) { - Jmsg2(jcr, M_FATAL, 0, _("Cannot find device %s in config file %s.\n"), - jcr->dev_name, configfile); + if ((device=find_device_res(dev_name, mode)) == NULL) { + Jmsg2(jcr, M_FATAL, 0, _("Cannot find device \"%s\" in config file %s.\n"), + dev_name, configfile); return NULL; } + jcr->device = device; dev = init_dev(NULL, device); - if (!dev || !open_device(dev)) { - Jmsg1(jcr, M_FATAL, 0, _("Cannot open %s\n"), jcr->dev_name); + if (!dev) { + Jmsg1(jcr, M_FATAL, 0, _("Cannot init device %s\n"), dev_name); + return NULL; + } + device->dev = dev; + dcr = new_dcr(jcr, dev); + if (VolName[0]) { + bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName)); + } + bstrncpy(dcr->dev_name, device->device_name, sizeof(dcr->dev_name)); + if (!first_open_device(dev)) { + Jmsg1(jcr, M_FATAL, 0, _("Cannot open %s\n"), dcr->dev_name); return NULL; } Dmsg0(90, "Device opened for read.\n"); - block = new_block(dev); - create_vol_list(jcr); - if (read_access) { - if (!acquire_device_for_read(jcr, dev, block)) { - free_block(block); + if (mode) { /* read only access? */ + if (!acquire_device_for_read(jcr)) { return NULL; } } - free_block(block); - return dev; + return dcr; } -/* - * Search for device resource that corresponds to - * device name on command line (or default). - * - * Returns: NULL on failure - * Device resource pointer on success - */ -DEVRES *find_device_res(char *device_name, int read_access) -{ - int found = 0; - DEVRES *device; - - LockRes(); - for (device=NULL; (device=(DEVRES *)GetNextRes(R_DEVICE, (RES *)device)); ) { - if (strcmp(device->device_name, device_name) == 0) { - found = 1; - break; - } - } - UnlockRes(); - if (!found) { - Pmsg2(0, _("Could not find device %s in config file %s.\n"), device_name, - configfile); - return NULL; - } - Pmsg2(0, _("Using device: %s for %s.\n"), device_name, - read_access?"reading":"writing"); - return device; -} - - - /* * Called here when freeing JCR so that we can get rid * of "daemon" specific memory allocated. */ static void my_free_jcr(JCR *jcr) { - if (jcr->pool_name) { - free_pool_memory(jcr->pool_name); - jcr->pool_name = NULL; - } - if (jcr->pool_type) { - free_pool_memory(jcr->pool_type); - jcr->pool_type = NULL; - } if (jcr->job_name) { free_pool_memory(jcr->job_name); jcr->job_name = NULL; @@ -182,52 +198,61 @@ static void my_free_jcr(JCR *jcr) free_pool_memory(jcr->fileset_md5); jcr->fileset_md5 = NULL; } - if (jcr->dev_name) { - free_pool_memory(jcr->dev_name); - jcr->dev_name = NULL; - } if (jcr->VolList) { free_vol_list(jcr); } - + if (jcr->dcr) { + free_dcr(jcr->dcr); + jcr->dcr = NULL; + } return; } + /* - * Setup a "daemon" JCR for the various standalone - * tools (e.g. bls, bextract, bscan, ...) + * Search for device resource that corresponds to + * device name on command line (or default). + * + * Returns: NULL on failure + * Device resource pointer on success */ -JCR *setup_jcr(char *name, char *device, BSR *bsr, char *VolumeName) +static DEVRES *find_device_res(char *device_name, int read_access) { - JCR *jcr = new_jcr(sizeof(JCR), my_free_jcr); - jcr->VolSessionId = 1; - jcr->VolSessionTime = (uint32_t)time(NULL); - jcr->bsr = bsr; - jcr->NumVolumes = 0; - jcr->pool_name = get_pool_memory(PM_FNAME); - strcpy(jcr->pool_name, "Default"); - jcr->pool_type = get_pool_memory(PM_FNAME); - strcpy(jcr->pool_type, "Backup"); - jcr->job_name = get_pool_memory(PM_FNAME); - strcpy(jcr->job_name, "Dummy.Job.Name"); - jcr->client_name = get_pool_memory(PM_FNAME); - strcpy(jcr->client_name, "Dummy.Client.Name"); - strcpy(jcr->Job, name); - jcr->fileset_name = get_pool_memory(PM_FNAME); - strcpy(jcr->fileset_name, "Dummy.fileset.name"); - jcr->fileset_md5 = get_pool_memory(PM_FNAME); - strcpy(jcr->fileset_md5, "Dummy.fileset.md5"); - jcr->JobId = 1; - jcr->JobType = JT_BACKUP; - jcr->JobLevel = L_FULL; - jcr->JobStatus = JS_Terminated; - jcr->dev_name = get_pool_memory(PM_FNAME); - pm_strcpy(&jcr->dev_name, device); - if (!bsr && VolumeName) { - pm_strcpy(&jcr->VolumeName, VolumeName); + bool found = false; + DEVRES *device; + + LockRes(); + foreach_res(device, R_DEVICE) { + if (strcmp(device->device_name, device_name) == 0) { + found = true; + break; + } + } + if (!found) { + /* Search for name of Device resource rather than archive name */ + if (device_name[0] == '"') { + strcpy(device_name, device_name+1); + int len = strlen(device_name); + if (len > 0) { + device_name[len-1] = 0; /* zap trailing " */ + } + } + foreach_res(device, R_DEVICE) { + if (strcmp(device->hdr.name, device_name) == 0) { + found = true; + break; + } + } } - jcr->where = bstrdup(""); - return jcr; + UnlockRes(); + if (!found) { + Pmsg2(0, _("Could not find device \"%s\" in config file %s.\n"), device_name, + configfile); + return NULL; + } + Pmsg2(0, _("Using device: \"%s\" for %s.\n"), device_name, + read_access?"reading":"writing"); + return device; } @@ -238,8 +263,7 @@ void display_tape_error_status(JCR *jcr, DEVICE *dev) { uint32_t status; - Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg); - status_dev(dev, &status); + status = status_dev(dev); Dmsg1(20, "Device status: %x\n", status); if (status & BMT_EOD) Jmsg(jcr, M_ERROR, 0, _("Unexpected End of Data\n")); @@ -251,6 +275,4 @@ void display_tape_error_status(JCR *jcr, DEVICE *dev) Jmsg(jcr, M_ERROR, 0, _("Tape Door is Open\n")); else if (!(status & BMT_ONLINE)) Jmsg(jcr, M_ERROR, 0, _("Unexpected Tape is Off-line\n")); - else - Jmsg(jcr, M_ERROR, 0, _("Read error on Record Header %s: %s\n"), dev_name(dev), strerror(errno)); }