X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_output.c;h=e6d77d67eb3384075e026380d6dd80278df27085;hb=b8224aab234012c2d127b84eceb160e99dd4a14d;hp=2e2dcf61e0d6446fb6f2d932d5377a7d0c156b9f;hpb=d0c1f5f22cbea872106e4f54ea979419ee58fc03;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index 2e2dcf61e0..e6d77d67eb 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -1,16 +1,7 @@ -/* - * - * Bacula Director -- User Agent Output Commands - * I.e. messages, listing database, showing resources, ... - * - * Kern Sibbald, September MM - * - * Version $Id$ - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2006 Free Software Foundation Europe e.V. + 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. @@ -34,6 +25,15 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * + * Bacula Director -- User Agent Output Commands + * I.e. messages, listing database, showing resources, ... + * + * Kern Sibbald, September MM + * + * Version $Id$ + */ #include "bacula.h" #include "dird.h" @@ -249,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)); @@ -428,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; } } @@ -447,7 +447,6 @@ static bool list_nextvol(UAContext *ua, int ndays) { JOB *job; JCR *jcr = ua->jcr; - POOL *pool; USTORE store; RUN *run; time_t runtime; @@ -471,19 +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)) { + if (!db_get_pool_record(ua->jcr, ua->db, &pr)) { bstrncpy(pr.Name, "*UnknownPool*", sizeof(pr.Name)); } mr.PoolId = jcr->jr.PoolId; get_job_storage(&store, job, run); mr.StorageId = store.store->StorageId; - if (!find_next_volume_for_append(jcr, &mr, 1, false/*no create*/)) { + 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 { @@ -602,7 +600,7 @@ RUN *find_next_run(RUN *run, JOB *job, time_t &runtime, int ndays) * 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; @@ -611,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, @@ -620,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) { @@ -633,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; } @@ -710,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; @@ -726,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; @@ -744,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); +}