/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2009 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.
int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time,
int verbose)
{
- BSOCK *fd;
+ BSOCK *fd = new_bsock();
char ed1[30];
utime_t heart_beat;
char name[MAX_NAME_LENGTH + 100];
bstrncpy(name, _("Client: "), sizeof(name));
bstrncat(name, jcr->client->name(), sizeof(name));
- fd = bnet_connect(jcr, retry_interval, max_retry_time, heart_beat,
- name, jcr->client->address, NULL, jcr->client->FDport, verbose);
+
+ fd->set_source_address(director->DIRsrc_addr);
+ if (!fd->connect(jcr,retry_interval,max_retry_time, heart_beat, name, jcr->client->address,
+ NULL, jcr->client->FDport, verbose)) {
+ fd->destroy();
+ fd = NULL;
+ }
+
if (fd == NULL) {
set_jcr_job_status(jcr, JS_ErrorTerminated);
return 0;
bool have_full;
bool do_full = false;
bool do_diff = false;
- time_t now;
+ utime_t now;
utime_t last_full_time;
utime_t last_diff_time;
case L_INCREMENTAL:
POOLMEM *stime = get_pool_memory(PM_MESSAGE);
/* Look up start time of last Full job */
- now = time(NULL);
+ now = (utime_t)time(NULL);
jcr->jr.JobId = 0; /* flag to return since time */
have_full = db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime);
- /* If there was a successful job, make sure it is recent enough */
- if (jcr->get_JobLevel() == L_INCREMENTAL && have_full && jcr->job->MaxDiffInterval > 0) {
+ if (have_full) {
+ last_full_time = str_to_utime(jcr->stime);
+ } else {
+ do_full = true; /* No full, upgrade to one */
+ }
+ /* Make sure the last diff is recent enough */
+ if (have_full && jcr->get_JobLevel() == L_INCREMENTAL && jcr->job->MaxDiffInterval > 0) {
/* Lookup last diff job */
if (db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_DIFFERENTIAL)) {
last_diff_time = str_to_utime(stime);
- do_diff = ((now - last_diff_time) >= jcr->job->MaxDiffInterval);
+ /* If no Diff since Full, use Full time */
+ if (last_diff_time < last_full_time) {
+ last_diff_time = last_full_time;
+ }
+ } else {
+ /* No last differential, so use last full time */
+ last_diff_time = last_full_time;
}
+ do_diff = ((now - last_diff_time) >= jcr->job->MaxDiffInterval);
}
- if (have_full && jcr->job->MaxFullInterval > 0 &&
- db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_FULL)) {
- last_full_time = str_to_utime(stime);
+ /* Note, do_full takes precedence over do_diff */
+ if (have_full && jcr->job->MaxFullInterval > 0) {
do_full = ((now - last_full_time) >= jcr->job->MaxFullInterval);
}
free_pool_memory(stime);
- if (!have_full || do_full) {
+ if (do_full) {
/* No recent Full job found, so upgrade this one to Full */
Jmsg(jcr, M_INFO, 0, "%s", db_strerror(jcr->db));
Jmsg(jcr, M_INFO, 0, _("No prior or suitable Full backup found in catalog. Doing FULL backup.\n"));
level_to_str(jcr->get_JobLevel()));
jcr->set_JobLevel(jcr->jr.JobLevel = L_FULL);
} else if (do_diff) {
- /* No recent diff job found, so upgrade this one to Full */
+ /* No recent diff job found, so upgrade this one to Diff */
Jmsg(jcr, M_INFO, 0, _("No prior or suitable Differential backup found in catalog. Doing Differential backup.\n"));
bsnprintf(since, since_len, _(" (upgraded from %s)"),
level_to_str(jcr->get_JobLevel()));