X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_output.c;h=e6d77d67eb3384075e026380d6dd80278df27085;hb=b8224aab234012c2d127b84eceb160e99dd4a14d;hp=d53d41ad1103cc30984b121180f39b73002e7428;hpb=85cda6b48d03d59d66c0612d4f8b49868d713834;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index d53d41ad11..e6d77d67eb 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -1,3 +1,30 @@ +/* + Bacula® - The Network Backup Solution + + Copyright (C) 2000-2007 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. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation plus additions + that are listed in the file LICENSE. + + 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 GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of John Walker. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ /* * * Bacula Director -- User Agent Output Commands @@ -8,21 +35,6 @@ * Version $Id$ */ -/* - Copyright (C) 2000-2006 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 amended 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 "dird.h" @@ -33,9 +45,6 @@ extern int r_first; extern int r_last; extern RES_TABLE resources[]; extern RES **res_head; -extern int console_msg_pending; -extern FILE *con_fd; -extern brwlock_t con_lock; /* Imported functions */ @@ -240,7 +249,7 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) POOL_DBR pr; MEDIA_DBR mr; - if (!open_db(ua)) + if (!open_client_db(ua)) return 1; memset(&jr, 0, sizeof(jr)); @@ -419,7 +428,7 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) if (j >= 0) { n = atoi(ua->argv[j]); if ((n < 0) || (n > 50)) { - bsendmsg(ua, _("Ignoring illegal value for days.\n")); + bsendmsg(ua, _("Ignoring invalid value for days. Max is 50.\n")); n = 1; } } @@ -438,7 +447,7 @@ static bool list_nextvol(UAContext *ua, int ndays) { JOB *job; JCR *jcr = ua->jcr; - POOL *pool; + USTORE store; RUN *run; time_t runtime; bool found = false; @@ -461,23 +470,18 @@ static bool list_nextvol(UAContext *ua, int ndays) } } for (run=NULL; (run = find_next_run(run, job, runtime, ndays)); ) { - pool = run->pool ? run->pool : NULL; - if (!complete_jcr_for_job(jcr, job, pool)) { + if (!complete_jcr_for_job(jcr, job, run->pool)) { return false; } memset(&pr, 0, sizeof(pr)); pr.PoolId = jcr->jr.PoolId; - if (! db_get_pool_record(ua->jcr, ua->db, &pr)) { - strcpy(pr.Name, "*UnknownPool*"); + if (!db_get_pool_record(ua->jcr, ua->db, &pr)) { + bstrncpy(pr.Name, "*UnknownPool*", sizeof(pr.Name)); } mr.PoolId = jcr->jr.PoolId; - if (run->storage) { - jcr->store = run->storage; - } else { - jcr->store = (STORE *)job->storage->first(); - } - mr.StorageId = jcr->store->StorageId; - if (!find_next_volume_for_append(jcr, &mr, 1, false/*no create*/)) { + get_job_storage(&store, job, run); + mr.StorageId = store.store->StorageId; + if (!find_next_volume_for_append(jcr, &mr, 1, fnv_no_create_vol, fnv_prune)) { bsendmsg(ua, _("Could not find next Volume for Job %s (%s, %s).\n"), job->hdr.name, pr.Name, level_to_str(run->level)); } else { @@ -537,7 +541,7 @@ RUN *find_next_run(RUN *run, JOB *job, time_t &runtime, int ndays) future = now + (day * 60 * 60 * 24); /* Break down the time into components */ - localtime_r(&future, &tm); + (void)localtime_r(&future, &tm); mday = tm.tm_mday - 1; wday = tm.tm_wday; month = tm.tm_mon; @@ -571,7 +575,7 @@ RUN *find_next_run(RUN *run, JOB *job, time_t &runtime, int ndays) Dmsg1(000, "%s", buf); #endif /* find time (time_t) job is to be run */ - localtime_r(&future, &runtm); + (void)localtime_r(&future, &runtm); for (i= 0; i < 24; i++) { if (bit_is_set(i, run->hour)) { runtm.tm_hour = i; @@ -591,11 +595,12 @@ RUN *find_next_run(RUN *run, JOB *job, time_t &runtime, int ndays) /* Nothing found */ return NULL; } + /* * Fill in the remaining fields of the jcr as if it * is going to run the job. */ -int complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool) +bool complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool) { POOL_DBR pr; @@ -604,6 +609,10 @@ int complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool) if (pool) { jcr->pool = pool; /* override */ } + if (jcr->db) { + db_close_database(jcr, jcr->db); + jcr->db = NULL; + } jcr->db = jcr->db=db_init_database(jcr, jcr->catalog->db_name, jcr->catalog->db_user, jcr->catalog->db_password, jcr->catalog->db_address, jcr->catalog->db_port, jcr->catalog->db_socket, @@ -613,10 +622,12 @@ int complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool) jcr->catalog->db_name); if (jcr->db) { Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + db_close_database(jcr, jcr->db); + jcr->db = NULL; } - return 0; + return false; } - bstrncpy(pr.Name, jcr->pool->hdr.name, sizeof(pr.Name)); + bstrncpy(pr.Name, jcr->pool->name(), sizeof(pr.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, POOL_OP_CREATE) < 0) { @@ -626,13 +637,13 @@ int complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool) db_close_database(jcr, jcr->db); jcr->db = NULL; } - return 0; + return false; } else { Jmsg(jcr, M_INFO, 0, _("Pool %s created in database.\n"), pr.Name); } } jcr->jr.PoolId = pr.PoolId; - return 1; + return true; } @@ -703,10 +714,8 @@ void prtit(void *ctx, const char *msg) * agent, so we are being called from Bacula core. In * that case direct the messages to the Job. */ -void bsendmsg(void *ctx, const char *fmt, ...) +void bmsg(UAContext *ua, const char *fmt, va_list arg_ptr) { - va_list arg_ptr; - UAContext *ua = (UAContext *)ctx; BSOCK *bs = ua->UA_sock; int maxlen, len; POOLMEM *msg; @@ -719,9 +728,7 @@ void bsendmsg(void *ctx, const char *fmt, ...) again: maxlen = sizeof_pool_memory(msg) - 1; - va_start(arg_ptr, fmt); len = bvsnprintf(msg, maxlen, fmt, arg_ptr); - va_end(arg_ptr); if (len < 0 || len >= maxlen) { msg = realloc_pool_memory(msg, maxlen + maxlen/2); goto again; @@ -737,3 +744,71 @@ again: } } + +void bsendmsg(void *ctx, const char *fmt, ...) +{ + va_list arg_ptr; + va_start(arg_ptr, fmt); + bmsg((UAContext *)ctx, fmt, arg_ptr); + va_end(arg_ptr); +} + +/* + * The following UA methods are mainly intended for GUI + * programs + */ +/* + * This is a message that should be displayed on the user's + * console. + */ +void UAContext::send_msg(const char *fmt, ...) +{ + va_list arg_ptr; + va_start(arg_ptr, fmt); + bmsg(this, fmt, arg_ptr); + va_end(arg_ptr); +} + + +/* + * This is an error condition with a command. The gui should put + * up an error or critical dialog box. The command is aborted. + */ +void UAContext::error_msg(const char *fmt, ...) +{ + BSOCK *bs = UA_sock; + va_list arg_ptr; + va_start(arg_ptr, fmt); + if (bs && api) bs->signal(BNET_ERROR_MSG); + bmsg(this, fmt, arg_ptr); + va_end(arg_ptr); +} + +/* + * This is a warning message, that should bring up a warning + * dialog box on the GUI. The command is not aborted, but something + * went wrong. + */ +void UAContext::warning_msg(const char *fmt, ...) +{ + BSOCK *bs = UA_sock; + va_list arg_ptr; + va_start(arg_ptr, fmt); + if (bs && api) bs->signal(BNET_WARNING_MSG); + bmsg(this, fmt, arg_ptr); + va_end(arg_ptr); +} + +/* + * This is an information message that should probably be put + * into the status line of a GUI program. + */ +void UAContext::info_msg(const char *fmt, ...) +{ + BSOCK *bs = UA_sock; + va_list arg_ptr; + va_start(arg_ptr, fmt); + if (bs && api) bs->signal(BNET_INFO_MSG); + bmsg(this, fmt, arg_ptr); + va_end(arg_ptr); +}