From 627eebe04f0d971b9d553d066d600dc589bd5636 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Fri, 14 Mar 2003 20:24:43 +0000 Subject: [PATCH] Documentation, RecycleOldestVol, fix create_media bug git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@380 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/kernstodo | 33 +- bacula/src/cats/sql_create.c | 7 +- bacula/src/cats/sql_find.c | 16 +- bacula/src/dird/backup.c | 2 +- bacula/src/dird/catreq.c | 31 +- bacula/src/dird/dird.c | 2 +- bacula/src/dird/dird.h | 1 + bacula/src/dird/dird_conf.c | 967 ++++++++++++++++++----------------- bacula/src/dird/dird_conf.h | 1 + bacula/src/dird/newvol.c | 5 +- bacula/src/dird/protos.h | 69 ++- bacula/src/dird/ua.h | 77 +-- bacula/src/dird/ua_cmds.c | 10 +- bacula/src/dird/ua_dotcmds.c | 1 - bacula/src/dird/ua_input.c | 1 - bacula/src/dird/ua_output.c | 5 +- bacula/src/dird/ua_prune.c | 1 - bacula/src/dird/ua_purge.c | 26 +- bacula/src/dird/ua_restore.c | 1 - bacula/src/dird/ua_run.c | 1 - bacula/src/dird/ua_select.c | 2 - bacula/src/dird/ua_server.c | 1 - bacula/src/dird/ua_status.c | 1 - bacula/src/lib/bnet.c | 11 +- bacula/src/version.h | 4 +- 25 files changed, 660 insertions(+), 616 deletions(-) diff --git a/bacula/kernstodo b/bacula/kernstodo index 931236cdd5..a694d532c9 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -1,5 +1,5 @@ Kern's ToDo List - 09 March 2003 + 13 March 2003 Documentation to do: (a little bit at a time) - Document running a test version. @@ -11,27 +11,20 @@ Documentation to do: (a little bit at a time) - Document Maximum File Size ***** Write up how to use/manage disk Volume Storage. ****** +- Add a section to the doc on Manual cycling of Volumes. Testing to do: (painful) - that ALL console command line options work and are always implemented - blocksize recognition code. - multiple simultaneous Volumes +- ***test GetFileAttributexEx, and remove MessageBox at 335 of winservice.cpp **** For 1.30 release: -- Need to return reason for EOF from write_block() e.g. File size - exceeded, ERROR, EOF, ... -- Look at Lutz' every other block checksum error. ***Urgent*** -- Think about adding Modes to the Storage daemon for creating Files. +- Ability to backup to a file then later transfer to a tape. +- Eugeny Fisher wants to cycle through a + set of volumes recycling the oldest volume when it is needed. - Fix "access not allowed" for backup of files on WinXP. -- Fix Error: bnet.c:408 gethostbyname() for lpmatou failed: ERR=Operation not permited - loop. -- Add code if there is no mtio.h. -- Add a section to the doc on Manual cycling of Volumes. -- Look at purge jobs volume (at least document it, and see if it is - logical). -- Add list volumes pool=* -- Add pool= to "list media" in ua_output.c - Figure out some way to specify a retention period for files that no longer exist on the machine -- so that we maintain say backups for 30 days, but if the file is deleted, we maintain @@ -44,8 +37,7 @@ For 1.30 release: - Implement a Mount Command and an Unmount Command where the users could specify a system command to be performed to do the mount, after which Bacula could attempt to - read the device. This is for Removeable media such as a - CDROM. + read the device. This is for Removeable media such as a CDROM. - Most likely, this mount command would be invoked explicitly by the user using the current Console "mount" and "unmount" commands -- the Storage Daemon would do the right thing @@ -79,7 +71,6 @@ For 1.30 release: - Add prefixlinks to where or not where absolute links to FD. - Look at handling <> in smtp doesn't work with exim. - Priority job to go to top of list. -- Implement Bar code handling - Why is catreq.c:111 Find vol called twice for a job? - Find out why Full saves run slower and slower (hashing?) - Why are save/restore of device different sizes (sparse?) Yup! Fix it. @@ -104,7 +95,6 @@ For 1.30 release: - Need to specify MaximumConcurrentJobs in the Job resource. - Possibly add email to Watchdog if drive is unmounted too long and a job is waiting on the drive. -- Strip trailing slashes from Include directory names in the FD. - Use read_record.c in SD code. - Why don't we get an error message from Win32 FD when bootstrap file cannot be created for restore command? @@ -888,3 +878,12 @@ Done: (see kernsdone for more) - Implement TCP/IP connection for MySQL - Pull a canceled job from the Scheduling queue. - Implement max_file_size in block.c (already done, just tweaked). +- Look at purge jobs volume (at least document it, and see if it is + logical). +- Add list volumes does all pools. list volumes pool=xxx now works. +- Add pool= to "list media" in ua_output.c +- Strip trailing slashes from Include directory names in the FD. +- Fix Error: bnet.c:408 gethostbyname() for lpmatou failed: + ERR=Operation not permited loop. +- Add code if there is no mtio.h (cannot do -- too many ioctl defines needed) +- Produce better error messages in when error/eof writing block. diff --git a/bacula/src/cats/sql_create.c b/bacula/src/cats/sql_create.c index 6fea790759..50becdf9b6 100644 --- a/bacula/src/cats/sql_create.c +++ b/bacula/src/cats/sql_create.c @@ -251,8 +251,9 @@ db_create_media_record(void *jcr, B_DB *mdb, MEDIA_DBR *mr) } Mmsg(&mdb->cmd, "INSERT INTO Media (VolumeName,MediaType,PoolId,MaxVolBytes,VolCapacityBytes," -"Recycle,VolRetention,VolUseDuration,VolStatus,LabelDate,Slot) " -"VALUES ('%s','%s',%u,%s,%s,%d,%s,%s,'%s','%s',%d)", +"Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles," +"VolStatus,LabelDate,Slot) " +"VALUES ('%s','%s',%u,%s,%s,%d,%s,%s,%u,%u,'%s','%s',%d)", mr->VolumeName, mr->MediaType, mr->PoolId, edit_uint64(mr->MaxVolBytes,ed1), @@ -260,6 +261,8 @@ db_create_media_record(void *jcr, B_DB *mdb, MEDIA_DBR *mr) mr->Recycle, edit_uint64(mr->VolRetention, ed3), edit_uint64(mr->VolUseDuration, ed4), + mr->MaxVolJobs, + mr->MaxVolFiles, mr->VolStatus, dt, mr->Slot); diff --git a/bacula/src/cats/sql_find.c b/bacula/src/cats/sql_find.c index 1a52dd7a5a..b0ed367f58 100644 --- a/bacula/src/cats/sql_find.c +++ b/bacula/src/cats/sql_find.c @@ -202,13 +202,25 @@ db_find_next_volume(void *jcr, B_DB *mdb, int item, MEDIA_DBR *mr) int numrows; db_lock(mdb); - Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\ + if (item == -1) { /* find oldest volume */ + /* Find oldest volume */ + Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\ +VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,\ +VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,\ +FirstWritten,LastWritten \ +FROM Media WHERE PoolId=%d AND MediaType='%s' AND VolStatus IN ('Full',\ +'Recycle','Purged','Used') \ +ORDER BY FirstWritten", mr->PoolId, mr->MediaType); + item = 1; + } else { + /* Find next available volume */ + Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\ VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,\ VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,\ FirstWritten,LastWritten \ FROM Media WHERE PoolId=%d AND MediaType='%s' AND VolStatus='%s' \ ORDER BY MediaId", mr->PoolId, mr->MediaType, mr->VolStatus); - + } if (!QUERY_DB(jcr, mdb, mdb->cmd)) { db_unlock(mdb); return 0; diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index 713a1b138e..54c97673e2 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -148,7 +148,7 @@ int do_backup(JCR *jcr) strcpy(pr.Name, jcr->pool->hdr.name); while (!db_get_pool_record(jcr, jcr->db, &pr)) { /* get by Name */ /* Try to create the pool */ - if (create_pool(jcr, jcr->db, jcr->pool) < 0) { + if (create_pool(jcr, jcr->db, jcr->pool, 0) < 0) { Jmsg(jcr, M_FATAL, 0, _("Pool %s not in database. %s"), pr.Name, db_strerror(jcr->db)); goto bail_out; diff --git a/bacula/src/dird/catreq.c b/bacula/src/dird/catreq.c index f944bfaf33..571fbaac8f 100644 --- a/bacula/src/dird/catreq.c +++ b/bacula/src/dird/catreq.c @@ -94,16 +94,29 @@ next_volume: ok = db_find_next_volume(jcr, jcr->db, index, &mr); Dmsg2(100, "catreq after find_next_vol ok=%d FW=%d\n", ok, mr.FirstWritten); if (!ok) { - /* Well, try finding recycled tapes */ - ok = find_recycled_volume(jcr, &mr); - Dmsg2(100, "find_recycled_volume1 %d FW=%d\n", ok, mr.FirstWritten); + if (jcr->pool->recycle_oldest_volume) { + /* Find oldest volume to recycle */ + ok = db_find_next_volume(jcr, jcr->db, -1, &mr); + if (ok) { + UAContext ua; + /* Try to purge oldest volume */ + create_ua_context(jcr, &ua); + ok = purge_jobs_from_volume(&ua, &mr); + free_ua_context(&ua); + } + } if (!ok) { - prune_volumes(jcr); - ok = recycle_a_volume(jcr, &mr); - Dmsg2(200, "find_recycled_volume2 %d FW=%d\n", ok, mr.FirstWritten); + /* Well, try finding recycled tapes */ + ok = find_recycled_volume(jcr, &mr); + Dmsg2(100, "find_recycled_volume1 %d FW=%d\n", ok, mr.FirstWritten); if (!ok) { - /* See if we can create a new Volume */ - ok = newVolume(jcr, &mr); + prune_volumes(jcr); + ok = recycle_a_volume(jcr, &mr); + Dmsg2(200, "find_recycled_volume2 %d FW=%d\n", ok, mr.FirstWritten); + if (!ok) { + /* See if we can create a new Volume */ + ok = newVolume(jcr, &mr); + } } } } @@ -114,7 +127,7 @@ next_volume: utime_t now = time(NULL); if (mr.VolUseDuration <= (now - mr.FirstWritten)) { Dmsg4(100, "Duration=%d now=%d start=%d now-start=%d\n", - (int)jcr->pool->VolUseDuration, (int)now, (int)mr.FirstWritten, + (int)mr.VolUseDuration, (int)now, (int)mr.FirstWritten, (int)(now-mr.FirstWritten)); Jmsg(jcr, M_INFO, 0, _("Max configured use duration exceeded. " "Marking Volume \"%s\" as Used.\n"), mr.VolumeName); diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index 23a4d83778..0bb4db06f3 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -374,7 +374,7 @@ Without that I don't know who I am :-(\n"), configfile); * record if it is not already created. */ if (job->pool) { - create_pool(NULL, db, job->pool); + create_pool(NULL, db, job->pool, 1); } db_close_database(NULL, db); } diff --git a/bacula/src/dird/dird.h b/bacula/src/dird/dird.h index efe5c4f92f..efc225b689 100644 --- a/bacula/src/dird/dird.h +++ b/bacula/src/dird/dird.h @@ -39,6 +39,7 @@ #include "jcr.h" +#include "ua.h" #include "protos.h" /* Globals that dird.c exports */ diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index 0b979273f5..04e21d4f9e 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -8,14 +8,14 @@ * 1. The generic lexical scanner in lib/lex.c and lib/lex.h * * 2. The generic config scanner in lib/parse_config.c and - * lib/parse_config.h. - * These files contain the parser code, some utility - * routines, and the common store routines (name, int, - * string). + * lib/parse_config.h. + * These files contain the parser code, some utility + * routines, and the common store routines (name, int, + * string). * * 3. The daemon specific file, which contains the Resource - * definitions as well as any specific store routines - * for the resource records. + * definitions as well as any specific store routines + * for the resource records. * * Kern Sibbald, January MM * @@ -83,7 +83,7 @@ int res_all_size = sizeof(res_all); /* * Director Resource * - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items dir_items[] = { {"name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, @@ -105,7 +105,7 @@ static struct res_items dir_items[] = { /* * Client or File daemon resource * - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items cli_items[] = { @@ -123,7 +123,7 @@ static struct res_items cli_items[] = { /* Storage daemon resource * - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items store_items[] = { {"name", store_name, ITEM(res_store.hdr.name), 0, ITEM_REQUIRED, 0}, @@ -141,7 +141,7 @@ static struct res_items store_items[] = { /* * Catalog Resource Directives * - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items cat_items[] = { {"name", store_name, ITEM(res_cat.hdr.name), 0, ITEM_REQUIRED, 0}, @@ -160,7 +160,7 @@ static struct res_items cat_items[] = { /* * Job Resource Directives * - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items job_items[] = { {"name", store_name, ITEM(res_job.hdr.name), 0, ITEM_REQUIRED, 0}, @@ -194,7 +194,7 @@ static struct res_items job_items[] = { /* FileSet resource * - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items fs_items[] = { {"name", store_name, ITEM(res_fs.hdr.name), 0, ITEM_REQUIRED, 0}, @@ -203,13 +203,13 @@ static struct res_items fs_items[] = { {"finclude", store_finc, NULL, 0, ITEM_NO_EQUALS, 0}, {"exclude", store_inc, NULL, 1, 0, 0}, {"fexclude", store_finc, NULL, 1, ITEM_NO_EQUALS, 0}, - {NULL, NULL, NULL, 0, 0, 0} + {NULL, NULL, NULL, 0, 0, 0} }; /* Schedule -- see run_conf.c */ /* Schedule * - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items sch_items[] = { {"name", store_name, ITEM(res_sch.hdr.name), 0, ITEM_REQUIRED, 0}, @@ -220,7 +220,7 @@ static struct res_items sch_items[] = { /* Group resource -- not implemented * - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items group_items[] = { {"name", store_name, ITEM(res_group.hdr.name), 0, ITEM_REQUIRED, 0}, @@ -230,7 +230,7 @@ static struct res_items group_items[] = { /* Pool resource * - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items pool_items[] = { {"name", store_name, ITEM(res_pool.hdr.name), 0, ITEM_REQUIRED, 0}, @@ -239,6 +239,7 @@ static struct res_items pool_items[] = { {"labelformat", store_strname, ITEM(res_pool.label_format), 0, 0, 0}, {"usecatalog", store_yesno, ITEM(res_pool.use_catalog), 1, ITEM_DEFAULT, 1}, {"usevolumeonce", store_yesno, ITEM(res_pool.use_volume_once), 1, 0, 0}, + {"recycleoldestvolume", store_yesno, ITEM(res_pool.recycle_oldest_volume), 0, 0, 0}, {"maximumvolumes", store_pint, ITEM(res_pool.max_volumes), 0, 0, 0}, {"maximumvolumejobs", store_pint, ITEM(res_pool.MaxVolJobs), 0, 0, 0}, {"maximumvolumefiles", store_pint, ITEM(res_pool.MaxVolFiles), 0, 0, 0}, @@ -254,7 +255,7 @@ static struct res_items pool_items[] = { /* * Counter Resource - * name handler value code flags default_value + * name handler value code flags default_value */ static struct res_items counter_items[] = { {"name", store_name, ITEM(res_counter.hdr.name), 0, ITEM_REQUIRED, 0}, @@ -274,7 +275,7 @@ extern struct res_items msgs_items[]; * This is the master resource definition. * It must have one item for each of the resources. * - * name items rcode res_head + * name items rcode res_head */ struct s_res resources[] = { {"director", dir_items, R_DIRECTOR, NULL}, @@ -288,13 +289,13 @@ struct s_res resources[] = { {"pool", pool_items, R_POOL, NULL}, {"messages", msgs_items, R_MSGS, NULL}, {"counter", counter_items, R_COUNTER, NULL}, - {NULL, NULL, 0, NULL} + {NULL, NULL, 0, NULL} }; /* Keywords (RHS) permitted in Job Level records * - * level_name level job_type + * level_name level job_type */ struct s_jl joblevels[] = { {"Full", L_FULL, JT_BACKUP}, @@ -305,19 +306,19 @@ struct s_jl joblevels[] = { {"Initcatalog", L_VERIFY_INIT, JT_VERIFY}, {"VolumeToCatalog", L_VERIFY_VOLUME_TO_CATALOG, JT_VERIFY}, {"Data", L_VERIFY_DATA, JT_VERIFY}, - {NULL, 0} + {NULL, 0} }; /* Keywords (RHS) permitted in Job type records * - * type_name job_type + * type_name job_type */ struct s_jt jobtypes[] = { {"backup", JT_BACKUP}, {"admin", JT_ADMIN}, {"verify", JT_VERIFY}, {"restore", JT_RESTORE}, - {NULL, 0} + {NULL, 0} }; @@ -326,7 +327,7 @@ static struct s_kw BakVerFields[] = { {"client", 'C'}, {"fileset", 'F'}, {"level", 'L'}, - {NULL, 0} + {NULL, 0} }; /* Keywords (RHS) permitted in Restore records */ @@ -337,7 +338,7 @@ static struct s_kw RestoreFields[] = { {"where", 'W'}, /* root of restore */ {"replace", 'R'}, /* replacement options */ {"bootstrap", 'B'}, /* bootstrap file */ - {NULL, 0} + {NULL, 0} }; /* Options permitted in Restore replace= */ @@ -346,7 +347,7 @@ struct s_kw ReplaceOptions[] = { {"ifnewer", REPLACE_IFNEWER}, {"ifolder", REPLACE_IFOLDER}, {"never", REPLACE_NEVER}, - {NULL, 0} + {NULL, 0} }; char *level_to_str(int level) @@ -358,8 +359,8 @@ char *level_to_str(int level) sprintf(level_no, "%d", level); /* default if not found */ for (i=0; joblevels[i].level_name; i++) { if (level == joblevels[i].level) { - str = joblevels[i].level_name; - break; + str = joblevels[i].level_name; + break; } } return str; @@ -375,211 +376,211 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, char *fmt, ... sendit(sock, "No %s resource defined\n", res_to_str(type)); return; } - if (type < 0) { /* no recursion */ + if (type < 0) { /* no recursion */ type = - type; recurse = 0; } switch (type) { case R_DIRECTOR: - char ed1[30], ed2[30]; + char ed1[30], ed2[30]; sendit(sock, "Director: name=%s maxjobs=%d FDtimeout=%s SDtimeout=%s\n", - reshdr->name, res->res_dir.MaxConcurrentJobs, - edit_uint64(res->res_dir.FDConnectTimeout, ed1), - edit_uint64(res->res_dir.SDConnectTimeout, ed2)); - if (res->res_dir.query_file) { + reshdr->name, res->res_dir.MaxConcurrentJobs, + edit_uint64(res->res_dir.FDConnectTimeout, ed1), + edit_uint64(res->res_dir.SDConnectTimeout, ed2)); + if (res->res_dir.query_file) { sendit(sock, " query_file=%s\n", res->res_dir.query_file); - } - if (res->res_dir.messages) { + } + if (res->res_dir.messages) { sendit(sock, " --> "); - dump_resource(-R_MSGS, (RES *)res->res_dir.messages, sendit, sock); - } - break; + dump_resource(-R_MSGS, (RES *)res->res_dir.messages, sendit, sock); + } + break; case R_CLIENT: sendit(sock, "Client: name=%s address=%s FDport=%d\n", - res->res_client.hdr.name, res->res_client.address, res->res_client.FDport); + res->res_client.hdr.name, res->res_client.address, res->res_client.FDport); sendit(sock, " JobRetention=%" lld " FileRetention=%" lld " AutoPrune=%d\n", - res->res_client.JobRetention, res->res_client.FileRetention, - res->res_client.AutoPrune); - if (res->res_client.catalog) { + res->res_client.JobRetention, res->res_client.FileRetention, + res->res_client.AutoPrune); + if (res->res_client.catalog) { sendit(sock, " --> "); - dump_resource(-R_CATALOG, (RES *)res->res_client.catalog, sendit, sock); - } - break; + dump_resource(-R_CATALOG, (RES *)res->res_client.catalog, sendit, sock); + } + break; case R_STORAGE: sendit(sock, "Storage: name=%s address=%s SDport=%d\n\ DeviceName=%s MediaType=%s\n", - res->res_store.hdr.name, res->res_store.address, res->res_store.SDport, - res->res_store.dev_name, res->res_store.media_type); - break; + res->res_store.hdr.name, res->res_store.address, res->res_store.SDport, + res->res_store.dev_name, res->res_store.media_type); + break; case R_CATALOG: sendit(sock, "Catalog: name=%s address=%s DBport=%d db_name=%s\n\ db_user=%s\n", - res->res_cat.hdr.name, NPRT(res->res_cat.db_address), - res->res_cat.db_port, res->res_cat.db_name, NPRT(res->res_cat.db_user)); - break; + res->res_cat.hdr.name, NPRT(res->res_cat.db_address), + res->res_cat.db_port, res->res_cat.db_name, NPRT(res->res_cat.db_user)); + break; case R_JOB: sendit(sock, "Job: name=%s JobType=%d level=%s\n", res->res_job.hdr.name, - res->res_job.JobType, level_to_str(res->res_job.level)); - if (res->res_job.client) { + res->res_job.JobType, level_to_str(res->res_job.level)); + if (res->res_job.client) { sendit(sock, " --> "); - dump_resource(-R_CLIENT, (RES *)res->res_job.client, sendit, sock); - } - if (res->res_job.fileset) { + dump_resource(-R_CLIENT, (RES *)res->res_job.client, sendit, sock); + } + if (res->res_job.fileset) { sendit(sock, " --> "); - dump_resource(-R_FILESET, (RES *)res->res_job.fileset, sendit, sock); - } - if (res->res_job.schedule) { + dump_resource(-R_FILESET, (RES *)res->res_job.fileset, sendit, sock); + } + if (res->res_job.schedule) { sendit(sock, " --> "); - dump_resource(-R_SCHEDULE, (RES *)res->res_job.schedule, sendit, sock); - } - if (res->res_job.RestoreWhere) { + dump_resource(-R_SCHEDULE, (RES *)res->res_job.schedule, sendit, sock); + } + if (res->res_job.RestoreWhere) { sendit(sock, " --> Where=%s\n", NPRT(res->res_job.RestoreWhere)); - } - if (res->res_job.RestoreBootstrap) { + } + if (res->res_job.RestoreBootstrap) { sendit(sock, " --> Bootstrap=%s\n", NPRT(res->res_job.RestoreBootstrap)); - } - if (res->res_job.RunBeforeJob) { + } + if (res->res_job.RunBeforeJob) { sendit(sock, " --> RunBefore=%s\n", NPRT(res->res_job.RunBeforeJob)); - } - if (res->res_job.RunAfterJob) { + } + if (res->res_job.RunAfterJob) { sendit(sock, " --> RunAfter=%s\n", NPRT(res->res_job.RunAfterJob)); - } - if (res->res_job.WriteBootstrap) { + } + if (res->res_job.WriteBootstrap) { sendit(sock, " --> WriteBootstrap=%s\n", NPRT(res->res_job.WriteBootstrap)); - } - if (res->res_job.storage) { + } + if (res->res_job.storage) { sendit(sock, " --> "); - dump_resource(-R_STORAGE, (RES *)res->res_job.storage, sendit, sock); - } - if (res->res_job.pool) { + dump_resource(-R_STORAGE, (RES *)res->res_job.storage, sendit, sock); + } + if (res->res_job.pool) { sendit(sock, " --> "); - dump_resource(-R_POOL, (RES *)res->res_job.pool, sendit, sock); - } else { + dump_resource(-R_POOL, (RES *)res->res_job.pool, sendit, sock); + } else { sendit(sock, "!!! No Pool resource\n"); - } - if (res->res_job.messages) { + } + if (res->res_job.messages) { sendit(sock, " --> "); - dump_resource(-R_MSGS, (RES *)res->res_job.messages, sendit, sock); - } - break; + dump_resource(-R_MSGS, (RES *)res->res_job.messages, sendit, sock); + } + break; case R_FILESET: sendit(sock, "FileSet: name=%s\n", res->res_fs.hdr.name); - for (int i=0; ires_fs.num_includes; i++) { - INCEXE *incexe = res->res_fs.include_items[i]; - for (int j=0; jnum_names; j++) { + for (int i=0; ires_fs.num_includes; i++) { + INCEXE *incexe = res->res_fs.include_items[i]; + for (int j=0; jnum_names; j++) { sendit(sock, " Inc: %s\n", incexe->name_list[j]); - } - } - for (int i=0; ires_fs.num_excludes; i++) { - INCEXE *incexe = res->res_fs.exclude_items[i]; - for (int j=0; jnum_names; j++) { + } + } + for (int i=0; ires_fs.num_excludes; i++) { + INCEXE *incexe = res->res_fs.exclude_items[i]; + for (int j=0; jnum_names; j++) { sendit(sock, " Exc: %s\n", incexe->name_list[j]); - } - } - break; + } + } + break; case R_SCHEDULE: - if (res->res_sch.run) { - int i; - RUN *run = res->res_sch.run; - char buf[1000], num[10]; + if (res->res_sch.run) { + int i; + RUN *run = res->res_sch.run; + char buf[1000], num[10]; sendit(sock, "Schedule: name=%s\n", res->res_sch.hdr.name); - if (!run) { - break; - } + if (!run) { + break; + } next_run: sendit(sock, " --> Run Level=%s\n", level_to_str(run->level)); strcpy(buf, " hour="); - for (i=0; i<24; i++) { - if (bit_is_set(i, run->hour)) { + for (i=0; i<24; i++) { + if (bit_is_set(i, run->hour)) { sprintf(num, "%d ", i); - strcat(buf, num); - } - } + strcat(buf, num); + } + } strcat(buf, "\n"); - sendit(sock, buf); + sendit(sock, buf); strcpy(buf, " mday="); - for (i=0; i<31; i++) { - if (bit_is_set(i, run->mday)) { + for (i=0; i<31; i++) { + if (bit_is_set(i, run->mday)) { sprintf(num, "%d ", i+1); - strcat(buf, num); - } - } + strcat(buf, num); + } + } strcat(buf, "\n"); - sendit(sock, buf); + sendit(sock, buf); strcpy(buf, " month="); - for (i=0; i<12; i++) { - if (bit_is_set(i, run->month)) { + for (i=0; i<12; i++) { + if (bit_is_set(i, run->month)) { sprintf(num, "%d ", i+1); - strcat(buf, num); - } - } + strcat(buf, num); + } + } strcat(buf, "\n"); - sendit(sock, buf); + sendit(sock, buf); strcpy(buf, " wday="); - for (i=0; i<7; i++) { - if (bit_is_set(i, run->wday)) { + for (i=0; i<7; i++) { + if (bit_is_set(i, run->wday)) { sprintf(num, "%d ", i+1); - strcat(buf, num); - } - } + strcat(buf, num); + } + } strcat(buf, "\n"); - sendit(sock, buf); + sendit(sock, buf); strcpy(buf, " wpos="); - for (i=0; i<5; i++) { - if (bit_is_set(i, run->wpos)) { + for (i=0; i<5; i++) { + if (bit_is_set(i, run->wpos)) { sprintf(num, "%d ", i+1); - strcat(buf, num); - } - } + strcat(buf, num); + } + } strcat(buf, "\n"); - sendit(sock, buf); + sendit(sock, buf); sendit(sock, " mins=%d\n", run->minute); - if (run->pool) { + if (run->pool) { sendit(sock, " --> "); - dump_resource(-R_POOL, (RES *)run->pool, sendit, sock); - } - if (run->storage) { + dump_resource(-R_POOL, (RES *)run->pool, sendit, sock); + } + if (run->storage) { sendit(sock, " --> "); - dump_resource(-R_STORAGE, (RES *)run->storage, sendit, sock); - } - if (run->msgs) { + dump_resource(-R_STORAGE, (RES *)run->storage, sendit, sock); + } + if (run->msgs) { sendit(sock, " --> "); - dump_resource(-R_MSGS, (RES *)run->msgs, sendit, sock); - } - /* If another Run record is chained in, go print it */ - if (run->next) { - run = run->next; - goto next_run; - } - } else { + dump_resource(-R_MSGS, (RES *)run->msgs, sendit, sock); + } + /* If another Run record is chained in, go print it */ + if (run->next) { + run = run->next; + goto next_run; + } + } else { sendit(sock, "Schedule: name=%s\n", res->res_sch.hdr.name); - } - break; + } + break; case R_GROUP: sendit(sock, "Group: name=%s\n", res->res_group.hdr.name); - break; + break; case R_POOL: sendit(sock, "Pool: name=%s PoolType=%s\n", res->res_pool.hdr.name, - res->res_pool.pool_type); + res->res_pool.pool_type); sendit(sock, " use_cat=%d use_once=%d acpt_any=%d cat_files=%d\n", - res->res_pool.use_catalog, res->res_pool.use_volume_once, - res->res_pool.accept_any_volume, res->res_pool.catalog_files); + res->res_pool.use_catalog, res->res_pool.use_volume_once, + res->res_pool.accept_any_volume, res->res_pool.catalog_files); sendit(sock, " max_vols=%d auto_prune=%d VolRetention=%" lld "\n", - res->res_pool.max_volumes, res->res_pool.AutoPrune, - res->res_pool.VolRetention); + res->res_pool.max_volumes, res->res_pool.AutoPrune, + res->res_pool.VolRetention); sendit(sock, " recycle=%d LabelFormat=%s\n", res->res_pool.Recycle, - NPRT(res->res_pool.label_format)); - break; + NPRT(res->res_pool.label_format)); + break; case R_MSGS: sendit(sock, "Messages: name=%s\n", res->res_msgs.hdr.name); - if (res->res_msgs.mail_cmd) + if (res->res_msgs.mail_cmd) sendit(sock, " mailcmd=%s\n", res->res_msgs.mail_cmd); - if (res->res_msgs.operator_cmd) + if (res->res_msgs.operator_cmd) sendit(sock, " opcmd=%s\n", res->res_msgs.operator_cmd); - break; + break; default: sendit(sock, "Unknown resource type %d in dump_resource.\n", type); - break; + break; } if (recurse && res->res_dir.hdr.next) { dump_resource(type, res->res_dir.hdr.next, sendit, sock); @@ -600,13 +601,13 @@ static void free_incexe(INCEXE *incexe) for (int i=0; inum_opts; i++) { FOPTS *fopt = incexe->opts_list[i]; if (fopt->match) { - free(fopt->match); + free(fopt->match); } for (int j=0; jnum_base; j++) { - free(fopt->base_list[j]); + free(fopt->base_list[j]); } if (fopt->base_list) { - free(fopt->base_list); + free(fopt->base_list); } free(fopt); } @@ -646,126 +647,126 @@ void free_resource(int type) switch (type) { case R_DIRECTOR: - if (res->res_dir.working_directory) { - free(res->res_dir.working_directory); - } - if (res->res_dir.pid_directory) { - free(res->res_dir.pid_directory); - } - if (res->res_dir.subsys_directory) { - free(res->res_dir.subsys_directory); - } - if (res->res_dir.password) { - free(res->res_dir.password); - } - if (res->res_dir.query_file) { - free(res->res_dir.query_file); - } - if (res->res_dir.DIRaddr) { - free(res->res_dir.DIRaddr); - } - break; + if (res->res_dir.working_directory) { + free(res->res_dir.working_directory); + } + if (res->res_dir.pid_directory) { + free(res->res_dir.pid_directory); + } + if (res->res_dir.subsys_directory) { + free(res->res_dir.subsys_directory); + } + if (res->res_dir.password) { + free(res->res_dir.password); + } + if (res->res_dir.query_file) { + free(res->res_dir.query_file); + } + if (res->res_dir.DIRaddr) { + free(res->res_dir.DIRaddr); + } + break; case R_CLIENT: - if (res->res_client.address) { - free(res->res_client.address); - } - if (res->res_client.password) { - free(res->res_client.password); - } - break; + if (res->res_client.address) { + free(res->res_client.address); + } + if (res->res_client.password) { + free(res->res_client.password); + } + break; case R_STORAGE: - if (res->res_store.address) { - free(res->res_store.address); - } - if (res->res_store.password) { - free(res->res_store.password); - } - if (res->res_store.media_type) { - free(res->res_store.media_type); - } - if (res->res_store.dev_name) { - free(res->res_store.dev_name); - } - break; + if (res->res_store.address) { + free(res->res_store.address); + } + if (res->res_store.password) { + free(res->res_store.password); + } + if (res->res_store.media_type) { + free(res->res_store.media_type); + } + if (res->res_store.dev_name) { + free(res->res_store.dev_name); + } + break; case R_CATALOG: - if (res->res_cat.db_address) { - free(res->res_cat.db_address); - } - if (res->res_cat.db_socket) { - free(res->res_cat.db_socket); - } - if (res->res_cat.db_user) { - free(res->res_cat.db_user); - } - if (res->res_cat.db_name) { - free(res->res_cat.db_name); - } - if (res->res_cat.db_password) { - free(res->res_cat.db_password); - } - break; + if (res->res_cat.db_address) { + free(res->res_cat.db_address); + } + if (res->res_cat.db_socket) { + free(res->res_cat.db_socket); + } + if (res->res_cat.db_user) { + free(res->res_cat.db_user); + } + if (res->res_cat.db_name) { + free(res->res_cat.db_name); + } + if (res->res_cat.db_password) { + free(res->res_cat.db_password); + } + break; case R_FILESET: - if ((num=res->res_fs.num_includes)) { - while (--num >= 0) { - free_incexe(res->res_fs.include_items[num]); - } - free(res->res_fs.include_items); - } - res->res_fs.num_includes = 0; - if ((num=res->res_fs.num_excludes)) { - while (--num >= 0) { - free_incexe(res->res_fs.exclude_items[num]); - } - free(res->res_fs.exclude_items); - } - res->res_fs.num_excludes = 0; - break; + if ((num=res->res_fs.num_includes)) { + while (--num >= 0) { + free_incexe(res->res_fs.include_items[num]); + } + free(res->res_fs.include_items); + } + res->res_fs.num_includes = 0; + if ((num=res->res_fs.num_excludes)) { + while (--num >= 0) { + free_incexe(res->res_fs.exclude_items[num]); + } + free(res->res_fs.exclude_items); + } + res->res_fs.num_excludes = 0; + break; case R_POOL: - if (res->res_pool.pool_type) { - free(res->res_pool.pool_type); - } - if (res->res_pool.label_format) { - free(res->res_pool.label_format); - } - break; + if (res->res_pool.pool_type) { + free(res->res_pool.pool_type); + } + if (res->res_pool.label_format) { + free(res->res_pool.label_format); + } + break; case R_SCHEDULE: - if (res->res_sch.run) { - RUN *nrun, *next; - nrun = res->res_sch.run; - while (nrun) { - next = nrun->next; - free(nrun); - nrun = next; - } - } - break; + if (res->res_sch.run) { + RUN *nrun, *next; + nrun = res->res_sch.run; + while (nrun) { + next = nrun->next; + free(nrun); + nrun = next; + } + } + break; case R_JOB: - if (res->res_job.RestoreWhere) { - free(res->res_job.RestoreWhere); - } - if (res->res_job.RestoreBootstrap) { - free(res->res_job.RestoreBootstrap); - } - if (res->res_job.WriteBootstrap) { - free(res->res_job.WriteBootstrap); - } - if (res->res_job.RunBeforeJob) { - free(res->res_job.RunBeforeJob); - } - if (res->res_job.RunAfterJob) { - free(res->res_job.RunAfterJob); - } - break; + if (res->res_job.RestoreWhere) { + free(res->res_job.RestoreWhere); + } + if (res->res_job.RestoreBootstrap) { + free(res->res_job.RestoreBootstrap); + } + if (res->res_job.WriteBootstrap) { + free(res->res_job.WriteBootstrap); + } + if (res->res_job.RunBeforeJob) { + free(res->res_job.RunBeforeJob); + } + if (res->res_job.RunAfterJob) { + free(res->res_job.RunAfterJob); + } + break; case R_MSGS: - if (res->res_msgs.mail_cmd) - free(res->res_msgs.mail_cmd); - if (res->res_msgs.operator_cmd) - free(res->res_msgs.operator_cmd); - free_msgs_res((MSGS *)res); /* free message resource */ - res = NULL; - break; + if (res->res_msgs.mail_cmd) + free(res->res_msgs.mail_cmd); + if (res->res_msgs.operator_cmd) + free(res->res_msgs.operator_cmd); + free_msgs_res((MSGS *)res); /* free message resource */ + res = NULL; + break; case R_GROUP: - break; + break; default: printf("Unknown resource type %d in free_resource.\n", type); } @@ -797,10 +798,10 @@ void save_resource(int type, struct res_items *items, int pass) */ for (i=0; items[i].name; i++) { if (items[i].flags & ITEM_REQUIRED) { - if (!bit_is_set(i, res_all.res_dir.hdr.item_present)) { + if (!bit_is_set(i, res_all.res_dir.hdr.item_present)) { Emsg2(M_ERROR_TERM, 0, "%s item is required in %s resource, but not found.\n", - items[i].name, resources[rindex]); - } + items[i].name, resources[rindex]); + } } /* If this triggers, take a look at lib/parse_conf.h */ if (i >= MAX_RES_ITEMS) { @@ -815,82 +816,82 @@ void save_resource(int type, struct res_items *items, int pass) */ if (pass == 2) { switch (type) { - /* Resources not containing a resource */ - case R_CATALOG: - case R_STORAGE: - case R_GROUP: - case R_POOL: - case R_MSGS: - case R_FILESET: - break; + /* Resources not containing a resource */ + case R_CATALOG: + case R_STORAGE: + case R_GROUP: + case R_POOL: + case R_MSGS: + case R_FILESET: + break; - /* Resources containing another resource */ - case R_DIRECTOR: - if ((res = (URES *)GetResWithName(R_DIRECTOR, res_all.res_dir.hdr.name)) == NULL) { + /* Resources containing another resource */ + case R_DIRECTOR: + if ((res = (URES *)GetResWithName(R_DIRECTOR, res_all.res_dir.hdr.name)) == NULL) { Emsg1(M_ERROR_TERM, 0, "Cannot find Director resource %s\n", res_all.res_dir.hdr.name); - } - res->res_dir.messages = res_all.res_dir.messages; - break; - case R_JOB: - if ((res = (URES *)GetResWithName(R_JOB, res_all.res_dir.hdr.name)) == NULL) { + } + res->res_dir.messages = res_all.res_dir.messages; + break; + case R_JOB: + if ((res = (URES *)GetResWithName(R_JOB, res_all.res_dir.hdr.name)) == NULL) { Emsg1(M_ERROR_TERM, 0, "Cannot find Job resource %s\n", res_all.res_dir.hdr.name); - } - res->res_job.messages = res_all.res_job.messages; - res->res_job.schedule = res_all.res_job.schedule; - res->res_job.client = res_all.res_job.client; - res->res_job.fileset = res_all.res_job.fileset; - res->res_job.storage = res_all.res_job.storage; - res->res_job.pool = res_all.res_job.pool; - if (res->res_job.JobType == 0) { + } + res->res_job.messages = res_all.res_job.messages; + res->res_job.schedule = res_all.res_job.schedule; + res->res_job.client = res_all.res_job.client; + res->res_job.fileset = res_all.res_job.fileset; + res->res_job.storage = res_all.res_job.storage; + res->res_job.pool = res_all.res_job.pool; + if (res->res_job.JobType == 0) { Emsg1(M_ERROR_TERM, 0, "Job Type not defined for Job resource %s\n", res_all.res_dir.hdr.name); - } - if (res->res_job.level != 0) { - int i; - for (i=0; joblevels[i].level_name; i++) { - if (joblevels[i].level == res->res_job.level && - joblevels[i].job_type == res->res_job.JobType) { - i = 0; - break; - } - } - if (i != 0) { + } + if (res->res_job.level != 0) { + int i; + for (i=0; joblevels[i].level_name; i++) { + if (joblevels[i].level == res->res_job.level && + joblevels[i].job_type == res->res_job.JobType) { + i = 0; + break; + } + } + if (i != 0) { Emsg1(M_ERROR_TERM, 0, "Inappropriate level specified in Job resource %s\n", - res_all.res_dir.hdr.name); - } - } - break; - case R_CLIENT: - if ((res = (URES *)GetResWithName(R_CLIENT, res_all.res_client.hdr.name)) == NULL) { + res_all.res_dir.hdr.name); + } + } + break; + case R_CLIENT: + if ((res = (URES *)GetResWithName(R_CLIENT, res_all.res_client.hdr.name)) == NULL) { Emsg1(M_ERROR_TERM, 0, "Cannot find Client resource %s\n", res_all.res_client.hdr.name); - } - res->res_client.catalog = res_all.res_client.catalog; - break; - case R_SCHEDULE: - /* Schedule is a bit different in that it contains a RUN record + } + res->res_client.catalog = res_all.res_client.catalog; + break; + case R_SCHEDULE: + /* Schedule is a bit different in that it contains a RUN record * chain which isn't a "named" resource. This chain was linked - * in by run_conf.c during pass 2, so here we jam the pointer - * into the Schedule resource. - */ - if ((res = (URES *)GetResWithName(R_SCHEDULE, res_all.res_client.hdr.name)) == NULL) { + * in by run_conf.c during pass 2, so here we jam the pointer + * into the Schedule resource. + */ + if ((res = (URES *)GetResWithName(R_SCHEDULE, res_all.res_client.hdr.name)) == NULL) { Emsg1(M_ERROR_TERM, 0, "Cannot find Schedule resource %s\n", res_all.res_client.hdr.name); - } - res->res_sch.run = res_all.res_sch.run; - break; - default: + } + res->res_sch.run = res_all.res_sch.run; + break; + default: Emsg1(M_ERROR, 0, "Unknown resource type %d in save_resource.\n", type); - error = 1; - break; + error = 1; + break; } /* Note, the resource name was already saved during pass 1, * so here, we can just release it. */ if (res_all.res_dir.hdr.name) { - free(res_all.res_dir.hdr.name); - res_all.res_dir.hdr.name = NULL; + free(res_all.res_dir.hdr.name); + res_all.res_dir.hdr.name = NULL; } if (res_all.res_dir.hdr.desc) { - free(res_all.res_dir.hdr.desc); - res_all.res_dir.hdr.desc = NULL; + free(res_all.res_dir.hdr.desc); + res_all.res_dir.hdr.desc = NULL; } return; } @@ -898,60 +899,60 @@ void save_resource(int type, struct res_items *items, int pass) /* The following code is only executed for pass 1 */ switch (type) { case R_DIRECTOR: - size = sizeof(DIRRES); - break; + size = sizeof(DIRRES); + break; case R_CLIENT: - size =sizeof(CLIENT); - break; + size =sizeof(CLIENT); + break; case R_STORAGE: - size = sizeof(STORE); - break; + size = sizeof(STORE); + break; case R_CATALOG: - size = sizeof(CAT); - break; + size = sizeof(CAT); + break; case R_JOB: - size = sizeof(JOB); - break; + size = sizeof(JOB); + break; case R_FILESET: - size = sizeof(FILESET); - break; + size = sizeof(FILESET); + break; case R_SCHEDULE: - size = sizeof(SCHED); - break; + size = sizeof(SCHED); + break; case R_GROUP: - size = sizeof(GROUP); - break; + size = sizeof(GROUP); + break; case R_POOL: - size = sizeof(POOL); - break; + size = sizeof(POOL); + break; case R_MSGS: - size = sizeof(MSGS); - break; + size = sizeof(MSGS); + break; case R_COUNTER: - size = sizeof(COUNTER); - break; + size = sizeof(COUNTER); + break; default: printf("Unknown resource type %d in save_resrouce.\n", type); - error = 1; - size = 1; - break; + error = 1; + size = 1; + break; } /* Common */ if (!error) { res = (URES *)malloc(size); memcpy(res, &res_all, size); if (!resources[rindex].res_head) { - resources[rindex].res_head = (RES *)res; /* store first entry */ + resources[rindex].res_head = (RES *)res; /* store first entry */ Dmsg3(200, "Inserting first %s res: %s index=%d\n", res_to_str(type), - res->res_dir.hdr.name, rindex); + res->res_dir.hdr.name, rindex); } else { - RES *next; - /* Add new res to end of chain */ - for (next=resources[rindex].res_head; next->next; next=next->next) - { } - next->next = (RES *)res; + RES *next; + /* Add new res to end of chain */ + for (next=resources[rindex].res_head; next->next; next=next->next) + { } + next->next = (RES *)res; Dmsg3(200, "Inserting %s res: %s index=%d\n", res_to_str(type), - res->res_dir.hdr.name, rindex); + res->res_dir.hdr.name, rindex); } } } @@ -968,9 +969,9 @@ static void store_jobtype(LEX *lc, struct res_items *item, int index, int pass) /* Store the type both pass 1 and pass 2 */ for (i=0; jobtypes[i].type_name; i++) { if (strcasecmp(lc->str, jobtypes[i].type_name) == 0) { - ((JOB *)(item->value))->JobType = jobtypes[i].job_type; - i = 0; - break; + ((JOB *)(item->value))->JobType = jobtypes[i].job_type; + i = 0; + break; } } if (i != 0) { @@ -992,9 +993,9 @@ static void store_level(LEX *lc, struct res_items *item, int index, int pass) /* Store the level pass 2 so that type is defined */ for (i=0; joblevels[i].level_name; i++) { if (strcasecmp(lc->str, joblevels[i].level_name) == 0) { - ((JOB *)(item->value))->level = joblevels[i].level; - i = 0; - break; + ((JOB *)(item->value))->level = joblevels[i].level; + i = 0; + break; } } if (i != 0) { @@ -1011,9 +1012,9 @@ static void store_replace(LEX *lc, struct res_items *item, int index, int pass) /* Scan Replacement options */ for (i=0; ReplaceOptions[i].name; i++) { if (strcasecmp(lc->str, ReplaceOptions[i].name) == 0) { - *(int *)(item->value) = ReplaceOptions[i].token; - i = 0; - break; + *(int *)(item->value) = ReplaceOptions[i].token; + i = 0; + break; } } if (i != 0) { @@ -1051,59 +1052,59 @@ static void store_backup(LEX *lc, struct res_items *item, int index, int pass) Dmsg1(190, "Got keyword: %s\n", lc->str); found = FALSE; for (i=0; BakVerFields[i].name; i++) { - if (strcasecmp(lc->str, BakVerFields[i].name) == 0) { - found = TRUE; - if (lex_get_token(lc, T_ALL) != T_EQUALS) { + if (strcasecmp(lc->str, BakVerFields[i].name) == 0) { + found = TRUE; + if (lex_get_token(lc, T_ALL) != T_EQUALS) { scan_err1(lc, "Expected an equals, got: %s", lc->str); - } - token = lex_get_token(lc, T_NAME); + } + token = lex_get_token(lc, T_NAME); Dmsg1(190, "Got value: %s\n", lc->str); - switch (BakVerFields[i].token) { + switch (BakVerFields[i].token) { case 'C': - /* Find Client Resource */ - if (pass == 2) { - res = GetResWithName(R_CLIENT, lc->str); - if (res == NULL) { + /* Find Client Resource */ + if (pass == 2) { + res = GetResWithName(R_CLIENT, lc->str); + if (res == NULL) { scan_err1(lc, "Could not find specified Client Resource: %s", - lc->str); - } - res_all.res_job.client = (CLIENT *)res; - } - break; + lc->str); + } + res_all.res_job.client = (CLIENT *)res; + } + break; case 'F': - /* Find FileSet Resource */ - if (pass == 2) { - res = GetResWithName(R_FILESET, lc->str); - if (res == NULL) { + /* Find FileSet Resource */ + if (pass == 2) { + res = GetResWithName(R_FILESET, lc->str); + if (res == NULL) { scan_err1(lc, "Could not find specified FileSet Resource: %s\n", - lc->str); - } - res_all.res_job.fileset = (FILESET *)res; - } - break; + lc->str); + } + res_all.res_job.fileset = (FILESET *)res; + } + break; case 'L': - /* Get level */ - for (i=0; joblevels[i].level_name; i++) { - if (joblevels[i].job_type == item->code && - strcasecmp(lc->str, joblevels[i].level_name) == 0) { - ((JOB *)(item->value))->level = joblevels[i].level; - i = 0; - break; - } - } - if (i != 0) { + /* Get level */ + for (i=0; joblevels[i].level_name; i++) { + if (joblevels[i].job_type == item->code && + strcasecmp(lc->str, joblevels[i].level_name) == 0) { + ((JOB *)(item->value))->level = joblevels[i].level; + i = 0; + break; + } + } + if (i != 0) { scan_err1(lc, "Expected a Job Level keyword, got: %s", lc->str); - } - break; - } /* end switch */ - break; - } /* end if strcmp() */ + } + break; + } /* end switch */ + break; + } /* end if strcmp() */ } /* end for */ if (!found) { scan_err1(lc, "%s not a valid Backup/verify keyword", lc->str); } } /* end while */ - lc->options = options; /* reset original options */ + lc->options = options; /* reset original options */ set_bit(index, res_all.hdr.item_present); } @@ -1133,91 +1134,91 @@ static void store_restore(LEX *lc, struct res_items *item, int index, int pass) found = FALSE; for (i=0; RestoreFields[i].name; i++) { Dmsg1(190, "Restore kw=%s\n", lc->str); - if (strcasecmp(lc->str, RestoreFields[i].name) == 0) { - found = TRUE; - if (lex_get_token(lc, T_ALL) != T_EQUALS) { + if (strcasecmp(lc->str, RestoreFields[i].name) == 0) { + found = TRUE; + if (lex_get_token(lc, T_ALL) != T_EQUALS) { scan_err1(lc, "Expected an equals, got: %s", lc->str); - } - token = lex_get_token(lc, T_ALL); + } + token = lex_get_token(lc, T_ALL); Dmsg1(190, "Restore value=%s\n", lc->str); - switch (RestoreFields[i].token) { + switch (RestoreFields[i].token) { case 'B': - /* Bootstrap */ - if (token != T_IDENTIFIER && token != T_UNQUOTED_STRING && token != T_QUOTED_STRING) { + /* Bootstrap */ + if (token != T_IDENTIFIER && token != T_UNQUOTED_STRING && token != T_QUOTED_STRING) { scan_err1(lc, "Expected a Restore bootstrap file, got: %s", lc->str); - } - if (pass == 1) { - res_all.res_job.RestoreBootstrap = bstrdup(lc->str); - } - break; + } + if (pass == 1) { + res_all.res_job.RestoreBootstrap = bstrdup(lc->str); + } + break; case 'C': - /* Find Client Resource */ - if (pass == 2) { - res = GetResWithName(R_CLIENT, lc->str); - if (res == NULL) { + /* Find Client Resource */ + if (pass == 2) { + res = GetResWithName(R_CLIENT, lc->str); + if (res == NULL) { scan_err1(lc, "Could not find specified Client Resource: %s", - lc->str); - } - res_all.res_job.client = (CLIENT *)res; - } - break; + lc->str); + } + res_all.res_job.client = (CLIENT *)res; + } + break; case 'F': - /* Find FileSet Resource */ - if (pass == 2) { - res = GetResWithName(R_FILESET, lc->str); - if (res == NULL) { + /* Find FileSet Resource */ + if (pass == 2) { + res = GetResWithName(R_FILESET, lc->str); + if (res == NULL) { scan_err1(lc, "Could not find specified FileSet Resource: %s\n", - lc->str); - } - res_all.res_job.fileset = (FILESET *)res; - } - break; + lc->str); + } + res_all.res_job.fileset = (FILESET *)res; + } + break; case 'J': - /* JobId */ - if (token != T_NUMBER) { + /* JobId */ + if (token != T_NUMBER) { scan_err1(lc, "expected an integer number, got: %s", lc->str); - } - errno = 0; - res_all.res_job.RestoreJobId = strtol(lc->str, NULL, 0); + } + errno = 0; + res_all.res_job.RestoreJobId = strtol(lc->str, NULL, 0); Dmsg1(190, "RestorJobId=%d\n", res_all.res_job.RestoreJobId); - if (errno != 0) { + if (errno != 0) { scan_err1(lc, "expected an integer number, got: %s", lc->str); - } - break; + } + break; case 'W': - /* Where */ - if (token != T_IDENTIFIER && token != T_UNQUOTED_STRING && token != T_QUOTED_STRING) { + /* Where */ + if (token != T_IDENTIFIER && token != T_UNQUOTED_STRING && token != T_QUOTED_STRING) { scan_err1(lc, "Expected a Restore root directory, got: %s", lc->str); - } - if (pass == 1) { - res_all.res_job.RestoreWhere = bstrdup(lc->str); - } - break; + } + if (pass == 1) { + res_all.res_job.RestoreWhere = bstrdup(lc->str); + } + break; case 'R': - /* Replacement options */ - if (token != T_IDENTIFIER && token != T_UNQUOTED_STRING && token != T_QUOTED_STRING) { + /* Replacement options */ + if (token != T_IDENTIFIER && token != T_UNQUOTED_STRING && token != T_QUOTED_STRING) { scan_err1(lc, "Expected a keyword name, got: %s", lc->str); - } - /* Fix to scan Replacement options */ - for (i=0; ReplaceOptions[i].name; i++) { - if (strcasecmp(lc->str, ReplaceOptions[i].name) == 0) { - ((JOB *)(item->value))->replace = ReplaceOptions[i].token; - i = 0; - break; - } - } - if (i != 0) { + } + /* Fix to scan Replacement options */ + for (i=0; ReplaceOptions[i].name; i++) { + if (strcasecmp(lc->str, ReplaceOptions[i].name) == 0) { + ((JOB *)(item->value))->replace = ReplaceOptions[i].token; + i = 0; + break; + } + } + if (i != 0) { scan_err1(lc, "Expected a Restore replacement option, got: %s", lc->str); - } - break; - } /* end switch */ - break; - } /* end if strcmp() */ + } + break; + } /* end switch */ + break; + } /* end if strcmp() */ } /* end for */ if (!found) { scan_err1(lc, "%s not a valid Restore keyword", lc->str); } } /* end while */ - lc->options = options; /* reset original options */ + lc->options = options; /* reset original options */ set_bit(index, res_all.hdr.item_present); } diff --git a/bacula/src/dird/dird_conf.h b/bacula/src/dird/dird_conf.h index deb06feb5a..5572399c19 100644 --- a/bacula/src/dird/dird_conf.h +++ b/bacula/src/dird/dird_conf.h @@ -268,6 +268,7 @@ struct s_res_pool { int catalog_files; /* maintain file entries in catalog */ int use_volume_once; /* write on volume only once */ int accept_any_volume; /* accept any volume */ + int recycle_oldest_volume; /* recycle oldest volume */ uint32_t max_volumes; /* max number of volumes */ utime_t VolRetention; /* volume retention period in seconds */ utime_t VolUseDuration; /* duration volume can be used */ diff --git a/bacula/src/dird/newvol.c b/bacula/src/dird/newvol.c index 1abab32cae..f9aead3740 100644 --- a/bacula/src/dird/newvol.c +++ b/bacula/src/dird/newvol.c @@ -37,7 +37,8 @@ /* * Really crude automatic Volume name creation using - * LabelFormat + * LabelFormat. We assume that if this routine is being + * called the Volume will be labeled, so we set the LabelDate. */ int newVolume(JCR *jcr, MEDIA_DBR *mr) { @@ -53,7 +54,7 @@ int newVolume(JCR *jcr, MEDIA_DBR *mr) pr.LabelFormat[0] != '*') { if (pr.MaxVols == 0 || pr.NumVols < pr.MaxVols) { set_pool_dbr_defaults_in_media_dbr(mr, &pr); - mr->LabelDate = 0; + mr->LabelDate = time(NULL); strcpy(mr->MediaType, jcr->store->media_type); strcpy(name, pr.LabelFormat); if (strchr(name, (int)'%') != NULL) { diff --git a/bacula/src/dird/protos.h b/bacula/src/dird/protos.h index 13a5879392..ffd8354876 100644 --- a/bacula/src/dird/protos.h +++ b/bacula/src/dird/protos.h @@ -31,6 +31,8 @@ extern int authenticate_user_agent(BSOCK *ua); /* autoprune.c */ extern int do_autoprune(JCR *jcr); extern int prune_volumes(JCR *jcr); +void create_ua_context(JCR *jcr, UAContext *ua); +void free_ua_context(UAContext *ua); /* autorecycle.c */ extern int recycle_a_volume(JCR *jcr, MEDIA_DBR *mr); @@ -46,13 +48,13 @@ extern char *level_to_str(int level); /* fd_cmds.c */ extern int connect_to_file_daemon(JCR *jcr, int retry_interval, - int max_retry_time, int verbose); + int max_retry_time, int verbose); extern int send_include_list(JCR *jcr); extern int send_exclude_list(JCR *jcr); extern int get_attributes_and_put_in_catalog(JCR *jcr); extern int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId); extern int put_file_into_catalog(JCR *jcr, long file_index, char *fname, - char *link, char *attr, int stream); + char *link, char *attr, int stream); /* job.c */ extern void set_jcr_defaults(JCR *jcr, JOB *job); @@ -65,7 +67,7 @@ extern void mount_request(JCR *jcr, BSOCK *bs, char *buf); /* msgchan.c */ extern int connect_to_storage_daemon(JCR *jcr, int retry_interval, - int max_retry_time, int verbose); + int max_retry_time, int verbose); extern int start_storage_daemon_job(JCR *jcr); extern int start_storage_daemon_message_thread(JCR *jcr); extern int32_t bget_msg(BSOCK *bs, int type); @@ -73,8 +75,59 @@ extern int response(BSOCK *fd, char *resp, char *cmd); extern void wait_for_storage_daemon_termination(JCR *jcr); /* newvol.c */ -extern int newVolume(JCR *jcr, MEDIA_DBR *mr); - -/* ua_cmd.c */ -extern int create_pool(JCR *jcr, B_DB *db, POOL *pool); -extern void set_pool_dbr_defaults_in_media_dbr(MEDIA_DBR *mr, POOL_DBR *pr); +int newVolume(JCR *jcr, MEDIA_DBR *mr); + +/* ua_cmds.c */ +int do_a_command(UAContext *ua, char *cmd); +int do_a_dot_command(UAContext *ua, char *cmd); +int qmessagescmd(UAContext *ua, char *cmd); +int open_db(UAContext *ua); +void close_db(UAContext *ua); +int create_pool(JCR *jcr, B_DB *db, POOL *pool, int update); +void set_pool_dbr_defaults_in_media_dbr(MEDIA_DBR *mr, POOL_DBR *pr); + +/* ua_input.c */ +char *next_arg(char **s); +int get_cmd(UAContext *ua, char *prompt); +void parse_command_args(UAContext *ua); + +/* ua_output.c */ +void prtit(void *ctx, char *msg); + +/* ua_server.c */ +void bsendmsg(void *sock, char *fmt, ...); + +/* ua_select.c */ +STORE *select_storage_resource(UAContext *ua); +JOB *select_job_resource(UAContext *ua); +JOB *select_restore_job_resource(UAContext *ua); +CLIENT *select_client_resource(UAContext *ua); +FILESET *select_fileset_resource(UAContext *ua); +int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); +int select_pool_dbr(UAContext *ua, POOL_DBR *pr); +int select_client_dbr(UAContext *ua, CLIENT_DBR *cr); + +void start_prompt(UAContext *ua, char *msg); +void add_prompt(UAContext *ua, char *prompt); +int do_prompt(UAContext *ua, char *msg, char *prompt, int max_prompt); +CAT *get_catalog_resource(UAContext *ua); +STORE *get_storage_resource(UAContext *ua, char *cmd); +int get_media_type(UAContext *ua, char *MediaType, int max_media); +int get_pool_dbr(UAContext *ua, POOL_DBR *pr); +int get_client_dbr(UAContext *ua, CLIENT_DBR *cr); +POOL *get_pool_resource(UAContext *ua); +POOL *select_pool_resource(UAContext *ua); +CLIENT *get_client_resource(UAContext *ua); +int get_job_dbr(UAContext *ua, JOB_DBR *jr); + +int find_arg_keyword(UAContext *ua, char **list); +int do_keyword_prompt(UAContext *ua, char *msg, char **list); +int confirm_retention(UAContext *ua, utime_t *ret, char *msg); + +/* ua_prune.c */ +int prune_files(UAContext *ua, CLIENT *client); +int prune_jobs(UAContext *ua, CLIENT *client, int JobType); +int prune_volume(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); + +/* ua_purge.c */ +int purge_jobs_from_volume(UAContext *ua, MEDIA_DBR *mr); diff --git a/bacula/src/dird/ua.h b/bacula/src/dird/ua.h index 8180d63dee..48522f71dd 100644 --- a/bacula/src/dird/ua.h +++ b/bacula/src/dird/ua.h @@ -25,6 +25,9 @@ */ +#ifndef __UA_H_ +#define __UA_H_ 1 + #define MAX_ARGS 30 typedef struct s_ua_context { @@ -33,67 +36,19 @@ typedef struct s_ua_context { JCR *jcr; B_DB *db; CAT *catalog; - POOLMEM *cmd; /* return command/name buffer */ - POOLMEM *args; /* command line arguments */ - char *argk[MAX_ARGS]; /* argument keywords */ - char *argv[MAX_ARGS]; /* argument values */ - int argc; /* number of arguments */ - char **prompt; /* list of prompts */ - int max_prompts; /* max size of list */ - int num_prompts; /* current number in list */ - int auto_display_messages; /* if set, display messages */ + POOLMEM *cmd; /* return command/name buffer */ + POOLMEM *args; /* command line arguments */ + char *argk[MAX_ARGS]; /* argument keywords */ + char *argv[MAX_ARGS]; /* argument values */ + int argc; /* number of arguments */ + char **prompt; /* list of prompts */ + int max_prompts; /* max size of list */ + int num_prompts; /* current number in list */ + int auto_display_messages; /* if set, display messages */ int user_notified_msg_pending; /* set when user notified */ - int automount; /* if set, mount after label */ - int quit; /* if set, quit */ - int verbose; /* set for normal UA verbosity */ + int automount; /* if set, mount after label */ + int quit; /* if set, quit */ + int verbose; /* set for normal UA verbosity */ } UAContext; -/* ua_cmds.c */ -int do_a_command(UAContext *ua, char *cmd); -int do_a_dot_command(UAContext *ua, char *cmd); -int qmessagescmd(UAContext *ua, char *cmd); -int open_db(UAContext *ua); -void close_db(UAContext *ua); - -/* ua_input.c */ -char *next_arg(char **s); -int get_cmd(UAContext *ua, char *prompt); -void parse_command_args(UAContext *ua); - -/* ua_output.c */ -void prtit(void *ctx, char *msg); - -/* ua_server.c */ -void bsendmsg(void *sock, char *fmt, ...); - -/* ua_select.c */ -STORE *select_storage_resource(UAContext *ua); -JOB *select_job_resource(UAContext *ua); -JOB *select_restore_job_resource(UAContext *ua); -CLIENT *select_client_resource(UAContext *ua); -FILESET *select_fileset_resource(UAContext *ua); -int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); -int select_pool_dbr(UAContext *ua, POOL_DBR *pr); -int select_client_dbr(UAContext *ua, CLIENT_DBR *cr); - -void start_prompt(UAContext *ua, char *msg); -void add_prompt(UAContext *ua, char *prompt); -int do_prompt(UAContext *ua, char *msg, char *prompt, int max_prompt); -CAT *get_catalog_resource(UAContext *ua); -STORE *get_storage_resource(UAContext *ua, char *cmd); -int get_media_type(UAContext *ua, char *MediaType, int max_media); -int get_pool_dbr(UAContext *ua, POOL_DBR *pr); -int get_client_dbr(UAContext *ua, CLIENT_DBR *cr); -POOL *get_pool_resource(UAContext *ua); -POOL *select_pool_resource(UAContext *ua); -CLIENT *get_client_resource(UAContext *ua); -int get_job_dbr(UAContext *ua, JOB_DBR *jr); - -int find_arg_keyword(UAContext *ua, char **list); -int do_keyword_prompt(UAContext *ua, char *msg, char **list); -int confirm_retention(UAContext *ua, utime_t *ret, char *msg); - -/* ua_prune.c */ -int prune_files(UAContext *ua, CLIENT *client); -int prune_jobs(UAContext *ua, CLIENT *client, int JobType); -int prune_volume(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); +#endif diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index 352051e484..7163d92dd1 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -29,7 +29,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Imported subroutines */ extern void run_job(JCR *jcr); @@ -509,7 +508,7 @@ void set_pooldbr_from_poolres(POOL_DBR *pr, POOL *pool, int create) * 1 record created */ -int create_pool(JCR *jcr, B_DB *db, POOL *pool) +int create_pool(JCR *jcr, B_DB *db, POOL *pool, int update) { POOL_DBR pr; @@ -518,6 +517,11 @@ int create_pool(JCR *jcr, B_DB *db, POOL *pool) strcpy(pr.Name, pool->hdr.name); if (db_get_pool_record(jcr, db, &pr)) { + /* Pool Exists */ + if (update) { + set_pooldbr_from_poolres(&pr, pool, 1); + db_update_pool_record(jcr, db, &pr); + } return 0; /* exists */ } @@ -548,7 +552,7 @@ static int createcmd(UAContext *ua, char *cmd) return 1; } - switch (create_pool(ua->jcr, ua->db, pool)) { + switch (create_pool(ua->jcr, ua->db, pool, 0)) { case 0: bsendmsg(ua, _("Error: Pool %s already exists.\n\ Use update to change it.\n"), pool->hdr.name); diff --git a/bacula/src/dird/ua_dotcmds.c b/bacula/src/dird/ua_dotcmds.c index 3d46085e4c..f03ea1eadc 100644 --- a/bacula/src/dird/ua_dotcmds.c +++ b/bacula/src/dird/ua_dotcmds.c @@ -33,7 +33,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Imported variables */ extern int r_first; diff --git a/bacula/src/dird/ua_input.c b/bacula/src/dird/ua_input.c index 0bb7922057..68bb7db56d 100644 --- a/bacula/src/dird/ua_input.c +++ b/bacula/src/dird/ua_input.c @@ -29,7 +29,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Imported variables */ diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index 7fec913b33..c60873c275 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -30,7 +30,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Imported subroutines */ extern void run_job(JCR *jcr); @@ -333,6 +332,10 @@ int listcmd(UAContext *ua, char *cmd) return 1; } for (i=0; i < num_pools; i++) { + pr.PoolId = ids[i]; + if (db_get_pool_record(ua->jcr, ua->db, &pr)) { + bsendmsg(ua, _("Pool: %s\n"), pr.Name); + } mr.PoolId = ids[i]; db_list_media_records(ua->jcr, ua->db, &mr, prtit, ua); } diff --git a/bacula/src/dird/ua_prune.c b/bacula/src/dird/ua_prune.c index 71496f943f..251b18fb2c 100644 --- a/bacula/src/dird/ua_prune.c +++ b/bacula/src/dird/ua_prune.c @@ -30,7 +30,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Imported functions */ int mark_media_purged(UAContext *ua, MEDIA_DBR *mr); diff --git a/bacula/src/dird/ua_purge.c b/bacula/src/dird/ua_purge.c index 82a273006a..91ed47c122 100644 --- a/bacula/src/dird/ua_purge.c +++ b/bacula/src/dird/ua_purge.c @@ -33,13 +33,12 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Forward referenced functions */ int purge_files_from_client(UAContext *ua, CLIENT *client); int purge_jobs_from_client(UAContext *ua, CLIENT *client); -void purge_files_from_volume(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr ); -void purge_jobs_from_volume(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); +void purge_files_from_volume(UAContext *ua, MEDIA_DBR *mr ); +int purge_jobs_from_volume(UAContext *ua, MEDIA_DBR *mr); void purge_files_from_job(UAContext *ua, JOB_DBR *jr); int mark_media_purged(UAContext *ua, MEDIA_DBR *mr); @@ -211,7 +210,7 @@ int purgecmd(UAContext *ua, char *cmd) return 1; case 3: /* Volume */ if (select_pool_and_media_dbr(ua, &pr, &mr)) { - purge_files_from_volume(ua, &pr, &mr); + purge_files_from_volume(ua, &mr); } return 1; } @@ -224,14 +223,14 @@ int purgecmd(UAContext *ua, char *cmd) return 1; case 1: /* Volume */ if (select_pool_and_media_dbr(ua, &pr, &mr)) { - purge_jobs_from_volume(ua, &pr, &mr); + purge_jobs_from_volume(ua, &mr); } return 1; } /* Volume */ case 2: if (select_pool_and_media_dbr(ua, &pr, &mr)) { - purge_jobs_from_volume(ua, &pr, &mr); + purge_jobs_from_volume(ua, &mr); } return 1; default: @@ -254,7 +253,7 @@ int purgecmd(UAContext *ua, char *cmd) break; case 2: /* Volume */ if (select_pool_and_media_dbr(ua, &pr, &mr)) { - purge_jobs_from_volume(ua, &pr, &mr); + purge_jobs_from_volume(ua, &mr); } break; } @@ -437,15 +436,19 @@ void purge_files_from_job(UAContext *ua, JOB_DBR *jr) free_pool_memory(query); } -void purge_files_from_volume(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr ) +void purge_files_from_volume(UAContext *ua, MEDIA_DBR *mr ) {} /* ***FIXME*** implement */ -void purge_jobs_from_volume(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr) +/* + * Returns: 1 if Volume purged + * 0 if Volume not purged + */ +int purge_jobs_from_volume(UAContext *ua, MEDIA_DBR *mr) { char *query = (char *)get_pool_memory(PM_MESSAGE); struct s_count_ctx cnt; struct s_file_del_ctx del; - int i; + int i, stat = 0; JOB_DBR jr; memset(&jr, 0, sizeof(jr)); @@ -502,13 +505,14 @@ void purge_jobs_from_volume(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr) /* If purged, mark it so */ if (del.num_ids == del.num_del) { - if (!mark_media_purged(ua, mr)) { + if (!(stat = mark_media_purged(ua, mr))) { bsendmsg(ua, "%s", db_strerror(ua->db)); } } bail_out: free_pool_memory(query); + return stat; } /* diff --git a/bacula/src/dird/ua_restore.c b/bacula/src/dird/ua_restore.c index cbcf54f76c..378b154e52 100644 --- a/bacula/src/dird/ua_restore.c +++ b/bacula/src/dird/ua_restore.c @@ -30,7 +30,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" #include #include "findlib/find.h" diff --git a/bacula/src/dird/ua_run.c b/bacula/src/dird/ua_run.c index c46429ff94..7e085d3e5b 100644 --- a/bacula/src/dird/ua_run.c +++ b/bacula/src/dird/ua_run.c @@ -29,7 +29,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Imported subroutines */ extern void run_job(JCR *jcr); diff --git a/bacula/src/dird/ua_select.c b/bacula/src/dird/ua_select.c index 4675efeb70..477572ff34 100644 --- a/bacula/src/dird/ua_select.c +++ b/bacula/src/dird/ua_select.c @@ -29,8 +29,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" - /* Imported variables */ diff --git a/bacula/src/dird/ua_server.c b/bacula/src/dird/ua_server.c index bb2489032d..d63b6ec176 100644 --- a/bacula/src/dird/ua_server.c +++ b/bacula/src/dird/ua_server.c @@ -29,7 +29,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Imported subroutines */ extern void run_job(JCR *jcr); diff --git a/bacula/src/dird/ua_status.c b/bacula/src/dird/ua_status.c index 6b4237f806..49f6c85aef 100644 --- a/bacula/src/dird/ua_status.c +++ b/bacula/src/dird/ua_status.c @@ -29,7 +29,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" extern char my_name[]; extern time_t daemon_start_time; diff --git a/bacula/src/lib/bnet.c b/bacula/src/lib/bnet.c index 2599d717bd..080b3a4bd6 100644 --- a/bacula/src/lib/bnet.c +++ b/bacula/src/lib/bnet.c @@ -440,7 +440,7 @@ Wanted %d got %d bytes for s_addr.\n"), sizeof(inaddr.s_addr), hp->h_length); * ***FIXME*** implement service from /etc/services */ static BSOCK * -bnet_open(void *jcr, char *name, char *host, char *service, int port) +bnet_open(void *jcr, char *name, char *host, char *service, int port, int *fatal) { int sockfd; struct sockaddr_in tcp_serv_addr; /* socket information */ @@ -457,12 +457,14 @@ bnet_open(void *jcr, char *name, char *host, char *service, int port) tcp_serv_addr.sin_port = htons(port); if ((addr_list=bget_host_ip(jcr, host)) == NULL) { + *fatal = 1; return NULL; } /* Open a TCP socket */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { free(addr_list); + *fatal = 1; return NULL; } @@ -501,10 +503,11 @@ bnet_connect(void *vjcr, int retry_interval, int max_retry_time, char *name, int i; BSOCK *bsock; JCR *jcr = (JCR *)vjcr; + int fatal = 0; - for (i=0; (bsock = bnet_open(jcr, name, host, service, port)) == NULL; i -= retry_interval) { - if (jcr && job_cancelled(jcr)) { - break; + for (i=0; (bsock = bnet_open(jcr, name, host, service, port, &fatal)) == NULL; i -= retry_interval) { + if (fatal || (jcr && job_cancelled(jcr))) { + return NULL; } Dmsg4(100, "Unable to connect to %s on %s:%d. ERR=%s\n", name, host, port, strerror(errno)); diff --git a/bacula/src/version.h b/bacula/src/version.h index 3855f31ace..0647d910d8 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -1,8 +1,8 @@ /* */ #define VERSION "1.30" #define VSTRING "1" -#define BDATE "10 March 2003" -#define LSMDATE "10Mar03" +#define BDATE "14 March 2003" +#define LSMDATE "14Mar03" /* Debug flags */ #define DEBUG 1 -- 2.39.5