+/*
+ Bacula(R) - The Network Backup Solution
+
+ Copyright (C) 2000-2015 Kern Sibbald
+ Copyright (C) 2000-2014 Free Software Foundation Europe e.V.
+
+ The original author of Bacula is Kern Sibbald, with contributions
+ from many others, a complete list can be found in the file AUTHORS.
+
+ You may use this file and others of this release according to the
+ license defined in the LICENSE file, which includes the Affero General
+ Public License, v3.0 ("AGPLv3") and some additional permissions and
+ terms pursuant to its AGPLv3 Section 7.
+
+ This notice must be preserved when any source code is
+ conveyed and/or propagated.
+
+ Bacula(R) is a registered trademark of Kern Sibbald.
+*/
/*
*
* Utility routines for "tool" programs such as bscan, bls,
* daemon because we interact more directly with the user
* i.e. printf, ...
*
- * Version $Id$
- */
-/*
- 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
- version 2 as ammended with additional clauses defined in the
- file LICENSE in the main source directory.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- the file LICENSE for additional details.
-
*/
#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 DCR *setup_to_access_device(JCR *jcr, char *dev_name,
+ const char *VolumeName, bool writing, bool read_dedup_data);
+static DEVRES *find_device_res(char *device_name, bool writing);
static void my_free_jcr(JCR *jcr);
/* Imported variables -- eliminate some day */
extern char *configfile;
#ifdef DEBUG
-char *rec_state_to_str(DEV_RECORD *rec)
+char *rec_state_bits_to_str(DEV_RECORD *rec)
{
static char buf[200];
buf[0] = 0;
- if (rec->state & REC_NO_HEADER) {
- strcat(buf, "Nohdr,");
+ if (rec->state_bits & REC_NO_HEADER) {
+ strcat(buf, _("Nohdr,"));
}
if (is_partial_record(rec)) {
- strcat(buf, "partial,");
+ strcat(buf, _("partial,"));
}
- if (rec->state & REC_BLOCK_EMPTY) {
- strcat(buf, "empty,");
+ if (rec->state_bits & REC_BLOCK_EMPTY) {
+ strcat(buf, _("empty,"));
}
- if (rec->state & REC_NO_MATCH) {
- strcat(buf, "Nomatch,");
+ if (rec->state_bits & REC_NO_MATCH) {
+ strcat(buf, _("Nomatch,"));
}
- if (rec->state & REC_CONTINUATION) {
- strcat(buf, "cont,");
+ if (rec->state_bits & REC_CONTINUATION) {
+ strcat(buf, _("cont,"));
}
if (buf[0]) {
buf[strlen(buf)-1] = 0;
}
#endif
+/*
+ * Setup a pointer to my resource me
+ */
+void setup_me()
+{
+ LockRes();
+ me = (STORES *)GetNextRes(R_STORAGE, NULL);
+ if (!me) {
+ UnlockRes();
+ Emsg1(M_ERROR_TERM, 0, _("No Storage resource defined in %s. Cannot continue.\n"),
+ configfile);
+ }
+ UnlockRes();
+}
+
/*
* 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)
+ const char *VolumeName, bool writing, bool read_dedup_data)
{
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->NumReadVolumes = 0;
+ jcr->NumWriteVolumes = 0;
jcr->JobId = 0;
- jcr->JobType = JT_CONSOLE;
- jcr->JobLevel = L_FULL;
+ jcr->setJobType(JT_CONSOLE);
+ jcr->setJobLevel(L_FULL);
jcr->JobStatus = JS_Terminated;
jcr->where = bstrdup("");
jcr->job_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");
+ init_autochangers();
+ create_volume_lists();
- dcr = setup_to_access_device(jcr, dev_name, VolumeName, mode);
+ dcr = setup_to_access_device(jcr, dev_name, VolumeName, writing, read_dedup_data);
if (!dcr) {
return NULL;
}
* If the caller wants read access, acquire the device, otherwise,
* the caller will do it.
*/
-static DCR *setup_to_access_device(JCR *jcr, char *dev_name,
- const char *VolumeName, int mode)
+static DCR *setup_to_access_device(JCR *jcr, char *dev_name,
+ const char *VolumeName, bool writing, bool read_dedup_data)
{
DEVICE *dev;
char *p;
DCR *dcr;
char VolName[MAX_NAME_LENGTH];
+ init_reservations_lock();
+
/*
* If no volume name already given and no bsr, and it is a file,
* try getting name from Filename
*/
if (VolumeName) {
bstrncpy(VolName, VolumeName, sizeof(VolName));
+ if (strlen(VolumeName) >= MAX_NAME_LENGTH) {
+ Jmsg0(jcr, M_ERROR, 0, _("Volume name or names is too long. Please use a .bsr file.\n"));
+ }
} else {
VolName[0] = 0;
}
/* Try stripping file part */
p = dev_name + strlen(dev_name);
- while (p >= dev_name && *p != '/')
+ while (p >= dev_name && !IsPathSeparator(*p))
p--;
- if (*p == '/') {
+ if (IsPathSeparator(*p)) {
bstrncpy(VolName, p+1, sizeof(VolName));
*p = 0;
}
}
}
- if ((device=find_device_res(dev_name, mode)) == NULL) {
+ if ((device=find_device_res(dev_name, writing)) == NULL) {
Jmsg2(jcr, M_FATAL, 0, _("Cannot find device \"%s\" in config file %s.\n"),
dev_name, configfile);
return NULL;
}
- dev = init_dev(jcr, NULL, device);
+ dev = init_dev(jcr, device);
if (!dev) {
Jmsg1(jcr, M_FATAL, 0, _("Cannot init device %s\n"), dev_name);
return NULL;
}
device->dev = dev;
- dcr = new_dcr(jcr, dev);
+ jcr->dcr = dcr = new_dcr(jcr, NULL, dev, writing);
if (VolName[0]) {
bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
}
create_restore_volume_list(jcr);
- if (mode) { /* read only access? */
+ if (!writing) { /* read only access? */
+ Dmsg0(100, "Acquire device for read\n");
if (!acquire_device_for_read(dcr)) {
return NULL;
}
+ jcr->read_dcr = dcr;
} else {
- if (!first_open_device(dev)) {
- Jmsg1(jcr, M_FATAL, 0, _("Cannot open %s\n"), dcr->dev_name);
+ if (!first_open_device(dcr)) {
+ Jmsg1(jcr, M_FATAL, 0, _("Cannot open %s\n"), dev->print_name());
return NULL;
}
+ jcr->dcr = dcr; /* write dcr */
}
return dcr;
}
free_pool_memory(jcr->fileset_md5);
jcr->fileset_md5 = NULL;
}
+ if (jcr->comment) {
+ free_pool_memory(jcr->comment);
+ jcr->comment = NULL;
+ }
if (jcr->VolList) {
free_restore_volume_list(jcr);
}
* Returns: NULL on failure
* Device resource pointer on success
*/
-static DEVRES *find_device_res(char *device_name, int read_access)
+static DEVRES *find_device_res(char *device_name, bool write_access)
{
bool found = false;
DEVRES *device;
+ Dmsg0(900, "Enter find_device_res\n");
LockRes();
foreach_res(device, R_DEVICE) {
+ Dmsg2(900, "Compare %s and %s\n", device->device_name, device_name);
if (strcmp(device->device_name, device_name) == 0) {
found = true;
break;
}
}
foreach_res(device, R_DEVICE) {
+ Dmsg2(900, "Compare %s and %s\n", device->hdr.name, device_name);
if (strcmp(device->hdr.name, device_name) == 0) {
found = true;
break;
configfile);
return NULL;
}
- Pmsg2(0, _("Using device: \"%s\" for %s.\n"), device_name,
- read_access?"reading":"writing");
+ if (write_access) {
+ Pmsg1(0, _("Using device: \"%s\" for writing.\n"), device_name);
+ } else {
+ Pmsg1(0, _("Using device: \"%s\" for reading.\n"), device_name);
+ }
return device;
}